
Ang Kumpletong Gabay sa Lokalizasyon ng Larong Godot
Mula TranslationServer hanggang font fallback: i-localize ang inyong Godot game gamit ang CSV, PO file, GDScript, at automated AI translation.
Mga Batayan ng TranslationServer
Ang built-in na TranslationServer ng Godot ang sentro ng localization system. Nilo-load nito ang mga translation resource sa startup at nireresolba ang mga key sa pamamagitan ng tr() function. Bawat GDScript call sa tr() ay dumadaan sa TranslationServer — walang karagdagang library na kailangan.
# 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)Mga CSV Translation File
Pinakasimple ang CSV na format para sa mga salin sa Godot. Isang file ang naglalaman ng lahat ng wika sa mga column. Ang unang column ang key, at ang bawat kasunod na column ay isang locale. Awtomatikong ini-import ng Godot ang mga .csv file at nagge-generate ng .translation resource.
# 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 filesMga PO / Gettext Translation File
Ang mga PO (Portable Object) file ang industry standard para sa software localization. May native na suporta ang Godot 4.x para sa PO, kasama ang plurals, context disambiguation, at mga komento ng tagasalin. Gumawa ng tig-isang .po file kada wika sa isang locale/ directory.
# 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)Paggamit ng Pagsasalin sa GDScript
Gamitin ang tr() kahit saan sa GDScript para magsalin ng mga string. Pagsamahin ito sa % operator ng GDScript para sa string formatting. Para sa matibay na pamamahala ng locale, gumawa ng Autoload script na humahawak ng locale detection, persistence, at paglipat-lipat gamit ang signals.
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()Mga Plural at Placeholder
Hinahawakan ng Godot ang plurals sa pamamagitan ng plural forms ng PO file. Bawat wika ay nagtatakda ng sarili nitong plural formula sa PO header. Hinahawakan ng % operator ng GDScript ang positional placeholders (%s para sa mga string, %d para sa mga integer). Para sa named placeholders, gamitin ang 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))Mga Font Fallback para sa CJK, Arabic, at Iba Pa
Malamang na hindi kasama sa pangunahing font ng inyong laro ang mga glyph para sa Japanese, Korean, Chinese, Arabic, o Thai na mga script. Sinusuportahan ng Godot 4.x ang font fallback chains — kapag nawawala ang glyph sa primary font, sinusuri ng Godot ang mga fallback font ayon sa pagkakasunod. Kung wala ito, magre-render ang non-Latin na text bilang mga walang laman na parisukat.
# 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_RTLPag-localize ng Scene at UI
May tatlong paraan para i-localize ang mga Godot scene: magsalin sa _ready() gamit ang tr(), gamitin ang Auto Translate property sa editor, o mag-load ng ganap na magkakaibang mga scene para sa mga wikang nangangailangan ng ibang layout (tulad ng mga RTL language).
# 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())Smart Locale Fallback gamit ang LocaleChain
Direktang nagfa-fallback ang TranslationServer ng Godot sa default locale ng proyekto kapag nawawala ang isang regional variant. Kaya kung pt-BR ang player at pt-PT lang ang available na translation, English ang makikita niya imbes na Portuguese. Inaayos ito ng LocaleChain sa pamamagitan ng pag-merge ng mga translation mula sa configurable na fallback chain papunta sa TranslationServer sa oras ng pag-configure.
# 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()I-automate ang Pagsasalin ng Laro
Kapag kumpleto na ang inyong localization setup, isalin ang inyong mga CSV o PO file gamit ang AI. I-automate ang pagsasalin ng mga game string, UI text, item description, at dialog — direkta mula sa inyong IDE o CI/CD pipeline.
# 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 headersI-automate ang Kalidad ng Pagsasalin
Mga Karaniwang Pitfall
Hindi Nai-import ang Mga Translation File
Nasisisira ang Parsing Dahil sa Mga CSV Value na May Comma o Quote
Nagpapakita ng Mga Walang Laman na Parisukat ang CJK o Arabic na Text
Maling Bilang ng Plural Form sa PO Header
Na-ooverride ng Code ang Auto Translate
Inirerekomendang 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.cfgMagsalin din ng:
Subukan ang i18n Agent Ngayon
I-drop dito ang inyong translation file
JSON, YAML, PO, XML, CSV, Markdown, Properties
o i-click para mag-browse
Mga target language
Locale Fallback gamit ang locale-chain-godot
Kapag nawawala ang translation key sa isang regional locale tulad ng pl_PL, diretso nang tumatalon ang Godot sa default locale ng proyekto sa halip na suriin muna ang parent locale na pl.
# I-install mula sa Godot Asset Library
# Hanapin: locale-chain-godotvar lc = LocaleChain.new()
lc.configure({
"pl": ["pl_PL", "en"],
"pt_BR": ["pt", "en"],
"zh_Hant_HK": ["zh_Hant", "zh", "en"],
})Tingnan ang aming Locale Fallback Guide para sa buong listahan ng mga sinusuportahang framework at 75 built-in na chain. Learn more →