From bc6c08b6ea7122af1b598e7c4e4b8551a745ed9f Mon Sep 17 00:00:00 2001 From: claudi Date: Wed, 15 Apr 2026 08:03:48 +0200 Subject: [PATCH] feat: Add new translation keys and backward-compatible aliases for web source settings --- resources/translations/de.json | 28 ++++++++++++++++++++ resources/translations/en.json | 28 ++++++++++++++++++++ resources/translations/fr.json | 28 ++++++++++++++++++++ resources/translations/it.json | 28 ++++++++++++++++++++ resources/translations/ru.json | 28 ++++++++++++++++++++ resources/translations/zh.json | 28 ++++++++++++++++++++ src/webdrop_bridge/utils/i18n.py | 44 +++++++++++++++++++++++++++++++- tests/unit/test_i18n.py | 27 ++++++++++++++++++++ 8 files changed, 238 insertions(+), 1 deletion(-) diff --git a/resources/translations/de.json b/resources/translations/de.json index d37c9a8..3940c17 100644 --- a/resources/translations/de.json +++ b/resources/translations/de.json @@ -132,6 +132,34 @@ "settings.error.select_mapping": "Bitte w\u00e4hlen Sie eine Zuordnung zur Bearbeitung aus", "settings.error.select_profile_load": "Bitte w\u00e4hlen Sie ein Profil zum Laden aus", "settings.error.select_profile_delete": "Bitte w\u00e4hlen Sie ein Profil zum L\u00f6schen aus", + "settings.web_source.url_label": "Webanwendungs-URL:", + "settings.web_source.open_btn": "\u00d6ffnen", + "settings.web_source.url_mappings_label": "URL-Zuordnungen (Azure Blob Storage \u2192 Lokale Pfade):", + "settings.web_source.col_url_prefix": "URL-Pr\u00e4fix", + "settings.web_source.col_local_path": "Lokaler Pfad", + "settings.web_source.add_mapping_btn": "Zuordnung hinzuf\u00fcgen", + "settings.web_source.edit_mapping_btn": "Auswahl bearbeiten", + "settings.web_source.remove_mapping_btn": "Auswahl entfernen", + "settings.web_source.add_mapping_title": "URL-Zuordnung hinzuf\u00fcgen", + "settings.web_source.add_mapping_url_prompt": "Azure Blob Storage URL-Pr\u00e4fix eingeben:\n(z.B. https://myblob.blob.core.windows.net/container/)", + "settings.web_source.add_mapping_path_prompt": "Lokalen Dateisystempfad eingeben:\n(z.B. C:\\Freigabe oder /mnt/share)", + "settings.web_source.edit_mapping_title": "URL-Zuordnung bearbeiten", + "settings.web_source.edit_mapping_url_prompt": "Azure Blob Storage URL-Pr\u00e4fix eingeben:", + "settings.web_source.edit_mapping_path_prompt": "Lokalen Dateisystempfad eingeben:", + "settings.web_source.select_mapping_to_edit": "Bitte w\u00e4hlen Sie eine Zuordnung zur Bearbeitung aus", + "settings.logging.level_label": "Protokollstufe:", + "settings.logging.file_label": "Protokolldatei (optional):", + "settings.logging.browse_btn": "Durchsuchen...", + "settings.logging.select_file_title": "Protokolldatei ausw\u00e4hlen", + "settings.paths.select_dir_title": "Verzeichnis ausw\u00e4hlen", + "settings.urls.add_title": "URL hinzuf\u00fcgen", + "settings.urls.add_prompt": "URL-Muster eingeben (z.B. http://example.com oder http://*.example.com):", + "settings.profiles.save_title": "Profil speichern", + "settings.profiles.save_prompt": "Profilnamen eingeben (z.B. Arbeit, Privat):", + "settings.profiles.select_to_load": "Bitte w\u00e4hlen Sie ein Profil zum Laden aus", + "settings.profiles.select_to_delete": "Bitte w\u00e4hlen Sie ein Profil zum L\u00f6schen aus", + "settings.profiles.export_title": "Konfiguration exportieren", + "settings.profiles.import_title": "Konfiguration importieren", "update.checking.title": "Update-Pr\u00fcfung", "update.checking.label": "Suche nach Updates...", diff --git a/resources/translations/en.json b/resources/translations/en.json index 27cfa09..3bbfb25 100644 --- a/resources/translations/en.json +++ b/resources/translations/en.json @@ -132,6 +132,34 @@ "settings.error.select_mapping": "Please select a mapping to edit", "settings.error.select_profile_load": "Please select a profile to load", "settings.error.select_profile_delete": "Please select a profile to delete", + "settings.web_source.url_label": "Web Application URL:", + "settings.web_source.open_btn": "Open", + "settings.web_source.url_mappings_label": "URL Mappings (Azure Blob Storage \u2192 Local Paths):", + "settings.web_source.col_url_prefix": "URL Prefix", + "settings.web_source.col_local_path": "Local Path", + "settings.web_source.add_mapping_btn": "Add Mapping", + "settings.web_source.edit_mapping_btn": "Edit Selected", + "settings.web_source.remove_mapping_btn": "Remove Selected", + "settings.web_source.add_mapping_title": "Add URL Mapping", + "settings.web_source.add_mapping_url_prompt": "Enter Azure Blob Storage URL prefix:\n(e.g., https://myblob.blob.core.windows.net/container/)", + "settings.web_source.add_mapping_path_prompt": "Enter local file system path:\n(e.g., C:\\Share or /mnt/share)", + "settings.web_source.edit_mapping_title": "Edit URL Mapping", + "settings.web_source.edit_mapping_url_prompt": "Enter Azure Blob Storage URL prefix:", + "settings.web_source.edit_mapping_path_prompt": "Enter local file system path:", + "settings.web_source.select_mapping_to_edit": "Please select a mapping to edit", + "settings.logging.level_label": "Log Level:", + "settings.logging.file_label": "Log File (optional):", + "settings.logging.browse_btn": "Browse...", + "settings.logging.select_file_title": "Select Log File", + "settings.paths.select_dir_title": "Select Directory to Allow", + "settings.urls.add_title": "Add URL", + "settings.urls.add_prompt": "Enter URL pattern (e.g., http://example.com or http://*.example.com):", + "settings.profiles.save_title": "Save Profile", + "settings.profiles.save_prompt": "Enter profile name (e.g., work, personal):", + "settings.profiles.select_to_load": "Please select a profile to load", + "settings.profiles.select_to_delete": "Please select a profile to delete", + "settings.profiles.export_title": "Export Configuration", + "settings.profiles.import_title": "Import Configuration", "update.checking.title": "Checking for Updates", "update.checking.label": "Checking for updates...", diff --git a/resources/translations/fr.json b/resources/translations/fr.json index 62d631d..3e76e2d 100644 --- a/resources/translations/fr.json +++ b/resources/translations/fr.json @@ -132,6 +132,34 @@ "settings.error.select_mapping": "Veuillez s\u00e9lectionner un mappage \u00e0 modifier", "settings.error.select_profile_load": "Veuillez s\u00e9lectionner un profil \u00e0 charger", "settings.error.select_profile_delete": "Veuillez s\u00e9lectionner un profil \u00e0 supprimer", + "settings.web_source.url_label": "URL de l'application web\u00a0:", + "settings.web_source.open_btn": "Ouvrir", + "settings.web_source.url_mappings_label": "Mappages d'URL (Azure Blob Storage \u2192 Chemins locaux)\u00a0:", + "settings.web_source.col_url_prefix": "Pr\u00e9fixe URL", + "settings.web_source.col_local_path": "Chemin local", + "settings.web_source.add_mapping_btn": "Ajouter un mappage", + "settings.web_source.edit_mapping_btn": "Modifier la s\u00e9lection", + "settings.web_source.remove_mapping_btn": "Supprimer la s\u00e9lection", + "settings.web_source.add_mapping_title": "Ajouter un mappage d'URL", + "settings.web_source.add_mapping_url_prompt": "Entrez le pr\u00e9fixe URL Azure Blob Storage\u00a0:\n(p.ex. https://myblob.blob.core.windows.net/container/)", + "settings.web_source.add_mapping_path_prompt": "Entrez le chemin du syst\u00e8me de fichiers local\u00a0:\n(p.ex. C:\\Partage ou /mnt/partage)", + "settings.web_source.edit_mapping_title": "Modifier le mappage d'URL", + "settings.web_source.edit_mapping_url_prompt": "Entrez le pr\u00e9fixe URL Azure Blob Storage\u00a0:", + "settings.web_source.edit_mapping_path_prompt": "Entrez le chemin du syst\u00e8me de fichiers local\u00a0:", + "settings.web_source.select_mapping_to_edit": "Veuillez s\u00e9lectionner un mappage \u00e0 modifier", + "settings.logging.level_label": "Niveau de journalisation\u00a0:", + "settings.logging.file_label": "Fichier journal (facultatif)\u00a0:", + "settings.logging.browse_btn": "Parcourir...", + "settings.logging.select_file_title": "S\u00e9lectionner le fichier journal", + "settings.paths.select_dir_title": "S\u00e9lectionner un r\u00e9pertoire autoris\u00e9", + "settings.urls.add_title": "Ajouter une URL", + "settings.urls.add_prompt": "Entrez le mod\u00e8le d'URL (p.ex. http://example.com ou http://*.example.com)\u00a0:", + "settings.profiles.save_title": "Enregistrer le profil", + "settings.profiles.save_prompt": "Entrez le nom du profil (p.ex. travail, personnel)\u00a0:", + "settings.profiles.select_to_load": "Veuillez s\u00e9lectionner un profil \u00e0 charger", + "settings.profiles.select_to_delete": "Veuillez s\u00e9lectionner un profil \u00e0 supprimer", + "settings.profiles.export_title": "Exporter la configuration", + "settings.profiles.import_title": "Importer la configuration", "update.checking.title": "V\u00e9rification des mises \u00e0 jour", "update.checking.label": "Recherche de mises \u00e0 jour...", diff --git a/resources/translations/it.json b/resources/translations/it.json index cccde66..8695a68 100644 --- a/resources/translations/it.json +++ b/resources/translations/it.json @@ -132,6 +132,34 @@ "settings.error.select_mapping": "Seleziona una mappatura da modificare", "settings.error.select_profile_load": "Seleziona un profilo da caricare", "settings.error.select_profile_delete": "Seleziona un profilo da eliminare", + "settings.web_source.url_label": "URL applicazione web:", + "settings.web_source.open_btn": "Apri", + "settings.web_source.url_mappings_label": "Mappature URL (Azure Blob Storage \u2192 Percorsi locali):", + "settings.web_source.col_url_prefix": "Prefisso URL", + "settings.web_source.col_local_path": "Percorso locale", + "settings.web_source.add_mapping_btn": "Aggiungi mappatura", + "settings.web_source.edit_mapping_btn": "Modifica selezionato", + "settings.web_source.remove_mapping_btn": "Rimuovi selezionato", + "settings.web_source.add_mapping_title": "Aggiungi mappatura URL", + "settings.web_source.add_mapping_url_prompt": "Inserisci prefisso URL Azure Blob Storage:\n(es. https://myblob.blob.core.windows.net/container/)", + "settings.web_source.add_mapping_path_prompt": "Inserisci percorso file system locale:\n(es. C:\\Share o /mnt/share)", + "settings.web_source.edit_mapping_title": "Modifica mappatura URL", + "settings.web_source.edit_mapping_url_prompt": "Inserisci prefisso URL Azure Blob Storage:", + "settings.web_source.edit_mapping_path_prompt": "Inserisci percorso file system locale:", + "settings.web_source.select_mapping_to_edit": "Seleziona una mappatura da modificare", + "settings.logging.level_label": "Livello log:", + "settings.logging.file_label": "File log (opzionale):", + "settings.logging.browse_btn": "Sfoglia...", + "settings.logging.select_file_title": "Seleziona file di log", + "settings.paths.select_dir_title": "Seleziona directory da consentire", + "settings.urls.add_title": "Aggiungi URL", + "settings.urls.add_prompt": "Inserisci pattern URL (es. http://example.com o http://*.example.com):", + "settings.profiles.save_title": "Salva profilo", + "settings.profiles.save_prompt": "Inserisci nome profilo (es. lavoro, personale):", + "settings.profiles.select_to_load": "Seleziona un profilo da caricare", + "settings.profiles.select_to_delete": "Seleziona un profilo da eliminare", + "settings.profiles.export_title": "Esporta configurazione", + "settings.profiles.import_title": "Importa configurazione", "update.checking.title": "Controllo aggiornamenti", "update.checking.label": "Controllo aggiornamenti...", diff --git a/resources/translations/ru.json b/resources/translations/ru.json index 94d3a74..9d36a37 100644 --- a/resources/translations/ru.json +++ b/resources/translations/ru.json @@ -132,6 +132,34 @@ "settings.error.select_mapping": "Выберите сопоставление для редактирования", "settings.error.select_profile_load": "Выберите профиль для загрузки", "settings.error.select_profile_delete": "Выберите профиль для удаления", + "settings.web_source.url_label": "URL веб-приложения:", + "settings.web_source.open_btn": "Открыть", + "settings.web_source.url_mappings_label": "Сопоставления URL (Azure Blob Storage → локальные пути):", + "settings.web_source.col_url_prefix": "Префикс URL", + "settings.web_source.col_local_path": "Локальный путь", + "settings.web_source.add_mapping_btn": "Добавить сопоставление", + "settings.web_source.edit_mapping_btn": "Изменить выбранное", + "settings.web_source.remove_mapping_btn": "Удалить выбранное", + "settings.web_source.add_mapping_title": "Добавить сопоставление URL", + "settings.web_source.add_mapping_url_prompt": "Введите префикс URL Azure Blob Storage:\n(например, https://myblob.blob.core.windows.net/container/)", + "settings.web_source.add_mapping_path_prompt": "Введите локальный путь файловой системы:\n(например, C:\\Share или /mnt/share)", + "settings.web_source.edit_mapping_title": "Изменить сопоставление URL", + "settings.web_source.edit_mapping_url_prompt": "Введите префикс URL Azure Blob Storage:", + "settings.web_source.edit_mapping_path_prompt": "Введите локальный путь файловой системы:", + "settings.web_source.select_mapping_to_edit": "Выберите сопоставление для редактирования", + "settings.logging.level_label": "Уровень логирования:", + "settings.logging.file_label": "Файл журнала (необязательно):", + "settings.logging.browse_btn": "Обзор...", + "settings.logging.select_file_title": "Выберите файл журнала", + "settings.paths.select_dir_title": "Выберите разрешенную папку", + "settings.urls.add_title": "Добавить URL", + "settings.urls.add_prompt": "Введите шаблон URL (например, http://example.com или http://*.example.com):", + "settings.profiles.save_title": "Сохранить профиль", + "settings.profiles.save_prompt": "Введите имя профиля (например, работа, личный):", + "settings.profiles.select_to_load": "Выберите профиль для загрузки", + "settings.profiles.select_to_delete": "Выберите профиль для удаления", + "settings.profiles.export_title": "Экспорт конфигурации", + "settings.profiles.import_title": "Импорт конфигурации", "update.checking.title": "Проверка обновлений", "update.checking.label": "Проверка обновлений...", diff --git a/resources/translations/zh.json b/resources/translations/zh.json index 532e027..62a049d 100644 --- a/resources/translations/zh.json +++ b/resources/translations/zh.json @@ -132,6 +132,34 @@ "settings.error.select_mapping": "请选择要编辑的映射", "settings.error.select_profile_load": "请选择要加载的档案", "settings.error.select_profile_delete": "请选择要删除的档案", + "settings.web_source.url_label": "Web 应用 URL:", + "settings.web_source.open_btn": "打开", + "settings.web_source.url_mappings_label": "URL 映射(Azure Blob Storage → 本地路径):", + "settings.web_source.col_url_prefix": "URL 前缀", + "settings.web_source.col_local_path": "本地路径", + "settings.web_source.add_mapping_btn": "添加映射", + "settings.web_source.edit_mapping_btn": "编辑所选", + "settings.web_source.remove_mapping_btn": "删除所选", + "settings.web_source.add_mapping_title": "添加 URL 映射", + "settings.web_source.add_mapping_url_prompt": "输入 Azure Blob Storage URL 前缀:\n(例如: https://myblob.blob.core.windows.net/container/)", + "settings.web_source.add_mapping_path_prompt": "输入本地文件系统路径:\n(例如: C:\\Share 或 /mnt/share)", + "settings.web_source.edit_mapping_title": "编辑 URL 映射", + "settings.web_source.edit_mapping_url_prompt": "输入 Azure Blob Storage URL 前缀:", + "settings.web_source.edit_mapping_path_prompt": "输入本地文件系统路径:", + "settings.web_source.select_mapping_to_edit": "请选择要编辑的映射", + "settings.logging.level_label": "日志级别:", + "settings.logging.file_label": "日志文件(可选):", + "settings.logging.browse_btn": "浏览...", + "settings.logging.select_file_title": "选择日志文件", + "settings.paths.select_dir_title": "选择允许目录", + "settings.urls.add_title": "添加 URL", + "settings.urls.add_prompt": "输入 URL 模式(例如: http://example.com 或 http://*.example.com):", + "settings.profiles.save_title": "保存档案", + "settings.profiles.save_prompt": "输入配置档案名称(例如: 工作, 个人):", + "settings.profiles.select_to_load": "请选择要加载的档案", + "settings.profiles.select_to_delete": "请选择要删除的档案", + "settings.profiles.export_title": "导出配置", + "settings.profiles.import_title": "导入配置", "update.checking.title": "检查更新", "update.checking.label": "正在检查更新...", diff --git a/src/webdrop_bridge/utils/i18n.py b/src/webdrop_bridge/utils/i18n.py index b01f693..baf4894 100644 --- a/src/webdrop_bridge/utils/i18n.py +++ b/src/webdrop_bridge/utils/i18n.py @@ -51,6 +51,39 @@ class Translator: "zh": "中文", } + # Backward-compatible key aliases for renamed translation keys. + # This allows newer UI code to reuse existing localized strings. + KEY_ALIASES: Dict[str, str] = { + "settings.web_source.url_label": "settings.web_url.label", + "settings.web_source.open_btn": "settings.web_url.open_btn", + "settings.web_source.url_mappings_label": "settings.url_mappings.label", + "settings.web_source.col_url_prefix": "settings.url_mappings.col_prefix", + "settings.web_source.col_local_path": "settings.url_mappings.col_path", + "settings.web_source.add_mapping_btn": "settings.url_mappings.add_btn", + "settings.web_source.edit_mapping_btn": "settings.url_mappings.edit_btn", + "settings.web_source.remove_mapping_btn": "settings.url_mappings.remove_btn", + "settings.web_source.add_mapping_title": "settings.add_mapping.url_title", + "settings.web_source.add_mapping_url_prompt": "settings.add_mapping.url_prompt", + "settings.web_source.add_mapping_path_prompt": "settings.add_mapping.path_prompt", + "settings.web_source.edit_mapping_title": "settings.edit_mapping.title", + "settings.web_source.edit_mapping_url_prompt": "settings.edit_mapping.url_prompt", + "settings.web_source.edit_mapping_path_prompt": "settings.edit_mapping.path_prompt", + "settings.web_source.select_mapping_to_edit": "settings.error.select_mapping", + "settings.logging.level_label": "settings.log_level.label", + "settings.logging.file_label": "settings.log_file.label", + "settings.logging.browse_btn": "settings.log_file.browse_btn", + "settings.logging.select_file_title": "settings.select_log_file.title", + "settings.paths.select_dir_title": "settings.select_directory.title", + "settings.urls.add_title": "settings.add_url.title", + "settings.urls.add_prompt": "settings.add_url.prompt", + "settings.profiles.save_title": "settings.profile.save.title", + "settings.profiles.save_prompt": "settings.profile.save.prompt", + "settings.profiles.select_to_load": "settings.error.select_profile_load", + "settings.profiles.select_to_delete": "settings.error.select_profile_delete", + "settings.profiles.export_title": "settings.export_config.title", + "settings.profiles.import_title": "settings.import_config.title", + } + def __init__(self) -> None: self._language: str = "en" self._translations: Dict[str, str] = {} @@ -107,7 +140,16 @@ class Translator: Translated and formatted string. Returns the *key* itself when no translation is found, so missing keys are always visible. """ - text = self._translations.get(key) or self._fallback.get(key) or key + text = self._translations.get(key) or self._fallback.get(key) + + if text is None: + alias_key = self.KEY_ALIASES.get(key) + if alias_key: + text = self._translations.get(alias_key) or self._fallback.get(alias_key) + + if text is None: + text = key + if kwargs: try: text = text.format(**kwargs) diff --git a/tests/unit/test_i18n.py b/tests/unit/test_i18n.py index b52da9d..9750b76 100644 --- a/tests/unit/test_i18n.py +++ b/tests/unit/test_i18n.py @@ -58,3 +58,30 @@ class TestI18n: available = i18n.get_available_languages() assert "en" in available assert "fr" in available + + def test_renamed_settings_keys_fall_back_to_legacy_aliases(self, tmp_path: Path): + """Renamed keys should resolve via alias mapping to existing translations.""" + translations = tmp_path / "translations" + translations.mkdir(parents=True, exist_ok=True) + + (translations / "en.json").write_text( + json.dumps( + { + "settings.log_file.browse_btn": "Browse...", + } + ), + encoding="utf-8", + ) + (translations / "de.json").write_text( + json.dumps( + { + "settings.log_file.browse_btn": "Durchsuchen...", + } + ), + encoding="utf-8", + ) + + i18n._translator = i18n.Translator() # type: ignore[attr-defined] + i18n.initialize("de", translations) + + assert i18n.tr("settings.logging.browse_btn") == "Durchsuchen..."