Skip to main content

Eksiksiz Godot oyun yerelleştirme rehberi

TranslationServer'dan yedek yazı tiplerine kadar Godot oyununuzu CSV, PO dosyaları, GDScript ve otomatik yapay zeka çevirisiyle yerelleştirin.

1

TranslationServer'ın temelleri

Godot'nun yerleşik TranslationServer'ı, yerelleştirme sisteminin temelidir. Çeviri kaynaklarını başlangıçta yükler ve anahtarları tr() işlevi aracılığıyla çözümler. GDScript'teki her tr() çağrısı TranslationServer üzerinden geçer; ek kitaplık gerekmez.

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) ve .translation (ikili) biçimlerini destekler. OS.get_locale() aracılığıyla sistem yerel ayarını otomatik olarak algılar ve eşleşen çeviri kaynağını seçer. Yerel ayarı istediğiniz zaman TranslationServer.set_locale() ile geçersiz kılabilirsiniz.
2

CSV çeviri dosyaları

CSV, Godot çevirileri için en basit biçimdir. Tek bir dosya, tüm dilleri sütunlar hâlinde barındırır. İlk sütun anahtarı, sonraki her sütun ise bir yerel ayarı içerir. Godot, .csv dosyalarını otomatik olarak içe aktarır ve .translation kaynakları oluşturur.

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
Virgül veya yeni satır içeren değerleri çift tırnak içine alın. Çift tırnak içeren değerlerde tırnakları "" biçiminde kaçış karakterleriyle belirtin. Anahtarları kısa ve açıklayıcı tutun: MENU_START, menu_start_button_text_label anahtarından daha iyidir.
3

PO / Gettext çeviri dosyaları

