Advertisement
pushrbx

srolangtool

Jul 31st, 2013
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.57 KB | None | 0 0
  1. import msvcrt as m
  2. from enum import Enum
  3. import re, codecs, datetime, sys, math
  4.  
  5. LANG_COLUMN_COUNT = 14
  6. # write the name of the source text file.
  7. # Possible options: textquest_queststring, texthelp, textquest_otherstring, textuisystem, textquest_speech&name, textdata_object
  8. SOURCE_SRO_TEXT_FILE = "textuisystem"
  9. _PROGRESS = 0
  10. _FILELENGTH = 0
  11. _POPT = 0
  12. _POEDIT_BASE_PATH = "C:\\"
  13. _POEDIT_SEARCHPATH = "C:\\"
  14.  
  15. # progressbar
  16. class U:
  17.     def prg(prog):
  18.         fillchar = '='
  19.         emptchar = '-'
  20.         fillt = 0
  21.         emptt = 20
  22.         prog = int(prog)
  23.         if prog < 100 and prog > 0:
  24.             prog2 = prog/5
  25.             fillt = fillt + prog2
  26.             emptt = emptt - prog2
  27.             sys.stdout.write("\r[" + str(fillchar)*math.ceil(fillt) + str(emptchar)*math.ceil(emptt) + "]  " + str(prog) + "%")
  28.             sys.stdout.flush()
  29.         elif prog >= 100:
  30.             prog = 100
  31.             prog2 = prog/5
  32.             fillt = fillt + prog2
  33.             emptt = emptt - prog2
  34.             sys.stdout.write("\r[" + str(fillchar)*math.ceil(fillt) + str(emptchar)*math.ceil(emptt) + "]  " + str(prog) + "%" + "\nDone!")
  35.             sys.stdout.flush()
  36.         elif prog < 0:
  37.             prog = 1
  38.             prog2 = prog/5
  39.             fillt = fillt + prog2
  40.             emptt = emptt - prog2
  41.             sys.stdout.write("\r[" + str(fillchar)*fillt + str(emptchar)*emptt + "]  " + str(prog) + "%" + "\nHalted!")
  42.             sys.stdout.flush()
  43.  
  44.  
  45.     def pq(lnid):
  46.         global _PROGRESS
  47.         global _POPT
  48.  
  49.         if _PROGRESS == 0:
  50.             _PROGRESS = lnid
  51.             U.prg(_PROGRESS / (_FILELENGTH * 0.01) + 1)
  52.         if (lnid - _POPT) > _PROGRESS:
  53.             _PROGRESS = lnid
  54.             U.prg(_PROGRESS / (_FILELENGTH * 0.01) + 1)
  55.  
  56.     def pqq(lnid, length):
  57.         global _PROGRESS
  58.         global _POPT
  59.  
  60.         if _PROGRESS == 0:
  61.             _PROGRESS = lnid
  62.             U.prg(_PROGRESS / (length * 0.01) + 1)
  63.         if (lnid - _POPT) > _PROGRESS:
  64.             _PROGRESS = lnid
  65.             U.prg(_PROGRESS / (length * 0.01) + 1)
  66.  
  67.  
  68. class Language(Enum):
  69.     Korean = 0
  70.     Lang_1 = 1
  71.     Lang_2 = 2
  72.     Lang_Chinese = 3
  73.     Lang_Taiwan = 4
  74.     Lang_Japan = 5
  75.     Lang_English = 6
  76.     Lang_Hungarian = 7 # basically Vietnam
  77.     Lang_Thailand = 8
  78.     Lang_Russian = 9
  79.     Lang_Turkey = 10
  80.     Lang_Spanish = 11
  81.     Lang_Arabian = 12
  82.     Lang_German = 13
  83.     Lang_Error = 14 # if there's an error then the data associated to this lang.
  84.  
  85. class Catalog(object):
  86.     def __init__(self, _lang, _id, _text, lnid):
  87.         self.lang = _lang
  88.         self.Id = _id
  89.         self.Text = _text
  90.         self.Line = lnid
  91.         self.bMultiLined = False
  92.  
  93. class CatalogCollection(object):
  94.     __hash__ = None
  95.  
  96.     def __init__(self):
  97.         self.data = {
  98.                 Language.Korean : list(),
  99.                 Language.Lang_1 : list(),
  100.                 Language.Lang_2 : list(),
  101.                 Language.Lang_Arabian : list(),
  102.                 Language.Lang_Chinese : list(),
  103.                 Language.Lang_English : list(),
  104.                 Language.Lang_German : list(),
  105.                 Language.Lang_Hungarian : list(),
  106.                 Language.Lang_Japan : list(),
  107.                 Language.Lang_Russian : list(),
  108.                 Language.Lang_Spanish : list(),
  109.                 Language.Lang_Taiwan : list(),
  110.                 Language.Lang_Thailand : list(),
  111.                 Language.Lang_Turkey : list(),
  112.                 Language.Lang_Error : list()
  113.         }
  114.         self._bSplittedLine = False
  115.         self._bMultiLineCat = False
  116.  
  117.     def addEntry(self, cat):
  118.         self.data[cat.lang].append(cat)
  119.  
  120.     def editEntry(self, cat):
  121.         temp = self.data[cat.lang]
  122.         idx = temp.index(cat)
  123.         if idx > -1:
  124.             self.data[cat.lang][idx] = cat
  125.         else:
  126.             print("CatalogCollection::editEntry: given element not found.")
  127.  
  128.     def __repr__(self): return repr(self.data)
  129.  
  130.     def __getitem__(self, key):
  131.         if key in self.data:
  132.             return self.data[key]
  133.         if hasattr(self.__class__, "__missing__"):
  134.             return self.__class__.__missing__(self, key)
  135.         raise KeyError(key)
  136.  
  137.     def __cmp__(self, dict):
  138.         if isinstance(dict, UserDict):
  139.             return cmp(self.data, dict.data)
  140.         else:
  141.             return cmp(self.data, dict)
  142.  
  143.     def __setitem__(self, key, item): self.data[key] = item
  144.     def __delitem__(self, key): del self.data[key]
  145.     def __iter__(self): return iter(self.data)
  146.  
  147.     def clear(self): self.data.clear()
  148.     def keys(self): return self.data.keys()
  149.     def items(self): return self.data.items()
  150.     def iteritems(self): return self.data.iteritems()
  151.     def iterkeys(self): return self.data.iterkeys()
  152.     def itervalues(self): return self.data.itervalues()
  153.     def values(self): return self.data.values()
  154.     def has_key(self, key): return key in self.data
  155.  
  156.     def update(self, dict=None, **kwargs):
  157.         if dict is None:
  158.             pass
  159.         elif isinstance(dict, UserDict):
  160.             self.data.update(dict.data)
  161.         elif isinstance(dict, type({})) or not hasattr(dict, 'items'):
  162.             self.data.update(dict)
  163.         else:
  164.             for k, v in dict.items():
  165.                 self[k] = v
  166.         if len(kwargs):
  167.             self.data.update(kwargs)
  168.  
  169.     def __len__(self):
  170.         return len(self.data)
  171.  
  172.     def __splitPoLines(self, text, handle, mode="id"):
  173.         text = re.sub(r'[\\]', r'\\\\', text)
  174.         text = re.sub("[\"]", "\\\"", text)
  175.         # newer versions of silkroad use UNIX Line endings in mid-column sections
  176.         # also we strip the line ending \r\n from the text argument before we pass it.
  177.         lines = re.split(r"\r\n|\n", text)
  178.         if len(lines) > 1:
  179.             self._bSplittedLine = True
  180.             handle.write("msg%s \"\"\n" % mode)
  181.             lc = len(lines)
  182.             idx = 1
  183.             for line in lines:
  184.                 handle.write("\"%s\\n\"" % (line))
  185.                 if idx != lc:
  186.                     handle.write("\n")
  187.                 idx += 1
  188.             handle.write("\n")
  189.         else:
  190.             self._bSplittedLine = False
  191.             handle.write("msg%s \"%s\"\n" % (mode, text + ("\\n" if self._bMultiLineCat else "")))
  192.  
  193.     def exportPoFile(self):
  194.         global _PROGRESS
  195.         eref = self.data[Language.Lang_English]
  196.         for __lang, val in self.data.items():
  197.             print("Current file:  " + "%s_%s.po" % (SOURCE_SRO_TEXT_FILE, __lang.name))
  198.             U.prg(0)
  199.             with codecs.open("%s_%s.po" % (SOURCE_SRO_TEXT_FILE, __lang.name), "w", encoding='utf-8') as fh:
  200.                 fh.write("msgid \"\"\nmsgstr \"\"\n")
  201.                 fh.write("\"Project-Id-Version: Project1\\n\"\n")
  202.                 fh.write("\"POT-Creation-Date: %s\\n\"\n" % (datetime.datetime.now().strftime('%Y-%m-%d %H:%M-0000')))
  203.                 fh.write("\"PO-Revision-Date: %s\\n\"\n" % (datetime.datetime.now().strftime('%Y-%m-%d %H:%M-0000')))
  204.                 fh.write("\"Last-Translator: Translator1 <xxxx@xxxx.com>\\n\"\n")
  205.                 fh.write("\"Language-Team: xxxx\\n\"\n")
  206.                 fh.write("\"Language: xxx\\n\"\n")
  207.                 fh.write("\"MIME-Version: 1.0\\n\"\n")
  208.                 fh.write("\"Content-Type: text/plain; charset=UTF-8\\n\"\n")
  209.                 fh.write("\"Content-Transfer-Encoding: 8bit\\n\"\n")
  210.                 fh.write("\"X-Generator: SROPyTools - generateCatalog.py v1.0\\n\"\n")
  211.                 fh.write("\"X-Poedit-KeywordsList: _;gettext;gettext_noop\\n\"\n")
  212.                 fh.write("\"X-Poedit-Basepath: %s\\n\"\n", % _POEDIT_BASEPATH)
  213.                 fh.write("\"X-Poedit-SourceCharset: UTF-8\\n\"\n")
  214.                 fh.write("\"X-Poedit-SearchPath-0: %s\\n\"\n", % _POEDIT_SEARCHPATH)
  215.                 fh.write("\n\n")
  216.  
  217.                 engText = "" # we store the formated english text in this var
  218.  
  219.                 # we go through the entries of the current language
  220.                 # and we write them inside the language's .po file
  221.                 _i = 0
  222.                 _PROGRESS = 0
  223.                 for i in val:
  224.                     fh.write("#: ./%s.txt:%s\n" % (SOURCE_SRO_TEXT_FILE, i.Line))
  225.  
  226.                     t = [x for x in eref if x.Id == i.Id]
  227.                     if len(t) > 0:
  228.                         #engText = re.sub(r"\r\n", "\\r\\n", t[0].Text)
  229.                         engText = t[0].Text
  230.                         self._bMultiLineCat = t[0].bMultiLined
  231.                     else:
  232.                         engText = "--- Generator Exception: English source text not found. ---"
  233.                         print("\nEnglish source not found. Id: " + i.Id)
  234.  
  235.                     self.__splitPoLines("%s --- source:[ %s ]" % (i.Id, engText), fh, "id")
  236.  
  237.                     if i.Text != "0" and i.Text != "":
  238.                         self.__splitPoLines(i.Text, fh, "str")
  239.                     else:
  240.                         fh.write("msgstr \"%s\"\n" % (i.Text + ("\\n" if self._bMultiLineCat or self._bSplittedLine else "")))
  241.                     fh.write("\n")
  242.                     _i += 1
  243.                     U.pqq(_i, len(val))
  244.                 U.prg(100)
  245.                 print("\n")
  246.  
  247.     def exportRawFile(self):
  248.         with codecs.open(SOURCE_SRO_TEXT_FILE + "_parsed.txt", "w", encoding='utf-16le') as fh:
  249.             for lang, val in self.data.items():
  250.                 fh.write("%s -------- \r\n" % lang.name)
  251.                 for x in val:
  252.                     fh.write("%s - %s \r\n" % (x.Id, x.Text))
  253.                 fh.write("\r\n\r\n")
  254.  
  255.     def generateCatalogTemplate(self):
  256.         with codecs.open(SOURCE_SRO_TEXT_FILE + "_catalog.php", "w", encoding='utf-16le') as fh:
  257.             fh.write("<?php \r\n")
  258.             for lang, val in self.data.items():
  259.                 for x in val:
  260.                     fh.write("gettext(%s);\r\n" % x.Id)
  261.                 break
  262.             fh.write("\r\n\r\n?>")
  263. def wait():
  264.     print("Press any key to continue...")
  265.     m.getch()
  266.  
  267. def __criticalLangSection(nColId, szColId, szCol, lineidx):
  268.     nColId = nColId - 2
  269.     try:
  270.         return Catalog(Language(nColId), szColId, szCol, lineidx)
  271.     except:
  272.         return Catalog(Language(14), szColId, szCol, lineidx)
  273.  
  274. expr = r"(([A-Z0-9]+_)+([A-Z0-9]+)?)"
  275.  
  276. prog = re.compile(expr)
  277. precatalog = list()
  278. poentries = CatalogCollection()
  279. lineidx = -1
  280. currentLang = Language(0)
  281. currentId = ""
  282.  
  283. with codecs.open("%s.txt" % (SOURCE_SRO_TEXT_FILE), encoding='utf-16le') as f:
  284.  
  285.     print("Parsing %s.txt ..." % SOURCE_SRO_TEXT_FILE)
  286.     rlnid = 1
  287.     # get file length
  288.     for i, l in enumerate(f):
  289.         pass
  290.     _FILELENGTH = i + 1
  291.  
  292.     if _FILELENGTH >= 10000:
  293.         _POPT = 500
  294.     elif _FILELENGTH >= 1000:
  295.         _POPT = 200
  296.     elif _FILELENGTH <= 1000 and _FILELENGTH >= 500:
  297.         _POPT = 20
  298.     elif _FILELENGTH <= 500:
  299.         _POPT = 5
  300.  
  301.     f.seek(0)
  302.  
  303.     U.prg(0)
  304.  
  305.     for line in f:
  306.         if line == "\r\n" or line[0:2] == "//":
  307.             continue
  308.  
  309.         if line[0] == '\t':
  310.             line = line[1:]
  311.             currentLang = Language(currentLang.value + 1)
  312.  
  313.         ma = re.search(expr, line)
  314.         columns = re.split(r"\t", line)
  315.         collen = len(columns)
  316.         cId = -1
  317.  
  318.         if ma:
  319.             cId = columns[1]
  320.             currentId = cId
  321.             lineidx += 1
  322.  
  323.         tidx = 0
  324.         for col in columns:
  325.             if col == "" or col == "\r\n":
  326.                 col = "0"
  327.                 # sometimes there's an empty useless coloumn at the end of the full lines
  328.                 if (collen - 2) > LANG_COLUMN_COUNT:
  329.                     continue
  330.             if cId != -1:
  331.                 if tidx >= 2:
  332.                     # if there are malformed lines in the text file then we
  333.                     # handle them in a try catch section and we store that data
  334.                     # in a sepearate section
  335.                     ec = __criticalLangSection(tidx, cId, col, lineidx + 1)
  336.                     currentLang = ec.lang
  337.                     poentries.addEntry(ec)
  338.                    
  339.             else: # if the lines are breaked down between the columns
  340.                 t = poentries[currentLang]
  341.                 ithasidx = False
  342.  
  343.                 for ikx, val in enumerate(t):
  344.                     if ikx == lineidx:
  345.                         ithasidx = True
  346.                         break
  347.                     elif val.Id == currentId and val.lang == currentLang:
  348.                         ithasidx = True
  349.                         lineidx = ikx
  350.                         break
  351.  
  352.                 if ithasidx:
  353.                     poentries[currentLang][lineidx].Text += col
  354.                     poentries[currentLang][lineidx].bMultiLined = True
  355.                 else:
  356.                     temp = poentries[currentLang]
  357.                     poentries[currentLang].insert(lineidx, Catalog(currentLang, currentId, col, lineidx + 1))
  358.                     temp = None
  359.  
  360.                 if collen != 1 and tidx < (collen - 1):
  361.                     try:
  362.                         currentLang = Language(currentLang.value + 1)
  363.                     except:
  364.                         currentLang = currentLang
  365.            
  366.             tidx += 1
  367.         rlnid += 1
  368.         U.pq(rlnid)
  369.     U.prg(100)
  370.     _POPT = 25
  371.     print("\n\n")
  372.     print("parsing done. exporting raw...")
  373.     poentries.exportRawFile()
  374.     print("generating catalog...")
  375.     poentries.generateCatalogTemplate()
  376.     print("generating .po files...")
  377.     poentries.exportPoFile()
  378.        
  379. print("Malformed section count in text file: %s" % (len(poentries[Language.Lang_Error])))
  380. print("done")
  381. wait()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement