Skip to main content

Полное руководство по локализации игр Godot

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

1

Основы TranslationServer

Встроенный TranslationServer в Godot — основа системы локализации. Он загружает ресурсы перевода при запуске и разрешает ключи через функцию 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-20 МБ.
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 узла. Если динамически задать 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. Без них отсутствующие глифы отображаются пустыми прямоугольниками. Для полного охвата Unicode используйте варианты Noto Sans.

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

Если значение nplurals в заголовке PO не соответствует реальному количеству записей msgstr, Godot может аварийно завершиться или показать неверную форму. Всегда проверяйте соответствие заголовка Plural-Forms спецификации CLDR для каждого целевого языка.

Auto Translate переопределён кодом

Задание свойства text узла в GDScript после _ready() переопределяет результат автоматического перевода. Либо используйте только Auto Translate, задавая text в редакторе и никогда в коде, либо только 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
# 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"],
})

Полный список поддерживаемых фреймворков и 75 встроенных цепочек приведён в нашем руководстве по резервным локалям. Learn more →

Частые вопросы о локализации Godot