Skip to main content

Kompletní průvodce lokalizací her v Godot

Od TranslationServeru po fallbacky písem: lokalizujte Vaši hru v Godot pomocí CSV, PO souborů, GDScriptu a automatizovaných AI překladů.

1

Základy TranslationServeru

Vestavěný TranslationServer v Godotu je jádrem lokalizačního systému. Načítá překladové zdroje při spuštění a řeší klíče přes funkci tr(). Každé volání tr() v GDScriptu prochází TranslationServerem — nejsou potřeba žádné další knihovny.

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ární). Automaticky detekuje systémové locale přes OS.get_locale() a vybere odpovídající překladový zdroj. Locale můžete kdykoli přepsat pomocí TranslationServer.set_locale().
2

Překladové soubory CSV

CSV je nejjednodušší formát pro překlady v Godotu. Jeden soubor obsahuje všechny jazyky ve sloupcích. První sloupec je klíč a každý další sloupec je locale. Godot soubory .csv automaticky importuje a generuje zdroje .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ící čárky nebo nové řádky uzavřete do dvojitých uvozovek. Dvojité uvozovky uvnitř hodnot escapujte jako "". Klíče udržujte krátké a výstižné: MENU_START je lepší než menu_start_button_text_label.
3

Překladové soubory PO / Gettext

