Skip to main content

Pilnīgs Godot spēļu lokalizācijas ceļvedis

No TranslationServer līdz fontu atkāpšanai: lokalizējiet Godot spēli ar CSV, PO failiem, GDScript un automatizētu MI tulkošanu.

1

TranslationServer pamati

Godot iebūvētais TranslationServer ir lokalizācijas sistēmas kodols. Tas palaišanas laikā ielādē tulkošanas resursus un atrisina atslēgas ar funkciju tr(). Katrs GDScript tr() izsaukums iet caur TranslationServer — papildu bibliotēkas nav vajadzīgas.

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 atbalsta CSV, PO (Gettext) un .translation (bināro) formātu. Tas automātiski nosaka sistēmas lokalizāciju ar OS.get_locale() un izvēlas atbilstošo tulkošanas resursu. Lokalizāciju jebkurā laikā varat pārrakstīt ar TranslationServer.set_locale().
2

CSV tulkošanas faili

CSV ir vienkāršākais Godot tulkojumu formāts. Vienā failā visas valodas ir kolonnās. Pirmā kolonna ir atslēga, bet katra nākamā — lokalizācija. Godot automātiski importē .csv failus un ģenerē .translation resursus.

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
Vērtības ar komatiem vai jaunām rindām ietveriet dubultpēdiņās. Vērtībās esošās dubultpēdiņas ekranējiet kā "". Atslēgām jābūt īsām un aprakstošām: MENU_START ir labāks par menu_start_button_text_label.
3

PO / Gettext tulkošanas faili

PO (Portable Object) faili ir programmatūras lokalizācijas nozares standarts. Godot 4.x tieši atbalsta PO ar daudzskaitli, konteksta nošķiršanu un tulkotāju komentāriem. Direktorijā locale/ izveidojiet vienu .po failu katrai valodai.

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 faili atbalsta msgctxt konteksta nošķiršanai (piemēram, angļu „OPEN“ kā darbības vārdu un īpašības vārdu), msgid_plural daudzskaitļa formām un tulkotāju komentārus (#. rindas), kas sniedz tulkotājiem kontekstu par virkņu lietojumu.
4

Tulkošanas lietošana GDScript

Virkņu tulkošanai jebkur GDScript izmantojiet tr(). Virkņu formatēšanai apvienojiet ar GDScript operatoru %. Uzticamai lokalizāciju pārvaldībai izveidojiet Autoload skriptu, kas ar signāliem apstrādā lokalizāciju noteikšanu, saglabāšanu un pārslēgšanu.

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()
Mainot lokalizāciju ar TranslationServer.set_locale(), ainās jau atveidotais teksts netiek atjaunināts automātiski. Pēc lokalizācijas maiņas tr() manuāli jāpiemēro no jauna visām redzamajām etiķetēm, pogām un teksta mezgliem. Izmantojiet lokalizāciju pārvaldnieka signālus, lai paziņotu UI ainām par atsvaidzināšanu.
5

Daudzskaitlis un vietturi

Godot daudzskaitli apstrādā ar PO failu daudzskaitļa formām. Katra valoda PO galvenē definē savu daudzskaitļa formulu. GDScript operators % apstrādā pozicionālos vietturus (%s virknēm, %d veseliem skaitļiem). Nosauktiem vietturiem izmantojiet 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))
Nekad tieši neierakstiet tādu daudzskaitļa loģiku kā 'if count == 1'. Valodu daudzskaitļa kārtulas krasi atšķiras: angļu valodā ir 2 formas, krievu — 3, arābu — 6, japāņu — 1. Ļaujiet PO daudzskaitļa sistēmai izvēlēties automātiski. CSV faili daudzskaitli neatbalsta — visam saturam ar daudzskaitļa formām izmantojiet PO failus.
6

Fontu atkāpšanās CJK, arābu un citām valodām

Visticamāk, spēles galvenajā fontā nav japāņu, korejiešu, ķīniešu, arābu vai taju rakstības glifu. Godot 4.x atbalsta fontu atkāpšanās ķēdes: ja galvenajā fontā trūkst glifa, Godot secīgi pārbauda atkāpšanās fontus. Bez tiem teksts ārpus latīņu alfabēta tiek rādīts kā tukši kvadrāti.

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
Izmantojiet Google Noto fontu saimi — tā aptver gandrīz visas Unicode rakstības. Kā atkāpšanās fontus pievienojiet Noto Sans JP, Noto Sans KR, Noto Sans SC un Noto Sans Arabic. Pikseļgrafikas spēlēm apsveriet Noto Sans Mono vai bitkartes fontus ar CJK apakškopām. Ņemiet vērā kopējo fontu lielumu: pilni CJK fonti var aizņemt 15-20 MB katrs.
7

Ainu un UI lokalizācija

