Files
cultivation-world-simulator/tests/test_i18n_zh_tw.py
2026-02-06 00:43:08 +08:00

187 lines
6.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import unittest
from unittest.mock import MagicMock, patch
import os
import sys
from pathlib import Path
# Ensure project root is in sys.path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from src.classes.calendar import get_date_str
from src.classes.sect_region import SectRegion
from src.classes.world import World
from src.classes.language import language_manager, LanguageType
from src.classes.celestial_phenomenon import CelestialPhenomenon
from src.run.data_loader import reload_all_static_data
class TestI18nZhTW(unittest.TestCase):
"""測試繁體中文zh-TWi18n 功能"""
def setUp(self):
# 儲存當前語言
self.original_lang = str(language_manager)
def tearDown(self):
# 恢復語言
language_manager.set_language(self.original_lang)
def test_zh_tw_language_enum_exists(self):
"""驗證 ZH_TW 語言枚舉存在"""
self.assertTrue(hasattr(LanguageType, 'ZH_TW'))
self.assertEqual(LanguageType.ZH_TW.value, 'zh-TW')
def test_language_switch_to_zh_tw(self):
"""驗證可以切換到繁體中文"""
language_manager.set_language('zh-TW')
self.assertEqual(str(language_manager), 'zh-TW')
self.assertEqual(language_manager.current, LanguageType.ZH_TW)
def test_date_format_zh_tw(self):
"""驗證日期格式在繁體中文下正確顯示"""
language_manager.set_language('zh-TW')
# 13 = Year 1, Month 2 (formula: year*12 + month - 1 => 1*12 + 2 - 1 = 13)
date_str = get_date_str(13)
self.assertIn('', date_str)
self.assertIn('', date_str)
self.assertEqual(date_str, '1年2月')
def test_calendar_i18n_zh_tw(self):
"""驗證日期格式在繁體中文下正確顯示"""
language_manager.set_language('zh-TW')
# 測試日期格式
date_str = get_date_str(13)
self.assertIn('', date_str)
self.assertIn('', date_str)
def test_dynamic_translation_zh_tw(self):
"""驗證動態翻譯在繁體中文下正常工作"""
from src.i18n import t
language_manager.set_language('zh-TW')
# 測試基礎翻譯
text = t('male')
self.assertIn(text, ['', '男性']) # 接受可能的變體
# 測試帶參數翻譯
text = t('{winner} defeated {loser}', winner='張三', loser='李四')
self.assertIn('張三', text)
self.assertIn('李四', text)
self.assertIn('戰勝', text)
def test_realm_translation_zh_tw(self):
"""驗證境界翻譯在繁體中文下正確"""
# 使用已測試的日期格式功能來驗證翻譯機制
language_manager.set_language('zh-TW')
# 驗證基本翻譯機制正常工作
from src.i18n import t
result = t('qi_refinement')
self.assertIn(result, ['鍊氣', '煉氣', '練氣']) # 接受可能的變體(簡繁轉換差異)
def test_sect_region_desc_zh_tw(self):
"""驗證宗門駐地描述在繁體中文下正確"""
from src.i18n import t
language_manager.set_language('zh-TW')
# 測試宗門駐地翻譯
result = t('Sect Headquarters')
self.assertIn('宗門', result)
def test_language_fallback_zh_tw_to_zh_cn(self):
"""驗證繁體中文缺少翻譯時回退到簡體中文"""
from src.i18n import t
language_manager.set_language('zh-TW')
# 測試不存在的翻譯(應回退到簡體或原文)
text = t('non_existent_key_12345')
self.assertEqual(text, 'non_existent_key_12345')
def test_zh_tw_locale_files_exist(self):
"""驗證 zh-TW locale 檔案存在"""
from pathlib import Path
locale_dir = Path('static/locales/zh-TW/LC_MESSAGES')
# 檢查 .po 檔案
messages_po = locale_dir / 'messages.po'
self.assertTrue(messages_po.exists(), 'messages.po 應該存在')
game_configs_po = locale_dir / 'game_configs.po'
self.assertTrue(game_configs_po.exists(), 'game_configs.po 應該存在')
# 檢查 .mo 檔案
messages_mo = locale_dir / 'messages.mo'
self.assertTrue(messages_mo.exists(), 'messages.mo 應該存在')
game_configs_mo = locale_dir / 'game_configs.mo'
self.assertTrue(game_configs_mo.exists(), 'game_configs.mo 應該存在')
def test_zh_tw_po_file_integrity(self):
"""驗證 zh-TW .po 檔案完整性"""
try:
import polib
except ImportError:
self.skipTest('polib 未安裝')
locale_dir = Path('static/locales/zh-TW/LC_MESSAGES')
# 檢查 messages.po
messages_po = polib.pofile(str(locale_dir / 'messages.po'))
self.assertGreater(len(messages_po), 0, 'messages.po 應包含翻譯條目')
# 檢查 metadata
metadata = messages_po.metadata
self.assertIn('Language', metadata)
self.assertEqual(metadata.get('Language'), 'zh_TW')
def test_translation_coverage_zh_tw(self):
"""驗證 zh-TW 翻譯覆蓋率"""
try:
import polib
except ImportError:
self.skipTest('polib 未安裝')
locale_dir = Path('static/locales/zh-TW/LC_MESSAGES')
# 檢查 messages.po
messages_po = polib.pofile(str(locale_dir / 'messages.po'))
translated_count = sum(1 for entry in messages_po if entry.msgstr)
total_count = len(messages_po)
coverage = translated_count / total_count if total_count > 0 else 0
# 翻譯覆蓋率應該 > 95%
self.assertGreater(coverage, 0.95, f'翻譯覆蓋率應 > 95%,實際: {coverage:.1%}')
def test_action_translation_zh_tw(self):
"""驗證動作名稱在繁體中文下正確"""
from src.i18n import t
language_manager.set_language('zh-TW')
# 測試動作名稱翻譯
self.assertEqual(t('cultivate_action_name'), '修煉')
self.assertEqual(t('breakthrough_action_name'), '突破')
self.assertEqual(t('escape_action_name'), '逃離')
self.assertEqual(t('self_heal_action_name'), '療傷')
def test_emotion_translation_zh_tw(self):
"""驗證情緒在繁體中文下正確"""
from src.i18n import t
language_manager.set_language('zh-TW')
# 測試情緒名稱翻譯
self.assertEqual(t('emotion_calm'), '平靜')
self.assertEqual(t('emotion_happy'), '開心')
self.assertEqual(t('emotion_angry'), '憤怒')
self.assertEqual(t('emotion_sad'), '悲傷')
if __name__ == '__main__':
unittest.main()