Skip to main content

Išsamus Godot žaidimų lokalizavimo vadovas

Nuo TranslationServer iki atsarginių šriftų: lokalizuokite Godot žaidimą naudodami CSV, PO failus, GDScript ir automatizuotą DI vertimą.

1

TranslationServer pagrindai

Integruotas Godot TranslationServer yra lokalizavimo sistemos branduolys. Jis paleidžiant įkelia vertimo išteklius ir išsprendžia raktus per funkciją tr(). Kiekvienas GDScript tr() iškvietimas eina per TranslationServer – papildomų bibliotekų nereikia.

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 palaiko CSV, PO (Gettext) ir .translation (dvejetainį) formatus. Jis automatiškai aptinka sistemos lokalę per OS.get_locale() ir parenka atitinkamą vertimo išteklių. Lokalę bet kada galite pakeisti su TranslationServer.set_locale().
2

CSV vertimo failai

CSV yra paprasčiausias Godot vertimų formatas. Viename faile visos kalbos pateikiamos stulpeliais. Pirmas stulpelis yra raktas, o kiekvienas paskesnis – lokalė. Godot automatiškai importuoja .csv failus ir generuoja .translation išteklius.

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
Reikšmes su kableliais ar naujomis eilutėmis apgaubkite dvigubomis kabutėmis. Reikšmėse esančias dvigubas kabutes ekranizuokite kaip "". Raktai turi būti trumpi ir aprašomieji: MENU_START geriau nei menu_start_button_text_label.
3

PO / Gettext vertimo failai

PO (Portable Object) failai yra programinės įrangos lokalizavimo sektoriaus standartas. Godot 4.x savaime palaiko PO su daugiskaita, konteksto atskyrimu ir vertėjo komentarais. Kataloge locale/ sukurkite po vieną .po failą kiekvienai kalbai.

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 failai palaiko msgctxt kontekstui atskirti (pvz., angliškas „OPEN“ kaip veiksmažodis ir būdvardis), msgid_plural daugiskaitos formoms ir vertėjo komentarus (#. eilutes), suteikiančius vertėjams kontekstą, kur ir kaip eilutės naudojamos.
4

Vertimo naudojimas GDScript

Eilutėms versti bet kur GDScript naudokite tr(). Eilutėms formatuoti derinkite su GDScript operatoriumi %. Patikimam lokalių valdymui sukurkite Autoload scenarijų, kuris signalais tvarko lokalių aptikimą, išsaugojimą ir keitimą.

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()
Pakeitus lokalę su TranslationServer.set_locale(), scenose jau atvaizduotas tekstas automatiškai neatnaujinamas. Pakeitę lokalę turite rankomis iš naujo pritaikyti tr() visoms matomoms etiketėms, mygtukams ir teksto mazgams. Naudokite lokalių tvarkytuvės signalus, kad UI scenoms praneštumėte atsinaujinti.
5

Daugiskaita ir vietos rezervavimo ženklai

Godot daugiskaitą apdoroja per PO failų daugiskaitos formas. Kiekviena kalba PO antraštėje apibrėžia savo daugiskaitos formulę. GDScript operatorius % apdoroja pozicinius vietos rezervavimo ženklus (%s eilutėms, %d sveikiesiems skaičiams). Vardiniams vietos rezervavimo ženklams naudokite 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))
Niekada tiesiogiai neįrašykite tokios daugiskaitos logikos kaip 'if count == 1'. Kalbų daugiskaitos taisyklės labai skiriasi: anglų kalboje yra 2 formos, rusų – 3, arabų – 6, japonų – 1. Leiskite PO daugiskaitos sistemai parinkti automatiškai. CSV failai daugiskaitos nepalaiko – visam turiniui su daugiskaitos formomis naudokite PO failus.
6

Atsarginiai šriftai CJK, arabų ir kitoms kalboms

Tikėtina, kad pagrindiniame žaidimo šrifte nėra japonų, korėjiečių, kinų, arabų ar tajų rašmenų glifų. Godot 4.x palaiko atsarginių šriftų grandines: kai pagrindiniame šrifte trūksta glifo, Godot eilės tvarka tikrina atsarginius šriftus. Be jų ne lotyniškas tekstas rodomas kaip tušti kvadratai.

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
Naudokite Google Noto šriftų šeimą – ji apima beveik visus Unicode rašmenis. Kaip atsarginius pridėkite Noto Sans JP, Noto Sans KR, Noto Sans SC ir Noto Sans Arabic. Pikselinės grafikos žaidimams apsvarstykite Noto Sans Mono arba rastrinius šriftus su CJK poaibiais. Atsižvelkite į bendrą šriftų dydį: visi CJK šriftai gali užimti po 15-20 MB.
7

Scenų ir UI lokalizavimas

