Skip to main content

Kompletny przewodnik po lokalizacji gier w Godot

Od TranslationServer po czcionki rezerwowe: lokalizuj gry w Godot za pomocą CSV, plików PO, GDScript i automatycznych tłumaczeń AI.

1

Podstawy TranslationServer

Wbudowany TranslationServer stanowi rdzeń systemu lokalizacji Godot. Wczytuje zasoby tłumaczeń podczas uruchamiania i rozwiązuje klucze przez funkcję tr(). Każde wywołanie tr() w GDScript przechodzi przez TranslationServer — dodatkowe biblioteki nie są potrzebne.

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 obsługuje formaty CSV, PO (Gettext) i .translation (binarny). Automatycznie wykrywa ustawienia regionalne systemu przez OS.get_locale() i wybiera pasujący zasób tłumaczeń. W dowolnym momencie można nadpisać język za pomocą TranslationServer.set_locale().
2

Pliki tłumaczeń CSV

CSV to najprostszy format tłumaczeń w Godot. Jeden plik przechowuje wszystkie języki w kolumnach. Pierwsza kolumna zawiera klucz, a każda następna — język. Godot automatycznie importuje pliki .csv i generuje zasoby .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
Wartości zawierające przecinki lub podziały wierszy umieszczaj w podwójnych cudzysłowach. Podwójne cudzysłowy wewnątrz wartości zapisuj jako "". Klucze powinny być krótkie i opisowe: MENU_START jest lepsze niż menu_start_button_text_label.
3

Pliki tłumaczeń PO / Gettext

Pliki PO (Portable Object) są branżowym standardem lokalizacji oprogramowania. Godot 4.x natywnie obsługuje PO wraz z liczbą mnogą, rozróżnianiem kontekstu i komentarzami dla tłumaczy. Utwórz po jednym pliku .po dla każdego języka w katalogu 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)
Pliki PO obsługują msgctxt do rozróżniania kontekstu, na przykład 'OPEN' jako czasownik lub przymiotnik, msgid_plural dla liczby mnogiej oraz komentarze tłumaczy (wiersze #.), które wyjaśniają miejsce i sposób użycia tekstu.
4

Korzystanie z tłumaczeń w GDScript

Używaj tr() w dowolnym miejscu GDScript do tłumaczenia tekstów. Połącz je z operatorem % języka GDScript do formatowania. Aby niezawodnie zarządzać językiem, utwórz skrypt Autoload obsługujący wykrywanie, trwałe przechowywanie i zmianę języka za pomocą sygnałów.

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()
Zmiana języka przez TranslationServer.set_locale() nie aktualizuje automatycznie tekstu już wyrenderowanego w scenach. Po zmianie trzeba ręcznie ponownie zastosować tr() do wszystkich widocznych etykiet, przycisków i węzłów tekstowych. Użyj sygnałów menedżera języka, aby powiadamiać sceny interfejsu o konieczności odświeżenia.
5

Liczba mnoga i symbole zastępcze

Godot obsługuje liczbę mnogą za pomocą form w plikach PO. Każdy język definiuje własny wzór w nagłówku PO. Operator % w GDScript obsługuje pozycyjne symbole zastępcze (%s dla tekstów i %d dla liczb całkowitych). Dla nazwanych symboli użyj 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))
Nigdy nie koduj na stałe logiki takiej jak 'if count == 1'. Reguły językowe znacznie się różnią: angielski ma 2 formy, rosyjski 3, arabski 6, a japoński 1. Pozwól systemowi PO automatycznie wybrać właściwą formę. CSV nie obsługuje liczby mnogiej — używaj PO dla treści, które jej wymagają.
6

Czcionki rezerwowe dla CJK, arabskiego i innych pism

Podstawowa czcionka gry prawdopodobnie nie zawiera glifów dla pisma japońskiego, koreańskiego, chińskiego, arabskiego ani tajskiego. Godot 4.x obsługuje łańcuchy czcionek rezerwowych: gdy brakuje glifu w czcionce podstawowej, sprawdza kolejne czcionki. Bez nich tekst niełaciński jest wyświetlany jako puste kwadraty.

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
Użyj rodziny czcionek Noto firmy Google — obejmuje niemal wszystkie pisma Unicode. Dodaj Noto Sans JP, Noto Sans KR, Noto Sans SC i Noto Sans Arabic jako czcionki rezerwowe. W grach pixel art rozważ Noto Sans Mono lub czcionki bitmapowe z podzbiorami CJK. Pamiętaj o łącznym rozmiarze: pełne czcionki CJK mogą mieć po 15-20 MB.
7

Lokalizacja scen i interfejsu

