Skip to main content

Eksiksiz Unreal Engine yerelleştirme rehberi

FText makrolarından yerel ayar geri dönüş zincirlerine kadar UE5 oyununuzu Localization Dashboard, String Tables, C++, Blueprints ve otomatik çeviriyle yerelleştirin.

1

FText ve yerelleştirme işlem hattı

FText, Unreal Engine'in yerelleştirmeye duyarlı dize türüdür. Oyununuzdaki kullanıcıya yönelik tüm dizeler (kullanıcı arayüzü etiketleri, diyaloglar, araç ipuçları ve bildirimler) yerelleştirme işlem hattına katılmak için FText kullanmalıdır. FString yalnızca iç mantık içindir.

LOCTEXT iki bağımsız değişken gerektirir: bir anahtar ve bir kaynak dize. Anahtar, kendi ad alanında benzersiz olmalıdır. UE'nin metin toplayıcısı, kültürler arasındaki çevirileri izlemek için bu anahtarları kullanır. NSLOCTEXT, ad alanını açıkça belirtmenizi sağlar; LOCTEXT ise kapsayıcı LOCTEXT_NAMESPACE makrosuyla tanımlanan ad alanını kullanır.
FText Basics
// FText is UE's localization-aware string type.
// ALWAYS use FText for user-facing text, never FString.

// LOCTEXT: localize a literal string (most common)
FText Title = LOCTEXT("MainMenuTitle", "Start Game");

// NSLOCTEXT: specify namespace explicitly
FText Msg = NSLOCTEXT("UI", "WelcomeMessage", "Welcome, adventurer!");

// INVTEXT: invariant text (never translated — debug/logging only)
FText Debug = INVTEXT("Debug overlay active");

// FText::Format: safe variable interpolation
FText Greeting = FText::Format(
    LOCTEXT("PlayerGreeting", "Hello, {PlayerName}!"),
    FText::FromString(PlayerName)
);
MainMenuWidget.cpp
// In a UMG Widget (C++)
void UMainMenuWidget::NativeConstruct()
{
    Super::NativeConstruct();

    // Bind localized text to UI elements
    if (TitleLabel)
    {
        TitleLabel->SetText(LOCTEXT("GameTitle", "My Epic Game"));
    }

    if (PlayButton)
    {
        PlayButton->SetText(LOCTEXT("PlayButtonLabel", "Play Now"));
    }
}

// IMPORTANT: Always use LOCTEXT for UMG widget text.
// Setting text via FString bypasses the localization pipeline.
Kullanıcıya yönelik metinleri hiçbir zaman FString::Printf veya dize birleştirme ile oluşturmayın. Bunlar yerelleştirme işlem hattını tamamen atlar; oluşan metin toplanamaz, çevrilemez veya RTL dillerinde doğru görüntülenemez. Bunun yerine her zaman LOCTEXT kalıplarıyla FText::Format kullanın.
2

Localization Dashboard'u ayarlayın

Localization Dashboard, UE'nin çevirileri yönetmeye yönelik yerleşik aracıdır. Kaynak kodunuzdaki tüm LOCTEXT ve NSLOCTEXT dizelerini toplar, çeviri için .po dosyaları olarak dışa aktarır ve sonuçları UE'nin çalışma zamanında yüklediği ikili .locres dosyaları hâlinde derler.

Localization Dashboard Workflow
# 1. Open the Localization Dashboard:
#    Window > Localization Dashboard

# 2. Add a localization target (e.g., "Game")

# 3. Add cultures:
#    Click "Add New Culture" > select languages (de, ja, fr, es, ko, zh-Hans...)

# 4. Gather text:
#    Click "Gather Text" — UE scans all LOCTEXT/NSLOCTEXT macros

# 5. Export translations:
#    Click "Export" to generate .po files for each culture

# 6. Import translations:
#    After translating .po files, click "Import"

# 7. Compile translations:
#    Click "Compile" to generate .locres binary files

# 8. Preview:
#    Editor Preferences > Region & Language > Preview Game Language
LOCTEXT makroları ekleyen veya değiştiren her kod değişikliğinden sonra 'Gather Text' komutunu çalıştırın. Bu adımı atlarsanız yeni dizeler .po dosyalarınızda görünmez ve çevirmenler bunları göremez. Bunu otomatik olarak yakalamak için derleme otomasyonunuza bir toplama adımı ekleyin.
3

Veri odaklı metinler için String Tables kullanın

String Tables, yerelleştirilmiş dizeleri kaynak dosyalarına dağılmış LOCTEXT makroları yerine merkezi bir varlıkta tanımlamanızı sağlar. Koda dokunmadan tasarımcıların veya yazarların düzenlemesi gereken kullanıcı arayüzü metinleri, diyaloglar ve diğer dizeler için idealdir. String Tables, UE varlıkları olarak tanımlanabilir veya CSV'den içe aktarılabilir.

