Skip to main content

Kompletan vodič za Unreal Engine lokalizaciju

Od FText makroa do lanaca rezervnih lokala: lokalizujte UE5 igru pomoću Localization Dashboard, String Tables, C++, Blueprints i automatizovanog prevođenja.

1

FText i pipeline lokalizacije

FText je tip teksta u Unreal Engine sistemu koji razume lokalizaciju. Svaki tekst igre namenjen korisniku — oznake korisničkog interfejsa, dijalog, opisi alatki, obaveštenja — mora da koristi FText da bi učestvovao u pipeline sistemu lokalizacije. FString služi samo za unutrašnju logiku.

LOCTEXT zahteva dva argumenta: ključ i izvorni tekst. Ključ mora da bude jedinstven u svom imenskom prostoru. UE alatka za prikupljanje teksta koristi ove ključeve da prati prevode kroz kulture. NSLOCTEXT Vam omogućava da izričito navedete imenski prostor; LOCTEXT koristi imenski prostor definisan okolnim makroom 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.
Nikada ne pravite tekst namenjen korisniku pomoću FString::Printf ili spajanja tekstova. Oni potpuno zaobilaze pipeline lokalizacije — dobijeni tekst ne može da se prikupi, prevede ili ispravno prikaže u RTL jezicima. Umesto toga uvek koristite FText::Format sa LOCTEXT obrascima.
2

Podesite Localization Dashboard

Localization Dashboard je ugrađena UE alatka za upravljanje prevodima. Prikuplja sve LOCTEXT i NSLOCTEXT tekstove iz izvornog koda, izvozi ih kao .po datoteke za prevođenje i kompajlira rezultate u binarne .locres datoteke koje UE učitava tokom izvršavanja.

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' posle svake izmene koda koja dodaje ili menja LOCTEXT makroe. Ako preskočite ovaj korak, novi tekstovi se neće pojaviti u .po datotekama i prevodioci ih neće videti. Dodajte korak prikupljanja u automatizaciju build procesa da to automatski otkrijete.
3

Koristite String Tables za tekst zasnovan na podacima

String Tables Vam omogućavaju da definišete lokalizovane tekstove u centralizovanom resursu umesto rasipanja LOCTEXT makroa po izvornim datotekama. Idealne su za tekst korisničkog interfejsa, dijalog i sve tekstove koje dizajneri ili pisci treba da uređuju bez menjanja koda. String Tables mogu da se definišu kao UE resursi ili uvezu iz CSV datoteke.

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 tekstove definisane u String Table nisu Vam potrebni LOCTEXT makroi — samo ih navedite prema ID oznaci tabele i ključu u C++ ili Blueprints sistemu.
4

Obrasci C++ lokalizacije

U C++ kodu definišite LOCTEXT_NAMESPACE na vrhu svake .cpp datoteke i koristite LOCTEXT za sve tekstove namenjene korisniku. Koristite FText::Format za dinamički sadržaj sa promenljivama. Uvek poništite definiciju imenskog prostora na kraju datoteke da sprečite curenje.

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 FText::Format funkcije takođe moraju da budu FText, a ne neobrađeni FString. Koristite FText::FromString() da konvertujete FString vrednosti, FText::AsNumber() za formatiranje brojeva prema lokalu i FText::AsCurrency() za cene. Spajanje neobrađenih FString vrednosti pravi tekst koji ne poštuje pravila formatiranja lokala.
5

Blueprint lokalizacija

Sva svojstva Text u Blueprints sistemu podrazumevano su FText, pa su već spremna za lokalizaciju. Postavite Key i Namespace u panelu sa detaljima svojstva kako bi tekstovi mogli da se prikupe. Koristite čvor Format Text za dinamički sadržaj sa promenljivama.

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 meni svojstva teksta u panelu Blueprint Details da vidite polja Key, Namespace i Source String. Postavljanje smislenog ključa znatno olakšava prevodiocima prepoznavanje tekstova u .po datoteci.
6

Obradite množine i rod

Unreal Engine podržava ICU format poruka za množine i tekst zavisan od roda. Definišite pravila množine u izvornim tekstovima, a UE automatski bira ispravan oblik na osnovu CLDR pravila aktivne kulture.

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)"
Nikada ne upisujte direktno count == 1 za otkrivanje jednine. Francuski tretira 0 kao jedninu. Ruski ima zasebne oblike za 'few' i 'many'. Arapski ima 6 oblika množine. Prepustite logiku ICU pravilima množine — definišite sve potrebne oblike, a UE bira ispravan za svaku kulturu.
7

Spakujte i testirajte lokalizaciju

Pre isporuke proverite da li sve ciljne kulture imaju kompajlirane .locres datoteke i da li se tekst ispravno prikazuje tokom izvršavanja. Koristite pregled kulture u uređivaču, promene kulture u komandnoj liniji i automatizovane provere da otkrijete nedostajuće ili neispravne prevode.

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, njene .locres datoteke biće izostavljene iz build paketa. Igrači koji izaberu taj jezik tokom izvršavanja videće rezervni tekst ili prazne tekstove. Uvek proverite da li postavke pakovanja odgovaraju podržanim kulturama.
8

Dodajte lance rezervnih lokala

Podrazumevana lokalizacija sistema Unreal Engine prelazi na rezervu samo duž hijerarhije IETF podoznaka. Korisnik lokala pt-BR kojem nedostaje prevod dobija engleski umesto sasvim dobrog prevoda za pt-PT. locale-chain-ue dodaje podesive bočne lance rezerve kroz FTextLocalizationManager kako bi regionalni korisnici uvek videli najbliži dostupan prevod.

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);
Pozovite ULocaleChain::Configure() jednom pri pokretanju da učitate 75 ugrađenih lanaca rezerve koji obuhvataju 11 jezičkih porodica. Koristite ConfigureWithOverrides za prilagođavanje pogodno za Blueprint ili ConfigureCustom u C++ kodu za potpunu kontrolu ponašanja rezerve.

Automatizujte kvalitet prevoda

Pomoću i18n-validate alatke otkrijte nedostajuće ključeve i neispravne čuvare mesta pre isporuke. Testirajte korisnički interfejs pseudoprevodima pomoću i18n-pseudo alatke pre nego što stignu pravi prevodi.

Uobičajene zamke

Upotreba FString za tekst namenjen korisniku

FString zaobilazi ceo pipeline lokalizacije. Tekst napravljen pomoću FString::Printf ili spajanja tekstova ne može da se prikupi, prevede ili ispravno prikaže u RTL jezicima. Za tekst vidljiv korisniku uvek koristite FText sa LOCTEXT makroima i FText::Format.

Nedostaje #undef LOCTEXT_NAMESPACE

Ako zaboravite #undef LOCTEXT_NAMESPACE na kraju .cpp datoteke, imenski prostor curi u naredne jedinice prevoda. Time se tekstovima u drugim datotekama neprimetno dodeljuju pogrešni imenski prostori i prevodi se pojavljuju u pogrešnom kontekstu.

Direktno upisana logika množine

Pisanje 'count == 1 ? singular : plural' zanemaruje CLDR pravila. Francuski tretira 0 kao jedninu, ruski ima 4 oblika množine, a arapski 6. Koristite ICU sintaksu množine u FText obrascima i prepustite UE sistemu da obradi pravila za svaku kulturu.

Zaboravljeno kompajliranje posle uvoza

Uvoz .po datoteka ažurira tekstualne podatke, ali ne generiše .locres binarne datoteke. Igra tokom izvršavanja i dalje učitava stare kompajlirane prevode. Uvek pokrenite 'Compile' u Localization Dashboard posle uvoza ili ga dodajte u automatizaciju build procesa.

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 sada

Pustite datoteku za prevođenje ovde

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

ili kliknite za izbor

Ciljni jezici

Registracija nije potrebnaTrenutna procena

Česta pitanja