113 lines
3.9 KiB
Python
113 lines
3.9 KiB
Python
import json
|
|
import locale
|
|
import os
|
|
|
|
class BabelFish():
|
|
def __init__(self,subpath=["resources","app","meta"],lang=None):
|
|
localization_string = locale.getdefaultlocale()[0] #get set localization
|
|
self.locale = localization_string[:2] if lang is None else lang #let caller override localization
|
|
self.langs = ["en"] #start with English
|
|
if(not self.locale == "en"): #add localization
|
|
self.langs.append(self.locale)
|
|
|
|
self.lang_defns = {} #collect translations
|
|
self.add_translation_file() #start with default translation file
|
|
self.add_translation_file(["resources","app","cli"]) #add help translation file
|
|
self.add_translation_file(["resources","app","gui"]) #add gui label translation file
|
|
self.add_translation_file(["resources","user","meta"]) #add user translation file
|
|
|
|
def add_translation_file(self,subpath=["resources","app","meta"]):
|
|
if not isinstance(subpath, list):
|
|
subpath = [subpath]
|
|
if "lang" not in subpath:
|
|
subpath.append("lang") #look in lang folder
|
|
subpath = os.path.join(*subpath) #put in path separators
|
|
key = subpath.split(os.sep)
|
|
for check in ["resources","app","user"]:
|
|
if check in key:
|
|
key.remove(check)
|
|
key = os.path.join(*key) #put in path separators
|
|
for lang in self.langs:
|
|
if not lang in self.lang_defns:
|
|
self.lang_defns[lang] = {}
|
|
langs_filename = os.path.join(subpath,lang + ".json") #get filename of translation file
|
|
if os.path.isfile(langs_filename): #if we've got a file
|
|
with open(langs_filename,encoding="utf-8") as f: #open it
|
|
self.lang_defns[lang][key[:key.rfind(os.sep)].replace(os.sep,'.')] = json.load(f) #save translation definitions
|
|
else:
|
|
pass
|
|
# print(langs_filename + " not found for translation!")
|
|
|
|
def translate(self, domain="", key="", subkey=""): #three levels of keys
|
|
# start with nothing
|
|
display_text = ""
|
|
|
|
# exits check for not exit first and then append Exit at end
|
|
# multiRooms check for not chest name first and then append chest name at end
|
|
specials = {
|
|
"exit": False,
|
|
"multiRoom": False
|
|
}
|
|
|
|
# Domain
|
|
if os.sep in domain:
|
|
domain = domain.replace(os.sep,'.')
|
|
# display_text = domain
|
|
|
|
# Operate on Key
|
|
if key != "":
|
|
if display_text != "":
|
|
display_text += '.'
|
|
# display_text += key
|
|
# Exits
|
|
if "exit" in key and "gui" not in domain:
|
|
key = key.replace("exit","")
|
|
specials["exit"] = True
|
|
if "Exit" in key and "gui" not in domain:
|
|
key = key.replace("Exit","")
|
|
specials["exit"] = True
|
|
# Locations
|
|
tmp = key.split(" - ")
|
|
if len(tmp) >= 2:
|
|
specials["multiRoom"] = tmp[len(tmp) - 1]
|
|
tmp.pop()
|
|
key = " - ".join(tmp)
|
|
key = key.strip()
|
|
|
|
# Operate on Subkey
|
|
if subkey != "":
|
|
if display_text != "":
|
|
display_text += '.'
|
|
display_text += subkey
|
|
# Exits
|
|
if "exit" in subkey and "gui" not in domain:
|
|
subkey = subkey.replace("exit","")
|
|
specials["exit"] = True
|
|
if "Exit" in subkey and "gui" not in domain:
|
|
subkey = subkey.replace("Exit","")
|
|
specials["exit"] = True
|
|
# Locations
|
|
tmp = subkey.split(" - ")
|
|
if len(tmp) >= 2:
|
|
specials["multiRoom"] = tmp[len(tmp) - 1]
|
|
tmp.pop()
|
|
subkey = " - ".join(tmp)
|
|
subkey = subkey.strip()
|
|
|
|
my_lang = self.lang_defns[self.locale] #handle for localization
|
|
en_lang = self.lang_defns["en"] #handle for English
|
|
|
|
if domain in my_lang and key in my_lang[domain] and subkey in my_lang[domain][key] and not my_lang[domain][key][subkey] == "": #get localization first
|
|
display_text = my_lang[domain][key][subkey]
|
|
elif domain in en_lang and key in en_lang[domain] and subkey in en_lang[domain][key] and not en_lang[domain][key][subkey] == "": #gracefully degrade to English
|
|
display_text = en_lang[domain][key][subkey]
|
|
elif specials["exit"]:
|
|
specials["exit"] = False
|
|
|
|
if specials["exit"]:
|
|
display_text += " Exit"
|
|
elif specials["multiRoom"] and specials["multiRoom"] not in display_text:
|
|
display_text += " - " + specials["multiRoom"]
|
|
|
|
return display_text
|