// Vendor message normalization belongs to the XGRIDS frontend contribution. const runtimeMessageReplacements: Array<[RegExp, string]> = [ [ /^control MQTT connect call failed(?::.*)?$/gi, "Управляющее соединение со сканером не открылось: устройство не приняло MQTT-соединение. Команды сканирования не отправлялись.", ], [ /macOS Keychain authority is unavailable/gi, "Локальный допуск управления K1 не подготовлен. Команды сканеру не отправлялись.", ], [ /macOS Keychain authority lookup failed/gi, "Локальный допуск управления K1 недоступен. Команды сканеру не отправлялись.", ], [ /control MQTT connect call failed/gi, "Управляющее соединение с K1 не открылось. Команды сканеру не отправлялись.", ], [ /^Device plugin returned an invalid non-JSON action result$/gi, "Плагин устройства сформировал некорректное внутреннее состояние. Запрос к K1 не повторялся.", ], [ /^bootstrap response correlation failed.*$/gi, "Ответ K1 на подготовительном этапе не совпал с ожидаемой операцией. Диалог остановлен без автоматического повтора.", ], [ /^live DeviceInfo is incompatible with the selected.*$/gi, "Устройство ответило, но его живые данные не соответствуют выбранному профилю совместимости. START и STOP не отправлялись.", ], [ /^K1 did not confirm bound SCANNING initialization.*$/gi, "После START устройство не подтвердило завершение инициализации в безопасный срок. Автоматический STOP не отправлялся.", ], [ /^stale control response makes the next command outcome ambiguous$/gi, "Получен запоздавший ответ предыдущего этапа. Диалог остановлен, следующая команда не отправлялась.", ], [ /control MQTT connection\/subscription timed out/gi, "Управляющее соединение с K1 не подтвердилось вовремя. Команды сканеру не отправлялись.", ], [/broker connection ended/gi, "соединение с брокером завершено"], [/Unspecified error/gi, "неуказанная ошибка"], [ /Device was not rediscovered; keep the K1 powered and nearby\.?/gi, "Устройство не обнаружено повторно; оставьте его включённым и рядом.", ], [/Foxglove/gi, "локальный мост визуализации"], [/MacBook/gi, "компьютер"], [/\bK1\b/g, "устройство"], ]; export function localizeRuntimeMessage(message: string | null | undefined): string | null { if (!message) return null; const localized = runtimeMessageReplacements.reduce( (localized, [pattern, replacement]) => localized.replace(pattern, replacement), message, ); const withoutTechnicalTerms = localized.replace( /\b(?:API|BLE|Bluetooth|gRPC|IP|JSON|K1MQTT|MQTT|Rerun|RRD|TSV|UUID|Wi-Fi)\b/gi, "", ); if (/[A-Za-z]{3,}/.test(withoutTechnicalTerms)) { return "Операция не выполнена. Технические подробности сохранены в журнале сервера."; } return localized; }