Skip to main content

Kompletní průvodce lokalizací v Unreal Engine

Od maker FText po locale fallback řetězce: lokalizujte Vaši hru v UE5 pomocí Localization Dashboard, String Tables, C++, Blueprintů a automatizovaných překladů.

1

FText a lokalizační pipeline

FText je typ řetězce v Unreal Engine, který je připravený na lokalizaci. Každý uživatelsky viditelný řetězec ve Vaší hře — popisky v UI, dialogy, tooltipy, oznámení — musí používat FText, aby se zapojil do lokalizační pipeline. FString je pouze pro interní logiku.

LOCTEXT vyžaduje dva argumenty: klíč a zdrojový řetězec. Klíč musí být v rámci svého namespace jedinečný. Text gatherer v UE tyto klíče používá ke sledování překladů napříč kulturami. NSLOCTEXT Vám umožní namespace zadat explicitně; LOCTEXT používá namespace definovaný obalujícím makrem 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.
Nikdy nesestavujte uživatelsky viditelný text pomocí FString::Printf nebo konkatenace řetězců. Tím se lokalizační pipeline úplně obejde — výsledný text nelze sesbírat, přeložit ani správně zobrazit v RTL jazycích. Místo toho vždy používejte FText::Format se vzory LOCTEXT.
2

Nastavte Localization Dashboard

Localization Dashboard je vestavěný nástroj UE pro správu překladů. Sesbírá všechny řetězce z LOCTEXT a NSLOCTEXT ve Vašem zdrojovém kódu, exportuje je jako soubory .po pro překlad a zkompiluje výsledky do binárních souborů .locres, které UE načítá za běhu.

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
Spusťte 'Gather Text' po každé změně kódu, která přidá nebo upraví makra LOCTEXT. Pokud tento krok vynecháte, nové řetězce se neobjeví ve Vašich souborech .po a překladatelé je neuvidí. Přidejte gather krok do automatizace buildů, aby se to zachycovalo automaticky.
3

Používejte String Tables pro data-driven text

String Tables Vám umožní definovat lokalizované řetězce v centralizovaném assetu místo toho, abyste makra LOCTEXT rozeseli po zdrojových souborech. Jsou ideální pro UI texty, dialogy a jakékoli řetězce, které potřebují upravovat designéři nebo autoři bez zásahu do kódu. String Tables lze definovat jako UE assety nebo importovat z 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
String Tables jsou Localization Dashboardem sesbírány automaticky. Pro řetězce definované ve String Table nepotřebujete makra LOCTEXT — stačí na ně odkazovat pomocí table ID a klíče v C++ nebo Blueprints.
4

Lokalizační vzory v C++

V C++ definujte LOCTEXT_NAMESPACE na začátku každého souboru .cpp a pro všechny uživatelsky viditelné řetězce používejte LOCTEXT. Pro dynamický obsah s proměnnými používejte FText::Format. Na konci souboru namespace vždy zrušte pomocí #undef, aby nedocházelo k únikům.

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());
Argumenty pro FText::Format musí být také FText, ne čisté FString. Použijte FText::FromString() pro převod hodnot FString, FText::AsNumber() pro formátování čísel podle locale a FText::AsCurrency() pro ceny. Konkatenace čistých FString vytváří text, který nerespektuje formátovací pravidla locale.
5

Lokalizace v Blueprintu

Všechny vlastnosti typu Text v Blueprintu jsou ve výchozím stavu FText, takže jsou už připravené na lokalizaci. Nastavte Key a Namespace v panelu s detaily vlastnosti, aby byly řetězce sesbíratelné. Pro dynamický obsah s proměnnými použijte uzel 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")
Rozbalte rozbalovací nabídku u vlastnosti textu v Blueprint Details panelu, abyste viděli pole Key, Namespace a Source String. Nastavení smysluplného Key výrazně usnadní překladatelům identifikaci řetězců v souboru .po.
6

Řešení plurálů a rodu