Soubory PO (Portable Object) jsou průmyslovým standardem pro lokalizaci softwaru. Godot 4.x má nativní podporu PO včetně plurálů, kontextového rozlišení a komentářů pro překladatele. Vytvořte jeden soubor .po pro každý jazyk v adresáři 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)
Soubory PO podporují msgctxt pro kontextové rozlišení (např. 'OPEN' jako sloveso vs přídavné jméno), msgid_plural pro množné tvary a komentáře pro překladatele (řádky #.), které poskytují kontext o tom, kde a jak se řetězce používají.
4

Použití překladů v GDScriptu

Používejte tr() kdekoli v GDScriptu pro překlad řetězců. Kombinujte jej s operátorem % v GDScriptu pro formátování řetězců. Pro robustní správu locale vytvořte Autoload skript, který zajistí detekci locale, perzistenci a přepínání pomocí signálů.

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()
Změna locale pomocí TranslationServer.set_locale() automaticky neaktualizuje text, který už byl ve Vašich scénách vykreslen. Po změně locale musíte ručně znovu použít tr() na všech viditelných Labelech, Buttonech a textových uzlech. Použijte signály z Vašeho locale manageru, abyste UI scény upozornili na potřebu obnovy.
5

Plurály a zástupné znaky

Godot zpracovává plurály přes pluralní formy v PO souborech. Každý jazyk definuje vlastní pluralní vzorec v hlavičce PO. Operátor % v GDScriptu zpracovává poziční zástupné znaky (%s pro řetězce, %d pro celá čísla). Pro pojmenované zástupné znaky použijte 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 nehardcodujte pluralizační logiku typu 'if count == 1'. Jazyky mají výrazně odlišná pravidla: angličtina má 2 formy, ruština 3, arabština 6 a japonština 1. Nechte systém plurálů v PO automaticky vybrat správnou formu. CSV soubory plurály nepodporují — pro jakýkoli obsah, který vyžaduje pluralní formy, používejte PO soubory.
6

Fallback fontů pro CJK, arabštinu a další

Primární font Vaší hry nejspíš neobsahuje glyfy pro japonské, korejské, čínské, arabské nebo thajské písmo. Godot 4.x podporuje řetězce fallback fontů — když v primárním fontu chybí glyf, Godot postupně kontroluje fallback fonty v zadaném pořadí. Bez toho se nelatinský text vykreslí jako prázdné čtverečky.

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žijte rodinu fontů Google Noto — pokrývá téměř všechna písma v Unicode. Přidejte Noto Sans JP, Noto Sans KR, Noto Sans SC a Noto Sans Arabic jako fallback fonty. U pixel art her zvažte Noto Sans Mono nebo bitmapové fonty, které obsahují CJK subsety. Myslete na celkovou velikost fontů — plné CJK fonty mohou mít 15-20MB každý.
7

Lokalizace scén a UI

Existují tři přístupy k lokalizaci scén v Godotu: překládat v _ready() pomocí tr(), použít vlastnost Auto Translate v editoru nebo načítat zcela jiné scény pro jazyky, které potřebují odlišné rozvržení (např. RTL jazyky).

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 pouze pro vlastnost text uzlu. Pokud nastavíte text dynamicky v kódu po _ready(), výsledek auto-translate se přepíše. U dynamicky aktualizovaného textu vždy v kódu explicitně používejte tr(). Zároveň platí, že auto-translate aplikuje tr() na doslovnou hodnotu textu — vlastnost text tedy musí obsahovat překladový klíč, ne lidsky čitelný zdrojový řetězec.
8

Chytrý locale fallback s LocaleChain

TranslationServer v Godotu při chybějící regionální variantě překladu fallbackuje přímo na výchozí locale projektu. Hráč s pt-BR, který má k dispozici pouze překlady pt-PT, tak uvidí angličtinu místo portugalštiny. LocaleChain to řeší sloučením překladů z konfigurovatelných fallback řetězců do TranslationServeru při konfiguraci.

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 addon — žádná nativní rozšíření ani úpravy enginu. Nainstalujte jej z Godot AssetLib nebo zkopírujte složku addons/locale_chain/ do projektu. Funguje s CSV, PO i .translation soubory.
9

Automatizujte překlady her

Jakmile máte lokalizaci nastavenou, přeložte své CSV nebo PO soubory pomocí AI. Automatizujte překlad herních řetězců, UI textů, popisů předmětů a dialogů — přímo z Vašeho IDE nebo CI/CD pipeline.

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
Překládejte přírůstkově. Když do zdrojového souboru přidáte nové klíče, přeložte jen diff místo toho, abyste regenerovali vše. Tím zachováte překlady zkontrolované člověkem, například u narativních dialogů nebo kulturně citlivého obsahu.

Automatizujte kvalitu překladu

Zachyťte chybějící klíče a rozbité zástupné znaky ještě před vydáním pomocí i18n-validate. Otestujte UI s pseudo-překlady pomocí i18n-pseudo dřív, než dorazí skutečné překlady.

Běžná úskalí

Překladové soubory nejsou importovány

Godot musí importovat soubory .csv a .po, než je bude možné používat. Pokud se překlady nezobrazují, zkontrolujte, že jsou soubory uvedené v Project Settings > Localization > Translations. U CSV se ujistěte, že Godot vygeneroval soubory .translation v adresáři .godot/imported/.

Hodnoty CSV s čárkami nebo uvozovkami rozbijí parsování

Hodnoty obsahující čárky musí být uzavřeny do dvojitých uvozovek. Hodnoty obsahující dvojité uvozovky je nutné escapovat jako "". Chybějící uvozovka způsobí, že se celý řádek naparsuje nesprávně a často tiše posune všechny následující sloupce.

CJK nebo arabský text se zobrazuje jako prázdné čtverce

Váš primární font neobsahuje glyfy pro tato písma. Přidejte fallback fonty ve Vašem resource Theme nebo LabelSettings. Bez fallbacků se chybějící glyfy vykreslí jako prázdné obdélníky. Použijte varianty Noto Sans pro široké pokrytí Unicode.

Nesprávný počet pluralních forem v hlavičce PO

Pokud hodnota nplurals v hlavičce PO neodpovídá skutečnému počtu položek msgstr, Godot může spadnout nebo zobrazit nesprávnou pluralní formu. Vždy ověřte, že hlavička Plural-Forms odpovídá specifikaci CLDR pro každý cílový jazyk.

Auto Translate přepsáno kódem

Nastavení vlastnosti text uzlu v GDScriptu po _ready() přepíše výsledek auto-translate. Buď používejte výhradně auto-translate (nastavujte text v editoru, nikdy v kódu), nebo v kódu používejte výhradně tr(). Kombinování obou přístupů vede k nekonzistentnímu chování.

Doporučená struktura 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

Vyzkoušejte i18n Agent nyní

Sem přetáhněte svůj překladový soubor

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

nebo klikněte a vyberte soubor

Cílové jazyky

Bez registraceOkamžitý odhad

Locale fallback s locale-chain-godot

Když v regionálním locale, jako je pl_PL, chybí překladový klíč, Godot skočí rovnou na výchozí locale projektu místo toho, aby nejprve zkontroloval nadřazené locale pl.

Terminal
# Nainstalovat z Godot Asset Library
# Hledat: 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"],
})

Podívejte se na náš průvodce Locale Fallback, kde najdete úplný seznam podporovaných frameworků a 75 vestavěných řetězců. Learn more →

Často kladené otázky k lokalizaci v Godotu