Skip to main content

Le guide complet de la localisation Unreal Engine

Des macros FText aux chaînes de repli de locale : localisez votre jeu UE5 avec le Localization Dashboard, les String Tables, le C++, les Blueprints et la traduction automatisée.

1

FText et le pipeline de localisation

FText est le type de chaîne d'Unreal Engine conçu pour la localisation. Chaque chaîne visible par l'utilisateur dans votre jeu (libellés d'interface, dialogues, infobulles, notifications) doit utiliser FText pour participer au pipeline de localisation. FString est réservé à la logique interne.

LOCTEXT requiert deux arguments : une clé et une chaîne source. La clé doit être unique au sein de son espace de noms. Le collecteur de texte d'UE utilise ces clés pour suivre les traductions à travers les cultures. NSLOCTEXT permet de spécifier explicitement l'espace de noms ; LOCTEXT utilise l'espace de noms défini par la macro LOCTEXT_NAMESPACE englobante.
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.
Ne construisez jamais de texte visible par l'utilisateur avec FString::Printf ou une concaténation de chaînes. Cela contourne entièrement le pipeline de localisation : le texte obtenu ne peut être ni collecté, ni traduit, ni affiché correctement dans les langues RTL. Utilisez toujours FText::Format avec des motifs LOCTEXT à la place.
2

Configurer le Localization Dashboard

Le Localization Dashboard est l'outil intégré d'UE pour gérer les traductions. Il collecte toutes les chaînes LOCTEXT et NSLOCTEXT de votre code source, les exporte sous forme de fichiers .po pour la traduction, puis compile les résultats en fichiers binaires .locres qu'UE charge au moment de l'exécution.

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
Exécutez « Gather Text » après chaque modification de code ajoutant ou modifiant des macros LOCTEXT. Omettre cette étape signifie que les nouvelles chaînes n'apparaîtront pas dans vos fichiers .po et que les traducteurs ne les verront pas. Ajoutez une étape de collecte à votre automatisation de build pour détecter cela automatiquement.
3

Utiliser les String Tables pour un texte piloté par les données

Les String Tables permettent de définir des chaînes localisées dans un asset centralisé plutôt que de disperser des macros LOCTEXT à travers les fichiers source. Elles sont idéales pour le texte d'interface, les dialogues et toute chaîne que les designers ou rédacteurs doivent pouvoir modifier sans toucher au code. Les String Tables peuvent être définies comme assets UE ou importées depuis un fichier 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
Les String Tables sont collectées automatiquement par le Localization Dashboard. Vous n'avez pas besoin de macros LOCTEXT pour les chaînes définies dans une String Table : référencez-les simplement par l'ID de la table et la clé, en C++ ou dans les Blueprints.
4

Modèles de localisation en C++

En C++, définissez un LOCTEXT_NAMESPACE en début de chaque fichier .cpp et utilisez LOCTEXT pour toutes les chaînes visibles par l'utilisateur. Utilisez FText::Format pour le contenu dynamique avec variables. Annulez toujours la définition de l'espace de noms en fin de fichier pour éviter les fuites.

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());
Les arguments de FText::Format doivent également être des FText, et non des FString bruts. Utilisez FText::FromString() pour convertir des valeurs FString, FText::AsNumber() pour un formatage des nombres tenant compte de la locale, et FText::AsCurrency() pour les prix. La concaténation de FString bruts produit un texte qui ne respecte pas les règles de formatage propres à la locale.
5

Localisation des Blueprints

Toutes les propriétés Text des Blueprints sont des FText par défaut, elles sont donc déjà prêtes pour la localisation. Définissez la Key et le Namespace dans le panneau de détails de la propriété pour rendre les chaînes collectables. Utilisez le nœud Format Text pour le contenu dynamique avec variables.

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")
Déployez le menu déroulant de la propriété texte dans le panneau Blueprint Details pour voir les champs Key, Namespace et Source String. Définir une Key parlante facilite grandement l'identification des chaînes par les traducteurs dans le fichier .po.
6

Gérer le pluriel et le genre

