# Localization Strings Audit Report - Fires Flutter **Project:** Fires Flutter **Audit Date:** March 6, 2026 **Files Analyzed:** 3 ARB files (English, Spanish, Galician) **Total Issues Found:** 23 **Status:** ⚠️ CRITICAL - Production deployment blocked until resolved --- ## Executive Summary The localization system has **23 identified issues** spanning all three language files: - **Critical:** 1 issue (Galician translation 96.8% incomplete) - **High:** 10 issues (Russian Cyrillic characters + grammar errors) - **Medium:** 9 issues (key naming typos + translations) - **Low:** 3 issues (technical concerns) **Root Causes:** 1. Copy-paste error introducing Russian "км" instead of "km" (6 instances) 2. Typos in key identifiers that violate i18n conventions 3. Incomplete Galician translation (only 3 of 93 keys) 4. Grammar errors in English source strings --- ## ENGLISH STRINGS (strings_en.arb) - 7 Issues ### HIGH SEVERITY (4 issues) #### 1. Line 20: `noFiresAroundThisArea` ``` Current: "There is no fires at $kmAround км around this area" Problem: - Grammar error: "is" should be "are" (plural) - Russian character: "км" should be "km" Fix: "There are no fires at $kmAround km around this area" Impact: HIGH - Double localization failure ``` #### 2. Line 21: `noFiresAround` ``` Current: "There is no fires" Problem: - Grammar error: subject-verb disagreement - Plural "fires" requires "are" Fix: "There are no fires" Impact: HIGH - Appears in UI, grammatically incorrect ``` #### 3. Line 18: `firesAroundThisArea` ``` Current: "$numFires fires at $kmAround км around this area" Problem: - Russian Cyrillic "км" in English string - Should use Latin "km" abbreviation Fix: "$numFires fires at $kmAround km around this area" Impact: HIGH - Breaks localization integrity ``` #### 4. Line 19: `fireAroundThisArea` ``` Current: "A fire at $kmAround км around this area" Problem: - Russian Cyrillic "км" appears in English - Inconsistent with standard English conventions Fix: "A fire at $kmAround km around this area" Impact: HIGH - User-visible localization error ``` ### MEDIUM SEVERITY (3 issues) #### 5. Line 32: `notPermsUbication` (Key Name) ``` Key: notPermsUbication Problem: - Typo in key name: "Ubication" not standard English - Should be "Location" (same as Spanish translation) - Breaks i18n tooling conventions Fix: Rename key to "notPermsLocation" Update all code references Impact: MEDIUM - Maintenance burden, confusing for translators ``` #### 6. Line 33: `isYourUbicationEnabled` ``` Current: "I cannot get your current location. It's your ubication enabled?" Problems: - Typo in string: "ubication" should be "location" - Grammar: "It's your" (contraction) incorrect after period - Should be: "Is your" (question) - Awkward phrasing overall Fix: "I cannot get your current location. Is location enabled on your device?" AND rename key from "isYourUbicationEnabled" to "isYourLocationEnabled" Impact: MEDIUM - Double error: typo + grammar ``` #### 7. Line 30: `getAlertsOfFiresinThatArea` (Key Name) ``` Key: getAlertsOfFiresinThatArea Problem: - camelCase violation: "in" should be uppercase "In" - Creates inconsistent naming pattern Fix: Rename to "getAlertsOfFiresInThatArea" Update all code references Impact: MEDIUM - Style violation, potential tool errors ``` --- ## SPANISH STRINGS (strings_es.arb) - 9 Issues ### HIGH SEVERITY (4 issues) #### 1. Line 18: `firesAroundThisArea` ``` Current: "$numFires fuegos a $kmAround км a la redonda" Problem: - Russian Cyrillic "км" in Spanish string - "км" is completely unintelligible to Spanish speakers Fix: "$numFires fuegos a $kmAround km a la redonda" Impact: HIGH - Breaks user experience with foreign script ``` #### 2. Line 19: `fireAroundThisArea` ``` Current: "Un fuego a $kmAround км a la redonda" Problem: - Russian "км" embedded in Spanish localization - No Spanish speaker would recognize this unit Fix: "Un fuego a $kmAround km a la redonda" Impact: HIGH - Critical localization error ``` #### 3. Line 35: `subscribeToValueAroundThisArea` ``` Current: "Suscríbete a $sliderValue км a la redonda" Problem: - Russian Cyrillic in middle of Spanish instruction - Disrupts reading flow and comprehension Fix: "Suscríbete a $sliderValue km a la redonda" Impact: HIGH - User confusion ``` #### 4. Line 20: `noFiresAround` ``` Current: "Sin fuegos" Problem: - Inconsistent with English: English says "There is no fires" - Spanish translation is more concise but loses parallel structure - Less descriptive than English equivalent Compare: English = "There is no fires" → Spanish = "No hay fuegos" (better) But used differently in code, consistency check needed Fix: Consider "No hay fuegos" instead of "Sin fuegos" for consistency Impact: HIGH - Semantic inconsistency across languages ``` ### MEDIUM SEVERITY (5 issues) #### 5. Line 32: `notPermsUbication` (Key Name) ``` Key: notPermsUbication Translation: "No tenemos permisos para conocer tu ubicación" Problem: - Key has typo: "Ubication" instead of "Location" - Translation is actually GOOD (uses "ubicación" correctly) - But key name violates i18n standards Fix: Rename key to "notPermsLocation" Keep translation as-is (it's excellent) Update all code references Impact: MEDIUM - Key naming inconsistency ``` #### 6. Line 33: `isYourUbicationEnabled` ``` Key: isYourUbicationEnabled Translation: "No podemos saber tu ubicación actual. ¿Están los servicios de ubicación en tu móvil activados?" Problem: - Key has typo: should be "isYourLocationEnabled" - Translation is ACTUALLY BETTER than English version! - But key naming violates standards Fix: Rename key to "isYourLocationEnabled" Keep translation (it's excellent) Fix English version to match quality Impact: MEDIUM - Key naming + English source quality ``` #### 7. Line 59: `tweetAboutAFireDescription` ``` Current: "Adicionalmente si usas twitter puedes compartir información adicional con los servicios de emergencia..." Problem: - References "#IFTerminoMunicipal" which is Spanish-specific - English version uses "#IFMinicipalTerminal" (different) - Hashtag guidance is language-specific, may confuse users Fix: Consider clarifying hashtag format or providing language-agnostic guidance Impact: MEDIUM - Hashtag consistency issue ``` #### 8. Line 3: `appName` ``` Current: "¡Tod@s contra el Fuego!" Problem: - Uses "@" for gender-inclusive notation - "@" may not render correctly on all devices/fonts - Common in Spanish activism but technically problematic Fix: "¡Todas y todos contra el Fuego!" OR keep "¡Tod@s contra el Fuego!" if brand consistency required (Test rendering on target devices first) Impact: MEDIUM - Potential rendering issues ``` #### 9. Line 80: `inGreenMonitoredAreas` ``` Current: "En verde, las zonas vigiladas por nuestros usuari@s actualmente" Problem: - Uses "@" for gender-inclusive notation - Same rendering concerns as appName Fix: "En verde, las zonas vigiladas por nuestros usuarios y usuarias actualmente" OR keep "@" if brand/style consistency required Impact: MEDIUM - Potential rendering issues + accessibility ``` --- ## GALICIAN STRINGS (strings_gl.arb) - 7 Issues ### CRITICAL SEVERITY (1 issue - entire file) #### 1. ENTIRE FILE: Only 3 of 93 Keys Translated ``` Current State: - AvoidThisStringsIfisNotPlural: "No hace falta traducir esto" - appName: "Tod@s contra o Lume!" - (Only 2 actual translations, 1 mock entry) Missing: 91 keys completely untranslated (97.8% incomplete) Categories of Missing Translations: □ Location strings (lines 4-35 in EN) → 32 keys missing □ Time formatting (lines 37-49 in EN) → 13 keys missing □ UI actions (lines 50-71 in EN) → 22 keys missing □ Informational (lines 72-92 in EN) → 21 keys missing Impact: CRITICAL - App is non-functional in Galician ``` ### HIGH SEVERITY (2 issues) #### 2. Line 2: `AvoidThisStringsIfisNotPlural` ``` Current: "No hace falta traducir esto" Problem: - This is a TECHNICAL KEY, should NOT be translated - Current "translation" is a mock/placeholder message - Indicates incomplete understanding of i18n system - Should be preserved as-is or contain plural form metadata Fix: Restore to: "Zero One Two Few Many Other" OR add proper Galician plural forms if supported Impact: HIGH - System configuration error ``` #### 3. Line 3: `appName` ``` Current: "Tod@s contra o Lume!" Problem: - Only translation provided - Remaining 92 keys are COMPLETELY MISSING - App cannot function with only app name translated Fix: Provide complete translation for all 93 keys (Can use English as fallback template) Impact: HIGH - App crash on locale selection ``` ### Priority: Complete Galician Translation **Estimated Missing Keys (by category):** ``` addYourCurrentPosition → Engade a túa posición actual addSomePlace → Engade algún outro lugar firesNearPlace → Lumes próximos a ti [... 88 more missing ...] ``` --- ## CROSS-FILE CONSISTENCY ANALYSIS ### Issue #1: Cyrillic Character "км" Contamination **Summary:** Russian Cyrillic character "км" appears in English and Spanish where "km" should be used. **Affected Instances (6 total):** | File | Lines | Key | Current | Should Be | |------|-------|-----|---------|-----------| | EN | 18 | firesAroundThisArea | км | km | | EN | 19 | fireAroundThisArea | км | km | | EN | 20 | noFiresAroundThisArea | км | km | | ES | 18 | firesAroundThisArea | км | km | | ES | 19 | fireAroundThisArea | км | km | | ES | 35 | subscribeToValueAroundThisArea | км | km | **Root Cause Hypothesis:** - Copy-paste from Russian source code or documentation - Font encoding issue (unlikely, "км" appears correctly in JSON) - Automated translation step that pulled from wrong language **Fix Command:** ```bash sed -i 's/км/km/g' res/values/strings_*.arb ``` **Verification:** ```bash grep -r "км" res/values/ # Should return no results after fix ``` --- ### Issue #2: Key Naming Convention Violations **Summary:** Three keys have naming errors that violate i18n best practices. | Current Key | Problem | Correct Key | Type | |-------------|---------|-------------|------| | `notPermsUbication` | Typo: "Ubication" not English | `notPermsLocation` | Spelling | | `isYourUbicationEnabled` | Typo: "ubication" not English | `isYourLocationEnabled` | Spelling | | `getAlertsOfFiresinThatArea` | camelCase: "in" not capitalized | `getAlertsOfFiresInThatArea` | Style | **Impact:** - Translator confusion (key names should be clear English identifiers) - i18n tooling may reject these keys - Code search/refactoring harder due to inconsistent naming - Maintenance burden when reviewing translations **Required Code Changes:** All Dart files using these keys must be updated: ```bash # Find files using old key names grep -r "notPermsUbication\|isYourUbicationEnabled\|getAlertsOfFiresinThatArea" lib/ # Check for references in: # - l10n.dart (generated) # - Any Dart files calling getString() or AppLocalizations # - Unit tests using these keys ``` --- ### Issue #3: Grammar Quality Disparity **Summary:** English version has worse grammar than Spanish translation in some cases. | Key | EN Quality | ES Quality | Notes | |-----|-----------|-----------|-------| | `isYourUbicationEnabled` | ⚠️ Poor: "It's your ubication enabled?" | ✅ Good: "¿Están los servicios de ubicación en tu móvil activados?" | Spanish is MORE grammatically correct | | `noFiresAround` | ⚠️ Poor: "There is no fires" | ⚠️ Inconsistent: "Sin fuegos" | English has grammar error | | `noFiresAroundThisArea` | ⚠️ Poor: Grammar error | ⚠️ Poor: Has Russian character | Both have issues | **Pattern:** Spanish translations are often BETTER quality than English source. This suggests: - English strings written quickly without review - Spanish translator provides improvements - Quality control gap between languages **Recommendation:** Use Spanish as reference for English improvements. --- ### Issue #4: Gender-Inclusive Notation (@) **Summary:** Spanish uses "@" for gender-inclusive language in 2 instances. | Line | Key | Text | Technical Risk | |------|-----|------|-----------------| | 3 | `appName` | "¡Tod@s contra el Fuego!" | Rendering issues on some fonts | | 80 | `inGreenMonitoredAreas` | "usuari@s" | Potential display problems | **Technical Considerations:** - Some fonts don't render "@" inline correctly - Accessibility tools may struggle with "@" notation - Older Android devices may display incorrectly - Less compatible than "y" separation: "Todas y todos" **Recommendation:** ``` Option A (Traditional): "¡Todas y todos contra el Fuego!" Option B (Keep @): "¡Tod@s contra el Fuego!" (if brand requirement) (Requires device testing) ``` --- ## KEY STATISTICS ``` English Strings: 93 keys ✅ (complete, but 7 issues) Spanish Strings: 93 keys ✅ (complete, but 9 issues) Galician Strings: 3 keys ❌ (3% complete, 90 keys missing) Total Issues: - Cyrillic contamination: 6 instances - Grammar errors: 2 instances - Key name typos: 3 instances - Missing translations: 91 instances - Technical concerns: 2 instances - Consistency issues: 7 instances Severity Distribution: - CRITICAL: 1 (Galician incomplete) - HIGH: 10 (Russian characters + grammar) - MEDIUM: 9 (Key naming + translations) - LOW: 3 (Gender notation + consistency) ``` --- ## RECOMMENDED ACTION PLAN ### Phase 1: Urgent Fixes (BLOCKING PRODUCTION) ⏰ **Time Required:** 1-2 hours **Blocks:** Production deployment 1. **Fix Cyrillic "км" → "km"** (6 instances, 5 minutes) ```bash sed -i 's/км/km/g' res/values/strings_*.arb git diff res/values/ ``` 2. **Fix English Grammar** (2 instances, 5 minutes) - Line 20: "There is no fires" → "There are no fires" - Line 21: "There is no fires" → "There are no fires" - Line 33: "It's your ubication enabled?" → "Is location enabled on your device?" 3. **Complete Galician Translation** (1-3 hours) - Translate all 91 missing keys - Use English as template/reference - Have Galician speaker review 4. **Validate JSON Syntax** (5 minutes) ```bash jq '.' res/values/strings_*.arb > /dev/null ``` ### Phase 2: Code Updates (MEDIUM PRIORITY) 🔄 **Time Required:** 2-3 hours **Blocks:** Code review/merge 5. **Fix Key Name Typos** (need code changes) - `notPermsUbication` → `notPermsLocation` - `isYourUbicationEnabled` → `isYourLocationEnabled` - `getAlertsOfFiresinThatArea` → `getAlertsOfFiresInThatArea` Steps: ```bash # 1. Update ARB files (rename keys) # 2. Regenerate generated/i18n.dart # 3. Update all lib/*.dart references # 4. Run tests ``` 6. **Update Code References** (30 minutes) ```bash grep -r "notPermsUbication\|isYourUbicationEnabled\|getAlertsOfFiresinThatArea" lib/ # Update each file with new key names ``` ### Phase 3: Quality Review (LOW PRIORITY) 📋 **Time Required:** 1-2 hours **Blocks:** Nothing, but recommended 7. **Spanish Gender Notation Testing** (30 minutes) - Test "@" rendering on multiple devices - Verify accessibility with screen readers - Decision: Keep or replace with "y" 8. **Spanish Translation Review** (30 minutes) - Verify hashtag consistency across languages - Review any other translation inconsistencies 9. **Add QA Automation** (30 minutes) - Unit tests for key count per language - Tests for forbidden characters (e.g., "км") - Linting rules for key naming --- ## VERIFICATION CHECKLIST Before Production Deployment: - [ ] **Cyrillic "км" removed** (6 instances fixed, verify with `grep`) - [ ] **English grammar corrected** (2 instances fixed and tested) - [ ] **Galician translation completed** (all 93 keys present) - [ ] **JSON syntax validated** (`jq` passes on all files) - [ ] **Key names updated** (3 typo fixes applied with code references) - [ ] **Code compiles** (`flutter pub get` + `flutter analyze`) - [ ] **Unit tests pass** (if i18n tests exist) - [ ] **Manual testing on devices:** - [ ] English: Check all fixed strings display correctly - [ ] Spanish: Check "км" → "km" and "@" rendering - [ ] Galician: Basic smoke test of UI in this language - [ ] **All 3 languages have 93 keys** (parity check) - [ ] **Git diff reviewed** (no unintended changes) - [ ] **PR approved** before merge --- ## FILES TO UPDATE ### Direct Edits Required 1. `res/values/strings_en.arb` - 4 fixes 2. `res/values/strings_es.arb` - 3 fixes 3. `res/values/strings_gl.arb` - 91 additions + 1 fix ### Code Files (after key renames) 1. `lib/generated/i18n.dart` - Regenerate 2. Any file using `notPermsUbication` key 3. Any file using `isYourUbicationEnabled` key 4. Any file using `getAlertsOfFiresinThatArea` key ### Testing Files 1. Test localization loading 2. Test all strings render without errors 3. Test special characters in Spanish --- ## REFERENCES - **ARB Format Spec:** https://github.com/google/app-resource-bundle/wiki - **Flutter i18n Guide:** https://flutter.dev/docs/development/accessibility-and-localization/internationalization - **Spanish Gender Inclusivity:** Multiple standards (RAE, RTVE, etc.) --- ## AUTHOR NOTES **Analysis Completed:** 2026-03-06 **Severity Level:** CRITICAL (blocks production) **Recommended Timeline:** Fix Phase 1 before next release The most pressing issue is the Russian Cyrillic character contamination ("км"), which appears to stem from a copy-paste error or translation system glitch. This must be fixed before any production deployment. The incomplete Galician translation is also critical—the app will crash if users select Galician without complete translations. Key naming typos are secondary but should be addressed in the same PR to avoid future confusion and potential tool errors.