i18n: translate the startup project and ArcGIS sublayer strings - #1811
Conversation
|
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)
📝 WalkthroughWalkthroughThe PR expands localization catalogs across desktop workflows and replaces hardcoded comment UI text with translation keys. It adds strings for data sources, startup projects, plugins, raster tools, exports, dashboards, sharing, and collaboration. ChangesLocalization and comment UI
Estimated code review effort: 3 (Moderate) | ~25 minutes Possibly related PRs
Suggested reviewers: Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
🧪 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 reviewBugs: None found. All 17 locale catalogs add the same 18 keys at the same sibling position as Security: None applicable — this is static, non-executable translation data with no user input or code paths affected. Performance: None — purely additive JSON key/value pairs; negligible bundle size impact. Quality:
CLAUDE.md: Adherent — uses Overall this is a clean, mechanical translation-parity PR; the single nit raised is a low-confidence style suggestion, not a defect. |
🔍 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. |
The catalogs had drifted out of en.json order as features landed keys in different places, so an ordered insert could no longer produce a purely additive diff. This re-sorts all 17 into en.json order. Content is unchanged: only key order moves. Locale-only keys (the extra plural forms ru and ar need) anchor on the first en key sharing their plural base, keeping each plural group contiguous.
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/id.json`:
- Around line 1699-1700: Update the Indonesian `startup` translation in the
locale settings section to use an application-startup label, preferably `Saat
Memulai` or the approved equivalent `Pengaktifan`, replacing `Awal Mula` while
leaving `updates` unchanged.
🪄 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: cf5fb7c4-cb50-4377-9d73-00682f874854
📒 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
The comments panel, thread cards, and Add Comment dialog rendered ~39
strings outside t(), so they stayed English in every locale even at 100%
catalog coverage. This wraps them and translates them across all 17.
Existing keys are reused rather than duplicated: comments.title,
comments.defaultAuthorName, collaborate.sessionCode, collaborate.copied,
collaborate.connecting, and common.cancel.
Counts interpolate with {{count}} but take no plural suffix: the number
sits in parentheses and no noun agrees with it, so a single form is
correct in every language.
Verified in a browser against the built app in German and Arabic,
including RTL mirroring and the <strong> interpolation in postingAs.
- id: use "Saat Memulai" for settings.section.startup instead of "Awal Mula". "Awal Mula" is a set phrase meaning "origin"/"the very beginning" rather than application startup. "Saat Memulai" matches the siblings already in this section (Title Case, e.g. "Tata Letak", "Penyedia AI") and the startup strings added in this PR, settings.startup.title "Proyek saat memulai" and the description "...saat aplikasi native dimulai".
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
apps/geolibre-desktop/src/i18n/locales/it.json (1)
486-490: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winUse
sottolivelliconsistently for ArcGIS MapServer sublayers.The surrounding keys use
sottolivelli, but these strings use genericlivelli. This can make the action and error messages refer to top-level map layers instead of MapServer sublayers.Proposed wording
- "retrieveSublayers": "Sfoglia livelli", + "retrieveSublayers": "Sfoglia sottolivelli", ... - "noSublayersFound": "Questo servizio mappa non ha dichiarato alcun livello.", - "retrieveError": "Impossibile recuperare i livelli del servizio mappa.", + "noSublayersFound": "Questo servizio mappa non ha dichiarato alcun sottolivello.", + "retrieveError": "Impossibile recuperare i sottolivelli dal servizio mappa.",🤖 Prompt for 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. In `@apps/geolibre-desktop/src/i18n/locales/it.json` around lines 486 - 490, Update the Italian values for retrieveSublayers, retrievingSublayers, and retrieveError to consistently use “sottolivelli” instead of the generic “livelli,” while preserving the existing meaning and formatting of each message.
🤖 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/es.json`:
- Around line 3277-3298: Update the Spanish STAC locale strings in the shown
block and the referenced ranges to use formal imperative forms consistently,
replacing informal instructions such as introduce, elige, selecciona, mantén,
arrastra, and haz clic with the established formal equivalents. Preserve the
existing meanings and punctuation of all affected labels.
- Line 1199: Update the credentialsRemoved translation to replace the unnatural
“campo(s)” wording with a count-neutral Spanish label such as “Campos de
credenciales omitidos: {{count}}.” Preserve the existing key and interpolation,
and do not introduce plural variants unless the corresponding en.json entry
defines them.
In `@apps/geolibre-desktop/src/i18n/locales/ru.json`:
- Line 1269: Update the Russian locale entries share.credentialsRemoved
(apps/geolibre-desktop/src/i18n/locales/ru.json lines 1269-1269),
tilecodePlugin.cellCount (lines 3233-3233), openAerialMap.showing (lines
3294-3294), and netcdfCube.planeEstimate (lines 5274-5274) to use count-neutral,
label-style wording without the hard-coded plural phrases, while preserving
every existing interpolation placeholder.
---
Outside diff comments:
In `@apps/geolibre-desktop/src/i18n/locales/it.json`:
- Around line 486-490: Update the Italian values for retrieveSublayers,
retrievingSublayers, and retrieveError to consistently use “sottolivelli”
instead of the generic “livelli,” while preserving the existing meaning and
formatting of each message.
🪄 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: 4b02752b-60ef-4828-9247-45ee5879538e
📒 Files selected for processing (21)
apps/geolibre-desktop/src/components/comments/AddCommentDialog.tsxapps/geolibre-desktop/src/components/comments/CommentThread.tsxapps/geolibre-desktop/src/components/comments/CommentsPanel.tsxapps/geolibre-desktop/src/i18n/locales/ar.jsonapps/geolibre-desktop/src/i18n/locales/de.jsonapps/geolibre-desktop/src/i18n/locales/en.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
Brings every locale back to full coverage after two features shipped English-only strings, then fixes the two problems that surfaced while doing it. Three commits, reviewable in order.
1. Translate the startup project and ArcGIS sublayer strings
Two features landed 18 new
en.jsonkeys, leaving all 17 non-English catalogs behind.addData.arcgis.retrieveSublayers,retrievingSublayers,availableSublayers,noSublayersFound,retrieveError,errorMapServiceUrlsettings.section.startup,settings.startup.title,description,mode.{default,last,specific},modeHint.{default,last},chooseProject,noProjectSelected,selectError,loadWarningEvery locale was missing exactly the same 18 keys, so none of this is a per-language gap.
2. Re-sort every catalog into en.json key order
Inserting keys at their
en.jsonsibling position is supposed to produce a purely additive diff. It no longer did: the catalogs had drifted out ofen.jsonorder as features landed keys in different places, so an ordered insert wanted to move ~5,600 lines of unrelated content.This commit does that realignment on its own, with no content change. Only key order moves. Locale-only keys (the extra plural forms
ruandarneed) anchor on the first en key sharing their plural base, so each plural group stays contiguous. Verified mechanically: the flattened key/value maps are byte-identical before and after, and every catalog now matchesen.jsonorder.Separating it keeps commits 1 and 3 additive and reviewable.
3. Translate the review comments feature
100% catalog coverage is not the same as a translated UI. The comments panel, thread cards, and Add Comment dialog rendered ~39 strings outside
t(), so that feature stayed English in every locale no matter how complete the catalogs were. This wraps them and translates them across all 17.Existing keys are reused rather than duplicated:
comments.title,comments.defaultAuthorName,collaborate.sessionCode,collaborate.copied,collaborate.connecting, andcommon.cancel.Two notes for reviewers:
{{count}}but no plural suffix. InfilterOpen/filterResolved/filterAll/liveSyncthe number sits in parentheses and no noun agrees with it, so one form is correct in every language. i18next falls back to the unsuffixed key when no_one/_otherexists.postingAsuses<Trans>to keep the author name inside<strong>, so word order stays translatable rather than being concatenated around the tag.Apparent gaps that are correct as-is
Please do not "fix" these; they are deliberate and the parity test normalizes for them:
zh/ja/ko/id/thcarry no_oneforms. Those languages have a single CLDR plural category (other). Adding_onewould give i18next a form it can never select.arcarries_zero/_two/_few/_many, andrucarries_few/_many. English ships only_one/_other; those languages need more.map.directionsMode.waypointCount_zeroexists in every locale. English itself defines an explicit_zerooverride (a wording that drops{{count}}), and i18next honors an explicit_zeroin any language.Two more things that look like gaps but are not, both found while scanning for un-migrated strings:
SectionErrorBoundary'slabelprop is deliberately English. It is a stable identifier that lands in diagnostics records and bug reports. The user-facing name is the separatedisplayNameprop, and all 23 call sites inDesktopShell.tsxalready pass a translated one.Promise<…>type parameters that a naive>text<scan reports as JSX text.Translation notes
Terminology follows what each catalog already uses rather than a fresh machine pass:
addData.arcgis.sublayers("Unterebenen", "Subcapas", "Подслои", "子图层", …) andmapServiceLayerwording, and mirror the parallel phrasing already ataddData.wms.retrievingandaddData.wms.retrieveError.shell.workspaceTitle/settings.layout.description(Arbeitsbereich, espacio de trabajo, espace de travail, area di lavoro, рабочее пространство, 工作区, ワークスペース, 작업 공간, مساحة العمل, …).addData.common.noFileSelectedandaddData.gdb.noFolderSelected.„…“(de, ka),«…»(es, fr, it, ru, ar, fa),“…”(pt, zh, ko, tr, hi, id, th),‘…’(nl),「…」(ja).Verification
scripts/audit.py: 100% (4805/4805) for all 17 locales, no extra keys, no plural-set mismatchesnpm run test:frontend: 5600 tests, 0 failuresnpm run typecheck: cleanpre-commit run --files <changed>: passed, including thenpm buildhook<strong>survives thepostingAsinterpolation, 0 console errorsStill out of scope
Some on-map MapLibre control strings ("Enter fullscreen", "Layer Control", "Toggle attribution") come from the upstream
maplibre-gl-*packages and are not reachable from GeoLibre's catalogs. Translating those means changing those packages.Review welcome
These translations are authored against the existing catalogs' terminology, not by native speakers. Corrections are very welcome, particularly on the
settings.startupwording, where "workspace" versus "project" is a distinction each language draws differently.Summary by CodeRabbit