mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 02:44:02 +00:00
i18n: fix review findings and polish ru/es strings
Fixes the 51 P0–P2 findings from the full review of the i18n branch and the issues found while checking every new string on screen in ru and es. - Translate errors and statuses that still reached ru/es in English: feed and tile errors, provider statuses, the ALPR chip, the traffic mode chip, voice plan step labels, fire feed values, receiver bands, scene save reasons and the Cesium attribution link. - Show preset city names in the UI language (src/ui/placeNames.js); data and everything sent to the model stay English. - Share layer names between the layer panel, HUD and voice card (src/ui/layerNames.js). - Keep long ru/es strings whole: voice card error lines, analyst titles, the voice tier status, the Nepal evidence button, the ALPR retry chip. English layout is unchanged. - Ask before a language switch drops unsaved work. - Catalog fixes: glossary terms (пуск, пресет), gender agreement and consistent "peticiones" in es, fewer calques in both languages. - Fix English text that was itself wrong (e.g. "Exit cockpit to fly to a weather", raw tool ids in voice plan steps). Catalogs: es/ru 2535 messages each, complete. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
8029747b7e
commit
00704ddc89
212 files changed
+9871
-909
No files matched your search
@@ -0,0 +1,71 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { setLocale } from '../i18n/index.js';
|
||||
import { renderRadioState } from './radioPresentation.js';
|
||||
|
||||
function el() {
|
||||
const classes = new Set();
|
||||
return {
|
||||
textContent: '',
|
||||
classList: {
|
||||
toggle(name, on) {
|
||||
on ? classes.add(name) : classes.delete(name);
|
||||
},
|
||||
contains: (name) => classes.has(name),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
function render(audioError) {
|
||||
globalThis.document = { getElementById: () => null, activeElement: null };
|
||||
const host = {
|
||||
destroyed: false,
|
||||
_radioPanel: el(),
|
||||
_radioPlaybackState: el(),
|
||||
_syncContextRadioLauncherState() {},
|
||||
actions: {
|
||||
getLifecycle: () => null,
|
||||
preservePanelStateDuringClear: () => false,
|
||||
setPanelCollapsed() {},
|
||||
scheduleLayout() {},
|
||||
},
|
||||
};
|
||||
renderRadioState.call(host, {
|
||||
enabled: true,
|
||||
audioState: 'error',
|
||||
audioError,
|
||||
filteredCount: 1,
|
||||
stationCount: 1,
|
||||
volume: 1,
|
||||
});
|
||||
return host._radioPlaybackState.textContent;
|
||||
}
|
||||
|
||||
const PLAYBACK_ERRORS = [
|
||||
'Playback requires a direct click or tap.',
|
||||
'Broadcaster stream could not be started.',
|
||||
'Broadcaster stream is unavailable or blocked by the browser.',
|
||||
];
|
||||
|
||||
for (const locale of ['es', 'ru']) {
|
||||
test(`radio playback errors are localized in ${locale}`, () => {
|
||||
setLocale(locale);
|
||||
try {
|
||||
for (const message of PLAYBACK_ERRORS) {
|
||||
assert.notEqual(render(message), message, `${locale}: ${message}`);
|
||||
}
|
||||
// Control: the fallback (no audioError) is translated.
|
||||
assert.notEqual(render(null), 'Broadcaster stream unavailable');
|
||||
} finally {
|
||||
setLocale('en');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
test('radio playback errors read as before in English', () => {
|
||||
setLocale('en');
|
||||
for (const message of PLAYBACK_ERRORS) {
|
||||
assert.equal(render(message), message);
|
||||
}
|
||||
assert.equal(render(null), 'Broadcaster stream unavailable');
|
||||
});
|
||||
Reference in new issue
Block a user