languages: refactor

- No full restart requirement just reload
- Fix some systems not loading the language
- Fix RTL not applied if the lang was not set by the system
This commit is contained in:
alfrix 2022-10-26 00:49:49 -03:00
parent 93457b2961
commit d3d7104ec4
7 changed files with 58 additions and 35 deletions

View File

@ -64,8 +64,6 @@ class KlippyWebsocket(threading.Thread):
self.connect()
def connect(self):
_ = self._screen.lang.gettext
def ws_on_close(ws, a=None, b=None):
self.on_close(ws)

View File

@ -40,6 +40,8 @@ class KlipperScreenConfig:
self.config_path = self.get_config_file_location(configfile)
logging.debug(f"Config path location: {self.config_path}")
self.defined_config = None
self.lang = None
self.langs = {}
try:
self.config.read(self.default_config_path)
@ -101,15 +103,35 @@ class KlipperScreenConfig:
item[name]['moonraker_api_key'] = "redacted"
logging.debug(f"Configured printers: {json.dumps(conf_printers_debug, indent=2)}")
lang = self.get_main_config().get("language", None)
lang = [lang] if lang is not None and lang != "default" else None
logging.info(f"Detected language: {lang}")
self.lang = gettext.translation('KlipperScreen', localedir='ks_includes/locales', languages=lang,
fallback=True)
self.lang.install(names=['gettext', 'ngettext'])
self.create_translations()
self._create_configurable_options(screen)
def create_translations(self):
lang_path = os.path.join(klipperscreendir, "ks_includes", "locales")
self.lang_list = [d for d in os.listdir(lang_path) if not os.path.isfile(os.path.join(lang_path, d))]
self.lang_list.sort()
logging.info(f"Available lang list {self.lang_list}")
for lng in self.lang_list:
self.langs[lng] = gettext.translation('KlipperScreen', localedir=lang_path, languages=[lng], fallback=True)
lang = self.get_main_config().get("language", None)
logging.debug(f"Selected lang: {lang} OS lang: {os.getenv('LANG')}")
self.install_language(lang)
def install_language(self, lang):
if lang is None or lang == "system_lang":
for language in self.lang_list:
if os.getenv('LANG').lower().startswith(language):
logging.debug("Using system lang")
lang = language
if lang not in self.lang_list:
logging.error(f"lang: {lang} not found")
lang = "en"
return
logging.info(f"Using lang {lang}")
self.lang = self.langs[lang]
self.lang.install(names=['gettext', 'ngettext'])
def validate_config(self):
valid = True
for section in self.config:
@ -136,7 +158,7 @@ class KlipperScreenConfig:
'invert_x', 'invert_y', 'invert_z',
)
strs = (
'moonraker_api_key', 'moonraker_host', 'language', 'titlebar_name_type',
'moonraker_api_key', 'moonraker_host', 'titlebar_name_type',
'screw_positions', 'power_devices', 'titlebar_items', 'z_babystep_values',
'extrude_distances', "extrude_speeds",
)
@ -192,7 +214,7 @@ class KlipperScreenConfig:
self.configurable_options = [
{"language": {
"section": "main", "name": _("Language"), "type": "dropdown", "value": "system_lang",
"callback": screen.restart_warning, "options": [
"callback": screen.change_language, "options": [
{"name": _("System") + " " + _("(default)"), "value": "system_lang"}]}},
{"theme": {
"section": "main", "name": _("Icon Theme"), "type": "dropdown",
@ -248,12 +270,8 @@ class KlipperScreenConfig:
self.configurable_options.extend(panel_options)
lang_path = os.path.join(klipperscreendir, "ks_includes", "locales")
langs = [d for d in os.listdir(lang_path) if not os.path.isfile(os.path.join(lang_path, d))]
langs.sort()
lang_opt = self.configurable_options[0]['language']['options']
for lang in langs:
for lang in self.lang_list:
lang_opt.append({"name": lang, "value": lang})
t_path = os.path.join(klipperscreendir, 'styles')

View File

@ -14,7 +14,6 @@ class ScreenPanel:
self._screen = screen
self._config = screen._config
self._files = screen.files
self.lang = self._screen.lang
self._printer = screen.printer
self.labels = {}
self._gtk = screen.gtk

View File

@ -288,7 +288,7 @@ class BasePanel(ScreenPanel):
def set_title(self, title):
try:
env = Environment(extensions=["jinja2.ext.i18n"], autoescape=True)
env.install_gettext_translations(self.lang)
env.install_gettext_translations(self._config.get_lang())
j2_temp = env.from_string(title)
title = j2_temp.render()
except Exception as e:

View File

@ -127,7 +127,7 @@ class InputShaperPanel(ScreenPanel):
if method == "both":
self._screen._ws.klippy.gcode_script('SHAPER_CALIBRATE')
self.calibrate_btn.set_label(self.lang.gettext('Calibrating...'))
self.calibrate_btn.set_label(_('Calibrating...'))
self.calibrate_btn.set_sensitive(False)
def set_opt_value(self, widget, opt, *args):

View File

@ -77,7 +77,7 @@ class MenuPanel(ScreenPanel):
item = self.items[i][key]
env = Environment(extensions=["jinja2.ext.i18n"], autoescape=True)
env.install_gettext_translations(self.lang)
env.install_gettext_translations(self._config.get_lang())
j2_temp = env.from_string(item['name'])
parsed_name = j2_temp.render()

View File

@ -74,7 +74,6 @@ class KlipperScreen(Gtk.Window):
printer = None
printer_select_callbacks = []
printer_select_prepanel = None
rtl_languages = ['he_il']
subscriptions = []
shutdown = True
updating = False
@ -96,17 +95,7 @@ class KlipperScreen(Gtk.Window):
configfile = os.path.normpath(os.path.expanduser(args.configfile))
self._config = KlipperScreenConfig(configfile, self)
self.lang = self._config.get_lang()
logging.debug(f"OS Language: {os.getenv('LANG')}")
self.lang_ltr = True
for lang in self.rtl_languages:
if os.getenv('LANG').lower().startswith(lang):
self.lang_ltr = False
Gtk.Widget.set_default_direction(Gtk.TextDirection.RTL)
logging.debug("Enabling RTL mode")
break
self.lang_ltr = self.set_text_direction(self._config.get_main_config().get("language", None))
Gtk.Window.__init__(self)
monitor = Gdk.Display.get_default().get_primary_monitor()
@ -835,11 +824,30 @@ class KlipperScreen(Gtk.Window):
def toggle_macro_shortcut(self, value):
self.base_panel.show_macro_shortcut(value)
def set_text_direction(self, lang=None):
rtl_languages = ['he_IL']
if lang is None:
for lng in rtl_languages:
if os.getenv('LANG').startswith(lng):
lang = lng
break
if lang in rtl_languages:
Gtk.Widget.set_default_direction(Gtk.TextDirection.RTL)
logging.debug("Enabling RTL mode")
return False
Gtk.Widget.set_default_direction(Gtk.TextDirection.LTR)
return True
def change_language(self, lang):
self._config.install_language(lang)
self.lang_ltr = self.set_text_direction(lang)
self._config._create_configurable_options(self)
self.reload_panels()
def reload_panels(self, *args):
self._remove_all_panels()
for panel in list(self.panels):
if panel not in ["printer_select", "splash_screen"]:
del self.panels[panel]
del self.panels[panel]
for dialog in self.dialogs:
dialog.destroy()
state = self.printer.state
@ -907,7 +915,7 @@ class KlipperScreen(Gtk.Window):
try:
env = Environment(extensions=["jinja2.ext.i18n"], autoescape=True)
env.install_gettext_translations(self.lang)
env.install_gettext_translations(self._config.get_lang())
j2_temp = env.from_string(text)
text = j2_temp.render()
except Exception as e: