Skip to main content

De complete handleiding voor lokalisatie van Godot-games

Van TranslationServer tot fallbacklettertypen: lokaliseer je Godot-game met CSV, PO-bestanden, GDScript en automatische AI-vertalingen.

1

Basisprincipes van TranslationServer

De ingebouwde TranslationServer van Godot vormt de kern van het lokalisatiesysteem. Deze laadt bij het opstarten vertaalresources en zoekt sleutels op via de functie tr(). Elke aanroep van tr() in GDScript loopt via TranslationServer — extra bibliotheken zijn niet nodig.

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 ondersteunt CSV, PO (Gettext) en .translation (binair). De systeemlocale wordt automatisch gedetecteerd via OS.get_locale(), waarna de bijbehorende vertaalresource wordt geselecteerd. Je kunt de locale op elk moment overschrijven met TranslationServer.set_locale().
2

CSV-vertaalbestanden

CSV is de eenvoudigste indeling voor Godot-vertalingen. Eén bestand bevat alle talen in kolommen. De eerste kolom bevat de sleutel en elke volgende kolom een locale. Godot importeert .csv-bestanden automatisch en genereert .translation-resources.

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
Zet waarden met komma's of regeleinden tussen dubbele aanhalingstekens. Escape dubbele aanhalingstekens in een waarde als "". Houd sleutels kort en beschrijvend: MENU_START is beter dan menu_start_button_text_label.
3

PO-/Gettext-vertaalbestanden

PO-bestanden (Portable Object) zijn de industriestandaard voor softwarelokalisatie. Godot 4.x biedt ingebouwde PO-ondersteuning voor meervoudsvormen, contextonderscheid en opmerkingen voor vertalers. Maak per taal één .po-bestand in de map 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-bestanden ondersteunen msgctxt voor contextonderscheid, bijvoorbeeld 'OPEN' als werkwoord of bijvoeglijk naamwoord, msgid_plural voor meervoudsvormen en opmerkingen voor vertalers (#.-regels) die uitleggen waar en hoe teksten worden gebruikt.
4

Vertalingen gebruiken in GDScript

Gebruik tr() overal in GDScript om teksten te vertalen. Combineer dit met de %-operator van GDScript om teksten op te maken. Maak voor betrouwbaar localebeheer een Autoload-script dat detectie, opslag en wisselen van locales via signalen verwerkt.

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()
Als je de locale wijzigt met TranslationServer.set_locale(), wordt tekst die al in je scènes is gerenderd niet automatisch bijgewerkt. Na een localewijziging moet je tr() handmatig opnieuw toepassen op alle zichtbare labels, knoppen en tekstnodes. Gebruik signalen van je localebeheerder om scènes van de gebruikersinterface te laten vernieuwen.
5

Meervoudsvormen en placeholders

Godot verwerkt meervouden via de meervoudsvormen in PO-bestanden. Elke taal definieert een eigen meervoudsformule in de PO-header. De %-operator van GDScript verwerkt positionele placeholders (%s voor teksten en %d voor gehele getallen). Gebruik String.replace() voor benoemde placeholders.

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))
Codeer meervoudslogica zoals 'if count == 1' nooit hard. Talen hebben sterk uiteenlopende meervoudsregels: Engels heeft 2 vormen, Russisch 3, Arabisch 6 en Japans 1. Laat het meervoudssysteem van PO automatisch de juiste vorm kiezen. CSV-bestanden ondersteunen geen meervoudsvormen — gebruik PO-bestanden voor alle inhoud die deze nodig heeft.
6

Fallbacklettertypen voor CJK, Arabisch en meer

Het primaire lettertype van je game bevat waarschijnlijk geen tekens voor Japanse, Koreaanse, Chinese, Arabische of Thaise schriften. Godot 4.x ondersteunt fallbackketens voor lettertypen. Wanneer een teken in het primaire lettertype ontbreekt, controleert Godot de fallbacklettertypen op volgorde. Zonder deze keten verschijnt niet-Latijnse tekst als lege vierkantjes.

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
Gebruik de Noto-lettertypefamilie van Google, die vrijwel alle Unicode-schriften omvat. Voeg Noto Sans JP, Noto Sans KR, Noto Sans SC en Noto Sans Arabic als fallbacklettertypen toe. Overweeg voor pixelartgames Noto Sans Mono of bitmaplettertypen met CJK-subsets. Let op de totale bestandsgrootte: volledige CJK-lettertypen kunnen elk 15-20 MB groot zijn.
7

Scènes en gebruikersinterfaces lokaliseren