Sceny Godot można lokalizować na trzy sposoby: tłumaczyć w _ready() za pomocą tr(), używać właściwości Auto Translate w edytorze lub wczytywać całkowicie odmienne sceny dla języków wymagających innego układu, takich jak języki 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 działa tylko dla właściwości text węzła. Ustawienie tekstu dynamicznie w kodzie po _ready() nadpisuje automatyczne tłumaczenie. Dla dynamicznie aktualizowanego tekstu zawsze jawnie używaj tr() w kodzie. Auto Translate stosuje tr() do dosłownej wartości text, dlatego właściwość musi zawierać klucz tłumaczenia, a nie czytelny tekst źródłowy.
8

Inteligentny łańcuch rezerwowy z LocaleChain

Gdy brakuje wariantu regionalnego, TranslationServer w Godot przechodzi bezpośrednio do domyślnego języka projektu. Gracz pt-BR mający tylko tłumaczenia pt-PT widzi angielski zamiast portugalskiego. LocaleChain rozwiązuje ten problem, scalając podczas konfiguracji tłumaczenia z konfigurowalnych łańcuchów w 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 jest dodatkiem napisanym wyłącznie w GDScript — bez natywnych rozszerzeń i modyfikacji silnika. Zainstaluj go z Godot AssetLib lub skopiuj katalog addons/locale_chain/ do projektu. Działa z plikami CSV, PO i .translation.
9

Automatyzacja tłumaczeń gry

Po ukończeniu konfiguracji lokalizacji przetłumacz pliki CSV lub PO za pomocą AI. Zautomatyzuj tłumaczenie tekstów gry, interfejsu, opisów przedmiotów i dialogów bezpośrednio ze środowiska programistycznego lub 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
Tłumacz przyrostowo. Po dodaniu nowych kluczy do pliku źródłowego przetłumacz tylko różnicę zamiast ponownie generować całość. Pozwoli to zachować tłumaczenia dialogów fabularnych i wrażliwych kulturowo treści sprawdzone przez człowieka.

Automatyczna kontrola jakości tłumaczeń

Wykryj brakujące klucze i uszkodzone symbole zastępcze przed wydaniem za pomocą i18n-validate. Przetestuj interfejs przy użyciu pseudotłumaczeń z i18n-pseudo, zanim pojawią się właściwe tłumaczenia.

Częste pułapki

Nie zaimportowano plików tłumaczeń

Godot musi zaimportować pliki .csv i .po, zanim będzie można ich użyć. Jeśli tłumaczenia się nie pojawiają, sprawdź, czy pliki widnieją w Project Settings > Localization > Translations. Dla CSV upewnij się, że Godot wygenerował pliki .translation w katalogu .godot/imported/.

Przecinki lub cudzysłowy w CSV zakłócają analizę

Wartości zawierające przecinki muszą być ujęte w podwójne cudzysłowy. Podwójne cudzysłowy wewnątrz wartości należy zapisać jako "". Brakujący cudzysłów powoduje nieprawidłową analizę całego wiersza i często po cichu przesuwa kolejne kolumny.

Tekst CJK lub arabski wyświetla się jako puste kwadraty

Podstawowa czcionka nie zawiera glifów tych pism. Dodaj czcionki rezerwowe do zasobu Theme lub LabelSettings. Bez nich brakujące glify są wyświetlane jako puste prostokąty. Warianty Noto Sans zapewniają szerokie pokrycie Unicode.

Nieprawidłowa liczba form w nagłówku PO

Jeśli nplurals w nagłówku PO nie odpowiada rzeczywistej liczbie wpisów msgstr, Godot może się zatrzymać lub wyświetlić niewłaściwą formę. Dla każdego języka docelowego sprawdź zgodność Plural-Forms ze specyfikacją CLDR.

Kod nadpisuje Auto Translate

Ustawienie właściwości text węzła w GDScript po _ready() nadpisuje wynik Auto Translate. Używaj wyłącznie Auto Translate (ustaw text w edytorze, nigdy w kodzie) albo wyłącznie tr() w kodzie. Łączenie obu metod prowadzi do niespójnego działania.

Zalecana 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

Wypróbuj i18n Agent

Upuść tutaj plik tłumaczenia

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

lub kliknij, aby go wybrać

Języki docelowe

Rejestracja nie jest wymaganaNatychmiastowa wycena

Łańcuch rezerwowy z locale-chain-godot

Gdy brakuje klucza w regionalnych ustawieniach takich jak pl_PL, Godot od razu przechodzi do domyślnego języka projektu zamiast najpierw sprawdzić nadrzędny język 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"],
})

Zobacz przewodnik po mechanizmach locale fallback, aby poznać pełną listę obsługiwanych frameworków i 75 wbudowanych łańcuchów. Learn more →

Częste pytania o lokalizację Godot