Source code for pbpicat.i18n

"""Internationalisation bootstrap for PBPicat.

Call setup(app) once before creating any window.
"""

from __future__ import annotations

import gettext
import locale
import os
from pathlib import Path

from PySide6.QtCore import QLibraryInfo, QLocale, QTranslator
from PySide6.QtWidgets import QApplication

_DOMAIN = "pbpicat"
_LOCALE_DIR = Path(__file__).parent / "locale"


class _GettextTranslator(QTranslator):
    def __init__(self, translation: gettext.NullTranslations, parent: QApplication) -> None:
        super().__init__(parent)
        self._t = translation

    def translate(self, context: str, source_text: str, disambiguation=None, n: int = -1) -> str:
        return self._t.gettext(source_text)


def _system_language() -> str:
    for var in ("LANGUAGE", "LC_ALL", "LC_MESSAGES", "LANG"):
        val = os.environ.get(var, "")
        if val:
            first = val.split(":")[0]
            lang = first.split("_")[0].split(".")[0]
            if lang and lang not in ("", "C", "POSIX"):
                return lang
    loc, _ = locale.getlocale()
    if loc:
        return loc.split("_")[0]
    return "en"


[docs] def available_languages() -> list[tuple[str, str]]: """Return [(lang_code, lang_name_in_that_language), …] sorted by code.""" result: list[tuple[str, str]] = [] for mo_path in sorted(_LOCALE_DIR.glob("*/LC_MESSAGES/pbpicat.mo")): lang_code = mo_path.parts[-3] try: t = gettext.translation(_DOMAIN, localedir=str(_LOCALE_DIR), languages=[lang_code]) except FileNotFoundError: continue lang_name = t.gettext("language_name") if lang_name == "language_name": lang_name = lang_code result.append((lang_code, lang_name)) return result
[docs] def setup(app: QApplication) -> None: """Install translations for app. Safe to call multiple times.""" from pbpicat.config import load_global_config config = load_global_config() override = config.get("language", "") lang = override if override else _system_language() try: t: gettext.NullTranslations = gettext.translation(_DOMAIN, localedir=str(_LOCALE_DIR), languages=[lang]) except FileNotFoundError: t = gettext.NullTranslations() t.install() translator = _GettextTranslator(t, app) app.installTranslator(translator) qt_translator = QTranslator(app) translations_path = QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath) if qt_translator.load(QLocale(lang), "qtbase", "_", translations_path): app.installTranslator(qt_translator)