diff options
Diffstat (limited to 'web/updatelang.py')
-rwxr-xr-x | web/updatelang.py | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/web/updatelang.py b/web/updatelang.py new file mode 100755 index 0000000..2eba12c --- /dev/null +++ b/web/updatelang.py @@ -0,0 +1,190 @@ +#! /usr/bin/env python3 +# -*- coding: utf8 -*- +# +# Copyright (C) 2018~2020 TMW-2 +# Author: Jesusalva +# Note: This will "force" completion to 100%. Use review system! + +import copy, datetime +import polib, yaml + +defaultLang = "en" +rootPath = "../../site/i18n/" + +langs=[] +files={} +originals={} +tm={defaultLang: ["","\n"]} + +# Search for array[?]==search in an array of dicts +# Returns the dictionary, or returns "ERROR" +def dl_search(array, search): + for key in array.keys(): + if array[key] == search: + return key + raise Exception("Key not found") + +# For headers +def currentdate(): + dt=datetime.datetime.now() + + day=dt.timetuple()[2] + month=dt.timetuple()[1] + year=dt.timetuple()[0] + + hour=dt.timetuple()[3] + minute=dt.timetuple()[4] + #second=5 + #weekday=6 + #yearday=7 + + return "%04d-%02d-%02d %02d:%02d-0300" % (year, month, day, hour, minute) + + +def init(): + global defaultLang, rootPath, langs, files, originals, tm + # Populate langs + o=open("langs.txt", "r") + for i in o: + langs.append(i.replace('\n','')) + o.close() + + # Create the original file + f=open(rootPath+defaultLang+".yml", "r") + originals=yaml.load(f, Loader=yaml.FullLoader) # Dictionary + f.close() + + # We don't care with metadata + del originals["language_meta"] + + # Create each language's template + for i in langs: + files[str(i)]=copy.copy(originals) + tm[str(i)]=["","\n"] + + """ + # Do the reading for each language + for i in langs: + f=open(rootpath+i+".yml", "r") + files[str(i)]=yaml.load(f, Loader=yaml.FullLoader) # Dictionary + f.close() + """ + +# [OK] Returns name from language code +def lgname(lg): + if lg == "en": + return "English" + elif lg == "pt-BR": + return "Português (Brasil)" + elif lg == "de": + return "Deutsch" + elif lg == "fr": + return "François" + elif lg == "es": + return "Español" + elif lg == "ru": + return "Русский" + else: + return "Unknown %s" % lg + +# [OK] Entry +def poentry(org, ttl, comments): + return polib.POEntry(msgid=org, msgstr=ttl, comment=comments) + +# Creates/Loads stuff +def generatePoFiles(): + global tm + context=copy.copy(langs) + context.append('en') + for lg in context: + print("Updating po file for "+lg) + po=polib.POFile() + po.metadata = { + 'Project-Id-Version': '1.0', + 'Report-Msgid-Bugs-To': 'dev@tmw2.org', + 'POT-Creation-Date': currentdate(), + 'PO-Revision-Date': currentdate(), + 'Last-Translator': 'TMW2 Team <dev@tmw2.org>', + 'MIME-Version': '1.0', + 'Content-Type': 'text/plain; charset=utf-8', + 'Content-Transfer-Encoding': '8bit', + } + + for key, speech in originals.items(): + # Translation Memory (no duplicates) + if speech in tm[lg]: + continue + tm[lg].append(speech) + + # Add to po file + if lg == "en": + po.append(poentry(speech, "", key)) + else: + po.append(poentry(speech, files[lg][key], key)) + + po.save("po/%s.po" % lg) + context.remove('en') + + + + + +# [OK] Reads Po Files +def readPoFile(lg): + try: + po=polib.pofile("po/"+lg+".po") + except: + a=open("po/"+lg+".po", "w") + a.close() + print("%s.po does not exist, not reading" % lg) + return + + print("%s Progress: %d%%" % (lgname(lg), po.percent_translated())) + + for entry in po: + #print("%s = %s" % (entry.msgid, entry.msgstr)) + + try: + if entry.msgstr != "": + dest=dl_search(files[lg], entry.msgid) + #print("[+] %s" % dest) + files[lg][dest]=entry.msgstr + else: + dest=dl_search(files[lg], entry.msgid) + #print("%s.%s IS EMPTY" % (lg, dest)) + try: + files[lg][dest]=originals[dest] + except: + print("%s - failed to obtain originals" % entry.msgid) + except: + print("%s - string was removed" % entry.msgstr) + +# [OK] Save the new YML file +def writeLocal(lg): + f=open(rootPath+lg+".yml", 'w') + f.write("# THIS FILE WAS GENERATED AUTOMATICALLY\n#EDITING IT WILL HAVE NO EFFECT\n\n") + files[lg]["language_meta"]={"code": lg, "name": lgname(lg)} + yaml.dump(files[lg], f) + f.close() + + + + + + + + + + + +# Mainframe: setup +init() + +# Save translations to their YML files +for lg in langs: + readPoFile(lg) + writeLocal(lg) + +# Mainframe: handle PO files +generatePoFiles() + |