
คู่มือโลคัลไลเซชันเกม Godot อย่างครบถ้วน
ตั้งแต่ TranslationServer จนถึงแบบอักษรสำรอง ทำโลคัลไลเซชันเกม Godot ด้วย CSV, ไฟล์ PO, GDScript และการแปลอัตโนมัติด้วย AI
พื้นฐาน TranslationServer
TranslationServer ในตัวของ Godot เป็นแกนกลางระบบโลคัลไลเซชัน โหลดทรัพยากรคำแปลตอนเริ่มต้นและค้นหาคีย์ผ่านฟังก์ชัน tr() ทุกการเรียก tr() ใน GDScript จะผ่าน TranslationServer โดยไม่ต้องใช้ไลบรารีเพิ่ม
# 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
CSV เป็นรูปแบบคำแปล Godot ที่ง่ายที่สุด ไฟล์เดียวเก็บทุกภาษาในคอลัมน์ คอลัมน์แรกคือคีย์และคอลัมน์ถัดไปแต่ละคอลัมน์คือภาษา Godot นำเข้าไฟล์ .csv อัตโนมัติและสร้างทรัพยากร .translation
# 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 filesไฟล์แปล PO / Gettext
ไฟล์ PO (Portable Object) เป็นมาตรฐานอุตสาหกรรมสำหรับโลคัลไลเซชันซอฟต์แวร์ Godot 4.x รองรับ PO โดยตรงพร้อมพหูพจน์ การแยกบริบท และความคิดเห็นนักแปล สร้างหนึ่งไฟล์ .po ต่อภาษาในไดเรกทอรี locale/
# 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)การใช้คำแปลใน GDScript
ใช้ tr() ที่ใดก็ได้ใน GDScript เพื่อแปลข้อความ ใช้ร่วมกับตัวดำเนินการ % ของ GDScript เพื่อจัดรูปแบบ สำหรับการจัดการภาษาที่แข็งแรง ให้สร้างสคริปต์ Autoload ที่ตรวจหา บันทึก และสลับภาษาด้วยสัญญาณ
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()พหูพจน์และตัวยึดตำแหน่ง
Godot จัดการพหูพจน์ผ่านรูปพหูพจน์ในไฟล์ PO แต่ละภาษากำหนดสูตรในส่วนหัว PO ตัวดำเนินการ % ของ GDScript จัดการตัวยึดตำแหน่ง (%s สำหรับข้อความ, %d สำหรับจำนวนเต็ม) สำหรับตัวยึดแบบมีชื่อให้ใช้ 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))แบบอักษรสำรองสำหรับ CJK, อาหรับ และอื่นๆ
แบบอักษรหลักของเกมอาจไม่มีรูปอักขระญี่ปุ่น เกาหลี จีน อาหรับ หรือไทย Godot 4.x รองรับลำดับแบบอักษรสำรอง เมื่อรูปอักขระหายจากแบบอักษรหลัก Godot จะตรวจแบบอักษรสำรองตามลำดับ หากไม่มี ข้อความที่ไม่ใช่ละตินจะแสดงเป็นสี่เหลี่ยมว่าง
# 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_RTLโลคัลไลเซชันฉากและ UI
มีสามแนวทางในการทำโลคัลไลเซชันฉาก Godot ได้แก่ แปลใน _ready() ด้วย tr() ใช้พร็อพเพอร์ตี Auto Translate ในเครื่องมือแก้ไข หรือโหลดฉากต่างกันทั้งหมดสำหรับภาษาที่ต้องใช้เลย์เอาต์ต่างกันอย่าง RTL
# 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())การใช้ภาษาสำรองอัจฉริยะด้วย LocaleChain
TranslationServer ของ Godot จะถอยไปใช้ภาษาเริ่มต้นของโปรเจกต์ทันทีเมื่อไม่มีรูปแบบตามภูมิภาค ผู้เล่น pt-BR ที่มีเพียง pt-PT จึงเห็นอังกฤษ LocaleChain แก้ด้วยการผสานคำแปลจากลำดับภาษาสำรองที่กำหนดค่าได้เข้า 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()ทำให้การแปลเกมเป็นอัตโนมัติ
เมื่อตั้งค่าโลคัลไลเซชันเสร็จแล้ว ให้แปลไฟล์ CSV หรือ PO ด้วย AI ทำให้การแปลข้อความเกม UI คำอธิบายไอเท็ม และบทสนทนาเป็นอัตโนมัติจาก IDE หรือไปป์ไลน์ CI/CD
# 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ทำให้คุณภาพการแปลเป็นอัตโนมัติ
ข้อผิดพลาดที่พบบ่อย
ยังไม่ได้นำเข้าไฟล์แปล
ค่า CSV ที่มีจุลภาคหรือเครื่องหมายคำพูดทำให้แยกวิเคราะห์เสียหาย
ข้อความ CJK หรืออาหรับแสดงสี่เหลี่ยมว่าง
จำนวนรูปพหูพจน์ในส่วนหัว PO ไม่ถูกต้อง
Auto Translate ถูกโค้ดเขียนทับ
โครงสร้างโปรเจกต์ที่แนะนำ
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แปลรายการต่อไปนี้ได้ด้วย :
ลองใช้ i18n Agent ตอนนี้
ลากและวางไฟล์แปลของคุณที่นี่
JSON, YAML, PO, XML, CSV, Markdown, Properties
หรือคลิกเพื่อเลือกไฟล์
ภาษาเป้าหมาย
การใช้ภาษาสำรองด้วย locale-chain-godot
เมื่อไม่มีคีย์คำแปลในภาษาตามภูมิภาคอย่าง pl_PL Godot จะข้ามไปใช้ภาษาเริ่มต้นของโปรเจกต์ทันทีแทนที่จะตรวจภาษาหลัก 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"],
})ดูคู่มือการใช้ภาษาสำรองของเราสำหรับรายการเฟรมเวิร์กที่รองรับทั้งหมดและลำดับสำเร็จรูป 75 รายการ Learn more →