Skip to main content

Pilnīgs Unreal Engine lokalizācijas ceļvedis

No FText makrokomandām līdz lokalizāciju atkāpšanās ķēdēm: lokalizējiet UE5 spēli ar Localization Dashboard, String Tables, C++, Blueprints un automatizētu tulkošanu.

1

FText un lokalizācijas konveijers

FText ir lokalizāciju apzinošs Unreal Engine virkņu tips. Katrai lietotājiem redzamai spēles virknei — UI etiķetēm, dialogiem, rīka padomiem, paziņojumiem — jāizmanto FText, lai piedalītos lokalizācijas konveijerā. FString paredzēts tikai iekšējai loģikai.

LOCTEXT vajadzīgi divi argumenti: atslēga un avota virkne. Atslēgai jābūt unikālai savā nosaukumvietā. UE teksta savācējs izmanto šīs atslēgas tulkojumu izsekošanai starp kultūrām. NSLOCTEXT ļauj skaidri norādīt nosaukumvietu, bet LOCTEXT izmanto aptverošās makrokomandas LOCTEXT_NAMESPACE definēto nosaukumvietu.
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.
Nekad neveidojiet lietotājiem redzamu tekstu ar FString::Printf vai virkņu savienošanu. Tie pilnībā apiet lokalizācijas konveijeru, tādēļ iegūto tekstu nevar savākt, iztulkot vai pareizi rādīt RTL valodās. Vienmēr izmantojiet FText::Format ar LOCTEXT modeļiem.
2

Iestatīt Localization Dashboard

Localization Dashboard ir UE iebūvētais tulkojumu pārvaldības rīks. Tas savāc visas LOCTEXT un NSLOCTEXT virknes no pirmkoda, eksportē tās .po failos tulkošanai un kompilē rezultātus bināros .locres failos, ko UE ielādē izpildlaikā.

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
Pēc katras koda izmaiņas, kas pievieno vai maina LOCTEXT makrokomandas, palaidiet „Gather Text“. Izlaižot šo soli, jaunas virknes neparādīsies .po failos un tulkotāji tās neredzēs. Pievienojiet savākšanas soli būvējuma automatizācijai, lai to atklātu automātiski.
3

Izmantot String Tables uz datiem balstītam tekstam

String Tables ļauj definēt lokalizētas virknes centralizētā resursā, nevis izkaisīt LOCTEXT makrokomandas pa pirmkoda failiem. Tās ir ideāli piemērotas UI tekstam, dialogiem un visām virknēm, ko dizaineriem vai rakstniekiem jārediģē, nepieskaroties kodam. String Tables var definēt kā UE resursus vai importēt no 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 automātiski savāc String Tables. String Table definētām virknēm LOCTEXT makrokomandas nav vajadzīgas: C++ vai Blueprints vienkārši atsaucieties uz tām ar tabulas ID un atslēgu.
4

C++ lokalizācijas modeļi

C++ vidē katra .cpp faila augšdaļā definējiet LOCTEXT_NAMESPACE un visām lietotājiem redzamām virknēm izmantojiet LOCTEXT. Dinamiskam saturam ar mainīgajiem izmantojiet FText::Format. Faila beigās vienmēr atceliet nosaukumvietas definīciju, lai tā nenoplūstu.

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());
FText::Format argumentiem arī jābūt FText, nevis neapstrādātam FString. FString vērtību pārveidošanai izmantojiet FText::FromString(), lokalizācijai atbilstošai skaitļu formatēšanai — FText::AsNumber(), cenām — FText::AsCurrency(). Neapstrādāta FString savienošana rada tekstu, kas neievēro lokalizāciju formatēšanas kārtulas.
5

Blueprint lokalizācija

Visi Blueprints rekvizīti Text pēc noklusējuma ir FText, tādēļ jau ir gatavi lokalizācijai. Rekvizītu detaļu panelī iestatiet Key un Namespace, lai virknes varētu savākt. Dinamiskam saturam ar mainīgajiem izmantojiet mezglu 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")
Blueprint Details panelī izvērsiet teksta rekvizīta izvēlni, lai redzētu laukus Key, Namespace un Source String. Jēgpilns Key tulkotājiem ievērojami atvieglo virkņu atpazīšanu .po failā.
6

Apstrādāt daudzskaitli un dzimti

