Skip to main content

Kompletný sprievodca lokalizáciou hier v Godote

Od TranslationServer po záložné písma: lokalizujte hru v Godote pomocou súborov CSV a PO, GDScriptu a automatických prekladov AI.

1

Základy TranslationServer

Vstavaný TranslationServer v Godote je jadrom lokalizačného systému. Pri spustení načíta prekladové prostriedky a kľúče rozlišuje cez funkciu tr(). Každé volanie tr() v GDScript prechádza cez TranslationServer — ďalšie knižnice nie sú potrebné.

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 podporuje formáty CSV, PO (Gettext) a .translation (binárny). Automaticky rozpozná systémovú lokalitu cez OS.get_locale() a vyberie zodpovedajúci prekladový prostriedok. Lokalitu môžete kedykoľvek prepísať pomocou TranslationServer.set_locale().
2

Prekladové súbory CSV

CSV je najjednoduchší formát pre preklady Godot. Jeden súbor obsahuje všetky jazyky v stĺpcoch. Prvý stĺpec je kľúč a každý ďalší stĺpec predstavuje lokalitu. Godot automaticky importuje súbory .csv a vytvára prostriedky .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
Hodnoty obsahujúce čiarky alebo nové riadky uzavrite do dvojitých úvodzoviek. Dvojité úvodzovky v hodnotách zapíšte ako "". Kľúče udržujte krátke a opisné: MENU_START je lepšie ako menu_start_button_text_label.
3

Prekladové súbory PO/Gettext

Súbory PO (Portable Object) sú odvetvovým štandardom lokalizácie softvéru. Godot 4.x natívne podporuje PO s množným číslom, rozlíšením kontextu a komentármi prekladateľov. V priečinku locale/ vytvorte jeden súbor .po pre každý jazyk.

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)
Súbory PO podporujú msgctxt na rozlíšenie kontextu (napr. 'OPEN' ako sloveso alebo prídavné meno), msgid_plural pre množné číslo a komentáre prekladateľov (riadky #.), ktoré vysvetľujú miesto a spôsob použitia textov.
4

Používanie prekladov v GDScript

Na preklad textov použite tr() kdekoľvek v GDScript. Na formátovanie reťazcov ho skombinujte s operátorom % z GDScript. Pre spoľahlivú správu lokalít vytvorte skript Autoload, ktorý pomocou signálov spravuje rozpoznanie, uchovanie a prepínanie lokality.

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()
Zmena lokality pomocou TranslationServer.set_locale() automaticky neaktualizuje text, ktorý už bol vykreslený v scénach. Po zmene lokality musíte znova ručne použiť tr() na všetky viditeľné štítky, tlačidlá a textové uzly. Signálmi správcu lokality upozornite scény používateľského rozhrania na obnovenie.
5

Množné číslo a zástupné symboly

Godot spracúva množné číslo cez formy v súboroch PO. Každý jazyk definuje vlastný vzorec v hlavičke PO. Operátor % z GDScript spracúva pozičné zástupné symboly (%s pre reťazce, %d pre celé čísla). Pre pomenované zástupné symboly použite 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))
Nikdy nezapisujte logiku množného čísla napevno ako 'if count == 1'. Jazyky majú veľmi odlišné pravidlá: angličtina má 2 formy, ruština 3, arabčina 6 a japončina 1. Výber nechajte automaticky spracovať systém množného čísla PO. Súbory CSV množné číslo nepodporujú — pre takýto obsah použite PO.
6

Záložné písma pre CJK, arabčinu a ďalšie

Primárne písmo hry pravdepodobne neobsahuje glyfy pre japončinu, kórejčinu, čínštinu, arabčinu alebo thajčinu. Godot 4.x podporuje reťazce záložných písiem — keď v primárnom písme chýba glyf, Godot postupne kontroluje záložné písma. Bez nich sa nelatinské texty zobrazia ako prázdne štvorce.

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
Použite rodinu písiem Noto od Googlu, ktorá pokrýva takmer všetky písma Unicode. Ako záložné pridajte Noto Sans JP, Noto Sans KR, Noto Sans SC a Noto Sans Arabic. Pri hrách s pixelovou grafikou zvážte Noto Sans Mono alebo bitmapové písma s podmnožinami CJK. Sledujte celkovú veľkosť — úplné písma CJK môžu mať každé 15-20 MB.
7

Lokalizácia scén a používateľského rozhrania

