
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.
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 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)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
# 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!"# 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 filesPO / 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.
# 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枚のコインを集めました。"# 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)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.
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 — 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()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().
# 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 монет."# 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))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.
# 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)# 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_RTLAinu 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).
# 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())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 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()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.
# 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 headersAutomatizēt tulkojumu kvalitāti
Biežākās kļūdas
Tulkošanas faili nav importēti
CSV vērtības ar komatiem vai pēdiņām sabojā parsēšanu
CJK vai arābu teksts rāda tukšus kvadrātus
Nepareizs daudzskaitļa formu skaits PO galvenē
Automātisko tulkošanu pārraksta kods
Ieteicamā projekta struktūra
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.cfgTulkojiet arī:
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
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.
# Install from Godot Asset Library
# Search: locale-chain-godotvar 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 →