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:
@@ -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
348
web/src/locales/zh-TW.json
Normal 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 發給 AI,AI 思考後再把結果傳回來。",
|
||||
"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": "無特殊加成"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user