PO (Portable Object) dosyaları, yazılım yerelleştirmesinde endüstri standardıdır. Godot 4.x; çoğul biçimler, bağlam ayrımı ve çevirmen yorumları için yerleşik PO desteği sunar. locale/ klasöründe her dil için bir .po dosyası oluşturun.

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 dosyaları; bağlam ayrımı için msgctxt'i (örneğin fiil ve sıfat olarak 'OPEN'), çoğul biçimler için msgid_plural'ı ve çevirmenlere dizelerin nerede ve nasıl kullanıldığına dair bağlam sunmak için çevirmen yorumlarını (#. satırları) destekler.
4

GDScript'te çeviri kullanımı

Dizeleri çevirmek için GDScript'in herhangi bir yerinde tr() kullanın. Dize biçimlendirmesi için bunu GDScript'in % işleciyle birleştirin. Sağlam bir yerel ayar yönetimi için yerel ayar algılama, kalıcı saklama ve sinyallerle değiştirme işlemlerini yöneten bir Autoload betiği oluşturun.

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()
Yerel ayarı TranslationServer.set_locale() ile değiştirmek, sahnelerinizde daha önce işlenmiş metinleri otomatik olarak güncellemez. Yerel ayar değişikliğinden sonra tr() işlevini görünür tüm etiketlere, düğmelere ve metin düğümlerine elle yeniden uygulamalısınız. Kullanıcı arayüzü sahnelerine yenilenmeleri gerektiğini bildirmek için yerel ayar yöneticinizin sinyallerini kullanın.
5

Çoğul biçimler ve yer tutucular

Godot, çoğul biçimleri PO dosyalarındaki çoğul biçim tanımlarıyla işler. Her dil, PO üstbilgisinde kendi çoğul formülünü tanımlar. GDScript'in % işleci, konumsal yer tutucuları (dizeler için %s, tam sayılar için %d) işler. Adlandırılmış yer tutucular için String.replace() kullanın.

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' gibi bir çoğul mantığını asla doğrudan kodlamayın. Dillerin çoğul kuralları birbirinden son derece farklıdır: İngilizcede 2, Rusçada 3, Arapçada 6 ve Japoncada 1 biçim vardır. Seçimi PO çoğul sisteminin otomatik olarak yapmasına izin verin. CSV dosyaları çoğul biçimleri desteklemez; çoğul biçim gerektiren tüm içerikler için PO dosyalarını kullanın.
6

CJK, Arapça ve diğer diller için yedek yazı tipleri

Oyununuzun birincil yazı tipi büyük olasılıkla Japonca, Korece, Çince, Arapça veya Tayca yazı sistemlerinin gliflerini içermez. Godot 4.x, yedek yazı tipi zincirlerini destekler; bir glif birincil yazı tipinde yoksa Godot yedek yazı tiplerini sırasıyla denetler. Bu özellik olmadan Latin alfabesi dışındaki metinler boş kareler olarak görüntülenir.

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
Neredeyse tüm Unicode yazı sistemlerini kapsayan Google Noto yazı tipi ailesini kullanın. Yedek olarak Noto Sans JP, Noto Sans KR, Noto Sans SC ve Noto Sans Arabic'i ekleyin. Piksel sanatlı oyunlarda Noto Sans Mono'yu veya CJK alt kümelerini içeren bit eşlemli yazı tiplerini değerlendirin. Toplam yazı tipi boyutunu göz önünde bulundurun; tam CJK yazı tiplerinin her biri 15-20 MB olabilir.
7

Sahne ve kullanıcı arayüzü yerelleştirmesi

Godot sahnelerini yerelleştirmek için üç yaklaşım vardır: _ready() içinde tr() kullanarak çeviri yapmak, düzenleyicide Auto Translate özelliğini kullanmak veya farklı düzenlere ihtiyaç duyan diller (RTL dilleri gibi) için tamamen farklı sahneler yüklemek.

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 yalnızca düğümün text özelliğinde çalışır. Metni _ready() sonrasında kod içinde dinamik olarak ayarlarsanız otomatik çeviri geçersiz kılınır. Dinamik olarak güncellenen metinlerde kodunuzda her zaman açıkça tr() kullanın. Otomatik çevirinin tr() işlevini değişmez metin değerine uyguladığını da unutmayın; bu nedenle text özelliği, okunabilir kaynak dizeyi değil çeviri anahtarını içermelidir.
8

LocaleChain ile akıllı yerel ayar geri dönüşü

Bölgesel bir varyant eksik olduğunda Godot'nun TranslationServer'ı doğrudan projenin varsayılan yerel ayarına döner. Yalnızca pt-PT çevirileri bulunan pt-BR yerel ayarındaki bir oyuncu, Portekizce yerine İngilizce görür. LocaleChain, yapılandırılabilir geri dönüş zincirlerindeki çevirileri yapılandırma sırasında TranslationServer ile birleştirerek bu sorunu giderir.

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, tamamen GDScript ile yazılmış bir eklentidir; yerel uzantı veya motor değişikliği gerektirmez. Eklentiyi Godot AssetLib'den yükleyin veya addons/locale_chain/ klasörünü projenize kopyalayın. CSV, PO ve .translation dosyalarıyla çalışır.
9

Oyun çevirilerini otomatikleştirin

Yerelleştirme kurulumunuz tamamlandıktan sonra CSV veya PO dosyalarınızı yapay zeka ile çevirin. Oyun dizelerinin, kullanıcı arayüzü metinlerinin, eşya açıklamalarının ve diyalogların çevirisini doğrudan IDE'nizden veya CI/CD işlem hattınızdan otomatikleştirin.

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
Artımlı çeviri yapın. Kaynak dosyanıza yeni anahtarlar eklediğinizde her şeyi yeniden oluşturmak yerine yalnızca farkı çevirin. Böylece anlatı diyalogları veya kültürel açıdan hassas içerikler için insanlar tarafından gözden geçirilmiş çeviriler korunur.

Çeviri kalitesini otomatik olarak denetleyin

Eksik anahtarları ve bozuk yer tutucuları yayımlanmadan önce i18n-validate ile yakalayın. Gerçek çeviriler gelmeden önce kullanıcı arayüzünüzü i18n-pseudo ile sözde çeviriler kullanarak test edin.

Yaygın hatalar

Çeviri dosyalarının içe aktarılmaması

Godot, kullanılabilmeleri için .csv ve .po dosyalarını içe aktarmalıdır. Çeviriler görünmüyorsa dosyalarınızın Project Settings > Localization > Translations bölümünde listelendiğini denetleyin. CSV için Godot'nun .godot/imported/ klasöründe .translation dosyaları oluşturduğundan emin olun.

Virgül veya tırnak içeren CSV değerlerinin ayrıştırmayı bozması

Virgül içeren değerler çift tırnak içine alınmalıdır. Çift tırnak içeren değerlerde tırnaklar "" biçiminde kaçış karakterleriyle belirtilmelidir. Eksik bir tırnak, satırın tamamının yanlış ayrıştırılmasına ve çoğu zaman sonraki tüm sütunların sessizce kaymasına neden olur.

CJK veya Arapça metnin boş kareler göstermesi

Birincil yazı tipiniz bu yazı sistemlerinin gliflerini içermiyor. Theme veya LabelSettings kaynağınıza yedek yazı tipleri ekleyin. Yedekler olmadan eksik glifler boş dikdörtgenler olarak görüntülenir. Kapsamlı Unicode desteği için Noto Sans varyantlarını kullanın.

PO üstbilgisinde yanlış çoğul biçim sayısı

PO üstbilginizdeki nplurals değeri gerçek msgstr girdisi sayısıyla eşleşmezse Godot çökebilir veya yanlış çoğul biçimi gösterebilir. Plural-Forms üstbilgisinin her hedef dil için CLDR belirtimiyle eşleştiğini her zaman doğrulayın.

Auto Translate'in kod tarafından geçersiz kılınması

Bir düğümün text özelliğini GDScript'te _ready() sonrasında ayarlamak, otomatik çeviri sonucunu geçersiz kılar. Ya yalnızca otomatik çeviriyi kullanın (metni düzenleyicide ayarlayın, kodda hiçbir zaman ayarlamayın) ya da kodda yalnızca tr() kullanın. İkisini birlikte kullanmak tutarsız davranışa yol açar.

Önerilen proje yapısı

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'ı şimdi deneyin

Çeviri dosyanızı buraya bırakın

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

veya göz atmak için tıklayın

Hedef diller

Kayıt gerekmezAnında fiyat tahmini

locale-chain-godot ile yerel ayar geri dönüşü

pl_PL gibi bölgesel bir yerel ayarda çeviri anahtarı eksik olduğunda Godot, önce üst yerel ayar pl'yi denetlemek yerine doğrudan projenin varsayılan yerel ayarına geçer.

Terminal
# Godot Asset Library'den yükleyin
# Arayın: 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"],
})

Desteklenen çerçevelerin tam listesi ve 75 yerleşik zincir için Yerel Ayar Geri Dönüşü Rehberimize bakın. Learn more →

Godot yerelleştirme hakkında sık sorulan sorular