- 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
530 lines
18 KiB
Markdown
530 lines
18 KiB
Markdown
# 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.
|