Update script: now choose file and targer language

This commit is contained in:
Nicola Benaglia 2025-06-07 17:09:55 +02:00
parent 9f82b60ebf
commit 5cb788e8f8

View File

@ -1,61 +1,81 @@
import os import os
import json import json
import time
from deep_translator import GoogleTranslator from deep_translator import GoogleTranslator
from concurrent.futures import ThreadPoolExecutor, as_completed
# === CONFIGURATION === # === CONFIGURATION ===
base_folder = "../src/i18n/locales" base_folder = "./src/i18n/locales"
source_lang = "en" source_lang = "en"
target_langs = ["de", "es", "fr", "it", "ja", "ru", "zh_CN"]
filenames = ["auth.json", "core.json", "group.json", "question.json", "tutorial.json"] filenames = ["auth.json", "core.json", "group.json", "question.json", "tutorial.json"]
max_workers = 12 # Adjust based on your CPU
# === TRANSLATION FUNCTION ===
def translate_json(obj, target_lang): # === SAFE TRANSLATION ===
if isinstance(obj, dict): def safe_translate(translator, text, retries=3):
return {k: translate_json(v, target_lang) for k, v in obj.items()} for attempt in range(retries):
elif isinstance(obj, list):
return [translate_json(item, target_lang) for item in obj]
elif isinstance(obj, str):
if "{{" in obj or "}}" in obj or "<" in obj:
return obj # Skip templating/markup
try: try:
return GoogleTranslator(source='en', target=target_lang).translate(text=obj) return translator.translate(text=text)
except Exception as e: except Exception as e:
print(f"[{target_lang}] Error: {e}") if attempt < retries - 1:
time.sleep(2)
else:
print(f"[{translator.target}] Failed to translate '{text}': {e}")
return text
# === TRANSLATION LOGIC ===
def translate_json(obj, translator):
if isinstance(obj, dict):
return {k: translate_json(v, translator) for k, v in obj.items()}
elif isinstance(obj, list):
return [translate_json(item, translator) for item in obj]
elif isinstance(obj, str):
if not obj.strip() or "{{" in obj or "}}" in obj or "<" in obj:
return obj return obj
return safe_translate(translator, obj)
return obj return obj
# === WORKER FUNCTION ===
def translate_file_for_lang(filename, data, lang): # === FILE TRANSLATION ===
print(f"🔁 Translating {filename}{lang}") def translate_file(filename, target_lang):
translated = translate_json(data, lang) source_path = os.path.join(base_folder, source_lang, filename)
target_dir = os.path.join(base_folder, lang) if not os.path.isfile(source_path):
print(f"❌ File not found: {source_path}")
return
with open(source_path, "r", encoding="utf-8") as f:
data = json.load(f)
print(f"🔁 Translating {filename}{target_lang}")
translator = GoogleTranslator(source=source_lang, target=target_lang)
translated = translate_json(data, translator)
target_dir = os.path.join(base_folder, target_lang)
os.makedirs(target_dir, exist_ok=True) os.makedirs(target_dir, exist_ok=True)
target_path = os.path.join(target_dir, filename) target_path = os.path.join(target_dir, filename)
with open(target_path, "w", encoding="utf-8") as f: with open(target_path, "w", encoding="utf-8") as f:
json.dump(translated, f, ensure_ascii=False, indent=2) json.dump(translated, f, ensure_ascii=False, indent=2)
print(f"✅ Saved {target_path}")
return target_path print(f"✅ Saved: {target_path}")
# === MAIN FUNCTION === # === MAIN FUNCTION ===
def main(): def main():
tasks = [] print("Available files:")
with ThreadPoolExecutor(max_workers=max_workers) as executor: for name in filenames:
for filename in filenames: print(f" - {name}")
source_path = os.path.join(base_folder, source_lang, filename) filename = input("Enter the filename to translate: ").strip()
if not os.path.isfile(source_path): if filename not in filenames:
print(f"⚠️ Missing file: {source_path}") print(f"❌ Invalid filename: {filename}")
continue return
with open(source_path, "r", encoding="utf-8") as f: target_lang = input("Enter the target language code (e.g., de, fr, ja): ").strip()
data = json.load(f) if not target_lang:
print("❌ No target language provided.")
return
for lang in target_langs: translate_file(filename, target_lang)
tasks.append(executor.submit(translate_file_for_lang, filename, data, lang))
for future in as_completed(tasks):
_ = future.result()
if __name__ == "__main__": if __name__ == "__main__":
main() main()