Skip to main content

Guía completa de localización de Unreal Engine

De las macros FText a las cadenas regionales: localice su juego UE5 con el panel de localización, String Tables, C++, Blueprints y traducción automatizada.

1

FText y el proceso de localización

FText es el tipo de cadena de Unreal Engine consciente de la localización. Todas las cadenas dirigidas al usuario —etiquetas, diálogos, información sobre herramientas y notificaciones— deben utilizar FText para participar en el proceso. FString es solo para lógica interna.

LOCTEXT requiere dos argumentos: una clave y una cadena de origen. La clave debe ser única en su espacio de nombres. El recopilador de UE las utiliza para seguir traducciones entre culturas. NSLOCTEXT permite indicar expresamente el espacio; LOCTEXT usa el definido por la macro LOCTEXT_NAMESPACE circundante.
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.
Nunca cree texto dirigido al usuario mediante FString::Printf ni concatenación. Eluden todo el proceso: el texto resultante no puede recopilarse ni traducirse, ni mostrarse bien en idiomas RTL. Utilice siempre FText::Format con patrones LOCTEXT.
2

Configurar el panel de localización

El panel de localización es la herramienta integrada de UE. Recopila las cadenas LOCTEXT y NSLOCTEXT del código, las exporta como .po para traducirlas y compila el resultado como binarios .locres que UE carga durante la ejecución.

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
Ejecute 'Gather Text' después de cada cambio que añada o modifique macros LOCTEXT. Si omite este paso, las cadenas nuevas no aparecerán en .po y los traductores no las verán. Añádalo a la automatización de compilación.
3

Utilizar String Tables para texto basado en datos

String Tables permite definir cadenas localizadas en un recurso centralizado en vez de dispersar macros LOCTEXT por el código. Resultan ideales para texto de interfaz, diálogos y contenido que diseñadores o redactores deban editar sin tocar código. Pueden ser recursos de UE o importarse desde 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
El panel recopila automáticamente las String Tables. No necesita macros LOCTEXT para sus cadenas: haga referencia a ellas mediante el identificador de tabla y la clave en C++ o Blueprints.
4

Patrones de localización en C++

En C++, defina LOCTEXT_NAMESPACE al principio de cada .cpp y utilice LOCTEXT para todo texto dirigido al usuario. Use FText::Format para contenido dinámico con variables. Anule siempre el espacio al final para evitar filtraciones.

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());
Los argumentos de FText::Format también deben ser FText, no FString sin procesar. Utilice FText::FromString() para convertir FString, FText::AsNumber() para números según la región y FText::AsCurrency() para precios. Concatenar FString produce texto que no respeta las reglas regionales.
5

Localización en Blueprint

Todas las propiedades Text de Blueprints son FText de forma predeterminada, por lo que ya están preparadas. Defina Key y Namespace en el panel de detalles para poder recopilarlas. Utilice el nodo Format Text para contenido dinámico.

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")
Expanda el desplegable de la propiedad de texto en Blueprint Details para ver Key, Namespace y Source String. Una Key descriptiva facilita mucho que los traductores identifiquen las cadenas en .po.
6

Gestionar plurales y género

Unreal Engine admite el formato de mensajes ICU para plurales y texto según el género. Defina las reglas en las cadenas de origen y UE seleccionará automáticamente la forma correcta conforme a CLDR de la cultura activa.

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)"
Nunca codifique count == 1 para detectar singulares. El francés considera singular el 0, el ruso tiene «few» y «many», y el árabe 6 formas. Deje la lógica a ICU: defina todas las formas y UE elegirá por cultura.
7

Empaquetar y probar la localización

Antes de publicar, compruebe que todas las culturas de destino tengan archivos .locres compilados y que el texto se renderice bien. Utilice la vista previa cultural del editor, sustituciones por línea de comandos y comprobaciones automatizadas para detectar traducciones rotas o ausentes.

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 una cultura no figura en Project Settings > Packaging > Localizations to Package, sus .locres se excluyen de la compilación. Los jugadores que la elijan verán texto de respaldo o cadenas vacías. Verifique siempre que los ajustes coincidan con las culturas admitidas.
8

Añadir cadenas de respaldo regional

La localización predeterminada de Unreal Engine solo sigue la jerarquía de subetiquetas IETF. Un usuario pt-BR sin traducción recibe inglés en vez de pt-PT. locale-chain-ue añade cadenas laterales configurables mediante FTextLocalizationManager para mostrar siempre la traducción disponible más próxima.

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);
Llame a ULocaleChain::Configure() una vez al iniciar para cargar 75 cadenas que cubren 11 familias. Utilice ConfigureWithOverrides para personalizar desde Blueprint o ConfigureCustom en C++ para controlar todo el comportamiento.

Automatizar la calidad de la traducción

Detecte las claves ausentes y los marcadores rotos antes de publicar con i18n-validate. Pruebe la interfaz con pseudotraducciones mediante i18n-pseudo antes de recibir las reales.

Errores habituales

Utilizar FString para texto dirigido al usuario

FString elude todo el proceso de localización. El texto creado con FString::Printf o concatenación no puede recopilarse, traducirse ni mostrarse bien en RTL. Utilice siempre FText con macros LOCTEXT y FText::Format para texto visible.

Falta #undef LOCTEXT_NAMESPACE

Olvidar #undef LOCTEXT_NAMESPACE al final de un .cpp hace que el espacio se filtre a las unidades siguientes. Esto asigna silenciosamente espacios equivocados a cadenas de otros archivos y muestra traducciones en contextos incorrectos.

Lógica de plurales codificada directamente

Escribir 'count == 1 ? singular : plural' ignora CLDR. El francés considera singular el 0, el ruso tiene 4 formas y el árabe 6. Utilice sintaxis de plural ICU en sus patrones FText y deje que UE aplique las reglas de cada cultura.

Olvidar compilar después de importar

Importar .po actualiza los datos de texto, pero no genera binarios .locres. Durante la ejecución, el juego sigue cargando traducciones compiladas antiguas. Ejecute siempre 'Compile' en el panel después de importar o añádalo a la automatización.

Estructura de proyecto recomendada

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

Pruebe i18n Agent ahora

Arrastre y suelte aquí su archivo de traducción

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

o haga clic para seleccionar

Idiomas de destino

No es necesario registrarsePresupuesto al instante

Preguntas frecuentes