Godot scenoms lokalizuoti yra trys būdai: versti _ready() naudojant tr(), redaktoriuje naudoti ypatybę Auto Translate arba įkelti visiškai skirtingas scenas kalboms, kurioms reikia kitokių maketų (pvz., RTL kalboms).

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 veikia tik mazgo ypatybei text. Jei po _ready() tekstą dinamiškai nustatote kode, automatinis vertimas pakeičiamas. Dinamiškai atnaujinamam tekstui visada aiškiai naudokite tr() kode. Be to, automatinis vertimas pritaiko tr() tiesioginei text reikšmei, todėl ypatybėje text turi būti vertimo raktas, o ne žmonėms skaitoma šaltinio eilutė.
8

Išmani atsarginė lokalė su LocaleChain

Kai nėra regioninio varianto, Godot TranslationServer iškart grįžta prie projekto numatytosios lokalės. pt-BR žaidėjas, turintis tik pt-PT vertimus, mato anglų, o ne portugalų kalbą. LocaleChain tai ištaiso konfigūravimo metu sujungdamas konfigūruojamų atsarginių grandinių vertimus į 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 yra grynas GDScript priedas – jokių savųjų plėtinių ar variklio pakeitimų. Įdiekite jį iš Godot AssetLib arba nukopijuokite aplanką addons/locale_chain/ į projektą. Jis veikia su CSV, PO ir .translation failais.
9

Automatizuoti žaidimo vertimus

Baigę lokalizavimo sąranką išverskite CSV arba PO failus naudodami DI. Automatizuokite žaidimo eilučių, UI teksto, elementų aprašų ir dialogų vertimą tiesiai iš IDE arba CI/CD konvejerio.

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
Verskite palaipsniui. Pridėję naujų raktų prie šaltinio failo išverskite tik skirtumą, o ne generuokite viską iš naujo. Taip išsaugomi žmonių peržiūrėti pasakojimo dialogų ar kultūriškai jautraus turinio vertimai.

Automatizuoti vertimo kokybę

Naudodami i18n-validate prieš išleidimą aptikite trūkstamus raktus ir sugadintus vietos rezervavimo ženklus. Kol dar nėra tikrų vertimų, patikrinkite UI su i18n-pseudo pseudoverstimais.

Dažnos klaidos

Vertimo failai neimportuoti

Kad .csv ir .po failus būtų galima naudoti, Godot turi juos importuoti. Jei vertimai nepasirodo, patikrinkite, ar failai nurodyti Project Settings > Localization > Translations. CSV atveju įsitikinkite, kad Godot sugeneravo .translation failus kataloge .godot/imported/.

CSV reikšmės su kableliais ar kabutėmis sugadina analizę

Reikšmes su kableliais turi būti apgaubtos dvigubomis kabutėmis. Reikšmėse esančios dvigubos kabutės turi būti ekranizuotos kaip "". Trūkstama kabutė sugadina visos eilutės analizę ir dažnai tyliai paslenka visus paskesnius stulpelius.

CJK arba arabų tekstas rodo tuščius kvadratus

Pagrindiniame šrifte nėra šių rašmenų glifų. Pridėkite atsarginius šriftus Theme arba LabelSettings ištekliuje. Be jų trūkstami glifai rodomi kaip tušti stačiakampiai. Visapusiškam Unicode palaikymui naudokite Noto Sans variantus.

Netinkamas daugiskaitos formų skaičius PO antraštėje

Jei PO antraštės nplurals reikšmė neatitinka tikro msgstr įrašų skaičiaus, Godot gali nulūžti arba rodyti netinkamą daugiskaitos formą. Visada patikrinkite, ar Plural-Forms antraštė atitinka kiekvienos tikslinės kalbos CLDR specifikaciją.

Automatinį vertimą pakeičia kodas

Nustačius mazgo ypatybę text GDScript kode po _ready(), automatinio vertimo rezultatas pakeičiamas. Arba naudokite vien automatinį vertimą (nustatykite text redaktoriuje ir niekada kode), arba vien tr() kode. Sumaišius abu būdus elgsena tampa nenuosekli.

Rekomenduojama projekto struktūra

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

Išbandykite i18n Agent dabar

Nuvilkite vertimo failą čia

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

arba spustelėkite norėdami pasirinkti

Tikslinės kalbos

Registruotis nereikiaMomentinis įvertis

Atsarginė lokalė su locale-chain-godot

Kai regioninėje lokalėje, pavyzdžiui, pl_PL, trūksta vertimo rakto, Godot iškart pereina prie projekto numatytosios lokalės, užuot pirmiausia patikrinęs pirminę lokalę 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"],
})

Visą palaikomų sistemų sąrašą ir 75 integruotas grandines rasite mūsų atsarginių lokalių vadove. Learn more →

DUK apie Godot lokalizavimą