Skip to main content

Kompletan vodič za lokalizaciju Godot igara

Od TranslationServer sistema do rezervnih fontova: lokalizujte Godot igru pomoću CSV i PO datoteka, GDScript koda i automatizovanog AI prevođenja.

1

Osnove sistema TranslationServer

Ugrađeni Godot TranslationServer predstavlja srž sistema lokalizacije. Učitava resurse prevoda pri pokretanju i razrešava ključeve preko funkcije tr(). Svaki GDScript poziv tr() prolazi kroz TranslationServer — nisu potrebne dodatne biblioteke.

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 podržava CSV, PO (Gettext) i .translation (binarni) format. Automatski otkriva sistemski lokal preko OS.get_locale() i bira odgovarajući resurs prevoda. Lokal možete u svakom trenutku da promenite pomoću TranslationServer.set_locale().
2

CSV datoteke prevoda

CSV je najjednostavniji format za Godot prevode. Jedna datoteka sadrži sve jezike u kolonama. Prva kolona je ključ, a svaka sledeća je lokal. Godot automatski uvozi .csv datoteke i generiše .translation resurse.

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
Obuhvatite vrednosti koje sadrže zareze ili nove redove dvostrukim navodnicima. Dvostruke navodnike u vrednostima udvostručite kao "". Neka ključevi budu kratki i opisni: MENU_START je bolje od menu_start_button_text_label.
3

PO / Gettext datoteke prevoda

PO (Portable Object) datoteke su industrijski standard za lokalizaciju softvera. Godot 4.x izvorno podržava PO sa množinama, razlikovanjem konteksta i komentarima prevodilaca. Napravite po jednu .po datoteku za svaki jezik u direktorijumu 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)
PO datoteke podržavaju msgctxt za razlikovanje konteksta (npr. 'OPEN' kao glagol u odnosu na pridev), msgid_plural za oblike množine i komentare prevodilaca (redovi #.) koji prevodiocima daju kontekst o mestu i načinu upotrebe tekstova.
4

Upotreba prevoda u GDScript kodu

Koristite tr() bilo gde u GDScript kodu da prevedete tekstove. Kombinujte je sa GDScript operatorom % za formatiranje teksta. Za robusno upravljanje lokalom napravite Autoload skriptu koja obrađuje otkrivanje, čuvanje i promenu lokala pomoću signala.

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()
Promena lokala pomoću TranslationServer.set_locale() ne ažurira automatski tekst koji je već prikazan u scenama. Posle promene lokala morate ručno ponovo da primenite tr() na sve vidljive oznake, dugmad i tekstualne čvorove. Koristite signale upravljača lokalom da obavestite scene korisničkog interfejsa da se osveže.
5

Množine i čuvari mesta

Godot obrađuje množine kroz oblike množine PO datoteka. Svaki jezik definiše sopstvenu formulu množine u PO zaglavlju. GDScript operator % obrađuje pozicione čuvare mesta (%s za tekstove, %d za cele brojeve). Za imenovane čuvare mesta koristite 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))
Nikada ne upisujte direktno logiku množine kao 'if count == 1'. Jezici imaju veoma različita pravila množine: engleski ima 2 oblika, ruski 3, arapski 6, a japanski 1. Prepustite PO sistemu množine automatski izbor. CSV datoteke ne podržavaju množine — koristite PO datoteke za svaki sadržaj kojem su potrebni oblici množine.
6

Rezervni fontovi za CJK, arapski i druge sisteme pisanja

Glavni font Vaše igre verovatno ne sadrži glifove za japansko, korejsko, kinesko, arapsko ili tajlandsko pismo. Godot 4.x podržava lance rezervnih fontova — kada glif nedostaje u glavnom fontu, Godot redom proverava rezervne fontove. Bez toga se nelatinični tekst prikazuje kao prazni kvadrati.

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
Koristite Google porodicu fontova Noto — obuhvata skoro sva Unicode pisma. Dodajte Noto Sans JP, Noto Sans KR, Noto Sans SC i Noto Sans Arabic kao rezervne fontove. Za igre sa pixel art grafikom razmotrite Noto Sans Mono ili bitmap fontove koji sadrže CJK podskupove. Imajte na umu ukupnu veličinu fontova — potpuni CJK fontovi mogu imati po 15-20 MB.
7

Lokalizacija scena i korisničkog interfejsa

