From d3d7104ec46e43d61be2c2a4dc9b21f3bbd0d3f8 Mon Sep 17 00:00:00 2001 From: alfrix Date: Wed, 26 Oct 2022 00:49:49 -0300 Subject: [PATCH] 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 --- ks_includes/KlippyWebsocket.py | 2 -- ks_includes/config.py | 46 +++++++++++++++++++++++----------- ks_includes/screen_panel.py | 1 - panels/base_panel.py | 2 +- panels/input_shaper.py | 2 +- panels/menu.py | 2 +- screen.py | 38 +++++++++++++++++----------- 7 files changed, 58 insertions(+), 35 deletions(-) diff --git a/ks_includes/KlippyWebsocket.py b/ks_includes/KlippyWebsocket.py index 2ce9c81e..4914a20e 100644 --- a/ks_includes/KlippyWebsocket.py +++ b/ks_includes/KlippyWebsocket.py @@ -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) diff --git a/ks_includes/config.py b/ks_includes/config.py index 7832acee..d3f7dc83 100644 --- a/ks_includes/config.py +++ b/ks_includes/config.py @@ -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') diff --git a/ks_includes/screen_panel.py b/ks_includes/screen_panel.py index c2f7afdd..013b0967 100644 --- a/ks_includes/screen_panel.py +++ b/ks_includes/screen_panel.py @@ -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 diff --git a/panels/base_panel.py b/panels/base_panel.py index 46f20284..9f7c4ca9 100644 --- a/panels/base_panel.py +++ b/panels/base_panel.py @@ -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: diff --git a/panels/input_shaper.py b/panels/input_shaper.py index 02361611..9dbcca45 100644 --- a/panels/input_shaper.py +++ b/panels/input_shaper.py @@ -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): diff --git a/panels/menu.py b/panels/menu.py index ae206a67..24007c92 100644 --- a/panels/menu.py +++ b/panels/menu.py @@ -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() diff --git a/screen.py b/screen.py index ccefb43f..ad2c9207 100644 --- a/screen.py +++ b/screen.py @@ -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: