67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
|
import struct
|
||
|
|
||
|
from .buffer import Buffer
|
||
|
from .formatter import Formatter
|
||
|
|
||
|
class Messages(object):
|
||
|
def __init__(self):
|
||
|
self.__messages = {}
|
||
|
|
||
|
def load(self, resources):
|
||
|
buf = Buffer()
|
||
|
|
||
|
resources.forEachInGroup('messages', lambda res: self.loadFromResource(res, buf))
|
||
|
|
||
|
def loadFromResource(self, resource, buf):
|
||
|
if not resource:
|
||
|
return
|
||
|
|
||
|
cnt = resource.getVariantsCount()
|
||
|
|
||
|
for variant in resource.variants:
|
||
|
if variant:
|
||
|
try:
|
||
|
score = variant.i18nScore
|
||
|
data = variant.getData()
|
||
|
self.loadBundle(score, data)
|
||
|
except Exception as e:
|
||
|
print("Error loading text bundle {}: {}".format(resource.getName(), e))
|
||
|
|
||
|
raise
|
||
|
|
||
|
def loadBundle(self, score, data):
|
||
|
if data[0:3] != b"CMF":
|
||
|
raise Exception("Invalid format of message file!")
|
||
|
|
||
|
version = struct.unpack('i', data[3:7])[0]
|
||
|
if version != 1:
|
||
|
raise Exception("Unknown version of message file!")
|
||
|
|
||
|
offset = struct.unpack('i', data[len(data) - 4:])[0]
|
||
|
cnt = struct.unpack('i', data[offset:offset + 4])[0]
|
||
|
offset += 4
|
||
|
|
||
|
for i in range(0, cnt):
|
||
|
sz = struct.unpack('i', data[offset:offset + 4])[0]
|
||
|
offset += 4;
|
||
|
|
||
|
if sz > 0:
|
||
|
name = data[offset:offset + sz].decode('utf-8')
|
||
|
msgOffset = struct.unpack('i', data[offset + sz:offset + sz + 4])[0]
|
||
|
|
||
|
if name in self.__messages:
|
||
|
ss = self.__messages[name]
|
||
|
if ss['score'] <= score:
|
||
|
ss['score'] = score
|
||
|
ss['message'] = Formatter(data, msgOffset)
|
||
|
else:
|
||
|
self.__messages[name] = {
|
||
|
"score": score,
|
||
|
"message": Formatter(data, msgOffset),
|
||
|
}
|
||
|
|
||
|
offset += sz + 4
|
||
|
|
||
|
|
||
|
msg = Messages()
|