mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 19:04:02 +00:00
fix(i18n): fix Russian layouts and the gaps the screenshot review found
A review of the Russian UI screenshots found ~90 places where longer words
broke the layout or text was still English. Fixed so they hold for any
language, then shortened where a control is short by design.
- Layout: label columns that size to their text (weather and wind settings,
Recent Imagery slots and opacity, style sliders, display panel), layer
list names and icons, buttons that wrap instead of overflowing (CCTV,
scenes, Bhote Koshi), voice header that always shows the cost, styled
EN | ES | RU chips, voice error tray above the dock.
- t() context: t('CLEAR', { context: 'action' }) is «СБРОСИТЬ» while the sky
stays «ЯСНО»; also used for radio categories, voice states and directions.
- Units and dates follow the locale through src/ui/unitLabels.js
(formatQuantity: localized number, translated unit, non-breaking space):
wind, pressure, cyclones, directions, CCTV, SDR gain, scene timing, flight
tooltip, Recent Imagery dates and resolution.
- Newly translated: directions turn-by-turn steps (built from the maneuver;
English matches the server word for word), HUD mode and summary, voice
card states, radio categories on the globe, CCTV status, layer source
lines, scene dialogs (Cancel, file pickers), Bhote Koshi statuses, titles,
comparison dates and caveat, Recent Imagery notices. Stored data and text
for AI tools stay English.
- es and ru: 1,885 messages each.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
3129e531e6
commit
2b6ccad732
71 files changed
+2435
-370
No files matched your search
@@ -646,7 +646,10 @@ test('cards carry thumbnail, date, sensor, cloud, START HERE and PREVIEW; the ch
|
||||
f.layer.focus(1);
|
||||
const s18 = f.card(S18);
|
||||
assert.equal(f.part(s18, 'ri-card-date').textContent, 'Sep 18');
|
||||
assert.equal(f.part(s18, 'ri-card-sensor').textContent, 'Sentinel-2 · 30 m');
|
||||
assert.equal(
|
||||
f.part(s18, 'ri-card-sensor').textContent,
|
||||
'Sentinel-2 · 30\u00a0m',
|
||||
);
|
||||
assert.equal(f.part(s18, 'ri-card-cloud').textContent, '12% cloud');
|
||||
assert.equal(f.part(s18, 'ri-card-start').hidden, false);
|
||||
assert.match(f.part(s18, 'ri-card-start').title, /Newest low-cloud day/);
|
||||
@@ -658,11 +661,11 @@ test('cards carry thumbnail, date, sensor, cloud, START HERE and PREVIEW; the ch
|
||||
assert.equal(f.part(f.card(V21), 'ri-thumb-text').textContent, 'Checking');
|
||||
assert.equal(
|
||||
f.part(f.card(V21), 'ri-card-sensor').textContent,
|
||||
'Daily overview · 250 m',
|
||||
'Daily overview · 250\u00a0m',
|
||||
);
|
||||
assert.equal(
|
||||
f.part(f.card(L16), 'ri-card-sensor').textContent,
|
||||
'Landsat 8/9 · 30 m',
|
||||
'Landsat 8/9 · 30\u00a0m',
|
||||
);
|
||||
// IMAGE: one SHOW chip; the B chip keeps its box but is invisible.
|
||||
const [a, b] = [f.chip(S18, 'a'), f.chip(S18, 'b')];
|
||||
@@ -734,7 +737,10 @@ test('the selection bar reads the mode, both rows and a preview, with × reserve
|
||||
['A / B', 'radio', 'false'],
|
||||
],
|
||||
);
|
||||
assert.equal(rowText(f, 'a'), 'IMAGE | Sep 18 · Sentinel-2 · 30 m · preview');
|
||||
assert.equal(
|
||||
rowText(f, 'a'),
|
||||
'IMAGE | Sep 18 · Sentinel-2 · 30\u00a0m · preview',
|
||||
);
|
||||
assert.equal(f.byId('ri-slot-a').dataset.state, 'preview');
|
||||
assert.equal(rowText(f, 'b'), 'VS | Basemap');
|
||||
assert.equal(f.byId('ri-slot-b').classList.contains('lit'), false, 'dimmed');
|
||||
@@ -748,7 +754,7 @@ test('the selection bar reads the mode, both rows and a preview, with × reserve
|
||||
[true, true, '×'],
|
||||
);
|
||||
f.key('s');
|
||||
assert.equal(rowText(f, 'a'), 'IMAGE | Sep 18 · Sentinel-2 · 30 m');
|
||||
assert.equal(rowText(f, 'a'), 'IMAGE | Sep 18 · Sentinel-2 · 30\u00a0m');
|
||||
assert.equal(f.byId('ri-slot-a').dataset.state, 'pinned');
|
||||
assert.equal(unpinA.disabled, false);
|
||||
assert.equal(unpinA.getAttribute('aria-label'), 'Unpin the image');
|
||||
@@ -757,12 +763,12 @@ test('the selection bar reads the mode, both rows and a preview, with × reserve
|
||||
assert.equal(modes[1].getAttribute('aria-checked'), 'true');
|
||||
assert.equal(f.byId('ri-slot-b').classList.contains('lit'), true, 'lit');
|
||||
modes[2].click();
|
||||
assert.equal(rowText(f, 'a'), 'A | Sep 18 · Sentinel-2 · 30 m');
|
||||
assert.equal(rowText(f, 'a'), 'A | Sep 18 · Sentinel-2 · 30\u00a0m');
|
||||
assert.equal(rowText(f, 'b'), 'B | Not set');
|
||||
assert.equal(f.byId('ri-slot-b').dataset.state, 'empty');
|
||||
assert.equal(f.byId('ri-unpin-b').classList.contains('is-reserved'), true);
|
||||
f.chip(L16, 'b').click();
|
||||
assert.equal(rowText(f, 'b'), 'B | Sep 16 · Landsat 8/9 · 30 m');
|
||||
assert.equal(rowText(f, 'b'), 'B | Sep 16 · Landsat 8/9 · 30\u00a0m');
|
||||
f.byId('ri-unpin-b').click();
|
||||
assert.equal(f.snap().pins.b.key, null);
|
||||
unpinA.click();
|
||||
@@ -879,7 +885,10 @@ test('the notice line shows the refusal, then errors, then CLEAR, then the Esri
|
||||
);
|
||||
assert.equal(notice.classList.contains('info'), true);
|
||||
f.layer.setBox({ west: 0, south: 0, east: 20, north: 20 });
|
||||
assert.equal(noticeText.textContent, 'Box is 2,226 km wide · limit 1,000 km');
|
||||
assert.equal(
|
||||
noticeText.textContent,
|
||||
'Box is 2,226\u00a0km wide · limit 1,000\u00a0km',
|
||||
);
|
||||
assert.equal(notice.classList.contains('warn'), true);
|
||||
assert.equal(hint.textContent, 'Zoom in or draw a smaller box');
|
||||
f.layer.setBox(BOX);
|
||||
@@ -929,7 +938,7 @@ test('an oversized box offers ZOOM IN in a fixed slot at the end of the notice l
|
||||
assert.deepEqual(reserved(), [false, false, 'false', true]);
|
||||
assert.equal(
|
||||
f.byId('ri-notice-text').textContent,
|
||||
'Box is 2,226 km wide · limit 1,000 km',
|
||||
'Box is 2,226\u00a0km wide · limit 1,000\u00a0km',
|
||||
);
|
||||
assert.equal(f.byId('ri-hint').textContent, 'Zoom in or draw a smaller box');
|
||||
assert.equal(zoom.title, 'Fly in until the view fits the 1,000 km limit');
|
||||
@@ -998,7 +1007,10 @@ test('the divider exists only while a swipe is live, labelled A / B or IMAGE / B
|
||||
[split.options.beforeLabel, split.options.afterLabel],
|
||||
['A', 'B'],
|
||||
);
|
||||
assert.equal(split.options.afterTitle, 'Landsat 8/9 · 30 m · 2026-09-16');
|
||||
assert.equal(
|
||||
split.options.afterTitle,
|
||||
'Landsat 8/9 · 30\u00a0m · 2026-09-16',
|
||||
);
|
||||
split.options.onChange(0.3);
|
||||
assert.equal(f.snap().split, 0.3);
|
||||
assert.deepEqual(directions(), ['left', 'right']);
|
||||
@@ -1015,7 +1027,7 @@ test('the divider exists only while a swipe is live, labelled A / B or IMAGE / B
|
||||
assert.deepEqual(labels(), ['B', 'A']);
|
||||
assert.equal(
|
||||
f.splits.at(-1).options.beforeTitle,
|
||||
'Landsat 8/9 · 30 m · 2026-09-16',
|
||||
'Landsat 8/9 · 30\u00a0m · 2026-09-16',
|
||||
);
|
||||
assert.equal(f.splits.at(-1).options.initialValue, 0.3);
|
||||
assert.deepEqual(directions(), ['right', 'left']);
|
||||
|
||||
Reference in new issue
Block a user