i18n: fill 218 missing keys across all 15 non-English catalogs - #1635
Conversation
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.
📝 WalkthroughWalkthroughAdded 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. ChangesDesktop localization
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
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
|
There was a problem hiding this comment.
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.jsonfor 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.
Code reviewBugs: None found. This PR touches only 15 JSON translation catalogs ( 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):
CLAUDE.md: Consistent with No inline comments were posted — nothing rose to a level worth flagging in the diff. |
🔍 GitHub Pages PR preview
|
There was a problem hiding this comment.
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
📒 Files selected for processing (15)
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/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/tr.jsonapps/geolibre-desktop/src/i18n/locales/zh.json
- 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.
There was a problem hiding this comment.
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 winUse the object form for
renameNamed.
renameNamedis user-facing and already inserts the target name as an object argument, sotr.jsonshould 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 winUse the accusative form in the QGIS import command.
When the specific QGIS project is the direct object, use
QGIS Projesini İçe Aktar…instead ofQGIS 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 winComplete the freehand highlight label.
Serbest el vurguis an incomplete Turkish noun phrase. UseSerbest el vurgusufor 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 winUse one Dutch second-person register. The surrounding interface uses formal
u, but these strings use informalje.
apps/geolibre-desktop/src/i18n/locales/nl.json#L1217: changein je persoonlijke bibliotheektoin uw persoonlijke bibliotheek.apps/geolibre-desktop/src/i18n/locales/nl.json#L5035-L5039: changeJe,je, and related informal forms toUw,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 winSuggest
uitfor layer-based group creation dialogs.
newGroupFromLayerandnewGroupFromSelectedLayersdescribe creating a group from layers. UseNieuwe groep uit laagandNieuwe 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
📒 Files selected for processing (15)
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/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/tr.jsonapps/geolibre-desktop/src/i18n/locales/zh.json
Code reviewI reviewed all 15 changed locale files ( Bugs: None found. Every 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: CLAUDE.md: No violations. The change is scoped correctly to No inline comments were posted — this is a clean, mechanically-verifiable translation-catalog PR with no defects found after thorough review. |
Every non-English catalog was at 95% coverage, all missing the same 218 keys. They are now at 100%.
en.jsonis typed intot(), 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
gps.*processing.*arcgisHub.*toolbar.*openDataCatalogs.*browser.*layers.*annotations.*dashboard.*template.*projectHistory.*comments.*addData.*newProject,gallery,vectorExport,masBuild,geocode,styleApparent 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:
_oneabsent fromzh/ja/ko/id. Those languages have a single CLDR plural category (other). Adding_onegives i18next a form it will never select._zero/_two/_few/_manypresent inarandru. 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_onecarries 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.notAvailableis—everywhere. It is an em dash placeholder, not untranslated prose.How this was done
zh/ja/ko/idget_otheronly,de/es/fr/it/pt/nl/tr/hi/kaget_one/_other,ruadds_few/_many,arcarries all six. Arabic follows the numeral-agreement pattern already established in the catalog (addData.wms.selectLayer,addData.deckViz.loadedFeatures).z. B./p. ej.,/p. ex./例:/مثال:/მაგ.), and each catalog's quotation marks („…“de/ka,«…»es/fr/ru/ar,“…”zh,「…」ja, straight quotes elsewhere).en.jsonposition 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 thenpm buildtypecheck.Review welcome
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 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 inRasterSymbologySection.tsx,ModelBuilderDialog.tsx,ManagePluginsDialog.tsxand the attribute/processing dialogs. Migrating those needs at()call, anen.jsonkey and 15 translations each, so it belongs in its own PR (or several).docs/i18n.mdframes i18n as deliberately incremental with English fallback for un-migrated surfaces.Summary by CodeRabbit