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:
German KhokhlovandClaude Opus 5.5 committed 2026-10-15 23:49:52 +04:00
1 parent 8029747b7e
commit 00704ddc89
212 files changed
+9871 -909

No files matched your search

+578 -4
View File
@@ -857,7 +857,7 @@
"Voice session could not be started.": "Не удалось запустить голосовую сессию.",
"CONNECTING": "ПОДКЛЮЧЕНИЕ",
"ERROR": "ОШИБКА",
"{tier} applies next session": "{tier} вступит в силу со следующей сессии",
"{tier} applies next session": "{tier} — со следующей сессии",
"Session ended — cost cap {cost}": "Сессия завершена — лимит стоимости {cost}",
"Next session: {pendingId} — this session stays on {modelId}": "Следующая сессия: {pendingId} — текущая остаётся на {modelId}",
"Voice model: {pendingId} — click to switch to {target}; applies next session": "Голосовая модель: {pendingId} — нажмите, чтобы переключиться на {target}; вступит в силу со следующей сессии",
@@ -1001,7 +1001,7 @@
"Coverage colours": "Цвета покрытия",
"That shape already has {count} points — finish it or press Backspace.": "В этой фигуре уже точек: {count} — завершите её или нажмите Backspace.",
"Could not place the shape: {error}": "Не удалось разместить фигуру: {error}",
"{owner} is using the pointer — close it first.": "Указатель занят инструментом {owner} — сначала закройте его.",
"{owner} is using the pointer — close it first.": "Указатель занят: «{owner}». Закройте его.",
"{label} · Detailed outline unavailable": "{label} · Подробный контур недоступен",
"Witness source": "Свидетельство очевидца",
"{provider} · EMBEDDED SOURCE": "{provider} · ВСТРОЕННЫЙ ИСТОЧНИК",
@@ -1790,7 +1790,7 @@
"Mark {targets} +{more}": "Отметить {targets} +{more}",
"Mark {targets}": "Отметить {targets}",
"Fly to {place}": "Перелёт: {place}",
"Nearest aircraft to {place}": "Ближайшие самолёты: {place}",
"Nearest aircraft to {place}": "Ближайший самолёт: {place}",
"Read the view": "Осмотреть видимую область",
"Check view state": "Проверить состояние вида",
"Frame {target}": "Показать в кадре: {target}",
@@ -2244,5 +2244,579 @@
"Show your own GeoJSON, KML, KMZ or GPX files on the globe (or drop them onto it). File bytes stay on this device; overlays can appear in map screenshots shared with voice.": "Показать на глобусе свои файлы GeoJSON, KML, KMZ или GPX (или перетащите их на глобус). Содержимое файлов остаётся на этом устройстве; наложения могут попасть в снимки карты, которые передаются голосовому ассистенту.",
"Import": "Импорт",
"Choose GeoJSON, KML, KMZ or GPX files": "Выберите файлы GeoJSON, KML, KMZ или GPX",
"Imported files": "Импортированные файлы"
"Imported files": "Импортированные файлы",
"DOCKED · {name}": "СТЫКОВКА · {name}",
"DOCKED · {name} · +{extra}": "СТЫКОВКА · {name} · +{extra}",
"loading coverage...": "загрузка покрытия...",
"live feed unavailable": "поток в реальном времени недоступен",
"GBFS fetch error": "ошибка загрузки GBFS",
"GBFS status update failed": "не удалось обновить статус GBFS",
"Open the Street Level panel to view imagery": "Откройте панель «Уличные снимки», чтобы их посмотреть",
"Image could not be opened": "Не удалось открыть снимок",
"Mapillary rejected MAPILLARY_CLIENT_TOKEN — replace it in Provider Settings": "Mapillary отклонил MAPILLARY_CLIENT_TOKEN — замените его в «Настройках провайдеров»",
"Coverage requests are being rate-limited — they resume on their own": "Запросы покрытия ограничены по частоте — они возобновятся сами",
"No street-level imagery within {radius} m of that point": "В радиусе {radius} м от этой точки уличных снимков нет",
"No street-level imagery within {radius} m of the view centre": "В радиусе {radius} м от центра вида уличных снимков нет",
"Aim the middle of the view at a street to look for imagery there": "Наведите центр вида на улицу, чтобы поискать там снимки",
"Street View has no imagery for this place": "В Просмотре улиц нет снимков этого места",
"GOOGLE_MAPS_API_KEY is not set": "GOOGLE_MAPS_API_KEY не задан",
"The Google Maps JavaScript API could not load": "Не удалось загрузить Google Maps JavaScript API",
"Weather request timed out": "Истекло время ожидания запроса погоды",
"Malformed weather manifest": "Некорректный манифест погоды",
"Weather HTTP {status}": "Погода: HTTP {status}",
"Weather image HTTP {status}": "Снимок погоды: HTTP {status}",
"Weather prefetch unavailable": "Предзагрузка погоды недоступна",
"Infrared decode failed": "Не удалось декодировать инфракрасный снимок",
"rate limited": "превышен лимит запросов",
"routing service is rate limited": "сервис маршрутизации превысил лимит запросов",
"route leg too long": "участок маршрута слишком длинный",
"route too long": "маршрут слишком длинный",
"Routing is rate limited — try again in a moment": "Построение маршрута: превышен лимит запросов — попробуйте ещё раз чуть позже",
"{error} — try again in a moment": "{error} — попробуйте ещё раз чуть позже",
"Routing unavailable (HTTP {status})": "Построение маршрута недоступно (HTTP {status})",
"CelesTrak unreachable": "CelesTrak недоступен",
"KartaView is rate-limiting requests — they resume on their own": "KartaView ограничивает частоту запросов — они возобновятся сами",
"KartaView’s photos here are archived and cannot be shown": "Фотографии KartaView здесь в архиве, показать их нельзя",
"KartaView did not filter this area in time — move the map to ask again": "KartaView не успел отфильтровать эту область — сдвиньте карту, чтобы запросить снова",
"None of KartaView’s photos here pass the imagery filter": "Ни одна фотография KartaView здесь не проходит фильтр снимков",
"KartaView did not answer in time — try again": "KartaView не ответил вовремя — попробуйте снова",
"KartaView could not be reached — check the network": "Не удалось связаться с KartaView — проверьте сеть",
"KartaView sent an answer that could not be read": "KartaView прислал ответ, который не удалось прочитать",
"KartaView is rate-limiting requests": "KartaView ограничивает частоту запросов",
"KartaView is rate-limiting requests — try again in a moment": "KartaView ограничивает частоту запросов — попробуйте ещё раз чуть позже",
"KartaView sent too much data": "KartaView прислал слишком много данных",
"KartaView has no such photo": "У KartaView нет такой фотографии",
"The KartaView photo could not be loaded": "Не удалось загрузить фотографию KartaView",
"KartaView has no position for this photo": "У KartaView нет координат этой фотографии",
"Map tiles temporarily unavailable": "Тайлы карты временно недоступны",
"Mapped names temporarily unavailable": "Названия объектов временно недоступны",
"No mapped sites in view": "В кадре нет объектов",
"No mapped sites within {km} km of the contact": "Нет объектов в радиусе {km} км от контакта",
"{count} mapped sites in view": {
"one": "{count} объект в кадре",
"few": "{count} объекта в кадре",
"many": "{count} объектов в кадре",
"other": "{count} объекта в кадре"
},
"{count} mapped sites within {km} km of the contact": {
"one": "{count} объект в радиусе {km} км от контакта",
"few": "{count} объекта в радиусе {km} км от контакта",
"many": "{count} объектов в радиусе {km} км от контакта",
"other": "{count} объекта в радиусе {km} км от контакта"
},
"Too many mapped sites in view to list them all": "В кадре слишком много объектов, чтобы перечислить все",
"Installation context unavailable": "Контекст объектов недоступен",
"Focus vessel {name}, MMSI {mmsi}": "Фокус на судне {name}, MMSI {mmsi}",
"Open the USGS initial report for the 26 August 2026 Nepal landslide": "Открыть первичное сообщение USGS об оползне в Непале 26 августа 2026 года",
"YouTube source": "Источник YouTube",
"Facebook source": "Источник Facebook",
"Military airfield": "Военный аэродром",
"Naval base": "Военно-морская база",
"Firing range": "Стрельбище",
"Military land": "Военная территория",
"Mapped installation": "Объект на карте",
"Military area": "Военная зона",
"SIMULATED — {reason}": "СИМУЛЯЦИЯ — {reason}",
"TomTom key unavailable": "Ключ TomTom недоступен",
"TomTom daily budget reached": "Исчерпан дневной лимит TomTom",
"TomTom upstream unreachable": "Сервер TomTom не отвечает",
"TomTom flow unavailable": "Поток TomTom недоступен",
"API key rejected — check AISSTREAM_API_KEY": "Ключ API отклонён — проверьте AISSTREAM_API_KEY",
"feed silent {seconds}s — no AIS data": "нет данных AIS от потока {seconds} с",
"feed silent — no AIS data": "нет данных AIS от потока",
"feed down — retrying slowly (attempt {attempt})": "поток недоступен — повторяем реже (попытка {attempt})",
"feed down — retrying slowly": "поток недоступен — повторяем реже",
"reconnecting to feed… (attempt {attempt})": "переподключение к потоку… (попытка {attempt})",
"reconnecting to feed…": "переподключение к потоку…",
"AISSTREAM_API_KEY not set": "AISSTREAM_API_KEY не задан",
"live feed unsupported": "поток в реальном времени не поддерживается",
"connecting to feed…": "подключение к потоку…",
"feed disconnected": "поток отключён",
"feed down": "поток недоступен",
"feed idle": "поток простаивает",
"AIS live load failed": "Не удалось загрузить AIS в реальном времени",
"age|{count}m": "{count} мин",
"{acres} ac": {
"one": "{acres} акр",
"few": "{acres} акра",
"many": "{acres} акров",
"other": "{acres} акра"
},
"{percent}% contained": "локализован на {percent}%",
"containment unknown": "локализация неизвестна",
"{cause} cause": "причина: {cause}",
"{personnel} personnel": {
"one": "{personnel} человек",
"few": "{personnel} человека",
"many": "{personnel} человек",
"other": "{personnel} человека"
},
"{county} County": "округ {county}",
"{cost} to date": "{cost} на сегодня",
"discovered {age} ago": "обнаружен {age} назад",
"updated {age} ago": "обновлён {age} назад",
"part of {complex}": "входит в {complex}",
"InciWeb ↗ · click card to open": "InciWeb ↗ · нажмите на карточку, чтобы открыть",
"FIRE · {name}": "ПОЖАР · {name}",
"Unnamed incident": "Без названия",
"Open {title} on InciWeb": "Открыть {title} в InciWeb",
"Vehicle {vehicle}": "Борт {vehicle}",
"Bus": "Автобус",
"Tram": "Трамвай",
"Subway": "Метро",
"Train": "Поезд",
"Ferry": "Паром",
"Transit vehicle": "Общественный транспорт",
"No recent fix": "Нет свежих координат",
"Waiting for update": "Ожидание обновления",
"Moving": "В движении",
"reported {speed} km/h": "по отчёту {speed} км/ч",
"reported hdg {heading}°": "по отчёту курс {heading}°",
"Last report: stopped at stop {stop}": "Последний отчёт: стоит на остановке {stop}",
"Last report: arriving at stop {stop}": "Последний отчёт: прибывает на остановку {stop}",
"Last report: next stop {stop}": "Последний отчёт: следующая остановка {stop}",
"occupancy|empty": "пусто",
"occupancy|many seats available": "много свободных мест",
"occupancy|few seats available": "мало свободных мест",
"occupancy|standing room only": "только стоячие места",
"occupancy|crushed standing room only": "переполнен, только стоя",
"occupancy|full": "мест нет",
"occupancy|not accepting passengers": "посадки нет",
"occupancy|not boardable": "посадка невозможна",
"Shown at street level · depth not in the feed": "Показан на уровне улицы · глубины в потоке нет",
"Reported {seconds} s ago": "Отчёт {seconds} с назад",
"Reported {minutes} min ago": "Отчёт {minutes} мин назад",
"{reported} (feed time)": "{reported} (время потока)",
"shown {seconds} s behind": "показ отстаёт на {seconds} с",
"Available trail: {minutes} min": "Доступный след: {minutes} мин",
"Available trail: {minutes} min (limited)": "Доступный след: {minutes} мин (ограничен)",
"UNAVAILABLE · {source} · Roads unavailable": "НЕДОСТУПНО · {source} · Дороги недоступны",
"Roads: {source}": "Дороги: {source}",
"TomTom roads unavailable while the traffic service is unreachable": "Дороги TomTom недоступны, пока сервис трафика не отвечает",
"Hybrid unavailable while the traffic service is unreachable": "Гибридный режим недоступен, пока сервис трафика не отвечает",
"TomTom roads need a TomTom key": "Для дорог TomTom нужен ключ TomTom",
"Hybrid needs a TomTom key": "Для гибридного режима нужен ключ TomTom",
"Local surface still loading": "Поверхность под дорогами ещё загружается",
"Partial coverage": "Частичное покрытие",
"Detailed roads unavailable": "Нет детальных данных о дорогах",
"Reduced detail coverage": "Покрытие с меньшей детализацией",
"OpenFreeMap tiles rate-limited": "Тайлы OpenFreeMap: превышен лимит запросов",
"OpenFreeMap tiles timed out": "Тайлы OpenFreeMap: истекло время ожидания",
"OpenFreeMap tiles unavailable": "Тайлы OpenFreeMap недоступны",
"Heard by your receiver": "Принято вашим приёмником",
"browser SDR": "SDR в браузере",
"decoder feed": "поток декодера",
"Your RTL-SDR receiver and decoder feed": "Ваш приёмник RTL-SDR и поток декодера",
"Your decoder feed": "Ваш поток декодера",
"Your RTL-SDR receiver": "Ваш приёмник RTL-SDR",
"NO CALLSIGN": "БЕЗ ПОЗЫВНОГО",
"ALT {altitude} FT · GS {speed} KT · TRK {track}": "ВЫС. {altitude} ФТ · ПУТ. СКОР. {speed} УЗ · ПУТЬ {track}",
"V/S {rate}": "ВЕРТ. СКОР. {rate}",
"V/S {rate} FPM": "ВЕРТ. СКОР. {rate} ФТ/МИН",
"POSITION {age}": "ПОЗИЦИЯ {age}",
"POSITION {seconds} S AGO": "ПОЗИЦИЯ {seconds} С НАЗАД",
"{count} MSGS": {
"one": "{count} СООБЩЕНИЕ",
"few": "{count} СООБЩЕНИЯ",
"many": "{count} СООБЩЕНИЙ",
"other": "{count} СООБЩЕНИЯ"
},
"installation class|BARRACKS": "КАЗАРМЫ",
"installation class|TRAINING AREA": "УЧЕБНЫЙ ПОЛИГОН",
"Seeking up…": "Поиск вверх…",
"Seeking down…": "Поиск вниз…",
"Scanning {mhz} MHz…": "Сканирование {mhz} МГц…",
"Found {mhz} MHz · {snr} dB": "Найдено {mhz} МГц · {snr} дБ",
"Broadcaster stream is unavailable or blocked by the browser.": "Поток вещателя недоступен или заблокирован браузером.",
"Playback requires a direct click or tap.": "Чтобы начать воспроизведение, нажмите «Пуск».",
"Broadcaster stream could not be started.": "Не удалось запустить поток вещателя.",
"Directory refresh degraded; showing the previous station catalog.": "Обновление каталога прошло с перебоями; показан предыдущий каталог станций.",
"Radio directory coverage is degraded.": "Каталог радиостанций работает с перебоями.",
"Directory refresh failed; showing the previous station catalog.": "Не удалось обновить каталог; показан предыдущий каталог станций.",
"Radio directory is temporarily unavailable.": "Каталог радиостанций временно недоступен.",
"Decoder feeds: {feeds}": "Потоки декодера: {feeds}",
" · read while Local ADS-B is on": " · читаются при включённом слое «Локальный ADS-B»",
"idle": "ожидание",
"running": "работает",
"suspended": "приостановлено",
"closed": "закрыто",
"Local FM stopped: internet radio started": "Локальный FM остановлен: запущено интернет-радио",
"ALPR cameras": "камеры ALPR",
"OVERPASS RATE-LIMITED": "OVERPASS: ПРЕВЫШЕН ЛИМИТ ЗАПРОСОВ",
"OVERPASS TIMED OUT": "OVERPASS: ИСТЕКЛО ВРЕМЯ ОЖИДАНИЯ",
"OVERPASS COULD NOT COMPLETE THE QUERY": "OVERPASS: НЕ УДАЛОСЬ ЗАВЕРШИТЬ ЗАПРОС",
"MAP TILES TEMPORARILY UNAVAILABLE": "ТАЙЛЫ КАРТЫ ВРЕМЕННО НЕДОСТУПНЫ",
"MAPPED NAMES TEMPORARILY UNAVAILABLE": "НАЗВАНИЯ ОБЪЕКТОВ ВРЕМЕННО НЕДОСТУПНЫ",
"Shared flight follow expired": "Срок отслеживания рейса по ссылке истёк",
"Shared military flight follow expired": "Срок отслеживания военного рейса по ссылке истёк",
"Shared satellite follow expired": "Срок отслеживания спутника по ссылке истёк",
"Shared flight could not be restored — feed unavailable": "Не удалось восстановить рейс по ссылке — поток данных недоступен",
"Shared military flight could not be restored — feed unavailable": "Не удалось восстановить военный рейс по ссылке — поток данных недоступен",
"Shared satellite could not be restored — feed unavailable": "Не удалось восстановить спутник по ссылке — поток данных недоступен",
"Shared flight is unavailable": "Рейс по ссылке недоступен",
"Shared military flight is unavailable": "Военный рейс по ссылке недоступен",
"Shared satellite is unavailable": "Спутник по ссылке недоступен",
"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}": "Сцена не сохранена — {reason}",
"Stopped": "Остановлено",
"Stopped (Esc)": "Остановлено (Esc)",
"Camera ownership changed": "Управление камерой перехвачено",
"Scene layer turned off": "Слой сцены выключен",
"Seeking scene clock": "Перемотка сцены",
"Importing project": "Импорт проекта",
"Camera move interrupted": "Перелёт камеры прерван",
"Scene media timed out": "Истекло время ожидания медиа сцены",
"Space Missions isolates replay data. Exit the mode to enable {layer}.": "Режим «Космические миссии» изолирует данные воспроизведения. Выйдите из режима, чтобы включить слой «{layer}».",
"Tilted view": "Вид с наклоном",
"Straight-down view": "Вид сверху",
"North up": "Север вверху",
"Exit cockpit to fly to a camera": "Выйдите из кабины, чтобы перелететь к камере",
"Exit cockpit to fly to a location": "Выйдите из кабины, чтобы перелететь к месту",
"Exit cockpit to fly to a photo": "Выйдите из кабины, чтобы перелететь к фото",
"Exit cockpit to fly to a shared view": "Выйдите из кабины, чтобы перелететь к виду по ссылке",
"Exit cockpit to fly to a target": "Выйдите из кабины, чтобы перелететь к цели",
"Exit cockpit to fly to a vessel": "Выйдите из кабины, чтобы перелететь к судну",
"Exit cockpit to fly to a fire": "Выйдите из кабины, чтобы перелететь к пожару",
"Exit cockpit to fly to a route": "Выйдите из кабины, чтобы перелететь к маршруту",
"Exit cockpit to fly to a file": "Выйдите из кабины, чтобы перелететь к файлу",
"Exit cockpit to fly to a scene": "Выйдите из кабины, чтобы перелететь к сцене",
"Exit cockpit to fly to a {noun}": "Выйдите из кабины, чтобы перелететь: {noun}",
"Go to expanded Radio section": "Перейти к развёрнутому разделу радио",
"Expand Radio section in Context": "Развернуть раздел «Радио» в панели «Контекст»",
"Double-click the header to snap the panel back": "Двойной щелчок по заголовку — вернуть панель на место",
"New scene name": "Название новой сцены",
"Delete scene \"{scene}\" and all shots?": "Удалить сцену «{scene}» и все кадры?",
"Detailed outline unavailable": "Подробный контур недоступен",
"Provider Settings does not answer proxied requests": "«Настройки провайдеров» не отвечают на запросы через прокси",
"Provider Settings is disabled while sharing is enabled": "«Настройки провайдеров» отключены, пока включён общий доступ",
"Provider Settings answers only the machine running the server": "«Настройки провайдеров» отвечают только компьютеру, на котором запущен сервер",
"Provider Settings answers only local hostnames": "«Настройки провайдеров» отвечают только на локальные имена хостов",
"Provider Settings requires an exact local Origin": "«Настройкам провайдеров» нужен точный локальный Origin",
"Unrecognized Origin refused": "Нераспознанный Origin отклонён",
"Cross-origin requests are refused": "Запросы с другого источника отклоняются",
"Content-Type must be application/json": "Content-Type должен быть application/json",
"Method not allowed": "Метод не разрешён",
"Request too large": "Слишком большой запрос",
"Invalid JSON": "Некорректный JSON",
"Body must be a JSON object of {ENV_VAR: value}": "Тело запроса должно быть JSON-объектом вида {ENV_VAR: value}",
"No keys provided": "Ключи не переданы",
"At most {limit} keys per save": "Ключей за одно сохранение — не больше {limit}",
"Unknown key: {name}": "Неизвестный ключ: {name}",
"{name} must be a string": "{name}: значение должно быть строкой",
"{name} is empty": "{name}: пустое значение",
"{name} is longer than any real key ({limit} max)": "{name}: значение длиннее любого настоящего ключа (максимум {limit})",
"{name} may only contain printable characters with no spaces": "{name}: допустимы только печатные символы без пробелов",
"{name} contains a character that is not valid in a key (#, quotes, $, \\, or backtick)": "{name}: недопустимый для ключа символ (#, кавычки, $, \\ или обратный апостроф)",
"{name} is configured outside Provider Settings and can only be changed where it was set": "{name}: задан вне «Настроек провайдеров», изменить его можно только там, где его задали",
"The key was not saved: could not restrict the credential file to your account; nothing was saved": "Ключ не сохранён: не удалось закрыть файл учётных данных от всех, кроме вашей учётной записи; ничего не сохранено",
"The key was not saved: the existing configuration could not be read, so nothing was changed": "Ключ не сохранён: не удалось прочитать текущую конфигурацию, поэтому ничего не изменено",
"Could not write the {store} store": "Не удалось записать хранилище {store}",
"Could not check ChatGPT sign-in. Try again.": "Не удалось проверить вход в ChatGPT. Попробуйте ещё раз.",
"Cloud voice will use OPENAI_API_KEY on the next session.": "Следующая облачная голосовая сессия будет использовать OPENAI_API_KEY.",
"Checking local ChatGPT OAuth sign-in…": "Проверка локального входа в ChatGPT через OAuth…",
"Could not check ChatGPT sign-in.": "Не удалось проверить вход в ChatGPT.",
"ChatGPT OAuth selected for cloud voice. Your API key stays saved and available.": "Для облачного голоса выбран ChatGPT OAuth. Ваш ключ API остаётся сохранённым и доступным.",
"ChatGPT sign-in expired. Opening sign-in again…": "Сеанс ChatGPT истёк. Открываем вход заново…",
"Opening ChatGPT sign-in in your browser…": "Открываем вход в ChatGPT в браузере…",
"Could not start ChatGPT sign-in on this machine.": "Не удалось начать вход в ChatGPT на этом компьютере.",
"Finish ChatGPT sign-in in the browser. Waiting for it to complete…": "Завершите вход в ChatGPT в браузере. Ожидание завершения…",
"ChatGPT sign-in timed out. Click {button} to try again.": "Время на вход в ChatGPT истекло. Нажмите «{button}», чтобы попробовать ещё раз.",
"ChatGPT sign-in complete. OAuth will be used for the next cloud voice session.": "Вход в ChatGPT выполнен. В следующей облачной голосовой сессии будет использоваться OAuth.",
"OAuth check failed: {detail}": "Не удалось проверить OAuth: {detail}",
"unsaved CCTV calibration": "несохранённая калибровка CCTV",
"the open cockpit": "открытая кабина",
"Switching language reloads the page. This will be lost: {items}. Switch anyway?": "Смена языка перезагрузит страницу. Будет потеряно: {items}. Всё равно сменить язык?",
"Wind upstream unavailable": "Источник данных о ветре недоступен",
"WebUSB needs desktop Chrome or Edge": "Для WebUSB нужен настольный Chrome или Edge",
"connect a receiver in Radio": "подключите приёмник в разделе «Радио»",
"receiver is in FM mode": "приёмник в режиме FM",
"Cyclone advisories unavailable": "Сводки о циклонах недоступны",
"Cyclone data unavailable": "Данные о циклонах недоступны",
"Drag to size the box": "Потяните, чтобы задать размер области",
"Press on the ground, not the sky": "Нажмите на землю, а не на небо",
"Point the camera at the ground to use the view": "Наведите камеру на землю, чтобы использовать вид",
"That point cannot anchor a box": "От этой точки нельзя построить область",
"Box edges must be finite": "Некорректные координаты области",
"Longitudes must be within ±180°": "Долгота должна быть в пределах ±180°",
"Select one side of the dateline": "Не пересекайте линию перемены дат",
"Box must enclose an area": "Область должна иметь площадь",
"Imagery stops at ±{limit}° latitude": "Снимки есть только до ±{limit}° широты",
"{owner} is using the pointer — close it first": "Указатель занят: «{owner}». Закройте его",
"OpenSky OAuth client missing/invalid": "Клиент OAuth OpenSky отсутствует или недействителен",
"OpenSky OAuth rejected credentials": "OpenSky OAuth отклонил учётные данные",
"OpenSky username/password rejected": "OpenSky отклонил имя пользователя или пароль",
"OpenSky auth missing": "Нет данных для входа в OpenSky",
"OpenSky auth required": "OpenSky требует входа",
"OpenSky auth invalid": "Неверные данные для входа в OpenSky",
"OpenSky auth failed": "Не удалось войти в OpenSky",
"Source snapshot {minutes} min old": "Возраст снимка источника: {minutes} мин",
"{source} rate limited (anonymous)": "{source}: лимит запросов (анонимно)",
"{source} rate limited": "{source}: лимит запросов",
"{source} HTTP {status}": "{source}: HTTP {status}",
"{source} network error": "{source}: ошибка сети",
"Malformed {source} aircraft rows": "{source}: некорректные записи о самолётах",
"Malformed {source} response": "{source}: некорректный ответ",
"Source snapshot time unavailable": "Время снимка источника неизвестно",
"Live data unavailable": "Данные в реальном времени недоступны",
"{n} aircraft": {
"one": "{n} самолёт",
"few": "{n} самолёта",
"many": "{n} самолётов",
"other": "{n} самолёта"
},
"{n} military aircraft": {
"one": "{n} военный самолёт",
"few": "{n} военных самолёта",
"many": "{n} военных самолётов",
"other": "{n} военного самолёта"
},
"{n} ships": {
"one": "{n} судно",
"few": "{n} судна",
"many": "{n} судов",
"other": "{n} судна"
},
"{n} satellites": {
"one": "{n} спутник",
"few": "{n} спутника",
"many": "{n} спутников",
"other": "{n} спутника"
},
"{n} launches": {
"one": "{n} пуск",
"few": "{n} пуска",
"many": "{n} пусков",
"other": "{n} пуска"
},
"{n} earthquakes": {
"one": "{n} землетрясение",
"few": "{n} землетрясения",
"many": "{n} землетрясений",
"other": "{n} землетрясения"
},
"{n} fires": {
"one": "{n} пожар",
"few": "{n} пожара",
"many": "{n} пожаров",
"other": "{n} пожара"
},
"{n} fire perimeters": {
"one": "{n} контур пожара",
"few": "{n} контура пожаров",
"many": "{n} контуров пожаров",
"other": "{n} контура пожаров"
},
"{n} cyclones": {
"one": "{n} циклон",
"few": "{n} циклона",
"many": "{n} циклонов",
"other": "{n} циклона"
},
"{n} buses": {
"one": "{n} автобус",
"few": "{n} автобуса",
"many": "{n} автобусов",
"other": "{n} автобуса"
},
"{n} bike share": {
"one": "{n} станция проката велосипедов",
"few": "{n} станции проката велосипедов",
"many": "{n} станций проката велосипедов",
"other": "{n} станции проката велосипедов"
},
"{n} flock cameras": {
"one": "{n} камера ALPR",
"few": "{n} камеры ALPR",
"many": "{n} камер ALPR",
"other": "{n} камеры ALPR"
},
"{n} military bases": {
"one": "{n} военная база",
"few": "{n} военные базы",
"many": "{n} военных баз",
"other": "{n} военной базы"
},
"{n} datacenters": {
"one": "{n} дата-центр",
"few": "{n} дата-центра",
"many": "{n} дата-центров",
"other": "{n} дата-центра"
},
"{n} dams": {
"one": "{n} плотина",
"few": "{n} плотины",
"many": "{n} плотин",
"other": "{n} плотины"
},
"{n} results": {
"one": "{n} результат",
"few": "{n} результата",
"many": "{n} результатов",
"other": "{n} результата"
},
"anywhere in the loaded data": "во всех загруженных данных",
"in view": "в кадре",
"within {radius} of the view centre": "в радиусе {radius} от центра вида",
"within {radius} of {place} (Contacts window)": "в радиусе {radius} — {place} (окно «Контактов»)",
"within {radius} of {place}": "в радиусе {radius} — {place}",
"within {radius}": "в радиусе {radius}",
"over {region}": "в регионе {region}",
"At least {items}": "{items} или больше",
"{items} {scope}": "{items} {scope}",
"last 24 h": "за последние 24 ч",
"past 30 d and upcoming": "за последние 30 дн. и предстоящие",
"the flights layer loads by viewport": "слой рейсов загружается по области вида",
"distance is ground distance, not overhead": "расстояние — по поверхности земли до подспутниковой точки, а не до самого аппарата",
"the count is a lower bound because at least one layer reached its retained limit.": "это нижняя граница: хотя бы один слой достиг предела хранимых записей.",
"{label} loading": "{label}: загрузка",
"{label} error": "{label}: ошибка",
"counted the first {returned} loaded records": "учтены только первые загруженные записи: {returned}",
"counted {returned} of {total} loaded records": "учтено загруженных записей: {returned} из {total}",
"{layers} just turned on — still loading, counts will rise": "{layers}: только что включено — данные ещё загружаются, значения вырастут",
"Contacts panel snapshot at {time} — the same retained cohort supplies the card, speech, and follow-up memory": "Снимок панели «Контакты» ({time}) — та же сохранённая выборка используется для карточки, речи и памяти уточняющих вопросов",
"Contacts panel snapshot — the same retained cohort supplies the card, speech, and follow-up memory": "Снимок панели «Контакты» — та же сохранённая выборка используется для карточки, речи и памяти уточняющих вопросов",
"Not answered: {layers}": "Нет ответа: {layers}",
"The flights layer is not enabled": "Слой рейсов не включён",
"The military layer is not enabled": "Слой военных рейсов не включён",
"The satellites layer is not enabled": "Слой спутников не включён",
"The ais-live-vessels layer is not enabled": "Слой судов AIS не включён",
"Could not enable the requested layer": "Не удалось включить запрошенный слой",
"Could not disable the requested layer": "Не удалось выключить запрошенный слой",
"Radio layer unavailable": "Слой радио недоступен",
"Camera navigation is unavailable in the current view": "Управление камерой недоступно в текущем виде",
"Camera navigation policy unavailable": "Правила навигации камеры недоступны",
"Nearest-aircraft selection supports Flights or Military Flights only": "Выбор ближайшего самолёта работает только для рейсов и военных рейсов",
"Nearest-aircraft selection needs a preset, place name, or latitude and longitude": "Для выбора ближайшего самолёта нужен пресет, название места или широта и долгота",
"Could not arrive at the requested place": "Не удалось долететь до запрошенного места",
"The nearest airborne aircraft could not be selected": "Не удалось выбрать ближайший самолёт в воздухе",
"No flights within {radius} of the current view": "В радиусе {radius} от текущего вида нет рейсов",
"No military within {radius} of the current view": "В радиусе {radius} от текущего вида нет военных рейсов",
"No satellites within {radius} of the current view": "В радиусе {radius} от текущего вида нет спутников",
"No vessels within {radius} of the current view": "В радиусе {radius} от текущего вида нет судов",
"{layer} is enabled on the {source} feed, but no airborne aircraft is loaded in the {place} view yet": "{layer}: включено (поток {source}), но в виде «{place}» пока не загружено ни одного самолёта в воздухе",
"{layer} is enabled, but no airborne aircraft is loaded in the {place} view yet": "{layer}: включено, но в виде «{place}» пока не загружено ни одного самолёта в воздухе",
"{layer} is enabled, but its aircraft feed is unavailable": "{layer}: включено, но поток данных о самолётах недоступен",
"{layer} is enabled, but its destination refresh did not complete": "{layer}: включено, но обновление в точке назначения не завершилось",
"{layer} is enabled, but {source} is unavailable": "{layer}: включено, но источник {source} недоступен",
"Could not arrive at {place}": "Не удалось долететь: {place}",
"{name} is no longer loaded": "{name}: объект больше не загружен",
"Unknown target layer: {target}": "Неизвестный слой цели: {target}",
"Layer": "Слой",
"there": "там",
"Frame flights": "Показать самолёты в кадре",
"Frame military": "Показать военные самолёты в кадре",
"Frame vessels": "Показать суда в кадре",
"Fly to Location": "Перелёт к месту",
"Nearest aircraft to Here": "Ближайший самолёт здесь",
"Estimate is incomplete — a response was still in flight when the session ended, so its usage was never reported.": "Оценка неполная: к моменту завершения сессии один из ответов ещё не был получен, поэтому его использование не учтено.",
"STANDARD": "СТАНДАРТ",
"vehicle motion|Stopped": "Стоит",
"ACQUIRING FRAME": "ПОЛУЧЕНИЕ КАДРА",
"Camera source temporarily unavailable": "Источник камер временно недоступен",
"Perimeter source unavailable": "Источник контуров пожаров недоступен",
"Imagery catalog unavailable": "Каталог снимков недоступен",
"Earthquake source unavailable": "Источник данных о землетрясениях недоступен",
"TeleGeography load failed": "Не удалось загрузить данные TeleGeography",
"Wind request timed out": "Истекло время ожидания запроса ветра",
"Malformed wind manifest": "Некорректный манифест ветра",
"Malformed wind grid": "Некорректная сетка ветра",
"Unknown wind model": "Неизвестная модель ветра",
"Unknown weather overlay": "Неизвестный погодный слой",
"Temperature field unavailable": "Поле температуры недоступно",
"Mean sea level pressure field unavailable": "Поле давления на уровне моря недоступно",
"KartaView answered HTTP {status}": "KartaView ответил: HTTP {status}",
"KartaView refused the request (code {code})": "KartaView отклонил запрос (код {code})",
"Stopped by voice": "Остановлено голосовой командой",
"drawings on the map": "рисунки на карте",
"imported map files": "импортированные файлы на карте",
"the active voice session": "активная голосовая сессия",
"Light aircraft": "Лёгкий самолёт",
"Glider": "Планёр",
"Turboprop": "Турбовинтовой самолёт",
"Airliner": "Авиалайнер",
"Widebody": "Широкофюзеляжный самолёт",
"Four-engine jet": "Четырёхмоторный реактивный самолёт",
"Helicopter": "Вертолёт",
"Fast jet": "Высокоманёвренный самолёт",
"Business jet": "Бизнес-джет",
"Drone": "Беспилотник",
"fire cause|Human": "деятельность человека",
"fire cause|Natural": "природная",
"fire cause|Undetermined": "не установлена",
"fire cause|Unknown": "неизвестна",
"fire behavior|Minimal": "минимальная активность",
"fire behavior|Moderate": "умеренная активность",
"fire behavior|Active": "высокая активность",
"fire behavior|Extreme": "экстремальная активность",
"Type {level} Incident": "инцидент {level}-го типа",
"${amount}K": "{amount} тыс. $",
"${amount}M": "{amount} млн $",
"${amount}B": "{amount} млрд $",
"{speed} kn": "{speed} уз",
"1090 MHz": "1090 МГц",
"978 MHz UAT": "978 МГц UAT",
"feed status|live": "онлайн",
"feed status|stale": "устарел",
"feed status|unreachable": "недоступен",
"feed status|invalid": "некорректный",
"Vector tile metadata unavailable": "Метаданные векторных тайлов недоступны",
"Vector tiles unavailable": "Векторные тайлы недоступны",
"Vector tiles unavailable (HTTP {status})": "Векторные тайлы недоступны (HTTP {status})",
"Vector tile request timed out": "Векторные тайлы: истекло время ожидания",
"Zoom in for vector tile coverage": "Приблизьте карту, чтобы загрузить векторные тайлы",
"Camera coverage unavailable": "Покрытие камер недоступно",
"Hybrid": "Гибрид",
"TomTom roads only, each with its live flow": "Только дороги TomTom, у каждой — свой поток онлайн",
"TomTom roads only, each with its live flow (needs a TomTom key)": "Только дороги TomTom, у каждой — свой поток онлайн (нужен ключ TomTom)",
"OpenStreetMap roads, with TomTom flow matched when available": "Дороги OpenStreetMap; поток TomTom сопоставляется, где он есть",
"TomTom roads first; OpenStreetMap fills the rest, simulated": "Сначала дороги TomTom; остальное дополняет OpenStreetMap с симуляцией потока",
"TomTom roads first; OpenStreetMap fills the rest, simulated (needs a TomTom key)": "Сначала дороги TomTom; остальное дополняет OpenStreetMap с симуляцией потока (нужен ключ TomTom)",
"Austin": "Остин",
"San Francisco": "Сан-Франциско",
"New York": "Нью-Йорк",
"Tokyo": "Токио",
"London": "Лондон",
"Paris": "Париж",
"Dubai": "Дубай",
"Washington DC": "Вашингтон",
"Tallinn": "Таллин",
"Los Angeles": "Лос-Анджелес",
"Data attribution": "Источники данных",
"Data provided by:": "Данные предоставлены:",
"Exit cockpit to view weather coverage": "Выйдите из кабины, чтобы показать зону покрытия погодного слоя",
"Exit cockpit to fly to a cyclone": "Выйдите из кабины, чтобы перелететь к циклону",
"the title of scene {scene} is empty or longer than {max} characters": "название сцены {scene} пустое или длиннее {max} символов",
"the title of shot {shot} in scene {scene} is empty or longer than {max} characters": "название кадра {shot} в сцене {scene} пустое или длиннее {max} символов",
"the project is larger than 5 MiB": "проект больше 5 МиБ",
"the project has too many shots": "в проекте слишком много кадров",
"the scene data failed validation": "данные сцены не прошли проверку",
"Layer on": "Слой: вкл.",
"Layer off": "Слой: выкл.",
"Zoom in": "Приблизить",
"Zoom out": "Отдалить",
"Zoom out to globe": "Отдалить до глобуса",
"Open data layers": "Открыть слои данных",
"Open or close a panel": "Открыть или закрыть панель",
"Change context mode": "Сменить режим контекста",
"Control cockpit": "Управлять кабиной",
"Change visual style": "Сменить визуальный стиль",
"Adjust HUD": "Настроить HUD",
"Adjust cyber sonar": "Настроить кибер-сонар",
"Adjust detection overlay": "Настроить слой детекции",
"Change map stack": "Сменить набор карт",
"Adjust post-processing": "Настроить постобработку",
"Control scene": "Управлять сценой",
"Control CCTV": "Управлять камерами CCTV",
"Control radio": "Управлять радио",
"Track contact": "Отслеживать контакт",
"Stop tracking": "Остановить отслеживание",
"Clear marks": "Убрать отметки",
"Move camera": "Переместить камеру",
"Fly route": "Пролететь по маршруту",
"Analyst query": "Аналитический запрос",
"Next ISS pass": "Следующий пролёт МКС",
"Next satellite pass": "Следующий пролёт спутника",
"Action": "Действие"
}