Implement shallow translation
This commit is contained in:
109
source/classes/BabelFish.py
Normal file
109
source/classes/BabelFish.py
Normal file
@@ -0,0 +1,109 @@
|
||||
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","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:
|
||||
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:
|
||||
key = key.replace("exit","")
|
||||
specials["exit"] = True
|
||||
if "Exit" in key:
|
||||
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:
|
||||
subkey = subkey.replace("exit","")
|
||||
specials["exit"] = True
|
||||
if "Exit" in subkey:
|
||||
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
|
||||
Reference in New Issue
Block a user