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 з формами множини, розрізненням за контекстом і коментарями для перекладачів. Створіть у папці locale/ окремий файл .po для кожної мови.

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 вузла. Якщо Ви динамічно встановите 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 чи pipeline 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
Перекладайте поступово. Коли Ви додаєте нові ключі до вихідного файлу, перекладайте лише diff, а не генеруйте все повторно. Так Ви збережете всі перевірені людьми переклади художніх діалогів або культурно чутливого вмісту.

Автоматизуйте контроль якості перекладу

Виявляйте відсутні ключі та пошкоджені заповнювачі до випуску за допомогою i18n-validate. Тестуйте інтерфейс із псевдоперекладами через i18n-pseudo ще до появи справжніх перекладів.

Поширені помилки

Файли перекладу не імпортовано

Перш ніж файли .csv і .po можна буде використовувати, Godot має їх імпортувати. Якщо переклади не з’являються, перевірте, чи зазначено Ваші файли в 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() перевизначає результат автоматичного перекладу. Або використовуйте лише автоматичний переклад (установлюйте 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