Scény Godot môžete lokalizovať tromi spôsobmi: prekladom v _ready() pomocou tr(), vlastnosťou Auto Translate v editore alebo načítaním úplne odlišných scén pre jazyky vyžadujúce iné rozloženie, napríklad 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 funguje iba na vlastnosti text uzla. Ak text nastavíte dynamicky v kóde po _ready(), automatický preklad sa prepíše. Dynamicky aktualizovaný text vždy prekladajte explicitne pomocou tr(). Automatický preklad navyše použije tr() na doslovnú hodnotu text, preto musí vlastnosť obsahovať kľúč prekladu, nie čitateľný zdrojový text.
8

Inteligentná záložná lokalita s LocaleChain

TranslationServer v Godote pri chýbajúcom regionálnom variante prejde priamo na predvolenú lokalitu projektu. Hráč pt-BR s prekladmi iba pt-PT uvidí angličtinu namiesto portugalčiny. LocaleChain to rieši zlúčením prekladov z konfigurovateľných záložných reťazcov do TranslationServer pri konfigurácii.

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 doplnok v čistom GDScript — bez natívnych rozšírení a úprav enginu. Nainštalujte ho z Godot AssetLib alebo skopírujte priečinok addons/locale_chain/ do projektu. Funguje so súbormi CSV, PO a .translation.
9

Automatizujte preklady hry

Po nastavení lokalizácie prekladajte súbory CSV alebo PO pomocou AI. Automatizujte preklady herných reťazcov, textov používateľského rozhrania, opisov predmetov a dialógov priamo z IDE alebo pipeline 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
Prekladajte priebežne. Po pridaní nových kľúčov do zdrojového súboru preložte iba rozdiel namiesto opätovného vytvorenia všetkého. Zachováte preklady príbehových dialógov a kultúrne citlivého obsahu skontrolované človekom.

Automatizujte kontrolu kvality prekladov

Pomocou i18n-validate odhaľte chýbajúce kľúče a poškodené zástupné symboly ešte pred vydaním. Používateľské rozhranie otestujte pseudoprekladmi z i18n-pseudo pred príchodom skutočných prekladov.

Časté problémy

Prekladové súbory neboli importované

Godot musí pred použitím importovať súbory .csv a .po. Ak sa preklady nezobrazujú, skontrolujte ich uvedenie v Project Settings > Localization > Translations. Pri CSV overte, že Godot vytvoril súbory .translation v priečinku .godot/imported/.

Hodnoty CSV s čiarkami alebo úvodzovkami narúšajú spracovanie

Hodnoty s čiarkami musia byť v dvojitých úvodzovkách. Dvojité úvodzovky v hodnotách zapíšte ako "". Chýbajúca úvodzovka spôsobí nesprávne spracovanie celého riadka a často potichu posunie všetky nasledujúce stĺpce.

Text CJK alebo arabský text zobrazuje prázdne štvorce

Primárne písmo neobsahuje glyfy pre tieto písma. Pridajte záložné písma v prostriedku Theme alebo LabelSettings. Bez nich sa chýbajúce glyfy zobrazia ako prázdne obdĺžniky. Pre široké pokrytie Unicode použite varianty Noto Sans.

Nesprávny počet foriem množného čísla v hlavičke PO

Ak hodnota nplurals v hlavičke PO nezodpovedá skutočnému počtu položiek msgstr, Godot môže zlyhať alebo zobraziť nesprávnu formu. Vždy overte zhodu hlavičky Plural-Forms so špecifikáciou CLDR každého cieľového jazyka.

Kód prepísal automatický preklad

Nastavenie vlastnosti text uzla v GDScript po _ready() prepíše výsledok automatického prekladu. Buď používajte iba automatický preklad (text nastavte v editore, nikdy v kóde) alebo výhradne tr() v kóde. Ich kombinácia vedie k nekonzistentnému správaniu.

Odporúčaná štruktúra projektu

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

Vyskúšajte i18n Agent teraz

Potiahnite súbor na preklad sem

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

alebo kliknite a vyberte súbor

Cieľové jazyky

Bez registrácieOkamžitý odhad

Záložná lokalita s locale-chain-godot

Keď chýba kľúč prekladu v regionálnej lokalite, ako je pl_PL, Godot prejde priamo na predvolenú lokalitu projektu namiesto toho, aby najprv skontroloval nadradenú lokalitu 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"],
})

V našom sprievodcovi záložnými lokalitami nájdete úplný zoznam podporovaných frameworkov a 75 vstavaných reťazcov. Learn more →

Často kladené otázky o lokalizácii Godot