| import json | |
| import tempfile | |
| import unittest | |
| from pathlib import Path | |
| from ui import app as ui_app | |
| class UiLanguageTests(unittest.TestCase): | |
| def test_default_language_is_chinese_when_config_has_no_language(self): | |
| self.assertEqual(ui_app.get_configured_language({}), "zh_CN") | |
| def test_configured_language_accepts_english(self): | |
| self.assertEqual(ui_app.get_configured_language({"language": "en_US"}), "en_US") | |
| def test_configured_language_rejects_unsupported_locale(self): | |
| with self.assertRaises(ValueError): | |
| ui_app.get_configured_language({"language": "ja_JP"}) | |
| def test_language_choice_maps_display_labels_to_locale_codes(self): | |
| self.assertEqual(ui_app.resolve_language_choice("中文"), "zh_CN") | |
| self.assertEqual(ui_app.resolve_language_choice("English"), "en_US") | |
| self.assertEqual(ui_app.resolve_language_choice("en_US"), "en_US") | |
| def test_save_language_setting_persists_locale_code(self): | |
| with tempfile.TemporaryDirectory() as tmp_dir: | |
| config_path = Path(tmp_dir) / "config.json" | |
| config_path.write_text(json.dumps({"device": "cpu"}), encoding="utf-8") | |
| status = ui_app.save_language_setting("English", config_path=config_path) | |
| saved = json.loads(config_path.read_text(encoding="utf-8")) | |
| self.assertEqual(saved["language"], "en_US") | |
| self.assertIn("English", status) | |
| self.assertIn("restart", status.lower()) | |
| def test_language_packs_include_selector_keys(self): | |
| for lang in ("zh_CN", "en_US"): | |
| data = ui_app.load_i18n(lang) | |
| self.assertIn("settings", data) | |
| self.assertIn("language", data["settings"]) | |
| self.assertIn("save_language", data["settings"]) | |
| self.assertIn("language_saved_restart", data["settings"]) | |
| def test_language_packs_include_primary_ui_keys(self): | |
| required_ui_keys = { | |
| "cover_usage", | |
| "series_filter", | |
| "keyword_search", | |
| "keyword_placeholder", | |
| "character_choice_info", | |
| "download_character_info", | |
| "refresh_models", | |
| "download_selected_character", | |
| "download_series_all", | |
| "download_all_characters", | |
| "download_status", | |
| "model_name", | |
| "model_path", | |
| "index_path", | |
| "no_models", | |
| "positive_pitch_info", | |
| "normal_volume_info", | |
| "reverb_info", | |
| } | |
| required_settings_keys = { | |
| "runtime_settings", | |
| "compute_device", | |
| "save_settings", | |
| "settings_saved_restart", | |
| "status", | |
| "cpu_slow", | |
| "about_body", | |
| "model_sources", | |
| } | |
| for lang in ("zh_CN", "en_US"): | |
| data = ui_app.load_i18n(lang) | |
| self.assertTrue(required_ui_keys.issubset(data.get("ui", {}))) | |
| self.assertTrue(required_settings_keys.issubset(data.get("settings", {}))) | |
| def test_ui_exposes_language_selector_and_save_handler(self): | |
| source = Path("ui/app.py").read_text(encoding="utf-8") | |
| self.assertIn('label=t("language", "settings")', source) | |
| self.assertIn("choices=list(LANGUAGE_LABEL_TO_CODE.keys())", source) | |
| self.assertIn("fn=save_language_setting", source) | |
| self.assertIn('t("cover_usage", "ui")', source) | |
| self.assertIn('t("runtime_settings", "settings")', source) | |
| if __name__ == "__main__": | |
| unittest.main() | |