Skip to content

i18n: fill 218 missing keys across all 15 non-English catalogs - #1635

Merged
giswqs merged 2 commits into
mainfrom
i18n-fill-missing-catalog-keys
Aug 2, 2026
Merged

i18n: fill 218 missing keys across all 15 non-English catalogs#1635
giswqs merged 2 commits into
mainfrom
i18n-fill-missing-catalog-keys

Conversation

@giswqs

@giswqs giswqs commented Aug 1, 2026

Copy link
Copy Markdown
Member

Every non-English catalog was at 95% coverage, all missing the same 218 keys. They are now at 100%.

en.json is typed into t(), so a missing English key is a compile error. The other 15 catalogs have no such guard: a missing key silently falls back to English at runtime and nothing in CI fails. The parity test only forbids extra keys and placeholder drift, and reports coverage without asserting it. So the catalogs drifted behind roughly a dozen features.

What was missing, and which feature shipped it

Namespace Keys Feature
gps.* 36 NMEA receiver position source, satellite/altitude/speed readouts, fix-quality labels
processing.* 26 Distance-unit picker for Whitebox tools, area-of-interest extent box, CRS browser
arcgisHub.* 24 ArcGIS Hub dataset search / add / download panel
toolbar.* 20 QGIS project import (plus its per-reason failure messages), Import menu, project duplicate, save-as-template
openDataCatalogs.* 16 Socrata and Humanitarian Data Exchange CKAN browse panels
browser.* 14 My Data saved-layer library: import/export, rename, remove, unresolved-join and desktop-only warnings
layers.* 13 Save to My Data, group actions on multi-selection, refresh-failure policy, sync status
annotations.* 12 Pin marker, sticky note, placed image tools and the Elements panel
dashboard.* 12 Selector and list widget types, multi-select, sort and row-limit editor fields
template.* 10 Save project as a reusable template
projectHistory.* 9 Autosave snapshot browser and crash recovery prompt
comments.* 9 Review comment dialog
addData.* 8 Delimited text import by address (geocoded) rather than coordinates
newProject, gallery, vectorExport, masBuild, geocode, style 9 Saved templates list, open-a-copy, KML invalid-coordinate errors, Mac App Store notice, geocode cancellation, proportional-size validation

Apparent gaps that are correct as-is

A naive key diff flags these. Please do not "fix" them, it would break plural selection or the parity test:

  • _one absent from zh / ja / ko / id. Those languages have a single CLDR plural category (other). Adding _one gives i18next a form it will never select.
  • _zero / _two / _few / _many present in ar and ru. English ships only _one / _other; those languages need more. The parity test normalizes plural suffixes before comparing precisely so these do not read as extra keys.
  • browser.libraryLayerJoinsUnresolved_one carries no {{count}} in any locale. It mirrors the English _one, which spells the number out ("1 saved join"). The placeholder test compares each form against its English counterpart, so adding {{count}} there fails CI. Every other plural form does carry it, including Arabic's _zero.
  • gps.notAvailable is everywhere. It is an em dash placeholder, not untranslated prose.

How this was done

  • Plural forms follow each language's CLDR set: zh/ja/ko/id get _other only, de/es/fr/it/pt/nl/tr/hi/ka get _one/_other, ru adds _few/_many, ar carries all six. Arabic follows the numeral-agreement pattern already established in the catalog (addData.wms.selectLayer, addData.deckViz.loadedFeatures).
  • Terminology was taken from each catalog's existing vocabulary rather than translated cold: "Add to map", "Load more", "Sort by / Ascending / Descending", "Columns", CRS and EPSG wording, the compass points, the local "e.g." convention (z. B. / p. ej., / p. ex. / 例: / مثال: / მაგ.), and each catalog's quotation marks („…“ de/ka, «…» es/fr/ru/ar, “…” zh, 「…」 ja, straight quotes elsewhere).
  • Product and format names stay untranslated: ArcGIS Hub, QGIS, Socrata, CKAN, Humanitarian Data Exchange, GeoJSON, NMEA, EPSG, WGS84, RTK, GeoLibre Desktop.
  • Keys are inserted at their en.json position without moving any existing entry, so the diff is purely additive: every one of the 90 deleted lines is the same line re-added with a trailing comma.

