Skip to main content

Unreal Engine के स्थानीयकरण की संपूर्ण गाइड

FText मैक्रो से लेकर लोकेल फ़ॉलबैक चेन तक: Localization Dashboard, String Tables, C++, Blueprints और स्वचालित अनुवाद की मदद से अपने UE5 गेम को स्थानीयकृत करें।

1

FText और स्थानीयकरण पाइपलाइन

FText, Unreal Engine का स्थानीयकरण-सक्षम स्ट्रिंग प्रकार है। स्थानीयकरण पाइपलाइन में शामिल होने के लिए आपके गेम की हर यूज़र को दिखाई देने वाली स्ट्रिंग—UI लेबल, डायलॉग, टूलटिप और नोटिफ़िकेशन—में FText का उपयोग होना चाहिए। 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 या स्ट्रिंग कॉन्कैटनेशन से न बनाएँ। ये स्थानीयकरण पाइपलाइन को पूरी तरह बायपास कर देते हैं—जिससे तैयार टेक्स्ट को एकत्र या अनुवाद नहीं किया जा सकता और RTL भाषाओं में उसे सही ढंग से प्रदर्शित भी नहीं किया जा सकता। इसके बजाय हमेशा LOCTEXT पैटर्न के साथ FText::Format का उपयोग करें।
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
LOCTEXT मैक्रो जोड़ने या उनमें बदलाव करने वाले हर कोड परिवर्तन के बाद 'Gather Text' चलाएँ। यह चरण छूटने पर नई स्ट्रिंग आपकी .po फ़ाइलों में दिखाई नहीं देंगी और अनुवादक उन्हें नहीं देख पाएँगे। इसे अपने-आप सुनिश्चित करने के लिए अपने बिल्ड ऑटोमेशन में गैदर चरण जोड़ें।
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
Localization Dashboard अपने-आप String Tables एकत्र करता है। String Table में परिभाषित स्ट्रिंग के लिए आपको LOCTEXT मैक्रो की आवश्यकता नहीं होती—बस C++ या Blueprints में टेबल ID और कुंजी से उनका संदर्भ दें।
4

C++ स्थानीयकरण पैटर्न

C++ में हर .cpp फ़ाइल के शीर्ष पर LOCTEXT_NAMESPACE परिभाषित करें और यूज़र को दिखाई देने वाली सभी स्ट्रिंग के लिए 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 नहीं। FString वैल्यू को बदलने के लिए FText::FromString(), लोकेल-सक्षम संख्या फ़ॉर्मैटिंग के लिए FText::AsNumber() और कीमतों के लिए FText::AsCurrency() का उपयोग करें। सीधे FString कॉन्कैटनेशन से बना टेक्स्ट लोकेल के फ़ॉर्मैटिंग नियमों का पालन नहीं करता।
5

Blueprint स्थानीयकरण

Blueprints की सभी Text प्रॉपर्टी डिफ़ॉल्ट रूप से 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")
Key, Namespace और Source String फ़ील्ड देखने के लिए Blueprint Details पैनल में टेक्स्ट प्रॉपर्टी का ड्रॉपडाउन खोलें। सार्थक 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 फ़ाइलें बिल्ड में शामिल नहीं होतीं। रनटाइम पर उस भाषा को चुनने वाले खिलाड़ियों को फ़ॉलबैक टेक्स्ट या खाली स्ट्रिंग दिखाई देंगी। हमेशा पुष्टि करें कि आपकी पैकेजिंग सेटिंग्स आपके समर्थित कल्चर से मेल खाती हैं।
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);
11 भाषा परिवारों को कवर करने वाली 75 बिल्ट-इन फ़ॉलबैक चेन लोड करने के लिए स्टार्टअप पर एक बार ULocaleChain::Configure() कॉल करें। Blueprint के अनुकूल कस्टमाइज़ेशन के लिए ConfigureWithOverrides या फ़ॉलबैक व्यवहार पर पूर्ण नियंत्रण के लिए C++ में ConfigureCustom का उपयोग करें।

अनुवाद की गुणवत्ता को स्वचालित करें

i18n-validate की मदद से रिलीज़ से पहले गुम कुंजियाँ और खराब प्लेसहोल्डर पकड़ें। वास्तविक अनुवाद आने से पहले i18n-pseudo से छद्म-अनुवाद का उपयोग करके अपने UI को टेस्ट करें।

आम समस्याएँ

यूज़र को दिखाई देने वाले टेक्स्ट के लिए FString का उपयोग

FString पूरी स्थानीयकरण पाइपलाइन को बायपास करता है। FString::Printf या स्ट्रिंग कॉन्कैटनेशन से बने टेक्स्ट को एकत्र या अनुवाद नहीं किया जा सकता और RTL भाषाओं में उसे सही ढंग से प्रदर्शित भी नहीं किया जा सकता। यूज़र को दिखाई देने वाली स्ट्रिंग के लिए हमेशा LOCTEXT मैक्रो और FText::Format के साथ FText का उपयोग करें।

#undef LOCTEXT_NAMESPACE का न होना

.cpp फ़ाइल के अंत में #undef LOCTEXT_NAMESPACE भूलने से नेमस्पेस बाद की ट्रांसलेशन यूनिट में लीक हो जाता है। इससे दूसरी फ़ाइलों की स्ट्रिंग को चुपचाप गलत नेमस्पेस मिल जाते हैं और अनुवाद गलत संदर्भ में दिखाई देते हैं।

हार्डकोड किया गया बहुवचन लॉजिक

'count == 1 ? singular : plural' लिखना CLDR नियमों को अनदेखा करता है। फ़्रेंच में 0 को एकवचन माना जाता है, रूसी में 4 बहुवचन रूप और अरबी में 6 रूप होते हैं। अपने FText पैटर्न में ICU बहुवचन सिंटैक्स का उपयोग करें और UE को हर कल्चर के अनुसार नियम लागू करने दें।

इंपोर्ट के बाद कंपाइल करना भूल जाना

.po फ़ाइलें इंपोर्ट करने से टेक्स्ट डेटा अपडेट हो जाता है, लेकिन .locres बाइनरी नहीं बनतीं। गेम रनटाइम पर पुराने कंपाइल किए गए अनुवाद ही लोड करता रहता है। इंपोर्ट करने के बाद Localization Dashboard में हमेशा 'Compile' चलाएँ या इसे अपने बिल्ड ऑटोमेशन में जोड़ें।

प्रोजेक्ट की सुझाई गई संरचना

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

या ब्राउज़ करने के लिए क्लिक करें

लक्षित भाषाएँ

साइन अप की ज़रूरत नहींतुरंत अनुमान

अक्सर पूछे जाने वाले सवाल