#!/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()