Unreal Engine podporuje formát zpráv ICU pro plurály i text závislý na rodu. Definujte pluralizační pravidla ve zdrojových řetězcích a UE automaticky vybere správnou formu podle pravidel CLDR aktivní kultury.

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)"
Nikdy nenaprogramujte natvrdo count == 1 pro rozpoznání singuláru. Ve francouzštině se 0 bere jako singulár. Ruština má samostatné tvary pro „few“ a „many“. Arabština má 6 tvarů množného čísla. Nechte logiku na pravidlech plurálu v ICU — definujte všechny požadované tvary a UE vybere pro danou kulturu ten správný.
7

Zabalit a otestovat lokalizaci

Před vydáním ověřte, že všechny cílové kultury mají zkompilované soubory .locres a že se text za běhu vykresluje správně. Použijte náhled kultury v Editoru, přepsání kultury z příkazové řádky a automatizované kontroly, abyste zachytili chybějící nebo poškozené překlady.

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.
Pokud kultura není uvedena v Project Settings > Packaging > Localizations to Package, její soubory .locres se do sestavení nezahrnou. Hráči, kteří si tento jazyk zvolí za běhu, uvidí záložní text nebo prázdné řetězce. Vždy ověřte, že nastavení balení odpovídá Vámi podporovaným kulturám.
8

Přidat fallback řetězce locale

Výchozí lokalizace v Unreal Engine provádí fallback pouze podle hierarchie IETF subtagů. Uživatel pt-BR, kterému chybí překlad, dostane angličtinu místo zcela použitelného překladu pt-PT. locale-chain-ue přidává konfigurovatelné boční fallback řetězce přes FTextLocalizationManager, takže regionální uživatelé vždy uvidí nejbližší dostupný překlad.

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);
Zavolejte ULocaleChain::Configure() jednou při startu, aby se načetlo 75 vestavěných fallback řetězců pokrývajících 11 jazykových rodin. Použijte ConfigureWithOverrides pro přizpůsobení vhodné pro Blueprints nebo ConfigureCustom v C++ pro plnou kontrolu nad chováním fallbacku.

Automatizovat kvalitu překladu

Zachyťte chybějící klíče a rozbité zástupné znaky dřív, než se dostanou do produkce, pomocí i18n-validate. Otestujte své UI pomocí pseudo-překladů s i18n-pseudo ještě předtím, než dorazí skutečné překlady.

Běžná úskalí

Používání FString pro text viditelný uživateli

FString obchází celý lokalizační proces. Text vytvořený pomocí FString::Printf nebo konkatenace řetězců nelze sesbírat, přeložit ani správně zobrazit v jazycích RTL. Pro řetězce viditelné uživateli vždy používejte FText s makry LOCTEXT a FText::Format.

Chybějící #undef LOCTEXT_NAMESPACE

Pokud na konci souboru .cpp zapomenete na #undef LOCTEXT_NAMESPACE, namespace „proteče“ do následujících překladových jednotek. Tím se potichu přiřadí nesprávné namespace řetězcům v jiných souborech a překlady se pak zobrazují ve špatném kontextu.

Natvrdo zakódovaná logika plurálu

Zápis 'count == 1 ? singular : plural' ignoruje pravidla CLDR. Francouzština považuje 0 za singulár, ruština má 4 tvary množného čísla, arabština 6. Použijte v šablonách FText syntaxi plurálu ICU a nechte UE zpracovat pravidla pro každou kulturu.

Zapomenutá kompilace po importu

Import souborů .po aktualizuje textová data, ale negeneruje binární soubory .locres. Hra pak za běhu stále načítá staré zkompilované překlady. Po importu vždy spusťte 'Compile' v Localization Dashboard, případně to přidejte do automatizace sestavení.

Doporučená struktura projektu

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

Vyzkoušejte i18n Agent nyní

Sem přetáhněte svůj překladový soubor

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

nebo klikněte a vyberte soubor

Cílové jazyky

Bez registraceOkamžitý odhad

Často kladené otázky