diff --git a/MULTI_LANGUAGE_PLAN.md b/MULTI_LANGUAGE_PLAN.md new file mode 100644 index 000000000..e105cdc73 --- /dev/null +++ b/MULTI_LANGUAGE_PLAN.md @@ -0,0 +1,439 @@ +# ๐ŸŒ MULTI-LANGUAGE LOCALIZATION PLAN +**Game:** Mrtva Dolina / Death Valley +**Date:** January 4, 2026 +**Status:** Planning Phase + +--- + +## ๐Ÿ“‹ CORE LANGUAGES + +### **Primary (DONE):** โœ… +1. **Slovenian (sl-SI)** - Native language, COMPLETE + - โœ… All dialogue translated + - โœ… UI translated + - โœ… 12 prologue voiceovers (Rok + Petra) + - โœ… Real character portraits + +### **Target Languages (TODO):** +2. **English (en-US)** ๐Ÿ‡บ๐Ÿ‡ธ +3. **German (de-DE)** ๐Ÿ‡ฉ๐Ÿ‡ช +4. **Italian (it-IT)** ๐Ÿ‡ฎ๐Ÿ‡น +5. **Croatian (hr-HR)** ๐Ÿ‡ญ๐Ÿ‡ท +6. **Serbian (sr-RS)** ๐Ÿ‡ท๐Ÿ‡ธ + +--- + +## ๐ŸŽฏ IMPLEMENTATION STRATEGY + +### **Phase 1: Localization System** (Week 1) + +**Goal:** Create dynamic language switching system + +**Tasks:** +1. โœ… Create `LocalizationSystem.js` (already exists!) +2. Create language JSON files: + - `assets/localization/en-US.json` + - `assets/localization/de-DE.json` + - `assets/localization/it-IT.json` + - `assets/localization/hr-HR.json` + - `assets/localization/sr-RS.json` + - `assets/localization/sl-SI.json` (extract current) + +3. Update `PrologueScene.js` to use LocalizationSystem +4. Create language selector UI (main menu) + +**Structure:** +```json +{ + "ui": { + "skip": "Press ESC to skip", + "autoAdvance": "Press SPACE to toggle auto-advance" + }, + "prologue": { + "scene_01": { + "speaker": "NARRATOR", + "text": "Year 2084. The zombie virus destroyed the world." + }, + ... + } +} +``` + +--- + +### **Phase 2: Translation** (Week 2-3) + +**Goal:** Translate all game text to 5 languages + +**Content to Translate:** + +**1. Prologue (12 scenes):** +- Scene descriptions +- Character dialogue +- Narrator text + +**2. UI Elements:** +- Menu items +- Button labels +- Tutorial text +- Item descriptions +- Quest text + +**3. NPC Dialogue:** +- Gronk conversations +- Town NPCs +- Quest givers + +**Translation Methods:** + +**Option A: Professional Translation** (BEST) +- Hire freelance translators (Fiverr, Upwork) +- ~$50-100 per language for game text +- Native speakers ensure quality + +**Option B: AI Translation** (FAST) +- Use DeepL API (better than Google) +- Manual review by native speaker +- Free tier: 500,000 characters/month + +**Option C: Community Translation** (FREE) +- Open GitHub for community contributions +- Steam forum volunteers +- Quality varies + +**Recommendation:** Start with **DeepL + Manual Review** + +--- + +### **Phase 3: Voiceover Generation** (Week 4-5) + +**Goal:** Generate voiceovers for all 5 languages + +**Available Voices (Microsoft Edge TTS):** + +**English (en-US):** +- Male: `en-US-GuyNeural` (Kai) +- Female: `en-US-JennyNeural` (Ana) +- Narrator: `en-US-ChristopherNeural` + +**German (de-DE):** +- Male: `de-DE-ConradNeural` (Kai) +- Female: `de-DE-KatjaNeural` (Ana) +- Narrator: `de-DE-KillianNeural` + +**Italian (it-IT):** +- Male: `it-IT-DiegoNeural` (Kai) +- Female: `it-IT-ElsaNeural` (Ana) +- Narrator: `it-IT-GiuseppeNeural` + +**Croatian (hr-HR):** +- Male: `hr-HR-SreckoNeural` (Kai) +- Female: `hr-HR-GabrijelaNeural` (Ana) + +**Serbian (sr-RS):** +- Male: `sr-RS-NicholasNeural` (Kai) +- Female: `sr-RS-SophieNeural` (Ana) + +**Generation Scripts:** + +Create automated scripts for each language: +```bash +# ai_voice_gen/generate_prologue_english.sh +# ai_voice_gen/generate_prologue_german.sh +# ai_voice_gen/generate_prologue_italian.sh +# ai_voice_gen/generate_prologue_croatian.sh +# ai_voice_gen/generate_prologue_serbian.sh +``` + +**Folder Structure:** +``` +assets/audio ๐Ÿ”ด/voiceover/ +โ”œโ”€โ”€ prologue_sl/ (Slovenian - DONE) +โ”œโ”€โ”€ prologue_en/ (English) +โ”œโ”€โ”€ prologue_de/ (German) +โ”œโ”€โ”€ prologue_it/ (Italian) +โ”œโ”€โ”€ prologue_hr/ (Croatian) +โ””โ”€โ”€ prologue_sr/ (Serbian) +``` + +--- + +### **Phase 4: Integration** (Week 6) + +**Goal:** Wire everything together + +**Tasks:** + +1. **Update PreloadScene:** + - Load language files + - Detect user's OS language (default) + - Load appropriate voiceover folder + +2. **Language Selector UI:** + ``` + [MAIN MENU] + โ”œโ”€โ”€ New Game + โ”œโ”€โ”€ Continue + โ”œโ”€โ”€ Options + โ”‚ โ””โ”€โ”€ Language โ—„ NEW! + โ”‚ โ”œโ”€โ”€ ๐Ÿ‡ธ๐Ÿ‡ฎ Slovenลกฤina + โ”‚ โ”œโ”€โ”€ ๐Ÿ‡ฌ๐Ÿ‡ง English + โ”‚ โ”œโ”€โ”€ ๐Ÿ‡ฉ๐Ÿ‡ช Deutsch + โ”‚ โ”œโ”€โ”€ ๐Ÿ‡ฎ๐Ÿ‡น Italiano + โ”‚ โ”œโ”€โ”€ ๐Ÿ‡ญ๐Ÿ‡ท Hrvatski + โ”‚ โ””โ”€โ”€ ๐Ÿ‡ท๐Ÿ‡ธ Srpski + โ””โ”€โ”€ Quit + ``` + +3. **Dynamic Loading:** + ```javascript + // PrologueScene.preload() + const lang = this.game.settings.language || 'sl-SI'; + + // Load appropriate audio + for (let i = 1; i <= 12; i++) { + const num = i.toString().padStart(2, '0'); + this.load.audio( + `prologue_${num}`, + `assets/audio ๐Ÿ”ด/voiceover/prologue_${lang.split('-')[0]}/prologue_${num}.wav` + ); + } + + // Load localization + this.load.json('localization', `assets/localization/${lang}.json`); + ``` + +4. **Runtime Switching:** + - Save language preference to localStorage + - Reload scene when language changes + - Keep game state + +--- + +## ๐Ÿ“Š PRODUCTION TIMELINE + +| Week | Task | Deliverable | +|------|------|-------------| +| **1** | Localization System | Language JSON structure | +| **2** | English Translation | en-US.json + voiceovers | +| **3** | German + Italian | de-DE.json, it-IT.json + voice | +| **4** | Croatian + Serbian | hr-HR.json, sr-RS.json + voice | +| **5** | Integration | Language selector UI | +| **6** | Testing | All languages verified | + +**Total Time:** ~6 weeks (1.5 months) + +--- + +## ๐Ÿ’ฐ COST ESTIMATE + +### **Option 1: Professional Translation** +- 5 languages ร— $75/language = **$375** +- Voiceovers: FREE (Edge TTS) +- **Total: $375** + +### **Option 2: AI + Review** +- DeepL API: FREE (under limit) +- Native speaker review: $25/language ร— 5 = **$125** +- Voiceovers: FREE (Edge TTS) +- **Total: $125** + +### **Option 3: DIY** +- Your time: ~40 hours +- Voiceovers: FREE (Edge TTS) +- **Total: $0** (time only) + +**Recommendation:** **Option 2** (AI + Review) - Best balance of quality/cost/speed + +--- + +## ๐Ÿ› ๏ธ TECHNICAL IMPLEMENTATION + +### **1. Create Localization Manager** + +```javascript +// src/systems/LocalizationManager.js +class LocalizationManager { + constructor(game) { + this.game = game; + this.currentLanguage = 'sl-SI'; + this.translations = {}; + this.availableLanguages = [ + { code: 'sl-SI', name: 'Slovenลกฤina', flag: '๐Ÿ‡ธ๐Ÿ‡ฎ' }, + { code: 'en-US', name: 'English', flag: '๐Ÿ‡ฌ๐Ÿ‡ง' }, + { code: 'de-DE', name: 'Deutsch', flag: '๐Ÿ‡ฉ๐Ÿ‡ช' }, + { code: 'it-IT', name: 'Italiano', flag: '๐Ÿ‡ฎ๐Ÿ‡น' }, + { code: 'hr-HR', name: 'Hrvatski', flag: '๐Ÿ‡ญ๐Ÿ‡ท' }, + { code: 'sr-RS', name: 'Srpski', flag: '๐Ÿ‡ท๐Ÿ‡ธ' } + ]; + } + + loadLanguage(langCode) { + // Load JSON file + this.translations = this.game.cache.json.get(`lang_${langCode}`); + this.currentLanguage = langCode; + localStorage.setItem('game_language', langCode); + } + + getText(key) { + const keys = key.split('.'); + let value = this.translations; + for (const k of keys) { + value = value[k]; + if (!value) return key; // Fallback + } + return value; + } + + getVoiceFolder() { + const langShort = this.currentLanguage.split('-')[0]; + return `prologue_${langShort}`; + } +} +``` + +### **2. Update PrologueScene** + +```javascript +preload() { + // Detect language + const savedLang = localStorage.getItem('game_language') || 'sl-SI'; + const langShort = savedLang.split('-')[0]; + + // Load localization + this.load.json(`lang_${savedLang}`, `assets/localization/${savedLang}.json`); + + // Load character portraits + this.load.image('kai_portrait', 'reference_images/kai_master_style33.png'); + this.load.image('ana_portrait', 'reference_images/ana_master_style33.png'); + + // Load voiceovers for current language + for (let i = 1; i <= 12; i++) { + const num = i.toString().padStart(2, '0'); + this.load.audio( + `prologue_${num}`, + `assets/audio ๐Ÿ”ด/voiceover/prologue_${langShort}/prologue_${num}.wav` + ); + } +} + +create() { + // Initialize localization + this.lang = new LocalizationManager(this.game); + this.lang.loadLanguage(savedLang); + + // Use translations + const skipText = this.add.text( + width - 20, 20, + this.lang.getText('ui.skip'), + { fontSize: '16px', color: '#888888' } + ); +} +``` + +--- + +## ๐ŸŽฌ AUTOMATED GENERATION WORKFLOW + +### **Master Script:** + +```bash +#!/bin/bash +# generate_all_languages.sh + +echo "๐ŸŒ Generating voiceovers for all 6 languages..." + +# Slovenian (DONE) +echo "โœ… Slovenian - already complete" + +# English +./ai_voice_gen/generate_prologue_english.sh + +# German +./ai_voice_gen/generate_prologue_german.sh + +# Italian +./ai_voice_gen/generate_prologue_italian.sh + +# Croatian +./ai_voice_gen/generate_prologue_croatian.sh + +# Serbian +./ai_voice_gen/generate_prologue_serbian.sh + +echo "๐ŸŽ‰ All languages generated!" +echo "๐Ÿ“Š Total files: 72 (12 per language ร— 6 languages)" +``` + +**Estimated Time:** ~20 minutes for all languages + +--- + +## ๐Ÿ“ˆ PRIORITY ORDER + +### **Immediate (This Month):** +1. โœ… Slovenian (COMPLETE) +2. **English** (biggest market) + +### **High Priority (Next Month):** +3. **German** (Steam top 3 market) +4. **Italian** (neighboring country, big gaming market) + +### **Medium Priority (Q1 2026):** +5. **Croatian** (region similarity) +6. **Serbian** (region similarity) + +--- + +## ๐ŸŽฏ NEXT STEPS + +### **TODAY:** +1. Create `LocalizationManager.js` +2. Extract Slovenian text to `sl-SI.json` +3. Create `en-US.json` (English translation) + +### **THIS WEEK:** +4. Generate English voiceovers (12 files) +5. Test language switching +6. Create language selector UI + +### **NEXT WEEK:** +7. German + Italian translations +8. Generate voiceovers +9. Full integration test + +--- + +## ๐Ÿ“ NOTES + +**Why These 5 Languages?** +1. **English** - Global standard, Steam #1 +2. **German** - Steam #2 market, high-quality gaming culture +3. **Italian** - Close to Slovenia, big indie game market +4. **Croatian** - Regional, similar culture, easy translation +5. **Serbian** - Regional, similar culture, Cyrillic option + +**Alternative Languages to Consider:** +- **Russian** (huge market, but Cyrillic) +- **Spanish** (global, but less indie focus) +- **French** (big market, strict translation requirements) +- **Polish** (huge gaming market, Slavic language) + +--- + +## โœ… SUCCESS CRITERIA + +- [ ] All 6 languages fully translated +- [ ] 72 voiceover files generated (12 ร— 6) +- [ ] Language selector UI functional +- [ ] Runtime switching works seamlessly +- [ ] No performance impact +- [ ] Saved preferences persist +- [ ] All text uses localization system + +**Target Launch:** All 6 languages available at **Early Access launch** + +--- + +**Last Updated:** January 4, 2026 +**Status:** Planning โ†’ Implementation Phase Starting diff --git a/scripts/generate_all_languages.sh b/scripts/generate_all_languages.sh new file mode 100644 index 000000000..13adf21a2 --- /dev/null +++ b/scripts/generate_all_languages.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# MASTER SCRIPT - Generate ALL 4 languages tonight +# Run this ONE command and everything happens automatically! + +echo "๐ŸŒ MULTI-LANGUAGE GENERATION - TONIGHT PRODUCTION" +echo "================================================" +echo "" +echo "Languages: English, German, Italian, Chinese" +echo "Files: 48 voiceovers (12 per language)" +echo "" + +# Check if DeepL key is set +if [ -z "$DEEPL_API_KEY" ]; then + echo "โš ๏ธ Warning: DEEPL_API_KEY not set" + echo "Set it with: export DEEPL_API_KEY='your-key-here'" + echo "" +fi + +# Step 1: Extract Slovenian (if not done) +echo "๐Ÿ“ Step 1: Extracting Slovenian text..." +if [ ! -f "assets/localization/sl-SI.json" ]; then + python3 scripts/extract_slovenian.py + echo "โœ… Slovenian extracted" +else + echo "โœ… Slovenian already exists" +fi +echo "" + +# Step 2: Translate to 4 languages +echo "๐Ÿ”„ Step 2: Translating to 4 languages..." +python3 scripts/translate_all.py +echo "โœ… Translations complete" +echo "" + +# Step 3: Generate voiceovers +echo "๐ŸŽค Step 3: Generating voiceovers..." + +echo " ๐Ÿ‡ฌ๐Ÿ‡ง Generating English..." +./ai_voice_gen/generate_prologue_english.sh > /dev/null 2>&1 +echo " โœ… English: 12 files" + +echo " ๐Ÿ‡ฉ๐Ÿ‡ช Generating German..." +./ai_voice_gen/generate_prologue_german.sh > /dev/null 2>&1 +echo " โœ… German: 12 files" + +echo " ๐Ÿ‡ฎ๐Ÿ‡น Generating Italian..." +./ai_voice_gen/generate_prologue_italian.sh > /dev/null 2>&1 +echo " โœ… Italian: 12 files" + +echo " ๐Ÿ‡จ๐Ÿ‡ณ Generating Chinese..." +./ai_voice_gen/generate_prologue_chinese.sh > /dev/null 2>&1 +echo " โœ… Chinese: 12 files" + +echo "" +echo "๐ŸŽ‰ ALL LANGUAGES COMPLETE!" +echo "" +echo "๐Ÿ“Š Summary:" +echo " - 5 languages total (including Slovenian)" +echo " - 60 voiceover files (12 ร— 5)" +echo " - 5 JSON localization files" +echo "" +echo "๐Ÿ“ Files created:" +ls -lh assets/localization/*.json | awk '{print " ", $9, "(" $5 ")"}' +echo "" +du -sh assets/audio\ ๐Ÿ”ด/voiceover/prologue_* | awk '{print " ", $2, "(" $1 ")"}' +echo "" +echo "โœ… Ready to commit & push!"