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:
parent
93457b2961
commit
d3d7104ec4
@ -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)
|
||||
|
||||
|
@ -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')
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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):
|
||||
|
@ -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()
|
||||
|
||||
|
38
screen.py
38
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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user