Godot ainu lokalizēšanai ir trīs pieejas: tulkot _ready() ar tr(), redaktorā izmantot rekvizītu Auto Translate vai ielādēt pilnīgi atšķirīgas ainas valodām, kam vajadzīgi citi izkārtojumi (piemēram, RTL valodām).

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 darbojas tikai mezgla rekvizītam text. Ja pēc _ready() tekstu dinamiski iestatāt kodā, automātiskais tulkojums tiek pārrakstīts. Dinamiski atjaunināmam tekstam vienmēr skaidri izmantojiet tr() kodā. Turklāt automātiskā tulkošana piemēro tr() burtiskajai text vērtībai, tādēļ rekvizītā text jābūt tulkojuma atslēgai, nevis cilvēkiem lasāmai avota virknei.
8

Vieda lokalizācijas atkāpšanās ar LocaleChain

Ja trūkst reģionālā varianta, Godot TranslationServer uzreiz atkāpjas uz projekta noklusējuma lokalizāciju. pt-BR spēlētājs, kam ir tikai pt-PT tulkojumi, redz angļu, nevis portugāļu valodu. LocaleChain to novērš, konfigurēšanas laikā sapludinot konfigurējamu atkāpšanās ķēžu tulkojumus 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 ir tīrs GDScript papildinājums — bez vietējiem paplašinājumiem vai dzinēja izmaiņām. Instalējiet to no Godot AssetLib vai nokopējiet mapi addons/locale_chain/ projektā. Tas darbojas ar CSV, PO un .translation failiem.
9

Automatizēt spēles tulkojumus

Kad lokalizācijas iestatīšana ir pabeigta, tulkojiet CSV vai PO failus ar MI. Automatizējiet spēles virkņu, UI teksta, vienumu aprakstu un dialogu tulkošanu tieši no IDE vai CI/CD konveijera.

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
Tulkojiet pakāpeniski. Pievienojot avota failam jaunas atslēgas, tulkojiet tikai izmaiņas, nevis ģenerējiet visu no jauna. Tas saglabā cilvēku pārskatītos stāstījuma dialogu vai kultūras ziņā jutīga satura tulkojumus.

Automatizēt tulkojumu kvalitāti

Ar i18n-validate pirms izlaišanas atrodiet trūkstošās atslēgas un bojātos vietturus. Kamēr īstie tulkojumi vēl nav gatavi, pārbaudiet UI ar i18n-pseudo pseidotulkojumiem.

Biežākās kļūdas

Tulkošanas faili nav importēti

Lai .csv un .po failus varētu izmantot, Godot tie jāimportē. Ja tulkojumi neparādās, pārbaudiet, vai faili ir norādīti Project Settings > Localization > Translations. CSV gadījumā pārliecinieties, ka Godot ir ģenerējis .translation failus direktorijā .godot/imported/.

CSV vērtības ar komatiem vai pēdiņām sabojā parsēšanu

Vērtības ar komatiem jāietver dubultpēdiņās. Vērtībās esošās dubultpēdiņas jāekranē kā "". Trūkstoša pēdiņa sabojā visas rindas parsēšanu un bieži klusām nobīda visas nākamās kolonnas.

CJK vai arābu teksts rāda tukšus kvadrātus

Galvenajā fontā nav šo rakstību glifu. Pievienojiet atkāpšanās fontus Theme vai LabelSettings resursā. Bez tiem trūkstošie glifi tiek rādīti kā tukši taisnstūri. Visaptverošam Unicode atbalstam izmantojiet Noto Sans variantus.

Nepareizs daudzskaitļa formu skaits PO galvenē

Ja PO galvenes nplurals vērtība neatbilst faktiskajam msgstr ierakstu skaitam, Godot var avarēt vai rādīt nepareizu daudzskaitļa formu. Vienmēr pārbaudiet, vai Plural-Forms galvene atbilst katras mērķa valodas CLDR specifikācijai.

Automātisko tulkošanu pārraksta kods

Iestatot mezgla rekvizītu text GDScript kodā pēc _ready(), automātiskā tulkojuma rezultāts tiek pārrakstīts. Vai nu izmantojiet tikai automātisko tulkošanu (iestatiet text redaktorā un nekad kodā), vai tikai tr() kodā. Abu sajaukšana rada nekonsekventu uzvedību.

Ieteicamā projekta 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

Izmēģiniet i18n Agent tūlīt

Nometiet tulkošanas failu šeit

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

vai noklikšķiniet, lai izvēlētos

Mērķa valodas

Reģistrācija nav vajadzīgaTūlītēja tāme

Lokalizācijas atkāpšanās ar locale-chain-godot

Ja reģionālajā lokalizācijā, piemēram, pl_PL, trūkst tulkojuma atslēgas, Godot uzreiz pāriet uz projekta noklusējuma lokalizāciju, nevis vispirms pārbauda vecāklokalizāciju 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"],
})

Pilnu atbalstīto sistēmu sarakstu un 75 iebūvētās ķēdes skatiet mūsu lokalizāciju atkāpšanās ceļvedī. Learn more →

Bieži uzdotie jautājumi par Godot lokalizāciju