Skip to main content

Az Unreal Engine-lokalizáció teljes útmutatója

Az FText makróktól a területi tartalékláncokig: lokalizálja UE5-játékát a Localization Dashboard, String Tables, C++, Blueprints és automatizált fordítás használatával.

1

FText és a lokalizációs folyamat

Az FText az Unreal Engine lokalizációt ismerő karakterlánctípusa. A játék minden felhasználóknak szánt szövegének — felületi címkéknek, párbeszédnek, elemleírásnak, értesítésnek — FText típust kell használnia a lokalizációs folyamatban való részvételhez. Az FString csak belső logikához való.

A LOCTEXT két argumentumot igényel: kulcsot és forrásszöveget. A kulcsnak egyedinek kell lennie a névterén belül. Az UE szöveggyűjtője ezekkel követi a fordításokat kultúrák között. Az NSLOCTEXT kifejezetten megadja a névteret; a LOCTEXT a körülvevő LOCTEXT_NAMESPACE makró névterét használja.
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.
Soha ne készítsen felhasználóknak szánt szöveget FString::Printf vagy karakterlánc-összefűzés segítségével. Ezek teljesen megkerülik a lokalizációs folyamatot — az eredmény nem gyűjthető, fordítható vagy jeleníthető meg helyesen RTL-nyelveken. Mindig FText::Format elemet használjon LOCTEXT-mintákkal.
2

A Localization Dashboard beállítása

A Localization Dashboard az UE beépített fordításkezelő eszköze. Összegyűjti a forráskód minden LOCTEXT és NSLOCTEXT karakterláncát, .po fájlokba exportálja fordításhoz, majd az eredményt futásidőben betöltött .locres bináris fájlokká fordítja.

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
Minden LOCTEXT makrót hozzáadó vagy módosító kódváltozás után futtassa a „Gather Text” parancsot. Enélkül az új karakterláncok nem jelennek meg a .po fájlokban, és a fordítók nem látják őket. Automatikus észleléshez adjon gyűjtési lépést a buildautomatizáláshoz.
3

String Table táblák használata adatvezérelt szöveghez

A String Table táblák központi erőforrásban határozzák meg a lokalizált karakterláncokat a forrásfájlokba szórt LOCTEXT makrók helyett. Ideálisak felületi szöveghez, párbeszédhez és minden olyan karakterlánchoz, amelyet tervezők vagy írók kódmódosítás nélkül szerkesztenek. UE-erőforrásként vagy CSV-ből importálva hozhatók létre.

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
A Localization Dashboard automatikusan összegyűjti a String Table táblákat. Az ott meghatározott karakterláncokhoz nincs szükség LOCTEXT makróra — C++-ban vagy Blueprintben a táblaazonosító és kulcs alapján hivatkozzon rájuk.
4

C++ lokalizációs minták

C++-ban minden .cpp fájl elején határozzon meg LOCTEXT_NAMESPACE értéket, és minden felhasználóknak szánt karakterlánchoz használjon LOCTEXT elemet. Dinamikus, változókat tartalmazó tartalomhoz FText::Format szükséges. A fájl végén mindig szüntesse meg a névteret a kiszivárgás elkerüléséhez.

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());
Az FText::Format argumentumainak is FText típusúnak kell lenniük, nem nyers FStringnek. FString átalakításához FText::FromString(), területérzékeny számformázáshoz FText::AsNumber(), árakhoz FText::AsCurrency() szükséges. A nyers FString-összefűzés nem tartja be a területi formázási szabályokat.
5

Blueprint-lokalizáció

A Blueprintek minden Text tulajdonsága alapértelmezés szerint FText, tehát már lokalizálható. A karakterláncok gyűjthetőségéhez állítsa be a Key és Namespace értéket a tulajdonság részletezőpaneljén. Dinamikus, változós tartalomhoz használja a Format Text csomópontot.

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")
A Blueprint Details panelen bontsa ki a szövegtulajdonság legördülőjét a Key, Namespace és Source String mezők megtekintéséhez. A jelentésteli kulcs sokkal egyszerűbbé teszi a fordítók számára a karakterlánc azonosítását a .po fájlban.
6