StringTableUsage.cpp
// StringTables provide a data-driven approach to localization.
// Define strings in a CSV asset instead of scattering LOCTEXT across code.

// 1. Create a String Table asset:
//    Content Browser > Right-click > Miscellaneous > String Table

// 2. Or define via CSV (importable into UE):
// Key,SourceString
// MainMenu_Title,Start Game
// MainMenu_Continue,Continue
// MainMenu_Settings,Settings
// MainMenu_Quit,Quit to Desktop
// HUD_Health,Health
// HUD_Ammo,Ammo: {0}
// Dialog_Merchant_Greeting,Welcome to my shop!

// 3. Reference in C++:
FText Title = FText::FromStringTable(
    FName(TEXT("/Game/Localization/ST_MainMenu")),
    TEXT("MainMenu_Title")
);

// 4. Reference in Blueprints:
//    Use the "Make Text from String Table" node
//    Set Table ID and Key
String Tables, Localization Dashboard tarafından otomatik olarak toplanır. Bir String Table içinde tanımlanan dizeler için LOCTEXT makrolarına ihtiyacınız yoktur; C++ veya Blueprints içinde bunlara yalnızca tablo kimliği ve anahtarla başvurun.
4

C++ yerelleştirme kalıpları

C++'ta her .cpp dosyasının başında bir LOCTEXT_NAMESPACE tanımlayın ve kullanıcıya yönelik tüm dizeler için LOCTEXT kullanın. Değişken içeren dinamik içerik için FText::Format kullanın. Sızıntıları önlemek amacıyla dosyanın sonunda ad alanı tanımını her zaman kaldırın.

MainMenuWidget.cpp
// Define a namespace at the top of each .cpp file
// All LOCTEXT calls in this file use this namespace
#define LOCTEXT_NAMESPACE "MyGame.MainMenu"

#include "MainMenuWidget.h"

void UMainMenuWidget::NativeConstruct()
{
    Super::NativeConstruct();

    // These use the "MyGame.MainMenu" namespace automatically
    TitleText->SetText(LOCTEXT("Title", "Main Menu"));
    PlayText->SetText(LOCTEXT("PlayButton", "Play"));
    SettingsText->SetText(LOCTEXT("SettingsButton", "Settings"));
    QuitText->SetText(LOCTEXT("QuitButton", "Quit"));
}

// CRITICAL: Always undefine at the end of the file
#undef LOCTEXT_NAMESPACE
FText::Format Examples
// FText::Format — the safe way to build localized strings
// NEVER use FString::Printf or string concatenation for user-facing text.

// Named arguments (recommended)
FText ItemPickup = FText::Format(
    LOCTEXT("ItemPickup", "You picked up {ItemName} x{Count}"),
    FText::FromString(ItemName),
    FText::AsNumber(Count)
);

// FText::AsNumber respects locale formatting:
//   English: 1,234,567
//   German:  1.234.567
//   French:  1 234 567

// FText::AsCurrency for prices:
FText Price = FText::AsCurrency(
    9.99,
    TEXT("USD"),
    &FInternationalization::Get().GetCurrentCulture().Get()
);

// FText::AsDate and FText::AsTime for dates:
FText DateStr = FText::AsDate(FDateTime::Now());
FText::Format bağımsız değişkenleri de işlenmemiş FString değil FText olmalıdır. FString değerlerini dönüştürmek için FText::FromString(), yerel ayara duyarlı sayı biçimlendirmesi için FText::AsNumber() ve fiyatlar için FText::AsCurrency() kullanın. İşlenmemiş FString birleştirmesi, yerel ayar biçimlendirme kurallarına uymayan metinler üretir.
5

Blueprint yerelleştirmesi

Blueprints'teki tüm Text özellikleri varsayılan olarak FText türündedir; dolayısıyla yerelleştirmeye hazırdır. Dizelerin toplanabilmesi için özellik ayrıntıları panelinde Key ve Namespace değerlerini belirleyin. Değişken içeren dinamik içerik için Format Text düğümünü kullanın.

Blueprint Localization Patterns
// Blueprint Localization Basics:
//
// 1. All Text properties in Blueprints are FText by default
//    (already localization-ready)
//
// 2. Set the Text property in the Details panel
//    Expand the dropdown to set:
//    - Key: unique identifier for translation
//    - Namespace: grouping for organization
//    - Source String: the text to display/translate
//
// 3. For dynamic text, use the "Format Text" node:
//    Format: "Hello, {PlayerName}!"
//    Connect a "Find" pin named "PlayerName" to your variable
//
// 4. For plurals, use "Text Format with Arguments":
//    Pattern: "{Count}|plural(one=item,other=items)"
//
// 5. Culture switching at runtime:
//    Use "Set Current Culture" node
//    Input: culture code string (e.g., "de", "ja", "fr")
Key, Namespace ve Source String alanlarını görmek için Blueprint Details panelindeki metin özelliği açılır menüsünü genişletin. Anlamlı bir Key belirlemek, çevirmenlerin .po dosyasındaki dizeleri tanımlamasını çok daha kolaylaştırır.
6

Çoğul biçimleri ve cinsiyeti yönetin

Unreal Engine, çoğul biçimler ve cinsiyete bağlı metinler için ICU ileti biçimini destekler. Kaynak dizelerinizde çoğul kurallarını tanımlayın; UE, etkin kültürün CLDR kurallarına göre doğru biçimi otomatik olarak seçer.

ICU Plural & Gender Rules
// UE uses ICU message format for plurals.
// Define plural rules in your .po or String Table:

// English source:
// "{Count}|plural(one=You have # item,other=You have # items)"

// German translation:
// "{Count}|plural(one=Du hast # Gegenstand,other=Du hast # Gegenstaende)"

// Arabic translation (6 forms):
// "{Count}|plural(zero=لا عناصر,one=عنصر واحد,two=عنصران,few=# عناصر,many=# عنصرًا,other=# عنصر)"

// Japanese (1 form):
// "{Count}|plural(other=アイテム#個)"

// In C++:
FText ItemCount = FText::Format(
    LOCTEXT("ItemCount",
        "{Count}|plural(one=You have {Count} item,other=You have {Count} items)"),
    ItemCount
);

// Gender-dependent text:
// "{Gender}|gender(masculine=Il est,feminine=Elle est) prêt{Gender}|gender(masculine=,feminine=e)"
Tekil biçimi belirlemek için count == 1 koşulunu hiçbir zaman doğrudan kodlamayın. Fransızcada 0 tekil kabul edilir. Rusçada 'few' ve 'many' için ayrı biçimler bulunur. Arapçada 6 çoğul biçim vardır. Mantığı ICU çoğul kurallarının yönetmesine izin verin; gerekli tüm biçimleri tanımladığınızda UE her kültür için doğru olanı seçer.
7

Yerelleştirmeyi paketleyin ve test edin

Yayımlamadan önce tüm hedef kültürlerin derlenmiş .locres dosyalarına sahip olduğunu ve metinlerin çalışma zamanında doğru görüntülendiğini doğrulayın. Eksik veya bozuk çevirileri yakalamak için düzenleyicinin kültür önizlemesini, komut satırı kültür geçersiz kılmalarını ve otomatik denetimleri kullanın.

Packaging & Testing Workflow
# Compile and test localization before packaging:

# 1. Editor Preferences > Region & Language > Preview Game Language
#    Set to each target language and verify all text renders correctly.

# 2. Command-line culture override for testing:
MyGame.exe -culture=ja

# 3. Packaging settings:
#    Project Settings > Packaging > Localizations to Package
#    Select all cultures you want to include in the build.

# 4. Verify .locres files exist after packaging:
MyGame/Content/Localization/Game/
├── en/
│   └── Game.locres
├── de/
│   └── Game.locres
├── ja/
│   └── Game.locres
├── fr/
│   └── Game.locres
└── ko/
    └── Game.locres

# 5. Runtime culture switching:
#    FInternationalization::Get().SetCurrentCulture(TEXT("ja"));
#    This reloads all FText strings from the new culture's .locres files.
Bir kültür Project Settings > Packaging > Localizations to Package bölümünde listelenmiyorsa o kültüre ait .locres dosyaları derlemeye dahil edilmez. Çalışma zamanında bu dili seçen oyuncular geri dönüş metni veya boş dizeler görür. Paketleme ayarlarınızın desteklediğiniz kültürlerle eşleştiğini her zaman doğrulayın.
8

Yerel ayar geri dönüş zincirleri ekleyin

Unreal Engine'in varsayılan yerelleştirmesi yalnızca IETF alt etiket hiyerarşisi boyunca geri döner. Çevirisi eksik olan pt-BR yerel ayarındaki bir kullanıcı, kullanılabilir durumdaki pt-PT çevirisi yerine İngilizce görür. locale-chain-ue, FTextLocalizationManager aracılığıyla yapılandırılabilir yatay geri dönüş zincirleri ekleyerek bölgesel kullanıcıların her zaman en yakın çeviriyi görmesini sağlar.

locale-chain-ue (C++)
// locale-chain-ue: Smart fallback chains for UE5
// Problem: UE falls back to default when a locale is missing.
// pt-BR user gets English instead of pt-PT translations.

// Solution: One function call at startup.
#include "LocaleChain.h"

void UMyGameInstance::Init()
{
    Super::Init();
    ULocaleChain::Configure();  // Load 75 built-in fallback chains
}

// Now resolve strings with per-key fallback:
FString Greeting = ULocaleChain::Resolve(
    TEXT("greeting"), TEXT("MyNamespace")
);
// pt-BR user: tries pt-BR -> pt-PT -> pt -> default

// Custom overrides:
TMap<FString, FString> Overrides;
Overrides.Add(TEXT("pt-BR"), TEXT("pt"));       // Simplify chain
Overrides.Add(TEXT("sv-FI"), TEXT("sv"));        // Add new chain
ULocaleChain::ConfigureWithOverrides(Overrides);

// Full control (C++ only):
TMap<FString, TArray<FString>> Custom;
Custom.Add(TEXT("pt-BR"), {TEXT("pt-PT"), TEXT("pt")});
Custom.Add(TEXT("es-MX"), {TEXT("es-419"), TEXT("es")});
ULocaleChain::ConfigureCustom(Custom, false);
11 dil ailesini kapsayan 75 yerleşik geri dönüş zincirini yüklemek için başlangıçta ULocaleChain::Configure() işlevini bir kez çağırın. Blueprint ile kolay özelleştirme için ConfigureWithOverrides'ı, geri dönüş davranışı üzerinde tam denetim sağlamak için C++'ta ConfigureCustom'ı kullanın.

Ç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

Kullanıcıya yönelik metinlerde FString kullanılması

FString, yerelleştirme işlem hattının tamamını atlar. FString::Printf veya dize birleştirme ile oluşturulan metinler toplanamaz, çevrilemez veya RTL dillerinde doğru görüntülenemez. Kullanıcıya gösterilen dizelerde her zaman LOCTEXT makrolarıyla FText ve FText::Format kullanın.

#undef LOCTEXT_NAMESPACE satırının eksik olması

Bir .cpp dosyasının sonunda #undef LOCTEXT_NAMESPACE kullanmayı unutmak, ad alanının sonraki çeviri birimlerine sızmasına neden olur. Bu durum, diğer dosyalardaki dizelere sessizce yanlış ad alanları atar ve çevirilerin yanlış bağlamda görünmesine yol açar.

Doğrudan kodlanmış çoğul mantığı

'count == 1 ? singular : plural' yazmak CLDR kurallarını göz ardı eder. Fransızcada 0 tekil kabul edilir, Rusçada 4 ve Arapçada 6 çoğul biçim vardır. FText kalıplarınızda ICU çoğul söz dizimini kullanın ve kuralları kültüre göre UE'nin yönetmesine izin verin.

İçe aktarma sonrasında derlemenin unutulması

.po dosyalarını içe aktarmak metin verilerini günceller ancak .locres ikili dosyalarını oluşturmaz. Oyun, çalışma zamanında eski derlenmiş çevirileri yüklemeye devam eder. İçe aktarma sonrasında Localization Dashboard'da her zaman 'Compile' komutunu çalıştırın veya bu adımı derleme otomasyonunuza ekleyin.

Önerilen proje yapısı

Project Structure
MyUnrealProject/
├── Config/
│   └── Localization/
│       └── Game.ini                  # Localization target config
├── Content/
│   └── Localization/
│       ├── Game/
│       │   ├── Game.manifest         # Gather manifest
│       │   ├── en/
│       │   │   ├── Game.po           # Source strings (.po)
│       │   │   └── Game.locres       # Compiled binary
│       │   ├── de/
│       │   │   ├── Game.po
│       │   │   └── Game.locres
│       │   ├── ja/
│       │   │   ├── Game.po
│       │   │   └── Game.locres
│       │   └── fr/
│       │       ├── Game.po
│       │       └── Game.locres
│       └── StringTables/
│           ├── ST_MainMenu.uasset    # String Table asset
│           └── ST_HUD.uasset
├── Plugins/
│   └── LocaleChain/                  # locale-chain-ue plugin
│       ├── LocaleChain.uplugin
│       └── Source/
│           └── LocaleChain/
├── Source/
│   └── MyGame/
│       ├── UI/
│       │   ├── MainMenuWidget.h
│       │   └── MainMenuWidget.cpp    # LOCTEXT macros here
│       └── MyGameInstance.cpp        # ULocaleChain::Configure()
└── MyUnrealProject.uproject

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

Sık sorulan sorular