Skip to main content

Cjelovit vodič za lokalizaciju u Unreal Engineu

Od makronaredbi FText do lanaca zamjenskih lokalnih postavki: lokalizirajte svoju UE5 igru pomoću alata Localization Dashboard, tablica String Tables, C++-a, Blueprinta i automatiziranog prijevoda.

1

FText i proces lokalizacije

FText je vrsta niza u Unreal Engineu koja podržava lokalizaciju. Svaki tekst igre vidljiv korisniku — oznake sučelja, dijalozi, opisi elemenata i obavijesti — mora biti FText kako bi sudjelovao u lokalizacijskom procesu. FString namijenjen je samo internoj logici.

LOCTEXT zahtijeva dva argumenta: ključ i izvorni niz. Ključ mora biti jedinstven unutar svojeg prostora imena. UE-ov alat za prikupljanje teksta tim ključevima prati prijevode među kulturama. NSLOCTEXT omogućuje Vam da izričito navedete prostor imena, dok LOCTEXT rabi prostor imena koji određuje okolna makronaredba 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.
Tekst vidljiv korisniku nikada nemojte sastavljati funkcijom FString::Printf ni povezivanjem nizova. Time potpuno zaobilazite lokalizacijski proces, pa se dobiveni tekst ne može prikupiti, prevesti ni ispravno prikazati u RTL jezicima. Uvijek rabite FText::Format s obrascima LOCTEXT.
2

Postavljanje alata Localization Dashboard

Localization Dashboard UE-ov je ugrađeni alat za upravljanje prijevodima. Prikuplja sve nizove LOCTEXT i NSLOCTEXT iz izvornog koda, izvozi ih u .po datoteke za prijevod te rezultate kompilira u binarne .locres datoteke koje UE učitava tijekom izvođenja.

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
Pokrenite 'Gather Text' nakon svake izmjene koda kojom dodajete ili mijenjate makronaredbe LOCTEXT. Preskočite li taj korak, novi se nizovi neće pojaviti u .po datotekama i prevoditelji ih neće vidjeti. U automatizirani proces izgradnje dodajte korak prikupljanja kako bi se to automatski otkrilo.
3

Tablice String Tables za tekst temeljen na podacima

String Tables omogućuju Vam da lokalizirane nizove odredite u središnjem resursu umjesto da makronaredbe LOCTEXT raspršite po izvornim datotekama. Prikladne su za tekst sučelja, dijaloge i sve nizove koje dizajneri ili pisci trebaju uređivati bez izmjene koda. String Tables možete definirati kao UE resurse ili uvesti iz CSV datoteka.

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 automatski prikuplja String Tables. Za nizove definirane u String Table nisu potrebne makronaredbe LOCTEXT — u C++-u ili Blueprintu samo ih referencirajte ID-jem tablice i ključem.
4

Obrasci C++ lokalizacije

U C++ kodu na vrhu svake .cpp datoteke definirajte LOCTEXT_NAMESPACE, a LOCTEXT rabite za sve nizove vidljive korisniku. Za dinamički sadržaj s varijablama rabite FText::Format. Na kraju datoteke uvijek uklonite definiciju prostora imena kako ne bi procurila.

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());
Argumenti funkcije FText::Format također moraju biti vrste FText, a ne neobrađeni FString. FString vrijednosti pretvorite funkcijom FText::FromString(), brojeve oblikujte prema lokalnim postavkama funkcijom FText::AsNumber(), a cijene funkcijom FText::AsCurrency(). Povezivanjem neobrađenih FString vrijednosti nastaje tekst koji ne poštuje lokalna pravila oblikovanja.
5

Blueprint lokalizacija

Sva svojstva Text u Blueprintu prema zadanim su postavkama vrste FText, pa su već spremna za lokalizaciju. U ploči s pojedinostima svojstva postavite Key i Namespace kako bi se nizovi mogli prikupiti. Za dinamički sadržaj s varijablama rabite čvor 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")
Proširite padajući izbornik tekstnog svojstva na ploči Blueprint Details kako biste vidjeli polja Key, Namespace i Source String. Smislen ključ prevoditeljima znatno olakšava prepoznavanje nizova u .po datoteci.
6

Obradite množine i rod

Unreal Engine podržava ICU format poruka za množinu i rodno ovisan tekst. U izvornim nizovima definirajte pravila množine, a UE automatski odabire ispravan oblik prema pravilima CLDR za aktivnu kulturu.

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)"
Za prepoznavanje jednine nikada nemojte izravno zapisati count == 1. Francuski tretira 0 kao jedninu, ruski ima zasebne oblike 'few' i 'many', a arapski 6 množinskih oblika. Logiku prepustite ICU pravilima množine: definirajte sve potrebne oblike, a UE će odabrati ispravan za svaku kulturu.
7

Pakiranje i testiranje lokalizacije

Prije isporuke provjerite imaju li sve ciljne kulture kompilirane .locres datoteke i prikazuje li se tekst ispravno tijekom izvođenja. Pregledajte kulturu u uređivaču, mijenjajte je iz naredbenog retka i pokrenite automatizirane provjere kako biste otkrili prijevode koji nedostaju ili nisu ispravni.

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.
Ako kultura nije navedena u Project Settings > Packaging > Localizations to Package, njezine će .locres datoteke biti izostavljene iz paketa izgradnje. Igrači koji tijekom izvođenja odaberu taj jezik vidjet će zamjenski tekst ili prazne nizove. Uvijek provjerite odgovaraju li postavke pakiranja podržanim kulturama.
8

Dodavanje lanaca zamjenskih lokalnih postavki

Zadana lokalizacija Unreal Enginea vraća se samo uzduž hijerarhije IETF jezičnih podoznaka. Korisnik s postavkom pt-BR kojem nedostaje prijevod zato dobiva engleski umjesto dostupnoga prijevoda za pt-PT. locale-chain-ue putem FTextLocalizationManagera dodaje prilagodljive bočne zamjenske lance kako bi regionalni korisnici uvijek vidjeli najbliži dostupan prijevod.

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);
Jednom pri pokretanju pozovite ULocaleChain::Configure() kako biste učitali 75 ugrađenih zamjenskih lanaca za 11 jezičnih obitelji. Za prilagodbe prikladne Blueprintu rabite ConfigureWithOverrides, a za potpun nadzor ponašanja u C++-u ConfigureCustom.

Automatizirajte kvalitetu prijevoda

Alatom i18n-validate otkrijte ključeve koji nedostaju i neispravna rezervirana mjesta prije objave. Korisničko sučelje testirajte pseudoprijevodima iz alata i18n-pseudo prije nego što stignu stvarni prijevodi.

Uobičajene zamke

Uporaba FStringa za tekst vidljiv korisniku

FString zaobilazi cijeli lokalizacijski proces. Tekst izrađen funkcijom FString::Printf ili povezivanjem nizova ne može se prikupiti, prevesti ni ispravno prikazati u RTL jezicima. Za tekst vidljiv korisniku uvijek rabite FText s makronaredbama LOCTEXT i funkcijom FText::Format.

Nedostaje #undef LOCTEXT_NAMESPACE

Ako na kraju .cpp datoteke izostavite #undef LOCTEXT_NAMESPACE, prostor imena curi u sljedeće prijevodne jedinice. Zbog toga nizovi u drugim datotekama neprimjetno dobivaju pogrešne prostore imena, a prijevodi se pojavljuju u pogrešnom kontekstu.

Izravno zapisana logika množine

Izraz 'count == 1 ? singular : plural' zanemaruje pravila CLDR. Francuski tretira 0 kao jedninu, ruski ima 4 množinska oblika, a arapski 6. U obrascima FText rabite ICU sintaksu množine i prepustite UE-u obradu pravila za svaku kulturu.

Propušteno kompiliranje nakon uvoza

Uvoz .po datoteka ažurira tekstne podatke, ali ne stvara binarne .locres datoteke. Igra tijekom izvođenja i dalje učitava stare kompilirane prijevode. Nakon uvoza uvijek pokrenite 'Compile' u alatu Localization Dashboard ili taj korak dodajte automatiziranom procesu izgradnje.

Preporučena struktura projekta

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

Isprobajte i18n Agent odmah

Povucite datoteku za prijevod ovdje

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

ili kliknite za odabir

Ciljni jezici

Registracija nije potrebnaProcjena odmah

Česta pitanja o lokalizaciji u Unreal Engineu