From 1619a3c3a1b66a8bc51beceed97e8f5f621e9297 Mon Sep 17 00:00:00 2001 From: Softer Date: Thu, 2 Apr 2026 20:08:07 +0300 Subject: [PATCH 1/2] Add translation support for TUI help groups and binding descriptions Help group names shown via F1 (General, Navigation, Selection, Search) and key binding descriptions in the Textual footer (Down, Up, Cancel, Confirm, etc.) were hardcoded in English and never went through the translation system. --- archinstall/lib/global_menu.py | 5 + archinstall/locales/base.pot | 117 +++++++++++++++++++++ archinstall/locales/uk/LC_MESSAGES/base.mo | Bin 81144 -> 83294 bytes archinstall/locales/uk/LC_MESSAGES/base.po | 117 +++++++++++++++++++++ archinstall/tui/help.py | 2 +- archinstall/tui/ui/components.py | 28 ++++- 6 files changed, 267 insertions(+), 2 deletions(-) diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index cae51df2c2..327b43e98f 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -269,12 +269,17 @@ def _update_lang_text(self) -> None: The options for the global menu are generated with a static text; each entry of the menu needs to be updated with the new translation """ + from archinstall.tui.ui.components import TApp, _translate_bindings + new_options = self._get_menu_options() for o in new_options: if o.key is not None: self._item_group.find_by_key(o.key).text = o.text + if TApp.app is not None: + _translate_bindings(TApp.app) + async def _locale_selection(self, preset: LocaleConfiguration) -> LocaleConfiguration | None: locale_config = await LocaleMenu(preset).show() return locale_config diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index 34ed316db0..756d29e4a2 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -1709,6 +1709,123 @@ msgstr "" msgid "Exit search mode" msgstr "" +msgid "General" +msgstr "" + +msgid "Navigation" +msgstr "" + +msgid "Selection" +msgstr "" + +msgid "Search" +msgstr "" + +msgid "Down" +msgstr "" + +msgid "Up" +msgstr "" + +msgid "Confirm" +msgstr "" + +msgid "Focus right" +msgstr "" + +msgid "Focus left" +msgstr "" + +msgid "Toggle" +msgstr "" + +msgid "Show/Hide help" +msgstr "" + +msgid "Quit" +msgstr "" + +msgid "First" +msgstr "" + +msgid "Last" +msgstr "" + +msgid "Select" +msgstr "" + +msgid "Page Up" +msgstr "" + +msgid "Page Down" +msgstr "" + +msgid "Page up" +msgstr "" + +msgid "Page down" +msgstr "" + +msgid "Page Left" +msgstr "" + +msgid "Page Right" +msgstr "" + +msgid "Cursor up" +msgstr "" + +msgid "Cursor down" +msgstr "" + +msgid "Cursor right" +msgstr "" + +msgid "Cursor left" +msgstr "" + +msgid "Top" +msgstr "" + +msgid "Bottom" +msgstr "" + +msgid "Home" +msgstr "" + +msgid "End" +msgstr "" + +msgid "Toggle option" +msgstr "" + +msgid "Scroll Up" +msgstr "" + +msgid "Scroll Down" +msgstr "" + +msgid "Scroll Left" +msgstr "" + +msgid "Scroll Right" +msgstr "" + +msgid "Scroll Home" +msgstr "" + +msgid "Scroll End" +msgstr "" + +msgid "Focus Next" +msgstr "" + +msgid "Focus Previous" +msgstr "" + +msgid "Copy selected text" +msgstr "" + msgid "" "labwc needs access to your seat (collection of hardware devices i.e. " "keyboard, mouse, etc)" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.mo b/archinstall/locales/uk/LC_MESSAGES/base.mo index 6d6f7558c3ab8f462977b451520a1f1dd39445a3..ad1301397a91623ff58a2cd270dab383c6b78a3b 100644 GIT binary patch delta 15768 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 delta 13692 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 str: max_key_width = max([help.get_key_width() for help in help_texts]) for help_group in help_texts: - help_output += f'{help_group.group_id.value}\n' + help_output += f'{tr(help_group.group_id.value)}\n' divider_len = max_desc_width + max_key_width help_output += '-' * divider_len + '\n' diff --git a/archinstall/tui/ui/components.py b/archinstall/tui/ui/components.py index 475f7b1795..a52d87cda5 100644 --- a/archinstall/tui/ui/components.py +++ b/archinstall/tui/ui/components.py @@ -1,7 +1,7 @@ import sys from abc import ABC, abstractmethod from collections.abc import Awaitable, Callable -from dataclasses import dataclass +from dataclasses import dataclass, replace from enum import Enum, auto from typing import Any, ClassVar, Literal, TypeVar, cast, override @@ -27,6 +27,16 @@ ValueT = TypeVar('ValueT') +def _translate_bindings(widget: Any) -> None: + if widget._merged_bindings is None: + return + for key, bindings in widget._merged_bindings.key_to_bindings.items(): + widget._bindings.key_to_bindings[key] = [ + replace(b, description=tr(b.description)) if b.description else b + for b in bindings + ] + + class BaseScreen(Screen[Result[ValueT]]): BINDINGS: ClassVar = [ Binding('escape', 'cancel_operation', 'Cancel', show=True), @@ -97,6 +107,7 @@ def compose(self) -> ComposeResult: yield Footer() def on_mount(self) -> None: + _translate_bindings(self) if self._data_callback: self._exec_callback() else: @@ -129,6 +140,9 @@ class _OptionList(OptionList): Binding('k', 'cursor_up', 'Up', show=False), ] + def on_mount(self) -> None: + _translate_bindings(self) + class OptionListScreen(BaseScreen[ValueT]): """ @@ -271,6 +285,7 @@ def compose(self) -> ComposeResult: yield Footer() def on_mount(self) -> None: + _translate_bindings(self) self._update_options(self._options) self.query_one(OptionList).focus() @@ -355,6 +370,9 @@ class _SelectionList(SelectionList[ValueT]): Binding('k', 'cursor_up', 'Up', show=False), ] + def on_mount(self) -> None: + _translate_bindings(self) + class SelectListScreen(BaseScreen[ValueT]): """ @@ -499,6 +517,7 @@ def on_input_submitted(self, event: Input.Submitted) -> None: self._handle_search_action() def on_mount(self) -> None: + _translate_bindings(self) self._update_options(self._options) self.query_one(SelectionList).focus() @@ -660,6 +679,7 @@ def compose(self) -> ComposeResult: yield Footer() def on_mount(self) -> None: + _translate_bindings(self) self._update_selection() def action_focus_right(self) -> None: @@ -815,6 +835,7 @@ def compose(self) -> ComposeResult: yield Footer() def on_mount(self) -> None: + _translate_bindings(self) input_field = self.query_one('#main_input', Input) input_field.focus() @@ -854,6 +875,9 @@ class _DataTable(DataTable[ValueT]): Binding('k', 'cursor_up', 'Up', show=False), ] + def on_mount(self) -> None: + _translate_bindings(self) + class TableSelectionScreen(BaseScreen[ValueT]): BINDINGS: ClassVar = [ @@ -974,6 +998,7 @@ def compose(self) -> ComposeResult: yield Footer() def on_mount(self) -> None: + _translate_bindings(self) self._display_header(True) data_table = self.query_one(DataTable) data_table.cell_padding = 2 @@ -1229,6 +1254,7 @@ def action_trigger_help(self) -> None: _ = self.screen.mount(HelpPanel()) def on_mount(self) -> None: + _translate_bindings(self) self._run_worker() @work From 507a623c4ca768d8c767cf847a22635b11b7b46a Mon Sep 17 00:00:00 2001 From: Softer Date: Thu, 2 Apr 2026 20:42:01 +0300 Subject: [PATCH 2/2] ruff_format_check and mypy fixes --- archinstall/tui/ui/components.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/archinstall/tui/ui/components.py b/archinstall/tui/ui/components.py index a52d87cda5..72cce32c86 100644 --- a/archinstall/tui/ui/components.py +++ b/archinstall/tui/ui/components.py @@ -31,10 +31,7 @@ def _translate_bindings(widget: Any) -> None: if widget._merged_bindings is None: return for key, bindings in widget._merged_bindings.key_to_bindings.items(): - widget._bindings.key_to_bindings[key] = [ - replace(b, description=tr(b.description)) if b.description else b - for b in bindings - ] + widget._bindings.key_to_bindings[key] = [replace(b, description=tr(b.description)) if b.description else b for b in bindings] class BaseScreen(Screen[Result[ValueT]]): @@ -140,6 +137,7 @@ class _OptionList(OptionList): Binding('k', 'cursor_up', 'Up', show=False), ] + @override def on_mount(self) -> None: _translate_bindings(self) @@ -370,6 +368,7 @@ class _SelectionList(SelectionList[ValueT]): Binding('k', 'cursor_up', 'Up', show=False), ] + @override def on_mount(self) -> None: _translate_bindings(self) @@ -875,6 +874,7 @@ class _DataTable(DataTable[ValueT]): Binding('k', 'cursor_up', 'Up', show=False), ] + @override def on_mount(self) -> None: _translate_bindings(self)