Skip to main content

Komplett guide till spellokalisering i Godot

Från TranslationServer till reservteckensnitt: lokalisera ditt Godot-spel med CSV, PO-filer, GDScript och automatiserad AI-översättning.

1

Grunderna i TranslationServer

Godots inbyggda TranslationServer är kärnan i lokaliseringssystemet. Den läser in översättningsresurser vid start och löser nycklar genom funktionen tr(). Varje anrop till tr() i GDScript går genom TranslationServer – inga extra bibliotek behövs.

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 stöder formaten CSV, PO (Gettext) och .translation (binärt). Den identifierar automatiskt systemspråket via OS.get_locale() och väljer den matchande översättningsresursen. Du kan när som helst åsidosätta språkversionen med TranslationServer.set_locale().
2

CSV-översättningsfiler

CSV är det enklaste formatet för Godot-översättningar. En fil innehåller alla språk i kolumner. Den första kolumnen är nyckeln och varje efterföljande kolumn är en språkversion. Godot importerar .csv-filer automatiskt och genererar .translation-resurser.

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
Omslut värden som innehåller kommatecken eller radbrytningar med dubbla citattecken. Dubbla citattecken i värden skrivs som "". Håll nycklarna korta och beskrivande: MENU_START är bättre än menu_start_button_text_label.
3

PO-/Gettext-översättningsfiler

PO-filer (Portable Object) är branschstandard för programvarulokalisering. Godot 4.x har inbyggt PO-stöd med pluralformer, kontextbaserad särskiljning och översättarkommentarer. Skapa en .po-fil per språk i katalogen 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-filer stöder msgctxt för kontextbaserad särskiljning (till exempel 'OPEN' som verb respektive adjektiv), msgid_plural för pluralformer och översättarkommentarer (#.-rader) som förklarar var och hur strängarna används.
4

Använd översättningar i GDScript

Använd tr() var som helst i GDScript för att översätta strängar. Kombinera funktionen med GDScripts %-operator för strängformatering. Skapa ett Autoload-skript som hanterar identifiering, lagring och byte av språkversion med signaler för robust språkversionshantering.

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 du ändrar språkversionen med TranslationServer.set_locale() uppdateras inte text som redan har renderats i scenerna automatiskt. Du måste tillämpa tr() på nytt för alla synliga etiketter, knappar och textnoder efter ett språkversionsbyte. Använd signaler från språkversionshanteraren för att meddela gränssnittsscenerna att de ska uppdateras.
5

Pluralformer och platshållare

Godot hanterar pluralformer genom pluralformer i PO-filer. Varje språk definierar sin egen pluralformel i PO-filhuvudet. GDScripts %-operator hanterar positionsbaserade platshållare (%s för strängar och %d för heltal). Använd String.replace() för namngivna platshållare.

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))
Hårdkoda aldrig plurallogik som 'if count == 1'. Språk har mycket olika pluralregler: engelska har 2 former, ryska har 3, arabiska har 6 och japanska har 1. Låt PO-systemet välja rätt pluralform automatiskt. CSV-filer stöder inte pluralformer – använd PO-filer för allt innehåll som behöver pluralformer.
6

Reservteckensnitt för CJK, arabiska med mera

Spelets primära teckensnitt innehåller troligen inte tecken för japanska, koreanska, kinesiska, arabiska eller thailändska skriftsystem. Godot 4.x stöder kedjor med reservteckensnitt – när ett tecken saknas i det primära teckensnittet kontrollerar Godot reservteckensnitten i ordning. Utan dessa visas icke-latinsk text som tomma rutor.

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
Använd Googles teckensnittsfamilj Noto – den omfattar nästan alla Unicode-skriftsystem. Lägg till Noto Sans JP, Noto Sans KR, Noto Sans SC och Noto Sans Arabic som reservteckensnitt. För pixelgrafikspel kan du överväga Noto Sans Mono eller bitmappsteckensnitt som innehåller CJK-deluppsättningar. Tänk på den sammanlagda teckensnittsstorleken – fullständiga CJK-teckensnitt kan vara 15-20 MB vardera.
7

Lokalisera scener och användargränssnitt

Det finns tre sätt att lokalisera Godot-scener: översätt i _ready() med tr(), använd egenskapen Auto Translate i redigeraren eller läs in helt olika scener för språk som behöver andra layouter, exempelvis RTL-språk.

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 fungerar bara för nodens text-egenskap. Om du anger text dynamiskt i koden efter _ready() åsidosätts den automatiska översättningen. Använd alltid tr() uttryckligen i koden för text som uppdateras dynamiskt. Observera också att Auto Translate tillämpar tr() på det bokstavliga textvärdet – text-egenskapen måste därför innehålla översättningsnyckeln, inte den läsbara källsträngen.
8

Smarta reservspråk med LocaleChain

Godots TranslationServer går direkt till projektets standardspråkversion när en regional variant saknas. En pt-BR-spelare med enbart pt-PT-översättningar ser engelska i stället för portugisiska. LocaleChain löser detta genom att sammanfoga översättningar från konfigurerbara reservkedjor i TranslationServer vid konfigureringen.

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 är ett rent GDScript-tillägg – inga systemspecifika tillägg eller ändringar i motorn krävs. Installera det från Godot AssetLib eller kopiera mappen addons/locale_chain/ till ditt projekt. Det fungerar med CSV-, PO- och .translation-filer.
9

Automatisera spelöversättningar

När lokaliseringskonfigurationen är klar kan du översätta dina CSV- eller PO-filer med AI. Automatisera översättningen av spelsträngar, gränssnittstext, objektbeskrivningar och dialog – direkt från utvecklingsmiljön eller CI/CD-pipelinen.

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
Översätt stegvis. När du lägger till nya nycklar i källfilen översätter du bara skillnaden i stället för att generera om allt. Då bevaras översättningar av berättande dialog och kulturellt känsligt innehåll som har granskats av människor.

Automatisera kontrollen av översättningskvalitet

Upptäck saknade nycklar och trasiga platshållare före lansering med i18n-validate. Testa användargränssnittet med pseudoöversättningar via i18n-pseudo innan de riktiga översättningarna är klara.

Vanliga fallgropar

Översättningsfiler har inte importerats

Godot måste importera .csv- och .po-filer innan de kan användas. Om översättningarna inte visas kontrollerar du att filerna finns med i Project Settings > Localization > Translations. För CSV kontrollerar du att Godot har genererat .translation-filer i katalogen .godot/imported/.

CSV-värden med kommatecken eller citattecken förstör parsningen

Värden som innehåller kommatecken måste omslutas med dubbla citattecken. Dubbla citattecken i värden måste skrivas som "". Ett saknat citattecken gör att hela raden parsas fel och ofta förskjuter alla efterföljande kolumner utan att något fel visas.

CJK- eller arabisk text visas som tomma rutor

Det primära teckensnittet saknar tecken för dessa skriftsystem. Lägg till reservteckensnitt i resursen Theme eller LabelSettings. Utan reservteckensnitt visas saknade tecken som tomma rektanglar. Använd Noto Sans-varianter för bred Unicode-täckning.

Fel antal pluralformer i PO-filhuvudet

Om värdet nplurals i PO-filhuvudet inte motsvarar det faktiska antalet msgstr-poster kan Godot krascha eller visa fel pluralform. Kontrollera alltid att rubriken Plural-Forms överensstämmer med CLDR-specifikationen för varje målspråk.

Auto Translate åsidosätts av kod

Om du anger en nods text-egenskap i GDScript efter _ready() åsidosätts resultatet från Auto Translate. Använd antingen enbart Auto Translate (ange texten i redigeraren och aldrig i kod) eller enbart tr() i kod. Om de blandas blir beteendet inkonsekvent.

Rekommenderad 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

Prova i18n Agent nu

Släpp din översättningsfil här

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

eller klicka för att välja en fil

Målspråk

Ingen registrering krävsPrisuppskattning direkt

Reservspråk med locale-chain-godot

När en översättningsnyckel saknas i en regional språkversion som pl_PL går Godot direkt till projektets standardspråkversion i stället för att först kontrollera den överordnade språkversionen 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"],
})

Se vår guide om reservspråk för en fullständig lista över ramverk som stöds och 75 inbyggda kedjor. Learn more →

Vanliga frågor om Godot-lokalisering