From 2cc456f6b39956c519390940b23b7654e6600464 Mon Sep 17 00:00:00 2001 From: bridge Date: Fri, 6 Feb 2026 00:43:08 +0800 Subject: [PATCH] refactor: i18n archi --- docs/I18N_MAINTENANCE_GUIDE.md | 48 +- docs/i18n-action-usage.md | 21 +- docs/i18n-avatar-usage.md | 2 +- docs/i18n-effect-usage.md | 2 +- docs/i18n-gathering-usage.md | 4 +- docs/specs/i18n-dynamic-text.md | 134 ++--- docs/specs/i18n-game-configs.md | 10 +- src/classes/ai.py | 4 +- src/classes/event.py | 6 +- src/classes/sect.py | 7 +- src/i18n/__init__.py | 13 +- .../locales/en_US/LC_MESSAGES/messages.mo | Bin 62726 -> 0 bytes src/i18n/locales/en_US/modules/sect.po | 48 -- .../locales/zh_CN/LC_MESSAGES/messages.mo | Bin 58454 -> 0 bytes .../locales/zh_TW/LC_MESSAGES/messages.mo | Bin 60261 -> 0 bytes static/game_configs/sect.csv | 28 +- .../en-US}/LC_MESSAGES/game_configs.mo | Bin .../en-US}/LC_MESSAGES/game_configs.po | 0 static/locales/en-US/LC_MESSAGES/messages.mo | Bin 0 -> 66282 bytes .../locales/en-US}/LC_MESSAGES/messages.po | 178 +++++++ .../locales/en-US}/modules/action.po | 0 .../locales/en-US}/modules/alignment.po | 0 .../locales/en-US}/modules/auxiliary.po | 0 .../locales/en-US}/modules/avatar.po | 0 .../locales/en-US}/modules/battle.po | 0 .../en-US}/modules/condition_translation.po | 0 .../locales/en-US}/modules/cultivation.po | 0 .../locales/en-US}/modules/death_reasons.po | 0 .../en-US}/modules/decision_description.po | 0 .../locales/en-US}/modules/default_values.po | 0 .../locales/en-US}/modules/direction_names.po | 0 .../locales/en-US}/modules/effect.po | 0 .../locales/en-US}/modules/elixir.po | 0 .../locales/en-US}/modules/essence_type.po | 0 .../locales/en-US}/modules/event_content.po | 0 .../en-US}/modules/execution_results.po | 0 .../locales/en-US}/modules/feedback_labels.po | 0 .../en-US}/modules/formatted_strings.po | 0 .../locales/en-US}/modules/fortune.po | 0 .../locales/en-US}/modules/gathering.po | 0 .../locales/en-US}/modules/gender.po | 0 .../locales/en-US}/modules/hidden_domain.po | 0 .../locales/en-US}/modules/item_exchange.po | 0 .../locales/en-US}/modules/item_verbs.po | 0 .../locales/en-US}/modules/labels.po | 0 .../locales/en-US}/modules/llm_prompt.po | 0 .../locales/en-US}/modules/map.po | 0 .../locales/en-US}/modules/misfortune.po | 0 .../locales/en-US}/modules/mutual_action.po | 0 .../locales/en-US}/modules/option_a.po | 0 .../locales/en-US}/modules/option_b.po | 0 .../locales/en-US}/modules/realm.po | 0 .../locales/en-US}/modules/relation.po | 0 .../locales/en-US}/modules/root_element.po | 0 .../locales/en-US}/modules/scene_setting.po | 0 static/locales/en-US/modules/sect.po | 199 +++++++ .../locales/en-US}/modules/separators.po | 0 .../locales/en-US}/modules/simulator.po | 0 .../locales/en-US}/modules/single_choice.po | 0 .../locales/en-US}/modules/stage.po | 0 .../en-US}/modules/story_generation_text.po | 0 .../locales/en-US}/modules/story_styles.po | 0 .../locales/en-US}/modules/technique.po | 0 .../locales/en-US}/modules/ui.po | 0 .../locales/en-US}/modules/weapon.po | 0 .../locales/templates/game_configs.pot | 0 .../zh-CN}/LC_MESSAGES/game_configs.mo | Bin .../zh-CN}/LC_MESSAGES/game_configs.po | 0 static/locales/zh-CN/LC_MESSAGES/messages.mo | Bin 0 -> 62025 bytes .../locales/zh-CN}/LC_MESSAGES/messages.po | 150 ++++++ .../locales/zh-CN}/modules/action.po | 0 .../locales/zh-CN}/modules/alignment.po | 0 .../locales/zh-CN}/modules/auxiliary.po | 0 .../locales/zh-CN}/modules/avatar.po | 0 .../locales/zh-CN}/modules/battle.po | 0 .../locales/zh-CN}/modules/cultivation.po | 0 .../locales/zh-CN}/modules/death_reasons.po | 0 .../locales/zh-CN}/modules/direction_names.po | 0 .../locales/zh-CN}/modules/effect.po | 0 .../locales/zh-CN}/modules/elixir.po | 0 .../locales/zh-CN}/modules/essence_type.po | 0 .../locales/zh-CN}/modules/feedback_labels.po | 0 .../locales/zh-CN}/modules/fortune.po | 0 .../locales/zh-CN}/modules/gathering.po | 0 .../locales/zh-CN}/modules/gender.po | 0 .../locales/zh-CN}/modules/hidden_domain.po | 0 .../locales/zh-CN}/modules/item_exchange.po | 0 .../locales/zh-CN}/modules/labels.po | 0 .../locales/zh-CN}/modules/llm_prompt.po | 0 .../locales/zh-CN}/modules/map.po | 0 .../locales/zh-CN}/modules/misc.po | 0 .../locales/zh-CN}/modules/misfortune.po | 0 .../locales/zh-CN}/modules/mutual_action.po | 0 .../locales/zh-CN}/modules/realm.po | 0 .../locales/zh-CN}/modules/relation.po | 0 .../locales/zh-CN}/modules/root_element.po | 0 .../locales/zh-CN}/modules/sect.po | 151 ++++++ .../locales/zh-CN}/modules/simulator.po | 0 .../locales/zh-CN}/modules/single_choice.po | 0 .../locales/zh-CN}/modules/stage.po | 0 .../locales/zh-CN}/modules/story_styles.po | 0 .../locales/zh-CN}/modules/technique.po | 0 .../locales/zh-CN}/modules/ui.po | 0 .../locales/zh-CN}/modules/weapon.po | 0 .../zh-TW}/LC_MESSAGES/game_configs.mo | Bin .../zh-TW}/LC_MESSAGES/game_configs.po | 0 static/locales/zh-TW/LC_MESSAGES/messages.mo | Bin 0 -> 63832 bytes .../locales/zh-TW}/LC_MESSAGES/messages.po | 150 ++++++ .../locales/zh-TW}/modules/action.po | 0 .../locales/zh-TW}/modules/alignment.po | 0 .../locales/zh-TW}/modules/auxiliary.po | 0 .../locales/zh-TW}/modules/avatar.po | 0 .../locales/zh-TW}/modules/battle.po | 0 .../locales/zh-TW}/modules/cultivation.po | 0 .../locales/zh-TW}/modules/death_reasons.po | 0 .../locales/zh-TW}/modules/direction_names.po | 0 .../locales/zh-TW}/modules/effect.po | 0 .../locales/zh-TW}/modules/elixir.po | 0 .../locales/zh-TW}/modules/essence_type.po | 0 .../locales/zh-TW}/modules/feedback_labels.po | 0 .../locales/zh-TW}/modules/fortune.po | 0 .../locales/zh-TW}/modules/gathering.po | 0 .../locales/zh-TW}/modules/gender.po | 0 .../locales/zh-TW}/modules/hidden_domain.po | 0 .../locales/zh-TW}/modules/item_exchange.po | 0 .../locales/zh-TW}/modules/labels.po | 0 .../locales/zh-TW}/modules/llm_prompt.po | 0 .../locales/zh-TW}/modules/map.po | 0 .../locales/zh-TW}/modules/misc.po | 0 .../locales/zh-TW}/modules/misfortune.po | 0 .../locales/zh-TW}/modules/mutual_action.po | 0 .../locales/zh-TW}/modules/realm.po | 0 .../locales/zh-TW}/modules/relation.po | 0 .../locales/zh-TW}/modules/root_element.po | 0 .../locales/zh-TW}/modules/sect.po | 151 ++++++ .../locales/zh-TW}/modules/simulator.po | 0 .../locales/zh-TW}/modules/single_choice.po | 0 .../locales/zh-TW}/modules/stage.po | 0 .../locales/zh-TW}/modules/story_styles.po | 0 .../locales/zh-TW}/modules/technique.po | 0 .../locales/zh-TW}/modules/ui.po | 0 .../locales/zh-TW}/modules/weapon.po | 0 tests/README_NEW_I18N_TESTS.md | 337 ------------ tests/README_i18n_duplicates.md | 126 ----- tests/README_i18n_tests.md | 491 +++--------------- tests/test_i18n_classes_coverage.py | 346 ------------ tests/test_i18n_duplicates.py | 4 +- tests/test_i18n_fixes.py | 2 +- tests/test_i18n_lint.py | 4 +- tests/test_i18n_modules.py | 6 +- tests/test_i18n_po_quality.py | 6 +- tests/test_i18n_zh_tw.py | 6 +- tools/i18n/build_mo.py | 2 +- tools/i18n/check_po_duplicates.py | 4 +- tools/i18n/split_po.py | 2 +- tools/package/pack.ps1 | 2 - 156 files changed, 1197 insertions(+), 1447 deletions(-) delete mode 100644 src/i18n/locales/en_US/LC_MESSAGES/messages.mo delete mode 100644 src/i18n/locales/en_US/modules/sect.po delete mode 100644 src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo delete mode 100644 src/i18n/locales/zh_TW/LC_MESSAGES/messages.mo rename {src/i18n/locales/en_US => static/locales/en-US}/LC_MESSAGES/game_configs.mo (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/LC_MESSAGES/game_configs.po (100%) create mode 100644 static/locales/en-US/LC_MESSAGES/messages.mo rename {src/i18n/locales/en_US => static/locales/en-US}/LC_MESSAGES/messages.po (94%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/action.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/alignment.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/auxiliary.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/avatar.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/battle.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/condition_translation.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/cultivation.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/death_reasons.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/decision_description.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/default_values.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/direction_names.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/effect.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/elixir.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/essence_type.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/event_content.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/execution_results.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/feedback_labels.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/formatted_strings.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/fortune.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/gathering.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/gender.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/hidden_domain.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/item_exchange.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/item_verbs.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/labels.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/llm_prompt.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/map.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/misfortune.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/mutual_action.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/option_a.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/option_b.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/realm.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/relation.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/root_element.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/scene_setting.po (100%) create mode 100644 static/locales/en-US/modules/sect.po rename {src/i18n/locales/en_US => static/locales/en-US}/modules/separators.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/simulator.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/single_choice.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/stage.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/story_generation_text.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/story_styles.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/technique.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/ui.po (100%) rename {src/i18n/locales/en_US => static/locales/en-US}/modules/weapon.po (100%) rename {src/i18n => static}/locales/templates/game_configs.pot (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/LC_MESSAGES/game_configs.mo (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/LC_MESSAGES/game_configs.po (100%) create mode 100644 static/locales/zh-CN/LC_MESSAGES/messages.mo rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/LC_MESSAGES/messages.po (94%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/action.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/alignment.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/auxiliary.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/avatar.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/battle.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/cultivation.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/death_reasons.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/direction_names.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/effect.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/elixir.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/essence_type.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/feedback_labels.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/fortune.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/gathering.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/gender.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/hidden_domain.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/item_exchange.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/labels.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/llm_prompt.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/map.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/misc.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/misfortune.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/mutual_action.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/realm.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/relation.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/root_element.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/sect.po (66%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/simulator.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/single_choice.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/stage.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/story_styles.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/technique.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/ui.po (100%) rename {src/i18n/locales/zh_CN => static/locales/zh-CN}/modules/weapon.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/LC_MESSAGES/game_configs.mo (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/LC_MESSAGES/game_configs.po (100%) create mode 100644 static/locales/zh-TW/LC_MESSAGES/messages.mo rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/LC_MESSAGES/messages.po (94%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/action.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/alignment.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/auxiliary.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/avatar.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/battle.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/cultivation.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/death_reasons.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/direction_names.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/effect.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/elixir.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/essence_type.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/feedback_labels.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/fortune.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/gathering.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/gender.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/hidden_domain.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/item_exchange.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/labels.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/llm_prompt.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/map.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/misc.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/misfortune.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/mutual_action.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/realm.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/relation.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/root_element.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/sect.po (66%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/simulator.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/single_choice.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/stage.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/story_styles.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/technique.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/ui.po (100%) rename {src/i18n/locales/zh_TW => static/locales/zh-TW}/modules/weapon.po (100%) delete mode 100644 tests/README_NEW_I18N_TESTS.md delete mode 100644 tests/README_i18n_duplicates.md delete mode 100644 tests/test_i18n_classes_coverage.py diff --git a/docs/I18N_MAINTENANCE_GUIDE.md b/docs/I18N_MAINTENANCE_GUIDE.md index d3b6c0e..a94074c 100644 --- a/docs/I18N_MAINTENANCE_GUIDE.md +++ b/docs/I18N_MAINTENANCE_GUIDE.md @@ -14,33 +14,45 @@ --- -## 2. 正确的增补方式 +## 2. 正确的增补方式 (Source Split, Build Merge) -### 方法 A:直接使用 IDE 编辑 (推荐) -最安全、最简单的方法。直接在 Cursor / VSCode 中打开 `src/i18n/locales/xx_XX/LC_MESSAGES/messages.po`,在文件末尾手动粘贴或输入新的翻译条目。 +项目现已采用 **"Source Split, Build Merge"** 策略,将庞大的 `messages.po` 拆分为多个模块文件。 -### 方法 B:使用 Python 脚本追加 -如果必须通过脚本自动化,请务必使用 Python 并显式指定 UTF-8 编码。 +**请勿直接修改 `LC_MESSAGES/messages.po`!该文件现由构建脚本自动生成。** -```python -# correct_append.py -content = """ -msgid "new_key" -msgstr "Translation" -""" +### 方法 A:修改模块文件 (推荐) -with open("path/to/messages.po", "a", encoding="utf-8") as f: - f.write(content) -``` +所有源文件位于 `static/locales/{lang}/modules/` 目录下。请根据内容分类修改对应的 `.po` 文件: -### 方法 C:Linux/Bash 环境 -在 Git Bash 或 WSL 中使用 `cat >>` 是安全的,因为它们默认处理 UTF-8 流。 +* `static/locales/zh-CN/modules/battle.po` - 战斗相关 +* `static/locales/zh-CN/modules/action.po` - 动作相关 +* `static/locales/zh-CN/modules/fortune.po` - 奇遇相关 +* `static/locales/zh-CN/modules/ui.po` - 界面相关 +* ... (以及其他分类) + +直接使用编辑器打开相应的模块文件进行修改或追加。 + +### 方法 B:构建与合并 + +修改完成后,必须运行构建脚本将模块合并并编译为 MO 文件: ```bash -# Git Bash / WSL only -cat temp.po >> messages.po +# 在项目根目录下运行 +python tools/i18n/build_mo.py ``` +该脚本会: +1. 合并 `modules/*.po` 到 `LC_MESSAGES/messages.po` +2. 编译生成 `LC_MESSAGES/messages.mo` +3. 编译其他独立文件 (如 `game_configs.po`) + +### 方法 C:添加新模块 + +如果需要添加新的分类: +1. 在 `static/locales/{lang}/modules/` 下新建 `{category}.po`。 +2. 确保包含标准 Header (参考其他模块)。 +3. 运行 `build_mo.py` 即可自动识别并合并。 + --- ## 3. 文件格式规范 diff --git a/docs/i18n-action-usage.md b/docs/i18n-action-usage.md index b0168a5..eb286fc 100644 --- a/docs/i18n-action-usage.md +++ b/docs/i18n-action-usage.md @@ -125,9 +125,11 @@ def start(self, target_name: str) -> Event: ## 添加翻译 -### 1. 在 po 文件中添加条目 +### 1. 在模块化 po 文件中添加条目 -**英文** (`src/i18n/locales/en_US/LC_MESSAGES/messages.po`): +请在 `static/locales/{lang}/modules/action.po` 文件中添加翻译,而不是直接修改 `messages.po`。 + +**英文** (`static/locales/en-US/modules/action.po`): ```po # Action: MyAction msgid "my_action_name" @@ -140,7 +142,7 @@ msgid "{avatar} starts attacking {target}!" msgstr "{avatar} starts attacking {target}!" ``` -**中文** (`src/i18n/locales/zh_CN/LC_MESSAGES/messages.po`): +**中文** (`static/locales/zh-CN/modules/action.po`): ```po # Action: MyAction msgid "my_action_name" @@ -153,18 +155,15 @@ msgid "{avatar} starts attacking {target}!" msgstr "{avatar} 开始攻击 {target}!" ``` -### 2. 编译 po 文件 +### 2. 编译并合并 + +运行项目根目录下的构建脚本,它会将模块文件合并并编译: ```bash -# Windows (需要安装 gettext) -msgfmt src/i18n/locales/zh_CN/LC_MESSAGES/messages.po -o src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo -msgfmt src/i18n/locales/en_US/LC_MESSAGES/messages.po -o src/i18n/locales/en_US/LC_MESSAGES/messages.mo - -# macOS/Linux -msgfmt src/i18n/locales/zh_CN/LC_MESSAGES/messages.po -o src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo -msgfmt src/i18n/locales/en_US/LC_MESSAGES/messages.po -o src/i18n/locales/en_US/LC_MESSAGES/messages.mo +python tools/i18n/build_mo.py ``` + ## 迁移现有 Action 对于现有的 Action(如 `Assassinate`),按以下步骤迁移: diff --git a/docs/i18n-avatar-usage.md b/docs/i18n-avatar-usage.md index 3059bc1..3d9e8fb 100644 --- a/docs/i18n-avatar-usage.md +++ b/docs/i18n-avatar-usage.md @@ -392,7 +392,7 @@ print(info[t("Name")]) # 输出键名为英文的字典 1. **新增字段时同步添加翻译**: - 在 `info_presenter.py` 添加新字段时 - 使用 `t("New Field Label")` 作为键名 - - 在 PO 文件添加对应翻译 + - 在 `static/locales/{lang}/modules/avatar.po` (或 `ui.po`) 添加对应翻译 2. **保持命名规范**: - 字段名使用英文,首字母大写(如 `"Spirit Root"`) diff --git a/docs/i18n-effect-usage.md b/docs/i18n-effect-usage.md index 3c0385d..2eba6ea 100644 --- a/docs/i18n-effect-usage.md +++ b/docs/i18n-effect-usage.md @@ -256,7 +256,7 @@ print(get_effect_desc("extra_max_hp")) # 输出:Max HP 1. **新增 Effect 时同步添加翻译**: - 在 `consts.py` 定义新 effect - 在 `desc.py` 的 `get_effect_desc()` 添加 msgid 映射 - - 在 PO 文件添加中英文翻译 + - 在 `static/locales/{lang}/modules/effect.po` 添加中英文翻译 2. **保持命名规范**: - Effect msgid: `effect_{effect_key}` diff --git a/docs/i18n-gathering-usage.md b/docs/i18n-gathering-usage.md index 69adc06..e35d491 100644 --- a/docs/i18n-gathering-usage.md +++ b/docs/i18n-gathering-usage.md @@ -330,7 +330,7 @@ print(Auction.get_story_prompt()) # 输出英文提示词 1. **新增 Gathering 类型时同步添加翻译**: - 如果添加新的 Gathering 实现(如"宗门大比"、"秘境开启") - 遵循相同的模式:类变量 + classmethod - - 在 PO 文件添加对应翻译 + - 在 `static/locales/{lang}/modules/gathering.po` 添加对应翻译 2. **保持命名规范**: - LLM Prompt msgid 格式:`{gathering_type}_story_prompt` @@ -398,7 +398,7 @@ class SectCompetition(Gathering): # ... 其他方法使用 t() 翻译所有文本 ``` -然后在 PO 文件添加对应翻译即可。 +然后在 `static/locales/{lang}/modules/gathering.po` 添加对应翻译即可。 --- diff --git a/docs/specs/i18n-dynamic-text.md b/docs/specs/i18n-dynamic-text.md index 143955f..220f521 100644 --- a/docs/specs/i18n-dynamic-text.md +++ b/docs/specs/i18n-dynamic-text.md @@ -49,15 +49,24 @@ Use Python's standard `gettext` module with `.po/.mo` translation files. ``` src/i18n/ ├── __init__.py # Export t() function -└── locales/ - ├── zh_CN/ - │ └── LC_MESSAGES/ - │ ├── messages.po # Chinese translations (source) - │ └── messages.mo # Compiled binary (runtime) - └── en_US/ - └── LC_MESSAGES/ - ├── messages.po # English translations (source) - └── messages.mo # Compiled binary (runtime) +└── ... (locales moved to static/locales) + +static/locales/ + ├── zh-CN/ + │ ├── LC_MESSAGES/ + │ │ ├── messages.po # Merged Chinese translations (do not edit directly) + │ │ └── messages.mo # Compiled binary (runtime) + │ └── modules/ # Source translation modules + │ ├── battle.po + │ ├── fortune.po + │ └── ... + └── en-US/ + ├── LC_MESSAGES/ + │ ├── messages.po # Merged English translations + │ └── messages.mo # Compiled binary + └── modules/ + ├── battle.po + └── ... ``` #### 1.2 Create `src/i18n/__init__.py` @@ -77,14 +86,15 @@ def _get_translation() -> Optional[gettext.GNUTranslations]: lang = str(language_manager) if lang not in _translations: - locale_dir = Path(__file__).parent / "locales" + # Point to static/locales + locale_dir = Path(__file__).resolve().parent.parent.parent / "static" / "locales" - # Map language codes to gettext locale names + # Map language codes to gettext locale names (now same as folder names) locale_map = { - "zh-CN": "zh_CN", - "en-US": "en_US", + "zh-CN": "zh-CN", + "en-US": "en-US", } - locale_name = locale_map.get(lang, "zh_CN") + locale_name = locale_map.get(lang, "zh-CN") try: trans = gettext.translation( @@ -190,7 +200,7 @@ From `death_reason.py`: --- -### Phase 3: Create .po Files +### Phase 3: Create Modular .po Files #### 3.1 Message Key Convention @@ -201,99 +211,49 @@ msgid "{winner} defeated {loser}, dealing {damage} damage. {loser} was fatally w msgstr "" ``` -#### 3.2 Chinese Translation File +#### 3.2 Chinese Translation Modules +Create separate files in `static/locales/zh-CN/modules/`: + +**`battle.po`**: ```po -# src/i18n/locales/zh_CN/LC_MESSAGES/messages.po - -# Header +# static/locales/zh-CN/modules/battle.po msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" -"Language: zh_CN\n" -# Battle messages msgid "{winner} defeated {loser}, dealing {damage} damage. {loser} was fatally wounded and perished." msgstr "{winner} 战胜了 {loser},造成 {damage} 点伤害。{loser} 遭受重创,当场陨落。" msgid "{winner} defeated {loser}. {loser} took {loser_dmg} damage, {winner} also took {winner_dmg} damage." msgstr "{winner} 战胜了 {loser},{loser} 受伤 {loser_dmg} 点,{winner} 也受伤 {winner_dmg} 点。" - -# Fortune messages -msgid "Encountered fortune ({theme}), {result}" -msgstr "遭遇奇遇({theme}),{result}" - -msgid "Found weapon '{weapon}', {exchange_result}" -msgstr "发现了兵器『{weapon}』,{exchange_result}" - -msgid "{name} obtained {amount} spirit stones" -msgstr "{name} 获得灵石 {amount} 枚" - -msgid "{name} cultivation increased by {exp} points" -msgstr "{name} 修为增长 {exp} 点" - -msgid "{apprentice} became disciple of {master}" -msgstr "{apprentice} 拜 {master} 为师" - -# Misfortune messages -msgid "Encountered misfortune ({theme}), {result}" -msgstr "遭遇霉运({theme}),{result}" - -msgid "{name} lost {amount} spirit stones" -msgstr "{name} 损失灵石 {amount} 枚" - -msgid "{name} took {damage} damage, HP remaining {current}/{max}" -msgstr "{name} 受到伤害 {damage} 点,剩余HP {current}/{max}" - -msgid "{name} cultivation regressed by {amount} points" -msgstr "{name} 修为倒退 {amount} 点" - -# Death reasons -msgid "Killed by {killer}" -msgstr "被{killer}杀害" - -msgid "Died from severe injuries" -msgstr "重伤不治身亡" - -msgid "Died of old age" -msgstr "寿元耗尽而亡" ``` -#### 3.3 English Translation File - +**`fortune.po`**: ```po -# src/i18n/locales/en_US/LC_MESSAGES/messages.po - -# Header +# static/locales/zh-CN/modules/fortune.po msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" -"Language: en_US\n" -# Battle messages -msgid "{winner} defeated {loser}, dealing {damage} damage. {loser} was fatally wounded and perished." -msgstr "{winner} defeated {loser}, dealing {damage} damage. {loser} was fatally wounded and perished." - -# ... (msgid == msgstr for English) +msgid "Encountered fortune ({theme}), {result}" +msgstr "遭遇奇遇({theme}),{result}" +# ... other fortune messages ``` +#### 3.3 English Translation Modules + +Create similar files in `static/locales/en-US/modules/`. + #### 3.4 Compile .po to .mo +Use the build script to merge modules and compile: + ```bash -# Install gettext tools if needed (macOS) -brew install gettext - -# Compile -msgfmt src/i18n/locales/zh_CN/LC_MESSAGES/messages.po -o src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo -msgfmt src/i18n/locales/en_US/LC_MESSAGES/messages.po -o src/i18n/locales/en_US/LC_MESSAGES/messages.mo +# Merges modules/*.po -> LC_MESSAGES/messages.po -> messages.mo +python tools/i18n/build_mo.py ``` -Add to Makefile or script: -```makefile -compile-i18n: - msgfmt src/i18n/locales/zh_CN/LC_MESSAGES/messages.po -o src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo - msgfmt src/i18n/locales/en_US/LC_MESSAGES/messages.po -o src/i18n/locales/en_US/LC_MESSAGES/messages.mo -``` --- @@ -428,10 +388,10 @@ def load_save(path: str): | File | Description | |------|-------------| | `src/i18n/__init__.py` | Translation module with `t()` function | -| `src/i18n/locales/zh_CN/LC_MESSAGES/messages.po` | Chinese translations | -| `src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo` | Compiled Chinese | -| `src/i18n/locales/en_US/LC_MESSAGES/messages.po` | English translations | -| `src/i18n/locales/en_US/LC_MESSAGES/messages.mo` | Compiled English | +| `static/locales/zh-CN/LC_MESSAGES/messages.po` | Generated Chinese translations (Merged) | +| `static/locales/zh-CN/LC_MESSAGES/messages.mo` | Compiled Chinese | +| `static/locales/en-US/LC_MESSAGES/messages.po` | Generated English translations (Merged) | +| `static/locales/en-US/LC_MESSAGES/messages.mo` | Compiled English | | `tests/test_i18n.py` | Unit tests | ### Modified Files diff --git a/docs/specs/i18n-game-configs.md b/docs/specs/i18n-game-configs.md index 7a3ba4b..d5c07bd 100644 --- a/docs/specs/i18n-game-configs.md +++ b/docs/specs/i18n-game-configs.md @@ -26,14 +26,14 @@ id,name_id,name,desc_id,desc,danger_prob hidden_domain_wood,HIDDEN_DOMAIN_WOOD_NAME,万木残界,HIDDEN_DOMAIN_WOOD_DESC,此乃...,0.3 ``` -### 2. Translation Files (`src/i18n/locales/`) +### 2. Translation Files (`static/locales/`) - **`game_configs.po`**: Contains translations for config IDs. - Generated/Updated via tool scanning CSVs. - **`messages.po`**: Contains translations for dynamic code strings (existing). ### 3. Build Process -- `tools/i18n/build_mo.py` merges `messages.po` and `game_configs.po` into a single `messages.mo` for runtime efficiency. -- Or loads them as separate domains (Current decision: Merge for simplicity). +- `tools/i18n/build_mo.py` compiles `game_configs.po` into `game_configs.mo`. +- Runtime uses separate domains: `messages` (default) and `game_configs` (fallback). ### 4. Runtime Loading (`src/utils/df.py`) 1. Load CSV from `static/game_configs/`. @@ -50,8 +50,8 @@ hidden_domain_wood,HIDDEN_DOMAIN_WOOD_NAME,万木残界,HIDDEN_DOMAIN_WOOD_DESC, 3. Fill `name`/`desc` with Chinese text (Reference). 4. Fill `name_id`/`desc_id` (Convention: `{FILE}_{ID}_NAME`). 5. Run extraction tool (to be created) to update `game_configs.pot` and `.po` files. -6. Add English translation in `src/i18n/locales/en_US/LC_MESSAGES/game_configs.po`. -7. (Optional) Run `build_mo.py` to test locally (Auto-run in build pipeline). +6. Add English translation in `static/locales/en-US/LC_MESSAGES/game_configs.po`. +7. Run `python tools/i18n/build_mo.py` to compile translation files. ## Tools diff --git a/src/classes/ai.py b/src/classes/ai.py index fa8ba3b..d68086c 100644 --- a/src/classes/ai.py +++ b/src/classes/ai.py @@ -11,7 +11,7 @@ from src.classes.world import World from src.classes.event import Event, NULL_EVENT from src.utils.llm import call_llm_with_task_name from src.classes.typings import ACTION_NAME_PARAMS_PAIRS -from src.classes.actions import ACTION_INFOS_STR +from src.classes.actions import get_action_infos_str from src.utils.config import CONFIG if TYPE_CHECKING: @@ -51,7 +51,7 @@ class LLMAI(AI): """ 异步决策逻辑:通过LLM决定执行什么动作和参数 """ - general_action_infos = ACTION_INFOS_STR + general_action_infos = get_action_infos_str() async def decide_one(avatar: Avatar): # 获取基于该角色已知区域的世界信息(包含距离计算) diff --git a/src/classes/event.py b/src/classes/event.py index 8a6deab..dee81c9 100644 --- a/src/classes/event.py +++ b/src/classes/event.py @@ -7,7 +7,7 @@ import uuid import time from datetime import datetime -from src.classes.calendar import Month, Year, MonthStamp +from src.classes.calendar import Month, Year, MonthStamp, get_date_str @dataclass class Event: @@ -25,9 +25,7 @@ class Event: created_at: float = field(default_factory=time.time) def __str__(self) -> str: - year = self.month_stamp.get_year() - month = self.month_stamp.get_month() - return f"{year}年{month}月: {self.content}" + return f"{get_date_str(int(self.month_stamp))}: {self.content}" def to_dict(self) -> dict: """转换为可序列化的字典""" diff --git a/src/classes/sect.py b/src/classes/sect.py index 2f22e3f..3a41f9f 100644 --- a/src/classes/sect.py +++ b/src/classes/sect.py @@ -85,7 +85,7 @@ class Sect: effect_part = t(" Effect: {effect_desc}", effect_desc=self.effect_desc) if self.effect_desc else "" return t("{sect_name} (Alignment: {alignment}, Style: {style}, Headquarters: {hq_name}){effect}", sect_name=self.name, alignment=str(self.alignment), - style=self.member_act_style, hq_name=hq.name, effect=effect_part) + style=t(self.member_act_style), hq_name=hq.name, effect=effect_part) def get_rank_name(self, rank: "SectRank") -> str: """ @@ -100,7 +100,8 @@ class Sect: from src.classes.sect_ranks import SectRank, DEFAULT_RANK_NAMES from src.i18n import t # 优先使用自定义名称,否则使用默认名称 - return self.rank_names.get(rank.value, DEFAULT_RANK_NAMES.get(rank, t("Disciple"))) + val = self.rank_names.get(rank.value, DEFAULT_RANK_NAMES.get(rank, t("Disciple"))) + return t(val) def get_structured_info(self) -> dict: hq = self.headquarter @@ -327,7 +328,7 @@ def get_sect_info_with_rank(avatar: "Avatar", detailed: bool = False) -> str: # 构造详细信息,使用标准空格和括号 detail_content = t("(Alignment: {alignment}, Style: {style}, Headquarters: {hq_name}){effect}", alignment=avatar.sect.alignment, - style=avatar.sect.member_act_style, + style=t(avatar.sect.member_act_style), hq_name=hq.name, effect=effect_part) diff --git a/src/i18n/__init__.py b/src/i18n/__init__.py index 718cb32..a59dcc9 100644 --- a/src/i18n/__init__.py +++ b/src/i18n/__init__.py @@ -20,25 +20,22 @@ logger = logging.getLogger(__name__) def _get_locale_dir() -> Path: """Get the locales directory path.""" - return Path(__file__).parent / "locales" + # src/i18n/__init__.py -> src/i18n -> src -> root + return Path(__file__).resolve().parent.parent.parent / "static" / "locales" def _lang_to_locale(lang_code: str) -> str: """ Convert language code to gettext locale name. + Now we use the same code as folder name (e.g. zh-CN). Args: lang_code: Language code like "zh-CN" or "en-US". Returns: - Locale name like "zh_CN" or "en_US". + Locale name like "zh-CN" or "en-US". """ - locale_map = { - "zh-CN": "zh_CN", - "zh-TW": "zh_TW", - "en-US": "en_US", - } - return locale_map.get(lang_code, "zh_CN") + return lang_code def _get_current_lang() -> str: diff --git a/src/i18n/locales/en_US/LC_MESSAGES/messages.mo b/src/i18n/locales/en_US/LC_MESSAGES/messages.mo deleted file mode 100644 index 1519ac0dfba6617208134b13ebe95770c6871e15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62726 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 diff --git a/src/i18n/locales/en_US/modules/sect.po b/src/i18n/locales/en_US/modules/sect.po deleted file mode 100644 index 927ebfd..0000000 --- a/src/i18n/locales/en_US/modules/sect.po +++ /dev/null @@ -1,48 +0,0 @@ -# -msgid "" -msgstr "" -"Project-Id-Version: cultivation-world-simulator 1.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-01-20 00:00+0000\n" -"PO-Revision-Date: 2024-01-20 00:00+0000\n" -"Last-Translator: \n" -"Language-Team: English\n" -"Language: en_US\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -# Sect Rank -msgid "patriarch" -msgstr "Patriarch" - -msgid "elder" -msgstr "Elder" - -msgid "inner_disciple" -msgstr "Inner Disciple" - -msgid "outer_disciple" -msgstr "Outer Disciple" - -# ============================================================================ -# Sect System - Sects -# ============================================================================ -msgid "{sect_name} (Alignment: {alignment}, Headquarters: {hq_name})" -msgstr "{sect_name} (Alignment: {alignment}, Headquarters: {hq_name})" - -msgid "" -"{sect_name} (Alignment: {alignment}, Style: {style}, Headquarters: " -"{hq_name}){effect}" -msgstr "" -"{sect_name} (Alignment: {alignment}, Style: {style}, Headquarters: " -"{hq_name}){effect}" - -# ============================================================================ -# Relation & Root & Appearance & Sect (Refined) -# ============================================================================ -msgid "Unknown reason" -msgstr "Unknown reason" - -msgid "{name} (Deceased: {reason})" -msgstr "{name} (Deceased: {reason})" diff --git a/src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo b/src/i18n/locales/zh_CN/LC_MESSAGES/messages.mo deleted file mode 100644 index b6c805f5b6ac085268e4764c9b323defb7cb821a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58454 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 Hbp-z(Srm>p diff --git a/src/i18n/locales/zh_TW/LC_MESSAGES/messages.mo b/src/i18n/locales/zh_TW/LC_MESSAGES/messages.mo deleted file mode 100644 index 10358d6095556cccc537f5f7fa2a834cba2c929e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60261 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 diff --git a/static/game_configs/sect.csv b/static/game_configs/sect.csv index 135ffbb..4aab5c9 100644 --- a/static/game_configs/sect.csv +++ b/static/game_configs/sect.csv @@ -1,16 +1,16 @@ id,name_id,desc_id,name,desc,member_act_style,alignment,weight,preferred_weapon,effects,rank_names ,名称ID,描述ID,,宗门名称与描述,宗门成员行事风格,阵营(正/中立/邪),权重(默认1),倾向兵器类型,effects(JSON形式,支持宽松格式,见effects.py说明),自定义职位(掌门;长老;内门;外门) -1,SECT_1_NAME,SECT_1_DESC,明心剑宗,通玄界东方第一宗,以无上剑道称雄于世。云纹阵法为不传心法。【剑道专精】作为剑修,你使用剑类兵器时战力惊人,且在剑道上的感悟速度远超常人。,清明克己,行止如一。重剑与心法并重,讲究明心见性。,RIGHTEOUS,1,SWORD,"{extra_battle_strength_points: 3, extra_weapon_proficiency_gain: 0.5}", -2,SECT_2_NAME,SECT_2_DESC,百兽宗,以驯养灵兽闻名,豢养各种妖兽灵怪为战力。【御兽大师】你拥有独特的御兽天赋,捕捉妖兽对你来说轻而易举,善于驱使兽群为你而战。,言语直接,重视力量与血性,崇尚狩猎与搏斗。,EVIL,1,WHIP,"{extra_catch_success_rate: 0.25, extra_hunt_materials: 1}",谷主;供奉;驭兽师;扈从 -3,SECT_3_NAME,SECT_3_DESC,水镜宗,"正道十宗之一,实则严守中立。拥有仙界异宝""彻天水镜""可预知未来。【趋吉避凶】你拥有超乎常人的直觉,视野开阔,且极易在探索中发现奇遇。",处事冷静圆融,喜以柔克刚,擅借力与反制。,NEUTRAL,1,FAN,"{extra_observation_radius: 2, extra_fortune_probability: 0.002, extra_refine_success_rate: 0.05}",镜主;掌镜人;传人;侍镜 -4,SECT_4_NAME,SECT_4_DESC,冥王宗,行走幽冥之道,术法阴冷狠厉。【通幽】你修行幽冥之法,心志坚定,突破瓶颈时心无杂念,成功率更高。,言辞冷厉少情,敬畏因果而不惧杀伐,偏向效率与结果。,EVIL,1,FAN,"{extra_breakthrough_success_rate: 0.1, extra_retreat_success_rate: 0.1}",殿主;判官;无常;鬼卒 -5,SECT_5_NAME,SECT_5_DESC,朱勾宗,邪宗大派。以炼器、机关、暗杀闻名于世,素来阴毒冷僻。【暗杀专家】你精通潜伏与刺杀,对于强敌,避开正面交锋、伺机暗杀往往是你最佳的制胜之道。,直面欲望与代价,不惧黑暗,以攻伐见长。,EVIL,1,HIDDEN_WEAPON,"{extra_assassinate_success_rate: 0.15, extra_battle_strength_points: 1, extra_cast_success_rate: 0.05}",楼主;掌刑使;影刺;探子 -6,SECT_6_NAME,SECT_6_DESC,合欢宗,以情入道,靠双修增进修为,善驭人心,长于权变。【双修秘术】你的体质特殊,通过双修能获得远超常人的修为提升,这是你提升境界的最佳捷径。,辞令婉转,善于拿捏人欲与局势,以柔制刚。,NEUTRAL,1,ZITHER,"{extra_dual_cultivation_exp: 150, shop_buy_price_reduction: 0.1}",宫主;护法;媚仙;侍童 -7,SECT_7_NAME,SECT_7_DESC,镇魂宗,铁血风格,擅安魂、封邪、渡厄,兼有刚烈镇压之术。【金刚不坏】你修习护体神功,拥有极强的肉身防御与伤害减免能力,如山岳般不可撼动。,肃穆沉稳,重安魂镇邪,少言而果决。,RIGHTEOUS,1,STAFF,"{extra_max_hp: 100, damage_reduction: 0.15}",住持;首座;行者;居士 -8,SECT_8_NAME,SECT_8_DESC,幽魂噬影宗,镇宗典籍《幽冥录》。幽明气为根基。【如影随形】你极擅身法与遁术,遇到危险时总能全身而退,亦能伺机刺杀落单之敌。,行事隐秘果断,重结果轻虚名,擅潜行与出其不意。,EVIL,1,SABER,"{extra_escape_success_rate: 0.4, extra_assassinate_success_rate: 0.15}",门主;护法;影卫;探子 -9,SECT_9_NAME,SECT_9_DESC,千帆城,炼器大宗,巧匠云集。著名法宝有灵灭丝、定魂蓝星等。商旅云集,自成体系。【巧夺天工】你深谙炼器与经商之道,温养兵器时常能使其脱胎换骨,且在交易中总能获利。,务实精明,重交易与信誉,崇尚规则与秩序。,NEUTRAL,1,SPEAR,"{extra_item_sell_price_multiplier: 0.05, extra_weapon_upgrade_chance: 0.15, extra_cast_success_rate: 0.05, shop_buy_price_reduction: 0.05}",城主;大供奉;执事;学徒 -10,SECT_10_NAME,SECT_10_DESC,妙化宗,精擅音律杀伐与精神操控,功法诡谲阴柔,以无形琴音乱人心智,杀人于无形。【魔音贯耳】你擅长以音律乱人心智,灵力深厚绵长,虽不擅肉搏,但手段诡谲。,文雅缥缈中深藏算计,喜用言语与音律掌控局势,杀伐不沾烟火气。,EVIL,1,ZITHER,"{extra_escape_success_rate: 0.5, extra_misfortune_probability: -0.005}", -11,SECT_11_NAME,SECT_11_DESC,回玄宗,当世第一阵法大派,以阵法阵诀独步天下,讲究阵法推演与巧思妙用。【阵法聚灵】你善用阵法辅助修炼,能够聚集天地灵气,修炼速度快于常人,且常有意外收获。,严谨细致,追求技术极致,战斗中擅长以后手阵法反制敌人,步步为营。,RIGHTEOUS,1,HIDDEN_WEAPON,"{cultivate_duration_reduction: 0.1, extra_fortune_probability: 0.005}", -12,SECT_12_NAME,SECT_12_DESC,不夜城,修习极光玄真法,以万里极光壁的绝对防御闻名于世。【生生不息】你的生命力极其顽强,疗伤效果倍增,寿元亦远超同阶修士。,坚韧顽强,在逆境中图强,行事光明磊落但也深谋远虑,极其护短。,RIGHTEOUS,1,FAN,"{extra_hp_recovery_rate: 0.5, extra_max_lifespan: 20}",城主;阁老;执令;守夜人 -13,SECT_13_NAME,SECT_13_DESC,天行健宗,专修浩然之气,行事正大光明,刚健果决,对邪魔外道有极强的克制力。【浩然正气】你养浩然之气,气脉悠长,面对境界低于自己的敌人时,能发挥出极强的压制力。,恪守原则,讲究道义,除魔卫道一马当先,宁折不弯。,RIGHTEOUS,1,SWORD,{realm_suppression_bonus: 0.15}, -14,SECT_14_NAME,SECT_14_DESC,噬魔宗,通玄界第一魔宗,行事霸道残忍,擅长搜精噬血与肉体魔功。【搜刮成性】你崇尚力量与掠夺,搜刮凡人虽有伤天和,但能为你带来惊人的财富与资源。,强者为尊,随心所欲,崇尚绝对的力量与杀戮,视众生为血食。,EVIL,1,SABER,"{extra_plunder_multiplier: 2.0, extra_battle_strength_points: 2}", +1,SECT_1_NAME,SECT_1_DESC,明心剑宗,通玄界东方第一宗,以无上剑道称雄于世。云纹阵法为不传心法。【剑道专精】作为剑修,你使用剑类兵器时战力惊人,且在剑道上的感悟速度远超常人。,SECT_1_STYLE,RIGHTEOUS,1,SWORD,"{extra_battle_strength_points: 3, extra_weapon_proficiency_gain: 0.5}", +2,SECT_2_NAME,SECT_2_DESC,百兽宗,以驯养灵兽闻名,豢养各种妖兽灵怪为战力。【御兽大师】你拥有独特的御兽天赋,捕捉妖兽对你来说轻而易举,善于驱使兽群为你而战。,SECT_2_STYLE,EVIL,1,WHIP,"{extra_catch_success_rate: 0.25, extra_hunt_materials: 1}",SECT_2_RANK_PATRIARCH;SECT_2_RANK_ELDER;SECT_2_RANK_INNER;SECT_2_RANK_OUTER +3,SECT_3_NAME,SECT_3_DESC,水镜宗,"正道十宗之一,实则严守中立。拥有仙界异宝""彻天水镜""可预知未来。【趋吉避凶】你拥有超乎常人的直觉,视野开阔,且极易在探索中发现奇遇。",SECT_3_STYLE,NEUTRAL,1,FAN,"{extra_observation_radius: 2, extra_fortune_probability: 0.002, extra_refine_success_rate: 0.05}",SECT_3_RANK_PATRIARCH;SECT_3_RANK_ELDER;SECT_3_RANK_INNER;SECT_3_RANK_OUTER +4,SECT_4_NAME,SECT_4_DESC,冥王宗,行走幽冥之道,术法阴冷狠厉。【通幽】你修行幽冥之法,心志坚定,突破瓶颈时心无杂念,成功率更高。,SECT_4_STYLE,EVIL,1,FAN,"{extra_breakthrough_success_rate: 0.1, extra_retreat_success_rate: 0.1}",SECT_4_RANK_PATRIARCH;SECT_4_RANK_ELDER;SECT_4_RANK_INNER;SECT_4_RANK_OUTER +5,SECT_5_NAME,SECT_5_DESC,朱勾宗,邪宗大派。以炼器、机关、暗杀闻名于世,素来阴毒冷僻。【暗杀专家】你精通潜伏与刺杀,对于强敌,避开正面交锋、伺机暗杀往往是你最佳的制胜之道。,SECT_5_STYLE,EVIL,1,HIDDEN_WEAPON,"{extra_assassinate_success_rate: 0.15, extra_battle_strength_points: 1, extra_cast_success_rate: 0.05}",SECT_5_RANK_PATRIARCH;SECT_5_RANK_ELDER;SECT_5_RANK_INNER;SECT_5_RANK_OUTER +6,SECT_6_NAME,SECT_6_DESC,合欢宗,以情入道,靠双修增进修为,善驭人心,长于权变。【双修秘术】你的体质特殊,通过双修能获得远超常人的修为提升,这是你提升境界的最佳捷径。,SECT_6_STYLE,NEUTRAL,1,ZITHER,"{extra_dual_cultivation_exp: 150, shop_buy_price_reduction: 0.1}",SECT_6_RANK_PATRIARCH;SECT_6_RANK_ELDER;SECT_6_RANK_INNER;SECT_6_RANK_OUTER +7,SECT_7_NAME,SECT_7_DESC,镇魂宗,铁血风格,擅安魂、封邪、渡厄,兼有刚烈镇压之术。【金刚不坏】你修习护体神功,拥有极强的肉身防御与伤害减免能力,如山岳般不可撼动。,SECT_7_STYLE,RIGHTEOUS,1,STAFF,"{extra_max_hp: 100, damage_reduction: 0.15}",SECT_7_RANK_PATRIARCH;SECT_7_RANK_ELDER;SECT_7_RANK_INNER;SECT_7_RANK_OUTER +8,SECT_8_NAME,SECT_8_DESC,幽魂噬影宗,镇宗典籍《幽冥录》。幽明气为根基。【如影随形】你极擅身法与遁术,遇到危险时总能全身而退,亦能伺机刺杀落单之敌。,SECT_8_STYLE,EVIL,1,SABER,"{extra_escape_success_rate: 0.4, extra_assassinate_success_rate: 0.15}",SECT_8_RANK_PATRIARCH;SECT_8_RANK_ELDER;SECT_8_RANK_INNER;SECT_8_RANK_OUTER +9,SECT_9_NAME,SECT_9_DESC,千帆城,炼器大宗,巧匠云集。著名法宝有灵灭丝、定魂蓝星等。商旅云集,自成体系。【巧夺天工】你深谙炼器与经商之道,温养兵器时常能使其脱胎换骨,且在交易中总能获利。,SECT_9_STYLE,NEUTRAL,1,SPEAR,"{extra_item_sell_price_multiplier: 0.05, extra_weapon_upgrade_chance: 0.15, extra_cast_success_rate: 0.05, shop_buy_price_reduction: 0.05}",SECT_9_RANK_PATRIARCH;SECT_9_RANK_ELDER;SECT_9_RANK_INNER;SECT_9_RANK_OUTER +10,SECT_10_NAME,SECT_10_DESC,妙化宗,精擅音律杀伐与精神操控,功法诡谲阴柔,以无形琴音乱人心智,杀人于无形。【魔音贯耳】你擅长以音律乱人心智,灵力深厚绵长,虽不擅肉搏,但手段诡谲。,SECT_10_STYLE,EVIL,1,ZITHER,"{extra_escape_success_rate: 0.5, extra_misfortune_probability: -0.005}", +11,SECT_11_NAME,SECT_11_DESC,回玄宗,当世第一阵法大派,以阵法阵诀独步天下,讲究阵法推演与巧思妙用。【阵法聚灵】你善用阵法辅助修炼,能够聚集天地灵气,修炼速度快于常人,且常有意外收获。,SECT_11_STYLE,RIGHTEOUS,1,HIDDEN_WEAPON,"{cultivate_duration_reduction: 0.1, extra_fortune_probability: 0.005}", +12,SECT_12_NAME,SECT_12_DESC,不夜城,修习极光玄真法,以万里极光壁的绝对防御闻名于世。【生生不息】你的生命力极其顽强,疗伤效果倍增,寿元亦远超同阶修士。,SECT_12_STYLE,RIGHTEOUS,1,FAN,"{extra_hp_recovery_rate: 0.5, extra_max_lifespan: 20}",SECT_12_RANK_PATRIARCH;SECT_12_RANK_ELDER;SECT_12_RANK_INNER;SECT_12_RANK_OUTER +13,SECT_13_NAME,SECT_13_DESC,天行健宗,专修浩然之气,行事正大光明,刚健果决,对邪魔外道有极强的克制力。【浩然正气】你养浩然之气,气脉悠长,面对境界低于自己的敌人时,能发挥出极强的压制力。,SECT_13_STYLE,RIGHTEOUS,1,SWORD,{realm_suppression_bonus: 0.15}, +14,SECT_14_NAME,SECT_14_DESC,噬魔宗,通玄界第一魔宗,行事霸道残忍,擅长搜精噬血与肉体魔功。【搜刮成性】你崇尚力量与掠夺,搜刮凡人虽有伤天和,但能为你带来惊人的财富与资源。,SECT_14_STYLE,EVIL,1,SABER,"{extra_plunder_multiplier: 2.0, extra_battle_strength_points: 2}", diff --git a/src/i18n/locales/en_US/LC_MESSAGES/game_configs.mo b/static/locales/en-US/LC_MESSAGES/game_configs.mo similarity index 100% rename from src/i18n/locales/en_US/LC_MESSAGES/game_configs.mo rename to static/locales/en-US/LC_MESSAGES/game_configs.mo diff --git a/src/i18n/locales/en_US/LC_MESSAGES/game_configs.po b/static/locales/en-US/LC_MESSAGES/game_configs.po similarity index 100% rename from src/i18n/locales/en_US/LC_MESSAGES/game_configs.po rename to static/locales/en-US/LC_MESSAGES/game_configs.po diff --git a/static/locales/en-US/LC_MESSAGES/messages.mo b/static/locales/en-US/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..2a879373f20c7868fcd482fdc98df0d9cf14feb9 GIT binary patch literal 66282 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 literal 0 HcmV?d00001 diff --git a/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po b/static/locales/zh-CN/LC_MESSAGES/messages.po similarity index 94% rename from src/i18n/locales/zh_CN/LC_MESSAGES/messages.po rename to static/locales/zh-CN/LC_MESSAGES/messages.po index 892b9b6..fc55142 100644 --- a/src/i18n/locales/zh_CN/LC_MESSAGES/messages.po +++ b/static/locales/zh-CN/LC_MESSAGES/messages.po @@ -2292,6 +2292,156 @@ msgstr "当阵营为{align}时" msgid "When using {weapon_type}" msgstr "当使用{weapon_type}时" +msgid "SECT_1_STYLE" +msgstr "娓呮槑鍏嬪繁锛岃姝㈠涓€銆傞噸鍓戜笌蹇冩硶骞堕噸锛岃绌舵槑蹇冭鎬с€" + +msgid "SECT_2_STYLE" +msgstr "瑷€璇洿鎺ワ紝閲嶈鍔涢噺涓庤鎬э紝宕囧皻鐙╃寧涓庢悘鏂椼€" + +msgid "SECT_2_RANK_PATRIARCH" +msgstr "璋蜂富" + +msgid "SECT_2_RANK_ELDER" +msgstr "渚涘" + +msgid "SECT_2_RANK_INNER" +msgstr "椹吔甯" + +msgid "SECT_2_RANK_OUTER" +msgstr "鎵堜粠" + +msgid "SECT_3_STYLE" +msgstr "澶勪簨鍐烽潤鍦嗚瀺锛屽枩浠ユ煍鍏嬪垰锛屾搮鍊熷姏涓庡弽鍒躲€" + +msgid "SECT_3_RANK_PATRIARCH" +msgstr "闀滀富" + +msgid "SECT_3_RANK_ELDER" +msgstr "鎺岄暅浜" + +msgid "SECT_3_RANK_INNER" +msgstr "浼犱汉" + +msgid "SECT_3_RANK_OUTER" +msgstr "渚嶉暅" + +msgid "SECT_4_STYLE" +msgstr "瑷€杈炲喎鍘夊皯鎯咃紝鏁晱鍥犳灉鑰屼笉鎯ф潃浼愶紝鍋忓悜鏁堢巼涓庣粨鏋溿€" + +msgid "SECT_4_RANK_PATRIARCH" +msgstr "娈夸富" + +msgid "SECT_4_RANK_ELDER" +msgstr "鍒ゅ畼" + +msgid "SECT_4_RANK_INNER" +msgstr "鏃犲父" + +msgid "SECT_4_RANK_OUTER" +msgstr "楝煎崚" + +msgid "SECT_5_STYLE" +msgstr "鐩撮潰娆叉湜涓庝唬浠凤紝涓嶆儳榛戞殫锛屼互鏀讳紣瑙侀暱銆" + +msgid "SECT_5_RANK_PATRIARCH" +msgstr "妤间富" + +msgid "SECT_5_RANK_ELDER" +msgstr "鎺屽垜浣" + +msgid "SECT_5_RANK_INNER" +msgstr "褰卞埡" + +msgid "SECT_5_RANK_OUTER" +msgstr "鎺㈠瓙" + +msgid "SECT_6_STYLE" +msgstr "杈炰护濠夎浆锛屽杽浜庢嬁鎹忎汉娆蹭笌灞€鍔匡紝浠ユ煍鍒跺垰銆" + +msgid "SECT_6_RANK_PATRIARCH" +msgstr "瀹富" + +msgid "SECT_6_RANK_ELDER" +msgstr "鎶ゆ硶" + +msgid "SECT_6_RANK_INNER" +msgstr "濯氫粰" + +msgid "SECT_6_RANK_OUTER" +msgstr "渚嶇" + +msgid "SECT_7_STYLE" +msgstr "鑲冪﹩娌夌ǔ锛岄噸瀹夐瓊闀囬偑锛屽皯瑷€鑰屾灉鍐炽€" + +msgid "SECT_7_RANK_PATRIARCH" +msgstr "浣忔寔" + +msgid "SECT_7_RANK_ELDER" +msgstr "棣栧骇" + +msgid "SECT_7_RANK_INNER" +msgstr "琛岃€" + +msgid "SECT_7_RANK_OUTER" +msgstr "灞呭+" + +msgid "SECT_8_STYLE" +msgstr "琛屼簨闅愮鏋滄柇锛岄噸缁撴灉杞昏櫄鍚嶏紝鎿呮綔琛屼笌鍑哄叾涓嶆剰銆" + +msgid "SECT_8_RANK_PATRIARCH" +msgstr "闂ㄤ富" + +msgid "SECT_8_RANK_ELDER" +msgstr "鎶ゆ硶" + +msgid "SECT_8_RANK_INNER" +msgstr "褰卞崼" + +msgid "SECT_8_RANK_OUTER" +msgstr "鎺㈠瓙" + +msgid "SECT_9_STYLE" +msgstr "鍔″疄绮炬槑锛岄噸浜ゆ槗涓庝俊瑾夛紝宕囧皻瑙勫垯涓庣З搴忋€" + +msgid "SECT_9_RANK_PATRIARCH" +msgstr "鍩庝富" + +msgid "SECT_9_RANK_ELDER" +msgstr "澶т緵濂" + +msgid "SECT_9_RANK_INNER" +msgstr "鎵т簨" + +msgid "SECT_9_RANK_OUTER" +msgstr "瀛﹀緬" + +msgid "SECT_10_STYLE" +msgstr "鏂囬泤缂ョ紙涓繁钘忕畻璁★紝鍠滅敤瑷€璇笌闊冲緥鎺屾帶灞€鍔匡紝鏉€浼愪笉娌剧儫鐏皵銆" + +msgid "SECT_11_STYLE" +msgstr "涓ヨ皑缁嗚嚧锛岃拷姹傛妧鏈瀬鑷达紝鎴樻枟涓搮闀夸互鍚庢墜闃垫硶鍙嶅埗鏁屼汉锛屾姝ヤ负钀ャ€" + +msgid "SECT_12_STYLE" +msgstr "鍧氶煣椤藉己锛屽湪閫嗗涓浘寮猴紝琛屼簨鍏夋槑纾婅惤浣嗕篃娣辫皨杩滆檻锛屾瀬鍏舵姢鐭€" + +msgid "SECT_12_RANK_PATRIARCH" +msgstr "鍩庝富" + +msgid "SECT_12_RANK_ELDER" +msgstr "闃佽€" + +msgid "SECT_12_RANK_INNER" +msgstr "鎵т护" + +msgid "SECT_12_RANK_OUTER" +msgstr "瀹堝浜" + +msgid "SECT_13_STYLE" +msgstr "鎭畧鍘熷垯锛岃绌堕亾涔夛紝闄ら瓟鍗亾涓€椹綋鍏堬紝瀹佹姌涓嶅集銆" + +msgid "SECT_14_STYLE" +msgstr "寮鸿€呬负灏婏紝闅忓績鎵€娆诧紝宕囧皻缁濆鐨勫姏閲忎笌鏉€鎴紝瑙嗕紬鐢熶负琛€椋熴€" + # ============================================================================ # Simulator & Event Translations # ============================================================================ diff --git a/src/i18n/locales/zh_CN/modules/action.po b/static/locales/zh-CN/modules/action.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/action.po rename to static/locales/zh-CN/modules/action.po diff --git a/src/i18n/locales/zh_CN/modules/alignment.po b/static/locales/zh-CN/modules/alignment.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/alignment.po rename to static/locales/zh-CN/modules/alignment.po diff --git a/src/i18n/locales/zh_CN/modules/auxiliary.po b/static/locales/zh-CN/modules/auxiliary.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/auxiliary.po rename to static/locales/zh-CN/modules/auxiliary.po diff --git a/src/i18n/locales/zh_CN/modules/avatar.po b/static/locales/zh-CN/modules/avatar.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/avatar.po rename to static/locales/zh-CN/modules/avatar.po diff --git a/src/i18n/locales/zh_CN/modules/battle.po b/static/locales/zh-CN/modules/battle.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/battle.po rename to static/locales/zh-CN/modules/battle.po diff --git a/src/i18n/locales/zh_CN/modules/cultivation.po b/static/locales/zh-CN/modules/cultivation.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/cultivation.po rename to static/locales/zh-CN/modules/cultivation.po diff --git a/src/i18n/locales/zh_CN/modules/death_reasons.po b/static/locales/zh-CN/modules/death_reasons.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/death_reasons.po rename to static/locales/zh-CN/modules/death_reasons.po diff --git a/src/i18n/locales/zh_CN/modules/direction_names.po b/static/locales/zh-CN/modules/direction_names.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/direction_names.po rename to static/locales/zh-CN/modules/direction_names.po diff --git a/src/i18n/locales/zh_CN/modules/effect.po b/static/locales/zh-CN/modules/effect.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/effect.po rename to static/locales/zh-CN/modules/effect.po diff --git a/src/i18n/locales/zh_CN/modules/elixir.po b/static/locales/zh-CN/modules/elixir.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/elixir.po rename to static/locales/zh-CN/modules/elixir.po diff --git a/src/i18n/locales/zh_CN/modules/essence_type.po b/static/locales/zh-CN/modules/essence_type.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/essence_type.po rename to static/locales/zh-CN/modules/essence_type.po diff --git a/src/i18n/locales/zh_CN/modules/feedback_labels.po b/static/locales/zh-CN/modules/feedback_labels.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/feedback_labels.po rename to static/locales/zh-CN/modules/feedback_labels.po diff --git a/src/i18n/locales/zh_CN/modules/fortune.po b/static/locales/zh-CN/modules/fortune.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/fortune.po rename to static/locales/zh-CN/modules/fortune.po diff --git a/src/i18n/locales/zh_CN/modules/gathering.po b/static/locales/zh-CN/modules/gathering.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/gathering.po rename to static/locales/zh-CN/modules/gathering.po diff --git a/src/i18n/locales/zh_CN/modules/gender.po b/static/locales/zh-CN/modules/gender.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/gender.po rename to static/locales/zh-CN/modules/gender.po diff --git a/src/i18n/locales/zh_CN/modules/hidden_domain.po b/static/locales/zh-CN/modules/hidden_domain.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/hidden_domain.po rename to static/locales/zh-CN/modules/hidden_domain.po diff --git a/src/i18n/locales/zh_CN/modules/item_exchange.po b/static/locales/zh-CN/modules/item_exchange.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/item_exchange.po rename to static/locales/zh-CN/modules/item_exchange.po diff --git a/src/i18n/locales/zh_CN/modules/labels.po b/static/locales/zh-CN/modules/labels.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/labels.po rename to static/locales/zh-CN/modules/labels.po diff --git a/src/i18n/locales/zh_CN/modules/llm_prompt.po b/static/locales/zh-CN/modules/llm_prompt.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/llm_prompt.po rename to static/locales/zh-CN/modules/llm_prompt.po diff --git a/src/i18n/locales/zh_CN/modules/map.po b/static/locales/zh-CN/modules/map.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/map.po rename to static/locales/zh-CN/modules/map.po diff --git a/src/i18n/locales/zh_CN/modules/misc.po b/static/locales/zh-CN/modules/misc.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/misc.po rename to static/locales/zh-CN/modules/misc.po diff --git a/src/i18n/locales/zh_CN/modules/misfortune.po b/static/locales/zh-CN/modules/misfortune.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/misfortune.po rename to static/locales/zh-CN/modules/misfortune.po diff --git a/src/i18n/locales/zh_CN/modules/mutual_action.po b/static/locales/zh-CN/modules/mutual_action.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/mutual_action.po rename to static/locales/zh-CN/modules/mutual_action.po diff --git a/src/i18n/locales/zh_CN/modules/realm.po b/static/locales/zh-CN/modules/realm.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/realm.po rename to static/locales/zh-CN/modules/realm.po diff --git a/src/i18n/locales/zh_CN/modules/relation.po b/static/locales/zh-CN/modules/relation.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/relation.po rename to static/locales/zh-CN/modules/relation.po diff --git a/src/i18n/locales/zh_CN/modules/root_element.po b/static/locales/zh-CN/modules/root_element.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/root_element.po rename to static/locales/zh-CN/modules/root_element.po diff --git a/src/i18n/locales/zh_CN/modules/sect.po b/static/locales/zh-CN/modules/sect.po similarity index 66% rename from src/i18n/locales/zh_CN/modules/sect.po rename to static/locales/zh-CN/modules/sect.po index 2b8edde..2737114 100644 --- a/src/i18n/locales/zh_CN/modules/sect.po +++ b/static/locales/zh-CN/modules/sect.po @@ -278,3 +278,154 @@ msgstr "当阵营为{align}时" msgid "When using {weapon_type}" msgstr "当使用{weapon_type}时" + +msgid "SECT_1_STYLE" +msgstr "娓呮槑鍏嬪繁锛岃姝㈠涓€銆傞噸鍓戜笌蹇冩硶骞堕噸锛岃绌舵槑蹇冭鎬с€? + +msgid "SECT_2_STYLE" +msgstr "瑷€璇洿鎺ワ紝閲嶈鍔涢噺涓庤鎬э紝宕囧皻鐙╃寧涓庢悘鏂椼€? + +msgid "SECT_2_RANK_PATRIARCH" +msgstr "璋蜂富" + +msgid "SECT_2_RANK_ELDER" +msgstr "渚涘" + +msgid "SECT_2_RANK_INNER" +msgstr "椹吔甯? + +msgid "SECT_2_RANK_OUTER" +msgstr "鎵堜粠" + +msgid "SECT_3_STYLE" +msgstr "澶勪簨鍐烽潤鍦嗚瀺锛屽枩浠ユ煍鍏嬪垰锛屾搮鍊熷姏涓庡弽鍒躲€? + +msgid "SECT_3_RANK_PATRIARCH" +msgstr "闀滀富" + +msgid "SECT_3_RANK_ELDER" +msgstr "鎺岄暅浜? + +msgid "SECT_3_RANK_INNER" +msgstr "浼犱汉" + +msgid "SECT_3_RANK_OUTER" +msgstr "渚嶉暅" + +msgid "SECT_4_STYLE" +msgstr "瑷€杈炲喎鍘夊皯鎯咃紝鏁晱鍥犳灉鑰屼笉鎯ф潃浼愶紝鍋忓悜鏁堢巼涓庣粨鏋溿€? + +msgid "SECT_4_RANK_PATRIARCH" +msgstr "娈夸富" + +msgid "SECT_4_RANK_ELDER" +msgstr "鍒ゅ畼" + +msgid "SECT_4_RANK_INNER" +msgstr "鏃犲父" + +msgid "SECT_4_RANK_OUTER" +msgstr "楝煎崚" + +msgid "SECT_5_STYLE" +msgstr "鐩撮潰娆叉湜涓庝唬浠凤紝涓嶆儳榛戞殫锛屼互鏀讳紣瑙侀暱銆? + +msgid "SECT_5_RANK_PATRIARCH" +msgstr "妤间富" + +msgid "SECT_5_RANK_ELDER" +msgstr "鎺屽垜浣? + +msgid "SECT_5_RANK_INNER" +msgstr "褰卞埡" + +msgid "SECT_5_RANK_OUTER" +msgstr "鎺㈠瓙" + +msgid "SECT_6_STYLE" +msgstr "杈炰护濠夎浆锛屽杽浜庢嬁鎹忎汉娆蹭笌灞€鍔匡紝浠ユ煍鍒跺垰銆? + +msgid "SECT_6_RANK_PATRIARCH" +msgstr "瀹富" + +msgid "SECT_6_RANK_ELDER" +msgstr "鎶ゆ硶" + +msgid "SECT_6_RANK_INNER" +msgstr "濯氫粰" + +msgid "SECT_6_RANK_OUTER" +msgstr "渚嶇" + +msgid "SECT_7_STYLE" +msgstr "鑲冪﹩娌夌ǔ锛岄噸瀹夐瓊闀囬偑锛屽皯瑷€鑰屾灉鍐炽€? + +msgid "SECT_7_RANK_PATRIARCH" +msgstr "浣忔寔" + +msgid "SECT_7_RANK_ELDER" +msgstr "棣栧骇" + +msgid "SECT_7_RANK_INNER" +msgstr "琛岃€? + +msgid "SECT_7_RANK_OUTER" +msgstr "灞呭+" + +msgid "SECT_8_STYLE" +msgstr "琛屼簨闅愮鏋滄柇锛岄噸缁撴灉杞昏櫄鍚嶏紝鎿呮綔琛屼笌鍑哄叾涓嶆剰銆? + +msgid "SECT_8_RANK_PATRIARCH" +msgstr "闂ㄤ富" + +msgid "SECT_8_RANK_ELDER" +msgstr "鎶ゆ硶" + +msgid "SECT_8_RANK_INNER" +msgstr "褰卞崼" + +msgid "SECT_8_RANK_OUTER" +msgstr "鎺㈠瓙" + +msgid "SECT_9_STYLE" +msgstr "鍔″疄绮炬槑锛岄噸浜ゆ槗涓庝俊瑾夛紝宕囧皻瑙勫垯涓庣З搴忋€? + +msgid "SECT_9_RANK_PATRIARCH" +msgstr "鍩庝富" + +msgid "SECT_9_RANK_ELDER" +msgstr "澶т緵濂? + +msgid "SECT_9_RANK_INNER" +msgstr "鎵т簨" + +msgid "SECT_9_RANK_OUTER" +msgstr "瀛﹀緬" + +msgid "SECT_10_STYLE" +msgstr "鏂囬泤缂ョ紙涓繁钘忕畻璁★紝鍠滅敤瑷€璇笌闊冲緥鎺屾帶灞€鍔匡紝鏉€浼愪笉娌剧儫鐏皵銆? + +msgid "SECT_11_STYLE" +msgstr "涓ヨ皑缁嗚嚧锛岃拷姹傛妧鏈瀬鑷达紝鎴樻枟涓搮闀夸互鍚庢墜闃垫硶鍙嶅埗鏁屼汉锛屾姝ヤ负钀ャ€? + +msgid "SECT_12_STYLE" +msgstr "鍧氶煣椤藉己锛屽湪閫嗗涓浘寮猴紝琛屼簨鍏夋槑纾婅惤浣嗕篃娣辫皨杩滆檻锛屾瀬鍏舵姢鐭€? + +msgid "SECT_12_RANK_PATRIARCH" +msgstr "鍩庝富" + +msgid "SECT_12_RANK_ELDER" +msgstr "闃佽€? + +msgid "SECT_12_RANK_INNER" +msgstr "鎵т护" + +msgid "SECT_12_RANK_OUTER" +msgstr "瀹堝浜? + +msgid "SECT_13_STYLE" +msgstr "鎭畧鍘熷垯锛岃绌堕亾涔夛紝闄ら瓟鍗亾涓€椹綋鍏堬紝瀹佹姌涓嶅集銆? + +msgid "SECT_14_STYLE" +msgstr "寮鸿€呬负灏婏紝闅忓績鎵€娆诧紝宕囧皻缁濆鐨勫姏閲忎笌鏉€鎴紝瑙嗕紬鐢熶负琛€椋熴€? + diff --git a/src/i18n/locales/zh_CN/modules/simulator.po b/static/locales/zh-CN/modules/simulator.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/simulator.po rename to static/locales/zh-CN/modules/simulator.po diff --git a/src/i18n/locales/zh_CN/modules/single_choice.po b/static/locales/zh-CN/modules/single_choice.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/single_choice.po rename to static/locales/zh-CN/modules/single_choice.po diff --git a/src/i18n/locales/zh_CN/modules/stage.po b/static/locales/zh-CN/modules/stage.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/stage.po rename to static/locales/zh-CN/modules/stage.po diff --git a/src/i18n/locales/zh_CN/modules/story_styles.po b/static/locales/zh-CN/modules/story_styles.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/story_styles.po rename to static/locales/zh-CN/modules/story_styles.po diff --git a/src/i18n/locales/zh_CN/modules/technique.po b/static/locales/zh-CN/modules/technique.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/technique.po rename to static/locales/zh-CN/modules/technique.po diff --git a/src/i18n/locales/zh_CN/modules/ui.po b/static/locales/zh-CN/modules/ui.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/ui.po rename to static/locales/zh-CN/modules/ui.po diff --git a/src/i18n/locales/zh_CN/modules/weapon.po b/static/locales/zh-CN/modules/weapon.po similarity index 100% rename from src/i18n/locales/zh_CN/modules/weapon.po rename to static/locales/zh-CN/modules/weapon.po diff --git a/src/i18n/locales/zh_TW/LC_MESSAGES/game_configs.mo b/static/locales/zh-TW/LC_MESSAGES/game_configs.mo similarity index 100% rename from src/i18n/locales/zh_TW/LC_MESSAGES/game_configs.mo rename to static/locales/zh-TW/LC_MESSAGES/game_configs.mo diff --git a/src/i18n/locales/zh_TW/LC_MESSAGES/game_configs.po b/static/locales/zh-TW/LC_MESSAGES/game_configs.po similarity index 100% rename from src/i18n/locales/zh_TW/LC_MESSAGES/game_configs.po rename to static/locales/zh-TW/LC_MESSAGES/game_configs.po diff --git a/static/locales/zh-TW/LC_MESSAGES/messages.mo b/static/locales/zh-TW/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..dd96fa203371437f901da90b5c04a4ca331b5698 GIT binary patch literal 63832 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 Set[str]: - """从 Python 文件中提取所有 t() 函数调用的第一个参数""" - try: - content = py_file.read_text(encoding='utf-8') - tree = ast.parse(content) - - msgids = set() - - for node in ast.walk(tree): - # 查找 t() 函数调用 - if isinstance(node, ast.Call): - # 检查函数名是否是 t - func_name = None - if isinstance(node.func, ast.Name): - func_name = node.func.id - elif isinstance(node.func, ast.Attribute): - func_name = node.func.attr - - if func_name == 't' and node.args: - # 获取第一个参数(msgid) - first_arg = node.args[0] - if isinstance(first_arg, ast.Constant) and isinstance(first_arg.value, str): - msgids.add(first_arg.value) - - return msgids - - except Exception as e: - print(f"Warning: Could not parse {py_file}: {e}") - return set() - - @staticmethod - def extract_msgids_from_po(po_file: Path) -> Set[str]: - """从 po 文件中提取所有 msgid""" - msgids = set() - - try: - import polib - po = polib.pofile(str(po_file)) - for entry in po: - msgids.add(entry.msgid) - except Exception as e: - print(f"Warning: Could not read {po_file} with polib: {e}") - # Fallback to regex - try: - content = po_file.read_text(encoding='utf-8') - pattern = r'msgid\s+"([^"]*)"' - matches = re.findall(pattern, content) - # 将 po 文件中的转义序列(如 \\n \\t等)转换为实际字符 - # 使用字符串替换而不是 decode,避免中文字符编码问题 - decoded_msgids = set() - for m in matches: - if m: # 排除空字符串 - # 替换常见的转义序列 - decoded = m.replace('\\n', '\n').replace('\\t', '\t').replace('\\r', '\r').replace('\\"', '"').replace("\\'", "'").replace('\\\\', '\\') - decoded_msgids.add(decoded) - msgids = decoded_msgids - except Exception as e: - print(f"Warning: Could not read {po_file}: {e}") - - return msgids - - def test_all_used_msgids_are_defined(self): - """检查所有在代码中使用的 msgid 都在 po 文件中定义""" - classes_dir = Path("src/classes") - po_file = Path("src/i18n/locales/zh_CN/LC_MESSAGES/messages.po") - - if not classes_dir.exists() or not po_file.exists(): - pytest.skip("Required directories not found") - - # 提取 po 文件中的所有 msgid - defined_msgids = self.extract_msgids_from_po(po_file) - - # 提取代码中使用的所有 msgid - used_msgids = set() - for py_file in classes_dir.rglob("*.py"): - used_msgids.update(self.extract_t_function_calls(py_file)) - - # 找出未定义的 msgid - undefined_msgids = used_msgids - defined_msgids - - if undefined_msgids: - msg = f"\n发现 {len(undefined_msgids)} 个在代码中使用但未在 po 文件中定义的 msgid:\n" - for msgid in sorted(undefined_msgids)[:10]: - msg += f" - '{msgid}'\n" - if len(undefined_msgids) > 10: - msg += f" ... 还有 {len(undefined_msgids) - 10} 个\n" - pytest.fail(msg) - - -class TestClassesI18nIntegration: - """测试 classes 中的类是否正确集成了国际化""" - - def setup_method(self): - """每个测试前重置语言""" - language_manager.set_language("zh-CN") - - def test_realm_translation(self): - """测试境界相关的翻译""" - from src.classes.cultivation import Realm - - language_manager.set_language("zh-CN") - # 测试境界名称翻译 - assert t("qi_refinement") == "练气" - assert t("foundation_establishment") == "筑基" - - language_manager.set_language("en-US") - assert t("qi_refinement") == "Qi Refinement" - assert t("foundation_establishment") == "Foundation Establishment" - - def test_gender_translation(self): - """测试性别翻译""" - language_manager.set_language("zh-CN") - assert t("male") == "男" - assert t("female") == "女" - - language_manager.set_language("en-US") - assert t("male") == "Male" - assert t("female") == "Female" - - def test_alignment_translation(self): - """测试阵营翻译""" - language_manager.set_language("zh-CN") - assert t("righteous") == "正" - assert t("neutral") == "中立" - assert t("evil") == "邪" - - language_manager.set_language("en-US") - assert t("righteous") == "Righteous" - assert t("neutral") == "Neutral" - assert t("evil") == "Evil" - - def test_weapon_type_translation(self): - """测试武器类型翻译""" - language_manager.set_language("zh-CN") - assert t("sword") == "剑" - assert t("saber") == "刀" - assert t("spear") == "枪" - - language_manager.set_language("en-US") - assert t("sword") == "Sword" - assert t("saber") == "Saber" - assert t("spear") == "Spear" - - def test_action_names_translation(self): - """测试动作名称翻译""" - language_manager.set_language("zh-CN") - assert t("cultivate_action_name") == "修炼" - assert t("breakthrough_action_name") == "突破" - assert t("attack_action_name") == "发起战斗" - - language_manager.set_language("en-US") - assert t("cultivate_action_name") == "Cultivate" - assert t("breakthrough_action_name") == "Breakthrough" - assert t("attack_action_name") == "Initiate Battle" - - def test_effect_names_translation(self): - """测试效果名称翻译""" - language_manager.set_language("zh-CN") - assert t("effect_extra_max_hp") == "最大生命值" - assert t("effect_extra_max_lifespan") == "最大寿元" - - language_manager.set_language("en-US") - assert t("effect_extra_max_hp") == "Max HP" - assert t("effect_extra_max_lifespan") == "Max Lifespan" - - def test_parameterized_translation_chinese(self): - """测试带参数的中文翻译""" - language_manager.set_language("zh-CN") - - result = t("{name} obtained {amount} spirit stones", - name="张三", amount=100) - assert "张三" in result - assert "获得灵石" in result - assert "100" in result - - def test_parameterized_translation_english(self): - """测试带参数的英文翻译""" - language_manager.set_language("en-US") - - result = t("{name} obtained {amount} spirit stones", - name="Zhang San", amount=100) - assert "Zhang San" in result - assert "obtained" in result - assert "spirit stones" in result - assert "100" in result - - -class TestI18nConsistency: - """测试国际化的一致性""" - - def test_all_enum_translations_exist(self): - """测试所有枚举类型的翻译都存在""" - language_manager.set_language("zh-CN") - - # 测试主要枚举类型 - enum_keys = [ - # 境界 - "qi_refinement", "foundation_establishment", "core_formation", "nascent_soul", - # 阶段 - "early_stage", "middle_stage", "late_stage", - # 性别 - "male", "female", - # 阵营 - "righteous", "neutral", "evil", - # 武器类型 - "sword", "saber", "spear", "staff", "fan", "whip", "zither", "flute", "hidden_weapon", - # 关系 - "parent", "child", "sibling", "kin", "master", "apprentice", "lovers", "friend", "enemy", - ] - - missing = [] - for key in enum_keys: - result = t(key) - # 如果翻译失败,会返回原始键 - if result == key: - missing.append(key) - - if missing: - pytest.fail(f"以下枚举键缺少中文翻译: {', '.join(missing)}") - - def test_format_string_consistency(self): - """测试格式化字符串在中英文中的参数一致性""" - from pathlib import Path - import re - - zh_po = Path("src/i18n/locales/zh_CN/LC_MESSAGES/messages.po") - en_po = Path("src/i18n/locales/en_US/LC_MESSAGES/messages.po") - - if not zh_po.exists() or not en_po.exists(): - pytest.skip("PO files not found") - - def extract_msgid_msgstr_pairs(po_file): - """提取 msgid 和 msgstr 对""" - pairs = {} - try: - import polib - po = polib.pofile(str(po_file)) - for entry in po: - pairs[entry.msgid] = entry.msgstr - except Exception: - content = po_file.read_text(encoding='utf-8') - lines = content.split('\n') - i = 0 - while i < len(lines): - line = lines[i].strip() - if line.startswith('msgid "') and line != 'msgid ""': - msgid = line[7:-1] # 提取引号内的内容 - - # 查找对应的 msgstr - i += 1 - while i < len(lines) and not lines[i].strip().startswith('msgstr '): - i += 1 - - if i < len(lines): - msgstr = lines[i].strip()[8:-1] # 提取引号内的内容 - pairs[msgid] = msgstr - i += 1 - - return pairs - - zh_pairs = extract_msgid_msgstr_pairs(zh_po) - en_pairs = extract_msgid_msgstr_pairs(en_po) - - # 检查格式化参数 - inconsistent = [] - for msgid in zh_pairs: - if msgid in en_pairs: - # 提取格式化参数 {param} - zh_params = set(re.findall(r'\{(\w+)\}', zh_pairs[msgid])) - en_params = set(re.findall(r'\{(\w+)\}', en_pairs[msgid])) - msgid_params = set(re.findall(r'\{(\w+)\}', msgid)) - - # 1. 首先检查中英文翻译之间的参数是否一致 - if zh_params != en_params: - inconsistent.append({ - 'msgid': msgid, - 'msgid_params': msgid_params, - 'zh_params': zh_params, - 'en_params': en_params - }) - continue - - # 2. 如果 msgid 本身包含参数,那么翻译必须包含完全相同的参数 - # 如果 msgid 不包含参数(可能是 key),则允许翻译包含参数(只要中英文一致即可) - if msgid_params and (zh_params != msgid_params): - inconsistent.append({ - 'msgid': msgid, - 'msgid_params': msgid_params, - 'zh_params': zh_params, - 'en_params': en_params - }) - - if inconsistent: - msg = "\n发现格式化参数不一致的翻译:\n" - for item in inconsistent[:5]: - msg += f" msgid: {item['msgid'][:50]}...\n" - msg += f" 原始参数: {item['msgid_params']}\n" - msg += f" 中文参数: {item['zh_params']}\n" - msg += f" 英文参数: {item['en_params']}\n" - if len(inconsistent) > 5: - msg += f" ... 还有 {len(inconsistent) - 5} 个\n" - pytest.fail(msg) - - -if __name__ == "__main__": - pytest.main([__file__, "-v"]) diff --git a/tests/test_i18n_duplicates.py b/tests/test_i18n_duplicates.py index e42e0d7..003b349 100644 --- a/tests/test_i18n_duplicates.py +++ b/tests/test_i18n_duplicates.py @@ -48,7 +48,9 @@ def find_duplicates(msgids: list[str]) -> dict[str, int]: def get_po_file_path(lang: str) -> Path: """获取指定语言的 po 文件路径""" project_root = Path(__file__).parent.parent - po_file = project_root / "src" / "i18n" / "locales" / lang / "LC_MESSAGES" / "messages.po" + # Ensure hyphen is used for folder name (zh_CN -> zh-CN) + lang_folder = lang.replace('_', '-') + po_file = project_root / "static" / "locales" / lang_folder / "LC_MESSAGES" / "messages.po" return po_file diff --git a/tests/test_i18n_fixes.py b/tests/test_i18n_fixes.py index d2ff963..53043f1 100644 --- a/tests/test_i18n_fixes.py +++ b/tests/test_i18n_fixes.py @@ -66,7 +66,7 @@ def use_english_language(): original_lang = str(language_manager) # Path to the PO file we updated - po_path = Path("src/i18n/locales/en_US/LC_MESSAGES/game_configs.po") + po_path = Path("static/locales/en-US/LC_MESSAGES/game_configs.po") mock_trans = MockTranslations(po_path) # Patch gettext.translation to return our mock diff --git a/tests/test_i18n_lint.py b/tests/test_i18n_lint.py index fcbacfc..799221a 100644 --- a/tests/test_i18n_lint.py +++ b/tests/test_i18n_lint.py @@ -8,8 +8,8 @@ ZH_PATTERN = re.compile(r'[\u4e00-\u9fff]') MSGID_PATTERN = re.compile(r'^msgid\s+"(.*)"') def get_po_files(): - """Get all .po files in src/i18n/locales""" - root_dir = Path(__file__).parent.parent / "src" / "i18n" / "locales" + """Get all .po files in static/locales""" + root_dir = Path(__file__).parent.parent / "static" / "locales" return list(root_dir.rglob("*.po")) @pytest.mark.parametrize("po_file", get_po_files()) diff --git a/tests/test_i18n_modules.py b/tests/test_i18n_modules.py index 0152834..0b71ffa 100644 --- a/tests/test_i18n_modules.py +++ b/tests/test_i18n_modules.py @@ -9,8 +9,8 @@ def test_i18n_modules_structure(): Test that the i18n modules structure is correct. """ locale_dir = _get_locale_dir() - # Directory names use underscores (zh_CN), not hyphens (zh-CN) - languages = ["zh_CN", "en_US", "zh_TW"] + # Directory names now use hyphens (zh-CN) to match static assets convention + languages = ["zh-CN", "en-US", "zh-TW"] for lang in languages: lang_dir = locale_dir / lang @@ -34,7 +34,7 @@ def test_merged_messages_po_integrity(): Test that the merged messages.po file in LC_MESSAGES exists and contains entries from modules. """ locale_dir = _get_locale_dir() - lang = "zh_CN" # Test with one language (underscore) + lang = "zh-CN" # Test with one language (hyphen) lc_messages_dir = locale_dir / lang / "LC_MESSAGES" messages_po_path = lc_messages_dir / "messages.po" diff --git a/tests/test_i18n_po_quality.py b/tests/test_i18n_po_quality.py index d4eb014..55c65df 100644 --- a/tests/test_i18n_po_quality.py +++ b/tests/test_i18n_po_quality.py @@ -167,7 +167,7 @@ class TestTranslationKeysDefinition: def test_all_used_msgids_are_defined_in_po(self): """检查所有代码中使用的 msgid 都在 PO 文件中定义""" src_dir = Path("src") - po_file = Path("src/i18n/locales/zh_CN/LC_MESSAGES/messages.po") + po_file = Path("static/locales/zh-CN/LC_MESSAGES/messages.po") if not src_dir.exists() or not po_file.exists(): print("SKIP: Required directories not found") @@ -218,8 +218,8 @@ class TestFormatParameterConsistency: def test_format_params_consistency(self): """检查中英文翻译的格式化参数与原始 msgid 一致""" - zh_po = Path("src/i18n/locales/zh_CN/LC_MESSAGES/messages.po") - en_po = Path("src/i18n/locales/en_US/LC_MESSAGES/messages.po") + zh_po = Path("static/locales/zh-CN/LC_MESSAGES/messages.po") + en_po = Path("static/locales/en-US/LC_MESSAGES/messages.po") if not zh_po.exists() or not en_po.exists(): print("SKIP: PO files not found") diff --git a/tests/test_i18n_zh_tw.py b/tests/test_i18n_zh_tw.py index 2cc52b8..a8d1f83 100644 --- a/tests/test_i18n_zh_tw.py +++ b/tests/test_i18n_zh_tw.py @@ -105,7 +105,7 @@ class TestI18nZhTW(unittest.TestCase): """驗證 zh-TW locale 檔案存在""" from pathlib import Path - locale_dir = Path('src/i18n/locales/zh_TW/LC_MESSAGES') + locale_dir = Path('static/locales/zh-TW/LC_MESSAGES') # 檢查 .po 檔案 messages_po = locale_dir / 'messages.po' @@ -128,7 +128,7 @@ class TestI18nZhTW(unittest.TestCase): except ImportError: self.skipTest('polib 未安裝') - locale_dir = Path('src/i18n/locales/zh_TW/LC_MESSAGES') + locale_dir = Path('static/locales/zh-TW/LC_MESSAGES') # 檢查 messages.po messages_po = polib.pofile(str(locale_dir / 'messages.po')) @@ -146,7 +146,7 @@ class TestI18nZhTW(unittest.TestCase): except ImportError: self.skipTest('polib 未安裝') - locale_dir = Path('src/i18n/locales/zh_TW/LC_MESSAGES') + locale_dir = Path('static/locales/zh-TW/LC_MESSAGES') # 檢查 messages.po messages_po = polib.pofile(str(locale_dir / 'messages.po')) diff --git a/tools/i18n/build_mo.py b/tools/i18n/build_mo.py index cb7752c..dbf63a6 100644 --- a/tools/i18n/build_mo.py +++ b/tools/i18n/build_mo.py @@ -117,7 +117,7 @@ def main(): # 查找项目根目录 script_dir = Path(__file__).parent project_root = script_dir.parent.parent - i18n_dir = project_root / "src" / "i18n" / "locales" + i18n_dir = project_root / "static" / "locales" if not i18n_dir.exists(): print(f"[ERROR] 找不到 i18n 目录: {i18n_dir}") diff --git a/tools/i18n/check_po_duplicates.py b/tools/i18n/check_po_duplicates.py index b0c512c..4c2c67e 100644 --- a/tools/i18n/check_po_duplicates.py +++ b/tools/i18n/check_po_duplicates.py @@ -88,8 +88,8 @@ def main(): project_root = script_dir.parent.parent # po 文件路径 - zh_file = project_root / "src" / "i18n" / "locales" / "zh_CN" / "LC_MESSAGES" / "messages.po" - en_file = project_root / "src" / "i18n" / "locales" / "en_US" / "LC_MESSAGES" / "messages.po" + zh_file = project_root / "static" / "locales" / "zh-CN" / "LC_MESSAGES" / "messages.po" + en_file = project_root / "static" / "locales" / "en-US" / "LC_MESSAGES" / "messages.po" # 检查中文文件 zh_count, zh_dups = check_file(zh_file, "中文 (zh_CN)") diff --git a/tools/i18n/split_po.py b/tools/i18n/split_po.py index bbbbc81..10601f0 100644 --- a/tools/i18n/split_po.py +++ b/tools/i18n/split_po.py @@ -150,7 +150,7 @@ def split_po_file(po_path: Path): # print(f" -> {out_path.name} ({len(entries)} entries)") def main(): - root_dir = Path("src/i18n/locales") + root_dir = Path("static/locales") if not root_dir.exists(): print(f"Directory not found: {root_dir}") return diff --git a/tools/package/pack.ps1 b/tools/package/pack.ps1 index f9e5a0f..882fc30 100644 --- a/tools/package/pack.ps1 +++ b/tools/package/pack.ps1 @@ -83,7 +83,6 @@ $AdditionalHooksPath = $ScriptDir # Source path $SrcPath = Join-Path $RepoRoot "src" -$I18nLocalesPath = Join-Path $SrcPath "i18n\locales" # Assemble PyInstaller arguments $argsList = @( @@ -102,7 +101,6 @@ $argsList = @( # Data Files "--add-data", "${AssetsPath};assets", # Game Assets (Images) -> _internal/assets - "--add-data", "${I18nLocalesPath};src/i18n/locales", # i18n Locales -> _internal/src/i18n/locales # REMOVED: "--add-data", "${WebDistDir};web_dist", (We will copy this manually to outside) "--add-data", "${StaticPath};static", # Configs -> _internal/static (backup)