Skip to main content

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.

1

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 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)
Sinusuportahan ng TranslationServer ang CSV, PO (Gettext), at .translation (binary) na format. Awtomatiko nitong nade-detect ang system locale sa pamamagitan ng OS.get_locale() at pinipili ang tumutugmang translation resource. Maaari ninyong i-override ang locale anumang oras gamit ang TranslationServer.set_locale().
2

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
# 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
I-wrap sa double quotes ang mga value na may kuwit o newline. Para sa mga value na may double quote, i-escape ang mga ito bilang "". Panatilihing maikli at deskriptibo ang mga key: mas mabuti ang MENU_START kaysa menu_start_button_text_label.
3

Mga 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.

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)
Sinusuportahan ng mga PO file ang msgctxt para sa context disambiguation (hal., 'OPEN' bilang pandiwa vs pang-uri), msgid_plural para sa plural forms, at mga komento ng tagasalin (mga linyang #.) upang mabigyan ang mga tagasalin ng konteksto kung saan at paano ginagamit ang mga string.
4

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.

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()
Hindi awtomatikong ina-update ng pagpapalit ng locale gamit ang TranslationServer.set_locale() ang text na na-render na sa inyong mga scene. Kailangan ninyong manu-manong i-apply muli ang tr() sa lahat ng nakikitang label, button, at text node pagkatapos magbago ang locale. Gumamit ng signals mula sa inyong locale manager para i-notify ang mga UI scene na mag-refresh.
5

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().

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))
Huwag kailanman i-hardcode ang plural logic tulad ng 'if count == 1'. Malaki ang pagkakaiba-iba ng plural rules ng mga wika: may 2 form ang English, 3 ang Russian, 6 ang Arabic, at 1 ang Japanese. Hayaan ang PO plural system ang awtomatikong pumili. Hindi sinusuportahan ng mga CSV file ang plurals — gumamit ng mga PO file para sa anumang content na nangangailangan ng plural forms.
6

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.

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
Gamitin ang Noto font family ng Google — sumasaklaw ito sa halos lahat ng Unicode script. Idagdag ang Noto Sans JP, Noto Sans KR, Noto Sans SC, at Noto Sans Arabic bilang mga fallback. Para sa mga pixel art game, isaalang-alang ang Noto Sans Mono o mga bitmap font na may CJK subsets. Isaisip ang kabuuang laki ng font — ang mga full CJK font ay maaaring 15-20MB bawat isa.
7

Pag-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).

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())
Gumagana lamang ang Auto Translate sa text property ng node. Kapag nag-set kayo ng text nang dynamic sa code pagkatapos ng _ready(), nao-override ang auto-translate. Para sa text na dynamic na ina-update, laging gamitin ang tr() nang hayagan sa inyong code. Tandaan din na ina-apply ng auto-translate ang tr() sa literal na text value — kaya dapat maglaman ang text property ng translation key, hindi ng human-readable na source string.
8

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 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()
Ang LocaleChain ay pure GDScript addon — walang native extension o pagbabago sa engine. I-install ito mula sa Godot AssetLib o kopyahin ang addons/locale_chain/ folder papunta sa inyong proyekto. Gumagana ito sa CSV, PO, at .translation file.
9

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.

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
Magsalin nang paunti-unti. Kapag nagdagdag kayo ng mga bagong key sa source file, isalin lang ang diff sa halip na i-regenerate ang lahat. Napapanatili nito ang anumang human-reviewed na pagsasalin para sa narrative dialog o culturally sensitive na content.

I-automate ang Kalidad ng Pagsasalin

Matukoy ang mga nawawalang key at sirang placeholder bago ito ma-ship gamit ang i18n-validate. Subukan ang inyong UI gamit ang mga pseudo-translation sa pamamagitan ng i18n-pseudo bago dumating ang mga totoong pagsasalin.

Mga Karaniwang Pitfall

Hindi Nai-import ang Mga Translation File

Kailangang i-import ng Godot ang mga .csv at .po file bago ninyo magamit ang mga ito. Kung hindi lumilitaw ang mga translation, suriin kung nakalista ang inyong mga file sa Project Settings > Localization > Translations. Para sa CSV, tiyaking nag-generate ang Godot ng mga .translation file sa .godot/imported/ directory.

Nasisisira ang Parsing Dahil sa Mga CSV Value na May Comma o Quote

Dapat balutin sa double quote ang mga value na may comma. Ang mga value na may double quote ay dapat i-escape bilang "". Kapag may nawawalang quote, mali ang pag-parse ng buong row at madalas na tahimik na naii-shift ang lahat ng kasunod na column.

Nagpapakita ng Mga Walang Laman na Parisukat ang CJK o Arabic na Text

Hindi kasama sa primary font ang mga glyph para sa mga script na ito. Magdagdag ng mga font fallback sa inyong Theme o LabelSettings resource. Kung walang fallback, magre-render ang mga nawawalang glyph bilang mga walang laman na rectangle. Gamitin ang mga Noto Sans variant para sa komprehensibong Unicode coverage.

Maling Bilang ng Plural Form sa PO Header

Kapag hindi tumutugma ang nplurals value sa inyong PO header sa aktwal na bilang ng msgstr entry, maaaring mag-crash ang Godot o magpakita ng maling plural form. Laging i-verify na tumutugma ang Plural-Forms header sa CLDR specification para sa bawat target na wika.

Na-ooverride ng Code ang Auto Translate

Ang pag-set ng text property ng node sa GDScript pagkatapos ng _ready() ay nao-override ang resulta ng auto-translate. Gamitin alinman ang auto-translate nang eksklusibo (itakda ang text sa editor, huwag sa code) o gamitin ang tr() nang eksklusibo sa code. Kapag pinaghalo ang dalawa, nagreresulta ito sa hindi pare-parehong behavior.

Inirerekomendang Project Structure

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

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

Hindi kailangan ang signupInstant na estimate

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.

Terminal
# I-install mula sa Godot Asset Library
# Hanapin: 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"],
})

Tingnan ang aming Locale Fallback Guide para sa buong listahan ng mga sinusuportahang framework at 75 built-in na chain. Learn more →

FAQ sa Godot Localization