Skip to main content

Panduan Lengkap Penyetempatan Permainan Godot

Daripada TranslationServer hingga sandaran fon: setempatkan permainan Godot anda dengan CSV, fail PO, GDScript, dan terjemahan AI automatik.

1

Asas TranslationServer

TranslationServer terbina dalam Godot ialah teras sistem penyetempatan. Komponen ini memuatkan sumber terjemahan semasa permulaan dan memilih kekunci melalui fungsi tr(). Setiap panggilan tr() GDScript melalui TranslationServer — tanpa pustaka tambahan.

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 menyokong format CSV, PO (Gettext), dan .translation (binari). Komponen ini mengesan lokal sistem secara automatik melalui OS.get_locale() dan memilih sumber terjemahan yang sepadan. Anda boleh menggantikan lokal pada bila-bila masa dengan TranslationServer.set_locale().
2

Fail Terjemahan CSV

CSV ialah format paling mudah untuk terjemahan Godot. Satu fail menyimpan semua bahasa dalam lajur. Lajur pertama ialah kekunci, dan setiap lajur seterusnya ialah sesuatu lokal. Godot mengimport fail .csv secara automatik dan menjana sumber .translation.

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
Balut nilai yang mengandungi koma atau baris baharu dengan tanda petik berganda. Untuk nilai yang mengandungi tanda petik berganda, lepaskannya sebagai "". Gunakan kekunci yang ringkas dan deskriptif: MENU_START lebih baik daripada menu_start_button_text_label.
3

Fail Terjemahan PO / Gettext

Fail PO (Portable Object) ialah standard industri untuk penyetempatan perisian. Godot 4.x menyokong PO secara natif dengan bentuk jamak, pembezaan konteks, dan ulasan penterjemah. Cipta satu fail .po bagi setiap bahasa dalam direktori locale/.

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)
Fail PO menyokong msgctxt untuk pembezaan konteks (contohnya, 'OPEN' sebagai kata kerja lwn kata adjektif), msgid_plural untuk bentuk jamak, dan ulasan penterjemah (baris #.) untuk memberikan konteks kepada penterjemah tentang tempat dan cara rentetan digunakan.
4

Penggunaan Terjemahan GDScript

Gunakan tr() di mana-mana dalam GDScript untuk menterjemahkan rentetan. Gabungkan dengan pengendali % GDScript untuk memformat rentetan. Untuk pengurusan lokal yang teguh, cipta skrip Autoload yang mengendalikan pengesanan, pengekalan, dan penukaran lokal dengan isyarat.

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()
Mengubah lokal dengan TranslationServer.set_locale() tidak mengemas kini teks yang sudah dipaparkan dalam babak secara automatik. Anda mesti menerapkan semula tr() secara manual pada semua label, butang, dan nod teks yang kelihatan selepas perubahan lokal. Gunakan isyarat daripada pengurus lokal untuk memberitahu babak UI agar dimuat semula.
5

Bentuk Jamak dan Ruang Letak

Godot mengendalikan bentuk jamak melalui bentuk jamak fail PO. Setiap bahasa mentakrifkan formula bentuk jamaknya sendiri dalam pengepala PO. Pengendali % GDScript mengendalikan ruang letak kedudukan (%s untuk rentetan, %d untuk integer). Untuk ruang letak bernama, gunakan 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))
Jangan sekali-kali mengekod keras logik bentuk jamak seperti 'if count == 1'. Bahasa mempunyai peraturan bentuk jamak yang sangat berbeza: Inggeris mempunyai 2 bentuk, Rusia 3, Arab 6, dan Jepun 1. Biarkan sistem bentuk jamak PO mengendalikan pemilihan secara automatik. Fail CSV tidak menyokong bentuk jamak — gunakan fail PO untuk sebarang kandungan yang memerlukan bentuk jamak.
6

Sandaran Fon untuk CJK, Arab, dan Lain-lain

Fon utama permainan anda berkemungkinan tidak menyertakan glif untuk aksara Jepun, Korea, Cina, Arab, atau Thai. Godot 4.x menyokong rantaian sandaran fon — apabila glif tiada dalam fon utama, Godot menyemak fon sandaran mengikut urutan. Tanpanya, teks bukan Latin dipaparkan sebagai petak kosong.

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
Gunakan keluarga fon Noto daripada Google — fon ini merangkumi hampir semua aksara Unicode. Tambahkan Noto Sans JP, Noto Sans KR, Noto Sans SC, dan Noto Sans Arabic sebagai sandaran. Untuk permainan seni piksel, pertimbangkan Noto Sans Mono atau fon bitmap yang menyertakan subset CJK. Ambil kira jumlah saiz fon — fon CJK lengkap boleh bersaiz 15-20 MB setiap satu.
7

Penyetempatan Babak dan UI