Je kunt Godot-scènes op drie manieren lokaliseren: in _ready() vertalen met tr(), de eigenschap Auto Translate in de editor gebruiken of volledig andere scènes laden voor talen die een andere lay-out nodig hebben, zoals RTL-talen.

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 werkt alleen voor de eigenschap text van de node. Als je na _ready() tekst dynamisch in code instelt, wordt de automatische vertaling overschreven. Gebruik voor dynamisch bijgewerkte tekst altijd expliciet tr() in je code. Houd er ook rekening mee dat Auto Translate tr() toepast op de letterlijke tekstwaarde. De eigenschap text moet daarom de vertaalsleutel bevatten en niet de leesbare brontekst.
8

Slimme locale-fallback met LocaleChain

TranslationServer van Godot valt direct terug op de standaardlocale van het project wanneer een regionale variant ontbreekt. Een pt-BR-speler met alleen pt-PT-vertalingen ziet Engels in plaats van Portugees. LocaleChain lost dit op door tijdens de configuratie vertalingen uit configureerbare fallbackketens samen te voegen in TranslationServer.

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 is een zuivere GDScript-add-on zonder native extensies of aanpassingen aan de engine. Installeer de add-on vanuit Godot AssetLib of kopieer de map addons/locale_chain/ naar je project. LocaleChain werkt met CSV-, PO- en .translation-bestanden.
9

Gamevertalingen automatiseren

Wanneer je lokalisatieconfiguratie gereed is, vertaal je CSV- of PO-bestanden met AI. Automatiseer de vertaling van gameteksten, tekst in de gebruikersinterface, itembeschrijvingen en dialogen, rechtstreeks vanuit je ontwikkelomgeving of 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
Vertaal stapsgewijs. Wanneer je nieuwe sleutels aan het bronbestand toevoegt, vertaal je alleen het verschil in plaats van alles opnieuw te genereren. Zo blijven door mensen beoordeelde vertalingen voor verhalende dialogen of cultureel gevoelige inhoud behouden.

Vertaalkwaliteit automatisch bewaken

Vind ontbrekende sleutels en beschadigde placeholders vóór de release met i18n-validate. Test je gebruikersinterface met pseudovertalingen via i18n-pseudo voordat de echte vertalingen beschikbaar zijn.

Veelvoorkomende valkuilen

Vertaalbestanden zijn niet geïmporteerd

Godot moet .csv- en .po-bestanden importeren voordat ze bruikbaar zijn. Controleer wanneer vertalingen niet verschijnen of de bestanden staan vermeld onder Project Settings > Localization > Translations. Zorg er bij CSV voor dat Godot .translation-bestanden in de map .godot/imported/ heeft gegenereerd.

Komma's of aanhalingstekens in CSV-waarden verstoren het parsen

Waarden met komma's moeten tussen dubbele aanhalingstekens staan. Dubbele aanhalingstekens binnen een waarde moeten als "" worden geëscapet. Eén ontbrekend aanhalingsteken zorgt ervoor dat de hele rij verkeerd wordt geparseerd en verschuift vaak ongemerkt alle volgende kolommen.

CJK- of Arabische tekst verschijnt als lege vierkantjes

Je primaire lettertype bevat geen tekens voor deze schriften. Voeg fallbacklettertypen toe aan je Theme- of LabelSettings-resource. Zonder fallbacks verschijnen ontbrekende tekens als lege rechthoeken. Gebruik varianten van Noto Sans voor uitgebreide Unicode-dekking.

Onjuist aantal meervoudsvormen in de PO-header

Wanneer de waarde nplurals in de PO-header niet overeenkomt met het werkelijke aantal msgstr-items, kan Godot vastlopen of de verkeerde meervoudsvorm tonen. Controleer voor elke doeltaal of de header Plural-Forms overeenkomt met de CLDR-specificatie.

Code overschrijft Auto Translate

Als je de eigenschap text van een node na _ready() in GDScript instelt, wordt het resultaat van Auto Translate overschreven. Gebruik uitsluitend Auto Translate (stel text in de editor in en nooit in code) of uitsluitend tr() in code. Een combinatie leidt tot inconsistent gedrag.

Aanbevolen projectstructuur

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

Probeer i18n Agent nu

Zet je vertaalbestand hier neer

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

of klik om een bestand te selecteren

Doeltalen

Geen registratie nodigDirecte prijsindicatie

Locale-fallback met locale-chain-godot

Wanneer een vertaalsleutel ontbreekt in een regionale locale zoals pl_PL, springt Godot direct naar de standaardlocale van het project in plaats van eerst de bovenliggende locale pl te controleren.

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"],
})

Bekijk onze handleiding voor locale-fallback voor de volledige lijst met ondersteunde frameworks en 75 ingebouwde ketens. Learn more →

Veelgestelde vragen over Godot-lokalisatie