docs: 添加国际化实施总结和工具脚本
包含: - 国际化实施总结文档 - 翻译工具脚本 (quick_i18n.py) - 手动翻译库 (manual_translations.json) - 测试指南和后续优化建议
This commit is contained in:
100
scripts/auto_translate.py
Executable file
100
scripts/auto_translate.py
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
使用 Google Translate 为 Localizable.xcstrings 添加多语言翻译
|
||||
"""
|
||||
|
||||
import json
|
||||
import time
|
||||
from pathlib import Path
|
||||
from deep_translator import GoogleTranslator
|
||||
|
||||
# 语言映射
|
||||
LANGUAGES = {
|
||||
"es": "spanish",
|
||||
"ar": "arabic",
|
||||
"fr": "french",
|
||||
"ja": "japanese",
|
||||
"ko": "korean"
|
||||
}
|
||||
|
||||
def translate_text(text, target_lang, source_lang="en"):
|
||||
"""翻译文本"""
|
||||
try:
|
||||
translator = GoogleTranslator(source=source_lang, target=target_lang)
|
||||
translated = translator.translate(text)
|
||||
return translated
|
||||
except Exception as e:
|
||||
print(f" 翻译失败: {e}")
|
||||
return f"[{target_lang.upper()}] {text}"
|
||||
|
||||
def main():
|
||||
# 文件路径
|
||||
xcstrings_path = Path("/Users/yuanjiantsui/projects/to-live-photo/to-live-photo/to-live-photo/Localizable.xcstrings")
|
||||
|
||||
print("🔄 加载 Localizable.xcstrings...")
|
||||
with open(xcstrings_path, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
|
||||
print(f"📊 找到 {len(data['strings'])} 个字符串\n")
|
||||
|
||||
# 统计
|
||||
total_translations = 0
|
||||
skipped = 0
|
||||
|
||||
# 为每个字符串添加翻译
|
||||
for key_idx, (key, string_data) in enumerate(data["strings"].items(), 1):
|
||||
if "localizations" not in string_data:
|
||||
continue
|
||||
|
||||
locs = string_data["localizations"]
|
||||
|
||||
# 获取英文源文本
|
||||
if "en" not in locs:
|
||||
continue
|
||||
|
||||
source_text = locs["en"]["stringUnit"]["value"]
|
||||
|
||||
# 跳过占位符和特殊字符串
|
||||
if not source_text or source_text.startswith("%") or source_text == "•":
|
||||
skipped += 1
|
||||
continue
|
||||
|
||||
print(f"[{key_idx}/{len(data['strings'])}] {key}")
|
||||
print(f" EN: {source_text}")
|
||||
|
||||
# 翻译到每种语言
|
||||
for lang_code, lang_name in LANGUAGES.items():
|
||||
# 跳过已有翻译
|
||||
if lang_code in locs:
|
||||
print(f" {lang_code.upper()}: ✓ (已存在)")
|
||||
continue
|
||||
|
||||
# 翻译
|
||||
print(f" {lang_code.upper()}: ", end="", flush=True)
|
||||
translated_text = translate_text(source_text, lang_name, "auto")
|
||||
print(translated_text)
|
||||
|
||||
# 添加翻译
|
||||
locs[lang_code] = {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": translated_text
|
||||
}
|
||||
}
|
||||
|
||||
total_translations += 1
|
||||
time.sleep(0.5) # 避免请求过快
|
||||
|
||||
print() # 空行分隔
|
||||
|
||||
# 保存
|
||||
print(f"\n💾 保存 Localizable.xcstrings...")
|
||||
with open(xcstrings_path, 'w', encoding='utf-8') as f:
|
||||
json.dump(data, f, ensure_ascii=False, indent=2)
|
||||
|
||||
print(f"\n✅ 完成!")
|
||||
print(f" 翻译: {total_translations} 个")
|
||||
print(f" 跳过: {skipped} 个")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user