From fd80eac25f896d4e423710abd1807f3915d03b64 Mon Sep 17 00:00:00 2001 From: object-Object Date: Fri, 29 Mar 2024 18:48:00 -0400 Subject: [PATCH] Reduce missing i18n log spam (close #66) --- CHANGELOG.md | 1 + src/hexdoc/minecraft/i18n.py | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcb0ee0a..68b8cc4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) * Adding spoilers to individual pages with the `advancement` field is now supported. * Use [`uv`](https://github.com/astral-sh/uv) instead of `pip` for all reusable workflows. * `hexdoc ci build` now attempts to read the site url from `HEXDOC_SITE_URL` and `GITHUB_PAGES_URL` environment variables before querying the GitHub API. +* "No translation in {lang} for key {key}" warnings are now only printed once per key for each language to reduce log spam. ## `1!0.1.0a10` diff --git a/src/hexdoc/minecraft/i18n.py b/src/hexdoc/minecraft/i18n.py index fafde5ff..e728e0ed 100644 --- a/src/hexdoc/minecraft/i18n.py +++ b/src/hexdoc/minecraft/i18n.py @@ -240,11 +240,15 @@ def localize( else: log_level = logging.WARNING - logger.log( - log_level, - f"No translation in {self.lang} for " - + (f"key {keys[0]}" if len(keys) == 1 else f"keys {keys}"), - ) + log_keys = set(keys) - self._logged_missing_keys + if log_keys: + self._logged_missing_keys.update(log_keys) + match list(log_keys): + case [key]: + message = f"key {key}" + case _: + message = "keys " + ", ".join(log_keys) + logger.log(log_level, f"No translation in {self.lang} for {message}") if default is not None: return LocalizedStr.skip_i18n(default) @@ -345,3 +349,8 @@ def localize_lang(self, silent: bool = False): name = self.localize("language.name", silent=silent) region = self.localize("language.region", silent=silent) return f"{name} ({region})" + + @model_validator(mode="after") + def _init_logger_cache(self): + self._logged_missing_keys = set[str]() + return self