Skip to main content

Godot ゲームローカリゼーション完全ガイド

TranslationServer からフォントフォールバックまで。CSV、PO ファイル、GDScript、AI を活用した自動翻訳を使って Godot ゲームをローカライズします。

1

TranslationServer の基本

Godot 組み込みの TranslationServer は、ローカリゼーションシステムの中核です。起動時に翻訳リソースを読み込み、tr() 関数でキーを解決します。GDScript から呼び出すすべての tr() は 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 の翻訳で最もシンプルな形式です。1 つのファイルに全言語を列として格納します。先頭列がキー、その後の各列がロケールです。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_button_text_label より MENU_START が適切です。
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 ファイルでは、文脈による意味の区別(例:動詞と形容詞で意味が異なる「OPEN」)に msgctxt、複数形に msgid_plural、文字列の使用場所や用途を翻訳者へ伝えるコメントに #. 行を使用できます。
4

GDScript での翻訳の使い方

GDScript では、どこからでも tr() を使って文字列を翻訳できます。文字列の書式設定には 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() を再適用する必要があります。ロケールマネージャーのシグナルで UI シーンへ更新を通知してください。
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 はフォントフォールバックチェーンに対応しており、主要フォントにグリフがなければ、指定順にフォールバックフォントを確認します。設定しない場合、非ラテン文字は空の四角形で表示されます。

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
ほぼすべての Unicode 文字体系を網羅する Google の Noto フォントファミリーを使用してください。Noto Sans JP、Noto Sans KR、Noto Sans SC、Noto Sans Arabic をフォールバックとして追加します。ピクセルアートゲームでは、Noto Sans Mono や CJK のサブセットを含むビットマップフォントも検討してください。CJK の全文字対応フォントは 1 つ 15〜20 MB になるため、フォントの合計サイズにも注意が必要です。
7

シーンと UI のローカリゼーション

Godot のシーンをローカライズする方法は 3 つあります。_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() の後にコードから text を動的に設定すると、自動翻訳は上書きされます。動的に更新するテキストでは、必ずコード内で明示的に tr() を使用してください。また、自動翻訳は text の値そのものに tr() を適用するため、text プロパティには人が読む原文ではなく翻訳キーを設定する必要があります。
8

LocaleChain によるスマートなロケールフォールバック

Godot の TranslationServer は地域バリアントがない場合、プロジェクトのデフォルトロケールへ直接フォールバックします。そのため、pt-PT の翻訳しかない場合、pt-BR のプレイヤーにはポルトガル語ではなく英語が表示されます。LocaleChain は、設定時に構成可能なフォールバックチェーンから翻訳を統合し、この問題を解決します。

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

ゲーム翻訳の自動化

ローカリゼーションの設定が完了したら、AI を使って CSV または PO ファイルを翻訳します。ゲーム内文字列、UI テキスト、アイテム説明、会話の翻訳を 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 の疑似翻訳で UI をテストできます。

よくある落とし穴

翻訳ファイルがインポートされていない

Godot では、.csv と .po ファイルを使用する前にインポートする必要があります。翻訳が表示されない場合は、Project Settings > Localization > Translations にファイルが一覧表示されているか確認してください。CSV の場合は、Godot が .godot/imported/ ディレクトリに .translation ファイルを生成していることも確認します。

カンマや引用符を含む CSV 値の解析に失敗する

カンマを含む値は二重引用符で囲む必要があります。二重引用符を含む値では、"" としてエスケープします。引用符が欠けると行全体が誤って解析され、その後の列がすべてずれることがありますが、エラーが表示されない場合も少なくありません。

CJK やアラビア語のテキストが空の四角形になる

主要フォントにこれらの文字体系のグリフが含まれていません。Theme または LabelSettings リソースにフォントフォールバックを追加してください。フォールバックがなければ、欠落グリフは空の長方形で表示されます。Unicode を幅広く網羅するには Noto Sans の各言語向けフォントを使用します。

PO ヘッダーの複数形式数が正しくない

PO ヘッダーの nplurals 値が実際の msgstr エントリ数と一致しない場合、Godot がクラッシュしたり、誤った複数形式を表示したりする可能性があります。各対象言語について、Plural-Forms ヘッダーが CLDR 仕様と一致することを必ず確認してください。

コードによって Auto Translate が上書きされる

_ready() の後に GDScript でノードの text プロパティを設定すると、自動翻訳の結果が上書きされます。自動翻訳だけを使う(エディターで 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 ローカリゼーションのよくある質問