Skip to main content

Комплетан водич за Unreal Engine локализацију

Од FText макроа до ланаца резервних локала: локализујте UE5 игру помоћу Localization Dashboard, String Tables, C++, Blueprints и аутоматизованог превођења.

1

FText и pipeline локализације

FText је тип текста у Unreal Engine систему који разуме локализацију. Сваки текст игре намењен кориснику — ознаке корисничког интерфејса, дијалог, описи алатки, обавештења — мора да користи FText да би учествовао у pipeline систему локализације. FString служи само за унутрашњу логику.

LOCTEXT захтева два аргумента: кључ и изворни текст. Кључ мора да буде јединствен у свом именском простору. UE алатка за прикупљање текста користи ове кључеве да прати преводе кроз културе. NSLOCTEXT Вам омогућава да изричито наведете именски простор; LOCTEXT користи именски простор дефинисан околним макроом LOCTEXT_NAMESPACE.
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.
Никада не правите текст намењен кориснику помоћу FString::Printf или спајања текстова. Они потпуно заобилазе pipeline локализације — добијени текст не може да се прикупи, преведе или исправно прикаже у RTL језицима. Уместо тога увек користите FText::Format са LOCTEXT обрасцима.
2

Подесите Localization Dashboard

Localization Dashboard је уграђена UE алатка за управљање преводима. Прикупља све LOCTEXT и NSLOCTEXT текстове из изворног кода, извози их као .po датотеке за превођење и компајлира резултате у бинарне .locres датотеке које UE учитава током извршавања.

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
Покрените 'Gather Text' после сваке измене кода која додаје или мења LOCTEXT макрое. Ако прескочите овај корак, нови текстови се неће појавити у .po датотекама и преводиоци их неће видети. Додајте корак прикупљања у аутоматизацију build процеса да то аутоматски откријете.
3

Користите String Tables за текст заснован на подацима

String Tables Вам омогућавају да дефинишете локализоване текстове у централизованом ресурсу уместо расипања LOCTEXT макроа по изворним датотекама. Идеалне су за текст корисничког интерфејса, дијалог и све текстове које дизајнери или писци треба да уређују без мењања кода. String Tables могу да се дефинишу као UE ресурси или увезу из CSV датотеке.

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
Localization Dashboard аутоматски прикупља String Tables. За текстове дефинисане у String Table нису Вам потребни LOCTEXT макрои — само их наведите према ID ознаци табеле и кључу у C++ или Blueprints систему.
4

Обрасци C++ локализације

У C++ коду дефинишите LOCTEXT_NAMESPACE на врху сваке .cpp датотеке и користите LOCTEXT за све текстове намењене кориснику. Користите FText::Format за динамички садржај са променљивама. Увек поништите дефиницију именског простора на крају датотеке да спречите цурење.

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 функције такође морају да буду FText, а не необрађени FString. Користите FText::FromString() да конвертујете FString вредности, FText::AsNumber() за форматирање бројева према локалу и FText::AsCurrency() за цене. Спајање необрађених FString вредности прави текст који не поштује правила форматирања локала.
5

Blueprint локализација

Сва својства Text у Blueprints систему подразумевано су FText, па су већ спремна за локализацију. Поставите Key и Namespace у панелу са детаљима својства како би текстови могли да се прикупе. Користите чвор Format Text за динамички садржај са променљивама.

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")
Проширите падајући мени својства текста у панелу Blueprint Details да видите поља Key, Namespace и Source String. Постављање смисленог кључа знатно олакшава преводиоцима препознавање текстова у .po датотеци.
6

Обрадите множине и род

Unreal Engine подржава ICU формат порука за множине и текст зависан од рода. Дефинишите правила множине у изворним текстовима, а UE аутоматски бира исправан облик на основу CLDR правила активне културе.

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)"
Никада не уписујте директно count == 1 за откривање једнине. Француски третира 0 као једнину. Руски има засебне облике за 'few' и 'many'. Арапски има 6 облика множине. Препустите логику ICU правилима множине — дефинишите све потребне облике, а UE бира исправан за сваку културу.
7

Спакујте и тестирајте локализацију

Пре испоруке проверите да ли све циљне културе имају компајлиране .locres датотеке и да ли се текст исправно приказује током извршавања. Користите преглед културе у уређивачу, промене културе у командној линији и аутоматизоване провере да откријете недостајуће или неисправне преводе.

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.
Ако култура није наведена у Project Settings > Packaging > Localizations to Package, њене .locres датотеке биће изостављене из build пакета. Играчи који изаберу тај језик током извршавања видеће резервни текст или празне текстове. Увек проверите да ли поставке паковања одговарају подржаним културама.
8

Додајте ланце резервних локала

Подразумевана локализација система Unreal Engine прелази на резерву само дуж хијерархије IETF подознака. Корисник локала pt-BR којем недостаје превод добија енглески уместо сасвим доброг превода за pt-PT. locale-chain-ue додаје подесиве бочне ланце резерве кроз FTextLocalizationManager како би регионални корисници увек видели најближи доступан превод.

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);
Позовите ULocaleChain::Configure() једном при покретању да учитате 75 уграђених ланаца резерве који обухватају 11 језичких породица. Користите ConfigureWithOverrides за прилагођавање погодно за Blueprint или ConfigureCustom у C++ коду за потпуну контролу понашања резерве.

Аутоматизујте квалитет превода

Помоћу i18n-validate алатке откријте недостајуће кључеве и неисправне чуваре места пре испоруке. Тестирајте кориснички интерфејс псеудопреводима помоћу i18n-pseudo алатке пре него што стигну прави преводи.

Уобичајене замке

Употреба FString за текст намењен кориснику

FString заобилази цео pipeline локализације. Текст направљен помоћу FString::Printf или спајања текстова не може да се прикупи, преведе или исправно прикаже у RTL језицима. За текст видљив кориснику увек користите FText са LOCTEXT макроима и FText::Format.

Недостаје #undef LOCTEXT_NAMESPACE

Ако заборавите #undef LOCTEXT_NAMESPACE на крају .cpp датотеке, именски простор цури у наредне јединице превода. Тиме се текстовима у другим датотекама неприметно додељују погрешни именски простори и преводи се појављују у погрешном контексту.

Директно уписана логика множине

Писање 'count == 1 ? singular : plural' занемарује CLDR правила. Француски третира 0 као једнину, руски има 4 облика множине, а арапски 6. Користите ICU синтаксу множине у FText обрасцима и препустите UE систему да обради правила за сваку културу.

Заборављено компајлирање после увоза

Увоз .po датотека ажурира текстуалне податке, али не генерише .locres бинарне датотеке. Игра током извршавања и даље учитава старе компајлиране преводе. Увек покрените 'Compile' у Localization Dashboard после увоза или га додајте у аутоматизацију build процеса.

Препоручена структура пројекта

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 сада

Пустите датотеку за превођење овде

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

или кликните за избор

Циљни језици

Регистрација није потребнаТренутна процена

Честа питања