Skip to content

Report the pointer coordinate in DD, DMS, DDM or UTM (#1814) - #1824

Merged
giswqs merged 6 commits into
mainfrom
feat/1814-coordinate-format
Aug 10, 2026
Merged

Report the pointer coordinate in DD, DMS, DDM or UTM (#1814)#1824
giswqs merged 6 commits into
mainfrom
feat/1814-coordinate-format

Conversation

@giswqs

@giswqs giswqs commented Aug 10, 2026

Copy link
Copy Markdown
Member

Closes #1814.

GeoLibre could already parse DD/DMS/DDM on input (#719, Set View) and draw a UTM grid (#1170, Gridlines) — but it could only ever report a coordinate in decimal degrees. A user could see a UTM grid over the map and type a DMS coordinate to fly somewhere, yet had no way to point at a feature and read its coordinate in either notation. This is the missing third side.

One implementation of each conversion

Neither conversion is reimplemented:

  • DMS/DDM come from the app's existing dms.ts, which the Set View dialog already uses.
  • UTM comes from a new lngLatToUtm in the Gridlines plugin — the same proj4 projection that draws the grid lines. So the numbers in the status bar can never disagree with the grid on screen, which was the specific risk in having two implementations.

Why the formatter lives in the app, not core

The issue suggested lifting the UTM conversion into a shared helper. It ended up in the plugin rather than @geolibre/core, because the projection needs proj4 and core has four small dependencies today — pulling a projection library into the package everything depends on, for one readout, is the wrong trade. The app already depends on @geolibre/plugins, so there is still exactly one implementation.

It imports through a new package subpath (@geolibre/plugins/maplibre-graticule) rather than the barrel, matching the existing local-netcdf / raster-symbology pattern. The barrel pulls in every plugin, Earth Engine included, which a small formatter has no business loading — and which made the module unimportable from a Node test until I switched.

Interaction

Two ways to switch, because they suit different moments:

  • Settings → Map → Coordinate format — the deliberate choice.
  • Click the coordinates in the status bar — cycles DD → DMS → DDM → UTM, for someone comparing notations while reading a map.

Ordering follows each notation's own convention rather than being forced to match: decimal degrees stay lng/lat (as the rest of the app and every GeoJSON do), while DMS and DDM lead with latitude, which is how they are conventionally written.

The edge case worth reviewing

UTM is undefined at the poles (it covers −80° to 84°). Rather than print a meaningless zone, formatCoordinate falls back to decimal degrees there, and on any proj4 failure. There is a test for both hemispheres, the antimeridian, and the polar fallback.

The preference is typed as a plain string in MapPreferences so core does not need to know the format union; the app normalises anything unrecognised to dd, so a hand-edited project cannot break the readout.

Tests

tests/coordinate-format.test.ts, 10 cases: normalisation of junk values, a full cycle through the formats, each notation's shape, southern-hemisphere and antimeridian zones, and the polar fallback.

Full suite: 5632 pass, 0 fail. npm run typecheck and scoped pre-commit clean.

Note on overlap

This branches from main independently of #1820. Both touch StatusBar.tsx, so whichever merges second will need a small import merge — the changes themselves do not overlap (that one adds spans, this one changes the coordinate span into a button).

i18n

Format names and hints in all 18 catalogs, with the acronyms kept and the expansions translated — Grados, minutos, segundos (es), 度分秒 (ja), Десятичные градусы (ru).

Summary by CodeRabbit

  • New Features
    • Added selectable coordinate formats: decimal degrees, DMS, DDM, and UTM.
    • Coordinate formats can be changed in Map Settings or directly from the status bar.
    • Added optional pointer elevation display in metres or feet.
  • Improvements
    • Improved coordinate handling across antimeridian, southern hemisphere, and polar regions.
  • Localization
    • Added translated coordinate-format labels, settings, and switching guidance across supported languages.

Copilot AI lite review requested due to automatic review settings August 10, 2026 01:26
@coderabbitai

coderabbitai Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

The PR adds coordinate-format preferences for DD, DMS, DDM, and UTM. It adds UTM conversion exports, clickable status-bar format switching, pointer elevation display, preference normalization, tests, and localized strings.

Changes

Coordinate format readouts

Layer / File(s) Summary
Coordinate format contracts and conversion
packages/core/..., packages/plugins/..., apps/geolibre-desktop/src/lib/coordinate-format.ts, tests/coordinate-format.test.ts
Map preferences store coordinate format and pointer-elevation visibility. UTM conversion is publicly exported. Coordinate formatting supports DD, DMS, DDM, UTM, longitude wrapping, and fallback behavior. Tests cover normalization, rendering, hemispheres, antimeridian handling, and polar fallback.
Desktop settings and status-bar integration
apps/geolibre-desktop/src/components/layout/SettingsDialog.tsx, apps/geolibre-desktop/src/components/layout/StatusBar.tsx
Map settings select the coordinate format. The status bar renders and cycles the selected format, persists changes, and displays pointer elevation in metres or feet.
Localized coordinate-format controls
apps/geolibre-desktop/src/i18n/locales/*.json
Locale files add coordinate-format labels, switching hints, and map-setting descriptions.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant MapSettings
  participant Preferences
  participant StatusBar
  participant CoordinateFormat
  MapSettings->>Preferences: Save coordinateFormat
  StatusBar->>Preferences: Cycle coordinateFormat
  Preferences-->>StatusBar: Return selected format
  StatusBar->>CoordinateFormat: Format pointer coordinates
  CoordinateFormat-->>StatusBar: Return coordinate readout
Loading

Possibly related PRs

Suggested reviewers: thangqd

Poem

A rabbit clicks the status bar bright,
DD to UTM in one quick flight.
Elevation rises, metres or feet,
Map settings keep the choice complete.
Translations hop from ear to ear.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning Pointer elevation preferences and display changes are unrelated to the linked coordinate-format requirements [#1814]. Remove the pointer elevation changes or link them to a separate issue so this pull request remains focused.
Docstring Coverage ⚠️ Warning Docstring coverage is 79.49% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main change: reporting pointer coordinates in DD, DMS, DDM, and UTM.
Linked Issues check ✅ Passed The changes implement the requested DD, DMS, DDM, and UTM preference, Settings control, status-bar cycling, normalization, and tests [#1814].
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/1814-coordinate-format

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed: dependency version conflict. Check your lock file or package.json.


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.

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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

🔍 Cloudflare PR preview

Item Value
Site https://477036bb.geolibre-preview.pages.dev
Demo app https://477036bb.geolibre-preview.pages.dev/demo/
Commit d0337f1

Comment thread apps/geolibre-desktop/src/lib/coordinate-format.ts Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Code review

Bugs: None found. Traced the DD/DMS/DDM/UTM code paths, the polar/antimeridian/southern-hemisphere fallback logic in lngLatToUtm, the format-cycling state handling in StatusBar.tsx (correctly reads live state at click time to avoid clobbering a concurrent preference change), and the ProjectPreferences normalization for the new coordinateFormat field (packages/core/src/project.ts). All checked out — the test cases in tests/coordinate-format.test.ts correctly cover the interesting edges (poles, antimeridian, southern hemisphere, junk values).

Security: None found. No new user input handling, no injection surface; coordinateFormat is stored/normalized as a plain string with a safe fallback to "dd" on any unrecognized value, so a hand-edited project file can't break rendering.

Performance: None found. formatCoordinate("utm", …) runs a proj4 projection on every pointer move when UTM is selected, but this reuses the same projection the Gridlines overlay already performs continuously, so it's not a new cost class.

Quality:

  • Low confidence: coordinate-format.ts:72 reimplements the mE/mN rounding/formatting that formatEasting/formatNorthing already provide in maplibre-graticule.ts, instead of importing and reusing them — a small duplication that runs against the PR's own "one implementation of each conversion" principle. Posted inline with a suggested fix.

CLAUDE.md: No violations found. The new @geolibre/plugins/maplibre-graticule subpath import follows the existing local-netcdf/raster-symbology pattern; i18n strings were added to all 18 locale catalogs with t() used correctly; no RTL-relevant layout was touched requiring logical Tailwind utilities beyond what's already used in the surrounding settings UI.

@github-actions

github-actions Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

🔍 GitHub Pages PR preview

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

Note

GitHub Pages built this preview successfully, but its serving edge returned HTTP 403 when checked. The links may still be propagating.

Comment thread apps/geolibre-desktop/src/lib/coordinate-format.ts
Comment thread apps/geolibre-desktop/src/i18n/locales/id.json Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Code review

Bugs: None found. The core logic (formatCoordinate, lngLatToUtm, the polar/projection-failure fallback, format cycling, and the normalizeCoordinateFormat string-coercion at both the store and rendering layers) is correct and well-tested. preferences is confirmed excluded from the undo/redo partialize slice, so the status-bar click-to-cycle doesn't pollute undo history — a plausible concern that checked out clean.

Security: None found. The free-string coordinateFormat from a hand-edited project is always passed through normalizeCoordinateFormat before use and is only ever rendered as JSX text, so there's no injection surface.

Performance: None found. The subpath import (@geolibre/plugins/maplibre-graticule) correctly avoids pulling in the full plugin barrel (Earth Engine et al.), matching the existing local-netcdf/raster-symbology precedent.

Quality:

  • coordinate-format.ts:76 — the "dd" branch is handled only via the switch's default, not an explicit case; low-confidence style nit about future exhaustiveness if a 5th format is added.
  • id.json:5411 — the new statusBar.coordinateFormat.utm string leaves "easting/northing" untranslated, unlike other locales added in this PR; low confidence, and it turns out to match a pre-existing typeUtm key's precedent in the same file, so may be intentional consistency rather than an oversight.

CLAUDE.md: No violations found. New user-facing strings go through t(), all 18 locale catalogs were updated together, en.json (the i18next type source of truth) includes the new keys, and the plugin subpath-export pattern matches the documented convention.

Comment thread apps/geolibre-desktop/src/lib/coordinate-format.ts
@github-actions

Copy link
Copy Markdown
Contributor

Code review

Bugs: None found. The [lng, lat] ordering into formatCoordinate matches pointerCoords' actual order (packages/map/src/MapCanvas.tsx sets it as [e.lngLat.lng, e.lngLat.lat]), the DD-format output is byte-identical to the pre-PR readout, and the UTM fallback (poles, projection failure) is exercised correctly by the new tests. High confidence.

Security: None found. No new input surfaces; the coordinateFormat project field is validated on load (normalizeProjectPreferences coerces non-strings, and the app-side normalizeCoordinateFormat coerces any unrecognized string to "dd" before use), so a hand-edited .geolibre.json can't inject anything unexpected. High confidence.

Performance: None found. lngLatToUtm is only invoked when the format is "utm", and the plugin subpath import avoids pulling in the full plugin barrel (including Earth Engine). High confidence.

Quality:

  • Minor nit (posted inline, low confidence): formatDms/formatDdm in apps/geolibre-desktop/src/lib/coordinate-format.ts don't zero-pad degrees/minutes/seconds, so the concatenated status-bar string can look uneven (e.g. 5°3'2"N). Purely cosmetic, not a functional issue.
  • Everything else is solid: the store/settings/status-bar wiring is a faithful match of the existing scaleUnit/ellipsoidId pattern, the click-to-cycle handler correctly reads live store state to avoid clobbering concurrent changes, and both conversions are reused (not reimplemented) as the PR description claims.

CLAUDE.md: No violations. UI strings go through t() and are present in all 18 locale catalogs with translated expansions and preserved acronyms; the new @geolibre/plugins/maplibre-graticule subpath follows the existing local-netcdf/raster-symbology convention; coordinateFormat is correctly kept as a plain string in @geolibre/core rather than importing proj4 into core, matching the stated dependency-boundary rationale.

Overall this is a clean, well-tested, low-risk feature addition with a single cosmetic nit.

@giswqs
giswqs force-pushed the feat/1814-coordinate-format branch from 0b99d65 to 1527f6a Compare August 10, 2026 02:23
@giswqs
giswqs changed the base branch from main to feat/1813-status-bar-elevation August 10, 2026 02:23

@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: 14

🤖 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/components/layout/TopToolbar.tsx`:
- Line 1915: Add a command-palette entry named control.pointer-elevation
alongside the existing Controls-menu command definitions, wiring its action to
consent.handleTogglePointerElevation. Keep the command behavior and labeling
consistent with the other control.* toggle entries.

In `@apps/geolibre-desktop/src/hooks/useConsentGatedActions.ts`:
- Around line 85-91: Rename the local setPointerElevation helper in
useConsentGatedActions to distinguish it from the store action, and update both
call sites in handleTogglePointerElevation and confirmEnablePointerElevation.
Preserve its existing behavior of updating preferences.map.showPointerElevation.

In `@apps/geolibre-desktop/src/i18n/locales/fa.json`:
- Line 1238: Update the readinessReasonCors translations so the data host is
explicitly named as the subject of the missing CORS headers: use «این میزبان» in
apps/geolibre-desktop/src/i18n/locales/fa.json lines 1238-1238, replace «il»
with «cet hôte» in apps/geolibre-desktop/src/i18n/locales/fr.json lines
1238-1238, and replace «यह» with «यह होस्ट» in
apps/geolibre-desktop/src/i18n/locales/hi.json lines 1238-1238.

In `@apps/geolibre-desktop/src/i18n/locales/fr.json`:
- Line 1232: Update the readinessTruncated_one translation to use the idiomatic
singular wording “Seulement {{count}} source a été vérifiée.” Preserve the
existing {{count}} interpolation placeholder exactly.

In `@apps/geolibre-desktop/src/i18n/locales/hi.json`:
- Line 193: Update the Hindi “dd” translation value to use the established term
“दशमलव डिग्री”, matching the existing DD label, while leaving the translation
key and surrounding entries unchanged.
- Line 1842: Update the coordinateFormatHint translation in hi.json to use the
provided statement wording, preserving the instruction about changing the
notation by clicking the status-bar coordinates.
- Line 2667: Update the pointerElevationNoticeTitle translation to use the
wording “ऊँचाई सार्वजनिक सेवा से प्राप्त की जाती है”, matching the established
elevation-source meaning used by the related translation.

In `@apps/geolibre-desktop/src/i18n/locales/nl.json`:
- Line 2666: Update the storymapEllipsis locale entry to use the Dutch
translation "Verhaalkaart..." instead of "Story Map...", while preserving the
ellipsis and surrounding localization structure.

In `@apps/geolibre-desktop/src/i18n/locales/pt.json`:
- Line 2545: Update the Portuguese wording for pointerElevationHint and the
corresponding privacy-notice translation so it explicitly states that GeoLibre
performs the remote elevation lookup, replacing the passive “é consultado/é
consultada” phrasing while preserving the existing meaning.
- Line 1231: Update the Portuguese readinessNote translation to replace the
ambiguous phrase “diferente do que para você” with “diferente do que no seu
dispositivo,” preserving the rest of the message unchanged.
- Line 1238: Update the Portuguese readinessReasonCors translation so the
server/host is the subject of the CORS explanation, stating that it does not
return the required cross-origin headers or is inaccessible; remove the wording
that attributes missing headers to the browser.

In `@apps/geolibre-desktop/src/lib/share-readiness.ts`:
- Around line 201-212: Update hasCredentialField so its depth >=
MAX_REDACT_DEPTH branch returns true, matching redactConfigurationValue’s
fail-closed behavior and ensuring prepareShareSources detects potentially
removed credential subtrees in layer.source and layer.metadata.

In `@docs/features.md`:
- Line 203: Update the Share-readiness check description to avoid stating that
every source is probed or confirmed inaccessible. Describe classifying each
referenced source, anonymously probing eligible remote targets, and listing
sources that may fail or could not be checked, while preserving the existing
examples and non-blocking behavior.

In `@tests/pointer-elevation.test.ts`:
- Around line 252-281: Reduce the wall-time cost of the eviction test around
createPointerElevationResolver by avoiding a real 4 ms wait for every cache-fill
iteration. Prefer injecting a small cache limit for this test while preserving
the same least-recently-used eviction behavior and assertion that the refreshed
first cell remains cached.
🪄 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: 48276ee8-f430-40d6-95d3-c8ec0836a0e9

📥 Commits

Reviewing files that changed from the base of the PR and between 829c544 and 1527f6a.

📒 Files selected for processing (47)
  • apps/geolibre-desktop/src/components/layout/DesktopShell.tsx
  • apps/geolibre-desktop/src/components/layout/SettingsDialog.tsx
  • apps/geolibre-desktop/src/components/layout/ShareProjectDialog.tsx
  • apps/geolibre-desktop/src/components/layout/StatusBar.tsx
  • apps/geolibre-desktop/src/components/layout/TopToolbar.tsx
  • apps/geolibre-desktop/src/components/layout/toolbar/ConsentNoticeDialogs.tsx
  • apps/geolibre-desktop/src/components/layout/toolbar/ControlsMenu.tsx
  • apps/geolibre-desktop/src/hooks/useConsentGatedActions.ts
  • apps/geolibre-desktop/src/i18n/locales/ar.json
  • apps/geolibre-desktop/src/i18n/locales/de.json
  • apps/geolibre-desktop/src/i18n/locales/en.json
  • apps/geolibre-desktop/src/i18n/locales/es.json
  • apps/geolibre-desktop/src/i18n/locales/fa.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/th.json
  • apps/geolibre-desktop/src/i18n/locales/tr.json
  • apps/geolibre-desktop/src/i18n/locales/zh.json
  • apps/geolibre-desktop/src/lib/coordinate-format.ts
  • apps/geolibre-desktop/src/lib/elevation-consent.ts
  • apps/geolibre-desktop/src/lib/share-readiness.ts
  • apps/geolibre-desktop/src/lib/ui-profile.ts
  • docs/features.md
  • docs/user-guide/projects.md
  • packages/core/src/credentials.ts
  • packages/core/src/elevation.ts
  • packages/core/src/index.ts
  • packages/core/src/project.ts
  • packages/core/src/store.ts
  • packages/core/src/types.ts
  • packages/map/src/MapCanvas.tsx
  • packages/plugins/package.json
  • packages/plugins/src/index.ts
  • packages/plugins/src/plugins/elevation-profile/elevation/client.ts
  • packages/plugins/src/plugins/maplibre-graticule.ts
  • packages/plugins/src/plugins/terrain-measure.ts
  • tests/coordinate-format.test.ts
  • tests/pointer-elevation.test.ts
  • tests/share-readiness.test.ts

Comment thread apps/geolibre-desktop/src/i18n/locales/fa.json
Comment thread apps/geolibre-desktop/src/i18n/locales/fr.json
Comment thread apps/geolibre-desktop/src/i18n/locales/hi.json Outdated
Comment thread apps/geolibre-desktop/src/i18n/locales/hi.json
Comment thread apps/geolibre-desktop/src/i18n/locales/pt.json
Comment thread apps/geolibre-desktop/src/i18n/locales/pt.json
Comment thread apps/geolibre-desktop/src/lib/share-readiness.ts
Comment thread docs/features.md

@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

Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.

Actionable comments posted: 14

🤖 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/components/layout/TopToolbar.tsx`:
- Line 1915: Add a command-palette entry named control.pointer-elevation
alongside the existing Controls-menu command definitions, wiring its action to
consent.handleTogglePointerElevation. Keep the command behavior and labeling
consistent with the other control.* toggle entries.

In `@apps/geolibre-desktop/src/hooks/useConsentGatedActions.ts`:
- Around line 85-91: Rename the local setPointerElevation helper in
useConsentGatedActions to distinguish it from the store action, and update both
call sites in handleTogglePointerElevation and confirmEnablePointerElevation.
Preserve its existing behavior of updating preferences.map.showPointerElevation.

In `@apps/geolibre-desktop/src/i18n/locales/fa.json`:
- Line 1238: Update the readinessReasonCors translations so the data host is
explicitly named as the subject of the missing CORS headers: use «این میزبان» in
apps/geolibre-desktop/src/i18n/locales/fa.json lines 1238-1238, replace «il»
with «cet hôte» in apps/geolibre-desktop/src/i18n/locales/fr.json lines
1238-1238, and replace «यह» with «यह होस्ट» in
apps/geolibre-desktop/src/i18n/locales/hi.json lines 1238-1238.

In `@apps/geolibre-desktop/src/i18n/locales/fr.json`:
- Line 1232: Update the readinessTruncated_one translation to use the idiomatic
singular wording “Seulement {{count}} source a été vérifiée.” Preserve the
existing {{count}} interpolation placeholder exactly.

In `@apps/geolibre-desktop/src/i18n/locales/hi.json`:
- Line 193: Update the Hindi “dd” translation value to use the established term
“दशमलव डिग्री”, matching the existing DD label, while leaving the translation
key and surrounding entries unchanged.
- Line 1842: Update the coordinateFormatHint translation in hi.json to use the
provided statement wording, preserving the instruction about changing the
notation by clicking the status-bar coordinates.
- Line 2667: Update the pointerElevationNoticeTitle translation to use the
wording “ऊँचाई सार्वजनिक सेवा से प्राप्त की जाती है”, matching the established
elevation-source meaning used by the related translation.

In `@apps/geolibre-desktop/src/i18n/locales/nl.json`:
- Line 2666: Update the storymapEllipsis locale entry to use the Dutch
translation "Verhaalkaart..." instead of "Story Map...", while preserving the
ellipsis and surrounding localization structure.

In `@apps/geolibre-desktop/src/i18n/locales/pt.json`:
- Line 2545: Update the Portuguese wording for pointerElevationHint and the
corresponding privacy-notice translation so it explicitly states that GeoLibre
performs the remote elevation lookup, replacing the passive “é consultado/é
consultada” phrasing while preserving the existing meaning.
- Line 1231: Update the Portuguese readinessNote translation to replace the
ambiguous phrase “diferente do que para você” with “diferente do que no seu
dispositivo,” preserving the rest of the message unchanged.
- Line 1238: Update the Portuguese readinessReasonCors translation so the
server/host is the subject of the CORS explanation, stating that it does not
return the required cross-origin headers or is inaccessible; remove the wording
that attributes missing headers to the browser.

In `@apps/geolibre-desktop/src/lib/share-readiness.ts`:
- Around line 201-212: Update hasCredentialField so its depth >=
MAX_REDACT_DEPTH branch returns true, matching redactConfigurationValue’s
fail-closed behavior and ensuring prepareShareSources detects potentially
removed credential subtrees in layer.source and layer.metadata.

In `@docs/features.md`:
- Line 203: Update the Share-readiness check description to avoid stating that
every source is probed or confirmed inaccessible. Describe classifying each
referenced source, anonymously probing eligible remote targets, and listing
sources that may fail or could not be checked, while preserving the existing
examples and non-blocking behavior.

In `@tests/pointer-elevation.test.ts`:
- Around line 252-281: Reduce the wall-time cost of the eviction test around
createPointerElevationResolver by avoiding a real 4 ms wait for every cache-fill
iteration. Prefer injecting a small cache limit for this test while preserving
the same least-recently-used eviction behavior and assertion that the refreshed
first cell remains cached.
🪄 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: 48276ee8-f430-40d6-95d3-c8ec0836a0e9

📥 Commits

Reviewing files that changed from the base of the PR and between 829c544 and 1527f6a.

📒 Files selected for processing (47)
  • apps/geolibre-desktop/src/components/layout/DesktopShell.tsx
  • apps/geolibre-desktop/src/components/layout/SettingsDialog.tsx
  • apps/geolibre-desktop/src/components/layout/ShareProjectDialog.tsx
  • apps/geolibre-desktop/src/components/layout/StatusBar.tsx
  • apps/geolibre-desktop/src/components/layout/TopToolbar.tsx
  • apps/geolibre-desktop/src/components/layout/toolbar/ConsentNoticeDialogs.tsx
  • apps/geolibre-desktop/src/components/layout/toolbar/ControlsMenu.tsx
  • apps/geolibre-desktop/src/hooks/useConsentGatedActions.ts
  • apps/geolibre-desktop/src/i18n/locales/ar.json
  • apps/geolibre-desktop/src/i18n/locales/de.json
  • apps/geolibre-desktop/src/i18n/locales/en.json
  • apps/geolibre-desktop/src/i18n/locales/es.json
  • apps/geolibre-desktop/src/i18n/locales/fa.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/th.json
  • apps/geolibre-desktop/src/i18n/locales/tr.json
  • apps/geolibre-desktop/src/i18n/locales/zh.json
  • apps/geolibre-desktop/src/lib/coordinate-format.ts
  • apps/geolibre-desktop/src/lib/elevation-consent.ts
  • apps/geolibre-desktop/src/lib/share-readiness.ts
  • apps/geolibre-desktop/src/lib/ui-profile.ts
  • docs/features.md
  • docs/user-guide/projects.md
  • packages/core/src/credentials.ts
  • packages/core/src/elevation.ts
  • packages/core/src/index.ts
  • packages/core/src/project.ts
  • packages/core/src/store.ts
  • packages/core/src/types.ts
  • packages/map/src/MapCanvas.tsx
  • packages/plugins/package.json
  • packages/plugins/src/index.ts
  • packages/plugins/src/plugins/elevation-profile/elevation/client.ts
  • packages/plugins/src/plugins/maplibre-graticule.ts
  • packages/plugins/src/plugins/terrain-measure.ts
  • tests/coordinate-format.test.ts
  • tests/pointer-elevation.test.ts
  • tests/share-readiness.test.ts
🛑 Comments failed to post (6)
apps/geolibre-desktop/src/components/layout/TopToolbar.tsx (1)

1915-1915: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider adding a matching command-palette entry.

Every other Controls-menu toggle also has a control.* command (for example control.directions, control.graticule is absent but control.effects exists). The pointer-elevation toggle is reachable from the menu only. Add a control.pointer-elevation command that runs consent.handleTogglePointerElevation so the palette stays in parity with the menu.

🤖 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/components/layout/TopToolbar.tsx` at line 1915, Add
a command-palette entry named control.pointer-elevation alongside the existing
Controls-menu command definitions, wiring its action to
consent.handleTogglePointerElevation. Keep the command behavior and labeling
consistent with the other control.* toggle entries.
apps/geolibre-desktop/src/hooks/useConsentGatedActions.ts (1)

85-91: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Rename the local helper to avoid confusion with the store action.

setPointerElevation in packages/core/src/store.ts sets the resolved elevation value. This local helper sets the showPointerElevation preference. The identical name makes the two easy to confuse in this file, which also calls useAppStore.

♻️ Proposed rename
-  const setPointerElevation = (enabled: boolean): void => {
+  const setShowPointerElevation = (enabled: boolean): void => {
     const current = useAppStore.getState().preferences;
     useAppStore.getState().setPreferences({
       ...current,
       map: { ...current.map, showPointerElevation: enabled },
     });
   };

Update the two call sites in handleTogglePointerElevation and confirmEnablePointerElevation.

🤖 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/hooks/useConsentGatedActions.ts` around lines 85 -
91, Rename the local setPointerElevation helper in useConsentGatedActions to
distinguish it from the store action, and update both call sites in
handleTogglePointerElevation and confirmEnablePointerElevation. Preserve its
existing behavior of updating preferences.map.showPointerElevation.
apps/geolibre-desktop/src/i18n/locales/hi.json (1)

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

Use wording that identifies the elevation source.

Line 2667 says that elevation uses a public service. The notice explains that GeoLibre obtains elevation from the service. Use ऊँचाई सार्वजनिक सेवा से प्राप्त की जाती है to match the meaning at Line 2545.

🤖 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/hi.json` at line 2667, Update the
pointerElevationNoticeTitle translation to use the wording “ऊँचाई सार्वजनिक सेवा
से प्राप्त की जाती है”, matching the established elevation-source meaning used
by the related translation.
apps/geolibre-desktop/src/i18n/locales/nl.json (1)

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

python - <<'PY'
import json
from pathlib import Path

for path in (
    Path("apps/geolibre-desktop/src/i18n/locales/en.json"),
    Path("apps/geolibre-desktop/src/i18n/locales/nl.json"),
):
    data = json.loads(path.read_text())
    print(
        path,
        "storymapEllipsis=",
        data.get("toolbar", {}).get("item", {}).get("storymapEllipsis"),
        "storymap.title=",
        data.get("storymap", {}).get("title"),
    )
PY

Repository: opengeos/GeoLibre

Length of output: 366


Use a Dutch translation for toolbar.item.storymapEllipsis.

The Dutch label should match the localized feature title: change "Story Map..." to "Verhaalkaart...".

🤖 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 2666, Update the
storymapEllipsis locale entry to use the Dutch translation "Verhaalkaart..."
instead of "Story Map...", while preserving the ellipsis and surrounding
localization structure.

Source: Coding guidelines

apps/geolibre-desktop/src/i18n/locales/pt.json (1)

2545-2545: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

Make the remote elevation actor explicit.

The passive forms "é consultado" and "é consultada" are awkward and obscure that GeoLibre performs the remote lookup. This is especially important in the privacy notice at Line 2668.

Proposed wording
-    "pointerElevationHint": "Mostrar a elevação do terreno sob o ponteiro na barra de estado. Sem relevo 3D é consultado um serviço público de elevação.",
+    "pointerElevationHint": "Mostrar a elevação do terreno sob o ponteiro na barra de estado. Sem relevo 3D, o aplicativo consulta um serviço público de elevação.",
 
-    "pointerElevationNoticeDesc": "A elevação é obtida do relevo 3D do mapa quando este está ativo, sem enviar nada. Sem relevo 3D é consultada a API pública Open-Meteo e as coordenadas sob o ponteiro saem do seu dispositivo."
+    "pointerElevationNoticeDesc": "A elevação é obtida do relevo 3D do mapa quando este está ativo, sem enviar nada. Sem relevo 3D, o aplicativo consulta a API pública Open-Meteo, e as coordenadas sob o ponteiro saem do seu dispositivo."

Also applies to: 2668-2668

🤖 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/pt.json` at line 2545, Update the
Portuguese wording for pointerElevationHint and the corresponding privacy-notice
translation so it explicitly states that GeoLibre performs the remote elevation
lookup, replacing the passive “é consultado/é consultada” phrasing while
preserving the existing meaning.
tests/pointer-elevation.test.ts (1)

252-281: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Consider lowering the loop cost of the eviction test.

The loop runs POINTER_ELEVATION_CACHE_LIMIT + 5 iterations and awaits a real 4 ms timer in each one, so this single test costs roughly two seconds of wall time. Accept an injectable cache limit, or reduce the awaited tick, to keep the suite fast.

🤖 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 `@tests/pointer-elevation.test.ts` around lines 252 - 281, Reduce the wall-time
cost of the eviction test around createPointerElevationResolver by avoiding a
real 4 ms wait for every cache-fill iteration. Prefer injecting a small cache
limit for this test while preserving the same least-recently-used eviction
behavior and assertion that the refreshed first cell remains cached.

Comment thread apps/geolibre-desktop/src/lib/coordinate-format.ts Outdated
Comment thread apps/geolibre-desktop/src/lib/share-readiness.ts
@github-actions

Copy link
Copy Markdown
Contributor

Code review

Note on scope: this diff bundles two unrelated features — the coordinate-format readout (DD/DMS/DDM/UTM) described in the PR title/body, and a ~2,100-line Share-readiness pre-flight check (ShareProjectDialog.tsx, share-readiness.ts, share-readiness.test.ts, plus credentials.ts/project.ts/types.ts support) that the PR description never mentions. Worth confirming with the author whether that's an intentional combined PR or a rebase/branch artifact, since it roughly doubles the review surface beyond what's advertised.

Bugs

  • coordinate-format.ts formatCoordinate (lines 63–68): longitude isn't normalized to ±180° before DMS/DDM formatting. MapLibre's pointer lngLat.lng isn't wrapped after panning repeatedly around the globe, so a value like -183.2 would render as an invalid-looking 183°...W. UTM is unaffected since utmZoneForLon normalizes internally. Confidence: medium-low. Inline comment with a suggested fix posted.
  • share-readiness.ts layerReferences (lines 334–372): the fixed field list (matched against layer-refresh.ts's existing set) covers WMS/WMTS/OGC/ArcGIS/3D-Tiles/COG/PMTiles correctly, but misses source.catalogUrl on STAC-search layers (can be the only surviving reference when source.url resolves empty) and layers whose URL is reconstructed at runtime and never persisted (e.g. the Planetary Computer plugin), both of which silently fall into no-source. Advisory-only impact (wrong/missing warning, not a broken share). Confidence: low-medium. Inline comment posted.

Security

  • None found. The share-readiness probes are anonymous (credentials: "omit"), explicitly skip private/local/loopback hosts before ever issuing a request, and the design is documented in docs/user-guide/projects.md. No new attack surface beyond what loading the project already implies.

Performance

  • Nothing significant. The status-bar coordinate/title strings recompute on every mousemove-driven re-render, same as the pre-existing decimal-degree formatting — negligible.

Quality

  • The share-readiness check scans every layer's references regardless of layer.visible, but only checks basemapStyleUrl when basemapVisible is true — an inconsistency in the "hidden things aren't rendered so don't need checking" reasoning (over-cautious rather than under-cautious, so low impact). Confidence: low.
  • Otherwise the coordinate-format code is clean: single source of truth for each conversion (reuses dms.ts and the Gridlines plugin's lngLatToUtm), sensible pole/failure fallback to dd, and good test coverage (hemispheres, antimeridian, poles, unknown-format fallback).

CLAUDE.md

  • No violations found. New plugin subpath (@geolibre/plugins/maplibre-graticule) correctly follows the existing local-netcdf/raster-symbology pattern to avoid pulling in the full plugin barrel. All 18 i18n locale catalogs were updated consistently (including correct per-language pluralization variants), matching the i18n convention in CLAUDE.md.

@giswqs
giswqs force-pushed the feat/1813-status-bar-elevation branch from 326a50d to c5567e1 Compare August 10, 2026 02:45
Base automatically changed from feat/1813-status-bar-elevation to main August 10, 2026 02:46
@giswqs
giswqs force-pushed the feat/1814-coordinate-format branch 2 times, most recently from fd764fd to 41d7b0f Compare August 10, 2026 02:52

@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.

♻️ Duplicate comments (1)
apps/geolibre-desktop/src/i18n/locales/hi.json (1)

1842-1842: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Rewrite the coordinate-format hint as a statement.

The first sentence still uses the interrogative form किस नोटेशन में दिखाता है and ends with a full stop. Use a noun phrase for a clear settings description.

Suggested wording
-      "coordinateFormatHint": "स्टेटस बार पॉइंटर निर्देशांक किस नोटेशन में दिखाता है। नोटेशन बदलने के लिए स्टेटस बार में निर्देशांक पर क्लिक करें।"
+      "coordinateFormatHint": "स्टेटस बार में पॉइंटर निर्देशांकों के लिए उपयोग किया जाने वाला नोटेशन। नोटेशन बदलने के लिए स्टेटस बार में निर्देशांकों पर क्लिक करें।"
🤖 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/hi.json` at line 1842, Update the
coordinateFormatHint translation to use a noun-phrase settings description
rather than the interrogative wording “किस नोटेशन में दिखाता है,” while
retaining the instruction to click the status-bar coordinates to change the
notation.
🤖 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.

Duplicate comments:
In `@apps/geolibre-desktop/src/i18n/locales/hi.json`:
- Line 1842: Update the coordinateFormatHint translation to use a noun-phrase
settings description rather than the interrogative wording “किस नोटेशन में
दिखाता है,” while retaining the instruction to click the status-bar coordinates
to change the notation.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: cf88a44b-afa0-47b8-a373-c759d982e229

📥 Commits

Reviewing files that changed from the base of the PR and between 1527f6a and f1fdc64.

📒 Files selected for processing (3)
  • apps/geolibre-desktop/src/i18n/locales/hi.json
  • apps/geolibre-desktop/src/lib/coordinate-format.ts
  • tests/coordinate-format.test.ts

giswqs added 4 commits August 9, 2026 23:22
GeoLibre could already parse DD/DMS/DDM on input (#719, Set View) and draw a
UTM grid (#1170, Gridlines), but it could only ever report a coordinate in
decimal degrees. A user could see a UTM grid over the map and type a DMS
coordinate to fly somewhere, yet had no way to point at a feature and read its
coordinate in either. This is the missing third side.

Neither conversion is reimplemented. DMS/DDM come from the app's dms.ts, which
the Set View dialog already uses. UTM comes from a new lngLatToUtm in the
Gridlines plugin -- the same proj4 projection that draws the grid lines -- so
the numbers in the status bar always agree with the grid on screen.

The formatter lives in the app rather than @geolibre/core because the UTM
projection needs proj4, and pulling a projection library into the package
everything depends on, for one readout, is the wrong trade. The app already
depends on @geolibre/plugins, so there is still exactly one implementation of
each conversion.

It imports the Gridlines plugin through a new package subpath rather than the
barrel, matching the existing local-netcdf/raster-symbology pattern: the barrel
pulls in every plugin (Earth Engine among them), which a small formatter has no
business loading -- and which made the module unimportable from a Node test.

Switchable from Settings -> Map, or by clicking the coordinates in the status
bar to cycle. UTM falls back to decimal degrees outside its valid latitude
range (-80 to 84), since the poles have no UTM coordinate and printing one
anyway would be a confident lie.
The UTM branch re-typed the rounding and mE/mN suffixes inline, which is the
duplication this PR claims to avoid: maplibre-graticule already exports
formatEasting/formatNorthing, and the grid labels use them. Importing them here
means the readout and the grid cannot round or suffix differently.
- Explicit "dd" case in the switch, so a fifth format added without a branch
  reads as a gap rather than as intended behaviour.
- Indonesian UTM label translates easting/northing, matching every other locale
  this PR added.
Rebased onto #1820 so the two status-bar PRs no longer conflict on merge. The
coordinate readout becomes the format-cycling button from this PR, with the
elevation span from #1820 following it; both preferences sit side by side in
MapPreferences and its normalizer.

The locale catalogs auto-merged badly -- 1824's statusBar object replaced
1820's keys rather than joining them -- so the elevation labels are restored
alongside the coordinate-format ones in all 18.
MapLibre does not wrap lngLat.lng after the user pans past the antimeridian, so
it can arrive as 190 or -190. Decimal degrees tolerate that, but DMS rendered
190 degrees east and UTM resolved a zone that does not exist. Normalised once
in formatCoordinate rather than in each branch.

Also uses the established Hindi term for decimal degrees, and rewrites the
Hindi coordinate-format hint as a statement.
@giswqs
giswqs force-pushed the feat/1814-coordinate-format branch from f1fdc64 to 686746a Compare August 10, 2026 03:25
@giswqs
giswqs merged commit 5d44ea9 into main Aug 10, 2026
15 of 16 checks passed
@giswqs
giswqs deleted the feat/1814-coordinate-format branch August 10, 2026 03:30

@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: 2

🤖 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/hi.json`:
- Around line 198-199: Update the Hindi `dms` and `ddm` locale labels to use
`डिग्री` instead of `अंश`, matching the established `dd` label terminology while
preserving the existing minute and second wording.

In `@apps/geolibre-desktop/src/i18n/locales/id.json`:
- Line 1803: Update the Indonesian `coordinateFormatHint` translation to use
grammatically complete wording, including the agent marker “oleh” and the
appropriate display verb in the first sentence; preserve the existing
instruction about clicking the status-bar coordinate to change the notation.
🪄 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: 4996b631-698e-424a-b766-c85661593538

📥 Commits

Reviewing files that changed from the base of the PR and between f1fdc64 and d0337f1.

📒 Files selected for processing (19)
  • apps/geolibre-desktop/src/components/layout/StatusBar.tsx
  • apps/geolibre-desktop/src/i18n/locales/ar.json
  • apps/geolibre-desktop/src/i18n/locales/de.json
  • apps/geolibre-desktop/src/i18n/locales/en.json
  • apps/geolibre-desktop/src/i18n/locales/es.json
  • apps/geolibre-desktop/src/i18n/locales/fa.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/th.json
  • apps/geolibre-desktop/src/i18n/locales/tr.json
  • apps/geolibre-desktop/src/i18n/locales/zh.json

Comment on lines +198 to +199
"dms": "अंश, मिनट, सेकंड",
"ddm": "अंश, दशमलव मिनट",

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Use डिग्री consistently in the DMS and DDM labels.

The DD label uses the established term दशमलव डिग्री, but the DMS and DDM labels use अंश. Use डिग्री for all coordinate-format labels.

Proposed wording
-      "dms": "अंश, मिनट, सेकंड",
-      "ddm": "अंश, दशमलव मिनट",
+      "dms": "डिग्री, मिनट, सेकंड",
+      "ddm": "डिग्री, दशमलव मिनट",
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"dms": "अंश, मिनट, सेकंड",
"ddm": "अंश, दशमलव मिनट",
"dms": "डिग्री, मिनट, सेकंड",
"ddm": "डिग्री, दशमलव मिनट",
🤖 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/hi.json` around lines 198 - 199,
Update the Hindi `dms` and `ddm` locale labels to use `डिग्री` instead of `अंश`,
matching the established `dd` label terminology while preserving the existing
minute and second wording.

"errorBoundsUnavailable": "Batas peta belum tersedia."
"errorBoundsUnavailable": "Batas peta belum tersedia.",
"coordinateFormat": "Format koordinat",
"coordinateFormatHint": "Notasi yang digunakan bilah status untuk koordinat penunjuk. Klik koordinat di bilah status untuk mengganti notasi."

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.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Fix the Indonesian grammar in the map-setting hint.

The first sentence omits the agent marker oleh and the display verb. Use a complete sentence so the setting clearly describes the notation used by the status bar.

Proposed wording
-      "coordinateFormatHint": "Notasi yang digunakan bilah status untuk koordinat penunjuk. Klik koordinat di bilah status untuk mengganti notasi."
+      "coordinateFormatHint": "Notasi yang digunakan oleh bilah status untuk menampilkan koordinat penunjuk. Klik koordinat di bilah status untuk mengganti notasi."
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"coordinateFormatHint": "Notasi yang digunakan bilah status untuk koordinat penunjuk. Klik koordinat di bilah status untuk mengganti notasi."
"coordinateFormatHint": "Notasi yang digunakan oleh bilah status untuk menampilkan koordinat penunjuk. Klik koordinat di bilah status untuk mengganti notasi."
🤖 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/id.json` at line 1803, Update the
Indonesian `coordinateFormatHint` translation to use grammatically complete
wording, including the agent marker “oleh” and the appropriate display verb in
the first sentence; preserve the existing instruction about clicking the
status-bar coordinate to change the notation.

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.

[Feature]: Coordinate format preference for the readout (DD / DMS / DDM / UTM)

2 participants