Skip to main content

De complete handleiding voor lokalisatie in Unreal Engine

Van FText-macro's tot locale-fallbackketens: lokaliseer je UE5-game met Localization Dashboard, String Tables, C++, Blueprints en automatische vertalingen.

1

FText en de lokalisatiepipeline

FText is het lokalisatiebewuste teksttype van Unreal Engine. Elke voor gebruikers zichtbare tekst in je game — labels, dialogen, tooltips en meldingen — moet FText gebruiken om door de lokalisatiepipeline te worden verwerkt. FString is uitsluitend bedoeld voor interne logica.

LOCTEXT vereist twee argumenten: een sleutel en een brontekst. De sleutel moet binnen de namespace uniek zijn. De tekstverzamelaar van UE gebruikt deze sleutels om vertalingen voor verschillende culturen bij te houden. Met NSLOCTEXT geef je de namespace expliciet op. LOCTEXT gebruikt de namespace van de omringende macro 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.
Stel voor gebruikers zichtbare tekst nooit samen met FString::Printf of door teksten aan elkaar te koppelen. Daarmee omzeil je de lokalisatiepipeline volledig: de resulterende tekst kan niet worden verzameld of vertaald en wordt in RTL-talen mogelijk onjuist weergegeven. Gebruik altijd FText::Format met LOCTEXT-patronen.
2

Localization Dashboard instellen

Localization Dashboard is het ingebouwde hulpmiddel van UE voor vertaalbeheer. Het verzamelt alle LOCTEXT- en NSLOCTEXT-teksten uit je broncode, exporteert ze als .po-bestanden voor vertaling en compileert de resultaten tot binaire .locres-bestanden die UE tijdens runtime laadt.

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
Voer 'Gather Text' uit na elke codewijziging die LOCTEXT-macro's toevoegt of aanpast. Als je deze stap overslaat, verschijnen nieuwe teksten niet in je .po-bestanden en zien vertalers ze niet. Voeg een verzamelstap toe aan je buildautomatisering om dit automatisch te bewaken.
3

String Tables gebruiken voor datagestuurde tekst

Met String Tables definieer je vertaalde teksten in één centrale asset in plaats van LOCTEXT-macro's over bronbestanden te verspreiden. Ze zijn ideaal voor tekst in de gebruikersinterface, dialogen en alle teksten die ontwerpers of schrijvers zonder codewijzigingen moeten kunnen bewerken. Je kunt String Tables als UE-assets definiëren of vanuit CSV importeren.

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 worden automatisch door Localization Dashboard verzameld. Voor teksten in een String Table heb je geen LOCTEXT-macro nodig: verwijs er in C++ of Blueprints eenvoudig naar met tabel-ID en sleutel.
4

Lokalisatiepatronen voor C++

Definieer in C++ bovenaan elk .cpp-bestand een LOCTEXT_NAMESPACE en gebruik LOCTEXT voor alle voor gebruikers zichtbare teksten. Gebruik FText::Format voor dynamische inhoud met variabelen. Hef de namespace aan het einde van het bestand altijd op om lekken te voorkomen.

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());
Argumenten voor FText::Format moeten ook FText zijn en geen onbewerkte FString. Gebruik FText::FromString() om FString-waarden om te zetten, FText::AsNumber() voor localegevoelige getalnotatie en FText::AsCurrency() voor prijzen. Het aan elkaar koppelen van onbewerkte FString-waarden levert tekst op die geen rekening houdt met de opmaakregels van de locale.
5

Lokalisatie in Blueprints

Alle eigenschappen van het type Text in Blueprints zijn standaard FText en dus al geschikt voor lokalisatie. Stel Key en Namespace in het detailvenster van de eigenschap in om teksten verzamelbaar te maken. Gebruik de node Format Text voor dynamische inhoud met variabelen.

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")
Vouw de keuzelijst van de teksteigenschap in het detailvenster van Blueprint uit om de velden Key, Namespace en Source String te zien. Een betekenisvolle Key maakt het voor vertalers veel eenvoudiger om teksten in het .po-bestand te herkennen.
6

Meervouden en grammaticaal geslacht verwerken

