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()
|
self.connect()
|
||||||
|
|
||||||
def connect(self):
|
def connect(self):
|
||||||
_ = self._screen.lang.gettext
|
|
||||||
|
|
||||||
def ws_on_close(ws, a=None, b=None):
|
def ws_on_close(ws, a=None, b=None):
|
||||||
self.on_close(ws)
|
self.on_close(ws)
|
||||||
|
|
||||||
|
@ -40,6 +40,8 @@ class KlipperScreenConfig:
|
|||||||
self.config_path = self.get_config_file_location(configfile)
|
self.config_path = self.get_config_file_location(configfile)
|
||||||
logging.debug(f"Config path location: {self.config_path}")
|
logging.debug(f"Config path location: {self.config_path}")
|
||||||
self.defined_config = None
|
self.defined_config = None
|
||||||
|
self.lang = None
|
||||||
|
self.langs = {}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.config.read(self.default_config_path)
|
self.config.read(self.default_config_path)
|
||||||
@ -101,15 +103,35 @@ class KlipperScreenConfig:
|
|||||||
item[name]['moonraker_api_key'] = "redacted"
|
item[name]['moonraker_api_key'] = "redacted"
|
||||||
logging.debug(f"Configured printers: {json.dumps(conf_printers_debug, indent=2)}")
|
logging.debug(f"Configured printers: {json.dumps(conf_printers_debug, indent=2)}")
|
||||||
|
|
||||||
lang = self.get_main_config().get("language", None)
|
self.create_translations()
|
||||||
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_configurable_options(screen)
|
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):
|
def validate_config(self):
|
||||||
valid = True
|
valid = True
|
||||||
for section in self.config:
|
for section in self.config:
|
||||||
@ -136,7 +158,7 @@ class KlipperScreenConfig:
|
|||||||
'invert_x', 'invert_y', 'invert_z',
|
'invert_x', 'invert_y', 'invert_z',
|
||||||
)
|
)
|
||||||
strs = (
|
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',
|
'screw_positions', 'power_devices', 'titlebar_items', 'z_babystep_values',
|
||||||
'extrude_distances', "extrude_speeds",
|
'extrude_distances', "extrude_speeds",
|
||||||
)
|
)
|
||||||
@ -192,7 +214,7 @@ class KlipperScreenConfig:
|
|||||||
self.configurable_options = [
|
self.configurable_options = [
|
||||||
{"language": {
|
{"language": {
|
||||||
"section": "main", "name": _("Language"), "type": "dropdown", "value": "system_lang",
|
"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"}]}},
|
{"name": _("System") + " " + _("(default)"), "value": "system_lang"}]}},
|
||||||
{"theme": {
|
{"theme": {
|
||||||
"section": "main", "name": _("Icon Theme"), "type": "dropdown",
|
"section": "main", "name": _("Icon Theme"), "type": "dropdown",
|
||||||
@ -248,12 +270,8 @@ class KlipperScreenConfig:
|
|||||||
|
|
||||||
self.configurable_options.extend(panel_options)
|
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']
|
lang_opt = self.configurable_options[0]['language']['options']
|
||||||
|
for lang in self.lang_list:
|
||||||
for lang in langs:
|
|
||||||
lang_opt.append({"name": lang, "value": lang})
|
lang_opt.append({"name": lang, "value": lang})
|
||||||
|
|
||||||
t_path = os.path.join(klipperscreendir, 'styles')
|
t_path = os.path.join(klipperscreendir, 'styles')
|
||||||
|
@ -14,7 +14,6 @@ class ScreenPanel:
|
|||||||
self._screen = screen
|
self._screen = screen
|
||||||
self._config = screen._config
|
self._config = screen._config
|
||||||
self._files = screen.files
|
self._files = screen.files
|
||||||
self.lang = self._screen.lang
|
|
||||||
self._printer = screen.printer
|
self._printer = screen.printer
|
||||||
self.labels = {}
|
self.labels = {}
|
||||||
self._gtk = screen.gtk
|
self._gtk = screen.gtk
|
||||||
|
@ -288,7 +288,7 @@ class BasePanel(ScreenPanel):
|
|||||||
def set_title(self, title):
|
def set_title(self, title):
|
||||||
try:
|
try:
|
||||||
env = Environment(extensions=["jinja2.ext.i18n"], autoescape=True)
|
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)
|
j2_temp = env.from_string(title)
|
||||||
title = j2_temp.render()
|
title = j2_temp.render()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -127,7 +127,7 @@ class InputShaperPanel(ScreenPanel):
|
|||||||
if method == "both":
|
if method == "both":
|
||||||
self._screen._ws.klippy.gcode_script('SHAPER_CALIBRATE')
|
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)
|
self.calibrate_btn.set_sensitive(False)
|
||||||
|
|
||||||
def set_opt_value(self, widget, opt, *args):
|
def set_opt_value(self, widget, opt, *args):
|
||||||
|
@ -77,7 +77,7 @@ class MenuPanel(ScreenPanel):
|
|||||||
item = self.items[i][key]
|
item = self.items[i][key]
|
||||||
|
|
||||||
env = Environment(extensions=["jinja2.ext.i18n"], autoescape=True)
|
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'])
|
j2_temp = env.from_string(item['name'])
|
||||||
parsed_name = j2_temp.render()
|
parsed_name = j2_temp.render()
|
||||||
|
|
||||||
|
38
screen.py
38
screen.py
@ -74,7 +74,6 @@ class KlipperScreen(Gtk.Window):
|
|||||||
printer = None
|
printer = None
|
||||||
printer_select_callbacks = []
|
printer_select_callbacks = []
|
||||||
printer_select_prepanel = None
|
printer_select_prepanel = None
|
||||||
rtl_languages = ['he_il']
|
|
||||||
subscriptions = []
|
subscriptions = []
|
||||||
shutdown = True
|
shutdown = True
|
||||||
updating = False
|
updating = False
|
||||||
@ -96,17 +95,7 @@ class KlipperScreen(Gtk.Window):
|
|||||||
configfile = os.path.normpath(os.path.expanduser(args.configfile))
|
configfile = os.path.normpath(os.path.expanduser(args.configfile))
|
||||||
|
|
||||||
self._config = KlipperScreenConfig(configfile, self)
|
self._config = KlipperScreenConfig(configfile, self)
|
||||||
self.lang = self._config.get_lang()
|
self.lang_ltr = self.set_text_direction(self._config.get_main_config().get("language", None))
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
Gtk.Window.__init__(self)
|
Gtk.Window.__init__(self)
|
||||||
monitor = Gdk.Display.get_default().get_primary_monitor()
|
monitor = Gdk.Display.get_default().get_primary_monitor()
|
||||||
@ -835,11 +824,30 @@ class KlipperScreen(Gtk.Window):
|
|||||||
def toggle_macro_shortcut(self, value):
|
def toggle_macro_shortcut(self, value):
|
||||||
self.base_panel.show_macro_shortcut(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):
|
def reload_panels(self, *args):
|
||||||
self._remove_all_panels()
|
self._remove_all_panels()
|
||||||
for panel in list(self.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:
|
for dialog in self.dialogs:
|
||||||
dialog.destroy()
|
dialog.destroy()
|
||||||
state = self.printer.state
|
state = self.printer.state
|
||||||
@ -907,7 +915,7 @@ class KlipperScreen(Gtk.Window):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
env = Environment(extensions=["jinja2.ext.i18n"], autoescape=True)
|
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)
|
j2_temp = env.from_string(text)
|
||||||
text = j2_temp.render()
|
text = j2_temp.render()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user