feat(i18n): add Traditional Chinese (zh-TW) locale support (#116)

* feat(i18n): add zh-TW locale support (backend infrastructure)

- 新增 LanguageType.ZH_TW 枚舉值
- 擴展 _lang_to_locale() 映射支援 zh-TW
- 創建 zh_TW 翻譯檔案結構 (messages.po + game_configs.po)
Closes #114

* feat(i18n): add zh-TW locale support (translation completion)

完成繁體中文語言的完整翻譯工作:

## 後端翻譯
- 將 messages.po 和 game_configs.po 轉換為繁體中文
- 編譯生成對應的 .mo 檔案
- 使用 OpenCC 's2t' 轉換器進行簡繁轉換

## 前端翻譯
- 新增 zh-TW.json 語言檔案
- 更新 index.ts 註冊 zh-TW 語言
- 修正 UI 語言標籤為「繁體中文」

## 翻譯統計
- messages.po: 701 個 msgid(動態字串、戰鬥、奇遇等)
- game_configs.po: 2972 個 msgid(遊戲配置)
- zh-TW.json: 347 行(前端 UI)

* feat(i18n): add zh-TW optimizations and tests

## 可選優化 1:用語本地化
- 修正前端 UI 詞彙為台灣繁體習慣
- 主要修正項目:
  - 菜單 -> 選單
  - 設置 -> 設定
  - 加載 -> 載入
  - 保存 -> 儲存
  - 程序 -> 程式
  - 其他 UI 用語調整

## 可選優化 2:測試覆蓋
- 新增 test_i18n_zh_tw.py 測試檔案
- 涵蓋 13 個測試用例:
  - 語言枚舉驗證
  - 語言切換測試
  - 日期格式驗證
  - 動態翻譯測試
  - 境界/動作/情緒翻譯測試
  - 檔案完整性檢查
  - 翻譯覆蓋率驗證
  - 回退機制測試

## 測試結果
- 所有 13 個測試用例通過
- 翻譯覆蓋率 > 95%

* fix(i18n): add polib skip check to translation coverage test

* feat(i18n): add zh-TW column to glossary with Taiwan localization
This commit is contained in:
teps3105
2026-02-01 13:28:18 +08:00
committed by GitHub
parent c981aff863
commit f0b6b62de5
10 changed files with 6034 additions and 251 deletions

View File

@@ -1,16 +1,18 @@
import { createI18n } from 'vue-i18n';
import zhCN from './zh-CN.json';
import zhTW from './zh-TW.json';
import enUS from './en-US.json';
// Type-define 'en-US' as the master schema for the resource
type MessageSchema = typeof enUS;
const i18n = createI18n<[MessageSchema], 'en-US' | 'zh-CN'>({
const i18n = createI18n<[MessageSchema], 'en-US' | 'zh-CN' | 'zh-TW'>({
legacy: false, // Use Composition API mode
locale: localStorage.getItem('app_locale') || 'zh-CN', // Default locale
fallbackLocale: 'en-US', // Fallback locale
messages: {
'zh-CN': zhCN,
'zh-TW': zhTW,
'en-US': enUS
}
});

348
web/src/locales/zh-TW.json Normal file
View File

@@ -0,0 +1,348 @@
{
"ui": {
"system_menu": "系統選單",
"system_menu_title": "系統選單",
"start_game": "開始遊戲",
"load_game": "載入遊戲",
"save_game": "儲存遊戲",
"create_character": "新增角色",
"delete_character": "刪除角色",
"settings": "設定",
"achievements": "成就",
"exit": "離開",
"other": "其他",
"language": "語言",
"chinese": "繁體中文",
"english": "English",
"back": "返回",
"confirm": "確定",
"cancel": "取消",
"llm_settings": "LLM設定",
"other_options": "其他選項",
"other_options_desc": "管理遊戲進程和結束。",
"return_to_main": "回到主選單",
"return_to_main_desc": "返回標題畫面(未儲存的進度將丟失)",
"quit_game": "結束遊戲",
"quit_game_desc": "關閉程式並結束到桌面"
},
"save_load": {
"loading": "載入中...",
"new_save": "新增存檔",
"new_save_desc": "點擊創建一個新的存檔檔案",
"empty": "暫無存檔",
"game_time": "遊戲時間: {time}",
"load": "載入",
"save_success": "存檔成功: {filename}",
"save_failed": "存檔失敗",
"load_confirm": "確定要載入存檔 {filename} 嗎?當前未儲存的進度將丟失。",
"load_success": "讀檔成功",
"load_failed": "讀檔失敗",
"fetch_failed": "獲取存檔列表失敗"
},
"llm": {
"loading": "載入中...",
"fetch_failed": "獲取配置失敗",
"test_success": "連接測試成功",
"save_success": "配置已儲存",
"test_save_failed": "測試或儲存失敗: {error}",
"api_key_required": "請填寫 API Key",
"base_url_required": "請填寫 Base URL",
"preset_applied": "已應用 {name} 預設 ({extra})",
"preset_extra_key": "請填寫 API Key",
"preset_extra_local": "請確保 Ollama 已啓動",
"sections": {
"quick_fill": "快速填充",
"api_config": "API 配置",
"model_selection": "模型選擇",
"run_mode": "運行模式"
},
"labels": {
"api_key": "API Key",
"base_url": "Base URL",
"normal_model": "智能模型 (Normal)",
"fast_model": "快速模型 (Fast)",
"what_is_api": "什麼是 API / 如何獲取?"
},
"descs": {
"normal_model": "用於處理複雜邏輯、劇情生成等任務",
"fast_model": "用於簡單判定、頻繁交互等任務"
},
"placeholders": {
"api_key": "在此填入你自己的 API Key (通常以 sk- 開頭)",
"base_url": "https://api.example.com/v1",
"normal_model": "例如: gpt-4, claude-3-opus, qwen-plus",
"fast_model": "例如: gpt-3.5-turbo, qwen-flash"
},
"modes": {
"default": "均衡 (Default)",
"default_desc": "自動選擇模型(推薦)",
"normal": "智能 (Normal)",
"normal_desc": "全用智能模型",
"fast": "快速 (Fast)",
"fast_desc": "全用快速模型"
},
"actions": {
"testing": "測試連接中...",
"test_and_save": "測試連通性並儲存"
},
"help": {
"title": "什麼是 API? 新手配置指南",
"q1_title": "🌐 1. 什麼是 API?",
"q1_content": "API (應用程式接口) 就像是一條“電話線”。本遊戲本身不具備思考能力,它通過這條線連接到遠端的 AI 大腦 (如 Qwen 或 DeepSeek 的服務器)。當遊戲進行每月結算並決定 NPC 動作時,會將相關信息通過 API 發給 AIAI 思考後再把結果傳回來。",
"q2_title": "⚡ 2. 推薦的模型 (2025版)",
"q2_qwen": "國內大廠 (阿里),穩定且免費額度大,適合入門。",
"q2_deepseek": "性價比極高,中文敘事邏輯更符合國人習慣。",
"q2_gemini": "Google 出品,綜合性能頂尖。",
"q3_title": "📝 3. 如何填入配置?",
"q3_content": "獲得 API 後你需要填入以下三大核心參數才能使用通常你可以在api提供方的文檔中找到 these 參數怎麼填:",
"q3_format_note": "⚠️ 重要提示:本遊戲僅支持 OpenAI 兼容格式的 API。如果某個服務不支持 OpenAI 兼容格式,將無法使用。推薦使用預設中的服務(它們都已確認兼容)。如需使用其他服務,請確認其提供 OpenAI 兼容接口。",
"q3_base_url": "API Base URL (接口地址): AI 的訪問大門,通常由廠商提供 (如 https://api.deepseek.com)。",
"q3_api_key": "API Key (密鑰): 你的身份憑證,就像賬號密碼。",
"q3_model_name": "Model Name (模型名稱): 告訴服務器你想用哪顆大腦,如 deepseek-chat 或 gemini-3-flash-preview。",
"q4_title": "🔗 4. 從哪裏獲取 Key?",
"q5_title": "🛡️ 5. 安全說明",
"q5_p1": "您的 API Key 僅儲存在您的本地電腦配置檔案中 (`static/local_config.yml`),由本地運行的遊戲後端直接與模型廠商通信。本遊戲 (Cultivation World Simulator) 是完全開源的程式,絕不會將您的 Key 上傳至任何第三方服務器。也請注意不要把local_config.yml檔案分享給任何人。",
"q5_p2": "使用token會產生費用請自行評估使用成本。",
"confirm": "我明白了"
},
"presets": {
"openai": "OpenAI",
"qwen": "通義千問",
"deepseek": "DeepSeek",
"siliconflow": "硅基流動",
"openrouter": "OpenRouter",
"gemini": "Gemini",
"ollama": "Ollama (本地)"
},
"help_links": {
"openai": "OpenAI Platform",
"qwen": "阿里雲百鍊 (Qwen / 最推薦)",
"deepseek": "DeepSeek 開放平臺 (國內推薦,便宜)",
"openrouter": "OpenRouter (全機型聚合,推薦)",
"siliconflow": "硅基流動 (國內聚合)",
"gemini": "Google AI Studio (Gemini)"
}
},
"game_start": {
"title": "開始遊戲",
"description": "設定世界的初始狀態。注意:遊戲開始後,這些設定將無法更改。",
"labels": {
"init_npc_num": "初始修士數量",
"sect_num": "活躍宗門數量",
"protagonist_mode": "主角引入模式",
"new_npc_rate": "每月新生修士概率",
"world_history": "世界歷史背景"
},
"tips": {
"sect_num": "宗門數量建議少於角色數量的一半",
"protagonist_random": "隨機引入:每次生成角色時,有 5% 的概率使用預設的“小說主角”模板。",
"protagonist_all": "全部引入:開局時強制生成所有預設的“小說主角”。",
"world_history": "可以包括上古、中古、近古。注意啓用此功能會調用LLM初始化時間會顯著增加。"
},
"placeholders": {
"world_history": "請輸入修仙界歷史背景(可選)。"
},
"options": {
"protagonist_none": "不引入主角",
"protagonist_random": "隨機引入主角",
"protagonist_all": "全部引入主角"
},
"actions": {
"start": "開始"
},
"messages": {
"load_failed": "載入配置失敗",
"start_success": "配置已儲存,正在初始化世界...",
"start_failed": "開始遊戲失敗"
}
},
"splash": {
"title": "AI修仙世界模擬器",
"start": "開始修仙",
"continue": "繼續道途",
"settings": "系統設定"
},
"loading": {
"title": "AI修仙世界模擬器",
"subtitle": "AI Cultivation World Simulator",
"phase": {
"scanning_assets": "掃描天地資源",
"loading_map": "構建洪荒山川",
"processing_history": "推演天道歷史",
"initializing_sects": "宗門入世",
"generating_avatars": "衆修士降臨",
"checking_llm": "連通天道意志",
"loading_save": "讀取前世因果",
"parsing_data": "解析天地法則",
"restoring_state": "恢復時空位面",
"finalizing": "萬象歸位",
"complete": "天地初開",
"chaos": "混沌初始",
"generating_initial_events": "推演初始因果"
},
"error": "初始化失敗",
"unknown_error": "未知錯誤",
"retry": "重新初始化",
"tips_label": "修行小貼士",
"elapsed": "已等待 {seconds} 秒",
"tips": [
"修改角色目標,可以改變該角色的行事風格",
"角色的性格特質,會極大影響角色的行事風格",
"在符合角色靈根的洞府修行,事半功倍",
"天靈根角色在任何洞府修行,都事半功倍",
"改變天地靈機,不僅會影響加成,還會微妙調整角色行事風格",
"偶爾會有修仙小說中的主角穿越進此方世界",
"每個角色都有自己的真實思考和情緒",
"除了修煉,煉丹和練氣也很重要",
"參加拍賣會可能撿漏,但要小心惡人的銜尾追殺",
"江湖同道會根據你的行爲取一個綽號",
"雙修雖好,還請剋制",
"在宗門駐地回血可以回滿HP",
"不同境界之間,戰力差距極大,越階挑戰難於登天",
"天命之子特質的角色,好運連連,奇遇不斷",
"現代世界的穿越者,只想回到現實世界,但這是不可能的",
"丹藥有生效的時間限制",
"由於大模型需要思考,遊戲啓動可能耗時較久",
"模擬世界對大模型token消耗較大請注意",
"開局時設定歷史,整個修仙世界也會隨之而改變",
"拍賣會中拍到的珍寶可能大大提升你的實力,但是要留好靈石"
]
},
"common": {
"year": "年",
"month": "月",
"none": "無",
"loading": "載入中...",
"version": "版本",
"confirm": "確認",
"cancel": "取消",
"error": "錯誤",
"success": "成功"
},
"game": {
"status_bar": {
"phenomenon": "天地靈機",
"effect": "效果:",
"duration": "持續 {years} 年",
"selector_title": "天道干涉:更易天象",
"empty_data": "暫無天象數據",
"cultivators": "修士: {count}",
"change_success": "天象已更易爲:{name}",
"click_to_change": "(點擊可更易天象)",
"author_bilibili": "B站空間",
"author_github": "Github倉庫"
},
"controls": {
"resume": "繼續遊戲",
"pause": "暫停遊戲",
"paused": "已暫停",
"closed_msg": "遊戲已關閉,您可以安全關閉此標籤頁。"
},
"event_panel": {
"title": "事件記錄",
"filter_all": "所有人",
"deceased": "(已故)",
"add_second": "+ 添加第二人",
"load_more": "向上滾動載入更多",
"empty_dual": "這兩人之間暫無事件",
"empty_single": "該修士暫無事件",
"empty_none": "暫無事件"
},
"info_panel": {
"popup": {
"effect": "效果:",
"drops": "掉落/產出:",
"hq": "駐地:",
"types": {
"elixir": "丹藥",
"plant": "植物",
"lode": "礦脈",
"item": "物品",
"weapon": "兵器",
"auxiliary": "輔助裝備",
"technique": "功法",
"sect": "宗門",
"persona": "特質",
"SWORD": "劍",
"SABER": "刀",
"SPEAR": "槍",
"STAFF": "棍",
"FAN": "扇",
"WHIP": "鞭",
"ZITHER": "琴",
"FLUTE": "笛",
"HIDDEN_WEAPON": "暗器"
}
},
"avatar": {
"set_objective": "設定目標",
"clear_objective": "清空目標",
"dead_with_reason": "已故 ({reason})",
"unknown_reason": "未知原因",
"long_term_objective": "長期目標",
"short_term_objective": "短期目標",
"stats": {
"realm": "境界",
"age": "年齡",
"hp": "HP",
"gender": "性別",
"alignment": "陣營",
"sect": "宗門",
"rogue": "散修",
"root": "靈根",
"magic_stone": "靈石",
"appearance": "顏值",
"battle_strength": "基礎戰力",
"emotion": "情緒"
},
"sections": {
"thinking": "當前思考",
"traits": "特質",
"techniques_equipment": "功法與裝備",
"materials": "材料",
"relations": "關係",
"current_effects": "當前效果"
},
"weapon_meta": "熟練度 {value}",
"relation_meta": "{owner}的{relation}",
"modals": {
"set_long_term": "設定長期目標",
"placeholder": "請輸入目標...",
"set_failed": "設定失敗",
"clear_confirm": "確定要清空該角色的長期目標嗎?"
}
},
"region": {
"view_sect": "查看宗門詳情",
"essence_title": "靈氣環境",
"essence_info": "{type}行靈氣 · 濃度 {density}",
"sections": {
"host": "洞府主人",
"animals": "動物分佈",
"plants": "植物分佈",
"lodes": "礦脈分佈",
"market": "坊市交易"
},
"host_meta": "主人",
"no_host": "無主(可佔據)",
"price_meta": "{price}靈石"
},
"sect": {
"stats": {
"alignment": "陣營",
"style": "風格",
"preferred": "擅長",
"members": "成員"
},
"sections": {
"intro": "宗門簡介",
"hq": "駐地:{name}",
"bonus": "宗門加成",
"techniques": "獨門絕學",
"members": "門下弟子"
},
"no_bonus": "無特殊加成"
}
}
}
}