*Descriere:
Salut,
Am creat un script pentru a putea traduce toate questurile, mai exact daca sunt in limba engleza, putem selecta ENG==>RO
Daca mai exista pe forum, puteti da T/C
Tutorial complet: Instalare și utilizare Metin2 Quest Translator
Instalarea Notepad++
Notepad++ este un editor de text avansat, util pentru a vizualiza și modifica fișierele .lua, .quest și fișierele locale_string.txt.
Accesează site-ul oficial:
https://notepad-plus-plus.org/downloads/
Descarcă versiunea stabilă pentru Windows (x64 dacă ai sistem de 64bit)
Rulează installerul și urmează pașii:
Next → Accept → Next
Alege folderul de instalare
Finish
Deschide Notepad++ și setează encoding-ul la UTF-8 / ANSI când deschizi fișiere Metin2.
Instalarea Python 3
Python este necesar pentru rularea scriptului.
Accesează site-ul oficial:
https://www.python.org/downloads/
Descarcă Python 3.11+ pentru Windows
Rulează installerul și foarte important:
Bifează Add Python 3.x to PATH
Click pe Install Now
După instalare, verifică versiunea Python în CMD:
Ar trebui să vezi ceva de genul: Python 3.11.5
Instalarea librăriei deep-translator
Deschide CMD
Rulează comanda:
Ar trebui să vezi mesajul Successfully installed deep-translator
Pregătirea folderului pentru script și quest-uri
Creează structura următoare:
quest/ – conține toate fișierele .quest și .lua de tradus
translate_quests_menu.py – scriptul interactiv cu meniu CMD
Scriptul interactiv final
Backup automat (backup_quest/)
Export TXT (export_texts.txt)
Locale strings pentru fiecare limbă (locale_string_en.txt, locale_string_ro.txt etc.)
Chei lizibile pentru quest-uri și text
Multi-limbă – EN, RO, DE, FR, ES, PT, IT, RU, TR, PL
Selecție interactivă în CMD:
Elimină diacritice
Encoding latin-1
Nu modifică logica Lua
Cum rulezi scriptul
Deschide CMD
Navighează la folderul scriptului:
Rulează scriptul:
Urmează meniul interactiv:
Alege limba sursă (ex: en)
Selectează limbile țintă (ex: ro,fr,de)
Selectează folderele de ignorat (ex: gm,admin)
Confirmă pentru a începe traducerea
Scriptul va afișa progresul și va salva fișierele generate.
Ce generează scriptul
Backup automat: backup_quest/
Export TXT: export_texts.txt – toate textele originale și traducerile
Locale strings:
Pentru toate limbile selectate
Quest-urile modificate vor avea locale.KEY în loc de texte originale:
Upload pe server și test
Copiază quest-urile modificate pe server
Copiază fișierele locale_string_xx.txt în folderul /share/locale/ corespunzător fiecărei limbi
Compilează quest-urile:
Sfaturi finale
Verifică 2–3 quest-uri înainte de upload complet
Folosește backup-ul dacă apare vreo problemă
Cheile generate sunt lizibile și ușor de întreținut
Poți adăuga limbi suplimentare în lista AVAILABLE_LANGS
*Poze / Video: -
*Link download / Code: Voi adauga scriptul
Salut,
Am creat un script pentru a putea traduce toate questurile, mai exact daca sunt in limba engleza, putem selecta ENG==>RO
Daca mai exista pe forum, puteti da T/C
Tutorial complet: Instalare și utilizare Metin2 Quest Translator
Notepad++ este un editor de text avansat, util pentru a vizualiza și modifica fișierele .lua, .quest și fișierele locale_string.txt.
Accesează site-ul oficial:
https://notepad-plus-plus.org/downloads/
Descarcă versiunea stabilă pentru Windows (x64 dacă ai sistem de 64bit)
Rulează installerul și urmează pașii:
Next → Accept → Next
Alege folderul de instalare
Finish
Deschide Notepad++ și setează encoding-ul la UTF-8 / ANSI când deschizi fișiere Metin2.
Python este necesar pentru rularea scriptului.
Accesează site-ul oficial:
https://www.python.org/downloads/
Descarcă Python 3.11+ pentru Windows
Rulează installerul și foarte important:
Bifează Add Python 3.x to PATH
Click pe Install Now
După instalare, verifică versiunea Python în CMD:
Code:
python --version
Deschide CMD
Rulează comanda:
Code:
pip install deep-translator
Creează structura următoare:
Code:
quest_translate/
├── translate_quests_menu.py <-- scriptul final
└── quest/
├── npc/
├── object/
├── main_quest/
└── gm/ (optional, ignorat)
translate_quests_menu.py – scriptul interactiv cu meniu CMD
Backup automat (backup_quest/)
Export TXT (export_texts.txt)
Locale strings pentru fiecare limbă (locale_string_en.txt, locale_string_ro.txt etc.)
Chei lizibile pentru quest-uri și text
Multi-limbă – EN, RO, DE, FR, ES, PT, IT, RU, TR, PL
Selecție interactivă în CMD:
Code:
limba sursă
limbile țintă
foldere de ignoratEncoding latin-1
Nu modifică logica Lua
Deschide CMD
Navighează la folderul scriptului:
Code:
cd C:\Users\<numele_tau>\Desktop\quest_translate
Code:
python translate_quests_menu.py
Alege limba sursă (ex: en)
Selectează limbile țintă (ex: ro,fr,de)
Selectează folderele de ignorat (ex: gm,admin)
Confirmă pentru a începe traducerea
Scriptul va afișa progresul și va salva fișierele generate.
Backup automat: backup_quest/
Export TXT: export_texts.txt – toate textele originale și traducerile
Locale strings:
Code:
locale_string_en.txt
locale_string_ro.txt
locale_string_de.txtQuest-urile modificate vor avea locale.KEY în loc de texte originale:
Code:
say(locale.quest_blacksmith_bring_item)
say_title(locale.quest_guard_welcome)
Copiază quest-urile modificate pe server
Copiază fișierele locale_string_xx.txt în folderul /share/locale/ corespunzător fiecărei limbi
Compilează quest-urile:
Code:
./qc
Verifică 2–3 quest-uri înainte de upload complet
Folosește backup-ul dacă apare vreo problemă
Cheile generate sunt lizibile și ușor de întreținut
Poți adăuga limbi suplimentare în lista AVAILABLE_LANGS
*Poze / Video: -
*Link download / Code: Voi adauga scriptul
Code:import os import re import shutil from deep_translator import GoogleTranslator # Mesaj de start colorat GREEN = "\033[92m" # verde strident RESET = "\033[0m" # resetare culoare print(GREEN + "Script creat de catre Dintisor pentru comunitatea Metin2.Forum ! Toate drepturile rezervate !!" + RESET + "\n") # ================= CONFIG ================= QUEST_PATH = "quest" BACKUP_PATH = "backup_quest" EXPORT_TXT = "export_texts.txt" pattern = re.compile( r'say\("([^"]+)"\)|say_title\("([^"]+)"\)|select\("([^"]+)"' ) AVAILABLE_LANGS = ["en", "ro", "de", "fr", "es", "pt", "it", "ru", "tr", "pl"] AVAILABLE_IGNORE_FOLDERS = ["gm", "admin", "test"] # ================= FUNCTII ================= def clean_diacritics(text): replacements = { "ă": "a", "â": "a", "î": "i", "ș": "s", "ş": "s", "ț": "t", "ţ": "t", "Ă": "A", "Â": "A", "Î": "I", "Ș": "S", "Ş": "S", "Ț": "T", "Ţ": "T" } for k, v in replacements.items(): text = text.replace(k, v) return text def slugify(text): text = text.lower() text = re.sub(r"[^a-z0-9 ]", "", text) text = "_".join(text.split()[:4]) return text or "text" def select_from_list(prompt, options, multi=False, default=None): print(f"\n{prompt}") for i, opt in enumerate(options): print(f"{i+1}. {opt}") if multi: choices = input("Select numbers separated by comma (ex: 1,3,5): ") indices = [int(c.strip())-1 for c in choices.split(",") if c.strip().isdigit()] return [options[i] for i in indices if i < len(options)] else: choice = input(f"Select number (default {default}): ") if not choice and default: return default index = int(choice.strip())-1 return options[index] if index < len(options) else options[0] # ================= MENIU ================= print("=== Metin2 Quest Translator - Menu Version ===") SOURCE_LANG = select_from_list("Select source language:", AVAILABLE_LANGS, multi=False, default="en") TARGET_LANGS = select_from_list("Select target languages:", [l for l in AVAILABLE_LANGS if l != SOURCE_LANG], multi=True) IGNORE_PATH_KEYWORDS = select_from_list("Select folders to ignore:", AVAILABLE_IGNORE_FOLDERS, multi=True, default=["gm","admin"]) print("\nYou selected:") print(f"Source language: {SOURCE_LANG}") print(f"Target languages: {', '.join(TARGET_LANGS)}") print(f"Ignore folders: {', '.join(IGNORE_PATH_KEYWORDS)}") confirm = input("Confirm and start translation? (y/n): ").strip().lower() if confirm != "y": print("Translation cancelled.") exit() LOCALE_FILES = {lang: f"locale_string_{lang}.txt" for lang in TARGET_LANGS + [SOURCE_LANG]} # ================= BACKUP ================= if not os.path.exists(BACKUP_PATH): shutil.copytree(QUEST_PATH, BACKUP_PATH) print("\n✔ Backup creat:", BACKUP_PATH) # ================= TRANSLATORS ================= translators = {lang: GoogleTranslator(source=SOURCE_LANG, target=lang) for lang in TARGET_LANGS} locale_data = {lang: {} for lang in LOCALE_FILES} used_keys = set() export = open(EXPORT_TXT, "w", encoding="utf-8") # ================= PROCESS QUESTS ================= for root, dirs, files in os.walk(QUEST_PATH): if any(k.lower() in root.lower() for k in IGNORE_PATH_KEYWORDS): continue quest_name = os.path.basename(root).lower() for file in files: if not file.endswith((".quest", ".lua")): continue path = os.path.join(root, file) print("Processing:", path) with open(path, "r", encoding="latin-1", errors="ignore") as f: content = f.read() def repl(match): original = next(g for g in match.groups() if g) base_key = f"quest_{quest_name}_{slugify(original)}" key = base_key index = 1 while key in used_keys: key = f"{base_key}_{index}" index += 1 if key not in used_keys: used_keys.add(key) # Limba sursa locale_data[SOURCE_LANG][key] = original export.write(f"[{key}] {original}\n") # Traduceri in limbile tinta for lang, tr in translators.items(): try: translated = clean_diacritics(tr.translate(original)) except: translated = original locale_data[lang][key] = translated export.write(f" {lang}: {translated}\n") return match.group(0).replace(original, f"locale.{key}") new_content = pattern.sub(repl, content) with open(path, "w", encoding="latin-1", errors="ignore") as f: f.write(new_content) export.close() # ================= WRITE LOCALE FILES ================= for lang, file in LOCALE_FILES.items(): with open(file, "w", encoding="latin-1", errors="ignore") as f: for key, value in locale_data[lang].items(): f.write(f"{key}\t{value}\n") print("\n✔ ALL DONE! - Script creat de Dintisor pentru comunitatea Metin2.Forum") print("✔ Quest-uri modificate") print("✔ Backup:", BACKUP_PATH) print("✔ Export TXT:", EXPORT_TXT) for lang, file in LOCALE_FILES.items(): print(f"✔ Locale {lang.upper()}: {file}") # Mesaj de start colorat GREEN = "\033[92m" # verde strident RESET = "\033[0m" # resetare culoare print(GREEN + "Script creat de catre Dintisor pentru comunitatea Metin2.Forum ! Toate drepturile rezervate !!" + RESET + "\n")
Sper sa ajute comunitatea !! O zi frumoasa !!!

