feat: 添加i18n合并脚本 - 将所有模块i18n合并到wwwroot/i18n

This commit is contained in:
yumoqing 2026-06-25 13:53:32 +08:00
parent e5450225aa
commit 9fc8941529

118
script/merge_i18n.py Normal file
View File

@ -0,0 +1,118 @@
#!/usr/bin/env python3
"""
合并所有模块的i18n到wwwroot/i18n目录
用法: python3 script/merge_i18n.py
"""
import os
import json
from pathlib import Path
from collections import OrderedDict
def parse_msg_txt(filepath):
"""解析msg.txt文件返回字典"""
result = OrderedDict()
if not os.path.exists(filepath):
return result
with open(filepath, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if not line or line.startswith('#'):
continue
if ':' in line:
key, value = line.split(':', 1)
result[key.strip()] = value.strip()
return result
def write_msg_txt(data, filepath):
"""写入msg.txt文件"""
os.makedirs(os.path.dirname(filepath), exist_ok=True)
with open(filepath, 'w', encoding='utf-8') as f:
for key, value in data.items():
f.write(f"{key}: {value}\n")
def write_i18n_json(data, filepath):
"""写入i18n.json文件"""
os.makedirs(os.path.dirname(filepath), exist_ok=True)
with open(filepath, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=2)
def get_modules_from_lnwww():
"""从lnwww.sh读取模块列表"""
lnwww_path = Path(__file__).parent.parent / 'wwwroot' / 'lnwww.sh'
if not lnwww_path.exists():
print(f"警告: {lnwww_path} 不存在")
return []
modules = []
with open(lnwww_path, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
if line.startswith('for m in'):
# "for m in xxx yyy zzz" -> "xxx yyy zzz"
parts = line.split('for m in ', 1)[1].strip().split()
modules = [p for p in parts if p != 'do']
break
return modules
def merge_i18n():
"""主函数合并i18n"""
sage_root = Path(__file__).parent.parent
wwwroot_i18n = sage_root / 'wwwroot' / 'i18n'
base_i18n = sage_root / 'i18n'
# 获取模块列表
modules = get_modules_from_lnwww()
print(f"发现模块: {', '.join(modules)}")
# 语言列表
languages = ['zh', 'en', 'jp', 'ko']
for lang in languages:
print(f"\n处理语言: {lang}")
# 从基础i18n开始
merged = OrderedDict()
base_msg = base_i18n / lang / 'msg.txt'
if base_msg.exists():
merged.update(parse_msg_txt(base_msg))
print(f" ✓ 加载基础i18n: {len(merged)}")
# 合并每个模块的i18n
for module in modules:
# 模块可能在 ~/py/<module>/i18n 或 ~/repos/<module>/i18n
module_i18n_paths = [
Path.home() / 'py' / module / 'i18n' / lang / 'msg.txt',
Path.home() / 'repos' / module / 'i18n' / lang / 'msg.txt',
]
for msg_path in module_i18n_paths:
if msg_path.exists():
before = len(merged)
merged.update(parse_msg_txt(msg_path))
added = len(merged) - before
print(f"{module}: +{added} 条 (共 {len(merged)} 条)")
break
# 写入结果
out_msg = wwwroot_i18n / lang / 'msg.txt'
out_json = wwwroot_i18n / lang / 'i18n.json'
write_msg_txt(merged, out_msg)
write_i18n_json(merged, out_json)
print(f" → 写入 {out_msg}")
print(f" → 写入 {out_json}")
print("\n✓ 合并完成")
if __name__ == '__main__':
merge_i18n()