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.json

Implementation

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

  1. Write all content in English first
  2. Mark translatable strings
  3. Export to translation format

Phase 2: Professional Translation

  1. Hire native Hindi translator
  2. Provide context for each string
  3. Review for cultural appropriateness
  4. Test in-game

Phase 3: Community Translations

  1. Provide translation tool
  2. Accept community contributions (Tamil, Telugu)
  3. Review submissions
  4. 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.