diff options
| author | Daniel Schadt <kingdread@gmx.de> | 2022-12-03 16:38:39 +0100 | 
|---|---|---|
| committer | Daniel Schadt <kingdread@gmx.de> | 2022-12-06 18:39:20 +0100 | 
| commit | 810ccfe9feccff0d5ccecea57aad11491d62a6e5 (patch) | |
| tree | 64f93e0990cac47616d2de970192b0b677e50cb5 | |
| parent | 9692c6155b7e4302c9778cb8ff2f917758aefe5e (diff) | |
| download | fietsboek-810ccfe9feccff0d5ccecea57aad11491d62a6e5.tar.gz fietsboek-810ccfe9feccff0d5ccecea57aad11491d62a6e5.tar.bz2 fietsboek-810ccfe9feccff0d5ccecea57aad11491d62a6e5.zip  | |
enable loading of foreign locale packages
| -rw-r--r-- | fietsboek/__init__.py | 2 | ||||
| -rw-r--r-- | fietsboek/config.py | 3 | ||||
| -rw-r--r-- | fietsboek/util.py | 21 | ||||
| -rw-r--r-- | fietsboek/views/default.py | 6 | 
4 files changed, 24 insertions, 8 deletions
diff --git a/fietsboek/__init__.py b/fietsboek/__init__.py index e208a61..fe6bf52 100644 --- a/fietsboek/__init__.py +++ b/fietsboek/__init__.py @@ -80,6 +80,8 @@ def main(_global_config, **settings):          config.include('.models')          config.scan()          config.add_translation_dirs('fietsboek:locale/') +        for pack in parsed_config.language_packs: +            config.add_translation_dirs(f'{pack}:locale/')          config.set_session_factory(my_session_factory)          config.set_security_policy(SecurityPolicy())          config.set_csrf_storage_policy(CookieCSRFStoragePolicy()) diff --git a/fietsboek/config.py b/fietsboek/config.py index d2efe77..b8a2cfb 100644 --- a/fietsboek/config.py +++ b/fietsboek/config.py @@ -141,6 +141,9 @@ class Config(BaseModel):      session_key: str      """Session key.""" +    language_packs: PyramidList = Field([], alias="fietsboek.language_packs") +    """Additional language packs to load.""" +      available_locales: PyramidList = ["en", "de"]      """Available locales.""" diff --git a/fietsboek/util.py b/fietsboek/util.py index 71f5d16..6b2190b 100644 --- a/fietsboek/util.py +++ b/fietsboek/util.py @@ -284,7 +284,7 @@ def check_password_constraints(password, repeat_password=None):          raise ValueError(_("password_constraint.length")) -def read_localized_resource(locale_name, path, raise_on_error=False): +def read_localized_resource(locale_name, path, locale_packages=None, raise_on_error=False):      """Reads a localized resource.      Localized resources are located in the ``fietsboek/locale/**`` directory. @@ -294,6 +294,9 @@ def read_localized_resource(locale_name, path, raise_on_error=False):      :param locale_name: Name of the locale.      :type locale_name: str +    :param locale_packages: Names of packages in which locale data is searched. +        By default, only built-in locales are searched. +    :type locale_packages: list[str]      :param raise_on_error: Raise an error instead of returning a placeholder.      :type raise_on_error: bool      :raises FileNotFoundError: If the path could not be found and @@ -307,13 +310,17 @@ def read_localized_resource(locale_name, path, raise_on_error=False):      if "_" in locale_name:          locales.append(locale_name.split("_", 1)[0]) +    if locale_packages is None: +        locale_packages = ['fietsboek'] +      for locale in locales: -        locale_dir = importlib_resources.files('fietsboek') / 'locale' / locale -        resource_path = locale_dir / path -        try: -            return resource_path.read_text() -        except (FileNotFoundError, ModuleNotFoundError, NotADirectoryError): -            pass +        for package in locale_packages: +            locale_dir = importlib_resources.files(package) / 'locale' / locale +            resource_path = locale_dir / path +            try: +                return resource_path.read_text() +            except (FileNotFoundError, ModuleNotFoundError, NotADirectoryError): +                pass      if raise_on_error:          raise FileNotFoundError(f"Resource {path!r} not found")      return f"{locale_name}:{path}" diff --git a/fietsboek/views/default.py b/fietsboek/views/default.py index f4aaa8f..516aef7 100644 --- a/fietsboek/views/default.py +++ b/fietsboek/views/default.py @@ -40,7 +40,11 @@ def home(request):          # Show the default home page          locale = request.localizer.locale_name -        content = util.read_localized_resource(locale, "html/home.html") +        content = util.read_localized_resource( +            locale, +            "html/home.html", +            locale_packages=request.config.language_packs, +        )          return {              'home_content': content,          }  | 