Unreal Engine prend en charge le format de message ICU pour le pluriel et le texte dépendant du genre. Définissez les règles de pluriel dans vos chaînes source et UE sélectionne automatiquement la forme correcte en fonction des règles CLDR de la culture active.

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)"
Ne codez jamais en dur count == 1 pour détecter le singulier. Le français traite 0 comme un singulier. Le russe possède des formes distinctes pour « quelques » et « beaucoup ». L'arabe compte 6 formes plurielles. Laissez les règles de pluriel ICU gérer cette logique : définissez toutes les formes requises et UE sélectionne la bonne pour chaque culture.
7

Packager et tester la localisation

Avant la sortie, vérifiez que toutes les cultures cibles disposent de fichiers .locres compilés et que le texte s'affiche correctement à l'exécution. Utilisez l'aperçu de culture de l'éditeur, les surcharges de culture en ligne de commande et des vérifications automatisées pour détecter les traductions manquantes ou défectueuses.

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.
Si une culture n'est pas répertoriée dans Project Settings > Packaging > Localizations to Package, ses fichiers .locres sont exclus du build. Les joueurs sélectionnant cette langue à l'exécution verront un texte de repli ou des chaînes vides. Vérifiez toujours que vos paramètres de packaging correspondent à vos cultures prises en charge.
8

Ajouter des chaînes de repli de locale

La localisation par défaut d'Unreal Engine ne se replie que le long de la hiérarchie des sous-étiquettes IETF. Un utilisateur pt-BR dont une traduction est manquante obtient l'anglais au lieu d'une traduction pt-PT parfaitement valable. locale-chain-ue ajoute des chaînes de repli latérales configurables via FTextLocalizationManager, afin que les utilisateurs régionaux voient toujours la traduction disponible la plus proche.

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);
Appelez ULocaleChain::Configure() une seule fois au démarrage pour charger 75 chaînes de repli intégrées couvrant 11 familles de langues. Utilisez ConfigureWithOverrides pour une personnalisation adaptée aux Blueprints, ou ConfigureCustom en C++ pour un contrôle total du comportement de repli.

Automatiser la qualité des traductions

Détectez les clés manquantes et les espaces réservés cassés avant leur mise en production grâce à i18n-validate. Testez votre interface avec des pseudo-traductions grâce à i18n-pseudo avant l'arrivée des traductions réelles.

Pièges courants

Utiliser FString pour du texte visible par l'utilisateur

FString contourne l'ensemble du pipeline de localisation. Un texte construit avec FString::Printf ou une concaténation de chaînes ne peut être ni collecté, ni traduit, ni affiché correctement dans les langues RTL. Utilisez toujours FText avec les macros LOCTEXT et FText::Format pour les chaînes visibles par l'utilisateur.

#undef LOCTEXT_NAMESPACE manquant

Oublier de faire #undef LOCTEXT_NAMESPACE en fin de fichier .cpp fait fuiter l'espace de noms vers les unités de traduction suivantes. Cela assigne silencieusement de mauvais espaces de noms aux chaînes d'autres fichiers, faisant apparaître les traductions dans le mauvais contexte.

Logique de pluriel codée en dur

Écrire « count == 1 ? singular : plural » ignore les règles CLDR. Le français traite 0 comme un singulier, le russe possède 4 formes plurielles, l'arabe en compte 6. Utilisez la syntaxe de pluriel ICU dans vos motifs FText et laissez UE gérer les règles pour chaque culture.

Compilation oubliée après l'import

Importer des fichiers .po met à jour les données textuelles mais ne génère pas les binaires .locres. Le jeu continue de charger les anciennes traductions compilées à l'exécution. Exécutez toujours « Compile » dans le Localization Dashboard après l'import, ou ajoutez cette étape à votre automatisation de build.

Structure de projet recommandée

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

Essayez i18n Agent maintenant

Déposez votre fichier de traduction ici

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

ou cliquez pour parcourir

Langues cibles

Aucune inscription requiseEstimation instantanée

Questions fréquentes