i18n guide
Guide for i18n guide
Internationalization (i18n) Guide
Overview
Multi-language support for Legends of Hastinapur targeting Indian and international markets.
Supported Languages (Launch)
Priority 1: English (en)
- Primary development language
- International audience
- Default fallback
Priority 2: Hindi (hi)
- Largest Indian market
- 600M+ speakers
- High monetization potential
Priority 3 (Post-Launch): Regional
- Tamil (ta) - South India
- Telugu (te) - South India
- Bengali (bn) - East India
File Structure
data/
├── dialogues/
│ ├── en/
│ │ ├── guard_captain_bhima.json
│ │ ├── tutorial_npc.json
│ │ └── ...
│ ├── hi/
│ │ ├── guard_captain_bhima.json (Hindi translation)
│ │ └── ...
│ └── _template.json (language-agnostic structure)
│
└── lang/
├── ui_en.json (UI strings: menus, buttons, tooltips)
├── ui_hi.json
├── items_en.json (Item names/descriptions)
├── items_hi.json
├── skills_en.json
└── skills_hi.jsonImplementation
1. Dialogue Translation
Keep IDs Consistent:
// en/guard_captain_bhima.json
{
"npc_id": "guard_captain_bhima",
"npc_name": "Guard Captain Bhima",
"greeting": "Jai Hastinapur, warrior.",
"dialogues": [...]
}
// hi/guard_captain_bhima.json
{
"npc_id": "guard_captain_bhima", // Same ID!
"npc_name": "गार्ड कप्तान भीम",
"greeting": "जय हस्तिनापुर, योद्धा।",
"dialogues": [...] // Same structure, translated text
}2. UI Strings
// lang/ui_en.json
{
"menu": {
"inventory": "Inventory",
"skills": "Skills",
"quests": "Quests",
"settings": "Settings"
},
"shop": {
"purchase": "Purchase",
"price": "Price",
"stock": "Stock"
}
}
// lang/ui_hi.json
{
"menu": {
"inventory": "सूची",
"skills": "कौशल",
"quests": "क्वेस्ट",
"settings": "सेटिंग्स"
},
"shop": {
"purchase": "खरीदें",
"price": "मूल्य",
"stock": "स्टॉक"
}
}3. Language Detection (Rust)
// src/systems/localization/mod.rs
pub enum Language {
English,
Hindi,
Tamil,
}
impl Language {
pub fn from_code(code: &str) -> Self {
match code {
"hi" => Language::Hindi,
"ta" => Language::Tamil,
_ => Language::English, // Default
}
}
pub fn code(&self) -> &str {
match self {
Language::English => "en",
Language::Hindi => "hi",
Language::Tamil => "ta",
}
}
}
#[derive(Resource)]
pub struct LocalizationSettings {
pub current_language: Language,
}
impl Default for LocalizationSettings {
fn default() -> Self {
// Detect system language or use saved preference
Self {
current_language: Language::English,
}
}
}
// Load dialogue for current language
pub fn load_dialogue(
npc_id: &str,
settings: &LocalizationSettings,
) -> Result<NpcDialogue> {
let lang_code = settings.current_language.code();
let path = format!("data/dialogues/{}/{}.json", lang_code, npc_id);
// Try current language, fallback to English
match std::fs::read_to_string(&path) {
Ok(contents) => serde_json::from_str(&contents),
Err(_) => {
warn!("Dialogue not found for language {}, using English", lang_code);
let fallback = format!("data/dialogues/en/{}.json", npc_id);
let contents = std::fs::read_to_string(fallback)?;
serde_json::from_str(&contents)
}
}
}Translation Workflow
Phase 1: Extract Strings
- Write all content in English first
- Mark translatable strings
- Export to translation format
Phase 2: Professional Translation
- Hire native Hindi translator
- Provide context for each string
- Review for cultural appropriateness
- Test in-game
Phase 3: Community Translations
- Provide translation tool
- Accept community contributions (Tamil, Telugu)
- Review submissions
- Credit contributors
Best Practices
DO:
✅ Use placeholders for dynamic content
✅ Keep IDs consistent across languages
✅ Provide context for translators
✅ Test all languages in-game
✅ Handle text overflow (Hindi is longer)
DON'T:
❌ Hardcode strings in code
❌ Concatenate translated strings
❌ Assume English word order
❌ Forget cultural context
❌ Use machine translation for final product
Example: Item Names
// items_en.json
{
"bronze_sword": {
"name": "Bronze Sword",
"description": "A simple sword made of bronze."
}
}
// items_hi.json
{
"bronze_sword": {
"name": "कांस्य तलवार",
"description": "कांस्य से बनी एक साधारण तलवार।"
}
}UI Considerations
Font Support
- Use Unicode fonts supporting Devanagari (Hindi)
- Test text rendering for all languages
- Adjust UI layouts for longer text
Regional Settings
- Number formatting (Indian: 1,00,000 vs Western: 100,000)
- Currency symbols (₹ vs $)
- Date formats
Testing Checklist
- All dialogue files exist for each language
- UI strings complete for each language
- Language switching works in-game
- No text overflow issues
- Cultural references appropriate
- Native speaker review complete
Revenue Impact
Hindi Translation ROI:
- Cost: ~$2,000 (professional translation)
- Potential: 600M+ Hindi speakers
- Expected: 30% increase in Indian revenue
- Payback: 1-2 months
Regional Languages:
- Cost: ~$1,000 each (community + review)
- Tamil/Telugu: 150M+ speakers combined
- Expected: 15% additional revenue
- High ROI for southern markets
Bottom Line: i18n from the start = massive market expansion with minimal tech debt.