Skip to main content

La guida completa alla localizzazione dei giochi Godot

Da TranslationServer ai fallback dei caratteri: localizzi il gioco Godot con CSV, file PO, GDScript e traduzione automatizzata tramite IA.

1

Nozioni di base di TranslationServer

TranslationServer integrato in Godot è il fulcro del sistema di localizzazione. Carica le risorse di traduzione all'avvio e risolve le chiavi tramite la funzione tr(). Ogni chiamata GDScript a tr() passa da TranslationServer: non servono biblioteche aggiuntive.

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 supporta i formati CSV, PO (Gettext) e .translation (binario). Rileva automaticamente la lingua di sistema tramite OS.get_locale() e seleziona la risorsa di traduzione corrispondente. Può sostituire la lingua in qualsiasi momento con TranslationServer.set_locale().
2

File di traduzione CSV

CSV è il formato più semplice per le traduzioni Godot. Un solo file contiene tutte le lingue in colonne. La prima colonna è la chiave e ogni colonna successiva è una lingua. Godot importa automaticamente i file .csv e genera risorse .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
Racchiuda tra virgolette doppie i valori che contengono virgole o interruzioni di riga. Per i valori con virgolette doppie, usi l'escape "". Mantenga le chiavi brevi e descrittive: MENU_START è preferibile a menu_start_button_text_label.
3

File di traduzione PO/Gettext

I file PO (Portable Object) sono lo standard di settore per la localizzazione del software. Godot 4.x offre supporto nativo di PO con plurali, disambiguazione del contesto e commenti per i traduttori. Crei un file .po per ogni lingua in una directory 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)
I file PO supportano msgctxt per disambiguare il contesto (ad esempio, 'OPEN' come verbo o aggettivo), msgid_plural per le forme plurali e commenti per i traduttori (righe #.) che spiegano dove e come vengono usate le stringhe.
4

Uso delle traduzioni in GDScript

Usi tr() ovunque in GDScript per tradurre le stringhe. Lo combini con l'operatore % di GDScript per formattarle. Per una gestione affidabile delle lingue, crei uno script Autoload che gestisca rilevamento, persistenza e cambio tramite segnali.

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()
Cambiare lingua con TranslationServer.set_locale() non aggiorna automaticamente il testo già visualizzato nelle scene. Dopo un cambio, deve riapplicare manualmente tr() a tutte le etichette, i pulsanti e i nodi di testo visibili. Usi i segnali del gestore delle lingue per notificare alle scene dell'interfaccia di aggiornarsi.
5

Plurali e segnaposto

Godot gestisce i plurali tramite le forme plurali dei file PO. Ogni lingua definisce la propria formula nell'intestazione PO. L'operatore % di GDScript gestisce i segnaposto posizionali (%s per le stringhe, %d per gli interi). Per i segnaposto con nome, usi 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))
Non codifichi mai direttamente la logica del plurale, ad esempio 'if count == 1'. Le lingue hanno regole molto diverse: l'inglese ha 2 forme, il russo 3, l'arabo 6 e il giapponese 1. Lasci che il sistema dei plurali PO selezioni automaticamente la forma. I file CSV non supportano i plurali: usi i file PO per tutti i contenuti che richiedono forme plurali.
6

Fallback dei caratteri per CJK, arabo e altre scritture

Il carattere principale del gioco probabilmente non include i glifi delle scritture giapponese, coreana, cinese, araba o thailandese. Godot 4.x supporta catene di fallback dei caratteri: quando manca un glifo nel carattere principale, Godot controlla in ordine quelli di fallback. Senza questa funzione, il testo non latino viene visualizzato come quadrati vuoti.

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
Usi la famiglia di caratteri Noto di Google, che copre quasi tutte le scritture Unicode. Aggiunga Noto Sans JP, Noto Sans KR, Noto Sans SC e Noto Sans Arabic come fallback. Per i giochi con grafica pixel, valuti Noto Sans Mono o caratteri bitmap che includano sottoinsiemi CJK. Consideri le dimensioni totali: i caratteri CJK completi possono occupare 15-20 MB ciascuno.
7

Localizzazione delle scene e dell'interfaccia