Verification

  • audit.py: 100% on all 15 locales, no extra keys, no plural-set mismatches.
  • npm run test:frontend: 4783 pass, 0 fail.
  • pre-commit run --files apps/geolibre-desktop/src/i18n/locales/*.json: all hooks pass, including the npm build typecheck.
  • Verified programmatically that no pre-existing key changed value, was removed, or moved position.

Review welcome

These translations were authored against the existing catalogs' terminology, not by native speakers. docs/i18n.md already frames the non-English catalogs as open to review, so corrections from native speakers on any locale are very welcome, particularly the GPS/NMEA hardware wording and the Whitebox CRS and distance-unit copy, which are the most domain-specific strings in the set.

Out of scope

Catalog coverage at 100% does not mean the UI is fully translated. Roughly 70 strings across ~17 components are never wrapped in t() and render English in every locale, concentrated in RasterSymbologySection.tsx, ModelBuilderDialog.tsx, ManagePluginsDialog.tsx and the attribute/processing dialogs. Migrating those needs a t() call, an en.json key and 15 translations each, so it belongs in its own PR (or several). docs/i18n.md frames i18n as deliberately incremental with English fallback for un-migrated surfaces.

Summary by CodeRabbit

  • Localization
    • Added translations for project history, templates, layer libraries, imports, GPS tracking, annotations, dashboards, synchronization, exports, and review comments.
    • Expanded validation, progress, status, accessibility, and error messages across the desktop interface.
    • Updated Arabic, German, Spanish, French, Hindi, Indonesian, Italian, Japanese, Georgian, Korean, Dutch, Portuguese, Russian, Turkish, and Chinese locales.

Every non-English catalog sat at 95% coverage, missing the same 218 keys
from features shipped since the last catalog sweep: project history and
crash recovery, the My Data layer library, QGIS project import, ArcGIS Hub
and Socrata/CKAN open-data browsing, NMEA GPS receivers, save-as-template,
annotation elements, dashboard selector and list widgets, the processing
distance-unit picker and Whitebox extent/CRS controls.

Plural forms follow each language's CLDR set: zh/ja/ko/id get _other only,
ru adds _few/_many, ar carries all six. Terminology and quotation marks
match what each catalog already uses.

Keys are inserted in en.json order without moving existing entries, so the
diff is additive.
Copilot AI review requested due to automatic review settings August 1, 2026 22:57
@coderabbitai

coderabbitai Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Added new desktop-interface translations across 15 locale files. Coverage includes project recovery, imports, GPS/NMEA status, catalogs, annotations, dashboards, processing controls, layer management, exports, and review comments.

Changes

Desktop localization

Layer / File(s) Summary
Project, import, and device translations
apps/geolibre-desktop/src/i18n/locales/*.json
Added translations for project history, templates, data imports, GPS/NMEA status, QGIS imports, ArcGIS Hub, and geocoding states.
Catalog, annotation, and dashboard translations
apps/geolibre-desktop/src/i18n/locales/*.json
Added translations for open-data catalogs, annotation tools, dashboard selectors, chart types, and list configuration.
Processing and validation translations
apps/geolibre-desktop/src/i18n/locales/*.json
Added translations for distance and CRS controls, Whitebox extents, conversion guidance, and numeric validation.
Layer management, export, and comments
apps/geolibre-desktop/src/i18n/locales/*.json
Added translations for layer libraries, grouping, synchronization policies, KML export errors, and review comments.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

Poem

A rabbit hops through every tongue,
With fresh new words where screens are young.
Maps, notes, and GPS now sing,
Imports bloom on every wing.
Layers sync and comments grow—
Localized paths now softly glow.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: filling 218 missing keys across 15 non-English catalogs.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch i18n-fill-missing-catalog-keys

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

🔍 Cloudflare PR preview

Item Value
Site https://d0869fe7.geolibre-preview.pages.dev
Demo app https://d0869fe7.geolibre-preview.pages.dev/demo/
Commit ae6f331

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR brings all non-English i18n catalogs in apps/geolibre-desktop/src/i18n/locales/ up to full key coverage by filling in previously-missing entries so runtime fallback to English no longer hides untranslated UI surfaces.

Changes:

  • Added missing namespaces/keys (e.g., GPS/NMEA, Processing distance/CRS tools, ArcGIS Hub, QGIS import, templates, comments) across all 15 non-English locale catalogs.
  • Aligned plural forms and placeholders with existing i18next expectations to avoid parity-test failures.
  • Kept diffs additive and key ordering consistent with en.json for easier future maintenance.

Reviewed changes

Copilot reviewed 15 out of 15 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
apps/geolibre-desktop/src/i18n/locales/ar.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/de.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/es.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/fr.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/hi.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/id.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/it.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/ja.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/ka.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/ko.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/nl.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/pt.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/ru.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/tr.json Adds missing translations to restore catalog parity with English.
apps/geolibre-desktop/src/i18n/locales/zh.json Adds missing translations to restore catalog parity with English.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread apps/geolibre-desktop/src/i18n/locales/it.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/pt.json Outdated
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Code review

Bugs: None found. This PR touches only 15 JSON translation catalogs (apps/geolibre-desktop/src/i18n/locales/*.json), adding the 218 keys described in the PR body. No application logic, components, or t() call sites are touched.

Security: None found. No injection surfaces, secrets, or unsafe input handling — static translation strings only.

Performance: Not applicable — no code paths changed.

Quality / Correctness of translations (verified via cross-file structural checks, since I can't judge translation quality in 15 languages):

  • Key parity: every one of the 15 locale files gained the same 6 new top-level namespaces (projectHistory, template, vectorExport, comments, arcgisHub, openDataCatalogs — 90 occurrences = 15 × 6) and masBuild (15 occurrences, one per file), matching the PR's additive-only claim. High confidence.
  • Placeholder parity: spot-checked multi-placeholder strings (selectorMatches_*, downloading, downloadFirstLayer, geocode.progress/summary, captureBlocked, nmeaStats) across ar/ru/de/ja/zh/hi — translated strings carry exactly the same {{placeholder}} set as en.json in every sampled case. Medium-high confidence (sampled, not exhaustive over all 218×15 keys).
  • CLDR plural forms: zh/ja/ko/id correctly carry only _other (no _one); ru correctly carries one/few/many/other (no two); ar correctly carries all six forms; the rest carry one/other. Verified via direct grep across qgisImportWarnings_* and selectorMatches_* in the diff for all 15 locales — consistent throughout. High confidence.
  • The documented edge case — browser.libraryLayerJoinsUnresolved_one deliberately omitting {{count}} (spelled-out "1") while every other plural form of that key includes it — holds in every locale that has an _one/singular-equivalent form. High confidence.
  • Untranslated product/format names (ArcGIS Hub, QGIS, Socrata, CKAN, NMEA, EPSG, WGS84, RTK, GeoLibre Desktop, GeoJSON) appear verbatim in the non-Latin-script catalogs (ar, ru, zh, ja) rather than being mistranslated or transliterated. High confidence.
  • No JSON structural issues (trailing commas, unescaped quotes, duplicate keys, unbalanced braces) found in the highest-change files (ar.json, ru.json) or in a full read of ja.json.

CLAUDE.md: Consistent with docs/i18n.md's incremental-translation model; en.json is untouched (it's the typed source of truth) and only the 15 dependent catalogs are edited, matching the documented workflow for this kind of change. No RTL/logical-CSS concerns since no components were touched.

No inline comments were posted — nothing rose to a level worth flagging in the diff.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

🔍 GitHub Pages PR preview

Item Value
Site https://opengeos.org/pages-preview/GeoLibre/pr-1635/
Demo app https://opengeos.org/pages-preview/GeoLibre/pr-1635/demo/
Commit ae6f331

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 49

🤖 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 51-56: Update all six libraryLayerJoinsUnresolved plural
translations to use the existing Arabic GIS-join terminology from the
style.joins namespace, replacing وصلة and its plural forms with the
corresponding ربط terminology while preserving each message’s plural structure
and placeholders.
- Line 2500: Update the Arabic toolbar.item.projectHistoryEllipsis translation
to “سجل المشروع...” so it is distinct from processingHistory and matches
projectHistory.title; leave the processingHistory translation unchanged.
- Around line 5328-5329: Update the Arabic translations
invalidKmlCoordinatesByPosition and invalidKmlCoordinatesById to use
grammatically correct KML export wording, replacing the unclear “تعذّر على تصدير
KML” construction with either “مُصدّر KML” or a rephrased “تعذّر تصدير” form
while preserving the position/id placeholders and invalid-coordinate meaning.

In `@apps/geolibre-desktop/src/i18n/locales/de.json`:
- Line 6: Update the German catalog entries at
apps/geolibre-desktop/src/i18n/locales/de.json lines 6, 1026, 2938, 2947, and
2962 to use the specified count-neutral labels and interpolation formats:
Ebenen, Datensätze/Fixes, Datensätze angezeigt, and Features. Remove
plural-selection wording for these independently varying runtime counts.
- Line 2333: Update the toolbar.item.projectHistoryEllipsis translation from
“Verlauf...” to “Projektverlauf...” so it is distinct from
toolbar.item.processingHistory while preserving the existing ellipsis
formatting.
- Line 560: Update the German crsHelp translation so it directly instructs the
user to select the X (Rechtswert) and Y (Hochwert) columns for longitude and
latitude when using a projected CRS, rather than stating that the fields select
those columns. Preserve the existing WGS84 and EPSG guidance.

In `@apps/geolibre-desktop/src/i18n/locales/es.json`:
- Line 2942: Update both Spanish added translation entries to use a
gender-neutral sentence construction that does not inflect wording based on
{{title}}’s gender or number, while preserving the dataset title and
success-message meaning.
- Line 1010: Update the Spanish settingsHint translation so it explicitly says
track positions that do not meet the minimum distance or minimum time are
omitted, replacing the ambiguous “más cercanas que la distancia o el tiempo
mínimos” phrasing while preserving the remaining precision-filter and
zero-disables behavior.

In `@apps/geolibre-desktop/src/i18n/locales/fr.json`:
- Line 6: Update the count-interpolated French locale strings identified by
their keys: projectHistory.summary, gps.nmeaStats, arcgisHub.showing,
openDataCatalogs.showing, and arcgisHub.downloading. Replace fixed plural
wording with the specified count-neutral label-style phrasing, preserving all
interpolation names and punctuation.
- Line 3209: Update the “pin” translation in the French locale so the direct pin
tool label is the idiomatic “Épingle” instead of “Repère épingle”.
- Line 50: Update the libraryLayerConfigNotApplied translation to refer directly
to the file name placeholder rather than using the possessive « {{name}} »
wording, while preserving the rest of the French message.
- Line 2787: Update the cancelledNoRows translation in the French locale to
exactly “Annulé avant le géocodage de toute ligne.”, replacing the current
wording while preserving the existing key.
- Around line 1223-1224: Update the French translation value for
stripDataLayersLabel to explicitly describe removing data or layer contents
rather than deleting the data layers themselves, while leaving
stripDataLayersDesc and the surrounding translation keys unchanged.

In `@apps/geolibre-desktop/src/i18n/locales/hi.json`:
- Around line 1223-1224: Update the stripDataLayersLabel translation in hi.json
to describe removing data from data layers rather than deleting the layers
themselves, using wording equivalent to “डेटा लेयर का डेटा हटाएँ”; leave
stripDataLayersDesc unchanged.
- Line 1012: Update the altitudeValue translation in the Hindi locale to use the
established “ऊँचाई” label instead of the abbreviated “ऊँ”, while preserving the
existing value placeholder and unit.
- Line 41: Update the Hindi translation value for deleteLibraryLayer and the
corresponding entries at the referenced locations to use the oblique form “मेरे
डेटा” wherever “My Data” combines with the postpositions “से” or “में”,
replacing “मेरा डेटा” while preserving the existing interpolation and sentence
structure.

In `@apps/geolibre-desktop/src/i18n/locales/id.json`:
- Line 978: Update the altitudeValue translation in the Indonesian locale to use
the full, clear Indonesian label for altitude (“ketinggian”) instead of the
ambiguous “Ket”, while preserving the {{value}} placeholder and meter unit.
- Line 1007: Update the Indonesian `estimated` locale label to convey both the
primary estimated meaning and the dead-reckoning meaning, rather than only
“Perhitungan mati”; preserve the existing translation format and key.

In `@apps/geolibre-desktop/src/i18n/locales/it.json`:
- Line 2333: Update the projectHistoryEllipsis Italian translation to
“Cronologia del progetto...” so it preserves the project-specific meaning and
does not duplicate the generic processing-history label.
- Line 6: Update the Italian single-key messages projectHistory.summary,
gps.nmeaStats, arcgisHub.showing, and openDataCatalogs.showing to use
count-neutral wording, preserving the existing interpolation keys and meaning.
Use the specified labels for levels and NMEA phrases, and dataset wording such
as “Visualizzazione di {{shown}} su {{total}} dataset.”; do not add pluralized
sibling keys unless the English locale defines them.
- Line 1010: Update the Italian "settingsHint" translation to clearly state that
fixes with a distance or time interval below the configured minimum are skipped,
while preserving the existing explanations about the precision threshold and
disabling the filter with 0.
- Around line 3543-3544: Update the Italian translations for converted and
convertedEmpty to say conversion occurs “alla latitudine {{latitude}}” rather
than “a {{latitude}}”, preserving the rest of both messages and their
placeholders.

In `@apps/geolibre-desktop/src/i18n/locales/ja.json`:
- Line 553: Update the Japanese locale entry delimitedText.importMode from the
misleading import-format wording to the locale’s established translation for
“import as,” matching the source text and other locale conventions while leaving
the child option labels unchanged.
- Line 3276: Update the Japanese locale’s sortDir translation to use a
sort-order-specific term such as 並べ替え順, matching the adjacent ascending and
descending labels instead of the physical-direction meaning of 方向.
- Around line 1005-1006: Update the user-facing translations for the rtk-fixed
and rtk-float keys in ja.json to use standard Japanese RTK terminology: RTK固定解
and RTK浮動解, respectively.
- Line 976: Update the Japanese translation value for settingsHint to describe
the minimum-time condition as the interval between fixes, while preserving the
existing minimum-distance, accuracy-threshold, point-blocking, and
zero-disables-filter meanings.

In `@apps/geolibre-desktop/src/i18n/locales/ka.json`:
- Line 582: Correct the Georgian plural subject–verb agreement in both affected
translation entries: in apps/geolibre-desktop/src/i18n/locales/ka.json at lines
582-582, change `ირჩევს` to `ირჩევენ`, and at lines 3542-3542, change `იყენებს`
to `იყენებენ`.

In `@apps/geolibre-desktop/src/i18n/locales/ko.json`:
- Around line 1005-1006: Update the rtk-fixed and rtk-float entries in the
Korean locale to use the standard GNSS status terms “RTK 고정” and “RTK 부동”
respectively, replacing the incorrect 해 suffixes.
- Around line 3482-3483: Update the Korean `converted` and `convertedEmpty`
locale strings so `{{latitude}}` is followed by the degree symbol and the
wording uses the Korean expression for conversion to degrees instead of `도로 환산`.
Preserve the existing placeholders and the surrounding approximation text.

In `@apps/geolibre-desktop/src/i18n/locales/nl.json`:
- Line 1012: Update the altitudeValue translation to use the clear Dutch label
“Hoogte” or an established Dutch abbreviation instead of “Hgt”, while preserving
the existing value interpolation and meter unit.
- Line 5029: Update the Dutch translation for invalidKmlCoordinatesByPosition to
include “op positie” so {{position}} is clearly identified as a position, while
leaving invalidKmlCoordinatesById unchanged.
- Line 2485: Update the browser-local-raster translation in nl.json to use the
correct Dutch neuter article and pronoun: replace “de raster” with “het raster”
and “hem” with “het”, preserving the rest of the message.
- Line 3663: Update the Dutch locale entry searchLabel to use the standard
plural term “Coördinatenreferentiesystemen zoeken” instead of
“Coördinaatreferentiesystemen zoeken”.

In `@apps/geolibre-desktop/src/i18n/locales/pt.json`:
- Line 3209: Update the "pin" translation in the Portuguese locale to use a
natural, concise UI label such as "Alfinete" or "Marcador", replacing the
redundant "Marcador de alfinete" value.
- Line 5035: Update the Portuguese value for authorNameLabel to use “solicitado
uma vez” instead of “perguntado uma vez,” preserving the rest of the label
unchanged.
- Around line 3543-3544: Update the Portuguese translations for converted and
convertedEmpty so {{latitude}} is introduced as the latitude used for
conversion, not as the conversion result. Use wording that remains grammatical
for numeric latitudes and for the equator value, while preserving the existing
degree and approximation meaning.

In `@apps/geolibre-desktop/src/i18n/locales/ru.json`:
- Line 4671: Update the saveToLibraryTooLarge Russian translation to state that
the layer data is stored only in memory and is too large to save to My Data,
replacing the current wording about existing as a single copy.
- Line 3040: Update the affected Russian locale entries, including “showing”,
“selectorMatches_*”, and the entries around 3400-3403, to use count-neutral
label wording for both independent interpolations. Remove fixed plural forms
tied to {{total}} or selected only by {{count}}, ensuring every combination of
numeric values remains grammatically valid.
- Around line 1107-1108: Update the rtk-fixed and rtk-float translations in the
Russian locale to use complete Russian noun phrases, specifically “Фиксированное
решение RTK” and “Плавающее решение RTK”, or the project’s established
equivalent GNSS terminology.
- Around line 2562-2565: Update the Russian qgisUnknownProvider translation to
an accusative-compatible fallback such as “неуказанный”, ensuring
qgisImportReason.provider produces a grammatically correct message when the
provider value is unavailable.
- Line 3322: Update the ru.json freehand localization value for the annotation
tool from selection terminology to drawing terminology, using “Свободное
рисование” or “Произвольная форма”; leave the freehand key unchanged.
- Around line 1293-1294: Update the descriptionPlaceholder translation in the
Russian locale so the adjective agrees with the feminine singular noun,
replacing the incorrect “преднастроенные подложка” wording with “преднастроенная
подложка” while preserving the rest of the text.
- Line 3051: Update the downloadFirstLayer translation to add a noun or label
before {{title}}, avoiding the current “В {{title}}” construction and preserving
the layer count and first-layer download meaning.

In `@apps/geolibre-desktop/src/i18n/locales/tr.json`:
- Line 4531: Update the saveToLibraryTooLarge translation value to use
grammatically correct Turkish, clearly stating that the layer’s features are the
only copy and are too large to save to Verilerim; keep the existing key and
intended error behavior unchanged.
- Around line 5029-5030: Update the Turkish translations
invalidKmlCoordinatesByPosition and invalidKmlCoordinatesById to replace the GIS
term “nesne” with “öğe”, preserving the existing placeholders and sentence
structure.
- Line 2333: Update the projectHistoryEllipsis translation to “Proje geçmişi...”
so the label explicitly preserves the project context and remains distinct from
the Processing History label.
- Around line 2476-2479: Update the qgisUnknownProvider translation value in the
locale data from the verb form “bilinmiyor” to the adjective “bilinmeyen”,
leaving the surrounding qgisImportReason translations unchanged.
- Line 560: Update the crsHelp translation so the projected-CRS guidance
directly instructs the user to select the longitude and latitude fields as the X
(east) and Y (north) columns, rather than stating that the fields select those
columns; preserve the existing WGS84 and EPSG guidance.

In `@apps/geolibre-desktop/src/i18n/locales/zh.json`:
- Line 2435: Update the "non-vector" localization message in the Chinese locale
by removing the redundant “此” from “此首个版本”, so it reads “首个版本仅支持基于文件的矢量图层。”
🪄 Autofix (Beta)

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: f1b27397-e6f1-4db0-9251-ccf43631a8e4

📥 Commits

Reviewing files that changed from the base of the PR and between 4a47ed3 and dca9284.

📒 Files selected for processing (15)
  • apps/geolibre-desktop/src/i18n/locales/ar.json
  • apps/geolibre-desktop/src/i18n/locales/de.json
  • apps/geolibre-desktop/src/i18n/locales/es.json
  • apps/geolibre-desktop/src/i18n/locales/fr.json
  • apps/geolibre-desktop/src/i18n/locales/hi.json
  • apps/geolibre-desktop/src/i18n/locales/id.json
  • apps/geolibre-desktop/src/i18n/locales/it.json
  • apps/geolibre-desktop/src/i18n/locales/ja.json
  • apps/geolibre-desktop/src/i18n/locales/ka.json
  • apps/geolibre-desktop/src/i18n/locales/ko.json
  • apps/geolibre-desktop/src/i18n/locales/nl.json
  • apps/geolibre-desktop/src/i18n/locales/pt.json
  • apps/geolibre-desktop/src/i18n/locales/ru.json
  • apps/geolibre-desktop/src/i18n/locales/tr.json
  • apps/geolibre-desktop/src/i18n/locales/zh.json

Comment thread apps/geolibre-desktop/src/i18n/locales/ar.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/ar.json
Comment thread apps/geolibre-desktop/src/i18n/locales/ar.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/de.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/de.json
Comment thread apps/geolibre-desktop/src/i18n/locales/tr.json
Comment thread apps/geolibre-desktop/src/i18n/locales/tr.json
Comment thread apps/geolibre-desktop/src/i18n/locales/tr.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/tr.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/tr.json Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Review continued from previous batch...

Comment thread apps/geolibre-desktop/src/i18n/locales/ko.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/ko.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/pt.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/pt.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/pt.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/ru.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/ru.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/ru.json
Comment thread apps/geolibre-desktop/src/i18n/locales/zh.json Outdated
- it, pt: `processing.distance.converted`/`convertedEmpty` used a preposition
  that contracts with the article in the `equator` label, producing "convertito
  a l'equatore" / "convertido em o equador". Switched to "per" / "para", which
  never contract, so all three latitude labels stay grammatical.
- ko: `convertedEmpty` said "도로 환산", readable as "convert to a road".
- ar: joins used وصلة; `style.joins` already established ربط. Also reworded the
  KML export errors so the actor is مُصدّر KML, not the noun phrase تصدير KML.
- tr: KML errors used نesne where the catalog uses öğe for GIS features;
  `qgisUnknownProvider` needed the adjective bilinmeyen; rewrote
  `saveToLibraryTooLarge`, which was not a valid possessive construction.
- ru: RTK states were incomplete noun phrases; `qgisUnknownProvider` did not
  fit its sentence; fixed adjective agreement in the template placeholder;
  reworded `downloadFirstLayer` so an arbitrary title is not inflected.
- de, es, fr, it, ru: switched counts that precede a plural noun to label form,
  so a value of 1 stays grammatical.
- fr: file-name possessive, geocode cancellation sense, pin tool label, and a
  strip-layers label that read as deleting the layers.
- hi: oblique मेरे डेटा before से/में, full ऊँचाई label, strip-data label.
- nl: het raster, Coördinatenreferentiesystemen, Hoogte, "op positie".
- ja: RTK固定解/浮動解, 並べ替え順, インポート方法.
- id, es, pt, zh, ka: altitude label, dead-reckoning sense, gender-neutral
  "Se añadió", pin label, prompt verb, redundant 此, plural verb agreement.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (5)
apps/geolibre-desktop/src/i18n/locales/tr.json (3)

4603-4603: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use the object form for renameNamed.

renameNamed is user-facing and already inserts the target name as an object argument, so tr.json should quote the name and use the object suffix.

Proposed fix
-    "renameNamed": "{{name}} yeniden adlandır",
+    "renameNamed": "\"{{name}}\" öğesini yeniden adlandır",
🤖 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/tr.json` at line 4603, Update the
renameNamed translation entry to use the object-form interpolation expected by
callers: quote the name placeholder and apply the object suffix, preserving the
existing Turkish wording.

2472-2472: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use the accusative form in the QGIS import command.

When the specific QGIS project is the direct object, use QGIS Projesini İçe Aktar… instead of QGIS Projesi İçe Aktar….

Proposed fix
-      "importQgisProjectEllipsis": "QGIS Projesi İçe Aktar…",
+      "importQgisProjectEllipsis": "QGIS Projesini İçe Aktar…",
🤖 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/tr.json` at line 2472, Update the
importQgisProjectEllipsis translation to use the accusative form “QGIS Projesini
İçe Aktar…” while preserving the existing ellipsis and wording.

3208-3208: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Complete the freehand highlight label.

Serbest el vurgu is an incomplete Turkish noun phrase. Use Serbest el vurgusu for this UI label.

Proposed fix
-      "freehand": "Serbest el vurgu",
+      "freehand": "Serbest el vurgusu",
🤖 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/tr.json` at line 3208, Update the
Turkish locale’s freehand label value from “Serbest el vurgu” to “Serbest el
vurgusu” while leaving the surrounding localization entries unchanged.
apps/geolibre-desktop/src/i18n/locales/nl.json (2)

1217-1217: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use one Dutch second-person register. The surrounding interface uses formal u, but these strings use informal je.

  • apps/geolibre-desktop/src/i18n/locales/nl.json#L1217: change in je persoonlijke bibliotheek to in uw persoonlijke bibliotheek.
  • apps/geolibre-desktop/src/i18n/locales/nl.json#L5035-L5039: change Je, je, and related informal forms to Uw, uw.
🤖 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/nl.json` at line 1217, Use the formal
Dutch second-person register in both affected sections of
apps/geolibre-desktop/src/i18n/locales/nl.json: at lines 1217 and 5035-5039,
replace informal je/Je forms and related wording with uw/Uw equivalents,
including “in uw persoonlijke bibliotheek,” while preserving the existing
translations.

4604-4605: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Suggest uit for layer-based group creation dialogs.

newGroupFromLayer and newGroupFromSelectedLayers describe creating a group from layers. Use Nieuwe groep uit laag and Nieuwe groep uit geselecteerde lagen, or the project’s approved label.

🤖 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/nl.json` around lines 4604 - 4605,
Update the Dutch translations for newGroupFromLayer and
newGroupFromSelectedLayers to use “uit” for the layer-based group creation
labels, preserving the existing capitalization and wording otherwise.
🤖 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.

Outside diff comments:
In `@apps/geolibre-desktop/src/i18n/locales/nl.json`:
- Line 1217: Use the formal Dutch second-person register in both affected
sections of apps/geolibre-desktop/src/i18n/locales/nl.json: at lines 1217 and
5035-5039, replace informal je/Je forms and related wording with uw/Uw
equivalents, including “in uw persoonlijke bibliotheek,” while preserving the
existing translations.
- Around line 4604-4605: Update the Dutch translations for newGroupFromLayer and
newGroupFromSelectedLayers to use “uit” for the layer-based group creation
labels, preserving the existing capitalization and wording otherwise.

In `@apps/geolibre-desktop/src/i18n/locales/tr.json`:
- Line 4603: Update the renameNamed translation entry to use the object-form
interpolation expected by callers: quote the name placeholder and apply the
object suffix, preserving the existing Turkish wording.
- Line 2472: Update the importQgisProjectEllipsis translation to use the
accusative form “QGIS Projesini İçe Aktar…” while preserving the existing
ellipsis and wording.
- Line 3208: Update the Turkish locale’s freehand label value from “Serbest el
vurgu” to “Serbest el vurgusu” while leaving the surrounding localization
entries unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 9d1961e1-f73f-4d22-a0c7-338c522aaaeb

📥 Commits

Reviewing files that changed from the base of the PR and between dca9284 and ae6f331.

📒 Files selected for processing (15)
  • apps/geolibre-desktop/src/i18n/locales/ar.json
  • apps/geolibre-desktop/src/i18n/locales/de.json
  • apps/geolibre-desktop/src/i18n/locales/es.json
  • apps/geolibre-desktop/src/i18n/locales/fr.json
  • apps/geolibre-desktop/src/i18n/locales/hi.json
  • apps/geolibre-desktop/src/i18n/locales/id.json
  • apps/geolibre-desktop/src/i18n/locales/it.json
  • apps/geolibre-desktop/src/i18n/locales/ja.json
  • apps/geolibre-desktop/src/i18n/locales/ka.json
  • apps/geolibre-desktop/src/i18n/locales/ko.json
  • apps/geolibre-desktop/src/i18n/locales/nl.json
  • apps/geolibre-desktop/src/i18n/locales/pt.json
  • apps/geolibre-desktop/src/i18n/locales/ru.json
  • apps/geolibre-desktop/src/i18n/locales/tr.json
  • apps/geolibre-desktop/src/i18n/locales/zh.json

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Code review

I reviewed all 15 changed locale files (ar, de, es, fr, hi, id, it, ja, ka, ko, nl, pt, ru, tr, zh) against en.json, checking placeholder parity, CLDR plural-suffix correctness, JSON structural validity, key-name spelling, and leftover-untranslated strings. This included reading the full diff directly, verifying brace-balance on every changed file, and dispatching five parallel deep-dive passes (3 locales each) that independently cross-checked every added key against the English source.

Bugs: None found. Every {{token}} placeholder in every added/changed string matches its en.json counterpart exactly (no missing, extra, or renamed tokens). All 15 files have balanced braces and clean hunk boundaries — no orphaned commas, duplicate keys, or keys landing at the wrong nesting level. Every added key name matches en.json's spelling exactly, including tricky nested paths like qgisImportReason.non-vector/provider/missing-source/... and annotations.tools.sticky_note/placed_image.

Security: None — this PR only adds translated string values to JSON catalogs; no code, no interpolation of untrusted input, no new attack surface.

Performance: None — static JSON data, no runtime impact beyond bundle size, consistent with the existing catalog pattern.

Quality: Plural-suffix sets correctly follow CLDR per language, matching what the PR description claims: zh/ja/ko/id carry _other only, de/es/fr/it/pt/nl/tr/hi/ka carry _one/_other, ru carries _one/_few/_many/_other, ar carries all six categories. The documented exceptions (browser.libraryLayerJoinsUnresolved_one omitting {{count}}, gps.notAvailable = "—" everywhere) are present exactly as described and are correct, not bugs. Exactly 90 lines were deleted across the 15 files (6 each), and in every hunk I inspected, each deletion is the same line re-added with only a trailing comma added — confirming the PR's claim that no pre-existing entry was altered or moved. A handful of very-low-confidence, non-actionable cosmetic observations surfaced (e.g. desktopOnlyBadge rendered as the loanword "desktop"/"Desktop" in de/nl/pt, satellitesShort as "Sat" in es/it) — these mirror the English source's own abbreviation/loanword choices and are not translation errors worth flagging.

CLAUDE.md: No violations. The change is scoped correctly to apps/geolibre-desktop/src/i18n/locales/*.json, en.json (the typed source of truth) is untouched, and the PR follows the project's stated i18n conventions.

No inline comments were posted — this is a clean, mechanically-verifiable translation-catalog PR with no defects found after thorough review.

@giswqs
giswqs merged commit 61b041b into main Aug 2, 2026
400 checks passed
@giswqs
giswqs deleted the i18n-fill-missing-catalog-keys branch August 2, 2026 00:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants