mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-05 02:44:02 +00:00
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]>
44 lines
1.4 KiB
JavaScript
44 lines
1.4 KiB
JavaScript
// Director storage-failure notices and stop reasons must be marked for
|
|
// translation and present in every shipped catalog, so es/ru users do not
|
|
// get English toasts or Scene status lines. The stop reason itself stays
|
|
// English data (it is logged); only the status line translates it.
|
|
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
|
|
import {
|
|
extractMessages,
|
|
readCatalog,
|
|
shippedLocales,
|
|
} from '../../scripts/i18n.mjs';
|
|
|
|
const NOTICES = [
|
|
'Scene not saved — browser storage unavailable',
|
|
'Scene not saved — existing saved project could not be read. Export edits or import a valid file.',
|
|
'Saved project could not be read; storage preserved. Import a valid file to resume saving.',
|
|
'Scene not saved — {reason}',
|
|
'Stopped',
|
|
'Stopped (Esc)',
|
|
'Stopped by voice',
|
|
'Camera ownership changed',
|
|
'Scene layer turned off',
|
|
'Seeking scene clock',
|
|
'Importing project',
|
|
'Camera move interrupted',
|
|
'Scene media timed out',
|
|
];
|
|
|
|
const messages = extractMessages();
|
|
|
|
for (const text of NOTICES) {
|
|
test(`Director notice is marked with t()/msg(): ${text}`, () => {
|
|
assert.ok(messages.has(text), `not marked for translation: ${text}`);
|
|
});
|
|
for (const locale of shippedLocales()) {
|
|
test(`${locale} catalog translates: ${text}`, () => {
|
|
const value = readCatalog(locale)[text];
|
|
assert.ok(value, `missing in ${locale}.json`);
|
|
assert.notEqual(value, text);
|
|
});
|
|
}
|
|
}
|