Skip to main content

Ο πλήρης οδηγός τοπικοποίησης στο Unreal Engine

Από τις μακροεντολές FText έως τις αλυσίδες εναλλακτικών τοπικών ρυθμίσεων: τοπικοποιήστε το παιχνίδι σας στο UE5 με το Localization Dashboard, τα String Tables, τη C++, τα Blueprints και την αυτοματοποιημένη μετάφραση.

1

Το FText και το pipeline τοπικοποίησης

Το FText είναι ο τύπος συμβολοσειράς του Unreal Engine που υποστηρίζει τοπικοποίηση. Κάθε συμβολοσειρά του παιχνιδιού σας που προορίζεται για τους χρήστες — ετικέτες UI, διάλογοι, αναδυόμενες επεξηγήσεις και ειδοποιήσεις — πρέπει να χρησιμοποιεί FText για να συμμετέχει στο pipeline τοπικοποίησης. Το FString προορίζεται αποκλειστικά για εσωτερική λογική.

Το LOCTEXT απαιτεί δύο ορίσματα: ένα κλειδί και μια συμβολοσειρά προέλευσης. Το κλειδί πρέπει να είναι μοναδικό μέσα στον χώρο ονομάτων του. Το εργαλείο συλλογής κειμένου του UE χρησιμοποιεί αυτά τα κλειδιά για να παρακολουθεί τις μεταφράσεις σε όλες τις τοπικές ρυθμίσεις. Το NSLOCTEXT σάς επιτρέπει να προσδιορίσετε ρητά τον χώρο ονομάτων, ενώ το LOCTEXT χρησιμοποιεί εκείνον που ορίζει η περιβάλλουσα μακροεντολή 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.
Μην κατασκευάζετε ποτέ κείμενο για τους χρήστες με FString::Printf ή συνένωση συμβολοσειρών. Αυτές οι μέθοδοι παρακάμπτουν πλήρως το pipeline τοπικοποίησης — το κείμενο που προκύπτει δεν μπορεί να συλλεχθεί, να μεταφραστεί ή να εμφανιστεί σωστά σε γλώσσες RTL. Να χρησιμοποιείτε πάντα FText::Format με μοτίβα LOCTEXT.
2

Ρύθμιση του Localization Dashboard

Το Localization Dashboard είναι το ενσωματωμένο εργαλείο του UE για τη διαχείριση μεταφράσεων. Συλλέγει όλες τις συμβολοσειρές LOCTEXT και NSLOCTEXT από τον πηγαίο κώδικα, τις εξάγει ως αρχεία .po προς μετάφραση και μεταγλωττίζει τα αποτελέσματα σε δυαδικά αρχεία .locres, τα οποία φορτώνει το UE κατά την εκτέλεση.

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
Εκτελείτε το 'Gather Text' έπειτα από κάθε αλλαγή κώδικα που προσθέτει ή τροποποιεί μακροεντολές LOCTEXT. Αν παραλείψετε αυτό το βήμα, οι νέες συμβολοσειρές δεν θα εμφανιστούν στα αρχεία .po και οι μεταφραστές δεν θα τις δουν. Προσθέστε ένα βήμα συλλογής στον αυτοματισμό του build, ώστε το πρόβλημα να εντοπίζεται αυτόματα.
3

Χρήση String Tables για κείμενο που βασίζεται σε δεδομένα

Τα String Tables σάς επιτρέπουν να ορίζετε τοπικοποιημένες συμβολοσειρές σε έναν κεντρικό πόρο αντί να διασκορπίζετε μακροεντολές LOCTEXT στα αρχεία πηγαίου κώδικα. Είναι ιδανικά για κείμενο UI, διαλόγους και κάθε συμβολοσειρά που πρέπει να επεξεργάζονται σχεδιαστές ή συγγραφείς χωρίς να αγγίζουν τον κώδικα. Τα String Tables μπορούν να οριστούν ως πόροι UE ή να εισαχθούν από 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 συλλέγονται αυτόματα από το Localization Dashboard. Δεν χρειάζεστε μακροεντολές LOCTEXT για συμβολοσειρές που ορίζονται σε String Table — απλώς αναφερθείτε σε αυτές μέσω του ID του πίνακα και του κλειδιού σε C++ ή Blueprints.
4

