Skip to main content

Cjelovit vodič za lokalizaciju igara u Godotu

Od sustava TranslationServer do zamjenskih fontova: lokalizirajte svoju igru u Godotu pomoću CSV i PO datoteka, GDScripta i automatiziranog prijevoda uz AI.

1

Osnove sustava TranslationServer

Godotov ugrađeni TranslationServer čini jezgru lokalizacijskog sustava. Pri pokretanju učitava resurse prijevoda i razrješava ključeve funkcijom tr(). Svaki poziv tr() iz GDScripta prolazi kroz TranslationServer — dodatne biblioteke nisu potrebne.

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 formate CSV, PO (Gettext) i .translation (binarni). Automatski prepoznaje lokalne postavke sustava putem OS.get_locale() i odabire odgovarajući resurs prijevoda. Lokalne postavke u svakom trenutku možete promijeniti s TranslationServer.set_locale().
2

CSV datoteke prijevoda

CSV je najjednostavniji format za prijevode u Godotu. Jedna datoteka sadržava sve jezike raspoređene u stupce. U prvom je stupcu ključ, a u svakom sljedećem lokalna postavka. Godot automatski uvozi .csv datoteke i stvara 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
Vrijednosti koje sadržavaju zareze ili prijelome redaka stavite u dvostruke navodnike. Dvostruke navodnike unutar vrijednosti zapišite kao "". Ključevi neka budu kratki i opisni: MENU_START bolji je od menu_start_button_text_label.
3

PO / Gettext datoteke prijevoda

