MASTER PLANS - Multi-Language, Accessibility, Assets - 4 strategic documents
This commit is contained in:
167
scripts/translate_all.py
Normal file
167
scripts/translate_all.py
Normal file
@@ -0,0 +1,167 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
DeepL Translation Script
|
||||
Translates Slovenian game text to 4 languages
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
try:
|
||||
import deepl
|
||||
DEEPL_AVAILABLE = True
|
||||
except ImportError:
|
||||
DEEPL_AVAILABLE = False
|
||||
print("⚠️ DeepL not installed. Install with: pip3 install deepl")
|
||||
print("Using fallback translations (manual review needed!)")
|
||||
|
||||
# Paths
|
||||
LOCALIZATION_DIR = Path("assets/localization")
|
||||
LOCALIZATION_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Language mappings
|
||||
LANGUAGES = {
|
||||
'EN-US': 'en-US.json',
|
||||
'DE': 'de-DE.json',
|
||||
'IT': 'it-IT.json',
|
||||
'ZH': 'zh-CN.json'
|
||||
}
|
||||
|
||||
def translate_dict(data, translator, target_lang):
|
||||
"""Recursively translate all strings in dictionary"""
|
||||
if isinstance(data, dict):
|
||||
return {k: translate_dict(v, translator, target_lang) for k, v in data.items()}
|
||||
elif isinstance(data, list):
|
||||
return [translate_dict(item, translator, target_lang) for item in data]
|
||||
elif isinstance(data, str):
|
||||
if DEEPL_AVAILABLE and translator:
|
||||
try:
|
||||
result = translator.translate_text(data, target_lang=target_lang)
|
||||
return result.text
|
||||
except Exception as e:
|
||||
print(f" ⚠️ Translation error: {e}")
|
||||
return data
|
||||
else:
|
||||
return data # Fallback: return original
|
||||
else:
|
||||
return data
|
||||
|
||||
def create_slovenian_json():
|
||||
"""Extract Slovenian text from PrologueScene"""
|
||||
slovenian_data = {
|
||||
"ui": {
|
||||
"skip": "Pritisni ESC za preskok",
|
||||
"autoAdvance": "Pritisni PRESLEDNICA za samodejno nadaljevanje"
|
||||
},
|
||||
"prologue": {
|
||||
"01": {
|
||||
"speaker": "NARRATOR",
|
||||
"text": "Leto 2084. Zombi virus je uničil svet."
|
||||
},
|
||||
"02": {
|
||||
"speaker": "KAI",
|
||||
"text": "Moje ime je Kai Marković. Star sem štirinajst let."
|
||||
},
|
||||
"03": {
|
||||
"speaker": "KAI",
|
||||
"text": "Moja dvojčica Ana in jaz, sva zelo povezana. Nezlomljiv vez."
|
||||
},
|
||||
"04": {
|
||||
"speaker": "KAI",
|
||||
"text": "Naša starša sta bila znanstvenika. Raziskovala sta virusne mutacije."
|
||||
},
|
||||
"05": {
|
||||
"speaker": "NARRATOR",
|
||||
"text": "Tretji dan izbruha. Horda zombijev napada družinsko hišo."
|
||||
},
|
||||
"06": {
|
||||
"speaker": "NARRATOR",
|
||||
"text": "Starša se žrtvujeta, da rešita dvojčka. Zadnji besede: 'Beži, Kai! Zaščiti Ano!'"
|
||||
},
|
||||
"07": {
|
||||
"speaker": "NARRATOR",
|
||||
"text": "Iz senc se pojavi Orjaški Troll Kralj. Poslal ga je zlobni doktor Krnić."
|
||||
},
|
||||
"08": {
|
||||
"speaker": "ANA",
|
||||
"text": "KAI! REŠI ME! KAIII!"
|
||||
},
|
||||
"09": {
|
||||
"speaker": "KAI",
|
||||
"text": "ANA! NE! VRNITE MI JO!"
|
||||
},
|
||||
"10": {
|
||||
"speaker": "NARRATOR",
|
||||
"text": "Kai se spremeni v Alfa Hibrida. Vijolične oči. Moč nadzora nad zombiji."
|
||||
},
|
||||
"11": {
|
||||
"speaker": "NARRATOR",
|
||||
"text": "Šest mesecev kasneje. Kai se zbudi na majhni kmetiji. Ana je izginila."
|
||||
},
|
||||
"12": {
|
||||
"speaker": "KAI",
|
||||
"text": "Moram jo najti. Ne glede na to, kaj bo potrebno. Ana, prihajam!"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
output_file = LOCALIZATION_DIR / "sl-SI.json"
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(slovenian_data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print(f"✅ Created {output_file}")
|
||||
return slovenian_data
|
||||
|
||||
def main():
|
||||
print("🌍 TRANSLATION SYSTEM")
|
||||
print("=" * 50)
|
||||
|
||||
# Step 1: Create Slovenian JSON
|
||||
print("\n📝 Step 1: Creating Slovenian source...")
|
||||
sl_data = create_slovenian_json()
|
||||
|
||||
# Step 2: Initialize DeepL
|
||||
translator = None
|
||||
if DEEPL_AVAILABLE:
|
||||
api_key = os.environ.get('DEEPL_API_KEY')
|
||||
if api_key:
|
||||
try:
|
||||
translator = deepl.Translator(api_key)
|
||||
print(f"✅ DeepL initialized")
|
||||
except Exception as e:
|
||||
print(f"⚠️ DeepL error: {e}")
|
||||
else:
|
||||
print("⚠️ DEEPL_API_KEY not set in environment")
|
||||
|
||||
# Step 3: Translate to each language
|
||||
print("\n🔄 Step 2: Translating to 4 languages...\n")
|
||||
|
||||
for lang_code, filename in LANGUAGES.items():
|
||||
print(f" Translating to {filename}...")
|
||||
|
||||
if translator:
|
||||
translated_data = translate_dict(sl_data, translator, lang_code)
|
||||
else:
|
||||
# Fallback: Use Slovenian text (manual review needed)
|
||||
print(f" ⚠️ Using fallback (Slovenian text)")
|
||||
translated_data = sl_data.copy()
|
||||
|
||||
output_file = LOCALIZATION_DIR / filename
|
||||
with open(output_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(translated_data, f, indent=2, ensure_ascii=False)
|
||||
|
||||
print(f" ✅ Created {filename}")
|
||||
|
||||
print("\n🎉 Translation complete!")
|
||||
print(f"\n📁 Files created in {LOCALIZATION_DIR}:")
|
||||
for file in LOCALIZATION_DIR.glob("*.json"):
|
||||
size = file.stat().st_size
|
||||
print(f" - {file.name} ({size:,} bytes)")
|
||||
|
||||
if not translator:
|
||||
print("\n⚠️ NOTE: Files created with Slovenian text (DeepL unavailable)")
|
||||
print("Manual translation or DeepL API key required for production!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user