From 5d34dce4910c327327396554cfe71a3cd2606389 Mon Sep 17 00:00:00 2001 From: Softer Date: Sat, 11 Apr 2026 06:46:33 +0300 Subject: [PATCH 1/3] Add Fonts application with multi-select for emoji and CJK packages --- archinstall/applications/fonts.py | 14 ++++++ .../lib/applications/application_handler.py | 7 +++ .../lib/applications/application_menu.py | 48 +++++++++++++++++++ archinstall/lib/models/application.py | 29 +++++++++++ archinstall/locales/base.pot | 12 +++++ archinstall/locales/uk/LC_MESSAGES/base.po | 12 +++++ 6 files changed, 122 insertions(+) create mode 100644 archinstall/applications/fonts.py diff --git a/archinstall/applications/fonts.py b/archinstall/applications/fonts.py new file mode 100644 index 0000000000..3fa54c67d4 --- /dev/null +++ b/archinstall/applications/fonts.py @@ -0,0 +1,14 @@ +from typing import TYPE_CHECKING + +from archinstall.lib.models.application import FontsConfiguration +from archinstall.lib.output import debug + +if TYPE_CHECKING: + from archinstall.lib.installer import Installer + + +class FontsApp: + def install(self, install_session: Installer, fonts_config: FontsConfiguration) -> None: + packages = [f.value for f in fonts_config.fonts] + debug(f'Installing fonts: {packages}') + install_session.add_additional_packages(packages) diff --git a/archinstall/lib/applications/application_handler.py b/archinstall/lib/applications/application_handler.py index fb0ceced30..7fcf5dbacb 100644 --- a/archinstall/lib/applications/application_handler.py +++ b/archinstall/lib/applications/application_handler.py @@ -3,6 +3,7 @@ from archinstall.applications.audio import AudioApp from archinstall.applications.bluetooth import BluetoothApp from archinstall.applications.firewall import FirewallApp +from archinstall.applications.fonts import FontsApp from archinstall.applications.power_management import PowerManagementApp from archinstall.applications.print_service import PrintServiceApp from archinstall.lib.models import Audio @@ -42,3 +43,9 @@ def install_applications(self, install_session: Installer, app_config: Applicati install_session, app_config.firewall_config, ) + + if app_config.fonts_config: + FontsApp().install( + install_session, + app_config.fonts_config, + ) diff --git a/archinstall/lib/applications/application_menu.py b/archinstall/lib/applications/application_menu.py index 5ef50441f3..c34de65e19 100644 --- a/archinstall/lib/applications/application_menu.py +++ b/archinstall/lib/applications/application_menu.py @@ -10,6 +10,8 @@ BluetoothConfiguration, Firewall, FirewallConfiguration, + FontPackage, + FontsConfiguration, PowerManagement, PowerManagementConfiguration, PrintServiceConfiguration, @@ -77,6 +79,13 @@ def _define_menu_options(self) -> list[MenuItem]: preview_action=self._prev_firewall, key='firewall_config', ), + MenuItem( + text=tr('Fonts'), + action=select_fonts, + value=self._app_config.fonts_config, + preview_action=self._prev_fonts, + key='fonts_config', + ), ] def _prev_power_management(self, item: MenuItem) -> str | None: @@ -115,6 +124,13 @@ def _prev_firewall(self, item: MenuItem) -> str | None: return f'{tr("Firewall")}: {config.firewall.value}' return None + def _prev_fonts(self, item: MenuItem) -> str | None: + if item.value is not None: + config: FontsConfiguration = item.value + packages = ', '.join(f.value for f in config.fonts) + return f'{tr("Fonts")}: {packages}' + return None + async def select_power_management(preset: PowerManagementConfiguration | None = None) -> PowerManagementConfiguration | None: group = MenuItemGroup.from_enum(PowerManagement) @@ -217,3 +233,35 @@ async def select_firewall(preset: FirewallConfiguration | None = None) -> Firewa return FirewallConfiguration(firewall=result.get_value()) case ResultType.Reset: return None + + +async def select_fonts(preset: FontsConfiguration | None = None) -> FontsConfiguration | None: + descriptions = { + FontPackage.EMOJI: tr('color emoji for browsers and apps'), + FontPackage.CJK: tr('Chinese, Japanese, Korean characters'), + } + items = [MenuItem(f'{f.value} ({descriptions[f]})', value=f) for f in FontPackage] + group = MenuItemGroup(items) + + if preset: + for f in preset.fonts: + group.set_selected_by_value(f) + + result = await Selection[FontPackage]( + group, + header=tr('Select font packages to install'), + allow_skip=True, + allow_reset=True, + multi=True, + ).show() + + match result.type_: + case ResultType.Skip: + return preset + case ResultType.Selection: + selected = result.get_values() + if selected: + return FontsConfiguration(fonts=selected) + return None + case ResultType.Reset: + return None diff --git a/archinstall/lib/models/application.py b/archinstall/lib/models/application.py index d32042ff2f..5cbce557ab 100644 --- a/archinstall/lib/models/application.py +++ b/archinstall/lib/models/application.py @@ -39,6 +39,15 @@ class FirewallConfigSerialization(TypedDict): firewall: str +class FontPackage(StrEnum): + EMOJI = 'noto-fonts-emoji' + CJK = 'noto-fonts-cjk' + + +class FontsConfigSerialization(TypedDict): + fonts: list[str] + + class ZramAlgorithm(StrEnum): ZSTD = 'zstd' LZO_RLE = 'lzo-rle' @@ -53,6 +62,7 @@ class ApplicationSerialization(TypedDict): power_management_config: NotRequired[PowerManagementConfigSerialization] print_service_config: NotRequired[PrintServiceConfigSerialization] firewall_config: NotRequired[FirewallConfigSerialization] + fonts_config: NotRequired[FontsConfigSerialization] @dataclass @@ -127,6 +137,18 @@ def parse_arg(cls, arg: dict[str, Any]) -> Self: ) +@dataclass +class FontsConfiguration: + fonts: list[FontPackage] + + def json(self) -> FontsConfigSerialization: + return {'fonts': [f.value for f in self.fonts]} + + @classmethod + def parse_arg(cls, arg: FontsConfigSerialization) -> Self: + return cls(fonts=[FontPackage(f) for f in arg['fonts']]) + + @dataclass(frozen=True) class ZramConfiguration: enabled: bool @@ -149,6 +171,7 @@ class ApplicationConfiguration: power_management_config: PowerManagementConfiguration | None = None print_service_config: PrintServiceConfiguration | None = None firewall_config: FirewallConfiguration | None = None + fonts_config: FontsConfiguration | None = None @classmethod def parse_arg( @@ -177,6 +200,9 @@ def parse_arg( if args and (firewall_config := args.get('firewall_config')) is not None: app_config.firewall_config = FirewallConfiguration.parse_arg(firewall_config) + if args and (fonts_config := args.get('fonts_config')) is not None: + app_config.fonts_config = FontsConfiguration.parse_arg(fonts_config) + return app_config def json(self) -> ApplicationSerialization: @@ -197,4 +223,7 @@ def json(self) -> ApplicationSerialization: if self.firewall_config: config['firewall_config'] = self.firewall_config.json() + if self.fonts_config: + config['fonts_config'] = self.fonts_config.json() + return config diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index df0915c769..9ba043903a 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -1940,6 +1940,18 @@ msgstr "" msgid "Firewall" msgstr "" +msgid "Fonts" +msgstr "" + +msgid "Select font packages to install" +msgstr "" + +msgid "color emoji for browsers and apps" +msgstr "" + +msgid "Chinese, Japanese, Korean characters" +msgstr "" + msgid "Select audio configuration" msgstr "" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index b88fd2901e..8604bd46d1 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -1881,6 +1881,18 @@ msgstr "Використовувати NetworkManager (з iwd)" msgid "Firewall" msgstr "Брандмауер" +msgid "Fonts" +msgstr "Шрифти" + +msgid "Select font packages to install" +msgstr "Оберіть пакети шрифтів для встановлення" + +msgid "color emoji for browsers and apps" +msgstr "кольорові емодзі для браузерів та програм" + +msgid "Chinese, Japanese, Korean characters" +msgstr "китайські, японські, корейські символи" + msgid "Select audio configuration" msgstr "Оберіть конфігурацію аудіо" From e8c66c8b86be01a69c8906c303982a32059eab0c Mon Sep 17 00:00:00 2001 From: Softer Date: Sat, 11 Apr 2026 21:43:06 +0300 Subject: [PATCH 2/3] Rename to Additional fonts and add package descriptions --- archinstall/lib/applications/application_menu.py | 4 ++-- archinstall/locales/base.pot | 2 +- archinstall/locales/uk/LC_MESSAGES/base.po | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/archinstall/lib/applications/application_menu.py b/archinstall/lib/applications/application_menu.py index c34de65e19..54a05e5d44 100644 --- a/archinstall/lib/applications/application_menu.py +++ b/archinstall/lib/applications/application_menu.py @@ -80,7 +80,7 @@ def _define_menu_options(self) -> list[MenuItem]: key='firewall_config', ), MenuItem( - text=tr('Fonts'), + text=tr('Additional fonts'), action=select_fonts, value=self._app_config.fonts_config, preview_action=self._prev_fonts, @@ -128,7 +128,7 @@ def _prev_fonts(self, item: MenuItem) -> str | None: if item.value is not None: config: FontsConfiguration = item.value packages = ', '.join(f.value for f in config.fonts) - return f'{tr("Fonts")}: {packages}' + return f'{tr("Additional fonts")}: {packages}' return None diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index 9ba043903a..0327f4512e 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -1940,7 +1940,7 @@ msgstr "" msgid "Firewall" msgstr "" -msgid "Fonts" +msgid "Additional fonts" msgstr "" msgid "Select font packages to install" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index 8604bd46d1..afba6c4e2c 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -1881,8 +1881,8 @@ msgstr "Використовувати NetworkManager (з iwd)" msgid "Firewall" msgstr "Брандмауер" -msgid "Fonts" -msgstr "Шрифти" +msgid "Additional fonts" +msgstr "Додаткові шрифти" msgid "Select font packages to install" msgstr "Оберіть пакети шрифтів для встановлення" From 65ef2202b81949349e497f925865877457699ce6 Mon Sep 17 00:00:00 2001 From: Softer Date: Sun, 12 Apr 2026 11:17:37 +0300 Subject: [PATCH 3/3] Add noto-fonts to font package selection --- archinstall/lib/applications/application_menu.py | 1 + archinstall/lib/models/application.py | 1 + archinstall/locales/base.pot | 3 +++ archinstall/locales/uk/LC_MESSAGES/base.po | 3 +++ 4 files changed, 8 insertions(+) diff --git a/archinstall/lib/applications/application_menu.py b/archinstall/lib/applications/application_menu.py index 54a05e5d44..fdf35a56d8 100644 --- a/archinstall/lib/applications/application_menu.py +++ b/archinstall/lib/applications/application_menu.py @@ -237,6 +237,7 @@ async def select_firewall(preset: FirewallConfiguration | None = None) -> Firewa async def select_fonts(preset: FontsConfiguration | None = None) -> FontsConfiguration | None: descriptions = { + FontPackage.NOTO: tr('Unicode font coverage for most languages'), FontPackage.EMOJI: tr('color emoji for browsers and apps'), FontPackage.CJK: tr('Chinese, Japanese, Korean characters'), } diff --git a/archinstall/lib/models/application.py b/archinstall/lib/models/application.py index 5cbce557ab..4365eb45c3 100644 --- a/archinstall/lib/models/application.py +++ b/archinstall/lib/models/application.py @@ -40,6 +40,7 @@ class FirewallConfigSerialization(TypedDict): class FontPackage(StrEnum): + NOTO = 'noto-fonts' EMOJI = 'noto-fonts-emoji' CJK = 'noto-fonts-cjk' diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index 0327f4512e..77bed7144e 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -1946,6 +1946,9 @@ msgstr "" msgid "Select font packages to install" msgstr "" +msgid "Unicode font coverage for most languages" +msgstr "" + msgid "color emoji for browsers and apps" msgstr "" diff --git a/archinstall/locales/uk/LC_MESSAGES/base.po b/archinstall/locales/uk/LC_MESSAGES/base.po index afba6c4e2c..0897ad8da0 100644 --- a/archinstall/locales/uk/LC_MESSAGES/base.po +++ b/archinstall/locales/uk/LC_MESSAGES/base.po @@ -1887,6 +1887,9 @@ msgstr "Додаткові шрифти" msgid "Select font packages to install" msgstr "Оберіть пакети шрифтів для встановлення" +msgid "Unicode font coverage for most languages" +msgstr "покриття шрифтами Unicode для більшості мов" + msgid "color emoji for browsers and apps" msgstr "кольорові емодзі для браузерів та програм"