Unreal Engine atbalsta ICU ziņojumu formātu daudzskaitlim un no dzimtes atkarīgam tekstam. Definējiet daudzskaitļa kārtulas avota virknēs, un UE automātiski izvēlēsies pareizo formu pēc aktīvās kultūras CLDR kārtulām.

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)"
Vienskaitļa noteikšanai nekad tieši neierakstiet count == 1. Franču valodā 0 uzskata par vienskaitli. Krievu valodā ir atsevišķas few un many formas. Arābu valodā ir 6 daudzskaitļa formas. Ļaujiet loģiku apstrādāt ICU daudzskaitļa kārtulām: definējiet visas vajadzīgās formas, un UE izvēlēsies pareizo katrai kultūrai.
7

Pakot un testēt lokalizāciju

Pirms izlaišanas pārbaudiet, vai visām mērķa kultūrām ir kompilēti .locres faili un teksts izpildlaikā tiek rādīts pareizi. Izmantojiet redaktora kultūras priekšskatījumu, komandrindas kultūras pārrakstīšanu un automatizētas pārbaudes trūkstošu vai bojātu tulkojumu atrašanai.

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.
Ja kultūra nav norādīta Project Settings > Packaging > Localizations to Package, tās .locres faili tiek izslēgti no būvējuma. Spēlētāji, kas izpildlaikā izvēlas šo valodu, redzēs atkāpšanās tekstu vai tukšas virknes. Vienmēr pārbaudiet, vai pakošanas iestatījumi atbilst atbalstītajām kultūrām.
8

Pievienot lokalizāciju atkāpšanās ķēdes

Unreal Engine noklusējuma lokalizācija atkāpjas tikai pa IETF apakštagu hierarhiju. pt-BR lietotājs, kam trūkst tulkojuma, laba pt-PT tulkojuma vietā saņem angļu valodu. locale-chain-ue ar FTextLocalizationManager pievieno konfigurējamas sānu atkāpšanās ķēdes, lai reģionālie lietotāji vienmēr redzētu tuvāko pieejamo tulkojumu.

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);
Palaišanas laikā vienreiz izsauciet ULocaleChain::Configure(), lai ielādētu 75 iebūvētas atkāpšanās ķēdes, kas aptver 11 valodu saimes. Blueprints draudzīgai pielāgošanai izmantojiet ConfigureWithOverrides, bet pilnai C++ kontrolei — ConfigureCustom.

Automatizēt tulkojumu kvalitāti

Ar i18n-validate pirms izlaišanas atrodiet trūkstošās atslēgas un bojātos vietturus. Kamēr īstie tulkojumi vēl nav gatavi, pārbaudiet UI ar i18n-pseudo pseidotulkojumiem.

Biežākās kļūdas

FString lietošana lietotājiem redzamam tekstam

FString apiet visu lokalizācijas konveijeru. Ar FString::Printf vai virkņu savienošanu veidotu tekstu nevar savākt, iztulkot vai pareizi rādīt RTL valodās. Lietotājiem redzamām virknēm vienmēr izmantojiet FText ar LOCTEXT makrokomandām un FText::Format.

Trūkst #undef LOCTEXT_NAMESPACE

Aizmirstot .cpp faila beigās atcelt LOCTEXT_NAMESPACE ar #undef, nosaukumvieta noplūst nākamajās tulkošanas vienībās. Tas klusām piešķir nepareizas nosaukumvietas citu failu virknēm, tādēļ tulkojumi parādās nepareizā kontekstā.

Tieši ierakstīta daudzskaitļa loģika

Rakstot 'count == 1 ? singular : plural', tiek ignorētas CLDR kārtulas. Franču valodā 0 uzskata par vienskaitli, krievu valodā ir 4 daudzskaitļa formas, arābu — 6. FText modeļos izmantojiet ICU daudzskaitļa sintaksi un ļaujiet UE apstrādāt katras kultūras kārtulas.

Aizmirsts kompilēt pēc importēšanas

Importējot .po failus, tiek atjaunināti teksta dati, bet netiek ģenerēti .locres binārie faili. Izpildlaikā spēle joprojām ielādē vecos kompilētos tulkojumus. Pēc importēšanas vienmēr palaidiet „Compile“ Localization Dashboard vai pievienojiet to būvējuma automatizācijai.

Ieteicamā projekta struktūra

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

Izmēģiniet i18n Agent tūlīt

Nometiet tulkošanas failu šeit

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

vai noklikšķiniet, lai izvēlētos

Mērķa valodas

Reģistrācija nav vajadzīgaTūlītēja tāme

Bieži uzdotie jautājumi