Μοτίβα τοπικοποίησης σε C++

Στη C++, ορίστε ένα LOCTEXT_NAMESPACE στην αρχή κάθε αρχείου .cpp και χρησιμοποιήστε LOCTEXT για όλες τις συμβολοσειρές που προορίζονται για τους χρήστες. Χρησιμοποιήστε FText::Format για δυναμικό περιεχόμενο με μεταβλητές. Να καταργείτε πάντα τον ορισμό του χώρου ονομάτων στο τέλος του αρχείου, ώστε να αποτρέπετε διαρροές.

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 πρέπει επίσης να είναι FText και όχι ανεπεξέργαστα FString. Χρησιμοποιήστε FText::FromString() για να μετατρέψετε τιμές FString, FText::AsNumber() για μορφοποίηση αριθμών βάσει τοπικών ρυθμίσεων και FText::AsCurrency() για τιμές. Η απευθείας συνένωση FString παράγει κείμενο που δεν σέβεται τους κανόνες μορφοποίησης των τοπικών ρυθμίσεων.
5

Τοπικοποίηση Blueprint

Όλες οι ιδιότητες Text στα Blueprints είναι από προεπιλογή FText και συνεπώς είναι ήδη έτοιμες για τοπικοποίηση. Ορίστε τα Key και Namespace στον πίνακα λεπτομερειών της ιδιότητας, ώστε να είναι δυνατή η συλλογή των συμβολοσειρών. Χρησιμοποιήστε τον κόμβο 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")
Αναπτύξτε το αναπτυσσόμενο μενού της ιδιότητας text στον πίνακα Blueprint Details για να δείτε τα πεδία Key, Namespace και Source String. Ένα περιγραφικό Key διευκολύνει σημαντικά τους μεταφραστές να αναγνωρίζουν τις συμβολοσειρές στο αρχείο .po.
6

Χειρισμός πληθυντικού και γένους

Το Unreal Engine υποστηρίζει τη μορφή μηνυμάτων ICU για πληθυντικούς και κείμενο που εξαρτάται από το γένος. Ορίστε κανόνες πληθυντικού στις συμβολοσειρές προέλευσης και το UE θα επιλέγει αυτόματα τον σωστό τύπο βάσει των κανόνων CLDR της ενεργής τοπικής ρύθμισης.

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)"
Μην χρησιμοποιείτε ποτέ τον σταθερό έλεγχο count == 1 για τον εντοπισμό του ενικού. Τα γαλλικά αντιμετωπίζουν το 0 ως ενικό. Τα ρωσικά έχουν διαφορετικούς τύπους για τις κατηγορίες 'few' και 'many'. Τα αραβικά έχουν 6 τύπους πληθυντικού. Αφήστε τους κανόνες πληθυντικού ICU να χειριστούν τη λογική — ορίστε όλους τους απαιτούμενους τύπους και το UE θα επιλέξει τον σωστό για κάθε τοπική ρύθμιση.
7

Πακετάρισμα και δοκιμή της τοπικοποίησης

Πριν από τη δημοσίευση, επαληθεύστε ότι όλες οι τοπικές ρυθμίσεις προορισμού διαθέτουν μεταγλωττισμένα αρχεία .locres και ότι το κείμενο αποδίδεται σωστά κατά την εκτέλεση. Χρησιμοποιήστε την προεπισκόπηση τοπικής ρύθμισης του Editor, τις παραμέτρους παράκαμψης τοπικής ρύθμισης στη γραμμή εντολών και αυτοματοποιημένους ελέγχους για να εντοπίσετε μεταφράσεις που λείπουν ή είναι προβληματικές.

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.
Αν μια τοπική ρύθμιση δεν παρατίθεται στη διαδρομή Project Settings > Packaging > Localizations to Package, τα αρχεία .locres της εξαιρούνται από το build. Οι παίκτες που επιλέγουν αυτή τη γλώσσα κατά την εκτέλεση θα βλέπουν εναλλακτικό κείμενο ή κενές συμβολοσειρές. Να επαληθεύετε πάντα ότι οι ρυθμίσεις πακεταρίσματος συμφωνούν με τις τοπικές ρυθμίσεις που υποστηρίζετε.
8

Προσθήκη αλυσίδων εναλλακτικών τοπικών ρυθμίσεων

