fix(i18n): translate all missing keys across 11 locales (#209)#210
Merged
Conversation
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).
hokiepokedad2
commented
Apr 13, 2026
Contributor
Author
hokiepokedad2
left a comment
There was a problem hiding this comment.
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
- 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.
- 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 reviewfor post-merge polish. - 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.mdcould 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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Fixes #209. Three related i18n bugs rolled into one PR:
QUESTS.CONFIRM_DELETE_SELECTED/INVASIONS.CONFIRM_DELETE_SELECTED) because the key only existed under the RAIDS namespace.en.jsonover 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.Audit scope
Scanned every
i18n.instant(),translate.instant/get/stream(), and| translatepipe usage across.tsand.htmlinsrc/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:
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
nodediff shows 0 keys missing in any locale after fix