i18n: bring all 17 locale catalogs to 100% key coverage - #1790
Conversation
en.json is typed into t() so a missing English key is a compile error,
but the other catalogs have no such guard: an absent key silently falls
back to English at runtime and nothing in CI fails. Recent features left
16 keys untranslated across every locale, and fa was additionally missing
the 12 ArcGIS map/image service keys added when that panel grew.
Adds 280 strings:
- addData.arcgis paging controls (page size, max features, paging hint,
two loading-progress messages) x 17 locales
- collaborate.shareFailed, comments.post, comments.postShortcutTooltip,
layers.openStylePanel, toolbar.conversion.rasterTooLargeForBrowser
- printLayout atlas mask + data-block atlas filter x 16 locales
(fr already carried these four)
- the full ArcGIS map service / image service / sublayers /
rendering rule group for fa
Translations follow each catalog's existing terminology rather than a
fresh machine pass, and each locale's own conventions: unit names are
localized where that catalog already does so (fr "Go", ru "ГБ",
ar "غيغابايت", fa "گیگابایت" with Persian numerals) and left as ASCII
where it does not, parenthesis width follows zh full-width vs ja
half-width, and th keeps its no-trailing-period sentence style.
No plural keys are involved, so no CLDR plural sets change.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
📝 WalkthroughWalkthroughUpdated 18 desktop locale catalogs with translations for ArcGIS loading, atlas printing, raster limits, collaboration errors, style-panel access, and comment posting. ChangesDesktop localization updates
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
🔍 Cloudflare PR preview
|
Code reviewReviewed all 17 changed locale catalogs ( Bugs: None found. Every new key name matches its Security: None applicable — static JSON string additions, no code execution paths, no injected HTML/URLs beyond the pre-existing verbatim placeholder URLs (e.g. Performance: N/A — no runtime logic changed. Confidence: high. Quality: Interpolation tokens ( CLAUDE.md: Changes are confined to I was unable to execute |
🔍 GitHub Pages PR preview
Note GitHub Pages built this preview successfully, but its serving edge returned HTTP 403 when checked. The links may still be propagating. |
There was a problem hiding this comment.
Actionable comments posted: 7
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/geolibre-desktop/src/i18n/locales/ar.json`:
- Around line 1610-1611: Update the Arabic maskOutside translation to use
shading or masking terminology that reflects the semi-transparent fill, such as
تظليل المنطقة خارج المعلم الحالي, while leaving maskOutsideHint unchanged.
In `@apps/geolibre-desktop/src/i18n/locales/hi.json`:
- Line 2199: Update the Hindi translation for the rasterTooLargeForBrowser key
so the GeoLibre Desktop instruction uses a conversion verb, conveying “convert
it with the GeoLibre Desktop app” while preserving the existing guidance to
create a COG with gdal_translate or rio-cogeo and keeping it aligned with the
English source semantics.
In `@apps/geolibre-desktop/src/i18n/locales/ka.json`:
- Line 492: Update the Georgian ArcGIS locale entries at pageSize and the
related entry around line 496 to use the established `ობიექტი`/`ობიექტების`
terminology instead of `ჩანაწერი`, while preserving the existing count wording
and interpolation.
- Line 2199: Update the Georgian rasterTooLargeForBrowser translation so
ბრაუზერი is the explicit subject performing the raster decoding, while
preserving the existing WebAssembly memory-limit and conversion guidance.
- Line 1458: Update the `maskOutside` translation value in the Georgian locale
to use the noun form `არეალის`, preserving the rest of the atlas mask label and
its existing meaning.
In `@apps/geolibre-desktop/src/i18n/locales/nl.json`:
- Line 2199: Update the rasterTooLargeForBrowser translation to use the correct
Dutch phrase “het hele raster” instead of “de hele raster,” while preserving the
rest of the message and source wording unchanged.
In `@apps/geolibre-desktop/src/i18n/locales/ru.json`:
- Line 2285: Update the Russian translation value for rasterTooLargeForBrowser
to explicitly state that the browser decodes the entire raster into WebAssembly
memory, which is limited to approximately 4 GB; preserve the existing conversion
guidance for the GeoLibre desktop app, gdal_translate, and rio-cogeo.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: ee7b5ec1-f3b5-408a-b6a0-16af35ccdc59
📒 Files selected for processing (17)
apps/geolibre-desktop/src/i18n/locales/ar.jsonapps/geolibre-desktop/src/i18n/locales/de.jsonapps/geolibre-desktop/src/i18n/locales/es.jsonapps/geolibre-desktop/src/i18n/locales/fa.jsonapps/geolibre-desktop/src/i18n/locales/fr.jsonapps/geolibre-desktop/src/i18n/locales/hi.jsonapps/geolibre-desktop/src/i18n/locales/id.jsonapps/geolibre-desktop/src/i18n/locales/it.jsonapps/geolibre-desktop/src/i18n/locales/ja.jsonapps/geolibre-desktop/src/i18n/locales/ka.jsonapps/geolibre-desktop/src/i18n/locales/ko.jsonapps/geolibre-desktop/src/i18n/locales/nl.jsonapps/geolibre-desktop/src/i18n/locales/pt.jsonapps/geolibre-desktop/src/i18n/locales/ru.jsonapps/geolibre-desktop/src/i18n/locales/th.jsonapps/geolibre-desktop/src/i18n/locales/tr.jsonapps/geolibre-desktop/src/i18n/locales/zh.json
- ar: atlas `maskOutside` said إخفاء ("hide"), implying the area is removed;
the control paints a translucent inverted fill, so use تظليل ("shade") to
match the rendered behavior and the existing maskOutsideHint.
- ka: atlas `maskOutside` used the dative არეს where the masdar დანიღბვა
governs the genitive; use არეალის, which is also the noun already used by
the neighboring "extentMode": "გვერდის არეალი".
- ka: `rasterTooLargeForBrowser` opened with a referent-less ეს; make
ბრაუზერი the explicit subject of the decoding.
- hi: `rasterTooLargeForBrowser` said बदलें ("replace"); the English says
"Convert it with the GeoLibre desktop app", so use रूपांतरित करें, parallel
with the instrumental से in the following gdal_translate clause.
- nl: raster is a neuter noun, so "de hele raster" -> "het hele raster".
- ru: `rasterTooLargeForBrowser` opened with a referent-less это; state the
decoding directly and attach the ~4 GB cap to WebAssembly memory.
Not applied: CodeRabbit asked for ka `pageSize`/`pagingHint` to use
ობიექტი instead of ჩანაწერი. en.json deliberately distinguishes "Records per
request" from "Maximum features", and all 17 locales mirror that split
(Datensätze/Registros/Записей/レコード/记录 vs features). Collapsing the two in
ka alone would erase a distinction present in the source.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/geolibre-desktop/src/i18n/locales/nl.json`:
- Line 2199: Update the Dutch translation value for rasterTooLargeForBrowser to
explicitly state that WebAssembly memory is limited to approximately 4 GB and
clearly refer to the raster as too large, avoiding ambiguous pronouns and
preserving the existing conversion guidance.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 78560b9d-6d7a-466b-b182-f6eb748b7576
📒 Files selected for processing (5)
apps/geolibre-desktop/src/i18n/locales/ar.jsonapps/geolibre-desktop/src/i18n/locales/hi.jsonapps/geolibre-desktop/src/i18n/locales/ka.jsonapps/geolibre-desktop/src/i18n/locales/nl.jsonapps/geolibre-desktop/src/i18n/locales/ru.json
Code reviewThis PR only adds translation strings to 17 locale JSON catalogs ( Verification performed:
Bugs: None found. Security: None found — no user input, no code execution, plain JSON string literals. Performance: None found — this doesn't affect runtime performance (i18next fallback lookups are removed, not added). Quality: None found — key ordering mirrors CLAUDE.md: No violations — this only touches locale catalogs, which No inline comments were posted since no defects were identified. |
- nl: `rasterTooLargeForBrowser` opened with a referent-less `dit` and attached the ~4 GB cap to WebAssembly rather than to its memory. Recast as a passive clause with the raster as subject, then a second sentence putting the limit on `WebAssembly-geheugen` — the same shape already applied to the ru and ka strings in 86cd08f.
Code reviewReviewed all 17 changed locale JSON files ( Bugs: None found. Cross-checked every added key against Security: None found. No user-controlled data, no HTML/script content introduced; strings are plain display text. Performance: N/A — static JSON catalog additions only, no measurable impact. Quality:
CLAUDE.md adherence: Consistent with the i18n conventions in No inline comments were posted — nothing rose to a level worth flagging on specific lines. |
Why
en.jsonis typed intot()viai18next.d.ts, so a missing or misspelled English key is a compile error. The other 17 catalogs have no such guard: a key absent fromde.jsonsilently falls back to English at runtime, and nothing in CI fails. The parity test deliberately reports coverage without asserting it, so catalogs drift behind features and the drift stays invisible until someone runs an audit.Coverage before this PR was 99 to 100% depending on locale. It is now 100% across the board.
What was missing
addData.arcgispaging:pageSize,pageSizePlaceholder,maxFeatures,maxFeaturesPlaceholder,pagingHint,loadingProgress,loadingProgressUnknowncollaborate.shareFailed,comments.post,comments.postShortcutTooltiplayers.openStylePaneltoolbar.conversion.rasterTooLargeForBrowserprintLayout.atlas.maskOutside,maskOutsideHint,printLayout.dataBlocks.filterToAtlasFeature,filterToAtlasFeatureHintfralready had them)faonly280 strings in total.
Apparent gaps that are correct as-is, please do not "fix" them
An audit that diffs keys naively will flag these. All are intentional and none are touched here:
_oneabsent fromzh,ja,ko,id,this correct. Those languages have a single CLDR plural category (other). Adding_onewould hand i18next a form it can never select._zero/_two/_few/_manypresent inarandruis correct. English ships only_oneand_other; those languages need more. The parity test normalizes plural suffixes before comparing precisely so these do not read as extra keys._zerooutside a language's CLDR set can still be correct, whereenitself defines an explicit_zerooverride that drops{{count}}(for examplemap.directionsMode.waypointCount_zero). i18next honors it in every language.No plural keys are added by this PR, so no CLDR plural set changes.
Translation approach
Each string was written against the sibling keys already in that catalog rather than by a fresh machine pass, so terminology stays internally consistent. Concretely:
deObjekte,esentidades,frentités,itelementi,ptfeições,nlfeatures,ruобъекты, and so on) as used byaddData.wfs.maxFeaturesandtoolbar.conversion.readFeatures.fr"4 Go",ru"4 ГБ",ar"4 غيغابايت",fa"۴ گیگابایت" with Persian numerals, matchingaddData.serviceLibrary.errorTooLarge. Every other locale keeps ASCII "4 GB".zhfull-width,jahalf-width with no space,kono space, others spaced.thkeeps its existing no-trailing-period sentence style..../MapServer,{"rasterFunction":"Hillshade"}) are carried over verbatim, matching every other locale.fafollows its own vocabulary: سرویس for service, نشانی for URL, کاشی for tiles, شیوهٔ نمایش for style.The diff is insert-only. Existing lines never move; the 33 deletions are lines that gained a trailing comma.
Verification
audit: 100% on all 17 non-English catalogstests/i18n-catalogs.test.ts,tests/i18n-languages.test.ts,tests/add-data-i18n.test.ts: 62 passednpm run test:frontend: 5524 passed, 0 failed, 1 skippedpre-commit run --files apps/geolibre-desktop/src/i18n/locales/*.json: all hooks pass, includingnpm buildReview requested
These translations were authored against the existing catalogs' terminology, not by native speakers.
docs/i18n.mdalready frames the non-English catalogs as open to review, so corrections from native speakers on any of these strings are very welcome, particularly the longer explanatory ones such astoolbar.conversion.rasterTooLargeForBrowserandprintLayout.dataBlocks.filterToAtlasFeatureHint.Out of scope
Catalog coverage at 100% does not mean the UI is fully translated. Strings never wrapped in
t()render English in every locale and are invisible to the catalogs. A scan finds roughly 73 such strings across 17 components, concentrated inRasterSymbologySection.tsx,ModelBuilderDialog.tsx,ManagePluginsDialog.tsx, and the attribute and processing dialogs. Migrating those is a much larger job (each needs at()call, anen.jsonkey, and 17 translations), anddocs/i18n.mdframes i18n as deliberately incremental with English fallback, so it is reported here rather than folded into this PR.Summary by CodeRabbit