1 mesaj
  • Mesaje: 33
  • Reacții: 32
  • Mesaje utile: 5
  • Status: Pierd vremea ^.^
  • Regat: Jinno
  • Medalii

    *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


    1️⃣ 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.

    2️⃣ 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:
    Code:
    python --version
    
    Ar trebui să vezi ceva de genul: Python 3.11.5

    3️⃣ Instalarea librăriei deep-translator

    Deschide CMD

    Rulează comanda:
    Code:
    pip install deep-translator
    
    Ar trebui să vezi mesajul Successfully installed deep-translator

    4️⃣ Pregătirea folderului pentru script și quest-uri

    Creează structura următoare:
    Code:
    quest_translate/
     ├── translate_quests_menu.py    <-- scriptul final
     └── quest/
          ├── npc/
          ├── object/
          ├── main_quest/
          └── gm/        (optional, ignorat)
    
    
    quest/ – conține toate fișierele .quest și .lua de tradus

    translate_quests_menu.py – scriptul interactiv cu meniu CMD

    5️⃣ 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:
    Code:
    limba sursă
    
    limbile țintă
    
    foldere de ignorat
    Elimină diacritice

    Encoding latin-1

    Nu modifică logica Lua

    6️⃣ Cum rulezi scriptul

    Deschide CMD

    Navighează la folderul scriptului:
    Code:
    cd C:\Users\<numele_tau>\Desktop\quest_translate
    
    Rulează scriptul:
    Code:
    python translate_quests_menu.py
    
    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.

    7️⃣ Ce generează scriptul

    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.txt
    Pentru toate limbile selectate

    Quest-urile modificate vor avea locale.KEY în loc de texte originale:
    Code:
    say(locale.quest_blacksmith_bring_item)
    say_title(locale.quest_guard_welcome)
    
    8️⃣ 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:
    Code:
    ./qc
    
    9️⃣ 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
    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 !!!

    Nou Cum descarc de pe TeraBox?

    Afișează detalii Ascunde detalii
    • Este asemănător cu Mega.nz
    • Instalați-vă clientul lor de Download de aici
    • Faceți-vă un cont (vă puteți loga cu Facebook / Google / etc)
    • Nou Dacă nu vreți să descărcați clientul de Download, folosiți acest site
    • Gata! Acum puteți descărca resursele rapid & simplu.

    De ce folosim TeraBox?

    • Este gratuit
    • Primești 1TB de spațiu gratuit la orice cont creat!
    • Este ușor de folosit și varianta premium este foarte ieftină
    • Fișierele nu sunt șterse niciodată
    TeraBox logo

    🔥 Hai pe Discord! - Chat activ și support direct

    Te așteptăm și pe serverul de Discord - aici ne-am strâns toată comunitatea de Metin2 din România.

    Alătură-te acum!
    Suntem aproape: 
    Robot Discord
    Roboțelu'
    Anunț

    Creează-ți un cont sau autentifică-te pentru a participa la discuție

    Trebuie să fii membru pentru a răspunde

    Creează-ți un cont

    Membrii pot crea subiecte noi și pot descărca resurse Metin2 Gratuit!


    Te poți înregistra sau conecta rapid utilizând contul tău de Discord, Github sau Google.

    Înregistrare

    Autentifică-te

    Înapoi la “Programe Utile”

    Informații

    Utilizatori ce navighează pe acest forum: Niciun utilizator înregistrat și 1 vizitator

    Discord ID copiat: