Skip to main content

Celovit vodnik po lokalizaciji Unreal Engine

Od makrov FText do verig nadomestnih področnih nastavitev: lokalizirajte svojo igro UE5 z orodji Localization Dashboard, String Tables, C++, Blueprints in samodejnim prevajanjem.

1

FText in lokalizacijski cevovod

FText je nizovni tip Unreal Engine, prilagojen lokalizaciji. Vsak niz v igri, namenjen uporabnikom — oznake uporabniškega vmesnika, dialogi, opisi orodij, obvestila — mora uporabljati FText, da je vključen v lokalizacijski cevovod. FString je namenjen samo notranji logiki.

LOCTEXT zahteva dva argumenta: ključ in izvorni niz. Ključ mora biti enoličen znotraj svojega imenskega prostora. Zbiralnik besedila v UE s temi ključi spremlja prevode med različnimi kulturami. NSLOCTEXT omogoča izrecno določitev imenskega prostora, LOCTEXT pa uporablja imenski prostor, ki ga določa obdajajoči makro 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.
Besedila, namenjenega uporabnikom, nikoli ne sestavljajte s FString::Printf ali združevanjem nizov. S tem v celoti zaobidete lokalizacijski cevovod — nastalega besedila ni mogoče zbrati, prevesti ali pravilno prikazati v jezikih s pisanjem od desne proti levi. Namesto tega vedno uporabite FText::Format z vzorci LOCTEXT.
2

Nastavite Localization Dashboard

Localization Dashboard je vgrajeno orodje UE za upravljanje prevodov. Iz izvorne kode zbere vse nize LOCTEXT in NSLOCTEXT, jih za prevajanje izvozi v datoteke .po ter rezultate prevede v binarne datoteke .locres, ki jih UE naloži med izvajanjem.

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
Po vsaki spremembi kode, ki doda ali spremeni makre LOCTEXT, zaženite 'Gather Text'. Če ta korak izpustite, se novi nizi ne bodo pojavili v datotekah .po in jih prevajalci ne bodo videli. V avtomatizacijo gradnje dodajte korak zbiranja, da bo to preverjeno samodejno.
3

Za podatkovno vodeno besedilo uporabite String Tables

String Tables omogočajo določanje lokaliziranih nizov v osrednjem sredstvu, namesto da bi bili makri LOCTEXT razpršeni po izvornih datotekah. Idealne so za besedilo uporabniškega vmesnika, dialoge in vse nize, ki jih morajo oblikovalci ali pisci urejati brez poseganja v kodo. String Tables lahko določite kot sredstva UE ali jih uvozite iz datotek 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 samodejno zbere String Tables. Za nize, določene v String Table, ne potrebujete makrov LOCTEXT — v kodi C++ ali Blueprints se nanje sklicujte samo z ID-jem tabele in ključem.
4

Lokalizacijski vzorci v C++

V C++ na vrhu vsake datoteke .cpp določite LOCTEXT_NAMESPACE in uporabite LOCTEXT za vse nize, namenjene uporabnikom. Za dinamično vsebino s spremenljivkami uporabite FText::Format. Na koncu datoteke vedno prekličite določitev imenskega prostora, da preprečite njegovo uhajanje.

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 morajo biti prav tako vrste FText in ne neobdelani FString. Za pretvorbo vrednosti FString uporabite FText::FromString(), za oblikovanje števil glede na področne nastavitve FText::AsNumber(), za cene pa FText::AsCurrency(). Združevanje neobdelanih vrednosti FString ustvari besedilo, ki ne upošteva pravil oblikovanja področnih nastavitev.
5

Lokalizacija v Blueprints

Vse lastnosti Text v Blueprints so privzeto vrste FText, zato so že pripravljene za lokalizacijo. Če želite omogočiti zbiranje nizov, v podoknu s podrobnostmi lastnosti nastavite Key in Namespace. Za dinamično vsebino s spremenljivkami uporabite vozlišče 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")
V podoknu Blueprint Details razširite spustni seznam lastnosti besedila, da prikažete polja Key, Namespace in Source String. Če nastavite pomenljiv Key, bodo prevajalci veliko lažje prepoznali nize v datoteki .po.
6

Obravnavajte množinske oblike in slovnični spol

Unreal Engine podpira obliko sporočil ICU za množinske oblike in besedilo, odvisno od slovničnega spola. V izvornih nizih določite množinska pravila, UE pa samodejno izbere pravilno obliko glede na pravila CLDR 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)"
Za ugotavljanje ednine nikoli ne uporabite fiksno zapisanega pogoja count == 1. Francoščina obravnava 0 kot ednino. Ruščina ima ločeni obliki za 'few' in 'many'. Arabščina ima 6 množinskih oblik. Logiko prepustite množinskim pravilom ICU — določite vse zahtevane oblike, UE pa bo za posamezno kulturo izbral ustrezno.
7

Zapakirajte in preizkusite lokalizacijo

Pred izdajo preverite, ali imajo vse ciljne kulture prevedene datoteke .locres in ali je besedilo med izvajanjem pravilno izrisano. Za odkrivanje manjkajočih ali okvarjenih prevodov uporabite predogled kulture v urejevalniku, preglasitve kulture v ukazni vrstici in samodejna preverjanja.

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.
Če kultura ni navedena v Project Settings > Packaging > Localizations to Package, so njene datoteke .locres izključene iz gradnje. Igralci, ki med izvajanjem izberejo ta jezik, bodo videli nadomestno besedilo ali prazne nize. Vedno preverite, ali se nastavitve pakiranja ujemajo s podprtimi kulturami.
8

Dodajte verige nadomestnih področnih nastavitev

Privzeta lokalizacija Unreal Engine uporablja nadomestne vrednosti samo vzdolž hierarhije podoznak IETF. Uporabnik pt-BR ob manjkajočem prevodu dobi angleško besedilo namesto povsem ustreznega prevoda pt-PT. locale-chain-ue prek FTextLocalizationManager doda nastavljive stranske verige nadomestnih področnih nastavitev, zato uporabniki regionalnih različic vedno vidijo najbližji razpoložljivi 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);
Ob zagonu enkrat pokličite ULocaleChain::Configure(), da naložite 75 vgrajenih nadomestnih verig, ki pokrivajo 11 jezikovnih družin. Za prilagajanje, prijazno okolju Blueprint, uporabite ConfigureWithOverrides, za popoln nadzor nad nadomestnim vedenjem v C++ pa ConfigureCustom.

Avtomatizirajte kakovost prevodov

Z i18n-validate odkrijte manjkajoče ključe in okvarjene označbe mest, preden pridejo v izdajo. Preden prispejo pravi prevodi, uporabniški vmesnik preizkusite s psevdoprevodi prek i18n-pseudo.

Pogoste pasti

Uporaba FString za besedilo, namenjeno uporabnikom

FString zaobide celoten lokalizacijski cevovod. Besedila, sestavljenega s FString::Printf ali združevanjem nizov, ni mogoče zbrati, prevesti ali pravilno prikazati v jezikih s pisanjem od desne proti levi. Za nize, ki jih vidijo uporabniki, vedno uporabite FText z makri LOCTEXT in FText::Format.

Manjkajoči #undef LOCTEXT_NAMESPACE

Če na koncu datoteke .cpp pozabite dodati #undef LOCTEXT_NAMESPACE, imenski prostor uide v naslednje prevajalne enote. Tako se nizom v drugih datotekah neopazno dodelijo napačni imenski prostori, zaradi česar se prevodi pojavijo v napačnem kontekstu.

Fiksno zapisana množinska logika

Zapis 'count == 1 ? singular : plural' ne upošteva pravil CLDR. Francoščina obravnava 0 kot ednino, ruščina ima 4 množinske oblike, arabščina pa 6. V vzorcih FText uporabite množinsko skladnjo ICU in UE prepustite obravnavo pravil za posamezno kulturo.

Pozabljeno prevajanje datotek po uvozu

Uvoz datotek .po posodobi besedilne podatke, vendar ne ustvari binarnih datotek .locres. Igra med izvajanjem še vedno nalaga stare skompilirane prevode. Po uvozu vedno zaženite 'Compile' v Localization Dashboard ali pa ta korak dodajte v avtomatizacijo gradnje.

Priporoč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

Preizkusite i18n Agent zdaj

Spustite prevajalsko datoteko sem

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

ali kliknite za izbiro

Ciljni jeziki

Registracija ni potrebnaTakojšnja ocena

Pogosta vprašanja