包含: - 国际化实施总结文档 - 翻译工具脚本 (quick_i18n.py) - 手动翻译库 (manual_translations.json) - 测试指南和后续优化建议
101 lines
2.8 KiB
Python
Executable File
101 lines
2.8 KiB
Python
Executable File
#!/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()
|