Skip to main content

Пълно ръководство за локализация на игри с Godot

От TranslationServer до резервните шрифтове: локализирайте играта си с Godot чрез CSV, PO файлове, GDScript и автоматизиран превод с ИИ.

1

Основи на TranslationServer

Вграденият в Godot TranslationServer е ядрото на системата за локализация. Той зарежда ресурсите с преводи при стартиране и разрешава ключовете чрез функцията tr(). Всяко извикване на tr() в GDScript преминава през TranslationServer — не са необходими допълнителни библиотеки.

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 поддържа форматите CSV, PO (Gettext) и .translation (двоичен). Автоматично разпознава системния локал чрез OS.get_locale() и избира съответния ресурс с преводи. Можете по всяко време да замените локала чрез TranslationServer.set_locale().
2

CSV файлове с преводи

CSV е най-лесният формат за преводи в Godot. Един файл съдържа всички езици в отделни колони. Първата колона е ключът, а всяка следваща колона е локал. Godot автоматично импортира .csv файловете и генерира ресурси .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
Оградете с двойни кавички стойностите, които съдържат запетаи или нови редове. В стойности с двойни кавички ги екранирайте като "". Използвайте кратки и описателни ключове: MENU_START е по-добър от menu_start_button_text_label.
3

Файлове за превод PO / Gettext

Файловете PO (Portable Object) са отрасловият стандарт за локализация на софтуер. Godot 4.x предлага вградена поддръжка на PO с множествено число, разграничаване според контекста и коментари за преводачите. Създайте по един .po файл за всеки език в директория 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)
PO файловете поддържат msgctxt за разграничаване според контекста (например „OPEN“ като глагол или прилагателно), msgid_plural за форми за множествено число и коментари за преводачите (редове с #.), които предоставят контекст къде и как се използват низовете.
4

Използване на преводи в GDScript

Използвайте tr() навсякъде в GDScript, за да превеждате низове. Комбинирайте го с оператора % на GDScript за форматиране на низове. За надеждно управление на локала създайте Autoload скрипт, който управлява разпознаването, запазването и смяната на локала чрез сигнали.

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()
Промяната на локала чрез TranslationServer.set_locale() не актуализира автоматично текста, който вече е изобразен в сцените Ви. След смяна на локала трябва ръчно отново да приложите tr() към всички видими етикети, бутони и текстови възли. Използвайте сигнали от Вашия диспечер на локали, за да уведомите сцените на потребителския интерфейс, че трябва да се обновят.
5

Множествено число и заместители

Godot обработва множественото число чрез формите за множествено число в PO файловете. Всеки език дефинира собствена формула в заглавната част на PO. Операторът % на GDScript обработва позиционни заместители (%s за низове и %d за цели числа). За именувани заместители използвайте 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))
Никога не задавайте директно логика за множествено число като 'if count == 1'. Езиците имат коренно различни правила за множествено число: английският има 2 форми, руският — 3, арабският — 6, а японският — 1. Оставете системата за множествено число на PO да избира формата автоматично. CSV файловете не поддържат множествено число — използвайте PO файлове за всяко съдържание, което се нуждае от такива форми.
6

Резервни шрифтове за CJK, арабски и други писмености

Основният шрифт на играта Ви вероятно не съдържа глифове за японска, корейска, китайска, арабска или тайландска писменост. Godot 4.x поддържа вериги от резервни шрифтове — когато даден глиф липсва в основния шрифт, Godot проверява последователно резервните шрифтове. Без тях нелатинският текст се изобразява като празни квадратчета.

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
Използвайте семейството шрифтове Noto на Google — то обхваща почти всички писмености в Unicode. Добавете Noto Sans JP, Noto Sans KR, Noto Sans SC и Noto Sans Arabic като резервни шрифтове. За игри с пикселна графика обмислете Noto Sans Mono или растерни шрифтове, които включват подмножества на CJK. Следете общия размер на шрифтовете — пълните CJK шрифтове могат да бъдат по 15-20MB всеки.
7

Локализация на сцени и потребителския интерфейс

Има три подхода за локализиране на сцени в Godot: превод в _ready() чрез tr(), използване на свойството Auto Translate в редактора или зареждане на напълно различни сцени за езици, които изискват различно оформление (например 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 работи само със свойството text на възела. Ако зададете текста динамично чрез код след _ready(), автоматичният превод се замества. За динамично актуализиран текст винаги използвайте изрично tr() в кода си. Имайте предвид също, че автоматичният превод прилага tr() към буквалната стойност на текста — затова свойството text трябва да съдържа ключа за превод, а не четимия изходен текст.
8

Интелигентно резервно търсене на локали с LocaleChain

Когато липсва регионален вариант, TranslationServer на Godot преминава директно към локала по подразбиране на проекта. Играч с pt-BR, за когото има само преводи на pt-PT, вижда английски вместо португалски. LocaleChain решава този проблем, като при конфигурирането обединява в TranslationServer преводи от настройваеми вериги за резервно търсене.

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 е добавка, написана изцяло на GDScript — без собствени разширения или промени по енджина. Инсталирайте я от Godot AssetLib или копирайте папката addons/locale_chain/ в проекта си. Тя работи с CSV, PO и .translation файлове.
9

Автоматизирайте превода на игри

След като настройката за локализация е готова, преведете своите CSV или PO файлове с помощта на ИИ. Автоматизирайте превода на низове в играта, текстове от интерфейса, описания на предмети и диалози — директно от средата си за разработка (IDE) или от CI/CD пайплайна.

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
Превеждайте поетапно. Когато добавяте нови ключове към изходния файл, превеждайте само разликите, вместо да създавате всичко отначало. Така запазвате преводите на сюжетни диалози или културно чувствително съдържание, които вече са прегледани от човек.

Автоматизирайте контрола на качеството на превода

Откривайте липсващи ключове и повредени заместители преди публикуването чрез i18n-validate. Тествайте интерфейса си с псевдопреводи чрез i18n-pseudo, преди да получите истинските преводи.

Често срещани затруднения

Файловете за превод не са импортирани

Godot трябва да импортира .csv и .po файловете, преди да могат да се използват. Ако преводите не се показват, проверете дали файловете Ви са посочени в Project Settings > Localization > Translations. При CSV се уверете, че Godot е създал .translation файлове в директорията .godot/imported/.

CSV стойности със запетаи или кавички нарушават синтактичния анализ

Стойностите, съдържащи запетаи, трябва да бъдат оградени с двойни кавички. Двойните кавички в стойностите трябва да бъдат екранирани като "". Липсваща кавичка води до неправилен синтактичен анализ на целия ред и често измества незабелязано всички следващи колони.

Текстът на CJK или арабски се показва като празни квадратчета

Основният Ви шрифт не съдържа глифове за тези писмености. Добавете резервни шрифтове в своя ресурс Theme или LabelSettings. Без тях липсващите глифове се изобразяват като празни правоъгълници. Използвайте варианти на Noto Sans за широко покритие на Unicode.

Неправилен брой форми за множествено число в заглавната част на PO

Ако стойността nplurals в заглавната част на PO не съответства на действителния брой записи msgstr, Godot може да се срине или да покаже неправилна форма за множествено число. Винаги проверявайте дали заглавната част Plural-Forms съответства на спецификацията CLDR за всеки целеви език.

Auto Translate е заменено от кода

Задаването на свойството text на възел чрез GDScript след _ready() заменя резултата от автоматичния превод. Използвайте или само автоматичен превод (задавайте текста в редактора, но никога в кода), или само tr() в кода. Смесването на двата подхода води до непоследователно поведение.

Препоръчителна структура на проекта

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

Изпробвайте i18n Agent сега

Пуснете тук Вашия файл за превод

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

или натиснете, за да изберете файл

Целеви езици

Не се изисква регистрацияНезабавна оценка

Резервно търсене на локали с locale-chain-godot

Когато липсва ключ за превод в регионален локал като pl_PL, Godot преминава директно към локала по подразбиране на проекта, вместо първо да провери родителския локал pl.

Terminal
# Инсталиране от Godot Asset Library
# Търсене: 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"],
})

Вижте нашето ръководство за резервно търсене на локали за пълния списък с поддържани фреймуърци и 75 вградени вериги. Learn more →

Често задавани въпроси за локализацията в Godot