Terdapat tiga pendekatan untuk menyetempatkan babak Godot: terjemahkan dalam _ready() menggunakan tr(), gunakan sifat Auto Translate dalam editor, atau muatkan babak yang berbeza sepenuhnya untuk bahasa yang memerlukan susun atur berbeza (seperti bahasa RTL).

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 hanya berfungsi pada sifat text nod. Jika anda menetapkan teks secara dinamik dalam kod selepas _ready(), terjemahan automatik akan digantikan. Untuk teks yang dikemas kini secara dinamik, sentiasa gunakan tr() secara jelas dalam kod. Ambil perhatian juga bahawa terjemahan automatik menerapkan tr() pada nilai teks literal — jadi sifat text mesti mengandungi kekunci terjemahan, bukan rentetan sumber yang boleh dibaca manusia.
8

Sandaran Lokal Pintar dengan LocaleChain

TranslationServer Godot terus bersandar kepada lokal lalai projek apabila varian serantau tiada. Pemain pt-BR yang hanya mempunyai terjemahan pt-PT melihat bahasa Inggeris dan bukannya Portugis. LocaleChain membaikinya dengan menggabungkan terjemahan daripada rantaian sandaran boleh dikonfigurasikan ke dalam TranslationServer semasa konfigurasi.

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 ialah tambahan GDScript tulen — tanpa sambungan natif atau pengubahsuaian enjin. Pasang daripada Godot AssetLib atau salin folder addons/locale_chain/ ke dalam projek anda. Tambahan ini berfungsi dengan fail CSV, PO, dan .translation.
9

Automatikkan Terjemahan Permainan

Selepas persediaan penyetempatan selesai, terjemahkan fail CSV atau PO anda menggunakan AI. Automatikkan terjemahan rentetan permainan, teks UI, penerangan item, dan dialog — secara langsung daripada IDE atau saluran CI/CD anda.

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
Terjemahkan secara berperingkat. Apabila anda menambahkan kekunci baharu pada fail sumber, terjemahkan hanya perbezaannya dan bukannya menjana semula semuanya. Cara ini mengekalkan terjemahan yang telah disemak manusia untuk dialog naratif atau kandungan yang sensitif dari segi budaya.

Automatikkan Kualiti Terjemahan

Kesan kekunci hilang dan ruang letak rosak sebelum dikeluarkan dengan i18n-validate. Uji UI dengan terjemahan pseudo menggunakan i18n-pseudo sebelum terjemahan sebenar tersedia.

Kesilapan Umum

Fail Terjemahan Tidak Diimport

Godot mesti mengimport fail .csv dan .po sebelum boleh digunakan. Jika terjemahan tidak muncul, semak bahawa fail anda disenaraikan dalam Project Settings > Localization > Translations. Untuk CSV, pastikan Godot telah menjana fail .translation dalam direktori .godot/imported/.

Nilai CSV dengan Koma atau Tanda Petik Merosakkan Penghuraian

Nilai yang mengandungi koma mesti dibalut dalam tanda petik berganda. Nilai yang mengandungi tanda petik berganda mesti melepaskannya sebagai "". Tanda petik yang tiada menyebabkan seluruh baris dihuraikan secara tidak betul dan sering mengalihkan semua lajur seterusnya secara senyap.

Teks CJK atau Arab Memaparkan Petak Kosong

Fon utama anda tidak menyertakan glif untuk aksara tersebut. Tambahkan sandaran fon dalam sumber Theme atau LabelSettings. Tanpa sandaran, glif yang tiada dipaparkan sebagai segi empat tepat kosong. Gunakan varian Noto Sans untuk liputan Unicode yang menyeluruh.

Jumlah Bentuk Jamak dalam Pengepala PO Salah

Jika nilai nplurals dalam pengepala PO tidak sepadan dengan jumlah entri msgstr sebenar, Godot mungkin ranap atau memaparkan bentuk jamak yang salah. Sentiasa pastikan pengepala Plural-Forms sepadan dengan spesifikasi CLDR untuk setiap bahasa sasaran.

Auto Translate Digantikan oleh Kod

Menetapkan sifat text nod dalam GDScript selepas _ready() menggantikan hasil terjemahan automatik. Gunakan terjemahan automatik sahaja (tetapkan teks dalam editor, jangan sekali-kali dalam kod) atau gunakan tr() sahaja dalam kod. Mencampurkan kedua-duanya menyebabkan tingkah laku tidak konsisten.

Struktur Projek yang Disyorkan

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

Cuba i18n Agent Sekarang

Lepaskan fail terjemahan anda di sini

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

atau klik untuk semak imbas

Bahasa sasaran

Tidak perlu mendaftarAnggaran serta-merta

Sandaran Lokal dengan locale-chain-godot

Apabila kekunci terjemahan tiada dalam lokal serantau seperti pl_PL, Godot terus beralih kepada lokal lalai projek dan bukannya menyemak lokal induk pl terlebih dahulu.

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"],
})

Lihat Panduan Sandaran Bahasa kami untuk senarai lengkap rangka kerja yang disokong dan 75 rantaian terbina dalam. Learn more →

Soalan Lazim Penyetempatan Godot