i18n: translate the SDR messages from the latest main

Seek stopped, the decoder overload stops and the stalled USB transfer
now follow the UI language.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
German KhokhlovandClaude Opus 5.5 committed 2026-10-16 21:29:28 +04:00
1 parent e48841072d
commit b0e28f97d9
4 files changed
+40 -10

No files matched your search

+5 -1
View File
@@ -2885,5 +2885,9 @@
"Source configured; file checked when loaded": "Fuente configurada; el archivo se comprobará al cargarlo",
"Source unavailable": "Fuente no disponible",
"Coverage tile failed": "No se pudo cargar la tesela de cobertura",
"Unknown": "Desconocido"
"Unknown": "Desconocido",
"USB work abandoned after a stalled transfer": "Trabajo USB cancelado tras una transferencia bloqueada",
"SDR decoder did not start; receiver stopped": "El decodificador SDR no arrancó; receptor detenido",
"SDR decoder stopped responding; receiver stopped": "El decodificador SDR dejó de responder; receptor detenido",
"SDR decoder fell behind; receiver stopped": "El decodificador SDR se quedó atrás; receptor detenido"
}
+5 -1
View File
@@ -2952,5 +2952,9 @@
"Source configured; file checked when loaded": "Источник настроен; файл будет проверен при загрузке",
"Source unavailable": "Источник недоступен",
"Coverage tile failed": "Не удалось загрузить тайл покрытия",
"Unknown": "Неизвестно"
"Unknown": "Неизвестно",
"USB work abandoned after a stalled transfer": "Работа с USB прервана: передача данных зависла",
"SDR decoder did not start; receiver stopped": "Декодер SDR не запустился; приёмник остановлен",
"SDR decoder stopped responding; receiver stopped": "Декодер SDR перестал отвечать; приёмник остановлен",
"SDR decoder fell behind; receiver stopped": "Декодер SDR не успевает; приёмник остановлен"
}
+8 -8
View File
@@ -17,7 +17,7 @@ import {
selectAuthorizedSdrDevice,
} from './usbDevices.js';
import { summarizeLocalAdsb } from '../sources/adsbRecords.js';
import { formatNumber, t } from '../i18n/index.js';
import { formatNumber, msg, t, translateKnown } from '../i18n/index.js';
export { createRememberingWebUsb } from './usbDevices.js';
@@ -298,7 +298,7 @@ function describeConnectionError(error) {
'RTL-SDR access failed; close other SDR apps and check USB permissions',
);
}
return message || t('RTL-SDR connection failed');
return message ? translateKnown(message) : t('RTL-SDR connection failed');
}
function streamingMessage(mode) {
@@ -487,11 +487,11 @@ export class SdrController {
gate.waiting += 1;
const run = async () => {
if (epoch !== this._usbEpoch)
throw new Error('USB work abandoned after a stalled transfer');
throw new Error(msg('USB work abandoned after a stalled transfer'));
await Promise.allSettled(gate.reads);
// A stalled read may have ended this session while it drained.
if (epoch !== this._usbEpoch)
throw new Error('USB work abandoned after a stalled transfer');
throw new Error(msg('USB work abandoned after a stalled transfer'));
return operation();
};
const queued = this._usbTail.then(run, run);
@@ -785,10 +785,10 @@ export class SdrController {
decoderOverloadSnapshot: snapshot,
message:
reason === 'startup'
? 'SDR decoder did not start; receiver stopped'
? t('SDR decoder did not start; receiver stopped')
: reason === 'stalled'
? 'SDR decoder stopped responding; receiver stopped'
: 'SDR decoder fell behind; receiver stopped',
? t('SDR decoder stopped responding; receiver stopped')
: t('SDR decoder fell behind; receiver stopped'),
});
void this.stop({ preserveMessage: true });
}
@@ -1726,7 +1726,7 @@ export class SdrController {
// tuneFm reports the failure; no spectrum is valid for this frame.
if (!(await this.tuneFm(center, { quiet: true }))) {
if (token === this._seekToken)
this._setState({ seeking: false, seekMessage: 'Seek stopped' });
this._setState({ seeking: false, seekMessage: t('Seek stopped') });
return null;
}
const sequence = this._spectrumSequence;
+22
View File
@@ -56,3 +56,25 @@ test('FM seek messages keep their English wording and decimal point', async () =
assert.ok(texts.includes('Scanning 98.5 MHz…'));
assert.match(texts.at(-1), /^Found 98\.8 MHz · \d+\.\d dB$/);
});
for (const locale of ['es', 'ru']) {
test(`a failed seek tune and a decoder overload are localized in ${locale}`, async () => {
setLocale(locale);
try {
const { c } = makeController();
c.tuneFm = async () => false;
assert.equal(await c.seekFm(1), null);
assert.ok(c.state.seekMessage);
assert.notEqual(c.state.seekMessage, 'Seek stopped');
c.stop = async () => {};
for (const reason of ['startup', 'stalled', 'backlog']) {
c._device = {};
c._overload(reason);
assert.doesNotMatch(c.state.message, /SDR decoder|receiver stopped/);
}
} finally {
setLocale('en');
}
});
}