Skip to main content

Den komplette vejledning til spillokalisering i Godot

Fra TranslationServer til reserveskrifttyper: Lokalisér dit Godot-spil med CSV, PO-filer, GDScript og automatiseret AI-oversættelse.

1

Grundlæggende om TranslationServer

Godots indbyggede TranslationServer er kernen i lokaliseringssystemet. Den indlæser oversættelsesressourcer ved opstart og slår nøgler op via funktionen tr(). Alle kald til tr() i GDScript går gennem TranslationServer — der kræves ingen ekstra biblioteker.

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 understøtter formaterne CSV, PO (Gettext) og .translation (binært). Den registrerer automatisk systemlandestandarden via OS.get_locale() og vælger den tilsvarende oversættelsesressource. Du kan når som helst tilsidesætte landestandarden med TranslationServer.set_locale().
2

CSV-oversættelsesfiler

CSV er det enkleste format til oversættelser i Godot. Én fil indeholder alle sprog i kolonner. Den første kolonne er nøglen og hver efterfølgende kolonne er en landestandard. Godot importerer automatisk .csv-filer og genererer .translation-ressourcer.

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
Sæt værdier med kommaer eller linjeskift i dobbelte anførselstegn. I værdier med dobbelte anførselstegn skal de escapes som "". Hold nøglerne korte og beskrivende: MENU_START er bedre end menu_start_button_text_label.
3

PO-/Gettext-oversættelsesfiler

PO-filer (Portable Object) er branchestandarden for softwarelokalisering. Godot 4.x har indbygget understøttelse af PO med pluralisformer, kontekstadskillelse og kommentarer til oversættere. Opret én .po-fil pr. sprog i en locale/-mappe.

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-filer understøtter msgctxt til kontekstadskillelse (f.eks. 'OPEN' som udsagnsord kontra tillægsord), msgid_plural til pluralisformer og kommentarer til oversættere (#. lines), som giver kontekst om, hvor og hvordan tekster bruges.
4

Brug af oversættelser i GDScript

Brug tr() overalt i GDScript til at oversætte tekster. Kombinér funktionen med GDScripts %-operator til tekstformatering. Opret et Autoload-script, der håndterer registrering, lagring og skift af landestandard med signaler, for at få robust landestandardstyring.

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()
Når landestandarden ændres med TranslationServer.set_locale(), opdateres tekst, der allerede er gengivet i dine scener, ikke automatisk. Du skal manuelt anvende tr() igen på alle synlige etiketter, knapper og tekstnoder efter et landestandardskift. Brug signaler fra din landestandardstyring til at give brugerfladescener besked om at opdatere.
5

Pluralisformer og pladsholdere

Godot håndterer pluralis via pluralisformerne i PO-filer. Hvert sprog definerer sin egen pluralisformel i PO-headeren. GDScripts %-operator håndterer positionsbestemte pladsholdere (%s til tekst og %d til heltal). Brug String.replace() til navngivne pladsholdere.

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))
Hardkod aldrig pluralislogik som 'if count == 1'. Sprog har vidt forskellige pluralisregler: Engelsk har 2 former, russisk har 3, arabisk har 6 og japansk har 1. Lad PO-systemet til pluralisformer vælge automatisk. CSV-filer understøtter ikke pluralisformer — brug PO-filer til alt indhold, der kræver pluralisformer.
6

Reserveløsninger til skrifttyper for CJK, arabisk med mere

Dit spils primære skrifttype indeholder sandsynligvis ikke glyffer til japansk, koreansk, kinesisk, arabisk eller thai. Godot 4.x understøtter kæder af reserveskrifttyper — når en glyf mangler i den primære skrifttype, kontrollerer Godot reserveskrifttyperne i rækkefølge. Uden dem gengives ikke-latinsk tekst som tomme firkanter.

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
Brug Googles Noto-skrifttypefamilie — den dækker næsten alle Unicode-skriftsystemer. Tilføj Noto Sans JP, Noto Sans KR, Noto Sans SC og Noto Sans Arabic som reserveskrifttyper. Til pixelgrafikspil kan du overveje Noto Sans Mono eller bitmapskrifttyper, der indeholder CJK-undersæt. Husk den samlede skriftstørrelse — komplette CJK-skrifttyper kan fylde 15-20MB hver.
7

Lokalisering af scener og brugerflader

