Skip to main content

Ghidul complet pentru localizarea jocurilor Godot

De la TranslationServer la fonturile de rezervă: localizați-vă jocul Godot folosind CSV, fișiere PO, GDScript și traducerea automată bazată pe IA.

1

Noțiuni de bază despre TranslationServer

TranslationServer, inclus în Godot, reprezintă nucleul sistemului de localizare. Acesta încarcă resursele de traducere la pornire și rezolvă cheile prin funcția tr(). Fiecare apel GDScript către tr() trece prin TranslationServer — nu sunt necesare biblioteci suplimentare.

TranslationServer basics
# TranslationServer is Godot's built-in localization system.
# It loads translations at startup and resolves keys via tr().

# Set the game's locale
TranslationServer.set_locale("ja")

# Get the current locale
var current = TranslationServer.get_locale()  # "ja"

# Translate a key — works everywhere in GDScript
var text = tr("MENU_START")  # "ゲームスタート"

# Translate with context (Godot 4.x)
var text = tr("OPEN", "verb")    # "Open" (action)
var text = tr("OPEN", "adj")     # "Open" (state)
TranslationServer acceptă formatele CSV, PO (Gettext) și .translation (binar). Acesta detectează automat setarea regională a sistemului prin OS.get_locale() și selectează resursa de traducere corespunzătoare. Puteți înlocui oricând setarea regională folosind TranslationServer.set_locale().
2

Fișiere de traducere CSV

CSV este cel mai simplu format pentru traducerile Godot. Un singur fișier conține toate limbile în coloane. Prima coloană conține cheia, iar fiecare coloană următoare reprezintă o setare regională. Godot importă automat fișierele .csv și generează resurse .translation.

translations.csv
# translations.csv
# First column = key, subsequent columns = locale codes
keys,en,ja,de,es
MENU_START,Start Game,ゲームスタート,Spiel starten,Iniciar juego
MENU_SETTINGS,Settings,設定,Einstellungen,Configuración
MENU_QUIT,Quit,終了,Beenden,Salir
ITEM_SWORD,Sword,剣,Schwert,Espada
ITEM_SHIELD,Shield,盾,Schild,Escudo
DIALOG_GREETING,"Hello, adventurer!",冒険者よ、こんにちは!,"Hallo, Abenteurer!","¡Hola, aventurero!"
Importing CSV translations
# In Godot Editor:
# 1. Place your .csv file in the project (e.g., res://translations.csv)
# 2. Godot auto-imports it — creates .translation resources
# 3. Go to Project > Project Settings > Localization > Translations
# 4. Add the generated .translation files
Încadrați între ghilimele duble valorile care conțin virgule sau rânduri noi. În cazul valorilor care conțin ghilimele duble, folosiți secvența de evitare "". Păstrați cheile scurte și descriptive: MENU_START este preferabil față de menu_start_button_text_label.
3

Fișiere de traducere PO / Gettext

Fișierele PO (Portable Object) reprezintă standardul industriei pentru localizarea programelor software. Godot 4.x oferă compatibilitate nativă cu formatul PO, inclusiv cu formele de plural, diferențierea în funcție de context și comentariile pentru traducători. Creați câte un fișier .po pentru fiecare limbă într-un director locale/.

locale/ja.po
# translations.po — Gettext format for Godot
# Place in res://locale/ja.po

msgid ""
msgstr ""
"Language: ja\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Plural-Forms: nplurals=1; plural=0;\n"

# Simple translation
msgid "MENU_START"
msgstr "ゲームスタート"

# Translation with context (disambiguates identical source strings)
msgctxt "verb"
msgid "OPEN"
msgstr "開く"

msgctxt "adj"
msgid "OPEN"
msgstr "開いている"

# Plural form
msgid "You collected %d coin."
msgid_plural "You collected %d coins."
msgstr[0] "%d枚のコインを集めました。"
Loading PO files
# Project Settings > Localization > Translations
# Add each .po file:
#   res://locale/en.po
#   res://locale/ja.po
#   res://locale/de.po
#   res://locale/es.po

# Or load programmatically:
func _ready():
    var translation = load("res://locale/ja.po")
    TranslationServer.add_translation(translation)