Esistono tre approcci per localizzare le scene Godot: tradurre in _ready() tramite tr(), usare la proprietà Auto Translate nell'editor oppure caricare scene completamente diverse per le lingue che richiedono layout differenti, come quelle 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 funziona soltanto sulla proprietà text del nodo. Se imposta il testo dinamicamente nel codice dopo _ready(), la traduzione automatica viene sostituita. Per il testo aggiornato dinamicamente, usi sempre tr() in modo esplicito nel codice. Tenga inoltre presente che la traduzione automatica applica tr() al valore letterale di text: la proprietà deve quindi contenere la chiave di traduzione, non la stringa di origine leggibile.
8

Fallback intelligente con LocaleChain

TranslationServer di Godot passa direttamente alla lingua predefinita del progetto quando manca una variante regionale. Un giocatore pt-BR con sole traduzioni pt-PT vede l'inglese anziché il portoghese. LocaleChain risolve il problema unendo in TranslationServer le traduzioni di catene di fallback configurabili al momento della configurazione.

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 è un componente aggiuntivo GDScript puro, senza estensioni native né modifiche al motore. Lo installi da Godot AssetLib oppure copi la cartella addons/locale_chain/ nel progetto. Funziona con file CSV, PO e .translation.
9

Automatizzare le traduzioni dei giochi

Dopo aver completato la configurazione della localizzazione, traduca i file CSV o PO con l'IA. Automatizzi la traduzione delle stringhe del gioco, del testo dell'interfaccia, delle descrizioni degli oggetti e dei dialoghi, direttamente dall'IDE o dalla 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
Traduca in modo incrementale. Quando aggiunge nuove chiavi al file di origine, traduca soltanto il diff anziché rigenerare tutto. In questo modo preserva le traduzioni revisionate da persone per i dialoghi narrativi o i contenuti culturalmente sensibili.

Automatizzare la qualità

Con i18n-validate, rilevi chiavi mancanti e segnaposto non validi prima del rilascio. Testi l'interfaccia con le pseudotraduzioni di i18n-pseudo prima che arrivino le traduzioni reali.

Problemi comuni

File di traduzione non importati

Godot deve importare i file .csv e .po prima di poterli usare. Se le traduzioni non appaiono, controlli che i file siano elencati in Project Settings > Localization > Translations. Per CSV, verifichi che Godot abbia generato file .translation nella directory .godot/imported/.

I valori CSV con virgole o virgolette impediscono l'analisi

I valori che contengono virgole devono essere racchiusi tra virgolette doppie. Nei valori con virgolette doppie, queste devono essere sottoposte a escape come "". Una virgoletta mancante causa l'analisi errata dell'intera riga, spesso spostando silenziosamente tutte le colonne successive.

Il testo CJK o arabo mostra quadrati vuoti

Il carattere principale non include i glifi di queste scritture. Aggiunga caratteri di fallback nella risorsa Theme o LabelSettings. Senza fallback, i glifi mancanti vengono visualizzati come rettangoli vuoti. Usi le varianti Noto Sans per una copertura Unicode completa.

Numero errato di forme plurali nell'intestazione PO

Se il valore nplurals nell'intestazione PO non corrisponde al numero effettivo di voci msgstr, Godot potrebbe arrestarsi in modo anomalo o mostrare la forma plurale errata. Verifichi sempre che l'intestazione Plural-Forms corrisponda alla specifica CLDR di ogni lingua di destinazione.

Auto Translate sostituito dal codice

Impostare la proprietà text di un nodo in GDScript dopo _ready() sostituisce il risultato della traduzione automatica. Usi esclusivamente la traduzione automatica, impostando text nell'editor e mai nel codice, oppure esclusivamente tr() nel codice. Combinare i due approcci causa un comportamento incoerente.

Struttura del progetto consigliata

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

Provi subito i18n Agent

Trascinare qui il file di traduzione

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

oppure fare clic per selezionarlo

Lingue di destinazione

Nessuna registrazione richiestaPreventivo immediato

Fallback della lingua con locale-chain-godot

Quando manca una chiave di traduzione in una lingua regionale come pl_PL, Godot passa direttamente alla lingua predefinita del progetto anziché controllare prima la lingua principale 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"],
})

Consultare la Guida al fallback delle lingue per l'elenco completo dei framework supportati e delle 75 catene integrate. Learn more →

Domande frequenti sulla localizzazione di Godot