Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions archinstall/lib/args.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ def from_config(cls, args_config: dict[str, Any], args: Arguments) -> Self:

if archinstall_lang := args_config.get('archinstall-language', None):
arch_config.archinstall_language = translation_handler.get_language_by_name(archinstall_lang)
translation_handler.activate(arch_config.archinstall_language)

if disk_config := args_config.get('disk_config', {}):
enc_password = args_config.get('encryption_password', '')
Expand Down
6 changes: 3 additions & 3 deletions archinstall/lib/general/general_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,9 @@ async def select_archinstall_language(languages: list[Language], preset: Languag
group = MenuItemGroup(items, sort_items=True)
group.set_focus_by_value(preset)

title = 'NOTE: If a language can not displayed properly, a proper font must be set manually in the console.\n'
title += 'All available fonts can be found in "/usr/share/kbd/consolefonts"\n'
title += 'e.g. setfont LatGrkCyr-8x16 (to display latin/greek/cyrillic characters)\n'
title = 'NOTE: Console font will be set automatically for supported languages.\n'
title += 'For other languages, fonts can be found in "/usr/share/kbd/consolefonts"\n'
title += 'and set manually with: setfont <fontname>\n'

result = await Selection[Language](
header=title,
Expand Down
56 changes: 55 additions & 1 deletion archinstall/lib/translationhandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@
from pathlib import Path
from typing import override

from archinstall.lib.command import SysCommand
from archinstall.lib.exceptions import SysCallError
from archinstall.lib.output import debug


@dataclass
class Language:
Expand All @@ -14,6 +18,7 @@ class Language:
translation: gettext.NullTranslations
translation_percent: int
translated_lang: str | None
console_font: str | None = None

@property
def display_name(self) -> str:
Expand All @@ -31,6 +36,52 @@ def json(self) -> str:
return self.name_en


_DEFAULT_FONT = 'default8x16'
_ENV_FONT = os.environ.get('FONT')
_FONT_BACKUP = Path('/tmp/archinstall_font_backup')
_CMAP_BACKUP = Path('/tmp/archinstall_cmap_backup')


def _set_console_font(font_name: str | None) -> None:
"""
Set the console font via setfont.
Falls back to default8x16 if font_name is None or setfont fails.
"""
target = font_name or _DEFAULT_FONT

try:
SysCommand(f'setfont {target}')
except SysCallError as err:
debug(f'Failed to set console font {target}: {err}')
if target != _DEFAULT_FONT:
try:
SysCommand(f'setfont {_DEFAULT_FONT}')
except SysCallError as fallback_err:
debug(f'Failed to set default console font: {fallback_err}')


def _save_console_font() -> None:
"""Save the current console font (with unicode map) and console map to backup files."""
try:
SysCommand(f'setfont -O {_FONT_BACKUP} -om {_CMAP_BACKUP}')
except SysCallError as err:
debug(f'Failed to save console font: {err}')


def _restore_console_font() -> None:
"""Restore console font (with unicode map) and console map from backup, falling back to default8x16."""
if _FONT_BACKUP.exists():
args = str(_FONT_BACKUP)
if _CMAP_BACKUP.exists():
args += f' -m {_CMAP_BACKUP}'
_set_console_font(args)
else:
_set_console_font(None)

_FONT_BACKUP.unlink(missing_ok=True)
_CMAP_BACKUP.unlink(missing_ok=True)


class TranslationHandler:
def __init__(self) -> None:
self._base_pot = 'base.pot'
Expand All @@ -57,6 +108,7 @@ def _get_translations(self) -> list[Language]:
abbr = mapping_entry['abbr']
lang = mapping_entry['lang']
translated_lang = mapping_entry.get('translated_lang', None)
console_font = mapping_entry.get('console_font', None)

try:
# get a translation for a specific language
Expand All @@ -71,7 +123,7 @@ def _get_translations(self) -> list[Language]:
# prevent cases where the .pot file is out of date and the percentage is above 100
percent = min(100, percent)

language = Language(abbr, lang, translation, percent, translated_lang)
language = Language(abbr, lang, translation, percent, translated_lang, console_font)
languages.append(language)
except FileNotFoundError as err:
raise FileNotFoundError(f"Could not locate language file for '{lang}': {err}")
Expand Down Expand Up @@ -134,6 +186,8 @@ def activate(self, language: Language) -> None:
# The install() call has the side effect of assigning GNUTranslations.gettext to builtins._
language.translation.install()

_set_console_font(_ENV_FONT if _ENV_FONT else language.console_font)

def _get_locales_dir(self) -> Path:
"""
Get the locales directory path
Expand Down
2 changes: 1 addition & 1 deletion archinstall/locales/languages.json
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@
{"abbr": "tr", "lang": "Turkish", "translated_lang" : "Türkçe"},
{"abbr": "tw", "lang": "Twi"},
{"abbr": "ug", "lang": "Uighur"},
{"abbr": "uk", "lang": "Ukrainian"},
{"abbr": "uk", "lang": "Ukrainian", "console_font": "UniCyr_8x16"},
{"abbr": "ur", "lang": "Urdu", "translated_lang": "اردو"},
{"abbr": "uz", "lang": "Uzbek", "translated_lang": "O'zbek"},
{"abbr": "ve", "lang": "Venda"},
Expand Down
9 changes: 8 additions & 1 deletion archinstall/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from archinstall.lib.output import debug, error, info, warn
from archinstall.lib.packages.util import check_version_upgrade
from archinstall.lib.pacman.pacman import Pacman
from archinstall.lib.translationhandler import tr
from archinstall.lib.translationhandler import _ENV_FONT, _restore_console_font, _save_console_font, _set_console_font, tr
from archinstall.lib.utils.util import running_from_iso
from archinstall.tui.ui.components import tui

Expand Down Expand Up @@ -79,6 +79,11 @@ def run() -> int:
OR straight as a module: python -m archinstall
In any case we will be attempting to load the provided script to be run from the scripts/ folder
"""
_save_console_font()

if _ENV_FONT:
_set_console_font(_ENV_FONT)

arch_config_handler = ArchConfigHandler()

if '--help' in sys.argv or '-h' in sys.argv:
Expand Down Expand Up @@ -159,6 +164,8 @@ def main() -> int:
_error_message(exc)
rc = 1

_restore_console_font()

return rc


Expand Down
Loading