diff options
Diffstat (limited to 'aurweb/l10n.py')
-rw-r--r-- | aurweb/l10n.py | 79 |
1 files changed, 69 insertions, 10 deletions
diff --git a/aurweb/l10n.py b/aurweb/l10n.py index a476ecd8..030ab274 100644 --- a/aurweb/l10n.py +++ b/aurweb/l10n.py @@ -1,24 +1,79 @@ import gettext +import typing + +from collections import OrderedDict + +from fastapi import Request +from jinja2 import contextfilter import aurweb.config +SUPPORTED_LANGUAGES = OrderedDict({ + "ar": "العربية", + "ast": "Asturianu", + "ca": "Català", + "cs": "Český", + "da": "Dansk", + "de": "Deutsch", + "el": "Ελληνικά", + "en": "English", + "es": "Español", + "es_419": "Español (Latinoamérica)", + "fi": "Suomi", + "fr": "Français", + "he": "עברית", + "hr": "Hrvatski", + "hu": "Magyar", + "it": "Italiano", + "ja": "日本語", + "nb": "Norsk", + "nl": "Nederlands", + "pl": "Polski", + "pt_BR": "Português (Brasil)", + "pt_PT": "Português (Portugal)", + "ro": "Română", + "ru": "Русский", + "sk": "Slovenčina", + "sr": "Srpski", + "tr": "Türkçe", + "uk": "Українська", + "zh_CN": "简体中文", + "zh_TW": "正體中文" +}) + class Translator: def __init__(self): self._localedir = aurweb.config.get('options', 'localedir') self._translator = {} - def translate(self, s, lang): - if lang == 'en': - return s + def get_translator(self, lang: str): if lang not in self._translator: self._translator[lang] = gettext.translation("aurweb", self._localedir, - languages=[lang]) - return self._translator[lang].gettext(s) + languages=[lang], + fallback=True) + return self._translator.get(lang) + + def translate(self, s: str, lang: str): + return self.get_translator(lang).gettext(s) + + +# Global translator object. +translator = Translator() -def get_translator_for_request(request): +def get_request_language(request: Request): + return request.cookies.get("AURLANG", + aurweb.config.get("options", "default_lang")) + + +def get_raw_translator_for_request(request: Request): + lang = get_request_language(request) + return translator.get_translator(lang) + + +def get_translator_for_request(request: Request): """ Determine the preferred language from a FastAPI request object and build a translator function for it. @@ -29,12 +84,16 @@ def get_translator_for_request(request): print(_("Hello")) ``` """ - lang = request.cookies.get("AURLANG") - if lang is None: - lang = aurweb.config.get("options", "default_lang") - translator = Translator() + lang = get_request_language(request) def translate(message): return translator.translate(message, lang) return translate + + +@contextfilter +def tr(context: typing.Any, value: str): + """ A translation filter; example: {{ "Hello" | tr("de") }}. """ + _ = get_translator_for_request(context.get("request")) + return _(value) |