Többes számok és nem kezelése

Az Unreal Engine támogatja az ICU-üzenetformátumot többes számokhoz és nemfüggő szöveghez. Határozza meg a többesszám-szabályokat a forrásszövegekben, az UE pedig az aktív kultúra CLDR-szabályai alapján automatikusan kiválasztja a megfelelő alakot.

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)"
Soha ne égessen be count == 1 feltételt az egyes szám felismeréséhez. A francia a 0 értéket egyes számként kezeli, az orosznak külön „few” és „many” alakja, az arabnak 6 alakja van. Bízza a logikát az ICU-szabályokra — határozza meg minden szükséges alakot, az UE pedig kultúránként választ.
7

Lokalizáció csomagolása és tesztelése

Kiadás előtt ellenőrizze, hogy minden célkultúrához van lefordított .locres fájl, és a szöveg futásidőben helyesen renderelődik. A hiányzó vagy hibás fordítások észleléséhez használja a szerkesztő kultúraelőnézetét, parancssori kultúrafelülírást és automatizált ellenőrzéseket.

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.
Ha egy kultúra nem szerepel a Project Settings > Packaging > Localizations to Package listában, .locres fájljai kimaradnak a buildből. Az adott nyelvet választó játékosok tartalékszöveget vagy üres karakterláncot látnak. Mindig ellenőrizze, hogy a csomagolási beállítások megfelelnek a támogatott kultúráknak.
8

Területi tartalékláncok hozzáadása

Az Unreal Engine alapértelmezett lokalizációja csak az IETF alcímke-hierarchiában vált tartalékra. Egy hiányzó fordítással találkozó pt-BR felhasználó angolt kap a megfelelő pt-PT helyett. A locale-chain-ue az FTextLocalizationManageren keresztül beállítható oldalirányú láncokat ad, így a regionális felhasználók mindig a legközelebbi elérhető fordítást látják.

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);
Induláskor egyszer hívja meg az ULocaleChain::Configure() függvényt 11 nyelvcsalád 75 beépített láncának betöltéséhez. Blueprint-barát testreszabáshoz ConfigureWithOverrides, C++-ban teljes vezérléshez ConfigureCustom szükséges.

A fordítási minőség automatizálása

Az i18n-validate segítségével még kiadás előtt találja meg a hiányzó kulcsokat és hibás helyőrzőket. Az i18n-pseudo használatával valódi fordítások beérkezése előtt tesztelje a felületet pszeudofordításokkal.

Gyakori buktatók

FString használata felhasználóknak szánt szöveghez

Az FString megkerüli a teljes lokalizációs folyamatot. Az FString::Printf vagy összefűzés segítségével készült szöveg nem gyűjthető, fordítható vagy jeleníthető meg helyesen RTL-nyelveken. Látható karakterláncokhoz mindig FText elemet, LOCTEXT makrót és FText::Format függvényt használjon.

Hiányzó #undef LOCTEXT_NAMESPACE

Ha egy .cpp fájl végén elmarad a #undef LOCTEXT_NAMESPACE, a névtér átszivárog a következő fordítási egységekbe. Ez csendben hibás névteret rendel más fájlok karakterláncaihoz, így a fordítások rossz kontextusban jelennek meg.

Beégetett többesszám-logika

A „count == 1 ? singular : plural” figyelmen kívül hagyja a CLDR-szabályokat. A francia a 0 értéket egyes számként kezeli, az orosznak 4, az arabnak 6 alakja van. Használjon ICU többesszám-szintaxist FText-mintákban, és bízza kultúránként az UE-re a szabályokat.

Fordítás elfelejtése importálás után

A .po fájlok importálása frissíti a szövegadatokat, de nem hoz létre .locres binárisokat. A játék futásidőben továbbra is a régi fordításokat tölti be. Importálás után mindig futtassa a „Compile” parancsot a Localization Dashboardban, vagy adja a buildautomatizáláshoz.

Ajánlott projektszerkezet

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

Try i18n Agent Now

Drop your translation file here

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

or click to browse

Target languages

No signup requiredInstant estimate

Gyakran Ismételt Kérdések