Unreal Engine ondersteunt ICU MessageFormat voor meervouden en geslachtsafhankelijke tekst. Definieer meervoudsregels in je bronteksten. UE selecteert dan automatisch de juiste vorm op basis van de CLDR-regels van de actieve cultuur.

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)"
Codeer count == 1 nooit hard om enkelvoud te herkennen. Frans behandelt 0 als enkelvoud. Russisch heeft afzonderlijke vormen voor 'few' en 'many'. Arabisch heeft 6 meervoudsvormen. Laat de ICU-meervoudsregels de logica verwerken: definieer alle vereiste vormen en UE kiest per cultuur de juiste.
7

Lokalisatie verpakken en testen

Controleer vóór de release of alle doelculturen gecompileerde .locres-bestanden hebben en of tekst tijdens runtime correct wordt weergegeven. Gebruik de cultuurvoorvertoning van de editor, cultuur-overschrijvingen via de opdrachtregel en automatische controles om ontbrekende of beschadigde vertalingen te vinden.

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.
Als een cultuur niet onder Project Settings > Packaging > Localizations to Package staat, worden de .locres-bestanden ervan niet in de build opgenomen. Spelers die die taal tijdens runtime selecteren, zien fallbacktekst of lege teksten. Controleer altijd of je verpakkingsinstellingen overeenkomen met de culturen die je ondersteunt.
8

Locale-fallbackketens toevoegen

De standaardlokalisatie van Unreal Engine valt alleen terug langs de hiërarchie van IETF-subtags. Een pt-BR-gebruiker bij wie een vertaling ontbreekt, krijgt Engels in plaats van een prima pt-PT-vertaling. locale-chain-ue voegt via FTextLocalizationManager configureerbare zijdelingse fallbackketens toe zodat regionale gebruikers altijd de best passende beschikbare vertaling zien.

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);
Roep ULocaleChain::Configure() bij het opstarten één keer aan om 75 ingebouwde fallbackketens voor 11 taalfamilies te laden. Gebruik ConfigureWithOverrides voor aanpassingen die goed vanuit Blueprints werken of ConfigureCustom in C++ voor volledige controle over het fallbackgedrag.

Vertaalkwaliteit automatisch bewaken

Vind ontbrekende sleutels en beschadigde placeholders vóór de release met i18n-validate. Test je gebruikersinterface met pseudovertalingen via i18n-pseudo voordat de echte vertalingen beschikbaar zijn.

Veelvoorkomende valkuilen

FString gebruiken voor voor gebruikers zichtbare tekst

FString omzeilt de volledige lokalisatiepipeline. Tekst die met FString::Printf of door aaneenschakeling is opgebouwd, kan niet worden verzameld of vertaald en wordt in RTL-talen mogelijk onjuist weergegeven. Gebruik voor zichtbare tekst altijd FText met LOCTEXT-macro's en FText::Format.

#undef LOCTEXT_NAMESPACE ontbreekt

Als je #undef LOCTEXT_NAMESPACE aan het einde van een .cpp-bestand vergeet, lekt de namespace naar volgende vertaaleenheden. Hierdoor worden ongemerkt verkeerde namespaces aan teksten in andere bestanden toegewezen en verschijnen vertalingen in de verkeerde context.

Hardgecodeerde meervoudslogica

De expressie 'count == 1 ? singular : plural' negeert CLDR-regels. Frans behandelt 0 als enkelvoud, Russisch heeft 4 meervoudsvormen en Arabisch 6. Gebruik ICU-meervoudssyntaxis in je FText-patronen en laat UE per cultuur de juiste regels toepassen.

Compileren na het importeren vergeten

Door .po-bestanden te importeren worden de tekstgegevens bijgewerkt maar worden geen binaire .locres-bestanden gegenereerd. Tijdens runtime laadt de game nog steeds de oude gecompileerde vertalingen. Voer na het importeren altijd 'Compile' uit in Localization Dashboard of voeg deze stap aan je buildautomatisering toe.

Aanbevolen projectstructuur

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

Probeer i18n Agent nu

Zet je vertaalbestand hier neer

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

of klik om een bestand te selecteren

Doeltalen

Geen registratie nodigDirecte prijsindicatie

Veelgestelde vragen