Skip to content

fix(i18n): translate all missing keys across 11 locales (#209)#210

Merged
hokiepokedad2 merged 3 commits into
mainfrom
fix/i18n-bulk-delete-selected-key
Apr 13, 2026
Merged

fix(i18n): translate all missing keys across 11 locales (#209)#210
hokiepokedad2 merged 3 commits into
mainfrom
fix/i18n-bulk-delete-selected-key

Conversation

@hokiepokedad2
Copy link
Copy Markdown
Contributor

@hokiepokedad2 hokiepokedad2 commented Apr 13, 2026

Summary

Fixes #209. Three related i18n bugs rolled into one PR:

  • Raw-token rendering: bulk-delete confirm button on Quests and Invasions rendered the literal translation key (QUESTS.CONFIRM_DELETE_SELECTED / INVASIONS.CONFIRM_DELETE_SELECTED) because the key only existed under the RAIDS namespace.
  • 277-key locale gap: keys added to en.json over time had never been propagated to the 10 non-English locale files. Non-English users saw English text leak through via ngx-translate's default-lang fallback.
  • Translations: backfilled keys get real native-language translations (2,770 total), not English placeholders.

Audit scope

Scanned every i18n.instant(), translate.instant/get/stream(), and | translate pipe usage across .ts and .html in src/app, then diffed against all 11 locale files. Post-fix: 0 missing keys in any locale.

Translation notes

Game-specific terminology uses official Pokémon GO localizations where they exist:

  • Team Mystic → Sagesse (fr) / Weisheit (de) / Sabiduría (es) / Saggezza (it) / Sabedoria (pt)
  • Gigantamax → Gigamax (fr/es/it/pt) / Gigadynamax (de) / Gigantamax (nl/pl/da/sv)
  • PVP leagues translated where the localized name is in active game use, otherwise kept in English (common for Dutch/Nordic locales)

Polish translations and the verbose admin-settings descriptions would benefit from a native-speaker pass — they're correct but may read slightly stiff.

Test plan

  • Frontend Jest suite: 575/575 pass
  • Prettier check clean on all locale JSON
  • node diff shows 0 keys missing in any locale after fix
  • Manual smoke test: open the Quests page, select alarms, click bulk delete → confirm button should show the translated "Delete Selected" in each UI language
  • Eyeball a few admin-settings descriptions in each language for correctness

The bulk-delete confirmation button on the Quests and Invasions pages
rendered the raw translation key (QUESTS.CONFIRM_DELETE_SELECTED /
INVASIONS.CONFIRM_DELETE_SELECTED) instead of the translated text
because the key existed only under the RAIDS namespace in every locale.

Added CONFIRM_DELETE_SELECTED to the QUESTS and INVASIONS blocks of all
11 locale files (en, fr, de, es, nl, it, pt, pt-BR, pl, da, sv), reusing
the existing RAIDS.CONFIRM_DELETE_SELECTED translations.

Closes #209
Keys added to en.json over time had not been propagated to the fr, de,
es, nl, it, pt, pt-BR, pl, da, and sv locale files. Each was missing
the same 277 keys (e.g. TOOLBAR.MAIN_NAV, POKEMON.LEAGUE_*,
POKEMON.SIZE_LABEL_*). Runtime behavior was unchanged because
ngx-translate falls back to the default language, so users saw English
text leaking through in their locale rather than raw tokens.

Backfilled every missing key with the English string as a placeholder
in the correct nested position. Translators can now discover and
translate these strings; locale files are structurally complete.
Replaced the English-placeholder backfill from the previous commit with
native-language translations for every locale: fr, de, es, nl, it, pt,
pt-BR, pl, da, sv. 2,770 translations total.

Coverage: alarm snackbars (FORT_CHANGES, MAX_BATTLES), admin settings
labels and descriptions (branding, feature toggles, role-based access,
Telegram/Discord config, analytics), GeoJSON import wizard (upload/
preview/results, validation errors), geofence detail fields, profile
picker (alarm types, "all X" variants, lures, teams), map controls,
game brand terms (PVP leagues, team names, lure types, Gigantamax,
Stardust, Mega Energy).

Game-specific terminology follows official Pokémon GO localizations
where available (e.g. Sagesse/Weisheit/Sabiduría for Mystic, Gigamax
in romance languages, Gigadynamax in German).
@github-actions github-actions Bot added the fix label Apr 13, 2026
Copy link
Copy Markdown
Contributor Author

@hokiepokedad2 hokiepokedad2 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review — PR !210

Area Status
Overall ✅ Approve (data-only change)
Correctness ✅ All 279 backfilled keys present across 11 locales
Requirements (#209) ✅ Satisfied — both raw-token keys fixed; 277-key gap closed
Risk 🟢 Low — pure JSON data, no code-path changes

Scope verification

  • Files changed: 11 locale JSONs + CHANGELOG only. Zero production code touched.
  • en.json delta: exactly 2 new keys (QUESTS.CONFIRM_DELETE_SELECTED, INVASIONS.CONFIRM_DELETE_SELECTED) — matches issue scope precisely.
  • Structural integrity: every non-English locale now has identical key set to en.json (verified: 0 missing, 0 extra, 1,434 keys each).
  • Frontend tests: 575/575 pass. Prettier clean. Existing i18n-validation / similar guards (if any) would catch regressions.

Translation quality — spot check

Sampled per-locale values against known Pokémon GO official terminology:

Term Expected Found
Team Mystic (fr) Sagesse Sagesse ✅
Team Mystic (de) Weisheit Weisheit ✅
Gigantamax (fr) Gigamax Gigamax ✅
Gigantamax (de) Gigadynamax Gigadynamax ✅
Stardust (it) Polvere di Stelle Polvere di Stelle ✅
Lure Glacial (es) Señuelo Glacial Señuelo Glacial ✅

Keys that remain identical to English (~100–190 per locale) were audited — they are legitimate cognates or brand terms (e.g. "Normal", "Administration", "Points", "Raids", "Discord", "Telegram", size abbreviations XXS/XS/XL/XXL, unit "m"). No accidental English leakage into the 277 backfilled keys.

Minor observations

  1. Commit history is layered (placeholder backfill → full translations). A squash-merge yields a clean single-commit history; if preserving the audit trail matters, merge commits keep the story. Either is fine.
  2. Polish & verbose admin descriptions: noted in PR description as needing native-speaker review. Acceptable to ship as-is given English fallback wasn't giving users anything better; recommend filing a follow-up issue tagged help wanted: translation review for post-merge polish.
  3. Team name inconsistency (intentional, but worth documenting): Valor/Instinct kept English in nl/pl/da/sv where those locales typically don't translate the brand names in community tooling, but translated in fr/de/es/it/pt per official game localizations. This matches community convention but may surprise contributors — a short note in a docs/i18n.md could help future translators.

Requirements traceability

Issue #209 requirement Implementation Status
Fix raw QUESTS.CONFIRM_DELETE_SELECTED rendering Added to QUESTS block in all 11 locales (reuses RAIDS translation)
Find all other raw-token cases Full audit — INVASIONS.CONFIRM_DELETE_SELECTED also found & fixed
Close 277-key locale gap (expanded scope) All 277 keys added to 10 non-English locales
Actually translate them 2,770 native translations applied

Verdict

APPROVE — ready to merge. Suggest squash-merge for a clean history, and file a follow-up "translation quality review" issue with help wanted for native-speaker polish of admin descriptions and Polish strings.

@hokiepokedad2 hokiepokedad2 enabled auto-merge (squash) April 13, 2026 04:31
@hokiepokedad2 hokiepokedad2 disabled auto-merge April 13, 2026 04:36
@hokiepokedad2 hokiepokedad2 merged commit e9a588c into main Apr 13, 2026
7 checks passed
@hokiepokedad2 hokiepokedad2 deleted the fix/i18n-bulk-delete-selected-key branch April 13, 2026 04:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

i18n: QUESTS.CONFIRM_DELETE_SELECTED and INVASIONS.CONFIRM_DELETE_SELECTED render as raw keys

1 participant