Der er tre måder at lokalisere Godot-scener på: Oversæt i _ready() med tr(), brug egenskaben Auto Translate i editoren eller indlæs helt andre scener til sprog, der kræver forskellige layout (f.eks. RTL-sprog).

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 virker kun på nodens text-egenskab. Hvis du angiver text dynamisk i kode efter _ready(), tilsidesættes den automatiske oversættelse. Brug altid tr() direkte i din kode til tekst, der opdateres dynamisk. Bemærk også, at den automatiske oversættelse anvender tr() på den bogstavelige tekstværdi — text-egenskaben skal derfor indeholde oversættelsesnøglen, ikke den læsbare kildetekst.
8

Intelligent landestandardreserve med LocaleChain

Godots TranslationServer bruger projektets standardlandestandard direkte som reserve, når en regional variant mangler. En pt-BR-spiller med kun pt-PT-oversættelser får vist engelsk i stedet for portugisisk. LocaleChain løser dette ved at flette oversættelser fra konfigurerbare reservekæder ind i TranslationServer under konfigurationen.

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 er et rent GDScript-tilføjelsesprogram — uden integrerede udvidelser eller ændringer af spilmotoren. Installér det fra Godot AssetLib eller kopiér mappen addons/locale_chain/ til dit projekt. Det fungerer med CSV-, PO- og .translation-filer.
9

Automatisér spiloversættelser

Når din lokaliseringsopsætning er klar, kan du oversætte dine CSV- eller PO-filer med AI. Automatisér oversættelsen af spiltekster, brugerfladetekst, genstandsbeskrivelser og dialog — direkte fra dit IDE eller din 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
Oversæt trinvist. Når du tilføjer nye nøgler i din kildefil, skal du kun oversætte forskellen i stedet for at generere alt igen. Så bevares eventuelle oversættelser af fortællende dialog eller kulturelt følsomt indhold, som mennesker har gennemgået.

Automatisér oversættelseskvaliteten

Find manglende nøgler og defekte pladsholdere, før de udgives, med i18n-validate. Test din brugerflade med pseudooversættelser ved hjælp af i18n-pseudo, før de rigtige oversættelser er klar.

Almindelige faldgruber

Oversættelsesfiler importeres ikke

Godot skal importere .csv- og .po-filer, før de kan bruges. Hvis oversættelserne ikke vises, skal du kontrollere, at filerne er angivet under Project Settings > Localization > Translations. For CSV skal du sikre, at Godot har genereret .translation-filer i mappen .godot/imported/.

CSV-værdier med kommaer eller anførselstegn forhindrer korrekt fortolkning

Værdier med kommaer skal sættes i dobbelte anførselstegn. I værdier med dobbelte anførselstegn skal de escapes som "". Et manglende anførselstegn betyder, at hele rækken fortolkes forkert og ofte forskydes alle efterfølgende kolonner uden nogen fejlmeddelelse.

CJK- eller arabisk tekst vises som tomme firkanter

Din primære skrifttype indeholder ikke glyffer til disse skriftsystemer. Tilføj reserveskrifttyper i din Theme- eller LabelSettings-ressource. Uden reserveskrifttyper gengives manglende glyffer som tomme rektangler. Brug varianter af Noto Sans for at få omfattende Unicode-dækning.

Forkert antal pluralisformer i PO-headeren

Hvis værdien nplurals i din PO-header ikke stemmer overens med det faktiske antal msgstr-poster, kan Godot gå ned eller vise den forkerte pluralisform. Kontrollér altid, at headeren Plural-Forms stemmer overens med CLDR-specifikationen for hvert målsprog.

Auto Translate tilsidesættes af kode

Hvis en nodes text-egenskab angives i GDScript efter _ready(), tilsidesættes resultatet fra den automatiske oversættelse. Brug enten kun automatisk oversættelse (angiv text i editoren, aldrig i kode) eller kun tr() i kode. Hvis du blander de to metoder, opstår der uensartet adfærd.

Anbefalet projektstruktur

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

Prøv i18n Agent nu

Slip din oversættelsesfil her

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

eller klik for at vælge en fil

Målsprog

Kræver ingen tilmeldingEstimat med det samme

landestandardreserve med locale-chain-godot

Når en oversættelsesnøgle mangler i en regional landestandard som pl_PL, går Godot direkte til projektets standardlandestandard i stedet for først at kontrollere den overordnede landestandard pl.

Terminal
# Installér fra Godot Asset Library
# Søg: 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"],
})

Se vores vejledning til landestandardreserver for at få den komplette liste over understøttede frameworks og 75 indbyggede kæder. Learn more →

Ofte stillede spørgsmål om lokalisering i Godot