- Fix always_specify_types (fireAlert, genericMap, mainCommon, firesApi) - Fix always_put_control_body_on_new_line (firesApi, placesAutocompleteUtils) - Fix unnecessary_import (remove redundant meta imports) Build: APK generated, 0 errors, 0 warnings
18 KiB
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:
- Copy-paste error introducing Russian "км" instead of "km" (6 instances)
- Typos in key identifiers that violate i18n conventions
- Incomplete Galician translation (only 3 of 93 keys)
- 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:
sed -i 's/км/km/g' res/values/strings_*.arb
Verification:
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:
# 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
-
Fix Cyrillic "км" → "km" (6 instances, 5 minutes)
sed -i 's/км/km/g' res/values/strings_*.arb git diff res/values/ -
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?"
-
Complete Galician Translation (1-3 hours)
- Translate all 91 missing keys
- Use English as template/reference
- Have Galician speaker review
-
Validate JSON Syntax (5 minutes)
jq '.' res/values/strings_*.arb > /dev/null
Phase 2: Code Updates (MEDIUM PRIORITY) 🔄
Time Required: 2-3 hours Blocks: Code review/merge
-
Fix Key Name Typos (need code changes)
notPermsUbication→notPermsLocationisYourUbicationEnabled→isYourLocationEnabledgetAlertsOfFiresinThatArea→getAlertsOfFiresInThatArea
Steps:
# 1. Update ARB files (rename keys) # 2. Regenerate generated/i18n.dart # 3. Update all lib/*.dart references # 4. Run tests -
Update Code References (30 minutes)
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
-
Spanish Gender Notation Testing (30 minutes)
- Test "@" rendering on multiple devices
- Verify accessibility with screen readers
- Decision: Keep or replace with "y"
-
Spanish Translation Review (30 minutes)
- Verify hashtag consistency across languages
- Review any other translation inconsistencies
-
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 (
jqpasses 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
res/values/strings_en.arb- 4 fixesres/values/strings_es.arb- 3 fixesres/values/strings_gl.arb- 91 additions + 1 fix
Code Files (after key renames)
lib/generated/i18n.dart- Regenerate- Any file using
notPermsUbicationkey - Any file using
isYourUbicationEnabledkey - Any file using
getAlertsOfFiresinThatAreakey
Testing Files
- Test localization loading
- Test all strings render without errors
- 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.