Η προεπιλεγμένη τοπικοποίηση του Unreal Engine χρησιμοποιεί ως εναλλακτικές μόνο τις τοπικές ρυθμίσεις που προκύπτουν από την ιεραρχία υποετικετών IETF. Ένας χρήστης pt-BR που δεν έχει διαθέσιμη μετάφραση βλέπει αγγλικά αντί για μια απολύτως κατάλληλη μετάφραση pt-PT. Το locale-chain-ue προσθέτει παραμετροποιήσιμες πλευρικές αλυσίδες εναλλακτικών τοπικών ρυθμίσεων μέσω του FTextLocalizationManager, ώστε οι χρήστες κάθε περιοχής να βλέπουν πάντα την πλησιέστερη διαθέσιμη μετάφραση.

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);
Καλέστε την ULocaleChain::Configure() μία φορά κατά την εκκίνηση για να φορτώσετε 75 ενσωματωμένες αλυσίδες εναλλακτικών τοπικών ρυθμίσεων, οι οποίες καλύπτουν 11 γλωσσικές οικογένειες. Χρησιμοποιήστε την ConfigureWithOverrides για προσαρμογή μέσω Blueprint ή την ConfigureCustom στη C++ για πλήρη έλεγχο της συμπεριφοράς των εναλλακτικών.

Αυτοματοποιήστε τον έλεγχο ποιότητας των μεταφράσεων

Εντοπίστε με το i18n-validate τα κλειδιά που λείπουν και τα κατεστραμμένα placeholder πριν φτάσουν στην παραγωγή. Δοκιμάστε το UI σας με ψευδομεταφράσεις μέσω του i18n-pseudo πριν παραλάβετε τις πραγματικές μεταφράσεις.

Συνήθεις παγίδες

Χρήση FString για κείμενο που προορίζεται για τους χρήστες

Το FString παρακάμπτει ολόκληρο το pipeline τοπικοποίησης. Το κείμενο που δημιουργείται με FString::Printf ή συνένωση συμβολοσειρών δεν μπορεί να συλλεχθεί, να μεταφραστεί ή να εμφανιστεί σωστά σε γλώσσες RTL. Να χρησιμοποιείτε πάντα FText με μακροεντολές LOCTEXT και FText::Format για συμβολοσειρές ορατές στους χρήστες.

Απουσία του #undef LOCTEXT_NAMESPACE

Αν ξεχάσετε το #undef LOCTEXT_NAMESPACE στο τέλος ενός αρχείου .cpp, ο χώρος ονομάτων διαρρέει στις επόμενες μονάδες μετάφρασης. Έτσι εκχωρούνται αθόρυβα λανθασμένοι χώροι ονομάτων σε συμβολοσειρές άλλων αρχείων και οι μεταφράσεις εμφανίζονται σε λάθος συμφραζόμενα.

Σκληροκωδικοποιημένη λογική πληθυντικού

Η έκφραση 'count == 1 ? singular : plural' αγνοεί τους κανόνες CLDR. Τα γαλλικά αντιμετωπίζουν το 0 ως ενικό, τα ρωσικά έχουν 4 τύπους πληθυντικού και τα αραβικά 6. Χρησιμοποιήστε σύνταξη πληθυντικού ICU στα μοτίβα FText και αφήστε το UE να χειριστεί τους κανόνες ανά τοπική ρύθμιση.

Παράλειψη μεταγλώττισης μετά την εισαγωγή

Η εισαγωγή αρχείων .po ενημερώνει τα δεδομένα κειμένου, αλλά δεν δημιουργεί δυαδικά αρχεία .locres. Το παιχνίδι εξακολουθεί να φορτώνει τις παλιές μεταγλωττισμένες μεταφράσεις κατά την εκτέλεση. Να εκτελείτε πάντα το 'Compile' στο Localization Dashboard μετά την εισαγωγή ή να το προσθέτετε στον αυτοματισμό του build.

Προτεινόμενη δομή έργου

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

Δοκιμάστε τώρα το i18n Agent

Αφήστε εδώ το αρχείο μετάφρασής σας

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

ή κάντε κλικ για να επιλέξετε αρχείο

Γλώσσες-στόχοι

Δεν απαιτείται εγγραφήΆμεση εκτίμηση

Συχνές ερωτήσεις