mirror of
https://github.com/Qortal/Qortal-Hub.git
synced 2025-06-14 20:11:22 +00:00
Update script: now choose file and targer language
This commit is contained in:
parent
9f82b60ebf
commit
5cb788e8f8
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user