Postoje tri pristupa lokalizaciji Godot scena: prevedite u _ready() pomoću tr(), koristite svojstvo Auto Translate u uređivaču ili učitajte potpuno drugačije scene za jezike kojima su potrebni drugačiji rasporedi (kao što su RTL jezici).

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 radi samo nad svojstvom text čvora. Ako tekst dinamički postavite u kodu posle _ready(), automatski prevod se zamenjuje. Za dinamički ažurirani tekst uvek izričito koristite tr() u kodu. Imajte na umu i da automatski prevod primenjuje tr() na doslovnu vrednost teksta — zato svojstvo text mora da sadrži ključ prevoda, a ne čoveku čitljiv izvorni tekst.
8

Pametni rezervni lokali uz LocaleChain

Godot TranslationServer odmah prelazi na podrazumevani lokal projekta kada regionalna varijanta nedostaje. Igrač lokala pt-BR koji ima samo prevode za pt-PT vidi engleski umesto portugalskog. LocaleChain to ispravlja spajanjem prevoda iz podesivih lanaca rezerve u TranslationServer tokom konfiguracije.

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 je čist GDScript dodatak — bez izvornih proširenja ili izmena pokretača. Instalirajte ga iz Godot AssetLib biblioteke ili kopirajte direktorijum addons/locale_chain/ u projekat. Radi sa CSV, PO i .translation datotekama.
9

Automatizujte prevode igre

Kada podesite lokalizaciju, prevedite CSV ili PO datoteke pomoću AI tehnologije. Automatizujte prevođenje tekstova igre, teksta korisničkog interfejsa, opisa predmeta i dijaloga — direktno iz IDE okruženja ili CI/CD pipeline sistema.

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
Prevodite postepeno. Kada dodate nove ključeve u izvornu datoteku, prevedite samo razliku umesto ponovnog generisanja svega. Time se čuvaju prevodi narativnog dijaloga ili kulturno osetljivog sadržaja koje su ljudi pregledali.

Automatizujte kvalitet prevoda

Pomoću i18n-validate alatke otkrijte nedostajuće ključeve i neispravne čuvare mesta pre isporuke. Testirajte korisnički interfejs pseudoprevodima pomoću i18n-pseudo alatke pre nego što stignu pravi prevodi.

Uobičajene zamke

Datoteke prevoda nisu uvezene

Godot mora da uveze .csv i .po datoteke pre nego što mogu da se koriste. Ako se prevodi ne pojavljuju, proverite da li su datoteke navedene u Project Settings > Localization > Translations. Za CSV proverite da li je Godot generisao .translation datoteke u direktorijumu .godot/imported/.

CSV vrednosti sa zarezima ili navodnicima narušavaju raščlanjivanje

Vrednosti koje sadrže zareze moraju da budu obuhvaćene dvostrukim navodnicima. Dvostruki navodnici u vrednostima moraju da se udvostruče kao "". Nedostajući navodnik dovodi do neispravnog raščlanjivanja celog reda i često neprimetno pomera sve naredne kolone.

CJK ili arapski tekst prikazuje prazne kvadrate

Vaš glavni font ne sadrži glifove za ova pisma. Dodajte rezervne fontove u Theme ili LabelSettings resurs. Bez rezerve, nedostajući glifovi prikazuju se kao prazni pravougaonici. Koristite Noto Sans varijante za sveobuhvatnu Unicode pokrivenost.

Neispravan broj oblika množine u PO zaglavlju

Ako vrednost nplurals u PO zaglavlju ne odgovara stvarnom broju msgstr stavki, Godot može da padne ili prikaže pogrešan oblik množine. Uvek proverite da li zaglavlje Plural-Forms odgovara CLDR specifikaciji svakog ciljnog jezika.

Kod zamenjuje automatski prevod

Postavljanje svojstva text čvora u GDScript kodu posle _ready() zamenjuje rezultat automatskog prevoda. Ili isključivo koristite automatski prevod (postavite text u uređivaču, nikada u kodu) ili isključivo koristite tr() u kodu. Mešanje oba pristupa dovodi do nedoslednog ponašanja.

Preporučena struktura projekta

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

Isprobajte i18n Agent sada

Pustite datoteku za prevođenje ovde

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

ili kliknite za izbor

Ciljni jezici

Registracija nije potrebnaTrenutna procena

Rezervni lokali uz locale-chain-godot

Kada ključ prevoda nedostaje u regionalnom lokalu kao što je pl_PL, Godot odmah prelazi na podrazumevani lokal projekta umesto da prvo proveri nadređeni lokal 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"],
})

Pogledajte naš vodič za rezervne lokale za celu listu podržanih sistema i 75 ugrađenih lanaca. Learn more →

Česta pitanja o Godot lokalizaciji