Files
igncore/core/translation_service.py
T
Minidodo 9f1da9a00d Fixed warnings caused by non-existing messagehub channels.
Changed the setting registration, removed the warnings.
Loot roll messages are more obvious now.
Superadmins are meant to stay mostily hidden, but are being exposed in !system again.
2021-08-29 17:54:18 +02:00

103 lines
3.7 KiB
Python

import inspect
import hjson
from core.decorators import instance
from core.event_service import EventService
from core.logger import Logger
from core.setting_service import SettingService
from core.setting_types import TextSettingType
from core.igncore import Tyrbot
from core.util import Util
# noinspection PyDefaultArgument
@instance()
class TranslationService:
strings = {}
translation_callbacks = {}
language = None
lang_codes = ["en_US", "de_DE"]
LANGUAGE_SETTING = "language"
def __init__(self):
self.logger = Logger(__name__)
def inject(self, registry):
self.setting_service: SettingService = registry.get_instance("setting_service")
self.event_service: EventService = registry.get_instance("event_service")
self.util: Util = registry.get_instance("util")
self.bot: Tyrbot = registry.get_instance("bot")
def pre_start(self):
self.event_service.register_event_type("reload_translation")
def start(self):
self.setting_service.register("core.system", self.LANGUAGE_SETTING, "en_US",
TextSettingType(self.lang_codes), "Language of the Bot")
self.language = self.setting_service.get_value(self.LANGUAGE_SETTING)
self.register_translation("global", self.load_global_msg)
self.setting_service.register_change_listener(self.LANGUAGE_SETTING, self.language_setting_changed)
def register_translation(self, category, callback):
"""
Call during start
Args:
category: str
callback: () -> {}
"""
if len(inspect.signature(callback).parameters) != 0:
raise Exception(
"Incorrect number of arguments for handler '%s.%s()'" % (callback.__module__, callback.__name__))
if self.translation_callbacks.get(category) is None:
self.translation_callbacks[category] = []
self.translation_callbacks[category].append(callback)
self.update_msg(category, callback)
def load_global_msg(self):
with open("core/global.msg", mode="r", encoding="UTF-8") as f:
return hjson.load(f)
def language_setting_changed(self, name, old_value, new_value):
if name == self.LANGUAGE_SETTING and new_value != old_value:
self.reload_translation(new_value)
# This method will load another language, defined in the param 'lang'
def reload_translation(self, lang):
self.event_service.fire_event("reload_translation")
self.language = lang
for k1 in self.strings:
for callback in self.translation_callbacks.get(k1):
self.update_msg(k1, callback)
# updates the msgs
def update_msg(self, category, callback):
data = callback()
for k in data:
if category not in self.strings:
self.strings[category] = {}
self.strings[category][k] = data[k].get(self.language) or data[k].get("en_US")
#
# the param 'variables' accepts dictionaries ONLY.
#
def get_response(self, category, key, variables={}):
msg = ""
try:
val = self.strings[category][key]
if isinstance(val, list):
for line in val:
msg += line.format(**variables)
else:
msg = val.format(**variables)
except KeyError as e:
self.logger.error(f"translating error category '{category}' and key '{key}' with params: {variables}", e)
msg = "Error translating category: <highlight>{mod}</highlight> key: <highlight>{key}</highlight>" \
" with params: <highlight>{params}</highlight>".format(mod=category, key=key, params=variables)
finally:
return msg