Fișierele PO acceptă msgctxt pentru diferențierea în funcție de context (de exemplu, 'OPEN' ca verb sau adjectiv), msgid_plural pentru formele de plural și comentarii pentru traducători (rânduri #.), care oferă context despre locul și modul în care sunt utilizate șirurile.
4

Utilizarea traducerilor în GDScript

Folosiți tr() oriunde în GDScript pentru a traduce șiruri. Combinați funcția cu operatorul % din GDScript pentru formatarea șirurilor. Pentru administrarea robustă a setărilor regionale, creați un script Autoload care să gestioneze detectarea, păstrarea și schimbarea setării regionale prin semnale.

Using tr() in scenes
extends Control

func _ready():
    # Simple key lookup
    $TitleLabel.text = tr("MENU_START")

    # With string formatting (positional)
    $GreetingLabel.text = tr("DIALOG_GREETING_NAME") % [player_name]

    # With multiple placeholders
    $StatusLabel.text = tr("PLAYER_STATUS") % [player_name, level, health]

    # Context-aware translation (Godot 4.x)
    $ActionButton.text = tr("OPEN", "verb")

    # Update UI when locale changes
    TranslationServer.set_locale("de")
    _update_ui()

func _update_ui():
    # Re-apply all translated strings
    $TitleLabel.text = tr("MENU_START")
    $GreetingLabel.text = tr("DIALOG_GREETING_NAME") % [player_name]
locale_manager.gd (Autoload)
# locale_manager.gd — Register as Autoload in Project Settings
extends Node

signal locale_changed(new_locale: String)

const SUPPORTED_LOCALES = ["en", "ja", "de", "es", "fr", "ko", "zh"]

func _ready():
    var system_locale = OS.get_locale_language()
    if system_locale in SUPPORTED_LOCALES:
        set_locale(system_locale)
    else:
        set_locale("en")

func set_locale(locale: String):
    TranslationServer.set_locale(locale)
    locale_changed.emit(locale)

func get_locale() -> String:
    return TranslationServer.get_locale()
Schimbarea setării regionale cu TranslationServer.set_locale() nu actualizează automat textul deja afișat în scene. După schimbarea setării regionale, trebuie să aplicați din nou manual tr() tuturor etichetelor, butoanelor și nodurilor de text vizibile. Folosiți semnalele administratorului de setări regionale pentru a solicita scenelor interfeței să se reîmprospăteze.
5

Forme de plural și substituenți

Godot gestionează pluralurile prin formele de plural din fișierele PO. Fiecare limbă își definește propria formulă de plural în antetul PO. Operatorul % din GDScript gestionează substituenții poziționali (%s pentru șiruri și %d pentru numere întregi). Pentru substituenții denumiți, folosiți String.replace().

Plural forms by language
# Godot uses Gettext PO plural rules.
# Each language defines its own plural formula.

# English (2 forms: one, other)
msgid "You collected %d coin."
msgid_plural "You collected %d coins."
msgstr[0] "You collected %d coin."
msgstr[1] "You collected %d coins."

# Japanese (1 form: other — no singular/plural distinction)
msgid "You collected %d coin."
msgid_plural "You collected %d coins."
msgstr[0] "%d枚のコインを集めました。"

# Russian (3 forms: one, few, many)
msgid "You collected %d coin."
msgid_plural "You collected %d coins."
msgstr[0] "Вы собрали %d монету."
msgstr[1] "Вы собрали %d монеты."
msgstr[2] "Вы собрали %d монет."
Placeholder formatting
# GDScript string formatting with tr()

# Positional placeholders with %
var msg = tr("SCORE_MSG") % [score]        # "Score: %d" → "Score: 1500"
var msg = tr("STATS") % [name, level, hp]  # "%s — Lv %d — HP: %d"

# Named placeholders (manual replacement)
var template = tr("WELCOME_BACK")
var msg = template.replace("{player}", name).replace("{days}", str(days))
Nu includeți niciodată direct în cod o logică de plural precum 'if count == 1'. Limbile au reguli de plural foarte diferite: engleza are 2 forme, rusa are 3, araba are 6, iar japoneza are 1. Lăsați sistemul de plural PO să selecteze automat forma. Fișierele CSV nu acceptă pluraluri — folosiți fișiere PO pentru orice conținut care necesită forme de plural.
6

Fonturi de rezervă pentru CJK, arabă și alte sisteme de scriere

Este posibil ca fontul principal al jocului dumneavoastră să nu includă glife pentru sistemele de scriere japonez, coreean, chinez, arab sau thailandez. Godot 4.x acceptă lanțuri de fonturi de rezervă — când o glifă lipsește din fontul principal, Godot verifică în ordine fonturile de rezervă. Fără acestea, textul care nu folosește alfabetul latin este afișat sub forma unor pătrate goale.

Font fallback setup
# Godot 4.x supports font fallback chains.
# When a glyph is missing from the primary font, fallbacks are checked in order.

# In the Editor:
# 1. Create a LabelSettings or Theme resource
# 2. Set the primary font (e.g., Noto Sans for Latin)
# 3. Add fallback fonts: Noto Sans JP, KR, SC, Arabic

# Programmatically:
func setup_fonts():
    var font = FontFile.new()
    font.load_dynamic_font("res://fonts/NotoSans-Regular.ttf")

    var fallback_jp = FontFile.new()
    fallback_jp.load_dynamic_font("res://fonts/NotoSansJP-Regular.ttf")
    font.add_fallback(fallback_jp)

    $Label.add_theme_font_override("font", font)
RTL support
# Right-to-left (RTL) support for Arabic, Hebrew, etc.

# In the Editor:
# Select your Control node > Layout > Text Direction = RTL

# Programmatically:
func setup_rtl():
    var locale = TranslationServer.get_locale()
    var rtl_locales = ["ar", "he", "fa", "ur"]

    if locale.substr(0, 2) in rtl_locales:
        $Label.text_direction = Control.TEXT_DIRECTION_RTL
        $Container.layout_direction = Control.LAYOUT_DIRECTION_RTL
Folosiți familia de fonturi Noto de la Google — aceasta acoperă aproape toate sistemele de scriere Unicode. Adăugați Noto Sans JP, Noto Sans KR, Noto Sans SC și Noto Sans Arabic ca fonturi de rezervă. Pentru jocurile cu grafică pixel art, luați în considerare Noto Sans Mono sau fonturi bitmap care includ subseturi CJK. Țineți cont de dimensiunea totală a fonturilor — fonturile CJK complete pot avea între 15 și 20 MB fiecare.
7

Localizarea scenelor și a interfeței

Există trei metode de localizare a scenelor Godot: traducerea în _ready() folosind tr(), folosirea proprietății Auto Translate din editor sau încărcarea unor scene complet diferite pentru limbile care necesită alte aspecte, precum limbile RTL.

Scene localization approaches
# Approach 1: Translate in _ready() using tr()
extends Control

func _ready():
    $StartButton.text = tr("MENU_START")
    $SettingsButton.text = tr("MENU_SETTINGS")
    $QuitButton.text = tr("MENU_QUIT")

# Approach 2: Use auto-translate in the editor
# Set the Text property to the translation key (e.g., "MENU_START")
# and enable "Auto Translate" on the node.

# Approach 3: Locale-specific scenes for complex layouts
func load_localized_scene():
    var locale = TranslationServer.get_locale().substr(0, 2)
    var path = "res://ui/main_menu_%s.tscn" % locale
    if ResourceLoader.exists(path):
        add_child(load(path).instantiate())
    else:
        add_child(load("res://ui/main_menu_en.tscn").instantiate())
Auto Translate funcționează numai pentru proprietatea text a nodului. Dacă setați dinamic textul în cod după _ready(), rezultatul traducerii automate este înlocuit. Pentru textul actualizat dinamic, folosiți întotdeauna tr() explicit în cod. Rețineți și că traducerea automată aplică tr() valorii literale a textului — prin urmare, proprietatea text trebuie să conțină cheia de traducere, nu șirul sursă destinat cititorilor.
8

Revenire inteligentă la alte setări regionale cu LocaleChain

Când lipsește o variantă regională, TranslationServer din Godot revine direct la setarea regională implicită a proiectului. Un jucător pt-BR pentru care există numai traduceri pt-PT vede textul în engleză în locul celui în portugheză. LocaleChain remediază această problemă combinând traducerile din lanțuri de rezervă configurabile în TranslationServer în momentul configurării.

LocaleChain plugin
# LocaleChain for Godot — smart locale fallback
# Install from Godot AssetLib or copy addons/locale_chain/ into your project

# Problem: Godot's TranslationServer falls back directly to the default locale.
# A pt-BR player with only pt-PT translations sees English, not Portuguese.

# Solution: One-line setup
func _ready():
    LocaleChain.configure()  # Uses built-in fallback chains

# Now pt-BR falls back to pt-PT → pt → default
# es-MX falls back to es-419 → es → default
# zh-Hant-HK falls back to zh-Hant-TW → zh-Hant → default

# Custom configuration:
func _ready():
    # Override specific chains
    LocaleChain.configure({"pt-BR": ["pt"]})

    # Full custom — only your chains
    LocaleChain.configure(
        {"pt-BR": ["pt-PT", "pt"], "es-MX": ["es-419", "es"]},
        false  # don't merge defaults
    )

    # Reset to original state
    LocaleChain.reset()
LocaleChain este un modul suplimentar scris integral în GDScript — fără extensii native sau modificări ale motorului. Instalați-l din Godot AssetLib sau copiați dosarul addons/locale_chain/ în proiect. Acesta funcționează cu fișiere CSV, PO și .translation.
9

Automatizați traducerea jocurilor

După finalizarea configurației de localizare, traduceți fișierele CSV sau PO folosind IA. Automatizați traducerea șirurilor jocului, a textului interfeței, a descrierilor obiectelor și a dialogurilor — direct din mediul de dezvoltare sau din fluxul CI/CD.

Terminal
# Translate your Godot locale files with AI
# CSV files:
# In your IDE, ask your AI assistant:
> Translate translations.csv to Japanese, Korean, and German

# PO files:
> Translate locale/en.po to ja, ko, de

# Or use the CLI in CI/CD:
npx i18n-agent translate locale/en.po --lang ja,ko,de

# The tool preserves:
# - CSV column structure and delimiters
# - PO msgctxt, msgid_plural, and plural forms
# - Placeholder syntax (%s, %d, {name})
# - Comments and metadata headers
Traduceți incremental. Când adăugați chei noi în fișierul-sursă, traduceți numai diferențele, în loc să regenerați totul. Astfel păstrați traducerile verificate de oameni pentru dialogurile narative sau conținutul sensibil din punct de vedere cultural.

Automatizați controlul calității traducerilor

Detectați cheile lipsă și substituenții nevalizi înainte de lansare folosind i18n-validate. Testați-vă interfața cu pseudotraduceri folosind i18n-pseudo înainte de sosirea traducerilor reale.

Probleme frecvente

Fișierele de traducere nu sunt importate

Godot trebuie să importe fișierele .csv și .po înainte ca acestea să poată fi utilizate. Dacă traducerile nu apar, verificați dacă fișierele sunt enumerate în Project Settings > Localization > Translations. Pentru CSV, asigurați-vă că Godot a generat fișiere .translation în directorul .godot/imported/.

Valorile CSV cu virgule sau ghilimele împiedică analizarea

Valorile care conțin virgule trebuie încadrate între ghilimele duble. Valorile care conțin ghilimele duble trebuie să folosească secvența de evitare "". O ghilimea lipsă determină analizarea incorectă a întregului rând și deplasează adesea, fără avertisment, toate coloanele următoare.

Textul CJK sau arab este afișat sub forma unor pătrate goale

Fontul principal nu include glife pentru aceste sisteme de scriere. Adăugați fonturi de rezervă în resursa Theme sau LabelSettings. Fără fonturi de rezervă, glifele lipsă sunt afișate sub forma unor dreptunghiuri goale. Folosiți variante Noto Sans pentru o acoperire Unicode cuprinzătoare.

Număr incorect de forme de plural în antetul PO

Dacă valoarea nplurals din antetul PO nu corespunde numărului real de intrări msgstr, Godot se poate opri neașteptat sau poate afișa forma de plural greșită. Verificați întotdeauna dacă antetul Plural-Forms corespunde specificației CLDR pentru fiecare limbă vizată.

Auto Translate este înlocuit de cod

Setarea proprietății text a unui nod în GDScript după _ready() înlocuiește rezultatul traducerii automate. Folosiți exclusiv traducerea automată, setând textul în editor și niciodată în cod sau folosiți exclusiv tr() în cod. Combinarea celor două metode produce un comportament inconsecvent.

Structura recomandată a proiectului

Project Structure
my_godot_game/
├── addons/
│   └── locale_chain/              # LocaleChain plugin (optional)
│       ├── fallback_map.gd
│       ├── locale_chain.gd
│       └── plugin.cfg
├── fonts/
│   ├── NotoSans-Regular.ttf       # Primary font (Latin)
│   ├── NotoSansJP-Regular.ttf     # Japanese fallback
│   ├── NotoSansKR-Regular.ttf     # Korean fallback
│   └── NotoSansArabic-Regular.ttf # Arabic fallback
├── locale/
│   ├── en.po                      # English (source)
│   ├── ja.po                      # Japanese
│   ├── de.po                      # German
│   ├── es.po                      # Spanish
│   └── ar.po                      # Arabic
├── translations.csv               # Alternative: CSV format
├── scenes/
│   └── ui/
│       ├── main_menu.tscn
│       └── settings_menu.tscn
├── scripts/
│   ├── locale_manager.gd          # Autoload for locale management
│   └── ui/
│       └── main_menu.gd
├── project.godot
└── export_presets.cfg

Încercați acum i18n Agent

Plasați aici fișierul de traducere

JSON, YAML, PO, XML, CSV, Markdown, Properties

sau faceți clic pentru a-l selecta

Limbi țintă

Nu este necesară înregistrareaEstimare instantanee

Revenirea la alte setări regionale cu locale-chain-godot

Când lipsește o cheie de traducere dintr-o setare regională precum pl_PL, Godot revine direct la setarea regională implicită a proiectului, în loc să verifice mai întâi setarea regională părinte pl.

Terminal
# Install from Godot Asset Library
# Search: locale-chain-godot
Configuration
var lc = LocaleChain.new()
lc.configure({
    "pl": ["pl_PL", "en"],
    "pt_BR": ["pt", "en"],
    "zh_Hant_HK": ["zh_Hant", "zh", "en"],
})

Consultați Ghidul nostru despre revenirea la alte setări regionale pentru lista completă a cadrelor de lucru acceptate și a celor 75 de lanțuri incluse. Learn more →

Întrebări frecvente despre localizarea în Godot