Datoteke PO (Portable Object) industrijski su standard za lokalizaciju softvera. Godot 4.x izvorno podržava PO s množinskim oblicima, razjašnjenjem konteksta i komentarima prevoditelja. Za svaki jezik izradite zasebnu .po datoteku u direktoriju 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 razjašnjenje konteksta (primjerice, 'OPEN' kao glagol ili pridjev), msgid_plural za množinske oblike te komentare prevoditelja (retke #.) koji objašnjavaju gdje se i kako tekstovi rabe.
4

Primjena prijevoda u GDScriptu

Funkciju tr() možete rabiti bilo gdje u GDScriptu za prevođenje tekstova. Za oblikovanje nizova kombinirajte je s GDScriptovim operatorom %. Za pouzdano upravljanje lokalnim postavkama izradite skriptu Autoload koja signalima upravlja njihovim prepoznavanjem, pohranom i promjenom.

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()
Promjena lokalnih postavki s TranslationServer.set_locale() ne osvježava automatski tekst koji je već iscrtan u scenama. Nakon promjene morate ručno ponovno primijeniti tr() na sve vidljive natpise, gumbe i tekstne čvorove. Signalima upravitelja lokalnih postavki obavijestite scene korisničkog sučelja da se trebaju osvježiti.
5

Množine i čuvari mjesta

Godot obrađuje množinu pomoću množinskih oblika u PO datotekama. Svaki jezik u zaglavlju PO datoteke određuje vlastitu formulu množine. GDScriptov operator % obrađuje položajne rezervirana mjesta (%s za nizove, %d za cijele brojeve). Za imenovana rezervirana mjesta rabite 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 nemojte izravno zadati logiku množine poput 'if count == 1'. Pravila se među jezicima znatno razlikuju: engleski ima 2 oblika, ruski 3, arapski 6, a japanski 1. Odabir prepustite sustavu množine PO datoteka. CSV ne podržava množinu — za sav sadržaj kojem trebaju množinski oblici rabite PO datoteke.
6

Zamjenski fontovi za CJK, arapsko i druga pisma

Glavni font Vaše igre vjerojatno ne sadržava znakove japanskoga, korejskoga, kineskoga, arapskoga ili tajlandskoga pisma. Godot 4.x podržava lance zamjenskih fontova: kada znak nedostaje u glavnom fontu, Godot redom provjerava zamjenske fontove. Bez njih 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
Rabite Googleovu obitelj fontova Noto, koja obuhvaća gotovo sva pisma Unicodea. Kao zamjenske fontove dodajte Noto Sans JP, Noto Sans KR, Noto Sans SC i Noto Sans Arabic. Za igre s pikselnom grafikom razmotrite Noto Sans Mono ili bitmapirane fontove s podskupovima CJK znakova. Vodite računa o ukupnoj veličini: potpuni CJK fontovi mogu zauzimati 15-20 MB svaki.
7

Lokalizacija scena i korisničkog sučelja

Godotove scene možete lokalizirati na tri načina: prevesti ih u _ready() funkcijom tr(), uporabiti svojstvo Auto Translate u uređivaču ili učitati posve različite scene za jezike kojima trebaju drukč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 djeluje samo na svojstvo text čvora. Ako nakon _ready() dinamički postavite tekst u kodu, time nadjačavate automatski prijevod. Za tekst koji se dinamički osvježava uvijek izričito pozovite tr() u kodu. Automatski prijevod primjenjuje tr() na doslovnu vrijednost svojstva text, pa ono mora sadržavati ključ prijevoda, a ne čitljiv izvorni tekst.
8

Pametni lanac zamjenskih lokalnih postavki uz LocaleChain

Kada nedostaje regionalna inačica, Godotov TranslationServer odmah se vraća na zadane lokalne postavke projekta. Igrač s postavkom pt-BR i dostupnim prijevodima samo za pt-PT zato vidi engleski umjesto portugalskoga. LocaleChain to rješava tako što tijekom konfiguracije u TranslationServer objedinjuje prijevode iz prilagodljivih lanaca zamjenskih postavki.

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 dodatak napisan isključivo u GDScriptu, bez izvornih proširenja ili izmjena pokretačkog sustava. Instalirajte ga iz biblioteke Godot AssetLib ili kopirajte mapu addons/locale_chain/ u projekt. Podržava CSV, PO i .translation datoteke.
9

Automatizirajte prijevod igre

Nakon što dovršite postavljanje lokalizacije, prevedite CSV ili PO datoteke uz pomoć AI-ja. Automatizirajte prijevod nizova igre, teksta korisničkog sučelja, opisa predmeta i dijaloga izravno iz IDE-a ili CI/CD pipelinea.

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 postupno. Kada u izvornu datoteku dodate nove ključeve, prevedite samo razliku umjesto da sve ponovno stvarate. Tako ćete sačuvati prijevode narativnih dijaloga ili kulturološki osjetljivog sadržaja koje su pregledali ljudi.

Automatizirajte kvalitetu prijevoda

Alatom i18n-validate otkrijte ključeve koji nedostaju i neispravna rezervirana mjesta prije objave. Korisničko sučelje testirajte pseudoprijevodima iz alata i18n-pseudo prije nego što stignu stvarni prijevodi.

Uobičajene zamke

Datoteke prijevoda nisu uvezene

Godot mora uvesti .csv i .po datoteke prije nego što ih možete rabiti. Ako se prijevodi ne prikazuju, provjerite jesu li datoteke navedene u Project Settings > Localization > Translations. Za CSV provjerite je li Godot stvorio .translation datoteke u direktoriju .godot/imported/.

Zarezi ili navodnici u CSV vrijednostima prekidaju raščlanjivanje

Vrijednosti koje sadržavaju zareze moraju biti omeđene dvostrukim navodnicima. Dvostruke navodnike u vrijednostima treba udvostručiti kao "". Izostavljen navodnik uzrokuje neispravno raščlanjivanje cijelog retka i često neprimjetno pomakne sve sljedeće stupce.

CJK ili arapski tekst prikazuje prazne kvadrate

Vaš glavni font ne sadržava znakove tih pisama. Dodajte zamjenske fontove u resurs Theme ili LabelSettings. Bez njih se znakovi koji nedostaju prikazuju kao prazni pravokutnici. Za sveobuhvatnu pokrivenost Unicodea rabite inačice Noto Sans.

Neispravan broj oblika množine u PO zaglavlju

Ako vrijednost nplurals u zaglavlju PO datoteke ne odgovara stvarnom broju zapisa msgstr, Godot se može srušiti ili prikazati pogrešan množinski oblik. Uvijek provjerite odgovara li zaglavlje Plural-Forms specifikaciji CLDR za svaki ciljni jezik.

Kod nadjačava automatski prijevod

Ako nakon _ready() u GDScriptu postavite svojstvo text čvora, nadjačat ćete rezultat automatskog prijevoda. Rabite ili samo automatski prijevod (postavite text u uređivaču, nikada u kodu) ili isključivo tr() u kodu. Kombiniranje tih pristupa uzrokuje nedosljedno ponašanje.

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 odmah

Povucite datoteku za prijevod ovdje

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

ili kliknite za odabir

Ciljni jezici

Registracija nije potrebnaProcjena odmah

Zamjenske lokalne postavke uz locale-chain-godot

Kada ključ prijevoda nedostaje u regionalnoj lokalnoj postavci kao što je pl_PL, Godot odmah prelazi na zadane lokalne postavke projekta umjesto da najprije provjeri nadređenu postavku 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"],
})

U našem vodiču za zamjenske lokalne postavke pronađite potpun popis podržanih razvojnih okvira i 75 ugrađenih lanaca. Learn more →

Česta pitanja o lokalizaciji u Godotu