Localization Module¶
The Localization module provides comprehensive multi-language support with automatic device language detection and cloud synchronization.
Overview¶
| Namespace | IntelliVerseX.Localization |
| Assembly | IntelliVerseX.Localization |
| Format | JSON-based language files |
Key Classes¶
| Class | Purpose |
|---|---|
IVXLanguageManager | Main localization interface |
IVXLanguageConfig | Language configuration |
IVXLocalizedText | TextMeshPro localization component |
IVXLocalizedImage | Image localization component |
Quick Start¶
using IntelliVerseX.Localization;
// Get localized string
string welcomeText = IVXLanguageManager.GetString("welcome_message");
// Get with formatting
string greeting = IVXLanguageManager.GetString("hello_player", playerName);
IVXLanguageManager¶
public static class IVXLanguageManager
{
// State
public static bool IsInitialized { get; }
public static string CurrentLanguage { get; }
public static List<string> AvailableLanguages { get; }
// Events
public static event Action<string> OnLanguageChanged;
// Initialize
public static void Initialize(IVXLanguageConfig config);
// Language selection
public static void SetLanguage(string languageCode);
public static void SetLanguageFromDevice();
// Get strings
public static string GetString(string key);
public static string GetString(string key, params object[] args);
// Check availability
public static bool HasKey(string key);
}
Language Files¶
File Structure¶
Assets/_IntelliVerseXSDK/Runtime/Localization/Languages/
├── en.json # English (default)
├── es.json # Spanish
├── fr.json # French
├── de.json # German
├── pt.json # Portuguese
├── ar.json # Arabic
├── ja.json # Japanese
├── ko.json # Korean
└── zh.json # Chinese
File Format¶
{
"language_name": "English",
"language_code": "en",
"strings": {
"welcome_message": "Welcome to the game!",
"hello_player": "Hello, {0}!",
"score_format": "Score: {0:N0}",
"time_format": "Time: {0}:{1:D2}",
"menu": {
"play": "Play",
"settings": "Settings",
"quit": "Quit"
},
"errors": {
"network": "Network error. Please try again.",
"login_failed": "Login failed: {0}"
}
}
}
UI Components¶
IVXLocalizedText¶
Automatically localizes TextMeshPro text:
Inspector Properties: - Localization Key - The string key to look up - Format Args - Optional format arguments - Auto Update - Update when language changes
Code Usage:
[RequireComponent(typeof(TMP_Text))]
public class IVXLocalizedText : MonoBehaviour
{
[SerializeField] private string localizationKey;
// Change key at runtime
public void SetKey(string key)
{
localizationKey = key;
UpdateText();
}
// Set with arguments
public void SetKeyWithArgs(string key, params object[] args);
}
IVXLocalizedImage¶
Localizes images based on language:
[RequireComponent(typeof(Image))]
public class IVXLocalizedImage : MonoBehaviour
{
[SerializeField] private string imageKey;
// Automatically loads correct image from:
// Resources/Localization/{languageCode}/{imageKey}
}
Language Selection¶
Automatic Detection¶
Manual Selection¶
// Language selector UI
public class LanguageSelector : MonoBehaviour
{
[SerializeField] private TMP_Dropdown languageDropdown;
void Start()
{
// Populate dropdown
languageDropdown.ClearOptions();
languageDropdown.AddOptions(
IVXLanguageManager.AvailableLanguages
.Select(code => GetLanguageName(code))
.ToList()
);
// Set current selection
int currentIndex = IVXLanguageManager.AvailableLanguages
.IndexOf(IVXLanguageManager.CurrentLanguage);
languageDropdown.value = currentIndex;
// Handle changes
languageDropdown.onValueChanged.AddListener(OnLanguageSelected);
}
void OnLanguageSelected(int index)
{
string code = IVXLanguageManager.AvailableLanguages[index];
IVXLanguageManager.SetLanguage(code);
}
}
String Formatting¶
Basic Substitution¶
Number Formatting¶
// Output: "Score: 1,234,567"
IVXLanguageManager.GetString("score", 1234567);
// Output: "50%"
IVXLanguageManager.GetString("percentage", 0.5f);
Pluralization¶
string coinText = coins == 1
? IVXLanguageManager.GetString("coins_one", coins)
: IVXLanguageManager.GetString("coins_other", coins);
RTL Support¶
For right-to-left languages (Arabic, Hebrew):
// Check if current language is RTL
bool isRTL = IVXLanguageManager.IsRTL;
// UI auto-adjusts when using IVXLocalizedText
RTL-Aware UI:
public class RTLAwarePanel : MonoBehaviour
{
void Start()
{
IVXLanguageManager.OnLanguageChanged += OnLanguageChanged;
UpdateLayout();
}
void OnLanguageChanged(string newLanguage)
{
UpdateLayout();
}
void UpdateLayout()
{
var layout = GetComponent<HorizontalLayoutGroup>();
if (IVXLanguageManager.IsRTL)
{
layout.reverseArrangement = true;
layout.childAlignment = TextAnchor.MiddleRight;
}
else
{
layout.reverseArrangement = false;
layout.childAlignment = TextAnchor.MiddleLeft;
}
}
}
Configuration¶
IVXLanguageConfig¶
[CreateAssetMenu(fileName = "LanguageConfig", menuName = "IntelliVerse-X/Language Config")]
public class IVXLanguageConfig : ScriptableObject
{
[Header("Settings")]
public string defaultLanguage = "en";
public bool detectDeviceLanguage = true;
public bool saveLanguagePreference = true;
[Header("Available Languages")]
public List<LanguageInfo> languages;
[Header("Fallback")]
public string fallbackLanguage = "en";
public bool showKeyOnMissing = false; // Show key if translation missing
}
[Serializable]
public class LanguageInfo
{
public string code; // "en", "es", "fr"
public string nativeName; // "English", "Español", "Français"
public bool isRTL; // Right-to-left
public Sprite flagIcon;
}
Supported Languages¶
| Code | Language | Native Name | RTL |
|---|---|---|---|
en | English | English | No |
es | Spanish | Español | No |
fr | French | Français | No |
de | German | Deutsch | No |
pt | Portuguese | Português | No |
it | Italian | Italiano | No |
ru | Russian | Русский | No |
ja | Japanese | 日本語 | No |
ko | Korean | 한국어 | No |
zh | Chinese | 中文 | No |
ar | Arabic | العربية | Yes |
he | Hebrew | עברית | Yes |
Adding New Language¶
- Create language JSON file:
// Assets/_IntelliVerseXSDK/Runtime/Localization/Languages/xx.json
{
"language_name": "New Language",
"language_code": "xx",
"strings": {
// Copy keys from en.json and translate
}
}
- Register in config:
Best Practices¶
1. Key Naming¶
{
// Use hierarchical keys
"menu.settings.title": "Settings",
"menu.settings.sound": "Sound",
// Or nested objects
"menu": {
"settings": {
"title": "Settings",
"sound": "Sound"
}
}
}
2. Context for Translators¶
3. Handle Missing Keys¶
string text = IVXLanguageManager.GetString("unknown_key");
// Returns key name if not found (with config option)
// Or returns empty string
4. Async Loading¶
// Language files load asynchronously
await IVXLanguageManager.InitializeAsync();
// Or use callback
IVXLanguageManager.Initialize(config, onComplete: () =>
{
// Languages loaded
});
Related Documentation¶
- Localization Demo - Sample implementation
- Localization Setup Guide - Adding languages