diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index b98e3c5d..723fc17f 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -100,8 +100,8 @@ "settings_locationInvalid": "Невалидна ширина или дължина.", "settings_latitude": "Широчина", "settings_longitude": "Дължина", - "settings_autoZeroHopAdvertOnGpsUpdate": "Автоматична zero-hop обява при GPS обновяване", - "settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "Когато GPS местоположението се промени, изпрати zero-hop обява (изисква местоположение в обявата).", + "settings_autoZeroHopAdvertOnGpsUpdate": "Автоматична zero-hop обява при GPS обновяване", + "settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "Когато GPS местоположението се промени, изпрати zero-hop обява (изисква местоположение в обявата).", "settings_privacyMode": "Режим на поверителност", "settings_privacyModeSubtitle": "Скриване на име/местоположение в рекламите", "settings_privacyModeToggle": "Активирайте режим на поверителност, за да скриете името и местоположението си в рекламите.", @@ -2605,5 +2605,227 @@ "pathMap_noLocation": "Без посочено местоположение", "pathMap_followPacket": "Проследи пакета", "pathMap_unfollowPacket": "Спри проследяването на пакета", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Региони", + "settings_regionSettingsSubtitle": "Управляне на хранилищни региони", + "settings_regionManagement_screenTitle": "Регионално управление", + "settings_regionNameHint": "Възразна название на региона", + "settings_regionAddRegion": "Добавете регион", + "settings_regionFetchRegions": "Извън рептерите от региони", + "settings_regionFetchRegionsFail": "Не бъде открити никако региони", + "settings_regionFetchRegionsAlreadyExists": "Тата регион е уже добавена", + "settings_regionName": "Регионноименоване", + "settings_regionDeleted": "Регион отстранен", + "settings_deleteRegion": "Удаляне на регион", + "settings_deleteRegionConfirm": "Състрясна: отпиште \"{region}\" от списка региони?", + "settings_infoHardware": "Оборудование", + "settings_infoFirmware": "Програмно-оборонни системни программи (фirmware)", + "repeater_pathHashModeOption0": "0 - 1 байт", + "repeater_pathHashModeOption1": "1 - 2 байта", + "repeater_pathHashModeOption2": "2 - 3 байта", + "repeater_pathHashModeOption3": "3 - 4 байта", + "appSettings_batteryLipoHv": "LiPo ВЗГ (3,0-4,35 В)", + "channels_regionSetTo": "Регион: {region}", + "channels_regionNotSet": "Регион: ние", + "channels_regionSelect_Title": "Выберете регион", + "channels_clearRegion": "Чиста зона", + "chat_sendImage": "Изпрати изображение", + "chat_imagePickFailed": "Не мог да откривам та изображин", + "chat_receivedGif": "Получил GIF", + "repeater_keySettings": "Изменяне на идентичности ключа", + "repeater_keySettingsSubtitle": "Замени ключовият пар от публични/частни", + "repeater_prvKey": "Частни ключ", + "repeater_prvKeyHelper": "Нова приватна ключ на повторчето, 128-символовна шестнадатерична строка.", + "repeater_generatePrvKey": "Генериране на случайна ключи", + "repeater_stopGeneratingPrvKey": "Прервана поискна на ключова парта", + "repeater_pubKey": "Публична ключ", + "repeater_pubKeyHelper": "Та е публичната ключ, която се свързува с генериранта приватна ключ. Трябва да не настройте тоа напрямо.", + "repeater_pubKeyPrefix": "Желата префикс", + "repeater_pubKeyPrefixHelper": "Наискате публична ключ, който почева с този шестнадатницил. Ожидавани проби: {tries}.", + "imageMessages_enableTitle": "Абilitiraм изображените сообщения", + "imageMessages_enableSubtitle": "Изправате изображения чрез сетката. Треба е одноразовна загрузка модел на изображение.", + "imageMessages_modelSectionTitle": "Изображени модель", + "imageMessages_downloadModel": "Скачане", + "imageMessages_cancelDownload": "Отмена", + "imageMessages_removeModel": "Удалете модель", + "imageMessages_modelReady": "Готов", + "imageMessages_modelNotPublished": "Еще не опубликовано — тази версия не може да скане.", + "imageMessages_downloadFailed": "Модел за изображение не може да бъде скачан.", + "imageMessages_autoProcessTitle": "Автоматически обрабатвате изображения", + "imageMessages_autoProcessSubtitle": "Катализиране на всята изображение сразу по пришествие. Използване на около 2 ГБ на втора пъти; откажете от реконструкцията чаке при натискане.", + "imageSend_title": "Изпрати изображение", + "imageSend_cropNote": "Масштабиран до 512 × 512 · соотношение сторон не съхранясе", + "imageSend_originalSize": "Късно на използване на език:", + "imageSend_onAirSize": "В ефир", + "imageSend_quality": "Качество", + "imageSend_qualityStandard": "Стандарт", + "imageSend_qualityHigh": "Высок", + "imageSend_packetsLabel": "Пакети", + "imageSend_airtimeLabel": "Времето на изкъсване", + "imageSend_sizeLabel": "Баланса", + "imageSend_packetsCount": "{count} {count, plural, =1{пакет} other{пакета}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Настройки на радио неизвестни", + "imageSend_radioUnknownBody": "Усредете се с устройство, за да се отработа часът на изстъпане.", + "imageSend_longSendTitle": "Долга пресилка", + "imageSend_longSendBody": "Тази буде поддержива открит отряд на около {duration}.", + "imageSend_floodNote": "Руйжинг на превъште: всички ретранслятори в диапазонта превратят всички пакети, тъйа каналят оставря дълше, от този час.", + "imageSend_parityTitle": "Возобновителен пакет", + "imageSend_paritySubtitle": "Едно дополително пакет. Групни извещания не принимаются, след това разбирателят едно пакетто, какщо е пропущен един пакет.", + "imageSend_send": "Отправляй", + "imageSend_cancel": "Отмена", + "imageSend_encodeFailed": "Тази изображение не може да бъде кодирано.", + "imageSend_codecDownloading": "Модел на изображение еще разгрузира.", + "imageSend_codecUnavailable": "Изглед отправа не е доступен на този устройство.", + "imageSend_codecDisabled": "Изображенията на извещенията е отключена в настройките.", + "imageSend_deviceUnsupported": "Та радиота не може да пресылава изображени пакети. Подключите устройство, който работи с компанионски прошивка 13 или новия.", + "imageSend_directMessagesUnsupported": "Изображенията се превозводя се как групова информация, следато да се отправят единствено на канал — не в лична вестка.", + "imageSend_tooLarge": "Таата изображение е кодирано в по-числа пакети, отгоре както формат на сетта разрешава.", + "imageSend_sentConfirmation": "Изображението е изпратено като {count} {count, plural, =1{пакет} other{пакета}}.", + "imageSend_sendFailed": "Изображение не може да бъде отправено: {error}", + "imageSend_sendingProgress": "Отправка наизображение — пакет {sent} от {total}", + "receivedImage_senderPrefix": "Узъдето {prefix}", + "receivedImage_incoming": "{received} от {total} пакета", + "receivedImage_queued": "Ожидането за декодиране", + "receivedImage_tapToDecode": "Натискнете за декодиране", + "receivedImage_decoding": "Повторно… за приблизително 1 секунда", + "receivedImage_incomplete": "Изображение неполно — {received} от {total} пакети отправили", + "receivedImage_corrupt": "Изображение не може да бъде воссоздано", + "receivedImage_decoderMissing": "Получена изображение — разгадка на изображение е вреjan", + "receivedImage_evicted": "Изображение не е хранитено", + "receivedImage_retry": "Повтори", + "receivedImage_decodeAgain": "Правилейте заново", + "receivedImage_openSettings": "Настройте", + "receivedImage_tapToProcess": "Натискнете за обработка", + "receivedImage_awaiting": "{bytes} байта · {packets} {packets, plural, =1{пакет} other{пакета}}", + "imageSend_secondsValue": "{seconds} секунди", + "imageSend_minutesSecondsValue": "{minutes} мин {seconds} сек" } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index f5cc3685..5a0b0f69 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -2767,5 +2767,199 @@ "pathMap_noLocation": "Keine Standortdaten", "pathMap_followPacket": "Ansicht auf Paket fixieren", "pathMap_unfollowPacket": "Fixierung aufheben", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionFetchRegions": "Regionen von Wiederholern abrufen", + "settings_regionFetchRegionsFail": "Es wurden keine Regionen gefunden.", + "settings_regionFetchRegionsAlreadyExists": "Diese Region wurde bereits hinzugefügt", + "settings_infoHardware": "Hardware", + "settings_infoFirmware": "Firmware", + "repeater_pathHashModeOption0": "0 - 1 Byte", + "repeater_pathHashModeOption1": "1 - 2 Bytes", + "repeater_pathHashModeOption2": "2 - 3 Bytes", + "repeater_pathHashModeOption3": "3 - 4 Bytes", + "appSettings_batteryLipoHv": "LiPo HV (3,0–4,35 V)", + "chat_sendImage": "Bild senden", + "chat_imagePickFailed": "Konnte dieses Bild nicht öffnen.", + "chat_receivedGif": "Erhalten eines GIF", + "repeater_keySettings": "Identitätsschlüssel ändern", + "repeater_keySettingsSubtitle": "Ändern Sie das öffentliche/private Schlüsselpaar", + "repeater_prvKey": "Privatschlüssel", + "repeater_prvKeyHelper": "Ein neuer privater Schlüssel für den Repeater, eine 128-stellige Hexadezimalzeichenkette.", + "repeater_generatePrvKey": "Generiere ein zufälliges Schlüsselpaar", + "repeater_stopGeneratingPrvKey": "Suchvorgang für Schlüsselpaar unterbrechen", + "repeater_pubKey": "Öffentlicher Schlüssel", + "repeater_pubKeyHelper": "Dies ist der öffentliche Schlüssel, der zum generierten privaten Schlüssel gehört. Sie können dies nicht direkt festlegen.", + "repeater_pubKeyPrefix": "Gewünschtes Präfix", + "repeater_pubKeyPrefixHelper": "Suchen Sie einen öffentlichen Schlüssel, der mit diesen Hexadezimalziffern beginnt. Erwartete Versuche: {tries}.", + "imageMessages_enableTitle": "Bildnachrichten aktivieren", + "imageMessages_enableSubtitle": "Bilder über das Netzwerk senden. Einmaliges Herunterladen eines Bildmodells erforderlich.", + "imageMessages_modelSectionTitle": "Bildmodell", + "imageMessages_downloadModel": "Herunterladen", + "imageMessages_cancelDownload": "Stornieren", + "imageMessages_removeModel": "Modell entfernen", + "imageMessages_modelReady": "Bereit", + "imageMessages_modelNotPublished": "Noch nicht veröffentlicht – dieser Build kann es nicht herunterladen.", + "imageMessages_downloadFailed": "Das Bildmodell konnte nicht heruntergeladen werden.", + "imageMessages_autoProcessTitle": "Automatisch Bilder verarbeiten", + "imageMessages_autoProcessSubtitle": "Rekonstruiere jedes Bild sofort nach dem Eintreffen. Verbraucht etwa 2 GB Arbeitsspeicher für jede zweite Wiederherstellung; deaktiviere die automatische Rekonstruktion mit einem Tippen.", + "imageSend_title": "Bild senden", + "imageSend_cropNote": "Für 512 × 512 skaliert · Seitenverhältnis nicht erhalten", + "imageSend_originalSize": "Originaltext:\n\nThe quick brown fox jumps over the lazy dog.\n\nÜbersetzung:\n\nDer schnelle braune Fuchs springt über den faulen Hund.", + "imageSend_onAirSize": "On air", + "imageSend_quality": "Qualität", + "imageSend_qualityStandard": "Standard", + "imageSend_qualityHigh": "Hoch", + "imageSend_packetsLabel": "Pakete", + "imageSend_airtimeLabel": "Sendezeit", + "imageSend_sizeLabel": "Nutzlast", + "imageSend_packetsCount": "{count} {count, plural, =1{Paket} other{Pakete}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Radioeinstellungen unbekannt", + "imageSend_radioUnknownBody": "Verbinden Sie das Gerät, damit die Sendezeit berechnet werden kann.", + "imageSend_longSendTitle": "Lange Übertragung", + "imageSend_longSendBody": "Dies hält den Kanal für etwa {duration}.", + "imageSend_floodNote": "Flutweiterleitung: Jeder Repeater im Bereich leitet jedes Paket weiter, wodurch der Kanal länger als dieser Zeitraum beschäftigt bleibt.", + "imageSend_parityTitle": "Wiederherstellungspaket", + "imageSend_paritySubtitle": "Ein zusätzliches Paket. Gruppen-Nachrichten werden nicht bestätigt, daher kann der Empfänger das Bild rekonstruieren, falls ein Paket verloren geht.", + "imageSend_send": "Senden", + "imageSend_cancel": "Stornieren", + "imageSend_encodeFailed": "Dieses Bild konnte nicht kodiert werden.", + "imageSend_codecDownloading": "Das Bildmodell wird noch heruntergeladen.", + "imageSend_codecUnavailable": "Bildversand ist auf diesem Gerät nicht verfügbar.", + "imageSend_codecDisabled": "Bildnachrichten sind in den Einstellungen deaktiviert.", + "imageSend_deviceUnsupported": "Dieses Radio kann keine Bildpakete senden. Verbinden Sie ein Gerät mit der Companion-Firmware-Version 13 oder neuer.", + "imageSend_directMessagesUnsupported": "Bilder werden als Gruppendaten übertragen, daher können sie nur an einen Kanal gesendet werden – nicht per Direktnachricht.", + "imageSend_tooLarge": "Dieses Bild wurde in mehr Pakete kodiert, als das Mesh-Format zulässt.", + "imageSend_sentConfirmation": "Bild gesendet als {count} {count, plural, =1{Paket} other{Pakete}}.", + "imageSend_sendFailed": "Das Bild konnte nicht gesendet werden: {error}", + "imageSend_sendingProgress": "Bildversand — Paket {sent} von {total}", + "receivedImage_senderPrefix": "Kritisch: Diese Platzhalter {prefix} beibehalten.", + "receivedImage_incoming": "{received} von {total} Paketen", + "receivedImage_queued": "Warten auf die Entschlüsselung", + "receivedImage_tapToDecode": "Tippen Sie, um zu entschlüsseln", + "receivedImage_decoding": "Rekonstruktion… ca. 1 s", + "receivedImage_incomplete": "Bild unvollständig — {received} von {total} Paketen eingetroffen", + "receivedImage_corrupt": "Das Bild konnte nicht rekonstruiert werden.", + "receivedImage_decoderMissing": "Bild empfangen — Bilddekodierung fehlgeschlagen", + "receivedImage_evicted": "Bild nicht mehr gespeichert", + "receivedImage_retry": "Versuchen Sie es erneut", + "receivedImage_decodeAgain": "Entschlüsseln Sie es erneut", + "receivedImage_openSettings": "Einrichten", + "receivedImage_tapToProcess": "Klicken Sie, um fortzufahren", + "receivedImage_awaiting": "{bytes} Bytes · {packets} {packets, plural, =1{Paket} other{Pakete}}", + "imageSend_secondsValue": "{seconds} s", + "imageSend_minutesSecondsValue": "{minutes} Min {seconds} Sek" } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index f181ad1b..fc2b0fbc 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -2739,5 +2739,227 @@ "pathMap_noLocation": "Sin ubicación", "pathMap_followPacket": "Seguir paquete", "pathMap_unfollowPacket": "Dejar de seguir el paquete", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Regiones", + "settings_regionSettingsSubtitle": "Gestionar regiones almacenadas", + "settings_regionManagement_screenTitle": "Gestión de Regiones", + "settings_regionNameHint": "Nombre de la región", + "settings_regionAddRegion": "Añadir región", + "settings_regionFetchRegions": "Obtener regiones de repetidores", + "settings_regionFetchRegionsFail": "No se encontraron regiones", + "settings_regionFetchRegionsAlreadyExists": "Esta región ya ha sido agregada", + "settings_regionName": "Nombre de la Región", + "settings_regionDeleted": "Región eliminada", + "settings_deleteRegion": "Eliminar Región", + "settings_deleteRegionConfirm": "¿Eliminar \"{region}\" de la lista de regiones?", + "settings_infoHardware": "Hardware", + "settings_infoFirmware": "Firmware", + "repeater_pathHashModeOption0": "0 - 1 byte", + "repeater_pathHashModeOption1": "1 - 2 bytes", + "repeater_pathHashModeOption2": "2 - 3 bytes", + "repeater_pathHashModeOption3": "3 - 4 bytes", + "appSettings_batteryLipoHv": "LiPo HV (3.0-4.35V)", + "channels_regionSetTo": "Región: {region}", + "channels_regionNotSet": "Región: ninguna", + "channels_regionSelect_Title": "Seleccione una región", + "channels_clearRegion": "Zona despejada", + "chat_sendImage": "Enviar imagen", + "chat_imagePickFailed": "No pude abrir esa imagen", + "chat_receivedGif": "Recibido un GIF", + "repeater_keySettings": "Cambiar Claves de Identidad", + "repeater_keySettingsSubtitle": "Cambiar la pareja de claves pública/privada", + "repeater_prvKey": "Clave privada", + "repeater_prvKeyHelper": "Una nueva clave privada para el repetidor, una cadena hexadecimal de 128 caracteres.", + "repeater_generatePrvKey": "Genera un par de claves aleatorias", + "repeater_stopGeneratingPrvKey": "Interrumpir la búsqueda de par de claves", + "repeater_pubKey": "Clave pública", + "repeater_pubKeyHelper": "Esta es la clave pública que corresponde a la clave privada generada. No se puede establecer directamente.", + "repeater_pubKeyPrefix": "Prefijo deseado", + "repeater_pubKeyPrefixHelper": "Encuentre una clave pública que comience con estos dígitos hexadecimales. Se esperan {tries} intentos.", + "imageMessages_enableTitle": "Mensajes de imagen", + "imageMessages_enableSubtitle": "Enviar imágenes a través de la malla. Requiere la descarga de un modelo de imagen único.", + "imageMessages_modelSectionTitle": "Modelo de imagen", + "imageMessages_downloadModel": "Descargar", + "imageMessages_cancelDownload": "Cancelar", + "imageMessages_removeModel": "Eliminar modelo", + "imageMessages_modelReady": "Listo", + "imageMessages_modelNotPublished": "Aún no publicado — esta versión no puede descargarlo.", + "imageMessages_downloadFailed": "El modelo de imagen no pudo ser descargado.", + "imageMessages_autoProcessTitle": "Procesar imágenes automáticamente", + "imageMessages_autoProcessSubtitle": "Reconstruya cada imagen tan pronto como llegue. Utiliza aproximadamente 2 GB de memoria durante un segundo cada vez; desactívelo para reconstruir con un toque.", + "imageSend_title": "Enviar imagen", + "imageSend_cropNote": "Redimensionado a 512 × 512 · la relación de aspecto no se conservó", + "imageSend_originalSize": "Texto original", + "imageSend_onAirSize": "En emisión", + "imageSend_quality": "Calidad", + "imageSend_qualityStandard": "Estándar", + "imageSend_qualityHigh": "Alto", + "imageSend_packetsLabel": "Paquetes", + "imageSend_airtimeLabel": "Tiempo en pantalla", + "imageSend_sizeLabel": "Carga útil", + "imageSend_packetsCount": "{count} {count, plural, =1{paquete} other{paquetes}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Configuración de radio desconocida", + "imageSend_radioUnknownBody": "Conéctese a un dispositivo para que se pueda calcular la hora de transmisión.", + "imageSend_longSendTitle": "Larga transmisión", + "imageSend_longSendBody": "Esto mantendrá el canal durante aproximadamente {duration}.", + "imageSend_floodNote": "Enrutamiento de inundación: cada repetidor dentro del rango retransmite cada paquete, por lo que el canal permanece ocupado durante más tiempo que esto.", + "imageSend_parityTitle": "Paquete de recuperación", + "imageSend_paritySubtitle": "Un paquete adicional. Los mensajes grupales no son reconocidos, por lo que esto permite al receptor reconstruir la imagen si se pierde un solo paquete.", + "imageSend_send": "Enviar", + "imageSend_cancel": "Cancelar", + "imageSend_encodeFailed": "Esta imagen no pudo ser codificada.", + "imageSend_codecDownloading": "El modelo de imagen todavía se está descargando.", + "imageSend_codecUnavailable": "El envío de imágenes no está disponible en este dispositivo.", + "imageSend_codecDisabled": "Los mensajes de imagen están desactivados en la configuración.", + "imageSend_deviceUnsupported": "Esta radio no puede enviar paquetes de imagen. Conecte un dispositivo con el firmware Companion versión 13 o superior.", + "imageSend_directMessagesUnsupported": "Las imágenes se transmiten como datos grupales, por lo que solo se pueden enviar a un canal, no mediante mensajes directos.", + "imageSend_tooLarge": "Esa imagen se codificó en más paquetes de los que permite el formato de malla.", + "imageSend_sentConfirmation": "Imagen enviada como {count} {count, plural, =1{paquete} other{paquetes}}.", + "imageSend_sendFailed": "La imagen no pudo ser enviada: {error}", + "imageSend_sendingProgress": "Envío de imagen — paquete {sent} de {total}", + "receivedImage_senderPrefix": "Nodo {prefix}", + "receivedImage_incoming": "{received} de {total} paquetes", + "receivedImage_queued": "Esperando descifrar", + "receivedImage_tapToDecode": "Toque para decodificar", + "receivedImage_decoding": "Reconstruyendo… aproximadamente 1 segundo", + "receivedImage_incomplete": "Imagen incompleta — {received} de {total} paquetes llegados", + "receivedImage_corrupt": "La imagen no pudo ser reconstruida", + "receivedImage_decoderMissing": "Imagen recibida — la decodificación de la imagen no funciona", + "receivedImage_evicted": "Imagen ya no almacenada", + "receivedImage_retry": "Inténtalo de nuevo", + "receivedImage_decodeAgain": "Decodificar de nuevo", + "receivedImage_openSettings": "Configurar", + "receivedImage_tapToProcess": "Toque para procesar", + "receivedImage_awaiting": "{bytes} bytes · {packets} {packets, plural, =1{paquete} other{paquetes}}", + "imageSend_secondsValue": "{seconds} segundos", + "imageSend_minutesSecondsValue": "{minutes} min {seconds} s" } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 24dbf401..6b7a28f4 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -2739,5 +2739,227 @@ "pathMap_noLocation": "Aucune localisation", "pathMap_followPacket": "Verrouiller la vue sur le paquet", "pathMap_unfollowPacket": "Déverrouiller la vue du paquet", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Régions", + "settings_regionSettingsSubtitle": "Gérer les régions stockées", + "settings_regionManagement_screenTitle": "Gestion de région", + "settings_regionNameHint": "Entrer le nom de la région", + "settings_regionAddRegion": "Ajouter une région", + "settings_regionFetchRegions": "Récupérer les régions à partir des répéteurs", + "settings_regionFetchRegionsFail": "Aucune région n'a été trouvée", + "settings_regionFetchRegionsAlreadyExists": "Cette région a déjà été ajoutée", + "settings_regionName": "Nom de la région", + "settings_regionDeleted": "Région supprimée", + "settings_deleteRegion": "Supprimer la région", + "settings_deleteRegionConfirm": "Supprimez {region} de la liste des régions ?", + "settings_infoHardware": "Matériel", + "settings_infoFirmware": "Firmware", + "repeater_pathHashModeOption0": "0 - 1 octet", + "repeater_pathHashModeOption1": "1 à 2 octets", + "repeater_pathHashModeOption2": "2 à 3 octets", + "repeater_pathHashModeOption3": "3 à 4 octets", + "appSettings_batteryLipoHv": "Tension élevée LiPo (3,0-4,35 V)", + "channels_regionSetTo": "Région : {region}", + "channels_regionNotSet": "Région : aucune", + "channels_regionSelect_Title": "Choisissez une région", + "channels_clearRegion": "Zone dégagée", + "chat_sendImage": "Envoyer l'image", + "chat_imagePickFailed": "Je n'ai pas pu ouvrir cette image", + "chat_receivedGif": "Reçu un GIF", + "repeater_keySettings": "Modifier les clés d'identité", + "repeater_keySettingsSubtitle": "Modifier la paire de clés publique/privée", + "repeater_prvKey": "Clé privée", + "repeater_prvKeyHelper": "Une nouvelle clé privée pour le répéteur, une chaîne hexadécimale de 128 caractères.", + "repeater_generatePrvKey": "Générez une paire de clés aléatoire", + "repeater_stopGeneratingPrvKey": "Arrêter la recherche de la paire de clés", + "repeater_pubKey": "Clé publique", + "repeater_pubKeyHelper": "Voici la clé publique associée à la clé privée générée. Vous ne pouvez pas la définir directement.", + "repeater_pubKeyPrefix": "Préfixe souhaité", + "repeater_pubKeyPrefixHelper": "Trouvez une clé publique qui commence par ces chiffres hexadécimaux. Nombre de tentatives nécessaires : {tries}.", + "imageMessages_enableTitle": "Messages avec images", + "imageMessages_enableSubtitle": "Envoyer des images via le maillage. Nécessite un téléchargement unique du modèle d'image.", + "imageMessages_modelSectionTitle": "Modèle d'image", + "imageMessages_downloadModel": "Télécharger", + "imageMessages_cancelDownload": "Annuler", + "imageMessages_removeModel": "Supprimer le modèle", + "imageMessages_modelReady": "Prêt", + "imageMessages_modelNotPublished": "Non publié — cette version ne peut pas le télécharger.", + "imageMessages_downloadFailed": "Le modèle d'image ne pouvait pas être téléchargé.", + "imageMessages_autoProcessTitle": "Traiter automatiquement les images", + "imageMessages_autoProcessSubtitle": "Reconstruisez chaque image dès son arrivée. Cela utilise environ 2 Go de mémoire pendant une seconde à chaque fois ; désactivez la reconstruction au toucher pour éviter cela.", + "imageSend_title": "Envoyer l'image", + "imageSend_cropNote": "Redimensionné à 512 × 512 · le rapport d’aspect n’a pas été conservé", + "imageSend_originalSize": "Texte original\n\nVeuillez traduire le texte suivant en français :", + "imageSend_onAirSize": "En direct", + "imageSend_quality": "Qualité", + "imageSend_qualityStandard": "Standard", + "imageSend_qualityHigh": "Haut", + "imageSend_packetsLabel": "Paquets", + "imageSend_airtimeLabel": "Durée de diffusion", + "imageSend_sizeLabel": "Charge utile", + "imageSend_packetsCount": "{count} {count, plural, =1{paquet} other{paquets}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Réglages de la radio inconnus", + "imageSend_radioUnknownBody": "Connectez-vous à un appareil afin que l'heure de diffusion puisse être calculée.", + "imageSend_longSendTitle": "Longue transmission", + "imageSend_longSendBody": "Cela maintiendra la chaîne pendant environ {duration}.", + "imageSend_floodNote": "Routage des inondations : chaque répéteur dans la zone retransmet chaque paquet, de sorte que le canal reste occupé plus longtemps que cela.", + "imageSend_parityTitle": "Paquet de récupération", + "imageSend_paritySubtitle": "Un paquet supplémentaire. Les messages de groupe ne sont pas reconnus, ce qui permet au destinataire de reconstruire l'image si un seul paquet est perdu.", + "imageSend_send": "Envoyer", + "imageSend_cancel": "Annuler", + "imageSend_encodeFailed": "Cette image ne peut pas être encodée.", + "imageSend_codecDownloading": "Le modèle d'image est toujours en téléchargement.", + "imageSend_codecUnavailable": "L'envoi d'images n'est pas disponible sur cet appareil.", + "imageSend_codecDisabled": "Les messages d'images sont désactivés dans les paramètres.", + "imageSend_deviceUnsupported": "Cette radio ne peut pas envoyer de paquets d'images. Connectez un appareil exécutant le firmware compagnon version 13 ou ultérieure.", + "imageSend_directMessagesUnsupported": "Les images se déplacent en tant que données de groupe, elles ne peuvent donc être envoyées que sur un canal — et non par message direct.", + "imageSend_tooLarge": "Cette image a été encodée en plus de paquets que le format de maillage ne permet.", + "imageSend_sentConfirmation": "Image envoyée en {count} {count, plural, =1{paquet} other{paquets}}.", + "imageSend_sendFailed": "L'image n'a pas pu être envoyée : {error}", + "imageSend_sendingProgress": "Envoi de l'image — paquet {sent} sur {total}", + "receivedImage_senderPrefix": "Nœud {prefix}", + "receivedImage_incoming": "{received} sur {total} paquets", + "receivedImage_queued": "En attendant de décoder", + "receivedImage_tapToDecode": "Tapez pour décoder", + "receivedImage_decoding": "Reconstitution… d’environ 1 s", + "receivedImage_incomplete": "Image incomplète — {received} sur {total} paquets reçus", + "receivedImage_corrupt": "L'image ne pouvait pas être reconstruite", + "receivedImage_decoderMissing": "Image reçue — le décodage de l'image est interrompu", + "receivedImage_evicted": "Image non stockée", + "receivedImage_retry": "Réessayez", + "receivedImage_decodeAgain": "Décoder à nouveau", + "receivedImage_openSettings": "Mettre en place", + "receivedImage_tapToProcess": "Tapez pour traiter", + "receivedImage_awaiting": "{bytes} octets · {packets} {packets, plural, =1{paquet} other{paquets}}", + "imageSend_secondsValue": "{seconds} s", + "imageSend_minutesSecondsValue": "{minutes} minutes {seconds} secondes" } diff --git a/lib/l10n/app_hu.arb b/lib/l10n/app_hu.arb index c174c44c..6df4f5bb 100644 --- a/lib/l10n/app_hu.arb +++ b/lib/l10n/app_hu.arb @@ -2643,5 +2643,227 @@ "pathMap_noLocation": "Nincs hely", "pathMap_followPacket": "Nézet zárolása a csomaghoz", "pathMap_unfollowPacket": "A nézet feloldása a csomagból", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Tájak", + "settings_regionSettingsSubtitle": "Kincstani megjelenítette gyakorlatos területeket", + "settings_regionManagement_screenTitle": "Regionális Kezelés", + "settings_regionNameHint": "Felhasználja a regioni név", + "settings_regionAddRegion": "Egyes region", + "settings_regionFetchRegions": "Féregelmezők a repeaterekból", + "settings_regionFetchRegionsFail": "Nem található egyéb területek", + "settings_regionFetchRegionsAlreadyExists": "Ez a terítet nemisértették meg.", + "settings_regionName": "Feldúr Neve", + "settings_regionDeleted": "Felült region", + "settings_deleteRegion": "Felajánlatos Tér", + "settings_deleteRegionConfirm": "Kell kiszámítsd a {region}ot a részekre?", + "settings_infoHardware": "Hardverő", + "settings_infoFirmware": "Firmver", + "repeater_pathHashModeOption0": "0 - 1 byte", + "repeater_pathHashModeOption1": "1 - 2 szavak", + "repeater_pathHashModeOption2": "2 - 3 bajt", + "repeater_pathHashModeOption3": "3 - 4 bajt", + "appSettings_batteryLipoHv": "LiPo HV (3.0-4.35V)", + "channels_regionSetTo": "Tájékoztatás: A {region} -t\n\nEz a tájékoztatás a magyar nyelvben a következően kell szóva:\n\nTájékoztatás: A {region} -t", + "channels_regionNotSet": "Tájékoztetés: nem", + "channels_regionSelect_Title": "Válassz egy regionot", + "channels_clearRegion": "Kéres kör", + "chat_sendImage": "Felhasználj az image", + "chat_imagePickFailed": "Nem tudtam ezt a fenti fényre kapni", + "chat_receivedGif": "GIF-ot kapott", + "repeater_keySettings": "Képzőítsekei jelölt", + "repeater_keySettingsSubtitle": "Közelítse a közlekedési/private képlékt", + "repeater_prvKey": "Kis házas", + "repeater_prvKeyHelper": "Kínai nyelvben:\n\nA repeteróhoz új képes kód, 128 karakteri hex-kód.", + "repeater_generatePrvKey": "Egy random képléktár generáld meg", + "repeater_stopGeneratingPrvKey": "Kéypair szavakat kérdéset kaphatás", + "repeater_pubKey": "Kiváló kiegészítő", + "repeater_pubKeyHelper": "Ez a kiváló kód, amely tükrözi a gyártott kiegészítő kódot. Ezet nem lehet megjelenítani direktusan.", + "repeater_pubKeyPrefix": "Kiváló prefix", + "repeater_pubKeyPrefixHelper": "Kiválasztsa meg a közös kódot, amely az alábbi hex-kifüggőnek előre van. Várható kiválasztások száma: {tries}.", + "imageMessages_enableTitle": "Fenti hírüket biztosítani", + "imageMessages_enableSubtitle": "Fényokat a hálózatban küldd el. Egyértelmű fénymodell hozzáadásra kell.", + "imageMessages_modelSectionTitle": "Image model", + "imageMessages_downloadModel": "Hozzáladás", + "imageMessages_cancelDownload": "Színviselés", + "imageMessages_removeModel": "Kisnövezdés", + "imageMessages_modelReady": "Hozzá", + "imageMessages_modelNotPublished": "Érkeztetve nem — ez a építési módszert nem lehet lejobbítani.", + "imageMessages_downloadFailed": "Életmódelmát nem tudtam hozni.", + "imageMessages_autoProcessTitle": "Automatikusan kínaltatja fénybetek", + "imageMessages_autoProcessSubtitle": "Minden fenti image-t kiválasztsa meg, amikor érkezik. Minden más esetben 2 GB fényre kell szükséges; megoldja a rekonstruálisi a támogatásra egy klikkel.", + "imageSend_title": "Felhasználj az image", + "imageSend_cropNote": "512 × 512 órák számára megosztva · képszöget nem biztosítva", + "imageSend_originalSize": "Következtetés:", + "imageSend_onAirSize": "Erőben", + "imageSend_quality": "Hosszú Képesség", + "imageSend_qualityStandard": "Standard", + "imageSend_qualityHigh": "High: Magas", + "imageSend_packetsLabel": "Paketek", + "imageSend_airtimeLabel": "Kiválasztás a fent", + "imageSend_sizeLabel": "Kártya", + "imageSend_packetsCount": "{count} {count, plural, =1{csomag} other{csomag}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Radiooldalok nem tudom", + "imageSend_radioUnknownBody": "Kizárdhoz kapcsolódd a rendszert, hogy a súly az az álló időt lehet elismerni.", + "imageSend_longSendTitle": "Uzun hírás", + "imageSend_longSendBody": "Ez megbízható a kanal {duration}-n.", + "imageSend_floodNote": "Fúró irányozás: Minden repeater a fúró körüléggel megköveti mindkét paketet, ezért a kanal eltartja más a lehetséges időt.", + "imageSend_parityTitle": "Korzolás paksa", + "imageSend_paritySubtitle": "Egy kibőbbes kapszula. Gruppos hírselek nem érkezik, ezért az empfangó nem kell elismerni a jel, ha egy egyes kapszula kaland, hogy nem teljesen érkezz.", + "imageSend_send": "Keresés", + "imageSend_cancel": "Színviselés", + "imageSend_encodeFailed": "Ez a fényet nem tudtam kódolni.", + "imageSend_codecDownloading": "Érdekesz az image model megstálása még van.", + "imageSend_codecUnavailable": "Felhasználó észintje nem kapható ezen a rendszert.", + "imageSend_codecDisabled": "Image hírletek belsőoldal elkalmáznak a konfigurációban.", + "imageSend_deviceUnsupported": "Ez a radio nem tudja verseni színekfájltakat. Habilítd a kompatibilis firmware 13 vagy újabb versionot kapcsált eszközet.", + "imageSend_directMessagesUnsupported": "Fényiak gyakorolják grupos adatban, ezért nem lehetek versenek egy hozzáfűzésre, csak egy kanalra.", + "imageSend_tooLarge": "A figyelmetes fentet nem kínálhat a körközlettel ismétálás elterjesztésére.", + "imageSend_sentConfirmation": "Kép elküldve {count} {count, plural, =1{csomagként} other{csomagként}}.", + "imageSend_sendFailed": "Fentami nem tűnik: {error}", + "imageSend_sendingProgress": "Felhasználó: Lehet a következőkét kifejezetet – {sent} paket {total}", + "receivedImage_senderPrefix": "Node {prefix}", + "receivedImage_incoming": "Kulcsfontosságú: Kiválasztja meg a {received} {total} paketot", + "receivedImage_queued": "Kódoláshoz küldőzve", + "receivedImage_tapToDecode": "Kódoláshoz klikd el", + "receivedImage_decoding": "Korlátozás… egy 1 perc után", + "receivedImage_incomplete": "Kérem, az {received} {total} paketet kapottak.", + "receivedImage_corrupt": "Fény nem tudtam megrealítani", + "receivedImage_decoderMissing": "Kezd az image — image decodálás nem kapható", + "receivedImage_evicted": "Fény nem tartalmazva", + "receivedImage_retry": "Kérem kell próbálni", + "receivedImage_decodeAgain": "Kodoldó", + "receivedImage_openSettings": "Jelzése", + "receivedImage_tapToProcess": "Klikd a feljelenítést", + "receivedImage_awaiting": "{bytes} bájt · {packets} {packets, plural, =1{csomag} other{csomag}}", + "imageSend_secondsValue": "{seconds} sekünd\n\n(Note: The placeholder {seconds} is kept unchanged as requested.)", + "imageSend_minutesSecondsValue": "{minutes} per {seconds} sekünd\n\n(Note: The original text appears to be a placeholder format rather than a complete sentence. The translation reflects the literal structure while preserving the placeholders as requested.)" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 00de2511..70b74dcb 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1736,7 +1736,6 @@ "settings_locationGPSEnableSubtitle": "Abilita l'aggiornamento automatico della posizione tramite GPS.", "settings_locationIntervalSec": "Intervallo GPS (Secondi)", "settings_locationIntervalInvalid": "L'intervallo deve essere di almeno 60 secondi e inferiore a 86400 secondi.", - "contacts_manageRoom": "Gestisci server stanza", "room_management": "Gestione del Server di Camera", "@community_joinConfirmation": { "placeholders": { @@ -1946,7 +1945,6 @@ } }, "notification_receivedNewMessage": "Nuovo messaggio ricevuto", - "notification_receivedNewMessage": "Nuovo messaggio ricevuto", "settings_gpxExportRepeaters": "Esporta ripetitori / server di stanza in GPX", "settings_gpxExportContacts": "Esporta compagni in GPX", "settings_gpxExportSuccess": "Esportazione del file GPX completata con successo.", @@ -2121,52 +2119,7 @@ "listFilter_addToFavorites": "Aggiungi ai preferiti", "listFilter_removeFromFavorites": "Rimuovi dai preferiti", "listFilter_favorites": "Preferiti", - "@contacts_searchFavorites": { - "placeholders": { - "number": { - "type": "int" - }, - "str": { - "type": "String" - } - } - }, - "@contacts_searchUsers": { - "placeholders": { - "number": { - "type": "int" - }, - "str": { - "type": "String" - } - } - }, - "@contacts_searchRepeaters": { - "placeholders": { - "number": { - "type": "int" - }, - "str": { - "type": "String" - } - } - }, - "@contacts_searchRoomServers": { - "placeholders": { - "number": { - "type": "int" - }, - "str": { - "type": "String" - } - } - }, - "contacts_searchUsers": "Cerca {number}{str} utenti...", - "contacts_searchContactsNoNumber": "Cerca contatti...", - "contacts_searchFavorites": "Cerca {number}{str} preferiti...", "contacts_unread": "Non letti", - "contacts_searchRepeaters": "Cerca {number}{str} ripetitori...", - "contacts_searchRoomServers": "Cerca {number}{str} server stanza...", "contactsSettings_title": "Impostazioni dei contatti", "settings_contactSettings": "Impostazioni di contatto", "contactsSettings_otherTitle": "Altre impostazioni relative ai contatti", @@ -2786,5 +2739,227 @@ "pathMap_noLocation": "Nessuna posizione", "pathMap_followPacket": "Blocca la vista sul pacchetto", "pathMap_unfollowPacket": "Sblocca la vista dal pacchetto", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Regioni", + "settings_regionSettingsSubtitle": "Gestione delle regioni salvate", + "settings_regionManagement_screenTitle": "Gestione Regionale", + "settings_regionNameHint": "Inserisci il nome della regione", + "settings_regionAddRegion": "Aggiungi regione", + "settings_regionFetchRegions": "Recupera le regioni dai ripetitori", + "settings_regionFetchRegionsFail": "Non sono state trovate regioni", + "settings_regionFetchRegionsAlreadyExists": "Questa regione è già stata aggiunta", + "settings_regionName": "Nome della Regione", + "settings_regionDeleted": "Regione cancellata", + "settings_deleteRegion": "Elimina Regione", + "settings_deleteRegionConfirm": "Rimuovere \"{region}\" dalla lista delle regioni?", + "settings_infoHardware": "Hardware", + "settings_infoFirmware": "Firmware", + "repeater_pathHashModeOption0": "0 - 1 byte", + "repeater_pathHashModeOption1": "1 - 2 byte", + "repeater_pathHashModeOption2": "2 - 3 byte", + "repeater_pathHashModeOption3": "3 - 4 byte", + "appSettings_batteryLipoHv": "LiPo HV (3,0-4,35 V)", + "channels_regionSetTo": "Regione: {region}", + "channels_regionNotSet": "Regione: nessuna", + "channels_regionSelect_Title": "Scegli una regione", + "channels_clearRegion": "Zona chiara", + "chat_sendImage": "Invia immagine", + "chat_imagePickFailed": "Non sono riuscito ad aprire quell'immagine", + "chat_receivedGif": "Ricevuto un GIF", + "repeater_keySettings": "Cambia le Chiavi di Identità", + "repeater_keySettingsSubtitle": "Cambia la coppia di chiavi pubblica/privata", + "repeater_prvKey": "Chiave privata", + "repeater_prvKeyHelper": "Una nuova chiave privata per il ripetitore, una stringa esadecimale di 128 caratteri.", + "repeater_generatePrvKey": "Genera una coppia di chiavi casuale", + "repeater_stopGeneratingPrvKey": "Interrompi la ricerca della coppia di chiavi", + "repeater_pubKey": "Chiave pubblica", + "repeater_pubKeyHelper": "Questa è la chiave pubblica che accompagna la chiave privata generata. Non è possibile impostarla direttamente.", + "repeater_pubKeyPrefix": "Prefisso desiderato", + "repeater_pubKeyPrefixHelper": "Trova una chiave pubblica che inizia con queste cifre esadecimali. Tentativi necessari previsti: {tries}.", + "imageMessages_enableTitle": "Messaggi con immagini", + "imageMessages_enableSubtitle": "Invia le immagini tramite la mesh. È necessario scaricare il modello dell'immagine una tantum.", + "imageMessages_modelSectionTitle": "Modello di immagine", + "imageMessages_downloadModel": "Scarica", + "imageMessages_cancelDownload": "Annullare", + "imageMessages_removeModel": "Rimuovi il modello", + "imageMessages_modelReady": "Pronto", + "imageMessages_modelNotPublished": "Non pubblicato ancora — questa versione non può scaricarlo.", + "imageMessages_downloadFailed": "Il modello di immagine non può essere scaricato.", + "imageMessages_autoProcessTitle": "Elabora automaticamente le immagini", + "imageMessages_autoProcessSubtitle": "Ricostruisci ogni immagine non appena arriva. Utilizza circa 2 GB di memoria per un secondo ogni volta; disattiva la ricostruzione con un semplice tocco.", + "imageSend_title": "Invia immagine", + "imageSend_cropNote": "Ridimensionato a 512 × 512 · rapporto d'aspetto non conservato", + "imageSend_originalSize": "Traduzione:\n\nOriginal text:\n\nPlease translate the following English text into Italian:\n\nOriginal text:\n\n(No original English text provided)", + "imageSend_onAirSize": "In onda", + "imageSend_quality": "Qualità", + "imageSend_qualityStandard": "Standard", + "imageSend_qualityHigh": "Alto", + "imageSend_packetsLabel": "Pacchetti", + "imageSend_airtimeLabel": "Tempo in onda", + "imageSend_sizeLabel": "Carico utile", + "imageSend_packetsCount": "{count} {count, plural, =1{pacchetto} other{pacchetti}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Impostazioni radio sconosciute", + "imageSend_radioUnknownBody": "Collegati a un dispositivo in modo che si possa calcolare l'orario di trasmissione.", + "imageSend_longSendTitle": "Lunga trasmissione", + "imageSend_longSendBody": "Questo manterrà il canale per circa {duration}.", + "imageSend_floodNote": "Instradamento delle inondazioni: ogni ripetitore nel raggio ritrasmette ogni pacchetto, quindi il canale rimane occupato più a lungo.", + "imageSend_parityTitle": "Pacchetto di recupero", + "imageSend_paritySubtitle": "Un pacchetto aggiuntivo. I messaggi di gruppo non vengono riconosciuti, quindi questo permette al destinatario di ricostruire l'immagine se un singolo pacchetto viene perso.", + "imageSend_send": "Invia", + "imageSend_cancel": "Annullare", + "imageSend_encodeFailed": "Questa immagine non può essere codificata.", + "imageSend_codecDownloading": "Il modello di immagine sta ancora scaricando.", + "imageSend_codecUnavailable": "L'invio di immagini non è disponibile su questo dispositivo.", + "imageSend_codecDisabled": "I messaggi immagine sono disattivati nelle impostazioni.", + "imageSend_deviceUnsupported": "Questa radio non può inviare pacchetti di immagini. Collegare un dispositivo con firmware companion versione 13 o successiva.", + "imageSend_directMessagesUnsupported": "Le immagini viaggiano come dati di gruppo, quindi possono essere inviate solo a un canale — non tramite messaggio diretto.", + "imageSend_tooLarge": "Quella immagine è stata codificata in un numero di pacchetti superiore a quello consentito dal formato mesh.", + "imageSend_sentConfirmation": "Immagine inviata come {count} {count, plural, =1{pacchetto} other{pacchetti}}.", + "imageSend_sendFailed": "L'immagine non può essere inviata: {error}", + "imageSend_sendingProgress": "Invio immagine — pacchetto {sent} di {total}", + "receivedImage_senderPrefix": "Nodo {prefix}", + "receivedImage_incoming": "{received} di {total} pacchetti", + "receivedImage_queued": "In attesa di decodificare", + "receivedImage_tapToDecode": "Tocca per decodificare", + "receivedImage_decoding": "Ricostruire… circa 1 s", + "receivedImage_incomplete": "Immagine incompleta — {received} su {total} pacchetti ricevuti", + "receivedImage_corrupt": "L'immagine non potrebbe essere ricostruita", + "receivedImage_decoderMissing": "Immagine ricevuta — decodifica dell'immagine non funzionante", + "receivedImage_evicted": "Immagine non più memorizzata", + "receivedImage_retry": "Prova ancora", + "receivedImage_decodeAgain": "Decodifica di nuovo", + "receivedImage_openSettings": "Imposta", + "receivedImage_tapToProcess": "Premi per elaborare", + "receivedImage_awaiting": "{bytes} byte · {packets} {packets, plural, =1{pacchetto} other{pacchetti}}", + "imageSend_secondsValue": "{seconds} secondi", + "imageSend_minutesSecondsValue": "{minutes} min {seconds} s" } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index 51021664..26ec3caf 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -28,11 +28,11 @@ "common_enable": "有効にする", "common_disable": "無効にする", "common_undo": "元に戻す", - "messageStatus_sent": "送信済み", - "messageStatus_delivered": "配信済み", - "messageStatus_pending": "送信中", - "messageStatus_failed": "送信に失敗", - "messageStatus_repeated": "重複受信", + "messageStatus_sent": "送信", + "messageStatus_delivered": "配達", + "messageStatus_pending": "送信", + "messageStatus_failed": "送信できませんでした", + "messageStatus_repeated": "何度も聞いた", "common_autoRefresh": "自動更新", "common_interval": "間隔", "common_reboot": "再起動", @@ -2597,13 +2597,7 @@ } } }, - "messageStatus_delivered": "配達", - "common_undo": "元に戻す", - "messageStatus_pending": "送信", - "messageStatus_sent": "送信", - "messageStatus_failed": "送信できませんでした", "contacts_moreOptions": "さらに多くの選択肢", - "messageStatus_repeated": "何度も聞いた", "contacts_searchOpen": "連絡先を検索する", "contacts_searchClose": "検索を終了", "routing_modeFlood": "フラッド", @@ -2745,5 +2739,227 @@ "pathMap_noLocation": "位置情報なし", "pathMap_followPacket": "パケットを追跡", "pathMap_unfollowPacket": "パケットの追跡を解除", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "地域", + "settings_regionSettingsSubtitle": "保存された領域の管理", + "settings_regionManagement_screenTitle": "地域管理", + "settings_regionNameHint": "地域名を入力してください", + "settings_regionAddRegion": "地域を追加", + "settings_regionFetchRegions": "リピーターからのフェッチ地域", + "settings_regionFetchRegionsFail": "地域は見つかりませんでした", + "settings_regionFetchRegionsAlreadyExists": "この地域はすでに追加されています。", + "settings_regionName": "地域名", + "settings_regionDeleted": "地域が削除されました", + "settings_deleteRegion": "地域を削除", + "settings_deleteRegionConfirm": "{region} を地域リストから削除しますか?", + "settings_infoHardware": "ハードウェア", + "settings_infoFirmware": "ファームウェア", + "repeater_pathHashModeOption0": "0 - 1バイト", + "repeater_pathHashModeOption1": "1〜2バイト", + "repeater_pathHashModeOption2": "2〜3バイト", + "repeater_pathHashModeOption3": "3〜4バイト", + "appSettings_batteryLipoHv": "リポバッテリー HV(3.0〜4.35V)", + "channels_regionSetTo": "地域:{region}", + "channels_regionNotSet": "地域:なし", + "channels_regionSelect_Title": "地域を選択する", + "channels_clearRegion": "クリアな地域", + "chat_sendImage": "画像を送信", + "chat_imagePickFailed": "その画像を開けませんでした", + "chat_receivedGif": "GIFを受け取りました", + "repeater_keySettings": "アイデンティティキーの変更", + "repeater_keySettingsSubtitle": "公開鍵/秘密鍵を変更する", + "repeater_prvKey": "プライベートキー", + "repeater_prvKeyHelper": "リピーター用の新しいプライベートキー。128文字の16進文字列です。", + "repeater_generatePrvKey": "ランダムな鍵ペアを生成する", + "repeater_stopGeneratingPrvKey": "キーペアの検索を中断", + "repeater_pubKey": "公開鍵", + "repeater_pubKeyHelper": "これは生成された秘密鍵に対応する公開鍵です。直接設定することはできません。", + "repeater_pubKeyPrefix": "希望する接頭辞", + "repeater_pubKeyPrefixHelper": "これらの16進数で始まる公開鍵を見つけてください。予想される試行回数: {tries}。", + "imageMessages_enableTitle": "画像メッセージを有効にする", + "imageMessages_enableSubtitle": "メッシュ経由で画像を送信してください。画像モデルを一度限りのダウンロードが必要です。", + "imageMessages_modelSectionTitle": "画像モデル", + "imageMessages_downloadModel": "ダウンロード", + "imageMessages_cancelDownload": "キャンセル", + "imageMessages_removeModel": "モデルを削除", + "imageMessages_modelReady": "準備完了", + "imageMessages_modelNotPublished": "まだ公開されていません — このビルドではダウンロードできません。", + "imageMessages_downloadFailed": "画像モデルがダウンロードできませんでした。", + "imageMessages_autoProcessTitle": "画像を自動的に処理する", + "imageMessages_autoProcessSubtitle": "画像が届き次第、すぐに再構築してください。1回あたり約2GBのメモリを使用します。タップで再構築を解除できます。", + "imageSend_title": "画像を送信", + "imageSend_cropNote": "512 × 512にリサイズされました。アスペクト比は保持されませんでした。", + "imageSend_originalSize": "原文:\nThe early morning light filtered through the curtains, casting a soft glow on the room.\n\n翻訳:\n早朝の光がカーテンをすり抜け、部屋に柔らかな光を投げかけていた。", + "imageSend_onAirSize": "放送中", + "imageSend_quality": "品質", + "imageSend_qualityStandard": "標準", + "imageSend_qualityHigh": "ハイ", + "imageSend_packetsLabel": "パケット", + "imageSend_airtimeLabel": "放送時間", + "imageSend_sizeLabel": "ペイロード", + "imageSend_packetsCount": "{count} {count, plural, =1{パケット} other{パケット}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "ラジオの設定が不明です", + "imageSend_radioUnknownBody": "放送時間の計算ができるように、デバイスに接続してください。", + "imageSend_longSendTitle": "長距離伝送", + "imageSend_longSendBody": "このチャンネルは約 {duration} 間保持されます。", + "imageSend_floodNote": "洪水ルーティング:範囲内の各リピーターが各パケットを再送信するため、チャネルはこれよりも長く占有されたままになります。", + "imageSend_parityTitle": "回復パケット", + "imageSend_paritySubtitle": "追加のパケットが1つあります。グループメッセージは確認されないため、1つのパケットが失われても受信者が画像を再構築できます。", + "imageSend_send": "送る", + "imageSend_cancel": "キャンセル", + "imageSend_encodeFailed": "この画像はエンコードできませんでした。", + "imageSend_codecDownloading": "画像モデルはまだダウンロード中です。", + "imageSend_codecUnavailable": "このデバイスでは画像送信が利用できません。", + "imageSend_codecDisabled": "設定で画像メッセージはオフになっています。", + "imageSend_deviceUnsupported": "このラジオは画像パケットを送信できません。コンパニオン ファームウェア 13 以降を実行しているデバイスを接続してください。", + "imageSend_directMessagesUnsupported": "画像はグループデータとして送信されるため、ダイレクトメッセージではなくチャンネルに送ることができます。", + "imageSend_tooLarge": "その画像は、メッシュ形式が許容するよりも多くのパケットにエンコードされています。", + "imageSend_sentConfirmation": "{count} {count, plural, =1{パケット} other{パケット}}として画像を送信しました。", + "imageSend_sendFailed": "画像を送信できませんでした:{error}", + "imageSend_sendingProgress": "画像送信 — パケット {sent} 件、合計 {total} 件", + "receivedImage_senderPrefix": "ノード {prefix}", + "receivedImage_incoming": "{total} パケット中 {received} パケット", + "receivedImage_queued": "復号を待っている", + "receivedImage_tapToDecode": "デコードするにはタップしてください。", + "receivedImage_decoding": "再構築… 約1秒", + "receivedImage_incomplete": "画像が不完全です — {total} パケット中 {received} パケットが到着しました", + "receivedImage_corrupt": "画像を再構成することはできませんでした", + "receivedImage_decoderMissing": "画像を受信しました — 画像のデコードが失敗しました", + "receivedImage_evicted": "画像はもう保存されていません", + "receivedImage_retry": "もう一度試してください", + "receivedImage_decodeAgain": "もう一度デコードしてください", + "receivedImage_openSettings": "設定する", + "receivedImage_tapToProcess": "処理するにはタップしてください", + "receivedImage_awaiting": "{bytes} バイト・{packets} {packets, plural, =1{パケット} other{パケット}}", + "imageSend_secondsValue": "{seconds}秒", + "imageSend_minutesSecondsValue": "{minutes}分 {seconds}秒" } diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index d619973e..686e02e1 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -2495,13 +2495,10 @@ } } }, - "messageStatus_pending": "발송", - "messageStatus_sent": "발송", - "messageStatus_delivered": "배송 완료", - "common_undo": "되돌리기", "messageStatus_pending": "전송 중", "messageStatus_sent": "전송됨", "messageStatus_delivered": "전달됨", + "common_undo": "되돌리기", "messageStatus_failed": "전송 실패", "messageStatus_repeated": "반복 수신됨", "contacts_searchOpen": "연락처 검색", @@ -2742,5 +2739,227 @@ "type": "String" } } - } + }, + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "지역", + "settings_regionSettingsSubtitle": "저장된 지역 관리", + "settings_regionManagement_screenTitle": "지역 관리", + "settings_regionNameHint": "지역 이름 입력", + "settings_regionAddRegion": "지역 추가", + "settings_regionFetchRegions": "리피터에서 지역을 가져옵니다.", + "settings_regionFetchRegionsFail": "어떤 지역도 발견되지 않았습니다.", + "settings_regionFetchRegionsAlreadyExists": "이 지역은 이미 추가되었습니다.", + "settings_regionName": "지역 이름", + "settings_regionDeleted": "지역 삭제", + "settings_deleteRegion": "지역 삭제", + "settings_deleteRegionConfirm": "\"{region}\"을(를) 지역 목록에서 삭제하시겠습니까?", + "settings_infoHardware": "하드웨어", + "settings_infoFirmware": "펌웨어", + "repeater_pathHashModeOption0": "0 - 1 바이트", + "repeater_pathHashModeOption1": "1~2 바이트", + "repeater_pathHashModeOption2": "2 - 3 바이트", + "repeater_pathHashModeOption3": "3 - 4 바이트", + "appSettings_batteryLipoHv": "리포 HV (3.0-4.35V)", + "channels_regionSetTo": "지역: {region}", + "channels_regionNotSet": "지역: 없음", + "channels_regionSelect_Title": "지역을 선택하세요", + "channels_clearRegion": "명확한 지역", + "chat_sendImage": "이미지를 보내세요", + "chat_imagePickFailed": "그 이미지를 열 수 없었어요.", + "chat_receivedGif": "GIF를 받았습니다", + "repeater_keySettings": "신원 키 변경", + "repeater_keySettingsSubtitle": "공개/비공개 키 쌍을 변경하세요", + "repeater_prvKey": "개인 키", + "repeater_prvKeyHelper": "리피터의 새로운 개인 키로, 128자리의 16진수 문자열입니다.", + "repeater_generatePrvKey": "임의의 키 쌍을 생성하세요.", + "repeater_stopGeneratingPrvKey": "키페어 검색 중단", + "repeater_pubKey": "공개 키", + "repeater_pubKeyHelper": "이것은 생성된 개인 키와 함께 사용되는 공개 키입니다. 직접 설정할 수 없습니다.", + "repeater_pubKeyPrefix": "원하는 접두사", + "repeater_pubKeyPrefixHelper": "이러한 16진수로 시작하는 공개 키를 찾으세요. 필요한 시도 횟수: {tries}.", + "imageMessages_enableTitle": "이미지 메시지 활성화", + "imageMessages_enableSubtitle": "메시를 통해 이미지를 전송하세요. 일회성 이미지 모델 다운로드가 필요합니다.", + "imageMessages_modelSectionTitle": "이미지 모델", + "imageMessages_downloadModel": "다운로드", + "imageMessages_cancelDownload": "취소", + "imageMessages_removeModel": "모델 제거", + "imageMessages_modelReady": "준비 완료", + "imageMessages_modelNotPublished": "아직 출판되지 않았습니다 — 이 빌드로는 다운로드할 수 없습니다.", + "imageMessages_downloadFailed": "이미지 모델을 다운로드할 수 없었습니다.", + "imageMessages_autoProcessTitle": "자동으로 프로세스 이미지를 처리합니다.", + "imageMessages_autoProcessSubtitle": "이미지가 도착하는 즉시 재구성하세요. 매번 2GB의 메모리를 사용하며, 탭으로 재구성을 원할 경우 해제하세요.", + "imageSend_title": "이미지를 보내세요", + "imageSend_cropNote": "512 × 512로 크기가 조정되었으며, 종횡비는 유지되지 않았습니다.", + "imageSend_originalSize": "원문 없음", + "imageSend_onAirSize": "방송 중", + "imageSend_quality": "품질", + "imageSend_qualityStandard": "표준", + "imageSend_qualityHigh": "높다", + "imageSend_packetsLabel": "패킷", + "imageSend_airtimeLabel": "방송 시간", + "imageSend_sizeLabel": "페이로드", + "imageSend_packetsCount": "{count} {count, plural, =1{패킷} other{패킷}}", + "imageSend_range": "{min}~{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "라디오 설정 정보 없음", + "imageSend_radioUnknownBody": "방송 시간을 계산할 수 있도록 기기와 연결하세요.", + "imageSend_longSendTitle": "장거리 송신", + "imageSend_longSendBody": "이것은 약 {duration} 동안 채널을 유지할 것입니다.", + "imageSend_floodNote": "홍수 라우팅: 범위 내의 모든 리피터가 각 패킷을 재전송하므로, 채널이 이보다 더 오래 점유 상태를 유지합니다.", + "imageSend_parityTitle": "회복 패킷", + "imageSend_paritySubtitle": "추가 한 개의 패킷입니다. 그룹 메시지는 확인되지 않으므로, 하나의 패킷이 손실되었을 경우 수신자가 이미지를 다시 구성할 수 있습니다.", + "imageSend_send": "보내다", + "imageSend_cancel": "취소", + "imageSend_encodeFailed": "이 이미지는 인코딩할 수 없습니다.", + "imageSend_codecDownloading": "이미지 모델이 아직 다운로드 중입니다.", + "imageSend_codecUnavailable": "이 기기에서는 이미지 전송이 불가능합니다.", + "imageSend_codecDisabled": "설정에서 이미지 메시지가 꺼져 있습니다.", + "imageSend_deviceUnsupported": "이 라디오는 이미지 패킷을 전송할 수 없습니다. 컴패니언 펌웨어 13 이상을 실행하는 장치를 연결해 주세요.", + "imageSend_directMessagesUnsupported": "이미지는 그룹 데이터로 전송되므로, 직접 메시지가 아닌 채널로만 보낼 수 있습니다.", + "imageSend_tooLarge": "그 이미지는 메시 형식이 허용하는 것보다 더 많은 패킷으로 인코딩되었습니다.", + "imageSend_sentConfirmation": "이미지가 {count} {count, plural, =1{패킷} other{패킷}}로 전송되었습니다.", + "imageSend_sendFailed": "이미지를 보낼 수 없습니다: {error}", + "imageSend_sendingProgress": "이미지 전송 — {sent}개의 {total} 패킷", + "receivedImage_senderPrefix": "노드 {prefix}", + "receivedImage_incoming": "{total}개 패킷 중 {received}개", + "receivedImage_queued": "해독을 기다리는 중입니다.", + "receivedImage_tapToDecode": "해독하려면 탭을 누르세요.", + "receivedImage_decoding": "재구성하는… 약 1초 정도", + "receivedImage_incomplete": "이미지 불완전 — {total}개 중 {received}개 패킷 수신됨", + "receivedImage_corrupt": "이미지는 재구성될 수 없습니다.", + "receivedImage_decoderMissing": "수신된 이미지 — 이미지 해독이 되지 않았습니다", + "receivedImage_evicted": "이미지는 더 이상 저장되지 않았습니다.", + "receivedImage_retry": "다시 시도해 보세요", + "receivedImage_decodeAgain": "다시 해독하다", + "receivedImage_openSettings": "설정하다", + "receivedImage_tapToProcess": "처리하려면 탭을 누르세요.", + "receivedImage_awaiting": "{bytes} 바이트 · {packets} {packets, plural, =1{패킷} other{패킷}}", + "imageSend_secondsValue": "{seconds} 초", + "imageSend_minutesSecondsValue": "{minutes}분 {seconds}초" } diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index 4b314d58..55488ba0 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -368,42 +368,44 @@ class AppLocalizationsBg extends AppLocalizations { 'Радио настройките са актуализирани'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Региони'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => + 'Управляне на хранилищни региони'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Регионално управление'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Възразна название на региона'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Добавете регион'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'Извън рептерите от региони'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => + 'Не бъде открити никако региони'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Тата регион е уже добавена'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Регионноименоване'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Регион отстранен'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Удаляне на регион'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Състрясна: отпиште \"$region\" от списка региони?'; } @override @@ -627,10 +629,11 @@ class AppLocalizationsBg extends AppLocalizations { String get settings_infoChannelCount => 'Брой канали'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => 'Оборудование'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => + 'Програмно-оборонни системни программи (фirmware)'; @override String get settings_presets => 'Предварителни настройки'; @@ -748,16 +751,16 @@ class AppLocalizationsBg extends AppLocalizations { String get appSettings_languageUk => 'Украински'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 байт'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 байта'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 байта'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 байта'; @override String get appSettings_enableMessageTracing => @@ -909,7 +912,7 @@ class AppLocalizationsBg extends AppLocalizations { String get appSettings_batteryLipo => 'Литиев полимер (3.0-4.2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'LiPo ВЗГ (3,0-4,35 В)'; @override String get appSettings_mapDisplay => 'Карта за показване'; @@ -1422,17 +1425,17 @@ class AppLocalizationsBg extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'Регион: $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Регион: ние'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Выберете регион'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Чиста зона'; @override String get chat_noMessages => 'Няма съобщения.'; @@ -1490,13 +1493,13 @@ class AppLocalizationsBg extends AppLocalizations { String get chat_sendGif => 'Изпрати GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Изпрати изображение'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Не мог да откривам та изображин'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Получил GIF'; @override String get chat_reply => 'Отговори'; @@ -2736,38 +2739,39 @@ class AppLocalizationsBg extends AppLocalizations { 'Байтовете, използвани за кодиране на идентификатора на този повторител в таговете за откриване на потоци/цикли, са: 0=1 байт (256 идентификатора, до 64 скока), 1=2 байта (65 000 идентификатора, до 32 скока), 2=3 байта (16 милиона идентификатора, до 21 скока). Версиите 1.13 и по-старите фърмуери използват многобайтови пътища - само след като мрежата е актуализирана до версия 1.14 или по-нова.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Изменяне на идентичности ключа'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Замени ключовият пар от публични/частни'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Частни ключ'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Нова приватна ключ на повторчето, 128-символовна шестнадатерична строка.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Генериране на случайна ключи'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Прервана поискна на ключова парта'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Публична ключ'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Та е публичната ключ, която се свързува с генериранта приватна ключ. Трябва да не настройте тоа напрямо.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Желата префикс'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Наискате публична ключ, който почева с този шестнадатницил. Ожидавани проби: $tries.'; } @override @@ -4524,41 +4528,42 @@ class AppLocalizationsBg extends AppLocalizations { String get translation_title => 'Превод'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Абilitiraм изображените сообщения'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Изправате изображения чрез сетката. Треба е одноразовна загрузка модел на изображение.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Изображени модель'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Скачане'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Отмена'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Удалете модель'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Готов'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Еще не опубликовано — тази версия не може да скане.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Модел за изображение не може да бъде скачан.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => + 'Автоматически обрабатвате изображения'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Катализиране на всята изображение сразу по пришествие. Използване на около 2 ГБ на втора пъти; откажете от реконструкцията чаке при натискане.'; @override String get translation_enableTitle => 'Активирайте превода'; @@ -4845,43 +4850,43 @@ class AppLocalizationsBg extends AppLocalizations { String get pathMap_unfollowPacket => 'Спри проследяването на пакета'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Изпрати изображение'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Масштабиран до 512 × 512 · соотношение сторон не съхранясе'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => 'Късно на използване на език:'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'В ефир'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Качество'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => 'Стандарт'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Высок'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Пакети'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Времето на изкъсване'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Баланса'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'пакета', + one: 'пакет', ); return '$count $_temp0'; } @@ -4895,149 +4900,150 @@ class AppLocalizationsBg extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Настройки на радио неизвестни'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Усредете се с устройство, за да се отработа часът на изстъпане.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Долга пресилка'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Тази буде поддержива открит отряд на около $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Руйжинг на превъште: всички ретранслятори в диапазонта превратят всички пакети, тъйа каналят оставря дълше, от този час.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Возобновителен пакет'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Едно дополително пакет. Групни извещания не принимаются, след това разбирателят едно пакетто, какщо е пропущен един пакет.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Отправляй'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Отмена'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => + 'Тази изображение не може да бъде кодирано.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Модел на изображение еще разгрузира.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Изглед отправа не е доступен на този устройство.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Изображенията на извещенията е отключена в настройките.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Та радиота не може да пресылава изображени пакети. Подключите устройство, който работи с компанионски прошивка 13 или новия.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Изображенията се превозводя се как групова информация, следато да се отправят единствено на канал — не в лична вестка.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Таата изображение е кодирано в по-числа пакети, отгоре както формат на сетта разрешава.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'пакета', + one: 'пакет', ); - return 'Image sent as $count $_temp0.'; + return 'Изображението е изпратено като $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Изображение не може да бъде отправено: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Отправка наизображение — пакет $sent от $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Узъдето $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$received от $total пакета'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Ожидането за декодиране'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Натискнете за декодиране'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Повторно… за приблизително 1 секунда'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Изображение неполно — $received от $total пакети отправили'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'Изображение не може да бъде воссоздано'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Получена изображение — разгадка на изображение е вреjan'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Изображение не е хранитено'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Повтори'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Правилейте заново'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Настройте'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Натискнете за обработка'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'пакета', + one: 'пакет', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes байта · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds секунди'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes мин $seconds сек'; } } diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index e50cf9af..81e55c70 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -386,14 +386,15 @@ class AppLocalizationsDe extends AppLocalizations { String get settings_regionAddRegion => 'Region hinzufügen'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'Regionen von Wiederholern abrufen'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => + 'Es wurden keine Regionen gefunden.'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Diese Region wurde bereits hinzugefügt'; @override String get settings_regionName => 'Regions-Name'; @@ -745,16 +746,16 @@ class AppLocalizationsDe extends AppLocalizations { String get appSettings_languageUk => 'Ukrainisch'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 Byte'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 Bytes'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 Bytes'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 Bytes'; @override String get appSettings_enableMessageTracing => @@ -906,7 +907,7 @@ class AppLocalizationsDe extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3,0–4,2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'LiPo HV (3,0–4,35 V)'; @override String get appSettings_mapDisplay => 'Kartendarstellung'; @@ -1491,13 +1492,13 @@ class AppLocalizationsDe extends AppLocalizations { String get chat_sendGif => 'GIF senden'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Bild senden'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Konnte dieses Bild nicht öffnen.'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Erhalten eines GIF'; @override String get chat_reply => 'Antworten'; @@ -2732,38 +2733,40 @@ class AppLocalizationsDe extends AppLocalizations { 'Bytes, die zur Kodierung der ID dieses Repeaters in Flood-Pfad-/Schleifen-Erkennung-Tags verwendet werden. 0 = 1 Byte (256 IDs, bis zu 64 Hops), 1 = 2 Bytes (65.000 IDs, bis zu 32 Hops), 2 = 3 Bytes (16 Millionen IDs, bis zu 21 Hops). Firmware-Versionen 1.13 und älter verwenden mehrstellige Pfade – ab Version 1.14+ wird nur ein Pfad erstellt, sobald das Netzwerk aktiv ist.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Identitätsschlüssel ändern'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Ändern Sie das öffentliche/private Schlüsselpaar'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Privatschlüssel'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Ein neuer privater Schlüssel für den Repeater, eine 128-stellige Hexadezimalzeichenkette.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => + 'Generiere ein zufälliges Schlüsselpaar'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Suchvorgang für Schlüsselpaar unterbrechen'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Öffentlicher Schlüssel'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Dies ist der öffentliche Schlüssel, der zum generierten privaten Schlüssel gehört. Sie können dies nicht direkt festlegen.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Gewünschtes Präfix'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Suchen Sie einen öffentlichen Schlüssel, der mit diesen Hexadezimalziffern beginnt. Erwartete Versuche: $tries.'; } @override @@ -4533,41 +4536,41 @@ class AppLocalizationsDe extends AppLocalizations { String get translation_title => 'Übersetzung'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Bildnachrichten aktivieren'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Bilder über das Netzwerk senden. Einmaliges Herunterladen eines Bildmodells erforderlich.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Bildmodell'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Herunterladen'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Stornieren'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Modell entfernen'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Bereit'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Noch nicht veröffentlicht – dieser Build kann es nicht herunterladen.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Das Bildmodell konnte nicht heruntergeladen werden.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => 'Automatisch Bilder verarbeiten'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Rekonstruiere jedes Bild sofort nach dem Eintreffen. Verbraucht etwa 2 GB Arbeitsspeicher für jede zweite Wiederherstellung; deaktiviere die automatische Rekonstruktion mit einem Tippen.'; @override String get translation_enableTitle => 'Aktivieren Sie die Übersetzung'; @@ -4858,43 +4861,44 @@ class AppLocalizationsDe extends AppLocalizations { String get pathMap_unfollowPacket => 'Fixierung aufheben'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Bild senden'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Für 512 × 512 skaliert · Seitenverhältnis nicht erhalten'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => + 'Originaltext:\n\nThe quick brown fox jumps over the lazy dog.\n\nÜbersetzung:\n\nDer schnelle braune Fuchs springt über den faulen Hund.'; @override String get imageSend_onAirSize => 'On air'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Qualität'; @override String get imageSend_qualityStandard => 'Standard'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Hoch'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Pakete'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Sendezeit'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Nutzlast'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'Pakete', + one: 'Paket', ); return '$count $_temp0'; } @@ -4908,140 +4912,142 @@ class AppLocalizationsDe extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Radioeinstellungen unbekannt'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Verbinden Sie das Gerät, damit die Sendezeit berechnet werden kann.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Lange Übertragung'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Dies hält den Kanal für etwa $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Flutweiterleitung: Jeder Repeater im Bereich leitet jedes Paket weiter, wodurch der Kanal länger als dieser Zeitraum beschäftigt bleibt.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Wiederherstellungspaket'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Ein zusätzliches Paket. Gruppen-Nachrichten werden nicht bestätigt, daher kann der Empfänger das Bild rekonstruieren, falls ein Paket verloren geht.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Senden'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Stornieren'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => + 'Dieses Bild konnte nicht kodiert werden.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Das Bildmodell wird noch heruntergeladen.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Bildversand ist auf diesem Gerät nicht verfügbar.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Bildnachrichten sind in den Einstellungen deaktiviert.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Dieses Radio kann keine Bildpakete senden. Verbinden Sie ein Gerät mit der Companion-Firmware-Version 13 oder neuer.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Bilder werden als Gruppendaten übertragen, daher können sie nur an einen Kanal gesendet werden – nicht per Direktnachricht.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Dieses Bild wurde in mehr Pakete kodiert, als das Mesh-Format zulässt.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'Pakete', + one: 'Paket', ); - return 'Image sent as $count $_temp0.'; + return 'Bild gesendet als $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Das Bild konnte nicht gesendet werden: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Bildversand — Paket $sent von $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Kritisch: Diese Platzhalter $prefix beibehalten.'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$received von $total Paketen'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Warten auf die Entschlüsselung'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Tippen Sie, um zu entschlüsseln'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Rekonstruktion… ca. 1 s'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Bild unvollständig — $received von $total Paketen eingetroffen'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => + 'Das Bild konnte nicht rekonstruiert werden.'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Bild empfangen — Bilddekodierung fehlgeschlagen'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Bild nicht mehr gespeichert'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Versuchen Sie es erneut'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Entschlüsseln Sie es erneut'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Einrichten'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Klicken Sie, um fortzufahren'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'Pakete', + one: 'Paket', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes Bytes · $packets $_temp0'; } @override @@ -5051,6 +5057,6 @@ class AppLocalizationsDe extends AppLocalizations { @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes Min $seconds Sek'; } } diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index 8889ec49..9e0a2968 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -368,42 +368,43 @@ class AppLocalizationsEs extends AppLocalizations { String get settings_radioSettingsUpdated => 'Ajustes de radio actualizados'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Regiones'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => + 'Gestionar regiones almacenadas'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Gestión de Regiones'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Nombre de la región'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Añadir región'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'Obtener regiones de repetidores'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => 'No se encontraron regiones'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Esta región ya ha sido agregada'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Nombre de la Región'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Región eliminada'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Eliminar Región'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return '¿Eliminar \"$region\" de la lista de regiones?'; } @override @@ -1419,17 +1420,17 @@ class AppLocalizationsEs extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'Región: $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Región: ninguna'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Seleccione una región'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Zona despejada'; @override String get chat_noMessages => 'Aún no hay mensajes'; @@ -1487,13 +1488,13 @@ class AppLocalizationsEs extends AppLocalizations { String get chat_sendGif => 'Enviar GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Enviar imagen'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'No pude abrir esa imagen'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Recibido un GIF'; @override String get chat_reply => 'Responder'; @@ -2731,38 +2732,39 @@ class AppLocalizationsEs extends AppLocalizations { 'Bytes utilizados para codificar el ID de este repetidor en las etiquetas de ruta/detección de bucles. 0=1 byte (256 IDs, hasta 64 saltos), 1=2 bytes (65.000 IDs, hasta 32 saltos), 2=3 bytes (16 millones de IDs, hasta 21 saltos). Las versiones 1.13 y anteriores de firmware eliminan rutas de múltiples bytes; solo se detectan una vez que la red está activa en la versión 1.14 o posterior.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Cambiar Claves de Identidad'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Cambiar la pareja de claves pública/privada'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Clave privada'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Una nueva clave privada para el repetidor, una cadena hexadecimal de 128 caracteres.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Genera un par de claves aleatorias'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Interrumpir la búsqueda de par de claves'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Clave pública'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Esta es la clave pública que corresponde a la clave privada generada. No se puede establecer directamente.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Prefijo deseado'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Encuentre una clave pública que comience con estos dígitos hexadecimales. Se esperan $tries intentos.'; } @override @@ -4528,41 +4530,42 @@ class AppLocalizationsEs extends AppLocalizations { String get translation_title => 'Traducción'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Mensajes de imagen'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Enviar imágenes a través de la malla. Requiere la descarga de un modelo de imagen único.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Modelo de imagen'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Descargar'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Cancelar'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Eliminar modelo'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Listo'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Aún no publicado — esta versión no puede descargarlo.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'El modelo de imagen no pudo ser descargado.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => + 'Procesar imágenes automáticamente'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Reconstruya cada imagen tan pronto como llegue. Utiliza aproximadamente 2 GB de memoria durante un segundo cada vez; desactívelo para reconstruir con un toque.'; @override String get translation_enableTitle => 'Habilitar la traducción'; @@ -4851,43 +4854,43 @@ class AppLocalizationsEs extends AppLocalizations { String get pathMap_unfollowPacket => 'Dejar de seguir el paquete'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Enviar imagen'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Redimensionado a 512 × 512 · la relación de aspecto no se conservó'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => 'Texto original'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'En emisión'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Calidad'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => 'Estándar'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Alto'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Paquetes'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Tiempo en pantalla'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Carga útil'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paquetes', + one: 'paquete', ); return '$count $_temp0'; } @@ -4901,149 +4904,151 @@ class AppLocalizationsEs extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => + 'Configuración de radio desconocida'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Conéctese a un dispositivo para que se pueda calcular la hora de transmisión.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Larga transmisión'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Esto mantendrá el canal durante aproximadamente $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Enrutamiento de inundación: cada repetidor dentro del rango retransmite cada paquete, por lo que el canal permanece ocupado durante más tiempo que esto.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Paquete de recuperación'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Un paquete adicional. Los mensajes grupales no son reconocidos, por lo que esto permite al receptor reconstruir la imagen si se pierde un solo paquete.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Enviar'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Cancelar'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'Esta imagen no pudo ser codificada.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'El modelo de imagen todavía se está descargando.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'El envío de imágenes no está disponible en este dispositivo.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Los mensajes de imagen están desactivados en la configuración.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Esta radio no puede enviar paquetes de imagen. Conecte un dispositivo con el firmware Companion versión 13 o superior.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Las imágenes se transmiten como datos grupales, por lo que solo se pueden enviar a un canal, no mediante mensajes directos.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Esa imagen se codificó en más paquetes de los que permite el formato de malla.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paquetes', + one: 'paquete', ); - return 'Image sent as $count $_temp0.'; + return 'Imagen enviada como $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'La imagen no pudo ser enviada: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Envío de imagen — paquete $sent de $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Nodo $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$received de $total paquetes'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Esperando descifrar'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Toque para decodificar'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => + 'Reconstruyendo… aproximadamente 1 segundo'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Imagen incompleta — $received de $total paquetes llegados'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'La imagen no pudo ser reconstruida'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Imagen recibida — la decodificación de la imagen no funciona'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Imagen ya no almacenada'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Inténtalo de nuevo'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Decodificar de nuevo'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Configurar'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Toque para procesar'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paquetes', + one: 'paquete', ); return '$bytes bytes · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds segundos'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes min $seconds s'; } } diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index b6d1a85c..91593114 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -370,42 +370,44 @@ class AppLocalizationsFr extends AppLocalizations { String get settings_radioSettingsUpdated => 'Paramètres radio mis à jour'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Régions'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => 'Gérer les régions stockées'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Gestion de région'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Entrer le nom de la région'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Ajouter une région'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => + 'Récupérer les régions à partir des répéteurs'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => + 'Aucune région n\'a été trouvée'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Cette région a déjà été ajoutée'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Nom de la région'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Région supprimée'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Supprimer la région'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Supprimez $region de la liste des régions ?'; } @override @@ -627,7 +629,7 @@ class AppLocalizationsFr extends AppLocalizations { String get settings_infoChannelCount => 'Nombre de canaux'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => 'Matériel'; @override String get settings_infoFirmware => 'Firmware'; @@ -748,16 +750,16 @@ class AppLocalizationsFr extends AppLocalizations { String get appSettings_languageUk => 'Ukrainien'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 octet'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 à 2 octets'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 à 3 octets'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 à 4 octets'; @override String get appSettings_enableMessageTracing => @@ -907,7 +909,7 @@ class AppLocalizationsFr extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3,0-4,2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'Tension élevée LiPo (3,0-4,35 V)'; @override String get appSettings_mapDisplay => 'Affichage de la carte'; @@ -1421,17 +1423,17 @@ class AppLocalizationsFr extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'Région : $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Région : aucune'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Choisissez une région'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Zone dégagée'; @override String get chat_noMessages => 'Aucun message pour le moment'; @@ -1489,13 +1491,13 @@ class AppLocalizationsFr extends AppLocalizations { String get chat_sendGif => 'Envoyer un GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Envoyer l\'image'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Je n\'ai pas pu ouvrir cette image'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Reçu un GIF'; @override String get chat_reply => 'Répondre'; @@ -2742,38 +2744,39 @@ class AppLocalizationsFr extends AppLocalizations { 'Octets utilisés pour encoder l\'ID de ce routeur dans les balises de détection de flux/boucles. 0 = 1 octet (256 ID, jusqu\'à 64 sauts), 1 = 2 octets (65 000 ID, jusqu\'à 32 sauts), 2 = 3 octets (16 millions d\'ID, jusqu\'à 21 sauts). Les versions 1.13 et antérieures utilisent des chemins multi-octets ; à partir de la version 1.14, cela n\'est plus nécessaire.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Modifier les clés d\'identité'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Modifier la paire de clés publique/privée'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Clé privée'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Une nouvelle clé privée pour le répéteur, une chaîne hexadécimale de 128 caractères.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Générez une paire de clés aléatoire'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Arrêter la recherche de la paire de clés'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Clé publique'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Voici la clé publique associée à la clé privée générée. Vous ne pouvez pas la définir directement.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Préfixe souhaité'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Trouvez une clé publique qui commence par ces chiffres hexadécimaux. Nombre de tentatives nécessaires : $tries.'; } @override @@ -4549,41 +4552,42 @@ class AppLocalizationsFr extends AppLocalizations { String get translation_title => 'Traduction'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Messages avec images'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Envoyer des images via le maillage. Nécessite un téléchargement unique du modèle d\'image.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Modèle d\'image'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Télécharger'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Annuler'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Supprimer le modèle'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Prêt'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Non publié — cette version ne peut pas le télécharger.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Le modèle d\'image ne pouvait pas être téléchargé.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => + 'Traiter automatiquement les images'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Reconstruisez chaque image dès son arrivée. Cela utilise environ 2 Go de mémoire pendant une seconde à chaque fois ; désactivez la reconstruction au toucher pour éviter cela.'; @override String get translation_enableTitle => 'Activer la traduction'; @@ -4872,43 +4876,44 @@ class AppLocalizationsFr extends AppLocalizations { String get pathMap_unfollowPacket => 'Déverrouiller la vue du paquet'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Envoyer l\'image'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Redimensionné à 512 × 512 · le rapport d’aspect n’a pas été conservé'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => + 'Texte original\n\nVeuillez traduire le texte suivant en français :'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'En direct'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Qualité'; @override String get imageSend_qualityStandard => 'Standard'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Haut'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Paquets'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Durée de diffusion'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Charge utile'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paquets', + one: 'paquet', ); return '$count $_temp0'; } @@ -4922,140 +4927,141 @@ class AppLocalizationsFr extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Réglages de la radio inconnus'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Connectez-vous à un appareil afin que l\'heure de diffusion puisse être calculée.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Longue transmission'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Cela maintiendra la chaîne pendant environ $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Routage des inondations : chaque répéteur dans la zone retransmet chaque paquet, de sorte que le canal reste occupé plus longtemps que cela.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Paquet de récupération'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Un paquet supplémentaire. Les messages de groupe ne sont pas reconnus, ce qui permet au destinataire de reconstruire l\'image si un seul paquet est perdu.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Envoyer'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Annuler'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'Cette image ne peut pas être encodée.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Le modèle d\'image est toujours en téléchargement.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'L\'envoi d\'images n\'est pas disponible sur cet appareil.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Les messages d\'images sont désactivés dans les paramètres.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Cette radio ne peut pas envoyer de paquets d\'images. Connectez un appareil exécutant le firmware compagnon version 13 ou ultérieure.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Les images se déplacent en tant que données de groupe, elles ne peuvent donc être envoyées que sur un canal — et non par message direct.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Cette image a été encodée en plus de paquets que le format de maillage ne permet.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paquets', + one: 'paquet', ); - return 'Image sent as $count $_temp0.'; + return 'Image envoyée en $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'L\'image n\'a pas pu être envoyée : $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Envoi de l\'image — paquet $sent sur $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Nœud $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$received sur $total paquets'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'En attendant de décoder'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Tapez pour décoder'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Reconstitution… d’environ 1 s'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Image incomplète — $received sur $total paquets reçus'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => + 'L\'image ne pouvait pas être reconstruite'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Image reçue — le décodage de l\'image est interrompu'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Image non stockée'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Réessayez'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Décoder à nouveau'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Mettre en place'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Tapez pour traiter'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paquets', + one: 'paquet', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes octets · $packets $_temp0'; } @override @@ -5065,6 +5071,6 @@ class AppLocalizationsFr extends AppLocalizations { @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes minutes $seconds secondes'; } } diff --git a/lib/l10n/app_localizations_hu.dart b/lib/l10n/app_localizations_hu.dart index 72665c96..67f624a6 100644 --- a/lib/l10n/app_localizations_hu.dart +++ b/lib/l10n/app_localizations_hu.dart @@ -366,42 +366,43 @@ class AppLocalizationsHu extends AppLocalizations { String get settings_radioSettingsUpdated => 'A rádió beállításai frissítve'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Tájak'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => + 'Kincstani megjelenítette gyakorlatos területeket'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Regionális Kezelés'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Felhasználja a regioni név'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Egyes region'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'Féregelmezők a repeaterekból'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => 'Nem található egyéb területek'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Ez a terítet nemisértették meg.'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Feldúr Neve'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Felült region'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Felajánlatos Tér'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Kell kiszámítsd a ${region}ot a részekre?'; } @override @@ -620,10 +621,10 @@ class AppLocalizationsHu extends AppLocalizations { String get settings_infoChannelCount => 'Csatornaszám'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => 'Hardverő'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => 'Firmver'; @override String get settings_presets => 'Előbeállítások'; @@ -746,13 +747,13 @@ class AppLocalizationsHu extends AppLocalizations { String get repeater_pathHashModeOption0 => '0 - 1 byte'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 szavak'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 bajt'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 bajt'; @override String get appSettings_enableMessageTracing => 'Üzenetkövetés engedélyezése'; @@ -1414,17 +1415,17 @@ class AppLocalizationsHu extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'Tájékoztatás: A $region -t\n\nEz a tájékoztatás a magyar nyelvben a következően kell szóva:\n\nTájékoztatás: A $region -t'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Tájékoztetés: nem'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Válassz egy regionot'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Kéres kör'; @override String get chat_noMessages => 'Még nincsenek üzenetek'; @@ -1482,13 +1483,13 @@ class AppLocalizationsHu extends AppLocalizations { String get chat_sendGif => 'GIF küldése'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Felhasználj az image'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Nem tudtam ezt a fenti fényre kapni'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'GIF-ot kapott'; @override String get chat_reply => 'Válasz'; @@ -2725,38 +2726,39 @@ class AppLocalizationsHu extends AppLocalizations { 'Az átjátszó azonosítójának elárasztási útvonal/hurokészlelési címkékbe való kódolására használt bájtok. 0 = 1 bájt (256 azonosító, legfeljebb 64 ugrás), 1 = 2 bájt (65 000 azonosító, legfeljebb 32 ugrás), 2 = 3 bájt (16 millió azonosító, legfeljebb 21 ugrás). A v1.13 és régebbi firmware eldobja a többbájtos elérési utat – csak akkor emelje meg, ha a hálózat a v1.14+ verziót használja.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Képzőítsekei jelölt'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Közelítse a közlekedési/private képlékt'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Kis házas'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Kínai nyelvben:\n\nA repeteróhoz új képes kód, 128 karakteri hex-kód.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Egy random képléktár generáld meg'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Kéypair szavakat kérdéset kaphatás'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Kiváló kiegészítő'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Ez a kiváló kód, amely tükrözi a gyártott kiegészítő kódot. Ezet nem lehet megjelenítani direktusan.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Kiváló prefix'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Kiválasztsa meg a közös kódot, amely az alábbi hex-kifüggőnek előre van. Várható kiválasztások száma: $tries.'; } @override @@ -4522,41 +4524,41 @@ class AppLocalizationsHu extends AppLocalizations { String get translation_title => 'Fordítás'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Fenti hírüket biztosítani'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Fényokat a hálózatban küldd el. Egyértelmű fénymodell hozzáadásra kell.'; @override String get imageMessages_modelSectionTitle => 'Image model'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Hozzáladás'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Színviselés'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Kisnövezdés'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Hozzá'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Érkeztetve nem — ez a építési módszert nem lehet lejobbítani.'; @override - String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + String get imageMessages_downloadFailed => 'Életmódelmát nem tudtam hozni.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => + 'Automatikusan kínaltatja fénybetek'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Minden fenti image-t kiválasztsa meg, amikor érkezik. Minden más esetben 2 GB fényre kell szükséges; megoldja a rekonstruálisi a támogatásra egy klikkel.'; @override String get translation_enableTitle => 'Fordítás engedélyezése'; @@ -4843,43 +4845,43 @@ class AppLocalizationsHu extends AppLocalizations { String get pathMap_unfollowPacket => 'A nézet feloldása a csomagból'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Felhasználj az image'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + '512 × 512 órák számára megosztva · képszöget nem biztosítva'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => 'Következtetés:'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'Erőben'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Hosszú Képesség'; @override String get imageSend_qualityStandard => 'Standard'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'High: Magas'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Paketek'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Kiválasztás a fent'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Kártya'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'csomag', + one: 'csomag', ); return '$count $_temp0'; } @@ -4893,83 +4895,83 @@ class AppLocalizationsHu extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Radiooldalok nem tudom'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Kizárdhoz kapcsolódd a rendszert, hogy a súly az az álló időt lehet elismerni.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Uzun hírás'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Ez megbízható a kanal $duration-n.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Fúró irányozás: Minden repeater a fúró körüléggel megköveti mindkét paketet, ezért a kanal eltartja más a lehetséges időt.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Korzolás paksa'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Egy kibőbbes kapszula. Gruppos hírselek nem érkezik, ezért az empfangó nem kell elismerni a jel, ha egy egyes kapszula kaland, hogy nem teljesen érkezz.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Keresés'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Színviselés'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'Ez a fényet nem tudtam kódolni.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Érdekesz az image model megstálása még van.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Felhasználó észintje nem kapható ezen a rendszert.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Image hírletek belsőoldal elkalmáznak a konfigurációban.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Ez a radio nem tudja verseni színekfájltakat. Habilítd a kompatibilis firmware 13 vagy újabb versionot kapcsált eszközet.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Fényiak gyakorolják grupos adatban, ezért nem lehetek versenek egy hozzáfűzésre, csak egy kanalra.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'A figyelmetes fentet nem kínálhat a körközlettel ismétálás elterjesztésére.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'csomagként', + one: 'csomagként', ); - return 'Image sent as $count $_temp0.'; + return 'Kép elküldve $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Fentami nem tűnik: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Felhasználó: Lehet a következőkét kifejezetet – $sent paket $total'; } @override @@ -4979,63 +4981,63 @@ class AppLocalizationsHu extends AppLocalizations { @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return 'Kulcsfontosságú: Kiválasztja meg a $received $total paketot'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Kódoláshoz küldőzve'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Kódoláshoz klikd el'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Korlátozás… egy 1 perc után'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Kérem, az $received $total paketet kapottak.'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'Fény nem tudtam megrealítani'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Kezd az image — image decodálás nem kapható'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Fény nem tartalmazva'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Kérem kell próbálni'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Kodoldó'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Jelzése'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Klikd a feljelenítést'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'csomag', + one: 'csomag', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes bájt · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds sekünd\n\n(Note: The placeholder $seconds is kept unchanged as requested.)'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes per $seconds sekünd\n\n(Note: The original text appears to be a placeholder format rather than a complete sentence. The translation reflects the literal structure while preserving the placeholders as requested.)'; } } diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index 919f656c..adef0188 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -370,42 +370,45 @@ class AppLocalizationsIt extends AppLocalizations { String get settings_radioSettingsUpdated => 'Impostazioni radio aggiornate'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Regioni'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => + 'Gestione delle regioni salvate'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Gestione Regionale'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Inserisci il nome della regione'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Aggiungi regione'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => + 'Recupera le regioni dai ripetitori'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => + 'Non sono state trovate regioni'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Questa regione è già stata aggiunta'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Nome della Regione'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Regione cancellata'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Elimina Regione'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Rimuovere \"$region\" dalla lista delle regioni?'; } @override @@ -749,13 +752,13 @@ class AppLocalizationsIt extends AppLocalizations { String get repeater_pathHashModeOption0 => '0 - 1 byte'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 byte'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 byte'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 byte'; @override String get appSettings_enableMessageTracing => @@ -906,7 +909,7 @@ class AppLocalizationsIt extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3,0-4,2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'LiPo HV (3,0-4,35 V)'; @override String get appSettings_mapDisplay => 'Visualizzazione Mappa'; @@ -1420,17 +1423,17 @@ class AppLocalizationsIt extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'Regione: $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Regione: nessuna'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Scegli una regione'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Zona chiara'; @override String get chat_noMessages => 'Nessun messaggio ancora'; @@ -1488,13 +1491,14 @@ class AppLocalizationsIt extends AppLocalizations { String get chat_sendGif => 'Invia GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Invia immagine'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => + 'Non sono riuscito ad aprire quell\'immagine'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Ricevuto un GIF'; @override String get chat_reply => 'Rispondi'; @@ -2733,38 +2737,39 @@ class AppLocalizationsIt extends AppLocalizations { 'Byte utilizzati per codificare l\'ID di questo ripetitore nei tag di percorso flood/rilevamento loop. 0=1 byte (256 ID, fino a 64 salti), 1=2 byte (65.000 ID, fino a 32 salti), 2=3 byte (16 milioni di ID, fino a 21 salti). Il firmware precedente alla v1.14 usava sempre percorsi a 1 byte; v1.14 e versioni successive possono essere configurate per percorsi a 2 o 3 byte.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Cambia le Chiavi di Identità'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Cambia la coppia di chiavi pubblica/privata'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Chiave privata'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Una nuova chiave privata per il ripetitore, una stringa esadecimale di 128 caratteri.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Genera una coppia di chiavi casuale'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Interrompi la ricerca della coppia di chiavi'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Chiave pubblica'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Questa è la chiave pubblica che accompagna la chiave privata generata. Non è possibile impostarla direttamente.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Prefisso desiderato'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Trova una chiave pubblica che inizia con queste cifre esadecimali. Tentativi necessari previsti: $tries.'; } @override @@ -4532,41 +4537,42 @@ class AppLocalizationsIt extends AppLocalizations { String get translation_title => 'Traduzione'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Messaggi con immagini'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Invia le immagini tramite la mesh. È necessario scaricare il modello dell\'immagine una tantum.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Modello di immagine'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Scarica'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Annullare'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Rimuovi il modello'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Pronto'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Non pubblicato ancora — questa versione non può scaricarlo.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Il modello di immagine non può essere scaricato.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => + 'Elabora automaticamente le immagini'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Ricostruisci ogni immagine non appena arriva. Utilizza circa 2 GB di memoria per un secondo ogni volta; disattiva la ricostruzione con un semplice tocco.'; @override String get translation_enableTitle => 'Abilitare la traduzione'; @@ -4856,43 +4862,44 @@ class AppLocalizationsIt extends AppLocalizations { String get pathMap_unfollowPacket => 'Sblocca la vista dal pacchetto'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Invia immagine'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Ridimensionato a 512 × 512 · rapporto d\'aspetto non conservato'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => + 'Traduzione:\n\nOriginal text:\n\nPlease translate the following English text into Italian:\n\nOriginal text:\n\n(No original English text provided)'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'In onda'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Qualità'; @override String get imageSend_qualityStandard => 'Standard'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Alto'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Pacchetti'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Tempo in onda'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Carico utile'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pacchetti', + one: 'pacchetto', ); return '$count $_temp0'; } @@ -4906,149 +4913,151 @@ class AppLocalizationsIt extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Impostazioni radio sconosciute'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Collegati a un dispositivo in modo che si possa calcolare l\'orario di trasmissione.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Lunga trasmissione'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Questo manterrà il canale per circa $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Instradamento delle inondazioni: ogni ripetitore nel raggio ritrasmette ogni pacchetto, quindi il canale rimane occupato più a lungo.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Pacchetto di recupero'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Un pacchetto aggiuntivo. I messaggi di gruppo non vengono riconosciuti, quindi questo permette al destinatario di ricostruire l\'immagine se un singolo pacchetto viene perso.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Invia'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Annullare'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => + 'Questa immagine non può essere codificata.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Il modello di immagine sta ancora scaricando.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'L\'invio di immagini non è disponibile su questo dispositivo.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'I messaggi immagine sono disattivati nelle impostazioni.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Questa radio non può inviare pacchetti di immagini. Collegare un dispositivo con firmware companion versione 13 o successiva.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Le immagini viaggiano come dati di gruppo, quindi possono essere inviate solo a un canale — non tramite messaggio diretto.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Quella immagine è stata codificata in un numero di pacchetti superiore a quello consentito dal formato mesh.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pacchetti', + one: 'pacchetto', ); - return 'Image sent as $count $_temp0.'; + return 'Immagine inviata come $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'L\'immagine non può essere inviata: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Invio immagine — pacchetto $sent di $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Nodo $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$received di $total pacchetti'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'In attesa di decodificare'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Tocca per decodificare'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Ricostruire… circa 1 s'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Immagine incompleta — $received su $total pacchetti ricevuti'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => + 'L\'immagine non potrebbe essere ricostruita'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Immagine ricevuta — decodifica dell\'immagine non funzionante'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Immagine non più memorizzata'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Prova ancora'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Decodifica di nuovo'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Imposta'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Premi per elaborare'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pacchetti', + one: 'pacchetto', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes byte · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds secondi'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes min $seconds s'; } } diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index 3d3f3783..6ca5bbae 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -354,42 +354,41 @@ class AppLocalizationsJa extends AppLocalizations { String get settings_radioSettingsUpdated => 'ラジオの設定が更新されました'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => '地域'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => '保存された領域の管理'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => '地域管理'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => '地域名を入力してください'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => '地域を追加'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'リピーターからのフェッチ地域'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => '地域は見つかりませんでした'; @override - String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + String get settings_regionFetchRegionsAlreadyExists => 'この地域はすでに追加されています。'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => '地域名'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => '地域が削除されました'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => '地域を削除'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return '$region を地域リストから削除しますか?'; } @override @@ -595,10 +594,10 @@ class AppLocalizationsJa extends AppLocalizations { String get settings_infoChannelCount => 'チャンネル数'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => 'ハードウェア'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => 'ファームウェア'; @override String get settings_presets => 'プリセット'; @@ -716,16 +715,16 @@ class AppLocalizationsJa extends AppLocalizations { String get appSettings_languageUk => 'ウクライナ語'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1バイト'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1〜2バイト'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2〜3バイト'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3〜4バイト'; @override String get appSettings_enableMessageTracing => 'メッセージ追跡を有効にする'; @@ -857,7 +856,7 @@ class AppLocalizationsJa extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3.0-4.2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'リポバッテリー HV(3.0〜4.35V)'; @override String get appSettings_mapDisplay => '地図表示'; @@ -1349,17 +1348,17 @@ class AppLocalizationsJa extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return '地域:$region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => '地域:なし'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => '地域を選択する'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'クリアな地域'; @override String get chat_noMessages => 'まだメッセージは届いていません'; @@ -1417,13 +1416,13 @@ class AppLocalizationsJa extends AppLocalizations { String get chat_sendGif => 'GIF を送信'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => '画像を送信'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'その画像を開けませんでした'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'GIFを受け取りました'; @override String get chat_reply => '返信'; @@ -2614,38 +2613,35 @@ class AppLocalizationsJa extends AppLocalizations { 'このリピータのIDをフローパス/ループ検出タグにエンコードするために使用されるバイト数。 0=1バイト (256個のID、最大64ホップ)、1=2バイト (65,000個のID、最大32ホップ)、2=3バイト (160万個のID、最大21ホップ)。 v1.13およびそれ以前のファームウェアでは、マルチバイトパスがサポートされていません。 v1.14以降のバージョンでは、一度ネットワークが起動されると、パスが一度だけ検出されます。'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'アイデンティティキーの変更'; @override - String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + String get repeater_keySettingsSubtitle => '公開鍵/秘密鍵を変更する'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'プライベートキー'; @override - String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + String get repeater_prvKeyHelper => 'リピーター用の新しいプライベートキー。128文字の16進文字列です。'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'ランダムな鍵ペアを生成する'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => 'キーペアの検索を中断'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => '公開鍵'; @override - String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + String get repeater_pubKeyHelper => 'これは生成された秘密鍵に対応する公開鍵です。直接設定することはできません。'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => '希望する接頭辞'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'これらの16進数で始まる公開鍵を見つけてください。予想される試行回数: $tries。'; } @override @@ -4301,41 +4297,40 @@ class AppLocalizationsJa extends AppLocalizations { String get translation_title => '翻訳'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => '画像メッセージを有効にする'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'メッシュ経由で画像を送信してください。画像モデルを一度限りのダウンロードが必要です。'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => '画像モデル'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'ダウンロード'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'キャンセル'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'モデルを削除'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => '準備完了'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'まだ公開されていません — このビルドではダウンロードできません。'; @override - String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + String get imageMessages_downloadFailed => '画像モデルがダウンロードできませんでした。'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => '画像を自動的に処理する'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + '画像が届き次第、すぐに再構築してください。1回あたり約2GBのメモリを使用します。タップで再構築を解除できます。'; @override String get translation_enableTitle => '翻訳機能を有効にする'; @@ -4614,43 +4609,43 @@ class AppLocalizationsJa extends AppLocalizations { String get pathMap_unfollowPacket => 'パケットの追跡を解除'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => '画像を送信'; @override - String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + String get imageSend_cropNote => '512 × 512にリサイズされました。アスペクト比は保持されませんでした。'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => + '原文:\nThe early morning light filtered through the curtains, casting a soft glow on the room.\n\n翻訳:\n早朝の光がカーテンをすり抜け、部屋に柔らかな光を投げかけていた。'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => '放送中'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => '品質'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => '標準'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'ハイ'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'パケット'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => '放送時間'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'ペイロード'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'パケット', + one: 'パケット', ); return '$count $_temp0'; } @@ -4664,149 +4659,143 @@ class AppLocalizationsJa extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'ラジオの設定が不明です'; @override - String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + String get imageSend_radioUnknownBody => '放送時間の計算ができるように、デバイスに接続してください。'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => '長距離伝送'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'このチャンネルは約 $duration 間保持されます。'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + '洪水ルーティング:範囲内の各リピーターが各パケットを再送信するため、チャネルはこれよりも長く占有されたままになります。'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => '回復パケット'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + '追加のパケットが1つあります。グループメッセージは確認されないため、1つのパケットが失われても受信者が画像を再構築できます。'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => '送る'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'キャンセル'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'この画像はエンコードできませんでした。'; @override - String get imageSend_codecDownloading => - 'The image model is still downloading.'; + String get imageSend_codecDownloading => '画像モデルはまだダウンロード中です。'; @override - String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + String get imageSend_codecUnavailable => 'このデバイスでは画像送信が利用できません。'; @override - String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + String get imageSend_codecDisabled => '設定で画像メッセージはオフになっています。'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'このラジオは画像パケットを送信できません。コンパニオン ファームウェア 13 以降を実行しているデバイスを接続してください。'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + '画像はグループデータとして送信されるため、ダイレクトメッセージではなくチャンネルに送ることができます。'; @override - String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + String get imageSend_tooLarge => 'その画像は、メッシュ形式が許容するよりも多くのパケットにエンコードされています。'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'パケット', + one: 'パケット', ); - return 'Image sent as $count $_temp0.'; + return '$count $_temp0として画像を送信しました。'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return '画像を送信できませんでした:$error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return '画像送信 — パケット $sent 件、合計 $total 件'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'ノード $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$total パケット中 $received パケット'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => '復号を待っている'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'デコードするにはタップしてください。'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => '再構築… 約1秒'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return '画像が不完全です — $total パケット中 $received パケットが到着しました'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => '画像を再構成することはできませんでした'; @override - String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + String get receivedImage_decoderMissing => '画像を受信しました — 画像のデコードが失敗しました'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => '画像はもう保存されていません'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'もう一度試してください'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'もう一度デコードしてください'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => '設定する'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => '処理するにはタップしてください'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'パケット', + one: 'パケット', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes バイト・$packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds秒'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes分 $seconds秒'; } } diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index f30a9584..8052f1d9 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -354,42 +354,41 @@ class AppLocalizationsKo extends AppLocalizations { String get settings_radioSettingsUpdated => '라디오 설정이 업데이트되었습니다.'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => '지역'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => '저장된 지역 관리'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => '지역 관리'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => '지역 이름 입력'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => '지역 추가'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => '리피터에서 지역을 가져옵니다.'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => '어떤 지역도 발견되지 않았습니다.'; @override - String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + String get settings_regionFetchRegionsAlreadyExists => '이 지역은 이미 추가되었습니다.'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => '지역 이름'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => '지역 삭제'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => '지역 삭제'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return '\"$region\"을(를) 지역 목록에서 삭제하시겠습니까?'; } @override @@ -596,10 +595,10 @@ class AppLocalizationsKo extends AppLocalizations { String get settings_infoChannelCount => '채널 수'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => '하드웨어'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => '펌웨어'; @override String get settings_presets => '프리셋'; @@ -717,16 +716,16 @@ class AppLocalizationsKo extends AppLocalizations { String get appSettings_languageUk => '우크라이나어'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 바이트'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1~2 바이트'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 바이트'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 바이트'; @override String get appSettings_enableMessageTracing => '메시지 추적 기능 활성화'; @@ -860,7 +859,7 @@ class AppLocalizationsKo extends AppLocalizations { String get appSettings_batteryLipo => '리튬 폴리머 (3.0-4.2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => '리포 HV (3.0-4.35V)'; @override String get appSettings_mapDisplay => '지도 표시'; @@ -1352,17 +1351,17 @@ class AppLocalizationsKo extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return '지역: $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => '지역: 없음'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => '지역을 선택하세요'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => '명확한 지역'; @override String get chat_noMessages => '아직 메시지가 없습니다.'; @@ -1420,13 +1419,13 @@ class AppLocalizationsKo extends AppLocalizations { String get chat_sendGif => 'GIF 보내기'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => '이미지를 보내세요'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => '그 이미지를 열 수 없었어요.'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'GIF를 받았습니다'; @override String get chat_reply => '답변'; @@ -2620,38 +2619,36 @@ class AppLocalizationsKo extends AppLocalizations { '이 리피터의 ID를 플러드 경로/루프 감지 태그에 인코딩하는 데 사용되는 바이트 수입니다. 0=1바이트(256개 ID, 최대 64홉), 1=2바이트(65,000개 ID, 최대 32홉), 2=3바이트(1,600만 개 ID, 최대 21홉). v1.14 이전 펌웨어는 항상 1바이트 경로를 사용했으며, v1.14 이상은 2바이트 또는 3바이트 경로로 설정할 수 있습니다.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => '신원 키 변경'; @override - String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + String get repeater_keySettingsSubtitle => '공개/비공개 키 쌍을 변경하세요'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => '개인 키'; @override - String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + String get repeater_prvKeyHelper => '리피터의 새로운 개인 키로, 128자리의 16진수 문자열입니다.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => '임의의 키 쌍을 생성하세요.'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => '키페어 검색 중단'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => '공개 키'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + '이것은 생성된 개인 키와 함께 사용되는 공개 키입니다. 직접 설정할 수 없습니다.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => '원하는 접두사'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return '이러한 16진수로 시작하는 공개 키를 찾으세요. 필요한 시도 횟수: $tries.'; } @override @@ -4309,41 +4306,40 @@ class AppLocalizationsKo extends AppLocalizations { String get translation_title => '번역'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => '이미지 메시지 활성화'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + '메시를 통해 이미지를 전송하세요. 일회성 이미지 모델 다운로드가 필요합니다.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => '이미지 모델'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => '다운로드'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => '취소'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => '모델 제거'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => '준비 완료'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + '아직 출판되지 않았습니다 — 이 빌드로는 다운로드할 수 없습니다.'; @override - String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + String get imageMessages_downloadFailed => '이미지 모델을 다운로드할 수 없었습니다.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => '자동으로 프로세스 이미지를 처리합니다.'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + '이미지가 도착하는 즉시 재구성하세요. 매번 2GB의 메모리를 사용하며, 탭으로 재구성을 원할 경우 해제하세요.'; @override String get translation_enableTitle => '번역 기능 활성화'; @@ -4622,199 +4618,192 @@ class AppLocalizationsKo extends AppLocalizations { String get pathMap_unfollowPacket => '패킷 고정 해제'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => '이미지를 보내세요'; @override - String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + String get imageSend_cropNote => '512 × 512로 크기가 조정되었으며, 종횡비는 유지되지 않았습니다.'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => '원문 없음'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => '방송 중'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => '품질'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => '표준'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => '높다'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => '패킷'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => '방송 시간'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => '페이로드'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: '패킷', + one: '패킷', ); return '$count $_temp0'; } @override String imageSend_range(String min, String max) { - return '$min–$max'; + return '$min~$max'; } @override String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => '라디오 설정 정보 없음'; @override - String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + String get imageSend_radioUnknownBody => '방송 시간을 계산할 수 있도록 기기와 연결하세요.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => '장거리 송신'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return '이것은 약 $duration 동안 채널을 유지할 것입니다.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + '홍수 라우팅: 범위 내의 모든 리피터가 각 패킷을 재전송하므로, 채널이 이보다 더 오래 점유 상태를 유지합니다.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => '회복 패킷'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + '추가 한 개의 패킷입니다. 그룹 메시지는 확인되지 않으므로, 하나의 패킷이 손실되었을 경우 수신자가 이미지를 다시 구성할 수 있습니다.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => '보내다'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => '취소'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => '이 이미지는 인코딩할 수 없습니다.'; @override - String get imageSend_codecDownloading => - 'The image model is still downloading.'; + String get imageSend_codecDownloading => '이미지 모델이 아직 다운로드 중입니다.'; @override - String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + String get imageSend_codecUnavailable => '이 기기에서는 이미지 전송이 불가능합니다.'; @override - String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + String get imageSend_codecDisabled => '설정에서 이미지 메시지가 꺼져 있습니다.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + '이 라디오는 이미지 패킷을 전송할 수 없습니다. 컴패니언 펌웨어 13 이상을 실행하는 장치를 연결해 주세요.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + '이미지는 그룹 데이터로 전송되므로, 직접 메시지가 아닌 채널로만 보낼 수 있습니다.'; @override - String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + String get imageSend_tooLarge => '그 이미지는 메시 형식이 허용하는 것보다 더 많은 패킷으로 인코딩되었습니다.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: '패킷', + one: '패킷', ); - return 'Image sent as $count $_temp0.'; + return '이미지가 $count $_temp0로 전송되었습니다.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return '이미지를 보낼 수 없습니다: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return '이미지 전송 — $sent개의 $total 패킷'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return '노드 $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$total개 패킷 중 $received개'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => '해독을 기다리는 중입니다.'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => '해독하려면 탭을 누르세요.'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => '재구성하는… 약 1초 정도'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return '이미지 불완전 — $total개 중 $received개 패킷 수신됨'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => '이미지는 재구성될 수 없습니다.'; @override - String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + String get receivedImage_decoderMissing => '수신된 이미지 — 이미지 해독이 되지 않았습니다'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => '이미지는 더 이상 저장되지 않았습니다.'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => '다시 시도해 보세요'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => '다시 해독하다'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => '설정하다'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => '처리하려면 탭을 누르세요.'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: '패킷', + one: '패킷', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes 바이트 · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds 초'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes분 $seconds초'; } } diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 6ed73e0a..dcaa1dde 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -366,42 +366,44 @@ class AppLocalizationsNl extends AppLocalizations { String get settings_radioSettingsUpdated => 'Radio instellingen bijgewerkt'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Regio\'s'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => + 'Beheer van opgeslagen regio\'s'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Regionale Bestuur'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Regio naam invoeren'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Regio toevoegen'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'Haal regio\'s uit herhalers'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => + 'Er zijn geen regio\'s gevonden'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Deze regio is al toegevoegd.'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Regio Naam'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Regio verwijderd'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Regio verwijden'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Verwijder \"$region\" uit de regio-lijst?'; } @override @@ -898,7 +900,7 @@ class AppLocalizationsNl extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3,0-4,2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'LiPo HV (3,0-4,35 V)'; @override String get appSettings_mapDisplay => 'Kaartweergave'; @@ -1408,17 +1410,17 @@ class AppLocalizationsNl extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'Regio: $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Regio: geen'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Kies een regio'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Duidelijke regio'; @override String get chat_noMessages => 'Nog geen berichten.'; @@ -1476,13 +1478,13 @@ class AppLocalizationsNl extends AppLocalizations { String get chat_sendGif => 'GIF verzenden'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Beeld verzenden'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Kunde die afbeelding niet openen'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Ontvangen van een GIF'; @override String get chat_reply => 'Reageren'; @@ -2714,38 +2716,38 @@ class AppLocalizationsNl extends AppLocalizations { 'Bytes die gebruikt worden om de ID van deze repeater te coderen in flood-pad/lusdetectietags. 0=1 byte (256 ID\'s, tot 64 hops), 1=2 bytes (65.000 ID\'s, tot 32 hops), 2=3 bytes (16 miljoen ID\'s, tot 21 hops). Firmware vóór v1.14 gebruikte altijd 1-byte paden; v1.14 en nieuwer kunnen worden ingesteld op 2- of 3-byte paden.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Verander de Identiteitskies'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Wijzig de openbare/private sleutelpaar'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Geheime sleutel'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Een nieuwe private sleutel voor de repeater, een 128-karakter lange hexadecimale string.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Stel een willekeurige sleutelpaar op'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => 'Stop zoek naar sleutelpaar'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Openbaar sleutel'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Dit is de openbare sleutel die past bij de gegenereerde privésleutel. U kunt dit niet direct instellen.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Verlangde voorvoegsel'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Zoek een openbare sleutel die begint met deze hexadecimale cijfers. Verwacht aantal pogingen: $tries.'; } @override @@ -4510,41 +4512,41 @@ class AppLocalizationsNl extends AppLocalizations { String get translation_title => 'Vertaling'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Bijbehorende afbeeldingen activeren'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Beeldjes verzenden via het netwerk. Vereist eenmalig afdaling van een beeldmodel.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Beeldmodel'; @override String get imageMessages_downloadModel => 'Download'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Annuleren'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Model verwijderen'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Klaar'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Nog niet gepubliceerd — deze versie kan dit niet downloaden.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Het beeldmodel kon niet worden gedownload.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => 'Beeldverwerking automatisch'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Reconstrueer elk beeld direct nadat het binnenkomt. Het gebruikt ongeveer 2 GB geheugen voor elke keer; schakel het reconstrueren uit met een tik als je het niet nodig hebt.'; @override String get translation_enableTitle => 'Activeer vertaling'; @@ -4831,43 +4833,43 @@ class AppLocalizationsNl extends AppLocalizations { String get pathMap_unfollowPacket => 'Weergave ontgrendelen van pakket'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Beeld verzenden'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Aangepast aan 512 × 512 · het aspectverhouding is niet behouden'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => 'Oorspronkelijk'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'Op de lucht'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Kwaliteit'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => 'Standaard'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Hoog'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Pakketten'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Tijd op de lucht'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Belasting'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pakketten', + one: 'pakket', ); return '$count $_temp0'; } @@ -4881,145 +4883,146 @@ class AppLocalizationsNl extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Radio-instellingen onbekend'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Verbinding maken met een apparaat zodat de uitzendtijd kan worden berekend.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Lange transmissie'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Dit houdt de kanaal ongeveer voor $duration stand.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Overstromingsrouting: elke repeater binnen bereik herzendsends elk pakket opnieuw, waardoor het kanaal langer bezig blijft dan dit.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Herstelpakket'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Een extra pakje. Groepsberichten worden niet bevestigd, waardoor de ontvanger het beeld kan herstellen als een enkel pakket verloren gaat.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Stuur'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Annuleren'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'Dit beeld kon niet worden gecodeerd.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Het beeldmodel wordt nog steeds gedownload.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Het verzenden van een afbeelding is niet mogelijk op dit apparaat.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Boodschappen met afbeeldingen zijn uitgeschakeld in de instellingen.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Dit radio kan geen beeldpakketten verzenden. Verbind een apparaat met de bijbehorende firmware versie 13 of nieuwer.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Afbeeldingen worden verzonden als groepsgegevens, dus ze kunnen alleen naar een kanaal worden gestuurd — niet via een directe boodschap.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Die afbeelding werd gecodeerd in meer pakketten dan het mesh-formaat toelaat.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pakketten', + one: 'pakket', ); - return 'Image sent as $count $_temp0.'; + return 'Afbeelding verzonden als $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Het beeld kon niet worden verzonden: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Beeld verzenden — pakket $sent van $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Knipper $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$received van de $total pakketten'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Wachten op het ontcijferen'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Tik om te decoderen'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Herstellen… ongeveer 1 seconde'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Afbeelding onvolledig — $received van $total pakketten ontvangen'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => + 'Afbeelding kon niet worden gereconstrueerd'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Beeld ontvangen — beeldontcipheringsapparatuur is uitgeschakeld'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Afbeelding niet langer opgeslagen'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Probeer het opnieuw'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Decode opnieuw'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Inricht'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Tik om te verwerken'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pakketten', + one: 'pakket', ); return '$bytes bytes · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds seconden'; } @override diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index 79bcc671..e632d0a8 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -372,42 +372,44 @@ class AppLocalizationsPl extends AppLocalizations { 'Ustawienia radia zostały zaktualizowane'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Regiony'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => + 'Zarządzanie zapisanymi regionami'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Zarządzanie Regionami'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Wprowadź nazwę regionu'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Dodaj region'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'Pobierz regiony z repeaterów'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => + 'Nie znaleziono żadnych regionów'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Ten region został już dodany'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Nazwa Regionu'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Region usunięto'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Usuń Region'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Czy usunąć \"$region\" z listy regionów?'; } @override @@ -627,10 +629,10 @@ class AppLocalizationsPl extends AppLocalizations { String get settings_infoChannelCount => 'Liczba kanałów'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => 'Sprzęt'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => 'Oprogramowanie wbudowane'; @override String get settings_presets => 'Presety'; @@ -749,16 +751,16 @@ class AppLocalizationsPl extends AppLocalizations { String get appSettings_languageUk => 'Ukraińska'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 bajt'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 bity'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 bajty'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 bajty'; @override String get appSettings_enableMessageTracing => 'Włącz śledzenie wiadomości'; @@ -908,7 +910,7 @@ class AppLocalizationsPl extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3,0-4,2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'Bateria LiPo HV (3,0-4,35 V)'; @override String get appSettings_mapDisplay => 'Wyświetlanie mapy'; @@ -1434,13 +1436,13 @@ class AppLocalizationsPl extends AppLocalizations { } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Region: brak'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Wybierz region'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Przejrzyste obszar'; @override String get chat_noMessages => 'Brak jeszcze wiadomości'; @@ -1499,13 +1501,13 @@ class AppLocalizationsPl extends AppLocalizations { String get chat_sendGif => 'Wyślij GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Wyślij obraz'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Nie mogłem otworzyć tego obrazu'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Otrzymano GIF'; @override String get chat_reply => 'Odpowiedz'; @@ -2747,38 +2749,39 @@ class AppLocalizationsPl extends AppLocalizations { 'Bajty używane do kodowania identyfikatora tego repeatera w tagach ścieżki flood/wykrywania pętli. 0=1 bajt (256 identyfikatorów, do 64 skoków), 1=2 bajty (65 000 identyfikatorów, do 32 skoków), 2=3 bajty (16 milionów identyfikatorów, do 21 skoków). Firmware sprzed v1.14 zawsze używał ścieżek 1-bajtowych; v1.14 i nowsze można skonfigurować na ścieżki 2- lub 3-bajtowe.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Zmiana kluczy tożsamości'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Zmień parę kluczy publiczną/prywatną'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Klucz prywatny'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Nowy klucz prywatny dla wzmacniacza, 128-znakowa string hexadecyimalny.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Wygeneruj losowy klucz parowy'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Przerwij wyszukiwanie kluczowego paru'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Klucz publiczny'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'To jest klucz publiczny, który odpowiada wygenerowanemu kluczowi prywatnemu. Nie można go ustawić bezpośrednio.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Pożądane przedrostek'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Znajdź klucz publiczny, który zaczyna się od tych cyfr hex. Oczekiwana liczba prób: $tries.'; } @override @@ -4549,41 +4552,42 @@ class AppLocalizationsPl extends AppLocalizations { String get translation_title => 'Tłumaczenie'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Włącz wiadomości ze zdjęciami'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Przesyłaj zdjęcia przez siatkę. Wymaga jednorazowego pobrania modelu obrazu.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Model obrazowy'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Pobierz'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Anuluj'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Usuń model'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Gotowy'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Nie opublikowane — ten build nie może tego pobrać.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Model obrazowy nie mógł zostać pobrany.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => + 'Obrazki są przetwarzane automatycznie.'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Odbuduj każde zdjęcie, jak tylko przyjdzie. Zużywa około 2 GB pamięci za każdą drugą sekundę; wyłącz odbudowywanie jednym dotknięciem.'; @override String get translation_enableTitle => 'Włącz tłumaczenie'; @@ -4875,32 +4879,32 @@ class AppLocalizationsPl extends AppLocalizations { String get pathMap_unfollowPacket => 'Przestań śledzić pakiet'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Wyślij obraz'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Zmniejszone do 512 × 512 · proporcje nie zostały zachowane'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => 'Oryginalny'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'W eterze'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Jakość'; @override String get imageSend_qualityStandard => 'Standard'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Wysoko'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Pakiet'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Czas w eterze'; @override String get imageSend_sizeLabel => 'Payload'; @@ -4910,8 +4914,8 @@ class AppLocalizationsPl extends AppLocalizations { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pakietów', + one: 'pakiet', ); return '$count $_temp0'; } @@ -4925,149 +4929,149 @@ class AppLocalizationsPl extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Ustawienia radia nieznane'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Połącz urządzenie, aby można było obliczyć czas trwania transmisji.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Długa transmisja'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Ten kanał będzie dostępny przez około $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Przepływ pakietów: każdy retransmitujący w zasięgu przekazuje każdy pakiet, przez co kanał pozostaje zajęty dłużej niż ten czas.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Pakiet odzysku'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Jedna dodatkowa paczka. Wiadomości grupowe nie są potwierdzane, dzięki czemu odbiorca może odbudować obraz, jeśli zostanie utracona pojedyncza paczka.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Wyślij'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Anuluj'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'Ten obraz nie mógł zostać zakodowany.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Model obrazowy jest nadal pobierany.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Wysyłanie obrazu nie jest dostępne na tym urządzeniu.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Wiadomości ze zdjęciami są wyłączone w ustawieniach.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Ten radiodysk nie może wysyłać pakietów obrazu. Podłącz urządzenie z oprogramowaniem firmware 13 lub nowszym.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Obrazy są przesyłane jako dane grupowe, więc można je wysłać tylko do kanału — nie w wiadomości prywatnej.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Obraz zakodowany do więcej pakietów niż pozwala format siatki.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pakietów', + one: 'pakiet', ); - return 'Image sent as $count $_temp0.'; + return 'Obraz wysłany jako $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Obraz nie mogł zostać wysłany: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Wysyłanie obrazu — pakiet $sent z $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Węzeł $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return 'Otrzymano: $received z $total pakietów'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Oczekiwanie na rozszyfrowanie'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Kliknij, aby odszyfrować'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Odtwarzanie… około 1 sekundy'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Obraz niepełny — $received z $total pakietów dotarło'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'Obraz nie może zostać zrekonstruowany'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Otrzymano obraz — dekodowanie obrazu jest nieprawidłowe.'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Obraz nie jest już przechowywany'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Spróbuj ponownie'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Zdekoduj ponownie'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Ustaw'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Kliknij, aby przetworzyć'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pakiety', + one: 'pakiet', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes bajtów · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds sekund'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes minut $seconds sekundy'; } } diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 9b0cfea1..35ca7d70 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -370,42 +370,43 @@ class AppLocalizationsPt extends AppLocalizations { 'Configurações de rádio atualizadas'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Regiões'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => 'Gerenciar regiões armazenadas'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Gestão de Região'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Nome da região'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Adicionar região'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => + 'Regiões de obtenção a partir de repetidores'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => 'Nenhuma região foi encontrada'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Esta região já foi adicionada'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Nome da Região'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Região excluída'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Excluir Região'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Remover \"$region\" da lista de regiões?'; } @override @@ -905,7 +906,7 @@ class AppLocalizationsPt extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3,0-4,2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'LiPo HV (3,0-4,35V)'; @override String get appSettings_mapDisplay => 'Exibição do Mapa'; @@ -1418,17 +1419,17 @@ class AppLocalizationsPt extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'Região: $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Região: nenhuma'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Escolha uma região'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Região desimpedida'; @override String get chat_noMessages => 'Ainda não existem mensagens.'; @@ -1486,13 +1487,13 @@ class AppLocalizationsPt extends AppLocalizations { String get chat_sendGif => 'Enviar GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Enviar imagem'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Não consegui abrir essa imagem'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Recebi um GIF'; @override String get chat_reply => 'Responder'; @@ -2732,38 +2733,39 @@ class AppLocalizationsPt extends AppLocalizations { 'Bytes usados para codificar o ID deste repetidor nas tags de caminho flood/detecção de loop. 0=1 byte (256 IDs, até 64 saltos), 1=2 bytes (65.000 IDs, até 32 saltos), 2=3 bytes (16 milhões de IDs, até 21 saltos). O firmware anterior à v1.14 sempre usava caminhos de 1 byte; v1.14 e versões mais recentes podem ser configuradas para caminhos de 2 ou 3 bytes.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Alterar Chaves de Identidade'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Altere a chave pública/chave privada'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Chave privada'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Uma nova chave privada para o repetidor, uma string hexadecimal de 128 caracteres.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Gere um par de chaves aleatório'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Interrompa a busca por par de chaves'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Chave pública'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Esta é a chave pública que acompanha a chave privada gerada. Você não pode definir isso diretamente.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Prefixo desejado'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Encontre uma chave pública que comece com esses dígitos hexadecimais. Número esperado de tentativas: $tries.'; } @override @@ -4527,41 +4529,42 @@ class AppLocalizationsPt extends AppLocalizations { String get translation_title => 'Tradução'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Mensagens de imagem'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Envie as imagens pela malha. Requer o download de um modelo de imagem único.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Modelo de imagem'; @override String get imageMessages_downloadModel => 'Download'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Cancelar'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Remover modelo'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Pronto'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Ainda não publicado — esta versão não pode baixá-lo.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'O modelo de imagem não pôde ser baixado.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => + 'Processar imagens automaticamente'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Reconstrua cada imagem assim que ela chegar. Utiliza cerca de 2 GB de memória por segundo; dispense a reconstrução com um toque.'; @override String get translation_enableTitle => 'Ativar a tradução'; @@ -4847,43 +4850,43 @@ class AppLocalizationsPt extends AppLocalizations { String get pathMap_unfollowPacket => 'Liberar vista do pacote'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Enviar imagem'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Redimensionado para 512 × 512 · a proporção de aspecto não foi preservada'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => 'Texto Original'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'Ao ar'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Qualidade'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => 'Padrão'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Alto'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Pacotes'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Tempo em transmissão'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Carga útil'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pacotes', + one: 'pacote', ); return '$count $_temp0'; } @@ -4897,149 +4900,150 @@ class AppLocalizationsPt extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => + 'Configurações de rádio desconhecidas'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Conecte-se a um dispositivo para que o horário de transmissão possa ser calculado.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Transmissão longa'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Isso manterá o canal por cerca de $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Roteamento de inundação: cada repetidor na faixa retransmite cada pacote, fazendo com que o canal permaneça ocupado por mais tempo do que isso.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Pacote de recuperação'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Um pacote extra. As mensagens em grupo não são reconhecidas, assim permitindo que o destinatário reconstrua a imagem caso um pacote seja perdido.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Enviar'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Cancelar'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'Esta imagem não pode ser codificada.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'O modelo de imagem ainda está baixando.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'O envio de imagem não está disponível neste dispositivo.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'As mensagens de imagem estão desativadas nas configurações.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Este rádio não pode enviar pacotes de imagem. Conecte um dispositivo com firmware companheiro versão 13 ou superior.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'As imagens viajam como dados em grupo, portanto, só podem ser enviadas para um canal — não em mensagem direta.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Essa imagem foi codificada em mais pacotes do que o formato de malha permite.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pacotes', + one: 'pacote', ); - return 'Image sent as $count $_temp0.'; + return 'Imagem enviada como $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'A imagem não pôde ser enviada: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Envio da imagem — pacote $sent de $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Nó $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$received de $total pacotes'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Aguardando para decodificar'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Toque para decodificar'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Reconstruindo… cerca de 1 segundo'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Imagem incompleta — $received de $total pacotes chegaram'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'A imagem não pôde ser reconstruída'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Imagem recebida — decodificação de imagem incorreta'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Imagem não armazenada'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Tente novamente'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Decodifique novamente'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Configurar'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Toque para processar'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'pacotes', + one: 'pacote', ); return '$bytes bytes · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds segundos'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes min $seconds s'; } } diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index 6912aa10..5e72807f 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -369,42 +369,45 @@ class AppLocalizationsRu extends AppLocalizations { String get settings_radioSettingsUpdated => 'Настройки радио обновлены'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Регионы'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => + 'Управление сохранёнными регионами'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Управление регионами'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Введите название региона'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Добавить регион'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => + 'Извлекать регионы с ретрансляторов'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => + 'Не были найдены никакие регионы'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Этот регион уже был добавлен'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Название региона'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Регион удалён'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Удалить регион'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Удалить \"$region\" из списка регионов?'; } @override @@ -624,10 +627,11 @@ class AppLocalizationsRu extends AppLocalizations { String get settings_infoChannelCount => 'Количество каналов'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => 'Оборудование'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => + 'Производственное программное обеспечение'; @override String get settings_presets => 'Пресеты'; @@ -746,16 +750,16 @@ class AppLocalizationsRu extends AppLocalizations { String get appSettings_languageUk => 'Українська'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 байт'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 байта'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 байта'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 байта'; @override String get appSettings_enableMessageTracing => @@ -907,7 +911,7 @@ class AppLocalizationsRu extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3.0–4.2 В)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'LiPo HV (3,0–4,35 В)'; @override String get appSettings_mapDisplay => 'Отображение карты'; @@ -1419,17 +1423,17 @@ class AppLocalizationsRu extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'РЕГИОН: $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Регион: отсутствует'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Выберите регион'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Чистый регион'; @override String get chat_noMessages => 'Сообщений пока нет'; @@ -1487,13 +1491,13 @@ class AppLocalizationsRu extends AppLocalizations { String get chat_sendGif => 'Отправить GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Отправьте изображение'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Не удалось открыть это изображение'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Получен GIF'; @override String get chat_reply => 'Ответить'; @@ -2737,38 +2741,38 @@ class AppLocalizationsRu extends AppLocalizations { 'Байты, используемые для кодирования идентификатора этого ретранслятора в тегах flood-маршрута/обнаружения циклов. 0 = 1 байт (256 идентификаторов, до 64 переходов), 1 = 2 байта (65 000 идентификаторов, до 32 переходов), 2 = 3 байта (16 миллионов идентификаторов, до 21 перехода). Прошивки до v1.14 всегда использовали 1-байтовые маршруты; v1.14 и новее можно настроить на 2- или 3-байтовые маршруты.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Изменить ключи идентичности'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Измените пару публичных/частных ключей'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Личный ключ'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Для повторителя генерируется новый приватный ключ — шестнадцатеричная строка из 128 символов.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Сгенерируйте случайный ключ-пару'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => 'Прервать поиск ключной пары'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Публичный ключ'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Это публичный ключ, который соответствует сгенерированному приватному ключу. Вы не можете установить его напрямую.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Желаемый префикс'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Найдите публичный ключ, начинающийся этими шестнадцатеричными цифрами. Ожидаемое количество попыток: $tries.'; } @override @@ -4543,41 +4547,42 @@ class AppLocalizationsRu extends AppLocalizations { String get translation_title => 'Перевод'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Включить изображения в сообщения'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Отправьте изображения через сеть. Требуется однократная загрузка шаблона изображения.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Модель изображения'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Скачать'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Отмена'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Удалить модель'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Готов'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Пока не опубликовано — эта сборка не может скачать это.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Модель изображения не удалось скачать.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => + 'Автоматически обрабатывать изображения'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Примерно каждое изображение реконструируйте сразу после его поступления. Для этого на каждый раз используется около 2 ГБ памяти; отключите реконструкцию касанием.'; @override String get translation_enableTitle => 'Включить перевод'; @@ -4867,43 +4872,45 @@ class AppLocalizationsRu extends AppLocalizations { String get pathMap_unfollowPacket => 'Не следить за пакетом'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Отправьте изображение'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Меняется размер на 512 × 512 · соотношение сторон не сохраняется'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => 'Оригинал'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'В эфире'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Качество'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => 'Стандарт'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Высота'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Пакеты'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Время на эфире'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Пакет'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'пакета', + many: 'пакетов', + few: 'пакета', + one: 'пакет', ); return '$count $_temp0'; } @@ -4917,149 +4924,150 @@ class AppLocalizationsRu extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Настройки радио неизвестны'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Подключитесь к устройству, чтобы можно было рассчитать время эфирного времени.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Долгая передача'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Это будет поддерживать канал примерно $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Руководство по маршрутизации потоков: каждый ретрансатор в зоне перераспределяет каждый пакет, поэтому канал остаётся занятным дольше, чем это.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Пакет восстановления'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Один дополнительный пакет. Групповые сообщения не подтверждаются, поэтому это позволяет получателю восстановить изображение, если один пакет потерян.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Отправить'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Отмена'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => + 'Это изображение не может быть закодировано.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Модель изображения всё ещё загружается.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Отправка изображения на этом устройстве недоступна.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'В настройках отключены сообщения с изображениями.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Это радио не может отправлять пакеты изображений. Подключите устройство, работающее на прошивке-компаньоне версии 13 или выше.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Изображения передаются как групповые данные, поэтому их можно отправлять только в канал, а не в личное сообщение.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Изображение было закодировано в больше пакетов, чем позволяет формат сетки.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'пакетов', + one: 'пакет', ); - return 'Image sent as $count $_temp0.'; + return 'Изображение отправлено как $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Изображение не может быть отправлено: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Отправка изображения — пакет $sent из $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Узел $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '$received из $total пакетов'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Ожидание расшифровки'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Нажмите для декодирования'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Реконструкция… примерно за 1 секунду'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Отсутствует изображение — $received из $total пакетов пришло'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'Изображение не может быть восстановлено'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Получен изображение — декодирование изображения неправильное'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Изображение больше не сохраняется'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Попробуйте снова'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Декодируйте снова'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Настройте'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Нажмите для обработки'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'пакетов', + one: 'пакет', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes байт · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds секунд'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes м $seconds с'; } } diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index 99927843..55599371 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -368,42 +368,42 @@ class AppLocalizationsSk extends AppLocalizations { String get settings_radioSettingsUpdated => 'Nastavenia rádia aktualizované'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Regiony'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => 'Zohľať uložené regiony'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Regiónne vedenie'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Vstuptejte název regionu'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Dodajte region'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'Odberanie regionov z repeaterov'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => 'Nebylo našli žiadné regiony'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Tento oblast je už dodán'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Regionné název'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Regionu zníteno'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Vyniknúcia regionu'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Odstraniť $region z listy regionov?'; } @override @@ -740,16 +740,16 @@ class AppLocalizationsSk extends AppLocalizations { String get appSettings_languageUk => 'Ukrajinská'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 byt'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 bity'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 bity'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 bity'; @override String get appSettings_enableMessageTracing => 'Povoliť sledovanie správ'; @@ -1412,13 +1412,13 @@ class AppLocalizationsSk extends AppLocalizations { } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Region: žiadné'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Vyberte region'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Jasný údajný oblasť'; @override String get chat_noMessages => 'Zatiaľ žiadne správy.'; @@ -1476,13 +1476,13 @@ class AppLocalizationsSk extends AppLocalizations { String get chat_sendGif => 'Odoslať GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Vyslat obraz'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Nesmiela jsem otvoriť tento obrázok'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Odeslaný GIF'; @override String get chat_reply => 'Odpovedať'; @@ -2718,38 +2718,39 @@ class AppLocalizationsSk extends AppLocalizations { 'Bajty použité na zakódovanie ID tohto opakovača v tagoch flood trasy/detekcie slučky. 0=1 bajt (256 ID, až 64 skokov), 1=2 bajty (65 000 ID, až 32 skokov), 2=3 bajty (16 miliónov ID, až 21 skokov). Firmvér pred v1.14 vždy používal 1-bajtové trasy; v1.14 a novšie možno nakonfigurovať na 2- alebo 3-bajtové trasy.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Zmena identititačných klíčov'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Zmena prehľadného/osobného klíčového zbraň'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Prívatná klíč'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Nová prívna klíčová číslo pre repeater, 128-znáčlový šestnáctorýč.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Vytvorenie príma kľúčového paru'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Prerušenie hľadania klíčového paru'; @override String get repeater_pubKey => 'Public key'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Táto je veľká klíč, ktorý sa vztahuje s generovaným manéčným klíčom. Nemožné je to ustanovit priateľne.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Požadovaný prefiks'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Zahľadnite sa veľkú publicenu klíču, ktorá začíná tými šestícih štiastkami. Očekivané potrebné pokusy: $tries.'; } @override @@ -4508,41 +4509,41 @@ class AppLocalizationsSk extends AppLocalizations { String get translation_title => 'Preklad'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Zabezpečte zobrazi'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Odeslanie obrazov pre mšťanie. Potrebujete jednorazové stáhnutie modelu obrazov.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Model v kínajme'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Stáhnie'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Zastavenie'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Vyhniť model'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Čiačný'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Nesprávne vypisáné — tento prechovka nie môže jej stáhnuť.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Model s obrázkom nemôžno sťažovať.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => 'Automaticky prepojiť slučaje.'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Rekonstruujte každý obraz tak, ako pridá. Používajete okolo 2 GB pamäti pre drugú hodinu; odložte rekonstrukciu tým kliknutím.'; @override String get translation_enableTitle => 'Aktivovať preklad'; @@ -4831,43 +4832,44 @@ class AppLocalizationsSk extends AppLocalizations { String get pathMap_unfollowPacket => 'Odomknúť pohľad od paketu'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Vyslat obraz'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Zmeneno na 512 × 512 · vzorýst nie byl zachovan'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => + 'Výborný text:\n\n\"Language is the road map of a culture. It tells us where to go as a society and helps us understand the world around us. Learning a new language opens up new perspectives and opportunities, allowing us to connect with people from different backgrounds and build bridges between cultures.\"\n\nSlovenská preklada:\n\n\"Jazyk je cesta pre zručnosti a odráža kultúru. Dá nám uvedomi, dokádať, kúdy sa pohladneme a pomáha našej společnosti poradiť sa v rôznych okolnosti a porozumieť o svetu kolem nás. Nauka nového jazyka otviera nové perspektívy a možnosti, čo pohybuje našu schopnosť sa spoluprávať s ľudmi z rôznych okolnosti a budovať mosty medzi kultúry.\"'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'V prúce'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Kvalita'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => 'Stándard'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Vysoká'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Pakety'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Čas na anteni'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Základ'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paketov', + one: 'paket', ); return '$count $_temp0'; } @@ -4881,140 +4883,140 @@ class AppLocalizationsSk extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Nastavenia radio nezná'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Zkonečte s určým prijemcem, aby sa mohlo výpočet času, ktorý je v prúbežu.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Dlouhá transmisia'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Tento dôvod udrží kanál priamo na $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Povodný routing: každý repeater v rozsahu zrňa každý paket, takže kanál zostá zajetší dlouше, než tu.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Poučný paket pre očudenie'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Jedný dodatný paket. Skúsené súhlasy nie sa uznávaú, takže to umožňuje prechovávaču opraviť obraz, pokiaľ sa jedný paket niebyl ztrácený.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Odeslať'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Zastavenie'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'Tento obráz nie byla byla schována.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Model prehľadovania prebeža stále stále stále prechádza.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Zobrazenie nie je dostupný na tomto zariadení.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Zobrazy s prešteľkami sú v nastavení vypnené.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Tento radiok nie môže odeslať obrazové pakety. Podeďte správne určité zařízení s oprogramovaním spolupráce 13 alebo novším.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Obrazy sa prechádzajú jako skupinové údaje, preto sa ich môžu odeslať len na kanál — nie v príbeh sa.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Tento obraz byl skodyrovany do viac paketov, ako umožňuje si sítka format.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paketov', + one: 'paket', ); - return 'Image sent as $count $_temp0.'; + return 'Obrázok odoslaný ako $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Obraz nemôžlo odeslať: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Vysyťanie obrazu — pakét $sent z $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Vęzlo $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return 'Otrzymané $received z $total pakotí'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Čekanie na dekódovanie'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Kliknite, aby dekódovať'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Rekonstrukcia… o čoľve 1 s'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Obraz nieješťajný — $received z $total paciek príšlo'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'Obraz nemôžu byť prepojený'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Otrzymaná slúba — dekódovanie slúby je vypadejce'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Obraz nemá uložený'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Zkôr to opítajte'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Zdeľte sa znovu'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Založte'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Ukliknite, aby sa príjomili'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paketov', + one: 'paket', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes bajtov · $packets $_temp0'; } @override @@ -5024,6 +5026,6 @@ class AppLocalizationsSk extends AppLocalizations { @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes min $seconds s'; } } diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index f8fdf85b..bc5fa9a5 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -367,42 +367,43 @@ class AppLocalizationsSl extends AppLocalizations { String get settings_radioSettingsUpdated => 'Radio nastavitve posodobljene'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Regioni'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => 'Upravljanje opisanih regionov'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Regijonsko upravljanje'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Naslov občine'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Dodaj region'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => + 'Pobražujte izvajne področja iz ponavljalnikov'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => 'Nižnih občin ni izkrali'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Taj oblasi je več pomanjkan.'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Naziv Regiona'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Oblikačena regija'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Prihoda Region'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Ostani $region iz listy regionov?'; } @override @@ -617,10 +618,10 @@ class AppLocalizationsSl extends AppLocalizations { String get settings_infoChannelCount => 'Število kanalov'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => 'Hardver'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => 'Pravilnik'; @override String get settings_presets => 'Prednastavitve'; @@ -738,16 +739,16 @@ class AppLocalizationsSl extends AppLocalizations { String get appSettings_languageUk => 'Ukrajinsko'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 bajt'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 bite'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 bite'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 bite'; @override String get appSettings_enableMessageTracing => 'Omogoči sledenje sporočilom'; @@ -896,7 +897,7 @@ class AppLocalizationsSl extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3,0-4,2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'LiPo HV (3,0–4,35 V)'; @override String get appSettings_mapDisplay => 'Prikaz zemljevida'; @@ -1406,17 +1407,17 @@ class AppLocalizationsSl extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'Osebno: $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Region: brak'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Vablajte region'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Jasna regija'; @override String get chat_noMessages => 'Še ni sporočil.'; @@ -1475,13 +1476,13 @@ class AppLocalizationsSl extends AppLocalizations { String get chat_sendGif => 'Pošlji GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Sločaji slik'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Nispeval sem tega ta slik'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Otrvljen GIF'; @override String get chat_reply => 'Odgovori'; @@ -2714,38 +2715,39 @@ class AppLocalizationsSl extends AppLocalizations { 'Bajti, uporabljeni za kodiranje ID-ja tega repetitorja v oznakah flood poti/zaznavanja zank. 0=1 bajt (256 ID-jev, do 64 skokov), 1=2 bajta (65.000 ID-jev, do 32 skokov), 2=3 bajti (16 milijonov ID-jev, do 21 skokov). Vdelana programska oprema pred v1.14 je vedno uporabljala 1-bajtne poti; v1.14 in novejše je mogoče nastaviti na 2- ali 3-bajtne poti.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Zmeničke ključe identitete'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Zamenjajte publican ali privatni ključni par'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Privarna ključa'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Nova privatna ključa za prekaznik, 128- znakovni šestnastik.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Sporočna ključna para'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => + 'Prekajanje odkrivanja ključne paro'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Public key (publična ključa)'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Taj je publicna ključ, ki pomeni pripovedno privatno ključ. Ne možeš to vrediti direktno.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Poželana prefiks'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Najdi publicen ključ, ki začne s tih hexnih čitov. Očekivani pokusi: $tries.'; } @override @@ -4507,41 +4509,41 @@ class AppLocalizationsSl extends AppLocalizations { String get translation_title => 'Prevod'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Pozivni izkričile slike'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Prešli vzorce pre mrežo. Potrebno je jednokratno stworiti model vzorca.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Obrazni model'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Storba'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Odločite'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Ubrani model'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Gotov'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Jo še niso izdana — ta izdelka te ne može prebaviti.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Obrazni model ne može biti preuzet.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => 'Avtomatizirane slike'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Katero je oblikovanje svega oblikov, ko se pošteva. Za drugo okolo časa se koristi ok. 2 GB pamične prostore; odločite se za oblikovanje s tukom.'; @override String get translation_enableTitle => 'Omogočite prevod'; @@ -4832,43 +4834,44 @@ class AppLocalizationsSl extends AppLocalizations { String get pathMap_unfollowPacket => 'Odkleni pogled od paketa'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Sločaji slik'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Zadovoljno izmenjeno na 512 × 512 · vzorovni odnos ne ohranjen'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => + 'Original text:\n\nThe early bird catches the worm.\n\nTranslation:\n\nPojdi prvi, zlati v kroku.'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'Na vodi'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Kakovost'; @override String get imageSend_qualityStandard => 'Standard'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Vysoko'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Pakete'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Čas v eteru'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Napravo'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paketov', + one: 'paket', ); return '$count $_temp0'; } @@ -4882,140 +4885,140 @@ class AppLocalizationsSl extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Naslušniki radio neznane'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Poučajte se na stroj, da se lahko izračunuje čas v prikazu.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Dluga preposlana'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Ovo bo ohranilo kanal prihodno za obliko $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Povlatni potok: sve repeaterje v območju pretrasirajo svak paket, pa kanál ostane zanudnejši od tega.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Pobavni paket zdržbe'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Jedna dodatna paczka. Grupni izjasi ne izvajajo potvarnosti, pa ta izdelka omogoča preuzimanju ponovno izgleda, če je zgubjen pojedni paket.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Posyłaj'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Odločite'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'Ovo slikovo ne more biti zakodirano.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Obrazni model še pospeva preborjanje.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Poslanje slike nema na tem zelo naročnem naročnem.'; @override - String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + String get imageSend_codecDisabled => 'Obrazi s pomanjkanjem so v nastavnih.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Taj radio ne može posredovati slike pakuete. Prepoštijo izbirni napravnik s kompanijskimi programi na čevem 13 ali novšejšim.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Obrazy se pojavijo kot skupnih podatkov, pa lahko ih poslujejo samo na kanal — ne v prilogih.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Taj slik je zakodiran v viših pakotnih od športne formate, ki omogoča mrežni format.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paketov', + one: 'paket', ); - return 'Image sent as $count $_temp0.'; + return 'Slika poslana kot $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Obraz ne može biti poslany: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Prekazivanje izkaza — paket $sent od $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Vrtitev $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return 'Otrteno od $received na $total poslovanih potokov'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Čekanje, da se dekodira'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Kliknite, da razkrivete'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => + 'Ostvarjanje… o prihodnosti za okolo 1 s'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Obraz nije kompletan — $received od $total poslaničev je prishodil'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'Obraz ne more lahko rekonstruirati'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Otrgena slika — dekodirana slika je izključena'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Obraz ni več niso zakajiren'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Pokušajte znova'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Dekodiraj ponovno'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Nastavite'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Kliknij za obravnavanje'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paketov', + one: 'paket', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes bajtov · $packets $_temp0'; } @override diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index dfb24cb6..809cb0f2 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -366,42 +366,42 @@ class AppLocalizationsSv extends AppLocalizations { 'Radioinställningarna har uppdaterats'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Regioner'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => 'Hämtade regioner'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Regionförvaltning'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Enter regionnamn'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Lag till region'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'Hämtar regioner från repeater'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => 'Ingen region hittades'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Denna region har redan lagt till'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Regionnavn'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Regionens kallt offentlig'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Förhålla regio'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Fjärna \"$region\" ur regionlistan?'; } @override @@ -617,7 +617,7 @@ class AppLocalizationsSv extends AppLocalizations { String get settings_infoHardware => 'Hardware'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => 'Föredata'; @override String get settings_presets => 'Fördefinierade inställningar'; @@ -738,13 +738,13 @@ class AppLocalizationsSv extends AppLocalizations { String get repeater_pathHashModeOption0 => '0 - 1 byte'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 byte'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 byte'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 byte'; @override String get appSettings_enableMessageTracing => 'Aktivera meddelandespårning'; @@ -889,7 +889,7 @@ class AppLocalizationsSv extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3,0-4,2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'LiPo HV (3,0-4,35 V)'; @override String get appSettings_mapDisplay => 'Kartvisning'; @@ -1402,13 +1402,13 @@ class AppLocalizationsSv extends AppLocalizations { } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Region: ingen'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Välj en region'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'klar region'; @override String get chat_noMessages => 'Inga meddelanden ännu'; @@ -1468,13 +1468,13 @@ class AppLocalizationsSv extends AppLocalizations { String get chat_sendGif => 'Skicka GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => 'Send vagnbild'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Kunde inte öppna det bildet'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Mottagit en GIF'; @override String get chat_reply => 'Svara'; @@ -2702,38 +2702,38 @@ class AppLocalizationsSv extends AppLocalizations { 'Byte som används för att koda denna repeaters ID i taggar för flood-väg/loopdetektering. 0=1 byte (256 ID:n, upp till 64 hopp), 1=2 byte (65 000 ID:n, upp till 32 hopp), 2=3 byte (16 miljoner ID:n, upp till 21 hopp). Firmware före v1.14 använde alltid 1-byte-vägar; v1.14 och nyare kan konfigureras för 2- eller 3-byte-vägar.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Ändra identitetsnyckel'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Vänd nya offentliga/privata nyckelpar'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Privat nyckel'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'En ny privat nyckel för repeatern, en hexsträng med 128 tecken.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Generera en kära nyckelpaar'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => 'Avbröka sökande efter nyckelpa'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Öffentlig nyckel'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Detta är den offentliga nyckeln som tillhör genererad privaten nyckel. Du kan inte setta den direkt.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Önskad prefix'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Hitta en offentlig nyckel som börjar med dessa hexadecimala siffror. Förväntad antal försök: $tries.'; } @override @@ -4480,41 +4480,42 @@ class AppLocalizationsSv extends AppLocalizations { String get translation_title => 'Översättning'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Bildermeddelanden'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Send bilder över mönstret. Det kräver en enkelt bildmodellhämtning.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Bildmodell'; @override String get imageMessages_downloadModel => 'Download'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Avbud'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Förhåll dig från modellen'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Färdig'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Ingen publikerad än — denna byggnads kan inte laddas ner av det.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Bildmodellen kunde inte laddas ner.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => + 'Automatiska bilder automatiserar'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Rekonstruera varje bild så snart den ankommer. Använder cirka 2 GB minne varje gång; låt det omför att rekonstruera genom ett tap.'; @override String get translation_enableTitle => 'Aktivera översättning'; @@ -4802,43 +4803,44 @@ class AppLocalizationsSv extends AppLocalizations { String get pathMap_unfollowPacket => 'Lås upp vy från paket'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => 'Send vagnbild'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Reserverat till 512 × 512 · förhållandet mellan storlek inte bevarat'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => + 'Ovanstående text (engelska)\n\nTranslation (svenskt):'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'Underför hjärnan'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Kvalitet'; @override String get imageSend_qualityStandard => 'Standard'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Hög'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Paket'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Tid i övrighet'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Ladning'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paket', + one: 'paket', ); return '$count $_temp0'; } @@ -4852,149 +4854,149 @@ class AppLocalizationsSv extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Radioindikatorer inte kända'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Förkoppna till ett enhet så kan tiden på air beräknas.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Långförsending'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Detta kommer att bevara kanalen roughly $duration.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Flodledning: varje repeater i ramen retransmitterar varje paket, så kan kanalen vara på arbete långare än den här tiden.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Omedlningspaket'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'En ytterligare paket. Gruppmeddelanden inte akceras, så den här tar hänsyn till att mottar kan återuppbygga bilden om ett enkelt paket förlorats.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Sänd'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Avbud'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => 'Denna bild kan inte kodas.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Bildmodellen downloads fortfarande.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Bildsendning är inte tillgänglig på detta enhet.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Bildmeddelanden är offna i inställningarna.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Denna radi kan inte senda bildpaket. Använd ett äventyrsgerät med companionsystemfirmware 13 eller nyare.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Bilder senders som gruppod, så de kan endast skickas till ett kanal – inte i en direkt meddelning.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Bilden kodades till mer paket än meshformaten tillåter.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paket', + one: 'paket', ); - return 'Image sent as $count $_temp0.'; + return 'Bilden skickades som $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Bilden kunde inte skickas: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Bild sendning — paket $sent av $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Nod $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return 'VANTA $received av $total paket'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Att väta att decodera'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Tap för att decodera'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Rekonstruktion… om 1 sekund'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Bilden är okomplett — $received av $total paket har ankomit'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'Bilden kunde inte rekonstrueras'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Bild mottagen — bilddekoderingen är avbrott'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Bild inte lagrad längre'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Omförs igen'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Kodera igen'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Skapa en uppställning'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Tap för att behandla'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'paket', + one: 'paket', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes byte · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds sekunder'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes min $seconds s'; } } diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index 899ee0b5..14b92e8d 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -368,42 +368,42 @@ class AppLocalizationsUk extends AppLocalizations { String get settings_radioSettingsUpdated => 'Налаштування радіо оновлено'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => 'Ріси'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => 'Управляти збережених регіонів'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => 'Рégіональний управління'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => 'Назва регіону'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => 'Добачить регіон'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => 'Збираємо регіони з репітерів'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => 'Ні відкриті регіони'; @override String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + 'Цей регіон вже було доданий'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => 'Ріонна назва'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => 'Ріон витертений'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => 'Видалення регіону'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return 'Вирішіть \"$region\" з списку регіонів?'; } @override @@ -622,10 +622,10 @@ class AppLocalizationsUk extends AppLocalizations { String get settings_infoChannelCount => 'Кількість каналів'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => 'Оборудовання'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => 'Програмне вміст (фirmware)'; @override String get settings_presets => 'Попередні налаштування'; @@ -743,16 +743,16 @@ class AppLocalizationsUk extends AppLocalizations { String get appSettings_languageUk => 'Українська'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 байт'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 байти'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 байти'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 байта'; @override String get appSettings_enableMessageTracing => @@ -901,7 +901,7 @@ class AppLocalizationsUk extends AppLocalizations { String get appSettings_batteryLipo => 'LiPo (3.0-4.2В)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => 'ЛиPo HV (3,0-4,35 В)'; @override String get appSettings_mapDisplay => 'Відображення карти'; @@ -1412,17 +1412,17 @@ class AppLocalizationsUk extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return 'Ріон: $region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => 'Ріон: нема'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => 'Вybірте регіон'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => 'Чистя зона'; @override String get chat_noMessages => 'Поки немає повідомлень.'; @@ -1481,13 +1481,14 @@ class AppLocalizationsUk extends AppLocalizations { String get chat_sendGif => 'Надіслати GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => + 'Нашкоду зовні\n\n(or more naturally, depending on context)\n\nПошукуєте изображення'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => 'Неможливо відкрити це изображення'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => 'Підймовано GIF'; @override String get chat_reply => 'Відповісти'; @@ -2734,38 +2735,38 @@ class AppLocalizationsUk extends AppLocalizations { 'Байти, що використовуються для кодування ідентифікатора цього ретранслятора в тегах flood-шляху/виявлення петель. 0=1 байт (256 ідентифікаторів, до 64 переходів), 1=2 байти (65 000 ідентифікаторів, до 32 переходів), 2=3 байти (16 мільйонів ідентифікаторів, до 21 переходу). Прошивки до v1.14 завжди використовували 1-байтові шляхи; v1.14 і новіші можна налаштувати на 2- або 3-байтові шляхи.'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => 'Зміна ключів ідентифікації'; @override String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + 'Замініть публічний/приватний ключ'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => 'Приватний ключ'; @override String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + 'Нова приватна ключ для репітера, 128-символова штучна штука в шестнадцатеричному форматі.'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => 'Синхронізujте ключовий пару'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => 'Прервити шук ключового пару'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => 'Публічна ключ'; @override String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + 'Це публична ключ, який пов\'язано з створеною приватною ключом. Ви не можете встановлювати його напрямую.'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => 'Високорейтингове прикінання'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return 'Найдіть відповідний открытий ключ, який починається ціми шестнадцатыми цифрами. Ожидається кількість потрібних попыток: $tries.'; } @override @@ -4540,41 +4541,41 @@ class AppLocalizationsUk extends AppLocalizations { String get translation_title => 'Переклад'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => 'Підтримка зображень для посилання'; @override String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + 'Пошукуєте изображення через сеть. Вимagaєте однократне скачання моделю изображення.'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => 'Модель для зображень'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => 'Скачання'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => 'Завершити'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => 'Видалим модель'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => 'Готово'; @override String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + 'Щоб не було опубліковано — це версія не дозволяє зробити скачання.'; @override String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + 'Модель для зображень не можна сказати.'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => 'Автоматично оброблювати obraзи'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + 'Кожна картинка повинні бути відтворена на мій момент прибуття. Використовує приблизно 2 ГБ пам\'яті на кожен раз; відключіть від відтворення за допомогою кlikу.'; @override String get translation_enableTitle => 'Увімкнути переклад'; @@ -4867,43 +4868,46 @@ class AppLocalizationsUk extends AppLocalizations { String get pathMap_unfollowPacket => 'Відв\'язати вигляд від пакету'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => + 'Нашкоду зовні\n\n(or more naturally, depending on context)\n\nПошукуєте изображення'; @override String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + 'Манітовано до 512 × 512 · соотношення варість не зберігається'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => 'Оригінал'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => 'На ері'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => 'Качество'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => 'Стандарт'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => 'Висок'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => 'Пакети'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => 'Час на ері'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => 'Підлог'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'пакета', + many: 'пакетів', + few: 'пакети', + one: 'пакет', ); return '$count $_temp0'; } @@ -4917,149 +4921,150 @@ class AppLocalizationsUk extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => 'Настройки радио неизвестні'; @override String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + 'Залучіться до пристрою, щоб можна було розрахунювати час в етері.'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => 'Длуга передача'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return 'Це забезпечить канал на approximativno $duration хвилин.'; } @override String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + 'Рухування потоків: кожен ретрансатор у діапазоні відправлює кожен пакет, тому канал залишається занятшим довше, ніж це.'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => 'Пакет відновлення'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + 'Один дополний пакет. Групові посилання не відповідають, тому це дозволяє відвідувачу відтворити зображення, якщо один пакет втрачений.'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => 'Пошутить'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => 'Завершити'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => + 'Це изображення не може бути кодировано.'; @override String get imageSend_codecDownloading => - 'The image model is still downloading.'; + 'Модель для відтворення изображень ще збирається.'; @override String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + 'Постій для відправлення изображень на цьому пристрої не доступний.'; @override String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + 'Пictesovani posyly wyключені в настройках.'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + 'Цей радіопередач не може отправляти пакети зображень. Зконнете пристрої, що працює з обладнанням керемонітом компаньєр 13 або новшим.'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + 'Фотографії передаються як дані групою, тому їх можна відправляти лише на канал — не в прямому посилання.'; @override String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + 'Це изображення кодує більше пакітів, ніж дозволяє формат сети.'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: 'пакетів', + one: 'пакет', ); - return 'Image sent as $count $_temp0.'; + return 'Зображення надіслано як $count $_temp0.'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return 'Изображення не можна відправити: $error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return 'Пошускаємо изображення — пакет $sent з $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return 'Нод $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return 'Підходяче: $received з $total пакітів'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => 'Очікування розслівання коду'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => 'Кliknite для декодування'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => 'Повноювання… за прибуття 1 с.'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return 'Образок не повний — $received з $total пакітів прибавлено'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => 'Obraz не можна відтворити'; @override String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + 'Під час приємки — розшифровка зображення не вдалося.'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => 'Изображення не зберігається'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => 'Попробуй ще раз'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => 'Декодуй ще раз'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => 'Заведіть'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => 'Кликніть для обробки'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: 'пакетів', + one: 'пакет', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes байтів · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds секунди'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes хв $seconds с'; } } diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 6d73146d..24ace3a4 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -351,42 +351,41 @@ class AppLocalizationsZh extends AppLocalizations { String get settings_radioSettingsUpdated => '无线电设置已更新'; @override - String get settings_regionSettings => 'Regions'; + String get settings_regionSettings => '地区'; @override - String get settings_regionSettingsSubtitle => 'Manage stored regions'; + String get settings_regionSettingsSubtitle => '管理已存储的区域'; @override - String get settings_regionManagement_screenTitle => 'Region Management'; + String get settings_regionManagement_screenTitle => '区域管理'; @override - String get settings_regionNameHint => 'Enter region name'; + String get settings_regionNameHint => '区域名称'; @override - String get settings_regionAddRegion => 'Add region'; + String get settings_regionAddRegion => '增加地区'; @override - String get settings_regionFetchRegions => 'Fetch regions from repeaters'; + String get settings_regionFetchRegions => '从中继器获取区域'; @override - String get settings_regionFetchRegionsFail => 'No regions were found'; + String get settings_regionFetchRegionsFail => '未发现任何地区'; @override - String get settings_regionFetchRegionsAlreadyExists => - 'This region has already been added'; + String get settings_regionFetchRegionsAlreadyExists => '该地区已被添加'; @override - String get settings_regionName => 'Region Name'; + String get settings_regionName => '地区名称'; @override - String get settings_regionDeleted => 'Region deleted'; + String get settings_regionDeleted => '区域已删除'; @override - String get settings_deleteRegion => 'Delete Region'; + String get settings_deleteRegion => '删除区域'; @override String settings_deleteRegionConfirm(String region) { - return 'Remove \"$region\" from region list?'; + return '从 $region 列表中删除?'; } @override @@ -588,10 +587,10 @@ class AppLocalizationsZh extends AppLocalizations { String get settings_infoChannelCount => '频道数量'; @override - String get settings_infoHardware => 'Hardware'; + String get settings_infoHardware => '硬件'; @override - String get settings_infoFirmware => 'Firmware'; + String get settings_infoFirmware => '固件'; @override String get settings_presets => '预设'; @@ -708,16 +707,16 @@ class AppLocalizationsZh extends AppLocalizations { String get appSettings_languageUk => '乌克兰语'; @override - String get repeater_pathHashModeOption0 => '0 - 1 byte'; + String get repeater_pathHashModeOption0 => '0 - 1 字节'; @override - String get repeater_pathHashModeOption1 => '1 - 2 bytes'; + String get repeater_pathHashModeOption1 => '1 - 2 字节'; @override - String get repeater_pathHashModeOption2 => '2 - 3 bytes'; + String get repeater_pathHashModeOption2 => '2 - 3 字节'; @override - String get repeater_pathHashModeOption3 => '3 - 4 bytes'; + String get repeater_pathHashModeOption3 => '3 - 4 字节'; @override String get appSettings_enableMessageTracing => '启用消息追踪'; @@ -844,7 +843,7 @@ class AppLocalizationsZh extends AppLocalizations { String get appSettings_batteryLipo => '锂聚合物电池 (3.0-4.2V)'; @override - String get appSettings_batteryLipoHv => 'LiPo HV (3.0-4.35V)'; + String get appSettings_batteryLipoHv => '锂多压电源(3.0-4.35伏)'; @override String get appSettings_mapDisplay => '地图显示'; @@ -1335,17 +1334,17 @@ class AppLocalizationsZh extends AppLocalizations { @override String channels_regionSetTo(String region) { - return 'Region: $region'; + return '地区:$region'; } @override - String get channels_regionNotSet => 'Region: none'; + String get channels_regionNotSet => '地区:无'; @override - String get channels_regionSelect_Title => 'Select a region'; + String get channels_regionSelect_Title => '选择一个地区'; @override - String get channels_clearRegion => 'Clear region'; + String get channels_clearRegion => '无碍区域'; @override String get chat_noMessages => '暂无消息'; @@ -1403,13 +1402,13 @@ class AppLocalizationsZh extends AppLocalizations { String get chat_sendGif => '发送 GIF'; @override - String get chat_sendImage => 'Send image'; + String get chat_sendImage => '发送图片'; @override - String get chat_imagePickFailed => 'Couldn\'t open that image'; + String get chat_imagePickFailed => '无法打开该图片'; @override - String get chat_receivedGif => 'Received a GIF'; + String get chat_receivedGif => '收到一个GIF'; @override String get chat_reply => '回复'; @@ -2589,38 +2588,35 @@ class AppLocalizationsZh extends AppLocalizations { '用于在洪泛路径/环路检测标签中编码此中继器 ID 的字节数。0=1 字节(256 个 ID,最多 64 跳),1=2 字节(65K 个 ID,最多 32 跳),2=3 字节(16M 个 ID,最多 21 跳)。v1.14 之前的固件始终使用 1 字节路径;v1.14 及更新版本可配置为 2 或 3 字节路径。'; @override - String get repeater_keySettings => 'Change Identity Keys'; + String get repeater_keySettings => '更改身份密钥'; @override - String get repeater_keySettingsSubtitle => - 'Change the public/private keypair'; + String get repeater_keySettingsSubtitle => '更换公钥/私钥对'; @override - String get repeater_prvKey => 'Private key'; + String get repeater_prvKey => '私钥'; @override - String get repeater_prvKeyHelper => - 'A new private key for the repeater, a 128-character hex string.'; + String get repeater_prvKeyHelper => '中继器的新私钥,为一个128位的十六进制字符串。'; @override - String get repeater_generatePrvKey => 'Generate a random keypair'; + String get repeater_generatePrvKey => '生成一个随机的密钥对'; @override - String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair'; + String get repeater_stopGeneratingPrvKey => '中断密钥对搜索'; @override - String get repeater_pubKey => 'Public key'; + String get repeater_pubKey => '公钥'; @override - String get repeater_pubKeyHelper => - 'This is the public key that goes with the generated private key. You can\'t set this directly.'; + String get repeater_pubKeyHelper => '这是与生成的私钥配对的公钥。您不能直接设置此内容。'; @override - String get repeater_pubKeyPrefix => 'Desired prefix'; + String get repeater_pubKeyPrefix => '期望的前缀'; @override String repeater_pubKeyPrefixHelper(int tries) { - return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.'; + return '找到一组以这些十六进制数字开头的公钥。预计尝试次数:$tries'; } @override @@ -4197,41 +4193,38 @@ class AppLocalizationsZh extends AppLocalizations { String get translation_title => '翻译'; @override - String get imageMessages_enableTitle => 'Enable image messages'; + String get imageMessages_enableTitle => '启用图片消息'; @override - String get imageMessages_enableSubtitle => - 'Send images over the mesh. Requires a one-time image model download.'; + String get imageMessages_enableSubtitle => '通过网格发送图像。需要一次性下载图像模型。'; @override - String get imageMessages_modelSectionTitle => 'Image model'; + String get imageMessages_modelSectionTitle => '图像模型'; @override - String get imageMessages_downloadModel => 'Download'; + String get imageMessages_downloadModel => '下载'; @override - String get imageMessages_cancelDownload => 'Cancel'; + String get imageMessages_cancelDownload => '取消'; @override - String get imageMessages_removeModel => 'Remove model'; + String get imageMessages_removeModel => '移除模型'; @override - String get imageMessages_modelReady => 'Ready'; + String get imageMessages_modelReady => '准备就绪'; @override - String get imageMessages_modelNotPublished => - 'Not published yet — this build cannot download it.'; + String get imageMessages_modelNotPublished => '尚未发布——此版本无法下载该内容。'; @override - String get imageMessages_downloadFailed => - 'The image model could not be downloaded.'; + String get imageMessages_downloadFailed => '图像模型无法下载。'; @override - String get imageMessages_autoProcessTitle => 'Process images automatically'; + String get imageMessages_autoProcessTitle => '自动处理图像'; @override String get imageMessages_autoProcessSubtitle => - 'Reconstruct every image as soon as it arrives. Uses about 2 GB of memory for a second each time; leave off to reconstruct with a tap instead.'; + '每次图像到达后立即重建,每次需要约2GB的内存;若想关闭重建功能,可通过点击取消开启。'; @override String get translation_enableTitle => '启用翻译功能'; @@ -4509,43 +4502,42 @@ class AppLocalizationsZh extends AppLocalizations { String get pathMap_unfollowPacket => '解锁视图跟随'; @override - String get imageSend_title => 'Send image'; + String get imageSend_title => '发送图片'; @override - String get imageSend_cropNote => - 'Resized to 512 × 512 · aspect ratio not preserved'; + String get imageSend_cropNote => '调整大小至512 × 512 · 宽高比未保留'; @override - String get imageSend_originalSize => 'Original'; + String get imageSend_originalSize => '原文'; @override - String get imageSend_onAirSize => 'On air'; + String get imageSend_onAirSize => '直播中'; @override - String get imageSend_quality => 'Quality'; + String get imageSend_quality => '质量'; @override - String get imageSend_qualityStandard => 'Standard'; + String get imageSend_qualityStandard => '标准'; @override - String get imageSend_qualityHigh => 'High'; + String get imageSend_qualityHigh => '高'; @override - String get imageSend_packetsLabel => 'Packets'; + String get imageSend_packetsLabel => '数据包'; @override - String get imageSend_airtimeLabel => 'Time on air'; + String get imageSend_airtimeLabel => '播出时间'; @override - String get imageSend_sizeLabel => 'Payload'; + String get imageSend_sizeLabel => '有效载荷'; @override String imageSend_packetsCount(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: '个数据包', + one: '个数据包', ); return '$count $_temp0'; } @@ -4559,149 +4551,142 @@ class AppLocalizationsZh extends AppLocalizations { String get imageSend_unknownValue => '—'; @override - String get imageSend_radioUnknownTitle => 'Radio settings unknown'; + String get imageSend_radioUnknownTitle => '无线电设置未知'; @override - String get imageSend_radioUnknownBody => - 'Connect to a device so the time on air can be calculated.'; + String get imageSend_radioUnknownBody => '连接设备以计算播出时间。'; @override - String get imageSend_longSendTitle => 'Long transmission'; + String get imageSend_longSendTitle => '长距离传输'; @override String imageSend_longSendBody(String duration) { - return 'This will hold the channel for about $duration.'; + return '这将维持频道大约 $duration 时间。'; } @override - String get imageSend_floodNote => - 'Flood routing: every repeater in range retransmits each packet, so the channel stays busy longer than this.'; + String get imageSend_floodNote => '洪水路由:每个中继站都会转发每个数据包,因此信道比这段时间更长地处于繁忙状态。'; @override - String get imageSend_parityTitle => 'Add recovery packet'; + String get imageSend_parityTitle => '恢复包'; @override String get imageSend_paritySubtitle => - 'One extra packet. Group messages are not acknowledged, so this lets the receiver rebuild the image if a single packet is lost.'; + '多一个数据包。群发消息不被确认,因此如果某个数据包丢失,接收方可以重新构建图像。'; @override - String get imageSend_send => 'Send'; + String get imageSend_send => '发送'; @override - String get imageSend_cancel => 'Cancel'; + String get imageSend_cancel => '取消'; @override - String get imageSend_encodeFailed => 'This image could not be encoded.'; + String get imageSend_encodeFailed => '此图像无法编码。'; @override - String get imageSend_codecDownloading => - 'The image model is still downloading.'; + String get imageSend_codecDownloading => '图像模型仍在下载中。'; @override - String get imageSend_codecUnavailable => - 'Image sending is not available on this device.'; + String get imageSend_codecUnavailable => '此设备无法发送图片。'; @override - String get imageSend_codecDisabled => - 'Image messages are turned off in settings.'; + String get imageSend_codecDisabled => '图片消息在设置中已关闭。'; @override String get imageSend_deviceUnsupported => - 'This radio cannot send image packets. Connect a device running companion firmware 13 or newer.'; + '此无线电无法发送图像数据包。请连接运行伴侣固件13或更高版本的设备。'; @override String get imageSend_directMessagesUnsupported => - 'Images travel as group data, so they can only be sent to a channel — not in a direct message.'; + '图片作为群组数据传输,因此只能发送到频道,而不能直接发送给个人。'; @override - String get imageSend_tooLarge => - 'That image encoded to more packets than the mesh format allows.'; + String get imageSend_tooLarge => '该图像编码的数据包数量超过了网格格式所允许的范围。'; @override String imageSend_sentConfirmation(int count) { String _temp0 = intl.Intl.pluralLogic( count, locale: localeName, - other: 'packets', - one: 'packet', + other: '个数据包', + one: '个数据包', ); - return 'Image sent as $count $_temp0.'; + return '图像已作为 $count $_temp0 发送。'; } @override String imageSend_sendFailed(String error) { - return 'The image could not be sent: $error'; + return '无法发送图片:$error'; } @override String imageSend_sendingProgress(int sent, int total) { - return 'Sending image — packet $sent of $total'; + return '发送图像 — 已发送 $sent 包含 $total'; } @override String receivedImage_senderPrefix(String prefix) { - return 'Node $prefix'; + return '节点 $prefix'; } @override String receivedImage_incoming(int received, int total) { - return '$received of $total packets'; + return '已收到的 $received 个包含在 $total 个包裹中'; } @override - String get receivedImage_queued => 'Waiting to decode'; + String get receivedImage_queued => '等待解码'; @override - String get receivedImage_tapToDecode => 'Tap to decode'; + String get receivedImage_tapToDecode => '点击解锁'; @override - String get receivedImage_decoding => 'Reconstructing… about 1 s'; + String get receivedImage_decoding => '重建……大约1秒'; @override String receivedImage_incomplete(int received, int total) { - return 'Image incomplete — $received of $total packets arrived'; + return '图片不完整 — $received 已收到 $total 个数据包'; } @override - String get receivedImage_corrupt => 'Image could not be reconstructed'; + String get receivedImage_corrupt => '图像无法重建'; @override - String get receivedImage_decoderMissing => - 'Image received — image decoding is off'; + String get receivedImage_decoderMissing => '收到图片 — 图像解码失败'; @override - String get receivedImage_evicted => 'Image no longer stored'; + String get receivedImage_evicted => '图片已不再存储'; @override - String get receivedImage_retry => 'Try again'; + String get receivedImage_retry => '再试一次'; @override - String get receivedImage_decodeAgain => 'Decode again'; + String get receivedImage_decodeAgain => '重新解码'; @override - String get receivedImage_openSettings => 'Set up'; + String get receivedImage_openSettings => '建立'; @override - String get receivedImage_tapToProcess => 'Tap to process'; + String get receivedImage_tapToProcess => '点击处理'; @override String receivedImage_awaiting(int bytes, int packets) { String _temp0 = intl.Intl.pluralLogic( packets, locale: localeName, - other: 'packets', - one: 'packet', + other: '个数据包', + one: '个数据包', ); - return '$bytes bytes · $packets $_temp0'; + return '$bytes 字节 · $packets $_temp0'; } @override String imageSend_secondsValue(String seconds) { - return '$seconds s'; + return '$seconds 秒'; } @override String imageSend_minutesSecondsValue(String minutes, String seconds) { - return '$minutes m $seconds s'; + return '$minutes 分 $seconds 秒'; } } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 9671cf8e..11688370 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -2605,5 +2605,227 @@ "pathMap_noLocation": "Geen locatie", "pathMap_followPacket": "Weergave vergrendelen op pakket", "pathMap_unfollowPacket": "Weergave ontgrendelen van pakket", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Regio's", + "settings_regionSettingsSubtitle": "Beheer van opgeslagen regio's", + "settings_regionManagement_screenTitle": "Regionale Bestuur", + "settings_regionNameHint": "Regio naam invoeren", + "settings_regionAddRegion": "Regio toevoegen", + "settings_regionFetchRegions": "Haal regio's uit herhalers", + "settings_regionFetchRegionsFail": "Er zijn geen regio's gevonden", + "settings_regionFetchRegionsAlreadyExists": "Deze regio is al toegevoegd.", + "settings_regionName": "Regio Naam", + "settings_regionDeleted": "Regio verwijderd", + "settings_deleteRegion": "Regio verwijden", + "settings_deleteRegionConfirm": "Verwijder \"{region}\" uit de regio-lijst?", + "settings_infoHardware": "Hardware", + "settings_infoFirmware": "Firmware", + "repeater_pathHashModeOption0": "0 - 1 byte", + "repeater_pathHashModeOption1": "1 - 2 bytes", + "repeater_pathHashModeOption2": "2 - 3 bytes", + "repeater_pathHashModeOption3": "3 - 4 bytes", + "appSettings_batteryLipoHv": "LiPo HV (3,0-4,35 V)", + "channels_regionSetTo": "Regio: {region}", + "channels_regionNotSet": "Regio: geen", + "channels_regionSelect_Title": "Kies een regio", + "channels_clearRegion": "Duidelijke regio", + "chat_sendImage": "Beeld verzenden", + "chat_imagePickFailed": "Kunde die afbeelding niet openen", + "chat_receivedGif": "Ontvangen van een GIF", + "repeater_keySettings": "Verander de Identiteitskies", + "repeater_keySettingsSubtitle": "Wijzig de openbare/private sleutelpaar", + "repeater_prvKey": "Geheime sleutel", + "repeater_prvKeyHelper": "Een nieuwe private sleutel voor de repeater, een 128-karakter lange hexadecimale string.", + "repeater_generatePrvKey": "Stel een willekeurige sleutelpaar op", + "repeater_stopGeneratingPrvKey": "Stop zoek naar sleutelpaar", + "repeater_pubKey": "Openbaar sleutel", + "repeater_pubKeyHelper": "Dit is de openbare sleutel die past bij de gegenereerde privésleutel. U kunt dit niet direct instellen.", + "repeater_pubKeyPrefix": "Verlangde voorvoegsel", + "repeater_pubKeyPrefixHelper": "Zoek een openbare sleutel die begint met deze hexadecimale cijfers. Verwacht aantal pogingen: {tries}.", + "imageMessages_enableTitle": "Bijbehorende afbeeldingen activeren", + "imageMessages_enableSubtitle": "Beeldjes verzenden via het netwerk. Vereist eenmalig afdaling van een beeldmodel.", + "imageMessages_modelSectionTitle": "Beeldmodel", + "imageMessages_downloadModel": "Download", + "imageMessages_cancelDownload": "Annuleren", + "imageMessages_removeModel": "Model verwijderen", + "imageMessages_modelReady": "Klaar", + "imageMessages_modelNotPublished": "Nog niet gepubliceerd — deze versie kan dit niet downloaden.", + "imageMessages_downloadFailed": "Het beeldmodel kon niet worden gedownload.", + "imageMessages_autoProcessTitle": "Beeldverwerking automatisch", + "imageMessages_autoProcessSubtitle": "Reconstrueer elk beeld direct nadat het binnenkomt. Het gebruikt ongeveer 2 GB geheugen voor elke keer; schakel het reconstrueren uit met een tik als je het niet nodig hebt.", + "imageSend_title": "Beeld verzenden", + "imageSend_cropNote": "Aangepast aan 512 × 512 · het aspectverhouding is niet behouden", + "imageSend_originalSize": "Oorspronkelijk", + "imageSend_onAirSize": "Op de lucht", + "imageSend_quality": "Kwaliteit", + "imageSend_qualityStandard": "Standaard", + "imageSend_qualityHigh": "Hoog", + "imageSend_packetsLabel": "Pakketten", + "imageSend_airtimeLabel": "Tijd op de lucht", + "imageSend_sizeLabel": "Belasting", + "imageSend_packetsCount": "{count} {count, plural, =1{pakket} other{pakketten}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Radio-instellingen onbekend", + "imageSend_radioUnknownBody": "Verbinding maken met een apparaat zodat de uitzendtijd kan worden berekend.", + "imageSend_longSendTitle": "Lange transmissie", + "imageSend_longSendBody": "Dit houdt de kanaal ongeveer voor {duration} stand.", + "imageSend_floodNote": "Overstromingsrouting: elke repeater binnen bereik herzendsends elk pakket opnieuw, waardoor het kanaal langer bezig blijft dan dit.", + "imageSend_parityTitle": "Herstelpakket", + "imageSend_paritySubtitle": "Een extra pakje. Groepsberichten worden niet bevestigd, waardoor de ontvanger het beeld kan herstellen als een enkel pakket verloren gaat.", + "imageSend_send": "Stuur", + "imageSend_cancel": "Annuleren", + "imageSend_encodeFailed": "Dit beeld kon niet worden gecodeerd.", + "imageSend_codecDownloading": "Het beeldmodel wordt nog steeds gedownload.", + "imageSend_codecUnavailable": "Het verzenden van een afbeelding is niet mogelijk op dit apparaat.", + "imageSend_codecDisabled": "Boodschappen met afbeeldingen zijn uitgeschakeld in de instellingen.", + "imageSend_deviceUnsupported": "Dit radio kan geen beeldpakketten verzenden. Verbind een apparaat met de bijbehorende firmware versie 13 of nieuwer.", + "imageSend_directMessagesUnsupported": "Afbeeldingen worden verzonden als groepsgegevens, dus ze kunnen alleen naar een kanaal worden gestuurd — niet via een directe boodschap.", + "imageSend_tooLarge": "Die afbeelding werd gecodeerd in meer pakketten dan het mesh-formaat toelaat.", + "imageSend_sentConfirmation": "Afbeelding verzonden als {count} {count, plural, =1{pakket} other{pakketten}}.", + "imageSend_sendFailed": "Het beeld kon niet worden verzonden: {error}", + "imageSend_sendingProgress": "Beeld verzenden — pakket {sent} van {total}", + "receivedImage_senderPrefix": "Knipper {prefix}", + "receivedImage_incoming": "{received} van de {total} pakketten", + "receivedImage_queued": "Wachten op het ontcijferen", + "receivedImage_tapToDecode": "Tik om te decoderen", + "receivedImage_decoding": "Herstellen… ongeveer 1 seconde", + "receivedImage_incomplete": "Afbeelding onvolledig — {received} van {total} pakketten ontvangen", + "receivedImage_corrupt": "Afbeelding kon niet worden gereconstrueerd", + "receivedImage_decoderMissing": "Beeld ontvangen — beeldontcipheringsapparatuur is uitgeschakeld", + "receivedImage_evicted": "Afbeelding niet langer opgeslagen", + "receivedImage_retry": "Probeer het opnieuw", + "receivedImage_decodeAgain": "Decode opnieuw", + "receivedImage_openSettings": "Inricht", + "receivedImage_tapToProcess": "Tik om te verwerken", + "receivedImage_awaiting": "{bytes} bytes · {packets} {packets, plural, =1{pakket} other{pakketten}}", + "imageSend_secondsValue": "{seconds} seconden", + "imageSend_minutesSecondsValue": "{minutes} m {seconds} s" } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 17285d0f..f5dab677 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -2643,5 +2643,227 @@ "pathMap_noLocation": "Brak lokalizacji", "pathMap_followPacket": "Śledź pakiet", "pathMap_unfollowPacket": "Przestań śledzić pakiet", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Regiony", + "settings_regionSettingsSubtitle": "Zarządzanie zapisanymi regionami", + "settings_regionManagement_screenTitle": "Zarządzanie Regionami", + "settings_regionNameHint": "Wprowadź nazwę regionu", + "settings_regionAddRegion": "Dodaj region", + "settings_regionFetchRegions": "Pobierz regiony z repeaterów", + "settings_regionFetchRegionsFail": "Nie znaleziono żadnych regionów", + "settings_regionFetchRegionsAlreadyExists": "Ten region został już dodany", + "settings_regionName": "Nazwa Regionu", + "settings_regionDeleted": "Region usunięto", + "settings_deleteRegion": "Usuń Region", + "settings_deleteRegionConfirm": "Czy usunąć \"{region}\" z listy regionów?", + "settings_infoHardware": "Sprzęt", + "settings_infoFirmware": "Oprogramowanie wbudowane", + "repeater_pathHashModeOption0": "0 - 1 bajt", + "repeater_pathHashModeOption1": "1 - 2 bity", + "repeater_pathHashModeOption2": "2 - 3 bajty", + "repeater_pathHashModeOption3": "3 - 4 bajty", + "appSettings_batteryLipoHv": "Bateria LiPo HV (3,0-4,35 V)", + "channels_regionSetTo": "Region: {region}", + "channels_regionNotSet": "Region: brak", + "channels_regionSelect_Title": "Wybierz region", + "channels_clearRegion": "Przejrzyste obszar", + "chat_sendImage": "Wyślij obraz", + "chat_imagePickFailed": "Nie mogłem otworzyć tego obrazu", + "chat_receivedGif": "Otrzymano GIF", + "repeater_keySettings": "Zmiana kluczy tożsamości", + "repeater_keySettingsSubtitle": "Zmień parę kluczy publiczną/prywatną", + "repeater_prvKey": "Klucz prywatny", + "repeater_prvKeyHelper": "Nowy klucz prywatny dla wzmacniacza, 128-znakowa string hexadecyimalny.", + "repeater_generatePrvKey": "Wygeneruj losowy klucz parowy", + "repeater_stopGeneratingPrvKey": "Przerwij wyszukiwanie kluczowego paru", + "repeater_pubKey": "Klucz publiczny", + "repeater_pubKeyHelper": "To jest klucz publiczny, który odpowiada wygenerowanemu kluczowi prywatnemu. Nie można go ustawić bezpośrednio.", + "repeater_pubKeyPrefix": "Pożądane przedrostek", + "repeater_pubKeyPrefixHelper": "Znajdź klucz publiczny, który zaczyna się od tych cyfr hex. Oczekiwana liczba prób: {tries}.", + "imageMessages_enableTitle": "Włącz wiadomości ze zdjęciami", + "imageMessages_enableSubtitle": "Przesyłaj zdjęcia przez siatkę. Wymaga jednorazowego pobrania modelu obrazu.", + "imageMessages_modelSectionTitle": "Model obrazowy", + "imageMessages_downloadModel": "Pobierz", + "imageMessages_cancelDownload": "Anuluj", + "imageMessages_removeModel": "Usuń model", + "imageMessages_modelReady": "Gotowy", + "imageMessages_modelNotPublished": "Nie opublikowane — ten build nie może tego pobrać.", + "imageMessages_downloadFailed": "Model obrazowy nie mógł zostać pobrany.", + "imageMessages_autoProcessTitle": "Obrazki są przetwarzane automatycznie.", + "imageMessages_autoProcessSubtitle": "Odbuduj każde zdjęcie, jak tylko przyjdzie. Zużywa około 2 GB pamięci za każdą drugą sekundę; wyłącz odbudowywanie jednym dotknięciem.", + "imageSend_title": "Wyślij obraz", + "imageSend_cropNote": "Zmniejszone do 512 × 512 · proporcje nie zostały zachowane", + "imageSend_originalSize": "Oryginalny", + "imageSend_onAirSize": "W eterze", + "imageSend_quality": "Jakość", + "imageSend_qualityStandard": "Standard", + "imageSend_qualityHigh": "Wysoko", + "imageSend_packetsLabel": "Pakiet", + "imageSend_airtimeLabel": "Czas w eterze", + "imageSend_sizeLabel": "Payload", + "imageSend_packetsCount": "{count} {count, plural, =1{pakiet} other{pakietów}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Ustawienia radia nieznane", + "imageSend_radioUnknownBody": "Połącz urządzenie, aby można było obliczyć czas trwania transmisji.", + "imageSend_longSendTitle": "Długa transmisja", + "imageSend_longSendBody": "Ten kanał będzie dostępny przez około {duration}.", + "imageSend_floodNote": "Przepływ pakietów: każdy retransmitujący w zasięgu przekazuje każdy pakiet, przez co kanał pozostaje zajęty dłużej niż ten czas.", + "imageSend_parityTitle": "Pakiet odzysku", + "imageSend_paritySubtitle": "Jedna dodatkowa paczka. Wiadomości grupowe nie są potwierdzane, dzięki czemu odbiorca może odbudować obraz, jeśli zostanie utracona pojedyncza paczka.", + "imageSend_send": "Wyślij", + "imageSend_cancel": "Anuluj", + "imageSend_encodeFailed": "Ten obraz nie mógł zostać zakodowany.", + "imageSend_codecDownloading": "Model obrazowy jest nadal pobierany.", + "imageSend_codecUnavailable": "Wysyłanie obrazu nie jest dostępne na tym urządzeniu.", + "imageSend_codecDisabled": "Wiadomości ze zdjęciami są wyłączone w ustawieniach.", + "imageSend_deviceUnsupported": "Ten radiodysk nie może wysyłać pakietów obrazu. Podłącz urządzenie z oprogramowaniem firmware 13 lub nowszym.", + "imageSend_directMessagesUnsupported": "Obrazy są przesyłane jako dane grupowe, więc można je wysłać tylko do kanału — nie w wiadomości prywatnej.", + "imageSend_tooLarge": "Obraz zakodowany do więcej pakietów niż pozwala format siatki.", + "imageSend_sentConfirmation": "Obraz wysłany jako {count} {count, plural, =1{pakiet} other{pakietów}}.", + "imageSend_sendFailed": "Obraz nie mogł zostać wysłany: {error}", + "imageSend_sendingProgress": "Wysyłanie obrazu — pakiet {sent} z {total}", + "receivedImage_senderPrefix": "Węzeł {prefix}", + "receivedImage_incoming": "Otrzymano: {received} z {total} pakietów", + "receivedImage_queued": "Oczekiwanie na rozszyfrowanie", + "receivedImage_tapToDecode": "Kliknij, aby odszyfrować", + "receivedImage_decoding": "Odtwarzanie… około 1 sekundy", + "receivedImage_incomplete": "Obraz niepełny — {received} z {total} pakietów dotarło", + "receivedImage_corrupt": "Obraz nie może zostać zrekonstruowany", + "receivedImage_decoderMissing": "Otrzymano obraz — dekodowanie obrazu jest nieprawidłowe.", + "receivedImage_evicted": "Obraz nie jest już przechowywany", + "receivedImage_retry": "Spróbuj ponownie", + "receivedImage_decodeAgain": "Zdekoduj ponownie", + "receivedImage_openSettings": "Ustaw", + "receivedImage_tapToProcess": "Kliknij, aby przetworzyć", + "receivedImage_awaiting": "{bytes} bajtów · {packets} {packets, plural, =1{pakiet} other{pakiety}}", + "imageSend_secondsValue": "{seconds} sekund", + "imageSend_minutesSecondsValue": "{minutes} minut {seconds} sekundy" } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 90b8071a..32364c5a 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -2605,5 +2605,227 @@ "pathMap_noLocation": "Sem localização", "pathMap_followPacket": "Fixar vista no pacote", "pathMap_unfollowPacket": "Liberar vista do pacote", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Regiões", + "settings_regionSettingsSubtitle": "Gerenciar regiões armazenadas", + "settings_regionManagement_screenTitle": "Gestão de Região", + "settings_regionNameHint": "Nome da região", + "settings_regionAddRegion": "Adicionar região", + "settings_regionFetchRegions": "Regiões de obtenção a partir de repetidores", + "settings_regionFetchRegionsFail": "Nenhuma região foi encontrada", + "settings_regionFetchRegionsAlreadyExists": "Esta região já foi adicionada", + "settings_regionName": "Nome da Região", + "settings_regionDeleted": "Região excluída", + "settings_deleteRegion": "Excluir Região", + "settings_deleteRegionConfirm": "Remover \"{region}\" da lista de regiões?", + "settings_infoHardware": "Hardware", + "settings_infoFirmware": "Firmware", + "repeater_pathHashModeOption0": "0 - 1 byte", + "repeater_pathHashModeOption1": "1 - 2 bytes", + "repeater_pathHashModeOption2": "2 - 3 bytes", + "repeater_pathHashModeOption3": "3 - 4 bytes", + "appSettings_batteryLipoHv": "LiPo HV (3,0-4,35V)", + "channels_regionSetTo": "Região: {region}", + "channels_regionNotSet": "Região: nenhuma", + "channels_regionSelect_Title": "Escolha uma região", + "channels_clearRegion": "Região desimpedida", + "chat_sendImage": "Enviar imagem", + "chat_imagePickFailed": "Não consegui abrir essa imagem", + "chat_receivedGif": "Recebi um GIF", + "repeater_keySettings": "Alterar Chaves de Identidade", + "repeater_keySettingsSubtitle": "Altere a chave pública/chave privada", + "repeater_prvKey": "Chave privada", + "repeater_prvKeyHelper": "Uma nova chave privada para o repetidor, uma string hexadecimal de 128 caracteres.", + "repeater_generatePrvKey": "Gere um par de chaves aleatório", + "repeater_stopGeneratingPrvKey": "Interrompa a busca por par de chaves", + "repeater_pubKey": "Chave pública", + "repeater_pubKeyHelper": "Esta é a chave pública que acompanha a chave privada gerada. Você não pode definir isso diretamente.", + "repeater_pubKeyPrefix": "Prefixo desejado", + "repeater_pubKeyPrefixHelper": "Encontre uma chave pública que comece com esses dígitos hexadecimais. Número esperado de tentativas: {tries}.", + "imageMessages_enableTitle": "Mensagens de imagem", + "imageMessages_enableSubtitle": "Envie as imagens pela malha. Requer o download de um modelo de imagem único.", + "imageMessages_modelSectionTitle": "Modelo de imagem", + "imageMessages_downloadModel": "Download", + "imageMessages_cancelDownload": "Cancelar", + "imageMessages_removeModel": "Remover modelo", + "imageMessages_modelReady": "Pronto", + "imageMessages_modelNotPublished": "Ainda não publicado — esta versão não pode baixá-lo.", + "imageMessages_downloadFailed": "O modelo de imagem não pôde ser baixado.", + "imageMessages_autoProcessTitle": "Processar imagens automaticamente", + "imageMessages_autoProcessSubtitle": "Reconstrua cada imagem assim que ela chegar. Utiliza cerca de 2 GB de memória por segundo; dispense a reconstrução com um toque.", + "imageSend_title": "Enviar imagem", + "imageSend_cropNote": "Redimensionado para 512 × 512 · a proporção de aspecto não foi preservada", + "imageSend_originalSize": "Texto Original", + "imageSend_onAirSize": "Ao ar", + "imageSend_quality": "Qualidade", + "imageSend_qualityStandard": "Padrão", + "imageSend_qualityHigh": "Alto", + "imageSend_packetsLabel": "Pacotes", + "imageSend_airtimeLabel": "Tempo em transmissão", + "imageSend_sizeLabel": "Carga útil", + "imageSend_packetsCount": "{count} {count, plural, =1{pacote} other{pacotes}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Configurações de rádio desconhecidas", + "imageSend_radioUnknownBody": "Conecte-se a um dispositivo para que o horário de transmissão possa ser calculado.", + "imageSend_longSendTitle": "Transmissão longa", + "imageSend_longSendBody": "Isso manterá o canal por cerca de {duration}.", + "imageSend_floodNote": "Roteamento de inundação: cada repetidor na faixa retransmite cada pacote, fazendo com que o canal permaneça ocupado por mais tempo do que isso.", + "imageSend_parityTitle": "Pacote de recuperação", + "imageSend_paritySubtitle": "Um pacote extra. As mensagens em grupo não são reconhecidas, assim permitindo que o destinatário reconstrua a imagem caso um pacote seja perdido.", + "imageSend_send": "Enviar", + "imageSend_cancel": "Cancelar", + "imageSend_encodeFailed": "Esta imagem não pode ser codificada.", + "imageSend_codecDownloading": "O modelo de imagem ainda está baixando.", + "imageSend_codecUnavailable": "O envio de imagem não está disponível neste dispositivo.", + "imageSend_codecDisabled": "As mensagens de imagem estão desativadas nas configurações.", + "imageSend_deviceUnsupported": "Este rádio não pode enviar pacotes de imagem. Conecte um dispositivo com firmware companheiro versão 13 ou superior.", + "imageSend_directMessagesUnsupported": "As imagens viajam como dados em grupo, portanto, só podem ser enviadas para um canal — não em mensagem direta.", + "imageSend_tooLarge": "Essa imagem foi codificada em mais pacotes do que o formato de malha permite.", + "imageSend_sentConfirmation": "Imagem enviada como {count} {count, plural, =1{pacote} other{pacotes}}.", + "imageSend_sendFailed": "A imagem não pôde ser enviada: {error}", + "imageSend_sendingProgress": "Envio da imagem — pacote {sent} de {total}", + "receivedImage_senderPrefix": "Nó {prefix}", + "receivedImage_incoming": "{received} de {total} pacotes", + "receivedImage_queued": "Aguardando para decodificar", + "receivedImage_tapToDecode": "Toque para decodificar", + "receivedImage_decoding": "Reconstruindo… cerca de 1 segundo", + "receivedImage_incomplete": "Imagem incompleta — {received} de {total} pacotes chegaram", + "receivedImage_corrupt": "A imagem não pôde ser reconstruída", + "receivedImage_decoderMissing": "Imagem recebida — decodificação de imagem incorreta", + "receivedImage_evicted": "Imagem não armazenada", + "receivedImage_retry": "Tente novamente", + "receivedImage_decodeAgain": "Decodifique novamente", + "receivedImage_openSettings": "Configurar", + "receivedImage_tapToProcess": "Toque para processar", + "receivedImage_awaiting": "{bytes} bytes · {packets} {packets, plural, =1{pacote} other{pacotes}}", + "imageSend_secondsValue": "{seconds} segundos", + "imageSend_minutesSecondsValue": "{minutes} min {seconds} s" } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 485cc641..614e0201 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1908,5 +1908,227 @@ "pathMap_noLocation": "Нет координат", "pathMap_followPacket": "Следить за пакетом", "pathMap_unfollowPacket": "Не следить за пакетом", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Регионы", + "settings_regionSettingsSubtitle": "Управление сохранёнными регионами", + "settings_regionManagement_screenTitle": "Управление регионами", + "settings_regionNameHint": "Введите название региона", + "settings_regionAddRegion": "Добавить регион", + "settings_regionFetchRegions": "Извлекать регионы с ретрансляторов", + "settings_regionFetchRegionsFail": "Не были найдены никакие регионы", + "settings_regionFetchRegionsAlreadyExists": "Этот регион уже был добавлен", + "settings_regionName": "Название региона", + "settings_regionDeleted": "Регион удалён", + "settings_deleteRegion": "Удалить регион", + "settings_deleteRegionConfirm": "Удалить \"{region}\" из списка регионов?", + "settings_infoHardware": "Оборудование", + "settings_infoFirmware": "Производственное программное обеспечение", + "repeater_pathHashModeOption0": "0 - 1 байт", + "repeater_pathHashModeOption1": "1 - 2 байта", + "repeater_pathHashModeOption2": "2 - 3 байта", + "repeater_pathHashModeOption3": "3 - 4 байта", + "appSettings_batteryLipoHv": "LiPo HV (3,0–4,35 В)", + "channels_regionSetTo": "РЕГИОН: {region}", + "channels_regionNotSet": "Регион: отсутствует", + "channels_regionSelect_Title": "Выберите регион", + "channels_clearRegion": "Чистый регион", + "chat_sendImage": "Отправьте изображение", + "chat_imagePickFailed": "Не удалось открыть это изображение", + "chat_receivedGif": "Получен GIF", + "repeater_keySettings": "Изменить ключи идентичности", + "repeater_keySettingsSubtitle": "Измените пару публичных/частных ключей", + "repeater_prvKey": "Личный ключ", + "repeater_prvKeyHelper": "Для повторителя генерируется новый приватный ключ — шестнадцатеричная строка из 128 символов.", + "repeater_generatePrvKey": "Сгенерируйте случайный ключ-пару", + "repeater_stopGeneratingPrvKey": "Прервать поиск ключной пары", + "repeater_pubKey": "Публичный ключ", + "repeater_pubKeyHelper": "Это публичный ключ, который соответствует сгенерированному приватному ключу. Вы не можете установить его напрямую.", + "repeater_pubKeyPrefix": "Желаемый префикс", + "repeater_pubKeyPrefixHelper": "Найдите публичный ключ, начинающийся этими шестнадцатеричными цифрами. Ожидаемое количество попыток: {tries}.", + "imageMessages_enableTitle": "Включить изображения в сообщения", + "imageMessages_enableSubtitle": "Отправьте изображения через сеть. Требуется однократная загрузка шаблона изображения.", + "imageMessages_modelSectionTitle": "Модель изображения", + "imageMessages_downloadModel": "Скачать", + "imageMessages_cancelDownload": "Отмена", + "imageMessages_removeModel": "Удалить модель", + "imageMessages_modelReady": "Готов", + "imageMessages_modelNotPublished": "Пока не опубликовано — эта сборка не может скачать это.", + "imageMessages_downloadFailed": "Модель изображения не удалось скачать.", + "imageMessages_autoProcessTitle": "Автоматически обрабатывать изображения", + "imageMessages_autoProcessSubtitle": "Примерно каждое изображение реконструируйте сразу после его поступления. Для этого на каждый раз используется около 2 ГБ памяти; отключите реконструкцию касанием.", + "imageSend_title": "Отправьте изображение", + "imageSend_cropNote": "Меняется размер на 512 × 512 · соотношение сторон не сохраняется", + "imageSend_originalSize": "Оригинал", + "imageSend_onAirSize": "В эфире", + "imageSend_quality": "Качество", + "imageSend_qualityStandard": "Стандарт", + "imageSend_qualityHigh": "Высота", + "imageSend_packetsLabel": "Пакеты", + "imageSend_airtimeLabel": "Время на эфире", + "imageSend_sizeLabel": "Пакет", + "imageSend_packetsCount": "{count} {count, plural, one{пакет} few{пакета} many{пакетов} other{пакета}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Настройки радио неизвестны", + "imageSend_radioUnknownBody": "Подключитесь к устройству, чтобы можно было рассчитать время эфирного времени.", + "imageSend_longSendTitle": "Долгая передача", + "imageSend_longSendBody": "Это будет поддерживать канал примерно {duration}.", + "imageSend_floodNote": "Руководство по маршрутизации потоков: каждый ретрансатор в зоне перераспределяет каждый пакет, поэтому канал остаётся занятным дольше, чем это.", + "imageSend_parityTitle": "Пакет восстановления", + "imageSend_paritySubtitle": "Один дополнительный пакет. Групповые сообщения не подтверждаются, поэтому это позволяет получателю восстановить изображение, если один пакет потерян.", + "imageSend_send": "Отправить", + "imageSend_cancel": "Отмена", + "imageSend_encodeFailed": "Это изображение не может быть закодировано.", + "imageSend_codecDownloading": "Модель изображения всё ещё загружается.", + "imageSend_codecUnavailable": "Отправка изображения на этом устройстве недоступна.", + "imageSend_codecDisabled": "В настройках отключены сообщения с изображениями.", + "imageSend_deviceUnsupported": "Это радио не может отправлять пакеты изображений. Подключите устройство, работающее на прошивке-компаньоне версии 13 или выше.", + "imageSend_directMessagesUnsupported": "Изображения передаются как групповые данные, поэтому их можно отправлять только в канал, а не в личное сообщение.", + "imageSend_tooLarge": "Изображение было закодировано в больше пакетов, чем позволяет формат сетки.", + "imageSend_sentConfirmation": "Изображение отправлено как {count} {count, plural, =1{пакет} other{пакетов}}.", + "imageSend_sendFailed": "Изображение не может быть отправлено: {error}", + "imageSend_sendingProgress": "Отправка изображения — пакет {sent} из {total}", + "receivedImage_senderPrefix": "Узел {prefix}", + "receivedImage_incoming": "{received} из {total} пакетов", + "receivedImage_queued": "Ожидание расшифровки", + "receivedImage_tapToDecode": "Нажмите для декодирования", + "receivedImage_decoding": "Реконструкция… примерно за 1 секунду", + "receivedImage_incomplete": "Отсутствует изображение — {received} из {total} пакетов пришло", + "receivedImage_corrupt": "Изображение не может быть восстановлено", + "receivedImage_decoderMissing": "Получен изображение — декодирование изображения неправильное", + "receivedImage_evicted": "Изображение больше не сохраняется", + "receivedImage_retry": "Попробуйте снова", + "receivedImage_decodeAgain": "Декодируйте снова", + "receivedImage_openSettings": "Настройте", + "receivedImage_tapToProcess": "Нажмите для обработки", + "receivedImage_awaiting": "{bytes} байт · {packets} {packets, plural, =1{пакет} other{пакетов}}", + "imageSend_secondsValue": "{seconds} секунд", + "imageSend_minutesSecondsValue": "{minutes} м {seconds} с" } diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb index 90cc0413..7b217e67 100644 --- a/lib/l10n/app_sk.arb +++ b/lib/l10n/app_sk.arb @@ -2605,5 +2605,227 @@ "pathMap_noLocation": "Bez polohy", "pathMap_followPacket": "Uzamknúť pohľad na paket", "pathMap_unfollowPacket": "Odomknúť pohľad od paketu", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Regiony", + "settings_regionSettingsSubtitle": "Zohľať uložené regiony", + "settings_regionManagement_screenTitle": "Regiónne vedenie", + "settings_regionNameHint": "Vstuptejte název regionu", + "settings_regionAddRegion": "Dodajte region", + "settings_regionFetchRegions": "Odberanie regionov z repeaterov", + "settings_regionFetchRegionsFail": "Nebylo našli žiadné regiony", + "settings_regionFetchRegionsAlreadyExists": "Tento oblast je už dodán", + "settings_regionName": "Regionné název", + "settings_regionDeleted": "Regionu zníteno", + "settings_deleteRegion": "Vyniknúcia regionu", + "settings_deleteRegionConfirm": "Odstraniť {region} z listy regionov?", + "settings_infoHardware": "Hardware", + "settings_infoFirmware": "Firmware", + "repeater_pathHashModeOption0": "0 - 1 byt", + "repeater_pathHashModeOption1": "1 - 2 bity", + "repeater_pathHashModeOption2": "2 - 3 bity", + "repeater_pathHashModeOption3": "3 - 4 bity", + "appSettings_batteryLipoHv": "LiPo HV (3.0-4.35V)", + "channels_regionSetTo": "Region: {region}", + "channels_regionNotSet": "Region: žiadné", + "channels_regionSelect_Title": "Vyberte region", + "channels_clearRegion": "Jasný údajný oblasť", + "chat_sendImage": "Vyslat obraz", + "chat_imagePickFailed": "Nesmiela jsem otvoriť tento obrázok", + "chat_receivedGif": "Odeslaný GIF", + "repeater_keySettings": "Zmena identititačných klíčov", + "repeater_keySettingsSubtitle": "Zmena prehľadného/osobného klíčového zbraň", + "repeater_prvKey": "Prívatná klíč", + "repeater_prvKeyHelper": "Nová prívna klíčová číslo pre repeater, 128-znáčlový šestnáctorýč.", + "repeater_generatePrvKey": "Vytvorenie príma kľúčového paru", + "repeater_stopGeneratingPrvKey": "Prerušenie hľadania klíčového paru", + "repeater_pubKey": "Public key", + "repeater_pubKeyHelper": "Táto je veľká klíč, ktorý sa vztahuje s generovaným manéčným klíčom. Nemožné je to ustanovit priateľne.", + "repeater_pubKeyPrefix": "Požadovaný prefiks", + "repeater_pubKeyPrefixHelper": "Zahľadnite sa veľkú publicenu klíču, ktorá začíná tými šestícih štiastkami. Očekivané potrebné pokusy: {tries}.", + "imageMessages_enableTitle": "Zabezpečte zobrazi", + "imageMessages_enableSubtitle": "Odeslanie obrazov pre mšťanie. Potrebujete jednorazové stáhnutie modelu obrazov.", + "imageMessages_modelSectionTitle": "Model v kínajme", + "imageMessages_downloadModel": "Stáhnie", + "imageMessages_cancelDownload": "Zastavenie", + "imageMessages_removeModel": "Vyhniť model", + "imageMessages_modelReady": "Čiačný", + "imageMessages_modelNotPublished": "Nesprávne vypisáné — tento prechovka nie môže jej stáhnuť.", + "imageMessages_downloadFailed": "Model s obrázkom nemôžno sťažovať.", + "imageMessages_autoProcessTitle": "Automaticky prepojiť slučaje.", + "imageMessages_autoProcessSubtitle": "Rekonstruujte každý obraz tak, ako pridá. Používajete okolo 2 GB pamäti pre drugú hodinu; odložte rekonstrukciu tým kliknutím.", + "imageSend_title": "Vyslat obraz", + "imageSend_cropNote": "Zmeneno na 512 × 512 · vzorýst nie byl zachovan", + "imageSend_originalSize": "Výborný text:\n\n\"Language is the road map of a culture. It tells us where to go as a society and helps us understand the world around us. Learning a new language opens up new perspectives and opportunities, allowing us to connect with people from different backgrounds and build bridges between cultures.\"\n\nSlovenská preklada:\n\n\"Jazyk je cesta pre zručnosti a odráža kultúru. Dá nám uvedomi, dokádať, kúdy sa pohladneme a pomáha našej společnosti poradiť sa v rôznych okolnosti a porozumieť o svetu kolem nás. Nauka nového jazyka otviera nové perspektívy a možnosti, čo pohybuje našu schopnosť sa spoluprávať s ľudmi z rôznych okolnosti a budovať mosty medzi kultúry.\"", + "imageSend_onAirSize": "V prúce", + "imageSend_quality": "Kvalita", + "imageSend_qualityStandard": "Stándard", + "imageSend_qualityHigh": "Vysoká", + "imageSend_packetsLabel": "Pakety", + "imageSend_airtimeLabel": "Čas na anteni", + "imageSend_sizeLabel": "Základ", + "imageSend_packetsCount": "{count} {count, plural, =1{paket} other{paketov}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Nastavenia radio nezná", + "imageSend_radioUnknownBody": "Zkonečte s určým prijemcem, aby sa mohlo výpočet času, ktorý je v prúbežu.", + "imageSend_longSendTitle": "Dlouhá transmisia", + "imageSend_longSendBody": "Tento dôvod udrží kanál priamo na {duration}.", + "imageSend_floodNote": "Povodný routing: každý repeater v rozsahu zrňa každý paket, takže kanál zostá zajetší dlouше, než tu.", + "imageSend_parityTitle": "Poučný paket pre očudenie", + "imageSend_paritySubtitle": "Jedný dodatný paket. Skúsené súhlasy nie sa uznávaú, takže to umožňuje prechovávaču opraviť obraz, pokiaľ sa jedný paket niebyl ztrácený.", + "imageSend_send": "Odeslať", + "imageSend_cancel": "Zastavenie", + "imageSend_encodeFailed": "Tento obráz nie byla byla schována.", + "imageSend_codecDownloading": "Model prehľadovania prebeža stále stále stále prechádza.", + "imageSend_codecUnavailable": "Zobrazenie nie je dostupný na tomto zariadení.", + "imageSend_codecDisabled": "Zobrazy s prešteľkami sú v nastavení vypnené.", + "imageSend_deviceUnsupported": "Tento radiok nie môže odeslať obrazové pakety. Podeďte správne určité zařízení s oprogramovaním spolupráce 13 alebo novším.", + "imageSend_directMessagesUnsupported": "Obrazy sa prechádzajú jako skupinové údaje, preto sa ich môžu odeslať len na kanál — nie v príbeh sa.", + "imageSend_tooLarge": "Tento obraz byl skodyrovany do viac paketov, ako umožňuje si sítka format.", + "imageSend_sentConfirmation": "Obrázok odoslaný ako {count} {count, plural, =1{paket} other{paketov}}.", + "imageSend_sendFailed": "Obraz nemôžlo odeslať: {error}", + "imageSend_sendingProgress": "Vysyťanie obrazu — pakét {sent} z {total}", + "receivedImage_senderPrefix": "Vęzlo {prefix}", + "receivedImage_incoming": "Otrzymané {received} z {total} pakotí", + "receivedImage_queued": "Čekanie na dekódovanie", + "receivedImage_tapToDecode": "Kliknite, aby dekódovať", + "receivedImage_decoding": "Rekonstrukcia… o čoľve 1 s", + "receivedImage_incomplete": "Obraz nieješťajný — {received} z {total} paciek príšlo", + "receivedImage_corrupt": "Obraz nemôžu byť prepojený", + "receivedImage_decoderMissing": "Otrzymaná slúba — dekódovanie slúby je vypadejce", + "receivedImage_evicted": "Obraz nemá uložený", + "receivedImage_retry": "Zkôr to opítajte", + "receivedImage_decodeAgain": "Zdeľte sa znovu", + "receivedImage_openSettings": "Založte", + "receivedImage_tapToProcess": "Ukliknite, aby sa príjomili", + "receivedImage_awaiting": "{bytes} bajtov · {packets} {packets, plural, =1{paket} other{paketov}}", + "imageSend_secondsValue": "{seconds} s", + "imageSend_minutesSecondsValue": "{minutes} min {seconds} s" } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index 35062061..868d92d8 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -2605,5 +2605,227 @@ "pathMap_noLocation": "Brez lokacije", "pathMap_followPacket": "Zakleni pogled na paket", "pathMap_unfollowPacket": "Odkleni pogled od paketa", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Regioni", + "settings_regionSettingsSubtitle": "Upravljanje opisanih regionov", + "settings_regionManagement_screenTitle": "Regijonsko upravljanje", + "settings_regionNameHint": "Naslov občine", + "settings_regionAddRegion": "Dodaj region", + "settings_regionFetchRegions": "Pobražujte izvajne področja iz ponavljalnikov", + "settings_regionFetchRegionsFail": "Nižnih občin ni izkrali", + "settings_regionFetchRegionsAlreadyExists": "Taj oblasi je več pomanjkan.", + "settings_regionName": "Naziv Regiona", + "settings_regionDeleted": "Oblikačena regija", + "settings_deleteRegion": "Prihoda Region", + "settings_deleteRegionConfirm": "Ostani {region} iz listy regionov?", + "settings_infoHardware": "Hardver", + "settings_infoFirmware": "Pravilnik", + "repeater_pathHashModeOption0": "0 - 1 bajt", + "repeater_pathHashModeOption1": "1 - 2 bite", + "repeater_pathHashModeOption2": "2 - 3 bite", + "repeater_pathHashModeOption3": "3 - 4 bite", + "appSettings_batteryLipoHv": "LiPo HV (3,0–4,35 V)", + "channels_regionSetTo": "Osebno: {region}", + "channels_regionNotSet": "Region: brak", + "channels_regionSelect_Title": "Vablajte region", + "channels_clearRegion": "Jasna regija", + "chat_sendImage": "Sločaji slik", + "chat_imagePickFailed": "Nispeval sem tega ta slik", + "chat_receivedGif": "Otrvljen GIF", + "repeater_keySettings": "Zmeničke ključe identitete", + "repeater_keySettingsSubtitle": "Zamenjajte publican ali privatni ključni par", + "repeater_prvKey": "Privarna ključa", + "repeater_prvKeyHelper": "Nova privatna ključa za prekaznik, 128- znakovni šestnastik.", + "repeater_generatePrvKey": "Sporočna ključna para", + "repeater_stopGeneratingPrvKey": "Prekajanje odkrivanja ključne paro", + "repeater_pubKey": "Public key (publična ključa)", + "repeater_pubKeyHelper": "Taj je publicna ključ, ki pomeni pripovedno privatno ključ. Ne možeš to vrediti direktno.", + "repeater_pubKeyPrefix": "Poželana prefiks", + "repeater_pubKeyPrefixHelper": "Najdi publicen ključ, ki začne s tih hexnih čitov. Očekivani pokusi: {tries}.", + "imageMessages_enableTitle": "Pozivni izkričile slike", + "imageMessages_enableSubtitle": "Prešli vzorce pre mrežo. Potrebno je jednokratno stworiti model vzorca.", + "imageMessages_modelSectionTitle": "Obrazni model", + "imageMessages_downloadModel": "Storba", + "imageMessages_cancelDownload": "Odločite", + "imageMessages_removeModel": "Ubrani model", + "imageMessages_modelReady": "Gotov", + "imageMessages_modelNotPublished": "Jo še niso izdana — ta izdelka te ne može prebaviti.", + "imageMessages_downloadFailed": "Obrazni model ne može biti preuzet.", + "imageMessages_autoProcessTitle": "Avtomatizirane slike", + "imageMessages_autoProcessSubtitle": "Katero je oblikovanje svega oblikov, ko se pošteva. Za drugo okolo časa se koristi ok. 2 GB pamične prostore; odločite se za oblikovanje s tukom.", + "imageSend_title": "Sločaji slik", + "imageSend_cropNote": "Zadovoljno izmenjeno na 512 × 512 · vzorovni odnos ne ohranjen", + "imageSend_originalSize": "Original text:\n\nThe early bird catches the worm.\n\nTranslation:\n\nPojdi prvi, zlati v kroku.", + "imageSend_onAirSize": "Na vodi", + "imageSend_quality": "Kakovost", + "imageSend_qualityStandard": "Standard", + "imageSend_qualityHigh": "Vysoko", + "imageSend_packetsLabel": "Pakete", + "imageSend_airtimeLabel": "Čas v eteru", + "imageSend_sizeLabel": "Napravo", + "imageSend_packetsCount": "{count} {count, plural, =1{paket} other{paketov}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Naslušniki radio neznane", + "imageSend_radioUnknownBody": "Poučajte se na stroj, da se lahko izračunuje čas v prikazu.", + "imageSend_longSendTitle": "Dluga preposlana", + "imageSend_longSendBody": "Ovo bo ohranilo kanal prihodno za obliko {duration}.", + "imageSend_floodNote": "Povlatni potok: sve repeaterje v območju pretrasirajo svak paket, pa kanál ostane zanudnejši od tega.", + "imageSend_parityTitle": "Pobavni paket zdržbe", + "imageSend_paritySubtitle": "Jedna dodatna paczka. Grupni izjasi ne izvajajo potvarnosti, pa ta izdelka omogoča preuzimanju ponovno izgleda, če je zgubjen pojedni paket.", + "imageSend_send": "Posyłaj", + "imageSend_cancel": "Odločite", + "imageSend_encodeFailed": "Ovo slikovo ne more biti zakodirano.", + "imageSend_codecDownloading": "Obrazni model še pospeva preborjanje.", + "imageSend_codecUnavailable": "Poslanje slike nema na tem zelo naročnem naročnem.", + "imageSend_codecDisabled": "Obrazi s pomanjkanjem so v nastavnih.", + "imageSend_deviceUnsupported": "Taj radio ne može posredovati slike pakuete. Prepoštijo izbirni napravnik s kompanijskimi programi na čevem 13 ali novšejšim.", + "imageSend_directMessagesUnsupported": "Obrazy se pojavijo kot skupnih podatkov, pa lahko ih poslujejo samo na kanal — ne v prilogih.", + "imageSend_tooLarge": "Taj slik je zakodiran v viših pakotnih od športne formate, ki omogoča mrežni format.", + "imageSend_sentConfirmation": "Slika poslana kot {count} {count, plural, =1{paket} other{paketov}}.", + "imageSend_sendFailed": "Obraz ne može biti poslany: {error}", + "imageSend_sendingProgress": "Prekazivanje izkaza — paket {sent} od {total}", + "receivedImage_senderPrefix": "Vrtitev {prefix}", + "receivedImage_incoming": "Otrteno od {received} na {total} poslovanih potokov", + "receivedImage_queued": "Čekanje, da se dekodira", + "receivedImage_tapToDecode": "Kliknite, da razkrivete", + "receivedImage_decoding": "Ostvarjanje… o prihodnosti za okolo 1 s", + "receivedImage_incomplete": "Obraz nije kompletan — {received} od {total} poslaničev je prishodil", + "receivedImage_corrupt": "Obraz ne more lahko rekonstruirati", + "receivedImage_decoderMissing": "Otrgena slika — dekodirana slika je izključena", + "receivedImage_evicted": "Obraz ni več niso zakajiren", + "receivedImage_retry": "Pokušajte znova", + "receivedImage_decodeAgain": "Dekodiraj ponovno", + "receivedImage_openSettings": "Nastavite", + "receivedImage_tapToProcess": "Kliknij za obravnavanje", + "receivedImage_awaiting": "{bytes} bajtov · {packets} {packets, plural, =1{paket} other{paketov}}", + "imageSend_secondsValue": "{seconds} s", + "imageSend_minutesSecondsValue": "{minutes} m {seconds} s" } diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index 487e8f96..33128c4b 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -2605,5 +2605,227 @@ "pathMap_noLocation": "Ingen position", "pathMap_unfollowPacket": "Lås upp vy från paket", "pathMap_followPacket": "Lås vy till paket", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Regioner", + "settings_regionSettingsSubtitle": "Hämtade regioner", + "settings_regionManagement_screenTitle": "Regionförvaltning", + "settings_regionNameHint": "Enter regionnamn", + "settings_regionAddRegion": "Lag till region", + "settings_regionFetchRegions": "Hämtar regioner från repeater", + "settings_regionFetchRegionsFail": "Ingen region hittades", + "settings_regionFetchRegionsAlreadyExists": "Denna region har redan lagt till", + "settings_regionName": "Regionnavn", + "settings_regionDeleted": "Regionens kallt offentlig", + "settings_deleteRegion": "Förhålla regio", + "settings_deleteRegionConfirm": "Fjärna \"{region}\" ur regionlistan?", + "settings_infoHardware": "Hardware", + "settings_infoFirmware": "Föredata", + "repeater_pathHashModeOption0": "0 - 1 byte", + "repeater_pathHashModeOption1": "1 - 2 byte", + "repeater_pathHashModeOption2": "2 - 3 byte", + "repeater_pathHashModeOption3": "3 - 4 byte", + "appSettings_batteryLipoHv": "LiPo HV (3,0-4,35 V)", + "channels_regionSetTo": "Region: {region}", + "channels_regionNotSet": "Region: ingen", + "channels_regionSelect_Title": "Välj en region", + "channels_clearRegion": "klar region", + "chat_sendImage": "Send vagnbild", + "chat_imagePickFailed": "Kunde inte öppna det bildet", + "chat_receivedGif": "Mottagit en GIF", + "repeater_keySettings": "Ändra identitetsnyckel", + "repeater_keySettingsSubtitle": "Vänd nya offentliga/privata nyckelpar", + "repeater_prvKey": "Privat nyckel", + "repeater_prvKeyHelper": "En ny privat nyckel för repeatern, en hexsträng med 128 tecken.", + "repeater_generatePrvKey": "Generera en kära nyckelpaar", + "repeater_stopGeneratingPrvKey": "Avbröka sökande efter nyckelpa", + "repeater_pubKey": "Öffentlig nyckel", + "repeater_pubKeyHelper": "Detta är den offentliga nyckeln som tillhör genererad privaten nyckel. Du kan inte setta den direkt.", + "repeater_pubKeyPrefix": "Önskad prefix", + "repeater_pubKeyPrefixHelper": "Hitta en offentlig nyckel som börjar med dessa hexadecimala siffror. Förväntad antal försök: {tries}.", + "imageMessages_enableTitle": "Bildermeddelanden", + "imageMessages_enableSubtitle": "Send bilder över mönstret. Det kräver en enkelt bildmodellhämtning.", + "imageMessages_modelSectionTitle": "Bildmodell", + "imageMessages_downloadModel": "Download", + "imageMessages_cancelDownload": "Avbud", + "imageMessages_removeModel": "Förhåll dig från modellen", + "imageMessages_modelReady": "Färdig", + "imageMessages_modelNotPublished": "Ingen publikerad än — denna byggnads kan inte laddas ner av det.", + "imageMessages_downloadFailed": "Bildmodellen kunde inte laddas ner.", + "imageMessages_autoProcessTitle": "Automatiska bilder automatiserar", + "imageMessages_autoProcessSubtitle": "Rekonstruera varje bild så snart den ankommer. Använder cirka 2 GB minne varje gång; låt det omför att rekonstruera genom ett tap.", + "imageSend_title": "Send vagnbild", + "imageSend_cropNote": "Reserverat till 512 × 512 · förhållandet mellan storlek inte bevarat", + "imageSend_originalSize": "Ovanstående text (engelska)\n\nTranslation (svenskt):", + "imageSend_onAirSize": "Underför hjärnan", + "imageSend_quality": "Kvalitet", + "imageSend_qualityStandard": "Standard", + "imageSend_qualityHigh": "Hög", + "imageSend_packetsLabel": "Paket", + "imageSend_airtimeLabel": "Tid i övrighet", + "imageSend_sizeLabel": "Ladning", + "imageSend_packetsCount": "{count} {count, plural, =1{paket} other{paket}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Radioindikatorer inte kända", + "imageSend_radioUnknownBody": "Förkoppna till ett enhet så kan tiden på air beräknas.", + "imageSend_longSendTitle": "Långförsending", + "imageSend_longSendBody": "Detta kommer att bevara kanalen roughly {duration}.", + "imageSend_floodNote": "Flodledning: varje repeater i ramen retransmitterar varje paket, så kan kanalen vara på arbete långare än den här tiden.", + "imageSend_parityTitle": "Omedlningspaket", + "imageSend_paritySubtitle": "En ytterligare paket. Gruppmeddelanden inte akceras, så den här tar hänsyn till att mottar kan återuppbygga bilden om ett enkelt paket förlorats.", + "imageSend_send": "Sänd", + "imageSend_cancel": "Avbud", + "imageSend_encodeFailed": "Denna bild kan inte kodas.", + "imageSend_codecDownloading": "Bildmodellen downloads fortfarande.", + "imageSend_codecUnavailable": "Bildsendning är inte tillgänglig på detta enhet.", + "imageSend_codecDisabled": "Bildmeddelanden är offna i inställningarna.", + "imageSend_deviceUnsupported": "Denna radi kan inte senda bildpaket. Använd ett äventyrsgerät med companionsystemfirmware 13 eller nyare.", + "imageSend_directMessagesUnsupported": "Bilder senders som gruppod, så de kan endast skickas till ett kanal – inte i en direkt meddelning.", + "imageSend_tooLarge": "Bilden kodades till mer paket än meshformaten tillåter.", + "imageSend_sentConfirmation": "Bilden skickades som {count} {count, plural, =1{paket} other{paket}}.", + "imageSend_sendFailed": "Bilden kunde inte skickas: {error}", + "imageSend_sendingProgress": "Bild sendning — paket {sent} av {total}", + "receivedImage_senderPrefix": "Nod {prefix}", + "receivedImage_incoming": "VANTA {received} av {total} paket", + "receivedImage_queued": "Att väta att decodera", + "receivedImage_tapToDecode": "Tap för att decodera", + "receivedImage_decoding": "Rekonstruktion… om 1 sekund", + "receivedImage_incomplete": "Bilden är okomplett — {received} av {total} paket har ankomit", + "receivedImage_corrupt": "Bilden kunde inte rekonstrueras", + "receivedImage_decoderMissing": "Bild mottagen — bilddekoderingen är avbrott", + "receivedImage_evicted": "Bild inte lagrad längre", + "receivedImage_retry": "Omförs igen", + "receivedImage_decodeAgain": "Kodera igen", + "receivedImage_openSettings": "Skapa en uppställning", + "receivedImage_tapToProcess": "Tap för att behandla", + "receivedImage_awaiting": "{bytes} byte · {packets} {packets, plural, =1{paket} other{paket}}", + "imageSend_secondsValue": "{seconds} sekunder", + "imageSend_minutesSecondsValue": "{minutes} min {seconds} s" } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 870fb06d..3dccd6e3 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -2585,5 +2585,227 @@ "pathMap_noLocation": "Без геопозиції", "pathMap_followPacket": "Прив'язати вигляд до пакету", "pathMap_unfollowPacket": "Відв'язати вигляд від пакету", - "pathMap_gpsCount": "{confirmed}/{total} GPS" + "pathMap_gpsCount": "{confirmed}/{total} GPS", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "Ріси", + "settings_regionSettingsSubtitle": "Управляти збережених регіонів", + "settings_regionManagement_screenTitle": "Рégіональний управління", + "settings_regionNameHint": "Назва регіону", + "settings_regionAddRegion": "Добачить регіон", + "settings_regionFetchRegions": "Збираємо регіони з репітерів", + "settings_regionFetchRegionsFail": "Ні відкриті регіони", + "settings_regionFetchRegionsAlreadyExists": "Цей регіон вже було доданий", + "settings_regionName": "Ріонна назва", + "settings_regionDeleted": "Ріон витертений", + "settings_deleteRegion": "Видалення регіону", + "settings_deleteRegionConfirm": "Вирішіть \"{region}\" з списку регіонів?", + "settings_infoHardware": "Оборудовання", + "settings_infoFirmware": "Програмне вміст (фirmware)", + "repeater_pathHashModeOption0": "0 - 1 байт", + "repeater_pathHashModeOption1": "1 - 2 байти", + "repeater_pathHashModeOption2": "2 - 3 байти", + "repeater_pathHashModeOption3": "3 - 4 байта", + "appSettings_batteryLipoHv": "ЛиPo HV (3,0-4,35 В)", + "channels_regionSetTo": "Ріон: {region}", + "channels_regionNotSet": "Ріон: нема", + "channels_regionSelect_Title": "Вybірте регіон", + "channels_clearRegion": "Чистя зона", + "chat_sendImage": "Нашкоду зовні\n\n(or more naturally, depending on context)\n\nПошукуєте изображення", + "chat_imagePickFailed": "Неможливо відкрити це изображення", + "chat_receivedGif": "Підймовано GIF", + "repeater_keySettings": "Зміна ключів ідентифікації", + "repeater_keySettingsSubtitle": "Замініть публічний/приватний ключ", + "repeater_prvKey": "Приватний ключ", + "repeater_prvKeyHelper": "Нова приватна ключ для репітера, 128-символова штучна штука в шестнадцатеричному форматі.", + "repeater_generatePrvKey": "Синхронізujте ключовий пару", + "repeater_stopGeneratingPrvKey": "Прервити шук ключового пару", + "repeater_pubKey": "Публічна ключ", + "repeater_pubKeyHelper": "Це публична ключ, який пов'язано з створеною приватною ключом. Ви не можете встановлювати його напрямую.", + "repeater_pubKeyPrefix": "Високорейтингове прикінання", + "repeater_pubKeyPrefixHelper": "Найдіть відповідний открытий ключ, який починається ціми шестнадцатыми цифрами. Ожидається кількість потрібних попыток: {tries}.", + "imageMessages_enableTitle": "Підтримка зображень для посилання", + "imageMessages_enableSubtitle": "Пошукуєте изображення через сеть. Вимagaєте однократне скачання моделю изображення.", + "imageMessages_modelSectionTitle": "Модель для зображень", + "imageMessages_downloadModel": "Скачання", + "imageMessages_cancelDownload": "Завершити", + "imageMessages_removeModel": "Видалим модель", + "imageMessages_modelReady": "Готово", + "imageMessages_modelNotPublished": "Щоб не було опубліковано — це версія не дозволяє зробити скачання.", + "imageMessages_downloadFailed": "Модель для зображень не можна сказати.", + "imageMessages_autoProcessTitle": "Автоматично оброблювати obraзи", + "imageMessages_autoProcessSubtitle": "Кожна картинка повинні бути відтворена на мій момент прибуття. Використовує приблизно 2 ГБ пам'яті на кожен раз; відключіть від відтворення за допомогою кlikу.", + "imageSend_title": "Нашкоду зовні\n\n(or more naturally, depending on context)\n\nПошукуєте изображення", + "imageSend_cropNote": "Манітовано до 512 × 512 · соотношення варість не зберігається", + "imageSend_originalSize": "Оригінал", + "imageSend_onAirSize": "На ері", + "imageSend_quality": "Качество", + "imageSend_qualityStandard": "Стандарт", + "imageSend_qualityHigh": "Висок", + "imageSend_packetsLabel": "Пакети", + "imageSend_airtimeLabel": "Час на ері", + "imageSend_sizeLabel": "Підлог", + "imageSend_packetsCount": "{count} {count, plural, one{пакет} few{пакети} many{пакетів} other{пакета}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "Настройки радио неизвестні", + "imageSend_radioUnknownBody": "Залучіться до пристрою, щоб можна було розрахунювати час в етері.", + "imageSend_longSendTitle": "Длуга передача", + "imageSend_longSendBody": "Це забезпечить канал на approximativno {duration} хвилин.", + "imageSend_floodNote": "Рухування потоків: кожен ретрансатор у діапазоні відправлює кожен пакет, тому канал залишається занятшим довше, ніж це.", + "imageSend_parityTitle": "Пакет відновлення", + "imageSend_paritySubtitle": "Один дополний пакет. Групові посилання не відповідають, тому це дозволяє відвідувачу відтворити зображення, якщо один пакет втрачений.", + "imageSend_send": "Пошутить", + "imageSend_cancel": "Завершити", + "imageSend_encodeFailed": "Це изображення не може бути кодировано.", + "imageSend_codecDownloading": "Модель для відтворення изображень ще збирається.", + "imageSend_codecUnavailable": "Постій для відправлення изображень на цьому пристрої не доступний.", + "imageSend_codecDisabled": "Пictesovani posyly wyключені в настройках.", + "imageSend_deviceUnsupported": "Цей радіопередач не може отправляти пакети зображень. Зконнете пристрої, що працює з обладнанням керемонітом компаньєр 13 або новшим.", + "imageSend_directMessagesUnsupported": "Фотографії передаються як дані групою, тому їх можна відправляти лише на канал — не в прямому посилання.", + "imageSend_tooLarge": "Це изображення кодує більше пакітів, ніж дозволяє формат сети.", + "imageSend_sentConfirmation": "Зображення надіслано як {count} {count, plural, =1{пакет} other{пакетів}}.", + "imageSend_sendFailed": "Изображення не можна відправити: {error}", + "imageSend_sendingProgress": "Пошускаємо изображення — пакет {sent} з {total}", + "receivedImage_senderPrefix": "Нод {prefix}", + "receivedImage_incoming": "Підходяче: {received} з {total} пакітів", + "receivedImage_queued": "Очікування розслівання коду", + "receivedImage_tapToDecode": "Кliknite для декодування", + "receivedImage_decoding": "Повноювання… за прибуття 1 с.", + "receivedImage_incomplete": "Образок не повний — {received} з {total} пакітів прибавлено", + "receivedImage_corrupt": "Obraz не можна відтворити", + "receivedImage_decoderMissing": "Під час приємки — розшифровка зображення не вдалося.", + "receivedImage_evicted": "Изображення не зберігається", + "receivedImage_retry": "Попробуй ще раз", + "receivedImage_decodeAgain": "Декодуй ще раз", + "receivedImage_openSettings": "Заведіть", + "receivedImage_tapToProcess": "Кликніть для обробки", + "receivedImage_awaiting": "{bytes} байтів · {packets} {packets, plural, =1{пакет} other{пакетів}}", + "imageSend_secondsValue": "{seconds} секунди", + "imageSend_minutesSecondsValue": "{minutes} хв {seconds} с" } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index b0dd5b6b..4aabd445 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -2610,5 +2610,227 @@ "pathMap_followPacket": "锁定视图跟随数据包", "pathMap_unfollowPacket": "解锁视图跟随", "pathMap_gpsCount": "{confirmed}/{total} GPS", - "pathMap_partialAnimation": "{count, plural, =1{1 跳无位置信息 — 显示的路径不完整} other{{count} 跳无位置信息 — 显示的路径不完整}}" + "pathMap_partialAnimation": "{count, plural, =1{1 跳无位置信息 — 显示的路径不完整} other{{count} 跳无位置信息 — 显示的路径不完整}}", + "@settings_deleteRegionConfirm": { + "placeholders": { + "region": { + "type": "String" + } + } + }, + "@channels_regionSetTo": { + "placeholders": { + "region": { + "type": "String", + "example": "de-mitte" + } + } + }, + "@chat_imagePickFailed": { + "description": "Shown when picking or reading a photo to send fails" + }, + "@repeater_pubKeyPrefixHelper": { + "placeholders": { + "tries": { + "type": "int" + } + } + }, + "@imageSend_packetsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_range": { + "placeholders": { + "min": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "@imageSend_longSendBody": { + "placeholders": { + "duration": { + "type": "String" + } + } + }, + "@imageSend_sentConfirmation": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@imageSend_sendFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "@imageSend_sendingProgress": { + "placeholders": { + "sent": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_senderPrefix": { + "placeholders": { + "prefix": { + "type": "String" + } + } + }, + "@receivedImage_incoming": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_incomplete": { + "placeholders": { + "received": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "@receivedImage_awaiting": { + "placeholders": { + "bytes": { + "type": "int" + }, + "packets": { + "type": "int" + } + } + }, + "@imageSend_secondsValue": { + "placeholders": { + "seconds": { + "type": "String" + } + } + }, + "@imageSend_minutesSecondsValue": { + "placeholders": { + "minutes": { + "type": "String" + }, + "seconds": { + "type": "String" + } + } + }, + "settings_regionSettings": "地区", + "settings_regionSettingsSubtitle": "管理已存储的区域", + "settings_regionManagement_screenTitle": "区域管理", + "settings_regionNameHint": "区域名称", + "settings_regionAddRegion": "增加地区", + "settings_regionFetchRegions": "从中继器获取区域", + "settings_regionFetchRegionsFail": "未发现任何地区", + "settings_regionFetchRegionsAlreadyExists": "该地区已被添加", + "settings_regionName": "地区名称", + "settings_regionDeleted": "区域已删除", + "settings_deleteRegion": "删除区域", + "settings_deleteRegionConfirm": "从 {region} 列表中删除?", + "settings_infoHardware": "硬件", + "settings_infoFirmware": "固件", + "repeater_pathHashModeOption0": "0 - 1 字节", + "repeater_pathHashModeOption1": "1 - 2 字节", + "repeater_pathHashModeOption2": "2 - 3 字节", + "repeater_pathHashModeOption3": "3 - 4 字节", + "appSettings_batteryLipoHv": "锂多压电源(3.0-4.35伏)", + "channels_regionSetTo": "地区:{region}", + "channels_regionNotSet": "地区:无", + "channels_regionSelect_Title": "选择一个地区", + "channels_clearRegion": "无碍区域", + "chat_sendImage": "发送图片", + "chat_imagePickFailed": "无法打开该图片", + "chat_receivedGif": "收到一个GIF", + "repeater_keySettings": "更改身份密钥", + "repeater_keySettingsSubtitle": "更换公钥/私钥对", + "repeater_prvKey": "私钥", + "repeater_prvKeyHelper": "中继器的新私钥,为一个128位的十六进制字符串。", + "repeater_generatePrvKey": "生成一个随机的密钥对", + "repeater_stopGeneratingPrvKey": "中断密钥对搜索", + "repeater_pubKey": "公钥", + "repeater_pubKeyHelper": "这是与生成的私钥配对的公钥。您不能直接设置此内容。", + "repeater_pubKeyPrefix": "期望的前缀", + "repeater_pubKeyPrefixHelper": "找到一组以这些十六进制数字开头的公钥。预计尝试次数:{tries}", + "imageMessages_enableTitle": "启用图片消息", + "imageMessages_enableSubtitle": "通过网格发送图像。需要一次性下载图像模型。", + "imageMessages_modelSectionTitle": "图像模型", + "imageMessages_downloadModel": "下载", + "imageMessages_cancelDownload": "取消", + "imageMessages_removeModel": "移除模型", + "imageMessages_modelReady": "准备就绪", + "imageMessages_modelNotPublished": "尚未发布——此版本无法下载该内容。", + "imageMessages_downloadFailed": "图像模型无法下载。", + "imageMessages_autoProcessTitle": "自动处理图像", + "imageMessages_autoProcessSubtitle": "每次图像到达后立即重建,每次需要约2GB的内存;若想关闭重建功能,可通过点击取消开启。", + "imageSend_title": "发送图片", + "imageSend_cropNote": "调整大小至512 × 512 · 宽高比未保留", + "imageSend_originalSize": "原文", + "imageSend_onAirSize": "直播中", + "imageSend_quality": "质量", + "imageSend_qualityStandard": "标准", + "imageSend_qualityHigh": "高", + "imageSend_packetsLabel": "数据包", + "imageSend_airtimeLabel": "播出时间", + "imageSend_sizeLabel": "有效载荷", + "imageSend_packetsCount": "{count} {count, plural, =1{个数据包} other{个数据包}}", + "imageSend_range": "{min}–{max}", + "imageSend_unknownValue": "—", + "imageSend_radioUnknownTitle": "无线电设置未知", + "imageSend_radioUnknownBody": "连接设备以计算播出时间。", + "imageSend_longSendTitle": "长距离传输", + "imageSend_longSendBody": "这将维持频道大约 {duration} 时间。", + "imageSend_floodNote": "洪水路由:每个中继站都会转发每个数据包,因此信道比这段时间更长地处于繁忙状态。", + "imageSend_parityTitle": "恢复包", + "imageSend_paritySubtitle": "多一个数据包。群发消息不被确认,因此如果某个数据包丢失,接收方可以重新构建图像。", + "imageSend_send": "发送", + "imageSend_cancel": "取消", + "imageSend_encodeFailed": "此图像无法编码。", + "imageSend_codecDownloading": "图像模型仍在下载中。", + "imageSend_codecUnavailable": "此设备无法发送图片。", + "imageSend_codecDisabled": "图片消息在设置中已关闭。", + "imageSend_deviceUnsupported": "此无线电无法发送图像数据包。请连接运行伴侣固件13或更高版本的设备。", + "imageSend_directMessagesUnsupported": "图片作为群组数据传输,因此只能发送到频道,而不能直接发送给个人。", + "imageSend_tooLarge": "该图像编码的数据包数量超过了网格格式所允许的范围。", + "imageSend_sentConfirmation": "图像已作为 {count} {count, plural, =1{个数据包} other{个数据包}} 发送。", + "imageSend_sendFailed": "无法发送图片:{error}", + "imageSend_sendingProgress": "发送图像 — 已发送 {sent} 包含 {total}", + "receivedImage_senderPrefix": "节点 {prefix}", + "receivedImage_incoming": "已收到的 {received} 个包含在 {total} 个包裹中", + "receivedImage_queued": "等待解码", + "receivedImage_tapToDecode": "点击解锁", + "receivedImage_decoding": "重建……大约1秒", + "receivedImage_incomplete": "图片不完整 — {received} 已收到 {total} 个数据包", + "receivedImage_corrupt": "图像无法重建", + "receivedImage_decoderMissing": "收到图片 — 图像解码失败", + "receivedImage_evicted": "图片已不再存储", + "receivedImage_retry": "再试一次", + "receivedImage_decodeAgain": "重新解码", + "receivedImage_openSettings": "建立", + "receivedImage_tapToProcess": "点击处理", + "receivedImage_awaiting": "{bytes} 字节 · {packets} {packets, plural, =1{个数据包} other{个数据包}}", + "imageSend_secondsValue": "{seconds} 秒", + "imageSend_minutesSecondsValue": "{minutes} 分 {seconds} 秒" } diff --git a/lib/main.dart b/lib/main.dart index 786566de..82e9e0ac 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -345,8 +345,7 @@ class MeshCoreApp extends StatefulWidget { /// packets" until some unrelated image arrived. const Duration _kImageSweepInterval = Duration(seconds: 5); -class _MeshCoreAppState extends State - with WidgetsBindingObserver { +class _MeshCoreAppState extends State with WidgetsBindingObserver { Timer? _imageSweepTimer; @override @@ -369,9 +368,7 @@ class _MeshCoreAppState extends State @override void didChangeAppLifecycleState(AppLifecycleState state) { super.didChangeAppLifecycleState(state); - widget.receivedImageStore.setForeground( - state == AppLifecycleState.resumed, - ); + widget.receivedImageStore.setForeground(state == AppLifecycleState.resumed); // ~2.7 GiB resident in a backgrounded app is a low-memory-killer kill, so // unlike the translation stack the graph is dropped on background rather // than held until the radio disconnects. diff --git a/lib/models/app_settings.dart b/lib/models/app_settings.dart index bb23a451..dd93cfe0 100644 --- a/lib/models/app_settings.dart +++ b/lib/models/app_settings.dart @@ -240,8 +240,7 @@ class AppSettings { }) : batteryChemistryByDeviceId = batteryChemistryByDeviceId ?? {}, batteryChemistryByRepeaterId = batteryChemistryByRepeaterId ?? {}, mutedChannels = mutedChannels ?? {}, - imageCodecDownloadedModels = - imageCodecDownloadedModels ?? const [], + imageCodecDownloadedModels = imageCodecDownloadedModels ?? const [], translationDownloadedModels = translationDownloadedModels ?? const [], cyr2latProfiles = cyr2latProfiles ?? diff --git a/lib/models/image_codec_support.dart b/lib/models/image_codec_support.dart index b6d5b4e9..e11476b3 100644 --- a/lib/models/image_codec_support.dart +++ b/lib/models/image_codec_support.dart @@ -464,8 +464,7 @@ class ImageCodecModelSpec { /// /// Defined by role, not by position. Kept under the old name so the settings /// screen and [imageCodecModelFriendlyName] keep working. - ImageCodecModelAsset get graph => - assetFor(ImageCodecAssetRole.decoderGraph); + ImageCodecModelAsset get graph => assetFor(ImageCodecAssetRole.decoderGraph); String get fileName => graph.fileName; diff --git a/lib/screens/channel_chat_screen.dart b/lib/screens/channel_chat_screen.dart index ccceb704..29ea0beb 100644 --- a/lib/screens/channel_chat_screen.dart +++ b/lib/screens/channel_chat_screen.dart @@ -418,13 +418,15 @@ class _ChannelChatScreenState extends State { // sources are merged here in timestamp order and the list // below indexes rows, not messages. final rows = <_ChannelChatRow>[ - for (final message in messages) _ChannelChatRow(message: message), + for (final message in messages) + _ChannelChatRow(message: message), ...imageRows, ]..sort((a, b) => a.timestamp.compareTo(b.timestamp)); // Reverse rows so newest appear at bottom with reverse: true final reversedRows = rows.reversed.toList(); - final itemCount = reversedRows.length + (_isLoadingOlder ? 1 : 0); + final itemCount = + reversedRows.length + (_isLoadingOlder ? 1 : 0); // Prune stale keys (deleted/cleared messages) to avoid // unbounded growth. @@ -500,7 +502,10 @@ class _ChannelChatScreenState extends State { final message = row.message; final bubble = message != null ? _buildMessageBubble(message, textScale) - : _buildImageBubble(row.image!, textScale); + : _buildImageBubble( + row.image!, + textScale, + ); if (isUnreadAnchor) { return Column( mainAxisSize: MainAxisSize.min, @@ -1193,9 +1198,7 @@ class _ChannelChatScreenState extends State { parity: result.includeParity, ); } on ArgumentError { - messenger.showSnackBar( - SnackBar(content: Text(l10n.imageSend_tooLarge)), - ); + messenger.showSnackBar(SnackBar(content: Text(l10n.imageSend_tooLarge))); return; } @@ -1206,7 +1209,8 @@ class _ChannelChatScreenState extends State { final perPacket = total == null ? Duration.zero : Duration( - microseconds: total.inMicroseconds ~/ + microseconds: + total.inMicroseconds ~/ (result.packetCount == 0 ? 1 : result.packetCount), ); @@ -1411,9 +1415,7 @@ class _ChannelChatScreenState extends State { child: Container( padding: const EdgeInsets.all(4), decoration: BoxDecoration( - color: isOutgoing - ? MeshPalette.me - : scheme.surfaceContainerLow, + color: isOutgoing ? MeshPalette.me : scheme.surfaceContainerLow, borderRadius: BorderRadius.circular(MeshRadii.lg), border: Border.all( color: isOutgoing @@ -1427,7 +1429,11 @@ class _ChannelChatScreenState extends State { children: [ if (!isOutgoing) Padding( - padding: const EdgeInsets.only(left: 8, top: 4, bottom: 4), + padding: const EdgeInsets.only( + left: 8, + top: 4, + bottom: 4, + ), child: Text( _imageSenderLabel(entry), style: TextStyle( @@ -1454,7 +1460,11 @@ class _ChannelChatScreenState extends State { ), ), Padding( - padding: const EdgeInsets.only(left: 8, right: 8, bottom: 4), + padding: const EdgeInsets.only( + left: 8, + right: 8, + bottom: 4, + ), child: Text( _formatTime(context, entry.firstSeen), style: MeshTheme.mono( @@ -1482,7 +1492,8 @@ class _ChannelChatScreenState extends State { String _imageSenderLabel(ReceivedImageEntry entry) { final hex = entry.senderPrefix.toRadixString(16).padLeft(4, '0'); final connector = context.read(); - if (entry.isOutgoing) return connector.selfName ?? context.l10n.receivedImage_senderPrefix(hex); + if (entry.isOutgoing) + return connector.selfName ?? context.l10n.receivedImage_senderPrefix(hex); final matches = connector.contacts .where((c) => c.publicKeyHex.toLowerCase().startsWith(hex)) .toList(); diff --git a/lib/services/image_chunk_transport.dart b/lib/services/image_chunk_transport.dart index d4ad7c92..558ebb73 100644 --- a/lib/services/image_chunk_transport.dart +++ b/lib/services/image_chunk_transport.dart @@ -384,7 +384,8 @@ class ImageChunkHeader { bool get isParity => index == total; @override - String toString() => 'ImageChunkHeader(sender: 0x' + String toString() => + 'ImageChunkHeader(sender: 0x' '${senderPrefix.toRadixString(16).padLeft(4, '0')}, img: $imgId, ' 'idx: $index/$total${isParity ? ' parity' : ''})'; } @@ -549,7 +550,7 @@ class ImageIdAllocator { int _next; ImageIdAllocator({int? seed, math.Random? random}) - : _next = seed ?? (random ?? math.Random()).nextInt(256); + : _next = seed ?? (random ?? math.Random()).nextInt(256); int next() { final id = _next & 0xFF; @@ -585,7 +586,8 @@ class ImageStreamKey { int get hashCode => Object.hash(senderPrefix, imgId, channelIndex); @override - String toString() => 'ImageStreamKey(0x' + String toString() => + 'ImageStreamKey(0x' '${senderPrefix.toRadixString(16).padLeft(4, '0')}/$imgId@$channelIndex)'; } @@ -625,7 +627,6 @@ enum ImageReassemblyFailureReason { /// Evicted to keep the pending map inside its size cap. overflow, - /// Reassembled but the metadata byte was undecodable /// ([ImageChunkStatus.unsupportedFormat]). unsupportedFormat, @@ -647,7 +648,6 @@ class ImageReassemblyResult { /// Number of data chunks in the image. final int chunkCount; - const ImageReassemblyResult({ required this.key, required this.metadata, @@ -688,7 +688,8 @@ class ImageReassemblyFailure { reason == ImageReassemblyFailureReason.unsupportedFormat; @override - String toString() => 'ImageReassemblyFailure($key, ' + String toString() => + 'ImageReassemblyFailure($key, ' '$receivedDataChunks/$total, parity: $hadParity, ${reason.name})'; } @@ -966,11 +967,7 @@ class ImageReassembler { ), ); } - return ImageChunkOutcome( - finish.status, - header: header, - result: result, - ); + return ImageChunkOutcome(finish.status, header: header, result: result); } return ImageChunkOutcome( conflicted ? ImageChunkStatus.conflicting : ImageChunkStatus.accepted, @@ -1061,8 +1058,10 @@ class ImageReassembler { if (!entry.isRecoverable) return null; // Exactly one data chunk missing and we hold parity: rebuild it. - final missing = - List.generate(entry.total, (i) => i).firstWhere((i) => !entry.bodies.containsKey(i)); + final missing = List.generate( + entry.total, + (i) => i, + ).firstWhere((i) => !entry.bodies.containsKey(i)); final parity = entry.parityBody!; var lengthXor = parity[0] & 0xFF; final xor = Uint8List(kImageChunkBodyBytes); @@ -1134,8 +1133,8 @@ class _FinishOutcome { const _FinishOutcome.failed(this.status, this.reason) : result = null; const _FinishOutcome.delivered(ImageReassemblyResult this.result) - : status = ImageChunkStatus.completed, - reason = null; + : status = ImageChunkStatus.completed, + reason = null; } bool _sameBytes(Uint8List a, Uint8List b) { @@ -1232,10 +1231,8 @@ ParsedChannelData? parseChannelDataFrame(Uint8List frame) { /// /// Implemented by the connector-facing adapter; kept as a typedef so the /// transport itself never imports the connector (and stays testable). -typedef ChannelBlobSender = Future Function( - Uint8List blob, - int channelIndex, -); +typedef ChannelBlobSender = + Future Function(Uint8List blob, int channelIndex); /// Progress report while an image is going out. class ImageSendProgress { diff --git a/lib/services/image_codec_backend.dart b/lib/services/image_codec_backend.dart index 6b2b74b9..6dcc5c9e 100644 --- a/lib/services/image_codec_backend.dart +++ b/lib/services/image_codec_backend.dart @@ -300,9 +300,15 @@ class OnnxImageCodecBackend implements ImageCodecBackend { // The path must be the `.onnx` graph, with its `.onnx.data` // external-weights sibling present in the same directory under exactly the // filename the graph records. See `ImageCodecModelSpec`. - final session = await _runtime.createSession(_requireBundle().decoderGraphPath); + final session = await _runtime.createSession( + _requireBundle().decoderGraphPath, + ); _decoder = session; - _inputName = _pick(session.inputNames, kImageCodecDecoderInputName, 'input'); + _inputName = _pick( + session.inputNames, + kImageCodecDecoderInputName, + 'input', + ); _outputName = _pick( session.outputNames, kImageCodecDecoderOutputName, @@ -735,9 +741,10 @@ class OnnxAeicEntropyNetwork implements AeicEntropyNetwork { Float32List(kBaseElements), kBaseShape, ), - kStageInput: await OrtValue.fromList(Int32List.fromList([ - kHyperStage, - ]), [1]), + kStageInput: await OrtValue.fromList( + Int32List.fromList([kHyperStage]), + [1], + ), }); try { return await _floats(result, kBase0Output); @@ -766,9 +773,10 @@ class OnnxAeicEntropyNetwork implements AeicEntropyNetwork { final result = await _run(session, { kZqInput: await OrtValue.fromList(Float32List(kZqElements), kZqShape), kBaseInput: await OrtValue.fromList(base, kBaseShape), - kStageInput: await OrtValue.fromList(Int32List.fromList([ - stage, - ]), [1]), + kStageInput: await OrtValue.fromList( + Int32List.fromList([stage]), + [1], + ), }); try { // Already masked by the graph. `AeicEntropyCodec` masks again, which is diff --git a/lib/services/image_codec_entropy.dart b/lib/services/image_codec_entropy.dart index 31da1050..f7fdaf55 100644 --- a/lib/services/image_codec_entropy.dart +++ b/lib/services/image_codec_entropy.dart @@ -239,9 +239,8 @@ class AeicMaskSet { for (var y = 0; y < geometry.yHeight; y++) { for (var x = 0; x < w; x++) { final group = liveGroupAt(stage, y, x); - out[(group * cq + c) * plane + y * w + x] = squeezed[c * plane + - y * w + - x]; + out[(group * cq + c) * plane + y * w + x] = + squeezed[c * plane + y * w + x]; } } } @@ -272,7 +271,11 @@ class AeicMaskSet { /// /// `stageLatent` must already be masked (it is the output of [unsqueeze]), so /// this is a select, not an add — which is what keeps it exact in float32. - Float32List mergeContext(Float32List base, Float32List stageLatent, int stage) { + Float32List mergeContext( + Float32List base, + Float32List stageLatent, + int stage, + ) { final out = Float32List.fromList(base); final plane = geometry.yHeight * geometry.yWidth; final cq = geometry.squeezedChannels; diff --git a/lib/services/image_codec_file_store_stub.dart b/lib/services/image_codec_file_store_stub.dart index f4ad5de4..2cab39c8 100644 --- a/lib/services/image_codec_file_store_stub.dart +++ b/lib/services/image_codec_file_store_stub.dart @@ -4,7 +4,9 @@ import '../models/image_codec_support.dart'; class ImageCodecFileStore { Future modelDirectoryPath() async { - throw UnsupportedError('Local codec model storage is not supported on web.'); + throw UnsupportedError( + 'Local codec model storage is not supported on web.', + ); } Future> scanDownloadedModels() async { @@ -19,15 +21,21 @@ class ImageCodecFileStore { required String fileName, required Stream> chunks, }) async { - throw UnsupportedError('Local codec model storage is not supported on web.'); + throw UnsupportedError( + 'Local codec model storage is not supported on web.', + ); } Future chunkFilePath(String fileName, int index) async { - throw UnsupportedError('Local codec model storage is not supported on web.'); + throw UnsupportedError( + 'Local codec model storage is not supported on web.', + ); } Future modelFilePath(String fileName) async { - throw UnsupportedError('Local codec model storage is not supported on web.'); + throw UnsupportedError( + 'Local codec model storage is not supported on web.', + ); } Future deletePartialDownloads(String fileName) async {} @@ -38,11 +46,15 @@ class ImageCodecFileStore { required String path, required Stream> chunks, }) async { - throw UnsupportedError('Local codec model storage is not supported on web.'); + throw UnsupportedError( + 'Local codec model storage is not supported on web.', + ); } Future sha256OfFile(String path) async { - throw UnsupportedError('Local codec model storage is not supported on web.'); + throw UnsupportedError( + 'Local codec model storage is not supported on web.', + ); } Future readFileBytes(String path) async { @@ -53,7 +65,9 @@ class ImageCodecFileStore { required String fileName, required List chunkPaths, }) async { - throw UnsupportedError('Local codec model storage is not supported on web.'); + throw UnsupportedError( + 'Local codec model storage is not supported on web.', + ); } } diff --git a/lib/services/image_codec_service.dart b/lib/services/image_codec_service.dart index fca19b7a..ed5972a7 100644 --- a/lib/services/image_codec_service.dart +++ b/lib/services/image_codec_service.dart @@ -285,7 +285,10 @@ class ImageCodecService extends ChangeNotifier implements ImageSendCodec { final spec = _specForId(model.id); final directory = _directoryOf(model.localPath); - String? pathFor(ImageCodecAssetRole role, bool Function(String) looksRight) { + String? pathFor( + ImageCodecAssetRole role, + bool Function(String) looksRight, + ) { // 1. What the installer recorded this file AS. Exact, and the only source // that can tell the two entropy graphs apart. final recorded = model.fileNameForRole(role); @@ -430,7 +433,8 @@ class ImageCodecService extends ChangeNotifier implements ImageSendCodec { assetFileNames: present, assetRoles: { for (final asset in spec.assets) - if (onDisk.containsKey(asset.fileName)) asset.fileName: asset.role, + if (onDisk.containsKey(asset.fileName)) + asset.fileName: asset.role, }, bundleVersion: complete ? kImageCodecBundleVersion : 0, ), @@ -669,9 +673,7 @@ class ImageCodecService extends ChangeNotifier implements ImageSendCodec { // The only place the role of each downloaded file is known for // certain. Recorded now so nothing downstream has to infer it from a // filename — see [ImageCodecModelRecord.assetRoles]. - assetRoles: { - for (final asset in assets) asset.fileName: asset.role, - }, + assetRoles: {for (final asset in assets) asset.fileName: asset.role}, bundleVersion: bundleVersion, ); final updated = [ diff --git a/lib/services/image_codec_settings_store.dart b/lib/services/image_codec_settings_store.dart index 55e9376f..3ac39d57 100644 --- a/lib/services/image_codec_settings_store.dart +++ b/lib/services/image_codec_settings_store.dart @@ -61,7 +61,10 @@ class PrefsImageCodecSettingsStore implements ImageCodecSettingsStore { _preferences = preferences; _loaded = true; try { - await PrefsManager.instance.setString(_key, jsonEncode(preferences.toJson())); + await PrefsManager.instance.setString( + _key, + jsonEncode(preferences.toJson()), + ); } catch (error) { appLogger.warn('Image codec settings save failed: $error'); } diff --git a/lib/services/received_image_blob_store_io.dart b/lib/services/received_image_blob_store_io.dart index 42bc18b6..ef753f6d 100644 --- a/lib/services/received_image_blob_store_io.dart +++ b/lib/services/received_image_blob_store_io.dart @@ -85,7 +85,9 @@ class FileReceivedImageBlobStore implements ReceivedImageBlobStore { Future _resolve() async { final base = await _baseDirectory(); - final dir = Directory('${base.path}${Platform.pathSeparator}$directoryName'); + final dir = Directory( + '${base.path}${Platform.pathSeparator}$directoryName', + ); if (!dir.existsSync()) { await dir.create(recursive: true); } @@ -112,7 +114,11 @@ class FileReceivedImageBlobStore implements ReceivedImageBlobStore { } } - Future _write(String streamId, String extension, Uint8List bytes) async { + Future _write( + String streamId, + String extension, + Uint8List bytes, + ) async { try { final path = await _pathFor(streamId, extension); if (path == null) { @@ -121,7 +127,9 @@ class FileReceivedImageBlobStore implements ReceivedImageBlobStore { } await File(path).writeAsBytes(bytes, flush: true); } catch (error) { - debugPrint('received_image_blob_store: write $streamId$extension: $error'); + debugPrint( + 'received_image_blob_store: write $streamId$extension: $error', + ); } } @@ -132,7 +140,9 @@ class FileReceivedImageBlobStore implements ReceivedImageBlobStore { final file = File(path); if (file.existsSync()) await file.delete(); } catch (error) { - debugPrint('received_image_blob_store: delete $streamId$extension: $error'); + debugPrint( + 'received_image_blob_store: delete $streamId$extension: $error', + ); } } diff --git a/lib/services/received_image_store.dart b/lib/services/received_image_store.dart index 2258fd7d..b4d522c3 100644 --- a/lib/services/received_image_store.dart +++ b/lib/services/received_image_store.dart @@ -74,7 +74,8 @@ class ReceivedImageRef { static String encode(String streamId) => '$scheme$streamId'; /// Returns the stream id, or null when [text] is not an image sentinel. - static String? parse(String text) => _pattern.firstMatch(text.trim())?.group(1); + static String? parse(String text) => + _pattern.firstMatch(text.trim())?.group(1); /// `%04x%02x%08x` — 4 hex sender prefix, 2 hex img id, 8 hex epoch seconds. /// @@ -391,7 +392,8 @@ abstract class ReceivedImageBlobStore { (await readBitstream(streamId))?.length; /// Byte length of the stored PNG, or null when there is none. - Future pngSize(String streamId) async => (await readPng(streamId))?.length; + Future pngSize(String streamId) async => + (await readPng(streamId))?.length; /// Sidecar write must be atomic (tmp + rename) so a kill cannot leave a /// half-written record that `readSidecars` then discards. @@ -574,7 +576,8 @@ class ReceivedImageStore extends ChangeNotifier { final DateTime Function() _clock; - final Map _entries = {}; + final Map _entries = + {}; final Map _byKey = {}; final Map> _listenables = >{}; @@ -636,8 +639,7 @@ class ReceivedImageStore extends ChangeNotifier { int get totalBytes => _entries.values.fold(0, (sum, e) => sum + e.storedBytes); - int get storedImageCount => - _entries.values.where((e) => e.pngStored).length; + int get storedImageCount => _entries.values.where((e) => e.pngStored).length; /// Stream ids waiting for an automatic decode, oldest request first. List get decodeQueue => List.unmodifiable(_queue); @@ -1271,7 +1273,9 @@ class ReceivedImageStore extends ChangeNotifier { if (!entry.pngStored) return null; final bytes = await blobs.readPng(streamId); if (bytes == null) { - await _store(entry.copyWith(state: ReceivedImageState.evicted, pngStored: false)); + await _store( + entry.copyWith(state: ReceivedImageState.evicted, pngStored: false), + ); return null; } await _store(entry.copyWith(pngBytes: bytes, pngByteCount: bytes.length)); diff --git a/lib/utils/lora_airtime.dart b/lib/utils/lora_airtime.dart index 0c65bacc..9c85a8b6 100644 --- a/lib/utils/lora_airtime.dart +++ b/lib/utils/lora_airtime.dart @@ -109,8 +109,10 @@ Duration loraTimeOnAir({ final numerator = 8 * pl - 4 * sf + 28 + 16 * (crc ? 1 : 0) - 20 * ih; final denominator = 4 * (sf - 2 * de); - final payloadSymbols = - math.max((numerator / denominator).ceil() * codingRate, 0); + final payloadSymbols = math.max( + (numerator / denominator).ceil() * codingRate, + 0, + ); final preambleMs = (preambleSymbols + 4.25) * tsymMs; final payloadMs = (8 + payloadSymbols) * tsymMs; @@ -178,10 +180,10 @@ const double kImageSendChunkGapAirtimeFactor = 1.0; /// The pacing gap left after transmitting a packet whose airtime is /// [packetAirtime], before the next chunk is queued. Duration imageSendChunkGap(Duration packetAirtime) => Duration( - microseconds: kImageSendChunkGapBase.inMicroseconds + - (packetAirtime.inMicroseconds * kImageSendChunkGapAirtimeFactor) - .round(), - ); + microseconds: + kImageSendChunkGapBase.inMicroseconds + + (packetAirtime.inMicroseconds * kImageSendChunkGapAirtimeFactor).round(), +); /// Result of estimating an image (or any chunked payload) send. /// @@ -248,13 +250,13 @@ class SendEstimate { @override int get hashCode => Object.hash( - chunkCount, - totalBytes, - perPacketAirtime, - totalAirtime, - pacedWallClock, - includesParity, - ); + chunkCount, + totalBytes, + perPacketAirtime, + totalAirtime, + pacedWallClock, + includesParity, + ); } /// Number of data chunks needed for [payloadBytes], excluding parity. @@ -276,8 +278,7 @@ List imageChunkPayloadSizes(int payloadBytes) { final sizes = []; var remaining = payloadBytes; for (var i = 0; i < count; i++) { - final capacity = - i == 0 ? kImageChunkFirstCapacity : kImageChunkCapacity; + final capacity = i == 0 ? kImageChunkFirstCapacity : kImageChunkCapacity; final take = remaining < capacity ? remaining : capacity; sizes.add(take); remaining -= take; @@ -376,11 +377,11 @@ SendEstimate estimateSendFromRadioParams({ // Safe to force: areLoRaParamsValid() above proved all three are non-null // and in range. Duration airtimeFor(int bytes) => loraTimeOnAir( - payloadBytes: bytes, - spreadingFactor: spreadingFactor!, - bandwidthHz: bandwidthHz!, - codingRate: cr!, - ); + payloadBytes: bytes, + spreadingFactor: spreadingFactor!, + bandwidthHz: bandwidthHz!, + codingRate: cr!, + ); // Airtime of a maximally-filled chunk packet, i.e. the cost of one "typical" // packet in the stream. A full blob is the whole kImageChunkBlobBytes. diff --git a/lib/widgets/image_send_preview_sheet.dart b/lib/widgets/image_send_preview_sheet.dart index db5a8324..d235a419 100644 --- a/lib/widgets/image_send_preview_sheet.dart +++ b/lib/widgets/image_send_preview_sheet.dart @@ -168,8 +168,10 @@ class _ImageSendPreviewSheetState extends State { _failed = false; }); try { - final bytes = - await widget.codec.encode(widget.imageBytes, kImageSendRatePoint); + final bytes = await widget.codec.encode( + widget.imageBytes, + kImageSendRatePoint, + ); if (!mounted) return bytes; setState(() { _encoded = bytes; @@ -333,14 +335,14 @@ class _ImageSendPreviewSheetState extends State { } Widget _grabHandle(ColorScheme colors) => Container( - width: 36, - height: 4, - margin: const EdgeInsets.symmetric(vertical: 12), - decoration: BoxDecoration( - color: colors.onSurfaceVariant.withValues(alpha: 0.4), - borderRadius: BorderRadius.circular(2), - ), - ); + width: 36, + height: 4, + margin: const EdgeInsets.symmetric(vertical: 12), + decoration: BoxDecoration( + color: colors.onSurfaceVariant.withValues(alpha: 0.4), + borderRadius: BorderRadius.circular(2), + ), + ); /// The square render. [BoxFit.fill] on a 1:1 box is exactly the 512x512 /// centre crop the codec will take, so what is shown is what is sent. @@ -389,11 +391,7 @@ class _ImageSendPreviewSheetState extends State { ); } - Widget _sizeRow( - ThemeData theme, - ColorScheme colors, - _RateEstimate estimate, - ) { + Widget _sizeRow(ThemeData theme, ColorScheme colors, _RateEstimate estimate) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -406,7 +404,11 @@ class _ImageSendPreviewSheetState extends State { ), Padding( padding: const EdgeInsets.symmetric(horizontal: 12), - child: Icon(Icons.arrow_forward, size: 18, color: colors.onSurfaceVariant), + child: Icon( + Icons.arrow_forward, + size: 18, + color: colors.onSurfaceVariant, + ), ), _sizeChip( theme, @@ -489,11 +491,8 @@ class _ImageSendPreviewSheetState extends State { ); } - Widget _statDivider(ColorScheme colors) => Container( - width: 1, - height: 44, - color: colors.outlineVariant, - ); + Widget _statDivider(ColorScheme colors) => + Container(width: 1, height: 44, color: colors.outlineVariant); Widget _stat( ThemeData theme, @@ -575,9 +574,7 @@ class _ImageSendPreviewSheetState extends State { background: colors.tertiaryContainer, foreground: colors.onTertiaryContainer, title: localizations.imageSend_longSendTitle, - body: localizations.imageSend_longSendBody( - _formatDuration(worst), - ), + body: localizations.imageSend_longSendBody(_formatDuration(worst)), ), ); } @@ -699,8 +696,9 @@ class _ImageSendPreviewSheetState extends State { children: [ Expanded( child: OutlinedButton( - onPressed: - _sending ? null : () => Navigator.of(context).maybePop(), + onPressed: _sending + ? null + : () => Navigator.of(context).maybePop(), child: Text(localizations.imageSend_cancel), ), ), diff --git a/lib/widgets/received_image_message.dart b/lib/widgets/received_image_message.dart index 2c0188e4..e3f56350 100644 --- a/lib/widgets/received_image_message.dart +++ b/lib/widgets/received_image_message.dart @@ -111,6 +111,7 @@ String _defaultAwaiting(int bytes, int packets) => /// Text of the R6 label. Private and const: not injectable, not localisable /// yet, and never empty. const String _kSyntheticBadge = 'AI-reconstructed'; + /// The caption is built from the ACTUAL bitstream size, never a nominal one: /// quoting a fixed "~156 bytes" under an image that took 209 is its own small /// dishonesty, in a label whose whole job is honesty. @@ -238,11 +239,7 @@ class _ReceivedImageMessageState extends State { if (png == null) { return _box( context, - _progressBody( - context, - progress: null, - label: _s.decoding, - ), + _progressBody(context, progress: null, label: _s.decoding), ); } return _decodedBody(context, entry, png); @@ -313,7 +310,10 @@ class _ReceivedImageMessageState extends State { label: _s.corrupt, isError: true, action: entry.canRetryDecode - ? _ActionSpec(_s.retry, () => store.requestDecode(entry.streamId)) + ? _ActionSpec( + _s.retry, + () => store.requestDecode(entry.streamId), + ) : null, ), ); @@ -620,7 +620,10 @@ class _ReceivedImageViewer extends StatelessWidget { Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.black, - appBar: AppBar(backgroundColor: Colors.black, foregroundColor: Colors.white), + appBar: AppBar( + backgroundColor: Colors.black, + foregroundColor: Colors.white, + ), body: Center( child: Column( mainAxisSize: MainAxisSize.min, diff --git a/test/image_chunk_transport_test.dart b/test/image_chunk_transport_test.dart index a52d0b97..31645ec3 100644 --- a/test/image_chunk_transport_test.dart +++ b/test/image_chunk_transport_test.dart @@ -6,8 +6,8 @@ import 'package:meshcore_open/services/image_chunk_transport.dart'; import 'package:meshcore_open/widgets/image_send_codec_binding.dart'; Uint8List payloadOf(int length, {int seed = 7}) => Uint8List.fromList( - List.generate(length, (i) => (i * 37 + seed * 11) & 0xFF), - ); + List.generate(length, (i) => (i * 37 + seed * 11) & 0xFF), +); const ImageStreamMetadata stdMeta = ImageStreamMetadata( rate: ImageCodecRatePoint.standard, @@ -447,7 +447,9 @@ void main() { ); expect(r.pendingCount, 1); - final expired = r.evictExpired(now: start.add(const Duration(minutes: 2))); + final expired = r.evictExpired( + now: start.add(const Duration(minutes: 2)), + ); expect(expired.length, 1); expect(expired.single.total, 3); expect(expired.single.receivedDataChunks, 2); @@ -690,7 +692,17 @@ void main() { test('RESP_CODE_CHANNEL_DATA_RECV parses, snr is signed', () { final frame = Uint8List.fromList([ - 0x1B, 0xF8, 0, 0, 3, 0xFF, 0x1C, 0xAE, 2, 0x42, 0x43, + 0x1B, + 0xF8, + 0, + 0, + 3, + 0xFF, + 0x1C, + 0xAE, + 2, + 0x42, + 0x43, ]); final parsed = parseChannelDataFrame(frame)!; expect(parsed.snrRaw, -8); @@ -704,7 +716,15 @@ void main() { test('a flooded frame exposes hop count and hash width', () { final frame = Uint8List.fromList([ - 0x1B, 0x04, 0, 0, 0, 0x43, 0x1C, 0xAE, 0, + 0x1B, + 0x04, + 0, + 0, + 0, + 0x43, + 0x1C, + 0xAE, + 0, ]); final parsed = parseChannelDataFrame(frame)!; expect(parsed.arrivedByFlood, isTrue); @@ -729,50 +749,53 @@ void main() { ); }); - test('transport sends chunks strictly sequentially and reassembles', () async { - final sent = []; - var inFlight = 0; - var maxInFlight = 0; - final received = []; - final rxWithCallback = ImageReassembler( - selfPrefix: senderB, - onImage: received.add, - ); + test( + 'transport sends chunks strictly sequentially and reassembles', + () async { + final sent = []; + var inFlight = 0; + var maxInFlight = 0; + final received = []; + final rxWithCallback = ImageReassembler( + selfPrefix: senderB, + onImage: received.add, + ); - final tx = ImageChunkTransport( - senderPrefix: senderA, - reassembler: rxWithCallback, - idAllocator: ImageIdAllocator(seed: 60), - send: (blob, channelIndex) async { - inFlight++; - maxInFlight = maxInFlight > inFlight ? maxInFlight : inFlight; - await Future.delayed(const Duration(milliseconds: 1)); - sent.add(blob); - inFlight--; - }, - ); + final tx = ImageChunkTransport( + senderPrefix: senderA, + reassembler: rxWithCallback, + idAllocator: ImageIdAllocator(seed: 60), + send: (blob, channelIndex) async { + inFlight++; + maxInFlight = maxInFlight > inFlight ? maxInFlight : inFlight; + await Future.delayed(const Duration(milliseconds: 1)); + sent.add(blob); + inFlight--; + }, + ); - final payload = payloadOf(460, seed: 9); - final set = await tx.sendImage( - payload: payload, - metadata: highMeta, - channelIndex: 1, - ); - expect(set.imgId, 60); - expect(sent.length, 4); - expect(maxInFlight, 1); + final payload = payloadOf(460, seed: 9); + final set = await tx.sendImage( + payload: payload, + metadata: highMeta, + channelIndex: 1, + ); + expect(set.imgId, 60); + expect(sent.length, 4); + expect(maxInFlight, 1); - // Loop the blobs back through the receive path as real frames. - for (final blob in sent) { - final frame = BytesBuilder() - ..add([0x1B, 0x10, 0, 0, 1, 0xFF, 0x1C, 0xAE, blob.length]) - ..add(blob); - tx.handleFrame(frame.toBytes()); - } - expect(received.length, 1); - expect(received.single.data, payload); - expect(received.single.key.channelIndex, 1); - }); + // Loop the blobs back through the receive path as real frames. + for (final blob in sent) { + final frame = BytesBuilder() + ..add([0x1B, 0x10, 0, 0, 1, 0xFF, 0x1C, 0xAE, blob.length]) + ..add(blob); + tx.handleFrame(frame.toBytes()); + } + expect(received.length, 1); + expect(received.single.data, payload); + expect(received.single.key.channelIndex, 1); + }, + ); test('handleFrame ignores other data types and other frames', () { final rx = ImageReassembler(); @@ -805,7 +828,14 @@ void main() { final a = tx.sendImage(payload: payloadOf(300), metadata: stdMeta); final b = tx.sendImage(payload: payloadOf(300), metadata: stdMeta); await Future.wait(>[a, b]); - expect(order, ['100:0', '100:1', '100:2', '101:0', '101:1', '101:2']); + expect(order, [ + '100:0', + '100:1', + '100:2', + '101:0', + '101:1', + '101:2', + ]); }); }); @@ -818,10 +848,7 @@ void main() { test('a new image reusing a just-completed img_id is not swallowed', () { final delivered = []; final failed = []; - final r = ImageReassembler( - onImage: delivered.add, - onFailed: failed.add, - ); + final r = ImageReassembler(onImage: delivered.add, onFailed: failed.add); final first = buildImageChunks( payload: payloadOf(200, seed: 1), @@ -870,38 +897,40 @@ void main() { // PROBE B/C: a flipped bit in the parity length byte used to yield a // silently TRUNCATED image reported as `completed`. Only the last data // chunk may be short. - test('corrupt parity length is rejected rather than silently truncating', - () { - for (final payloadLen in [300, 400]) { - final set = buildImageChunks( - payload: payloadOf(payloadLen, seed: 3), - metadata: stdMeta, - senderPrefix: senderA, - imgId: 7, - ); - final data = set.blobs.sublist(0, set.dataChunkCount); - final parity = Uint8List.fromList(set.blobs.last); - // Corrupt the len_xor byte (first body byte, just after the header). - parity[kImageChunkHeaderBytes] ^= 0x02; + test( + 'corrupt parity length is rejected rather than silently truncating', + () { + for (final payloadLen in [300, 400]) { + final set = buildImageChunks( + payload: payloadOf(payloadLen, seed: 3), + metadata: stdMeta, + senderPrefix: senderA, + imgId: 7, + ); + final data = set.blobs.sublist(0, set.dataChunkCount); + final parity = Uint8List.fromList(set.blobs.last); + // Corrupt the len_xor byte (first body byte, just after the header). + parity[kImageChunkHeaderBytes] ^= 0x02; - final delivered = []; - final r = ImageReassembler(onImage: delivered.add); - // Drop a NON-FINAL chunk (index 1 of >=3, else index 0) and supply - // the corrupted parity. - final dropIndex = data.length >= 3 ? 1 : 0; - final kept = [ - for (var i = 0; i < data.length; i++) - if (i != dropIndex) data[i], - parity, - ]; - feed(r, kept); - expect( - delivered, - isEmpty, - reason: 'payload $payloadLen: truncated recovery must not complete', - ); - } - }); + final delivered = []; + final r = ImageReassembler(onImage: delivered.add); + // Drop a NON-FINAL chunk (index 1 of >=3, else index 0) and supply + // the corrupted parity. + final dropIndex = data.length >= 3 ? 1 : 0; + final kept = [ + for (var i = 0; i < data.length; i++) + if (i != dropIndex) data[i], + parity, + ]; + feed(r, kept); + expect( + delivered, + isEmpty, + reason: 'payload $payloadLen: truncated recovery must not complete', + ); + } + }, + ); test('parity still recovers a genuinely lost non-final chunk', () { final payload = payloadOf(400, seed: 5); @@ -927,17 +956,16 @@ void main() { }); }); - group('completed-image map is capped', () { /// A lone parity chunk of a `total == 1` image completes that image by /// itself — one packet, one remembered entry. That is the amplification the /// cap exists to bound. List loneParity(int imgId) => buildImageChunks( - payload: payloadOf(20, seed: imgId), - metadata: stdMeta, - senderPrefix: senderA, - imgId: imgId, - ).blobs; + payload: payloadOf(20, seed: imgId), + metadata: stdMeta, + senderPrefix: senderA, + imgId: imgId, + ).blobs; test('one packet per img_id can complete an image (the attack)', () { final r = ImageReassembler(); @@ -947,23 +975,26 @@ void main() { expect(r.pendingCount, 0); }); - test('the map never exceeds maxCompletedStreams and evicts oldest first', - () { - final start = DateTime(2026, 3, 3); - final r = ImageReassembler(maxCompletedStreams: 3); - for (var i = 0; i < 20; i++) { - r.addChunk( - loneParity(100 + i)[1], - now: start.add(Duration(seconds: i)), - ); - expect(r.completedCount, lessThanOrEqualTo(3)); - } - expect(r.completedCount, 3); - expect( - r.completedKeys.map((k) => k.imgId).toList()..sort(), - [117, 118, 119], - ); - }); + test( + 'the map never exceeds maxCompletedStreams and evicts oldest first', + () { + final start = DateTime(2026, 3, 3); + final r = ImageReassembler(maxCompletedStreams: 3); + for (var i = 0; i < 20; i++) { + r.addChunk( + loneParity(100 + i)[1], + now: start.add(Duration(seconds: i)), + ); + expect(r.completedCount, lessThanOrEqualTo(3)); + } + expect(r.completedCount, 3); + expect(r.completedKeys.map((k) => k.imgId).toList()..sort(), [ + 117, + 118, + 119, + ]); + }, + ); test('default cap matches the pending cap', () { final start = DateTime(2026, 3, 4); @@ -1010,10 +1041,14 @@ void main() { // conflated, ft32 would go on air as 4. expect(AeicRatePoint.values.length, 5); expect(AeicRatePoint.ft32.wireValue, 4); - expect(aeicRatePointForUi(ImageCodecRatePoint.standard), - AeicRatePoint.ft32); - expect(imageRateWireCode(ImageCodecRatePoint.standard), - kImageRateWireStandard); + expect( + aeicRatePointForUi(ImageCodecRatePoint.standard), + AeicRatePoint.ft32, + ); + expect( + imageRateWireCode(ImageCodecRatePoint.standard), + kImageRateWireStandard, + ); expect(kImageRateWireStandard, 0); expect(kImageRateWireHigh, 1); expect( @@ -1057,7 +1092,10 @@ void main() { final delivered = []; final failures = []; - final r = ImageReassembler(onImage: delivered.add, onFailed: failures.add); + final r = ImageReassembler( + onImage: delivered.add, + onFailed: failures.add, + ); expect(r.addChunk(bad).status, ImageChunkStatus.accepted); final done = r.addChunk(set.blobs[1]); expect(done.status, ImageChunkStatus.unsupportedFormat); @@ -1093,7 +1131,6 @@ void main() { ImageChunkStatus.unsupportedFormat, ); }); - }); group('metadata byte: aspect ratio', () { diff --git a/test/image_wiring_test.dart b/test/image_wiring_test.dart index 5de76b4e..dbcfa90c 100644 --- a/test/image_wiring_test.dart +++ b/test/image_wiring_test.dart @@ -9,80 +9,93 @@ import 'package:meshcore_open/models/image_codec_support.dart'; import 'package:meshcore_open/widgets/image_send_codec_binding.dart'; void main() { - test('ImageStreamReassembler.selfPrefix override suppresses our own echo', () { - final store = ReceivedImageStore(); - final r = ImageStreamReassembler(store: store); - final set = buildImageChunks( - payload: Uint8List.fromList(List.generate(120, (i) => i)), - metadata: const ImageStreamMetadata(rate: ImageCodecRatePoint.standard), - senderPrefix: 0xABCD, - imgId: 7, - ); - // Before SELF_INFO the prefix is unknown, so nothing is suppressed. - expect(r.addChunk(set.blobs[0], channelIndex: 1).status, - ImageChunkStatus.completed); - r.clear(); - // After SELF_INFO the superclass must see the overridden getter. - r.selfPrefix = 0xABCD; - expect(r.addChunk(set.blobs[0], channelIndex: 1).status, - ImageChunkStatus.fromSelf); - }); + test( + 'ImageStreamReassembler.selfPrefix override suppresses our own echo', + () { + final store = ReceivedImageStore(); + final r = ImageStreamReassembler(store: store); + final set = buildImageChunks( + payload: Uint8List.fromList(List.generate(120, (i) => i)), + metadata: const ImageStreamMetadata(rate: ImageCodecRatePoint.standard), + senderPrefix: 0xABCD, + imgId: 7, + ); + // Before SELF_INFO the prefix is unknown, so nothing is suppressed. + expect( + r.addChunk(set.blobs[0], channelIndex: 1).status, + ImageChunkStatus.completed, + ); + r.clear(); + // After SELF_INFO the superclass must see the overridden getter. + r.selfPrefix = 0xABCD; + expect( + r.addChunk(set.blobs[0], channelIndex: 1).status, + ImageChunkStatus.fromSelf, + ); + }, + ); - test('addChunk forwards outcomes to the store with the channel index', - () async { - final store = ReceivedImageStore(); - final r = ImageStreamReassembler(store: store); - final set = buildImageChunks( - payload: Uint8List.fromList(List.generate(400, (i) => i & 0xFF)), - metadata: const ImageStreamMetadata(rate: ImageCodecRatePoint.standard), - senderPrefix: 0x1234, - imgId: 3, - ); - r.addChunk(set.blobs[0], channelIndex: 5); - await store.settle(); - final entry = store.entries.single; - expect(entry.channelIndex, 5); - expect(entry.senderPrefix, 0x1234); - expect(entry.state, ReceivedImageState.receiving); - }); + test( + 'addChunk forwards outcomes to the store with the channel index', + () async { + final store = ReceivedImageStore(); + final r = ImageStreamReassembler(store: store); + final set = buildImageChunks( + payload: Uint8List.fromList(List.generate(400, (i) => i & 0xFF)), + metadata: const ImageStreamMetadata(rate: ImageCodecRatePoint.standard), + senderPrefix: 0x1234, + imgId: 3, + ); + r.addChunk(set.blobs[0], channelIndex: 5); + await store.settle(); + final entry = store.entries.single; + expect(entry.channelIndex, 5); + expect(entry.senderPrefix, 0x1234); + expect(entry.state, ReceivedImageState.receiving); + }, + ); group('AppSettings image codec block', () { - test('round-trips through toJson/fromJson on the ImageCodecPreferences keys', - () { - final settings = AppSettings( - imageCodecEnabled: true, - imageCodecSelectedModelId: 'qdq_conv_pct_novae', - imageCodecModelSourceUrl: 'https://example.invalid/model.onnx', - imageCodecRatePoint: 4, - imageCodecDownloadedModels: [ - ImageCodecModelRecord( - id: 'qdq_conv_pct_novae', - name: 'AEIC ft32 (int8)', - sourceUrl: 'https://example.invalid/model.onnx', - localPath: '/tmp/model.onnx', - downloadedAt: DateTime.fromMillisecondsSinceEpoch(1000), - fileSizeBytes: 872 * 1024 * 1024, - ), - ], - ); - final json = settings.toJson(); - // The keys must be the ones ImageCodecPreferences already used, so a - // build that wrote them through the old standalone store still reads. - expect(json['image_codec_enabled'], isTrue); - expect(json['image_codec_selected_model_id'], 'qdq_conv_pct_novae'); - expect(json['image_codec_rate_point'], 4); + test( + 'round-trips through toJson/fromJson on the ImageCodecPreferences keys', + () { + final settings = AppSettings( + imageCodecEnabled: true, + imageCodecSelectedModelId: 'qdq_conv_pct_novae', + imageCodecModelSourceUrl: 'https://example.invalid/model.onnx', + imageCodecRatePoint: 4, + imageCodecDownloadedModels: [ + ImageCodecModelRecord( + id: 'qdq_conv_pct_novae', + name: 'AEIC ft32 (int8)', + sourceUrl: 'https://example.invalid/model.onnx', + localPath: '/tmp/model.onnx', + downloadedAt: DateTime.fromMillisecondsSinceEpoch(1000), + fileSizeBytes: 872 * 1024 * 1024, + ), + ], + ); + final json = settings.toJson(); + // The keys must be the ones ImageCodecPreferences already used, so a + // build that wrote them through the old standalone store still reads. + expect(json['image_codec_enabled'], isTrue); + expect(json['image_codec_selected_model_id'], 'qdq_conv_pct_novae'); + expect(json['image_codec_rate_point'], 4); - final restored = AppSettings.fromJson(json); - expect(restored.imageCodecEnabled, isTrue); - expect(restored.imageCodecSelectedModelId, 'qdq_conv_pct_novae'); - expect( - restored.imageCodecModelSourceUrl, - 'https://example.invalid/model.onnx', - ); - expect(restored.imageCodecRatePoint, 4); - expect(restored.imageCodecDownloadedModels.single.localPath, - '/tmp/model.onnx'); - }); + final restored = AppSettings.fromJson(json); + expect(restored.imageCodecEnabled, isTrue); + expect(restored.imageCodecSelectedModelId, 'qdq_conv_pct_novae'); + expect( + restored.imageCodecModelSourceUrl, + 'https://example.invalid/model.onnx', + ); + expect(restored.imageCodecRatePoint, 4); + expect( + restored.imageCodecDownloadedModels.single.localPath, + '/tmp/model.onnx', + ); + }, + ); test('defaults are off, ft32, and empty', () { const prefs = ImageCodecPreferences(); diff --git a/test/lora_airtime_test.dart b/test/lora_airtime_test.dart index 52d1e660..80aeb4f4 100644 --- a/test/lora_airtime_test.dart +++ b/test/lora_airtime_test.dart @@ -12,14 +12,13 @@ RadioSettings _radio({ LoRaSpreadingFactor sf = LoRaSpreadingFactor.sf10, LoRaBandwidth bw = LoRaBandwidth.bw250, LoRaCodingRate cr = LoRaCodingRate.cr4_5, -}) => - RadioSettings( - frequencyMHz: 869.525, - bandwidth: bw, - spreadingFactor: sf, - codingRate: cr, - txPowerDbm: 22, - ); +}) => RadioSettings( + frequencyMHz: 869.525, + bandwidth: bw, + spreadingFactor: sf, + codingRate: cr, + txPowerDbm: 22, +); void main() { group('loraTimeOnAir reference values (255-byte packet)', () { @@ -86,16 +85,18 @@ void main() { group('airtime monotonicity / sanity', () { test('longer payload never takes less airtime', () { Duration at(int pl) => loraTimeOnAir( - payloadBytes: pl, - spreadingFactor: 10, - bandwidthHz: 250000, - codingRate: 5, - ); + payloadBytes: pl, + spreadingFactor: 10, + bandwidthHz: 250000, + codingRate: 5, + ); var previous = at(0); for (var pl = 1; pl <= 255; pl++) { final current = at(pl); - expect(current.inMicroseconds, - greaterThanOrEqualTo(previous.inMicroseconds)); + expect( + current.inMicroseconds, + greaterThanOrEqualTo(previous.inMicroseconds), + ); previous = current; } }); @@ -147,10 +148,7 @@ void main() { // the estimator drifting away from the chunker. expect(imageChunkCount(110), 1); expect(imageChunkCount(209), 2); - expect( - imageChunkCount(156), - 156 <= kImageChunkFirstCapacity ? 1 : 2, - ); + expect(imageChunkCount(156), 156 <= kImageChunkFirstCapacity ? 1 : 2); for (final pl in [110, 156, 209]) { expect(imageChunkCount(pl), inInclusiveRange(1, 2)); } @@ -192,14 +190,19 @@ void main() { test('parity adds exactly one packet', () { final radio = _radio(); for (final pl in [110, 209, 288, 409]) { - final without = - estimateSend(payloadBytes: pl, radio: radio, parity: false); + final without = estimateSend( + payloadBytes: pl, + radio: radio, + parity: false, + ); final with_ = estimateSend(payloadBytes: pl, radio: radio); expect(with_.chunkCount, without.chunkCount + 1); expect(without.includesParity, isFalse); expect(with_.includesParity, isTrue); - expect(with_.totalAirtime!.inMicroseconds, - greaterThan(without.totalAirtime!.inMicroseconds)); + expect( + with_.totalAirtime!.inMicroseconds, + greaterThan(without.totalAirtime!.inMicroseconds), + ); } }); @@ -254,15 +257,19 @@ void main() { }); test('total bytes account for chunk headers and metadata', () { - final est = - estimateSend(payloadBytes: 209, radio: _radio(), parity: false); + final est = estimateSend( + payloadBytes: 209, + radio: _radio(), + parity: false, + ); // A data blob is header + body (chunk 0's body opens with the metadata // byte). Only the PARITY blob carries the length byte, and it is always a // full kImageChunkBlobBytes because the XOR body is zero-padded. final sizes = imageChunkPayloadSizes(209); var expected = 0; for (var i = 0; i < sizes.length; i++) { - expected += kImageChunkHeaderBytes + + expected += + kImageChunkHeaderBytes + (i == 0 ? kImageChunkZeroMetadataBytes : 0) + sizes[i]; } @@ -285,7 +292,8 @@ void main() { var expected = 0; for (var i = 0; i < sizes.length; i++) { expected += loraTimeOnAir( - payloadBytes: kImageChunkHeaderBytes + + payloadBytes: + kImageChunkHeaderBytes + (i == 0 ? kImageChunkZeroMetadataBytes : 0) + sizes[i], spreadingFactor: 9, @@ -320,8 +328,11 @@ void main() { group('paced wall clock', () { test('single-packet send has no pacing gap', () { - final est = - estimateSend(payloadBytes: 110, radio: _radio(), parity: false); + final est = estimateSend( + payloadBytes: 110, + radio: _radio(), + parity: false, + ); expect(est.chunkCount, 1); expect(est.pacedWallClock, est.totalAirtime); }); @@ -369,7 +380,8 @@ void main() { expect( imageSendChunkGap(toa), Duration( - microseconds: kImageSendChunkGapBase.inMicroseconds + + microseconds: + kImageSendChunkGapBase.inMicroseconds + (toa.inMicroseconds * kImageSendChunkGapAirtimeFactor).round(), ), ); @@ -446,7 +458,11 @@ void main() { bandwidthHz: 250000, codingRate: 5, ); - expect(est.totalAirtime, isNull, reason: 'sf=$sf must not produce airtime'); + expect( + est.totalAirtime, + isNull, + reason: 'sf=$sf must not produce airtime', + ); } }); @@ -462,9 +478,30 @@ void main() { }); test('areLoRaParamsValid accepts the boundary values', () { - expect(areLoRaParamsValid(spreadingFactor: 5, bandwidthHz: 7800, codingRate: 5), isTrue); - expect(areLoRaParamsValid(spreadingFactor: 12, bandwidthHz: 500000, codingRate: 8), isTrue); - expect(areLoRaParamsValid(spreadingFactor: null, bandwidthHz: 250000, codingRate: 5), isFalse); + expect( + areLoRaParamsValid( + spreadingFactor: 5, + bandwidthHz: 7800, + codingRate: 5, + ), + isTrue, + ); + expect( + areLoRaParamsValid( + spreadingFactor: 12, + bandwidthHz: 500000, + codingRate: 8, + ), + isTrue, + ); + expect( + areLoRaParamsValid( + spreadingFactor: null, + bandwidthHz: 250000, + codingRate: 5, + ), + isFalse, + ); }); }); diff --git a/test/models/image_codec_support_test.dart b/test/models/image_codec_support_test.dart index b5a05fc1..5a9d7cf0 100644 --- a/test/models/image_codec_support_test.dart +++ b/test/models/image_codec_support_test.dart @@ -114,7 +114,10 @@ void main() { // existing role would hand ORT the wrong graph. final restored = ImageCodecModelRecord.fromJson({ 'asset_file_names': ['a.onnx', 'b.bin'], - 'asset_roles': {'a.onnx': 'somethingFromTheFuture', 'b.bin': 'cdfTables'}, + 'asset_roles': { + 'a.onnx': 'somethingFromTheFuture', + 'b.bin': 'cdfTables', + }, }); expect(restored.assetRoles.keys, ['b.bin']); expect(restored.fileNameForRole(ImageCodecAssetRole.cdfTables), 'b.bin'); @@ -357,8 +360,10 @@ void main() { for (final asset in preset.assets) { expect(asset.fileName, isNot(contains('novae'))); } - expect(preset.assetFor(ImageCodecAssetRole.decoderWeights).sizeBytes, - 872896480); + expect( + preset.assetFor(ImageCodecAssetRole.decoderWeights).sizeBytes, + 872896480, + ); }); test('carries all five roles exactly once', () { @@ -400,8 +405,7 @@ void main() { expect(reordered.fileName, preset.fileName); }); - test('the entropy graph and the tables are the ones that were validated', - () { + test('the entropy graph and the tables are the ones that were validated', () { final preset = imageCodecPresetModels.single; final entropy = preset.assetFor(ImageCodecAssetRole.entropyGraph); // op17 fp32: byte-identical bitstreams on 26/26 images. Not op20, not int8. @@ -429,10 +433,7 @@ void main() { ], ); expect(decoderOnly.isComplete, isFalse); - expect( - decoderOnly.maybeAssetFor(ImageCodecAssetRole.cdfTables), - isNull, - ); + expect(decoderOnly.maybeAssetFor(ImageCodecAssetRole.cdfTables), isNull); expect( () => decoderOnly.assetFor(ImageCodecAssetRole.cdfTables), throwsStateError, @@ -483,17 +484,19 @@ void main() { }); group('exceptions', () { - test('an incomplete install is NOT the same failure as a missing build', - () { - // Both are ImageCodecUnimplemented, but only one has a remedy the user - // can act on, and the UI branches on exactly that difference. - const incomplete = ImageCodecBundleIncomplete(); - const missing = ImageCodecEntropyPathMissing(); - expect(incomplete, isA()); - expect(missing, isA()); - expect(incomplete, isNot(isA())); - expect(incomplete.toString(), contains('re-download')); - }); + test( + 'an incomplete install is NOT the same failure as a missing build', + () { + // Both are ImageCodecUnimplemented, but only one has a remedy the user + // can act on, and the UI branches on exactly that difference. + const incomplete = ImageCodecBundleIncomplete(); + const missing = ImageCodecEntropyPathMissing(); + expect(incomplete, isA()); + expect(missing, isA()); + expect(incomplete, isNot(isA())); + expect(incomplete.toString(), contains('re-download')); + }, + ); }); group('parseImageCodecStatus', () { diff --git a/test/services/entropy_tables_test.dart b/test/services/entropy_tables_test.dart index 45b48976..a5633a45 100644 --- a/test/services/entropy_tables_test.dart +++ b/test/services/entropy_tables_test.dart @@ -116,7 +116,8 @@ void main() { }); test('rejects trailing garbage', () { - final Uint8List extra = Uint8List(raw.length + 1)..setRange(0, raw.length, raw); + final Uint8List extra = Uint8List(raw.length + 1) + ..setRange(0, raw.length, raw); expect( () => EntropyTables.parse(extra), throwsA(isA()), diff --git a/test/services/image_codec_boot_payload_test.dart b/test/services/image_codec_boot_payload_test.dart index d88ce3d5..68f77d4b 100644 --- a/test/services/image_codec_boot_payload_test.dart +++ b/test/services/image_codec_boot_payload_test.dart @@ -16,21 +16,19 @@ import 'package:meshcore_open/services/image_codec_session_io.dart'; /// needs to rebuild a bundle that can decode. void main() { ImageCodecBundle fiveAssetBundle() => const ImageCodecBundle( - decoderGraphPath: '/models/aeic_decoder_qdq_conv_pct.onnx', - entropyGraphPath: '/models/aeic_entropy_side_fp32_op17.onnx', - entropyDecodeGraphPath: '/models/aeic_entropy_decode_fp32_op17.onnx', - tablesPath: '/models/aeic_cdf_ft32.bin', - ratePoint: AeicRatePoint.ft32, - ); + decoderGraphPath: '/models/aeic_decoder_qdq_conv_pct.onnx', + entropyGraphPath: '/models/aeic_entropy_side_fp32_op17.onnx', + entropyDecodeGraphPath: '/models/aeic_entropy_decode_fp32_op17.onnx', + tablesPath: '/models/aeic_cdf_ft32.bin', + ratePoint: AeicRatePoint.ft32, + ); group('codec worker boot payload', () { test('a five-asset bundle survives the round trip and can still decode', () { final sent = fiveAssetBundle(); expect(sent.supportsDecode, isTrue, reason: 'precondition'); - final rebuilt = debugBundleFromBootPayload( - debugBootPayloadFor(sent), - ); + final rebuilt = debugBundleFromBootPayload(debugBootPayloadFor(sent)); expect(rebuilt.decoderGraphPath, sent.decoderGraphPath); expect(rebuilt.entropyGraphPath, sent.entropyGraphPath); @@ -56,20 +54,22 @@ void main() { expect(payload[6], '/models/aeic_entropy_decode_fp32_op17.onnx'); }); - test('a send-only bundle rebuilds as send-only rather than half-decoding', - () { - const sendOnly = ImageCodecBundle( - decoderGraphPath: '/models/decoder.onnx', - entropyGraphPath: '/models/entropy.onnx', - tablesPath: '/models/tables.bin', - ratePoint: AeicRatePoint.ft32, - ); - final rebuilt = debugBundleFromBootPayload( - debugBootPayloadFor(sendOnly), - ); - expect(rebuilt.entropyDecodeGraphPath, isNull); - expect(rebuilt.supportsDecode, isFalse); - }); + test( + 'a send-only bundle rebuilds as send-only rather than half-decoding', + () { + const sendOnly = ImageCodecBundle( + decoderGraphPath: '/models/decoder.onnx', + entropyGraphPath: '/models/entropy.onnx', + tablesPath: '/models/tables.bin', + ratePoint: AeicRatePoint.ft32, + ); + final rebuilt = debugBundleFromBootPayload( + debugBootPayloadFor(sendOnly), + ); + expect(rebuilt.entropyDecodeGraphPath, isNull); + expect(rebuilt.supportsDecode, isFalse); + }, + ); test('a short payload does not crash the worker', () { // An older sender, or a truncated message, must degrade to "cannot diff --git a/test/services/image_codec_download_test.dart b/test/services/image_codec_download_test.dart index 17e365e4..babe08e3 100644 --- a/test/services/image_codec_download_test.dart +++ b/test/services/image_codec_download_test.dart @@ -250,10 +250,7 @@ void main() { expect(await graph.readAsBytes(), small); expect(await weights.length(), large.length); expect(_sha256(await weights.readAsBytes()), _sha256(large)); - expect( - await File('${tempDir.path}/entropy.onnx').readAsBytes(), - entropy, - ); + expect(await File('${tempDir.path}/entropy.onnx').readAsBytes(), entropy); // Two different entropy exports land side by side; neither may overwrite // or be mistaken for the other. expect( diff --git a/test/services/image_codec_e2e_test.dart b/test/services/image_codec_e2e_test.dart index 78258a10..54252e24 100644 --- a/test/services/image_codec_e2e_test.dart +++ b/test/services/image_codec_e2e_test.dart @@ -121,45 +121,49 @@ void main() { } }); - test('ENCODE: Dart bitstream is byte-identical to the C++ bitstream', - () async { - final _ReplayNetwork network = _ReplayNetwork(r); - final AeicEntropyCodec codec = AeicEntropyCodec( - geometry: geometry, - network: network, - coders: coders, - ); - final Uint8List got = await codec.encode( - Uint8List(geometry.resolution * geometry.resolution * 3), - ); - expect(network.encodeCalls, 1); - _expectSameBytes(got, r.u8('enc/bitstream'), name); - expect( - sha256.convert(got).toString(), - r.meta['bitstream_sha256'], - reason: '$name: bitstream sha256', - ); - }); + test( + 'ENCODE: Dart bitstream is byte-identical to the C++ bitstream', + () async { + final _ReplayNetwork network = _ReplayNetwork(r); + final AeicEntropyCodec codec = AeicEntropyCodec( + geometry: geometry, + network: network, + coders: coders, + ); + final Uint8List got = await codec.encode( + Uint8List(geometry.resolution * geometry.resolution * 3), + ); + expect(network.encodeCalls, 1); + _expectSameBytes(got, r.u8('enc/bitstream'), name); + expect( + sha256.convert(got).toString(), + r.meta['bitstream_sha256'], + reason: '$name: bitstream sha256', + ); + }, + ); - test('DECODE: y_hat from the C++ bitstream is exactly the recorded y_hat', - () async { - final _ReplayNetwork network = _ReplayNetwork(r); - final AeicEntropyCodec codec = AeicEntropyCodec( - geometry: geometry, - network: network, - coders: coders, - ); - final Float32List got = await codec.decodeToLatent( - r.u8('enc/bitstream'), - ); - expect(network.hyperCalls, 1); - expect(network.stageCalls, [0, 1, 2, 3]); - _expectSameFloats(got, r.f32('dec/y_hat'), '$name: y_hat'); - // The recording asserts the decoder's latent equals the encoder's; if - // that holds in Python it must hold here too. - expect(r.meta['decoded_y_hat_equals_encoder_y_hat'], isTrue); - _expectSameFloats(got, r.f32('enc/y_hat'), '$name: y_hat vs encoder'); - }); + test( + 'DECODE: y_hat from the C++ bitstream is exactly the recorded y_hat', + () async { + final _ReplayNetwork network = _ReplayNetwork(r); + final AeicEntropyCodec codec = AeicEntropyCodec( + geometry: geometry, + network: network, + coders: coders, + ); + final Float32List got = await codec.decodeToLatent( + r.u8('enc/bitstream'), + ); + expect(network.hyperCalls, 1); + expect(network.stageCalls, [0, 1, 2, 3]); + _expectSameFloats(got, r.f32('dec/y_hat'), '$name: y_hat'); + // The recording asserts the decoder's latent equals the encoder's; if + // that holds in Python it must hold here too. + expect(r.meta['decoded_y_hat_equals_encoder_y_hat'], isTrue); + _expectSameFloats(got, r.f32('enc/y_hat'), '$name: y_hat vs encoder'); + }, + ); test('a single flipped bitstream byte does not still pass', () async { // Byte 3 is the first payload byte of sub-stream 0 (1-byte flag + @@ -185,7 +189,8 @@ void main() { expect( _sameFloats(got, r.f32('dec/y_hat')), isFalse, - reason: '$name: corrupting the stream changed nothing — the ' + reason: + '$name: corrupting the stream changed nothing — the ' 'comparison is vacuous', ); }); @@ -253,7 +258,8 @@ class _ReplayNetwork implements AeicEntropyNetwork { 'stage $stage input base', ); } - final Map outputs = call['outputs'] as Map; + final Map outputs = + call['outputs'] as Map; return AeicStageParams( meansSupp: r.f32(outputs['means'] as String), scalesSupp: r.f32(outputs['scales'] as String), @@ -265,12 +271,11 @@ class _ReplayNetwork implements AeicEntropyNetwork { /// 32-byte header, an 8-byte-aligned tensor blob, then a UTF-8 JSON index. class _Recording { _Recording(this.index, this.bytes) - : _entries = >{ - for (final Map e - in (index['entries'] as List) - .cast>()) - e['name'] as String: e, - }; + : _entries = >{ + for (final Map e + in (index['entries'] as List).cast>()) + e['name'] as String: e, + }; final Map index; final Uint8List bytes; @@ -291,7 +296,9 @@ class _Recording { final int indexLength = bd.getUint32(24, Endian.little); final Map index = jsonDecode( - utf8.decode(bytes.sublist(indexOffset, indexOffset + indexLength)), + utf8.decode( + bytes.sublist(indexOffset, indexOffset + indexLength), + ), ) as Map; return _Recording(index, bytes); diff --git a/test/services/image_codec_entropy_test.dart b/test/services/image_codec_entropy_test.dart index 254c6c0d..2038f9ff 100644 --- a/test/services/image_codec_entropy_test.dart +++ b/test/services/image_codec_entropy_test.dart @@ -40,25 +40,281 @@ class _Golden { ]; static const List> symbols = >[ - [-1, -1, -2, 4, 0, 0, 6, -3, 2, 1, 1, -1, -5, 1, 0, 0, -1, -1, -2, 4, - 0, 0, 5, -3, 2, 1, 1, -1, -5, 1, 0, 0], - [-1, -1, 4, 4, 0, 0, 0, 5, 2, 1, -1, -1, 3, -5, 1, 0, -1, -2, 4, 4, - 0, 0, 0, 5, 1, 1, -1, -1, 3, -5, 1, 0], - [-1, -2, -2, 4, 1, 0, 0, 5, 2, 0, -1, -1, 3, -5, 1, 0, -1, -2, -2, 4, - 0, 0, 0, 5, 2, -1, -1, -1, 3, -5, 1, 0], - [-1, -1, -2, -2, 0, 0, 5, -3, 2, 1, -1, -1, -5, -5, 0, 0, -1, -1, -2, - -2, 0, 0, 5, -3, 2, 1, -1, -1, -5, 1, 0, 0], + [ + -1, + -1, + -2, + 4, + 0, + 0, + 6, + -3, + 2, + 1, + 1, + -1, + -5, + 1, + 0, + 0, + -1, + -1, + -2, + 4, + 0, + 0, + 5, + -3, + 2, + 1, + 1, + -1, + -5, + 1, + 0, + 0, + ], + [ + -1, + -1, + 4, + 4, + 0, + 0, + 0, + 5, + 2, + 1, + -1, + -1, + 3, + -5, + 1, + 0, + -1, + -2, + 4, + 4, + 0, + 0, + 0, + 5, + 1, + 1, + -1, + -1, + 3, + -5, + 1, + 0, + ], + [ + -1, + -2, + -2, + 4, + 1, + 0, + 0, + 5, + 2, + 0, + -1, + -1, + 3, + -5, + 1, + 0, + -1, + -2, + -2, + 4, + 0, + 0, + 0, + 5, + 2, + -1, + -1, + -1, + 3, + -5, + 1, + 0, + ], + [ + -1, + -1, + -2, + -2, + 0, + 0, + 5, + -3, + 2, + 1, + -1, + -1, + -5, + -5, + 0, + 0, + -1, + -1, + -2, + -2, + 0, + 0, + 5, + -3, + 2, + 1, + -1, + -1, + -5, + 1, + 0, + 0, + ], ]; static const List> indexes = >[ - [-1, 6, -1, 8, 12, 15, 13, 16, 0, 9, 3, 10, 13, 16, 14, 17, 0, 9, 3, - 10, 13, 16, 14, 17, 5, 11, 7, 12, 15, 17, 15, 18], - [14, 11, 15, 12, 7, 0, 8, 2, 15, 13, 16, 14, 9, 4, 11, 6, 15, 13, 16, - 14, 10, 4, 11, 6, 16, 14, 17, 15, 11, 7, 12, 9], - [11, 14, 12, 15, -1, 8, 0, 9, 12, 16, 13, 16, 2, 10, 5, 11, 13, 16, - 13, 16, 3, 10, 5, 11, 14, 17, 15, 17, 7, 12, 8, 13], - [5, -1, 7, 0, 15, 12, 15, 13, 8, 1, 10, 4, 16, 14, 16, 14, 8, 2, 10, - 4, 16, 14, 16, 14, 11, 6, 12, 8, 17, 15, 17, 16], + [ + -1, + 6, + -1, + 8, + 12, + 15, + 13, + 16, + 0, + 9, + 3, + 10, + 13, + 16, + 14, + 17, + 0, + 9, + 3, + 10, + 13, + 16, + 14, + 17, + 5, + 11, + 7, + 12, + 15, + 17, + 15, + 18, + ], + [ + 14, + 11, + 15, + 12, + 7, + 0, + 8, + 2, + 15, + 13, + 16, + 14, + 9, + 4, + 11, + 6, + 15, + 13, + 16, + 14, + 10, + 4, + 11, + 6, + 16, + 14, + 17, + 15, + 11, + 7, + 12, + 9, + ], + [ + 11, + 14, + 12, + 15, + -1, + 8, + 0, + 9, + 12, + 16, + 13, + 16, + 2, + 10, + 5, + 11, + 13, + 16, + 13, + 16, + 3, + 10, + 5, + 11, + 14, + 17, + 15, + 17, + 7, + 12, + 8, + 13, + ], + [ + 5, + -1, + 7, + 0, + 15, + 12, + 15, + 13, + 8, + 1, + 10, + 4, + 16, + 14, + 16, + 14, + 8, + 2, + 10, + 4, + 16, + 14, + 16, + 14, + 11, + 6, + 12, + 8, + 17, + 15, + 17, + 16, + ], ]; // --- full case: C = 256, H = W = 16 (the shipping geometry) --- @@ -113,7 +369,21 @@ class _Golden { 10000.0, ]; static const List probeIndexes = [ - -1, -1, -1, -1, 0, 0, 0, 12, 17, 23, 34, 51, 62, 63, 63, + -1, + -1, + -1, + -1, + 0, + 0, + 0, + 12, + 17, + 23, + 34, + 51, + 62, + 63, + 63, ]; } @@ -220,10 +490,7 @@ void main() { final geometry = AeicEntropyGeometry.forResolution(512); final masks = AeicMaskSet(geometry); for (var stage = 0; stage < 4; stage++) { - final live = masks - .maskTensor(stage) - .where((v) => v == 1.0) - .length; + final live = masks.maskTensor(stage).where((v) => v == 1.0).length; expect(live, geometry.symbolsPerStage); } }); @@ -401,34 +668,37 @@ void main() { }); group('AeicEntropyCodec', () { - test('encode pushes z, y0, y1, y2, y3 in that order and no other', () async { - final geometry = AeicEntropyGeometry.forResolution(512); - final network = _FakeNetwork(geometry); - final coders = _RecordingCoders(); - final codec = AeicEntropyCodec( - geometry: geometry, - network: network, - coders: coders, - ); - final progress = []; - final stream = await codec.encode( - Uint8List(512 * 512 * 3), - onProgress: progress.add, - ); + test( + 'encode pushes z, y0, y1, y2, y3 in that order and no other', + () async { + final geometry = AeicEntropyGeometry.forResolution(512); + final network = _FakeNetwork(geometry); + final coders = _RecordingCoders(); + final codec = AeicEntropyCodec( + geometry: geometry, + network: network, + coders: coders, + ); + final progress = []; + final stream = await codec.encode( + Uint8List(512 * 512 * 3), + onProgress: progress.add, + ); - expect(coders.encoder.groups, [ - kAeicZCdfGroup, - kAeicYCdfGroup, - kAeicYCdfGroup, - kAeicYCdfGroup, - kAeicYCdfGroup, - ]); - expect(coders.encoder.lengths, [2048, 16384, 16384, 16384, 16384]); - expect(stream, isNotEmpty); - expect(progress.last, 1.0); - // The image really was normalized before the graph saw it: 0 -> -1. - expect(network.lastInput!.first, -1.0); - }); + expect(coders.encoder.groups, [ + kAeicZCdfGroup, + kAeicYCdfGroup, + kAeicYCdfGroup, + kAeicYCdfGroup, + kAeicYCdfGroup, + ]); + expect(coders.encoder.lengths, [2048, 16384, 16384, 16384, 16384]); + expect(stream, isNotEmpty); + expect(progress.last, 1.0); + // The image really was normalized before the graph saw it: 0 -> -1. + expect(network.lastInput!.first, -1.0); + }, + ); test('encode refuses a graph that returns the wrong z size', () async { final geometry = AeicEntropyGeometry.forResolution(512); @@ -697,7 +967,8 @@ class _FakeNetwork implements AeicEntropyNetwork { ], scales: [ for (var i = 0; i < 4; i++) - Float32List(geometry.yElements)..fillRange(0, geometry.yElements, 1.0), + Float32List(geometry.yElements) + ..fillRange(0, geometry.yElements, 1.0), ], ); } diff --git a/test/services/rans_coder_test.dart b/test/services/rans_coder_test.dart index dff1c68b..3f921d00 100644 --- a/test/services/rans_coder_test.dart +++ b/test/services/rans_coder_test.dart @@ -20,8 +20,8 @@ void main() { final Map manifest = jsonDecode(File('${goldenDir.path}/manifest.json').readAsStringSync()) as Map; - final List> images = (manifest['images'] as List) - .cast>(); + final List> images = + (manifest['images'] as List).cast>(); final List> synthetic = (manifest['synthetic'] as List).cast>(); diff --git a/test/services/received_image_store_test.dart b/test/services/received_image_store_test.dart index 46c31943..20a7e96a 100644 --- a/test/services/received_image_store_test.dart +++ b/test/services/received_image_store_test.dart @@ -59,7 +59,10 @@ class _FakeDecoder implements ReceivedImageDecoder { } } - Future _run(AeicRatePoint ratePoint, int resolution) async { + Future _run( + AeicRatePoint ratePoint, + int resolution, + ) async { if (delay > Duration.zero) await Future.delayed(delay); switch (mode) { case 'null': @@ -149,7 +152,11 @@ void main() { imgId: 7, firstSeen: DateTime.fromMillisecondsSinceEpoch(0x693F21 * 1000), ); - expect(id, '1a2b07' '00693f21'); + expect( + id, + '1a2b07' + '00693f21', + ); expect(id.length, 14); expect(ReceivedImageRef.parse(ReceivedImageRef.encode(id)), id); }); @@ -161,8 +168,10 @@ void main() { expect(ReceivedImageRef.parse('aeic:1:1A2B0700693F21'), isNull); expect(ReceivedImageRef.parse('aeic:2:1a2b0700693f21'), isNull); expect(ReceivedImageRef.parse('@[Bob] hi'), isNull); - expect(ReceivedImageRef.parse(' aeic:1:1a2b0700693f21 '), - '1a2b0700693f21'); + expect( + ReceivedImageRef.parse(' aeic:1:1a2b0700693f21 '), + '1a2b0700693f21', + ); }); }); @@ -184,8 +193,11 @@ void main() { expect(entry!.state, ReceivedImageState.reassembled); expect(entry.rate, AeicRatePoint.ft32); expect(entry.metadataAssumed, isFalse); - expect(h.blobs.hasBitstream(entry.streamId), isTrue, - reason: 'bitstream must be written before the state changes'); + expect( + h.blobs.hasBitstream(entry.streamId), + isTrue, + reason: 'bitstream must be written before the state changes', + ); await h.store.settle(); final decoded = h.store.entryFor(entry.streamId)!; @@ -218,8 +230,11 @@ void main() { h.reassembler.addChunk(set.blobs[1], channelIndex: 3), channelIndex: 3, ); - expect(second!.streamId, first.streamId, - reason: 'the sentinel must not change as chunks arrive'); + expect( + second!.streamId, + first.streamId, + reason: 'the sentinel must not change as chunks arrive', + ); expect(second.state, ReceivedImageState.reassembled); await h.store.settle(); expect( @@ -300,8 +315,10 @@ void main() { expect(entry!.state, ReceivedImageState.reassembled); expect(entry.recoveredWithParity, isTrue); await h.store.settle(); - expect(h.store.entryFor(entry.streamId)!.state, - ReceivedImageState.decoded); + expect( + h.store.entryFor(entry.streamId)!.state, + ReceivedImageState.decoded, + ); }); test('loopback and malformed blobs create nothing', () async { @@ -574,37 +591,42 @@ void main() { }); group('eviction', () { - test('byte budget drops the oldest PNG first and keeps the bitstream', - () async { - final decoder = _FakeDecoder( - png: Uint8List.fromList(List.filled(1000, 3)), - ); - final h = _build(decoder: decoder, maxBytes: 2500); - final ids = []; - for (var i = 0; i < 3; i++) { - final entry = await _completeOne(h, imgId: 40 + i, seed: i); - await h.store.settle(); - ids.add(entry.streamId); - h.advance(const Duration(seconds: 5)); - } - // 3 x 1000 B PNG > 2500 B, so the oldest PNG must have gone. - expect(h.store.entryFor(ids[0])!.state, ReceivedImageState.evicted); - expect(h.store.entryFor(ids[0])!.pngStored, isFalse); - expect(h.blobs.hasPng(ids[0]), isFalse); - expect(h.blobs.hasBitstream(ids[0]), isTrue, - reason: 'a ~156 B bitstream is cheap; keep it so we can re-decode'); - expect(h.store.entryFor(ids[0])!.canRetryDecode, isTrue); - expect(h.store.entryFor(ids[2])!.state, ReceivedImageState.decoded); - expect(h.store.totalBytes, lessThanOrEqualTo(2500)); + test( + 'byte budget drops the oldest PNG first and keeps the bitstream', + () async { + final decoder = _FakeDecoder( + png: Uint8List.fromList(List.filled(1000, 3)), + ); + final h = _build(decoder: decoder, maxBytes: 2500); + final ids = []; + for (var i = 0; i < 3; i++) { + final entry = await _completeOne(h, imgId: 40 + i, seed: i); + await h.store.settle(); + ids.add(entry.streamId); + h.advance(const Duration(seconds: 5)); + } + // 3 x 1000 B PNG > 2500 B, so the oldest PNG must have gone. + expect(h.store.entryFor(ids[0])!.state, ReceivedImageState.evicted); + expect(h.store.entryFor(ids[0])!.pngStored, isFalse); + expect(h.blobs.hasPng(ids[0]), isFalse); + expect( + h.blobs.hasBitstream(ids[0]), + isTrue, + reason: 'a ~156 B bitstream is cheap; keep it so we can re-decode', + ); + expect(h.store.entryFor(ids[0])!.canRetryDecode, isTrue); + expect(h.store.entryFor(ids[2])!.state, ReceivedImageState.decoded); + expect(h.store.totalBytes, lessThanOrEqualTo(2500)); - // "Decode again" works off the surviving bitstream, and the image we just - // decoded is never the budget's own victim (that would thrash forever). - await h.store.requestDecode(ids[0]); - await h.store.settle(); - expect(h.store.entryFor(ids[0])!.state, ReceivedImageState.decoded); - expect(h.store.entryFor(ids[1])!.state, ReceivedImageState.evicted); - expect(h.store.totalBytes, lessThanOrEqualTo(2500)); - }); + // "Decode again" works off the surviving bitstream, and the image we just + // decoded is never the budget's own victim (that would thrash forever). + await h.store.requestDecode(ids[0]); + await h.store.settle(); + expect(h.store.entryFor(ids[0])!.state, ReceivedImageState.decoded); + expect(h.store.entryFor(ids[1])!.state, ReceivedImageState.evicted); + expect(h.store.totalBytes, lessThanOrEqualTo(2500)); + }, + ); test('image-count budget evicts oldest first', () async { final h = _build(maxImages: 2); @@ -625,8 +647,10 @@ void main() { final h = _build(maxAge: const Duration(minutes: 10)); final entry = await _completeOne(h); await h.store.settle(); - expect(h.store.entryFor(entry.streamId)!.state, - ReceivedImageState.decoded); + expect( + h.store.entryFor(entry.streamId)!.state, + ReceivedImageState.decoded, + ); h.advance(const Duration(minutes: 11)); final evicted = await h.store.evictToBudget(); expect(evicted, contains(entry.streamId)); @@ -762,8 +786,11 @@ void main() { expect(entry.state, ReceivedImageState.reassembled); expect(entry.needsManualDecode, isTrue); expect(h.store.decodeQueue, isEmpty); - expect(h.decoder.calls, 0, - reason: 'a radio packet must never start a 2.16 GiB decode by itself'); + expect( + h.decoder.calls, + 0, + reason: 'a radio packet must never start a 2.16 GiB decode by itself', + ); // Everything the placeholder card needs is already on the entry. expect(entry.senderPrefix, kSender); expect(entry.bitstreamByteCount, greaterThan(0)); @@ -779,28 +806,30 @@ void main() { expect(h.decoder.calls, 1); }); - test('a finished model download does not decode the whole backlog', - () async { - final decoder = _FakeDecoder( - availability: ImageCodecAvailability.disabled, - ); - final h = _build(decoder: decoder, processAutomatically: false); - final ids = []; - for (var i = 0; i < 4; i++) { - ids.add((await _completeOne(h, imgId: 80 + i, seed: i)).streamId); - h.advance(const Duration(seconds: 2)); - } - // The model lands. - decoder.availability = ImageCodecAvailability.ready; - h.store.notifyDecoderChanged(); - await h.store.settle(); - expect(decoder.calls, 0); - expect(h.store.decodeQueue, isEmpty); - for (final id in ids) { - expect(h.store.entryFor(id)!.state, ReceivedImageState.reassembled); - expect(h.store.entryFor(id)!.needsManualDecode, isTrue); - } - }); + test( + 'a finished model download does not decode the whole backlog', + () async { + final decoder = _FakeDecoder( + availability: ImageCodecAvailability.disabled, + ); + final h = _build(decoder: decoder, processAutomatically: false); + final ids = []; + for (var i = 0; i < 4; i++) { + ids.add((await _completeOne(h, imgId: 80 + i, seed: i)).streamId); + h.advance(const Duration(seconds: 2)); + } + // The model lands. + decoder.availability = ImageCodecAvailability.ready; + h.store.notifyDecoderChanged(); + await h.store.settle(); + expect(decoder.calls, 0); + expect(h.store.decodeQueue, isEmpty); + for (final id in ids) { + expect(h.store.entryFor(id)!.state, ReceivedImageState.reassembled); + expect(h.store.entryFor(id)!.needsManualDecode, isTrue); + } + }, + ); test('turning the setting on affects future arrivals only', () async { final h = _build(processAutomatically: false); @@ -810,15 +839,21 @@ void main() { h.store.processAutomatically = true; await h.store.settle(); expect(h.decoder.calls, 0, reason: 'no retro-decode of the backlog'); - expect(h.store.entryFor(parked.streamId)!.state, - ReceivedImageState.reassembled); + expect( + h.store.entryFor(parked.streamId)!.state, + ReceivedImageState.reassembled, + ); final fresh = await _completeOne(h, imgId: 91, seed: 5); await h.store.settle(); - expect(h.store.entryFor(fresh.streamId)!.state, - ReceivedImageState.decoded); - expect(h.store.entryFor(parked.streamId)!.state, - ReceivedImageState.reassembled); + expect( + h.store.entryFor(fresh.streamId)!.state, + ReceivedImageState.decoded, + ); + expect( + h.store.entryFor(parked.streamId)!.state, + ReceivedImageState.reassembled, + ); }); test('a reassembled entry restored from disk is always tappable', () async { @@ -849,10 +884,7 @@ void main() { h.decoder.availability = ImageCodecAvailability.disabled; expect(h.store.decoderAvailability, ImageCodecAvailability.disabled); final noDecoder = ReceivedImageStore(decoder: null); - expect( - noDecoder.decoderAvailability, - ImageCodecAvailability.unavailable, - ); + expect(noDecoder.decoderAvailability, ImageCodecAvailability.unavailable); noDecoder.dispose(); }); }); @@ -874,8 +906,11 @@ void main() { await h.store.settle(); expect(decoder.calls, 10); - expect(decoder.maxConcurrent, 1, - reason: 'two concurrent decodes is ~4.3 GiB and an OOM kill'); + expect( + decoder.maxConcurrent, + 1, + reason: 'two concurrent decodes is ~4.3 GiB and an OOM kill', + ); for (final id in ids) { expect(h.store.entryFor(id)!.state, ReceivedImageState.decoded); } @@ -895,33 +930,35 @@ void main() { }); group('deletion hooks', () { - test('deleteImagesForChannel reclaims every image of one conversation', - () async { - final h = _build(); - final a = await _completeOne(h, imgId: 130); - h.advance(const Duration(seconds: 2)); - final b = await _completeOne(h, imgId: 131, seed: 1); - await h.store.settle(); - // A third image on another channel must survive. - final other = await h.store.registerOutgoing( - channelIndex: 9, - senderPrefix: kSelf, - imgId: 5, - previewPng: Uint8List.fromList(List.filled(32, 2)), - rate: AeicRatePoint.ft32, - chunkCount: 1, - ); + test( + 'deleteImagesForChannel reclaims every image of one conversation', + () async { + final h = _build(); + final a = await _completeOne(h, imgId: 130); + h.advance(const Duration(seconds: 2)); + final b = await _completeOne(h, imgId: 131, seed: 1); + await h.store.settle(); + // A third image on another channel must survive. + final other = await h.store.registerOutgoing( + channelIndex: 9, + senderPrefix: kSelf, + imgId: 5, + previewPng: Uint8List.fromList(List.filled(32, 2)), + rate: AeicRatePoint.ft32, + chunkCount: 1, + ); - final removed = await h.store.deleteImagesForChannel(3); - expect(removed, containsAll([a.streamId, b.streamId])); - expect(h.store.entryFor(a.streamId), isNull); - expect(h.store.entryFor(b.streamId), isNull); - expect(h.blobs.hasPng(a.streamId), isFalse); - expect(h.blobs.hasBitstream(a.streamId), isFalse); - expect(h.blobs.hasSidecar(a.streamId), isFalse); - expect(h.store.entryFor(other.streamId), isNotNull); - expect(h.store.totalBytes, other.storedBytes); - }); + final removed = await h.store.deleteImagesForChannel(3); + expect(removed, containsAll([a.streamId, b.streamId])); + expect(h.store.entryFor(a.streamId), isNull); + expect(h.store.entryFor(b.streamId), isNull); + expect(h.blobs.hasPng(a.streamId), isFalse); + expect(h.blobs.hasBitstream(a.streamId), isFalse); + expect(h.blobs.hasSidecar(a.streamId), isFalse); + expect(h.store.entryFor(other.streamId), isNotNull); + expect(h.store.totalBytes, other.storedBytes); + }, + ); test('deleteImageForSentinel takes the message text', () async { final h = _build(); @@ -950,9 +987,8 @@ void main() { } }); - FileReceivedImageBlobStore newStore() => FileReceivedImageBlobStore( - baseDirectory: () async => tempDir, - ); + FileReceivedImageBlobStore newStore() => + FileReceivedImageBlobStore(baseDirectory: () async => tempDir); test('round-trips bytes and sidecars through real files', () async { final blobs = newStore(); @@ -964,7 +1000,9 @@ void main() { expect(await blobs.readPng('1a2b0700693f21'), _payload(4096, 3)); expect(await blobs.bitstreamSize('1a2b0700693f21'), 155); expect(await blobs.pngSize('1a2b0700693f21'), 4096); - expect(await blobs.readSidecars(), {'1a2b0700693f21': '{"streamId":"x"}'}); + expect(await blobs.readSidecars(), { + '1a2b0700693f21': '{"streamId":"x"}', + }); expect(blobs.pngPath('1a2b0700693f21'), endsWith('1a2b0700693f21.png')); expect(File(blobs.pngPath('1a2b0700693f21')!).existsSync(), isTrue); @@ -1044,8 +1082,10 @@ void main() { at: now, ); await store.settle(); - expect(store.entryFor(entry!.streamId)!.state, - ReceivedImageState.decoded); + expect( + store.entryFor(entry!.streamId)!.state, + ReceivedImageState.decoded, + ); store.dispose(); final reborn = ReceivedImageStore( @@ -1055,8 +1095,11 @@ void main() { ); await reborn.load(); final loaded = reborn.entryFor(entry.streamId); - expect(loaded, isNotNull, - reason: 'the whole point: images outlive the process'); + expect( + loaded, + isNotNull, + reason: 'the whole point: images outlive the process', + ); expect(loaded!.state, ReceivedImageState.decoded); expect(loaded.pngStored, isTrue); expect(loaded.pngBytes, isNull, reason: 'pixels are read lazily'); @@ -1098,33 +1141,35 @@ void main() { }); }); - test('listeners fire for the message list and for the single bubble', - () async { - final h = _build(); - var storeNotifications = 0; - h.store.addListener(() => storeNotifications++); - final set = buildImageChunks( - payload: _payload(kImageChunkFirstCapacity + 1), - metadata: const ImageStreamMetadata(rate: ImageCodecRatePoint.standard), - senderPrefix: kSender, - imgId: 77, - ); - final first = await h.store.handleOutcome( - h.reassembler.addChunk(set.blobs[0], channelIndex: 3), - channelIndex: 3, - ); - final listenable = h.store.listenableFor(first!.streamId); - var bubbleNotifications = 0; - listenable.addListener(() => bubbleNotifications++); - await h.store.handleOutcome( - h.reassembler.addChunk(set.blobs[1], channelIndex: 3), - channelIndex: 3, - ); - await h.store.settle(); - expect(storeNotifications, greaterThan(1)); - expect(bubbleNotifications, greaterThan(1)); - expect(listenable.value!.state, ReceivedImageState.decoded); - }); + test( + 'listeners fire for the message list and for the single bubble', + () async { + final h = _build(); + var storeNotifications = 0; + h.store.addListener(() => storeNotifications++); + final set = buildImageChunks( + payload: _payload(kImageChunkFirstCapacity + 1), + metadata: const ImageStreamMetadata(rate: ImageCodecRatePoint.standard), + senderPrefix: kSender, + imgId: 77, + ); + final first = await h.store.handleOutcome( + h.reassembler.addChunk(set.blobs[0], channelIndex: 3), + channelIndex: 3, + ); + final listenable = h.store.listenableFor(first!.streamId); + var bubbleNotifications = 0; + listenable.addListener(() => bubbleNotifications++); + await h.store.handleOutcome( + h.reassembler.addChunk(set.blobs[1], channelIndex: 3), + channelIndex: 3, + ); + await h.store.settle(); + expect(storeNotifications, greaterThan(1)); + expect(bubbleNotifications, greaterThan(1)); + expect(listenable.value!.state, ReceivedImageState.decoded); + }, + ); } /// Delivers a whole single-chunk image and returns its entry (state diff --git a/test/widgets/image_send_preview_sheet_test.dart b/test/widgets/image_send_preview_sheet_test.dart index e50ec8ac..749690b4 100644 --- a/test/widgets/image_send_preview_sheet_test.dart +++ b/test/widgets/image_send_preview_sheet_test.dart @@ -83,8 +83,9 @@ List _texts(WidgetTester tester) => tester .toList(); void main() { - testWidgets('renders with a fake codec and shows the image preview', - (tester) async { + testWidgets('renders with a fake codec and shows the image preview', ( + tester, + ) async { await _openSheet(tester, radio: _knownRadio); expect(find.byType(ImageSendPreviewSheet), findsOneWidget); @@ -94,8 +95,9 @@ void main() { expect(send.onPressed, isNotNull); }); - testWidgets('shows the packet count for the encoded ft32 payload', - (tester) async { + testWidgets('shows the packet count for the encoded ft32 payload', ( + tester, + ) async { await _openSheet(tester, radio: _knownRadio); // FakeImageSendCodec emits the measured ft32 mean (156 B) -> one data chunk, @@ -110,8 +112,9 @@ void main() { expect(_texts(tester), contains('${expected.chunkCount}')); }); - testWidgets('shows a concrete airtime when the radio settings are known', - (tester) async { + testWidgets('shows a concrete airtime when the radio settings are known', ( + tester, + ) async { await _openSheet(tester, radio: _knownRadio); final texts = _texts(tester); @@ -128,8 +131,9 @@ void main() { ); }); - testWidgets('headline time is the paced wall clock, not raw airtime', - (tester) async { + testWidgets('headline time is the paced wall clock, not raw airtime', ( + tester, + ) async { await _openSheet(tester, radio: _knownRadio); final expected = estimateSendFromRadioParams( @@ -154,8 +158,9 @@ void main() { expect(texts, isNot(contains('${seconds(expected.totalAirtime!)} s'))); }); - testWidgets('renders "unknown" airtime when the radio params are absent', - (tester) async { + testWidgets('renders "unknown" airtime when the radio params are absent', ( + tester, + ) async { await _openSheet(tester, radio: _unknownRadio); final texts = _texts(tester); @@ -223,8 +228,9 @@ void main() { expect(find.byType(ImageSendPreviewSheet), findsNothing); }); - testWidgets('confirming returns the payload, packet count and both times', - (tester) async { + testWidgets('confirming returns the payload, packet count and both times', ( + tester, + ) async { ImageSendPreviewResult? result; await tester.pumpWidget( @@ -270,8 +276,9 @@ void main() { ); }); - testWidgets('a codec that is still downloading cannot be sent from', - (tester) async { + testWidgets('a codec that is still downloading cannot be sent from', ( + tester, + ) async { await _openSheet( tester, radio: _knownRadio, @@ -289,7 +296,8 @@ void main() { testWidgets('an unavailable codec explains itself with unavailableReason, ' 'not the generic string', (tester) async { - const reason = 'This build ships the image decoder only. Encoding and ' + const reason = + 'This build ships the image decoder only. Encoding and ' 'decoding a bitstream also needs the entropy-side graph and the rANS ' 'coder, which are not included yet.'; await _openSheet( diff --git a/test/widgets/received_image_message_test.dart b/test/widgets/received_image_message_test.dart index 4a819997..ad436554 100644 --- a/test/widgets/received_image_message_test.dart +++ b/test/widgets/received_image_message_test.dart @@ -96,8 +96,9 @@ Future _pumpBubble( } void main() { - testWidgets('decoded incoming bubble carries the R6 badge and caption', - (tester) async { + testWidgets('decoded incoming bubble carries the R6 badge and caption', ( + tester, + ) async { final blobs = InMemoryReceivedImageBlobStore(); final store = ReceivedImageStore(blobs: blobs); final png = base64Decode(_png1x1); @@ -161,7 +162,6 @@ void main() { expect(find.textContaining('Fine detail is generated'), findsOneWidget); }); - testWidgets('receiving state shows the packet count', (tester) async { final store = ReceivedImageStore(decoder: null); final reassembler = ImageReassembler(selfPrefix: 0xbeef); @@ -193,21 +193,23 @@ void main() { }); testWidgets( - 'awaiting card shows the bitstream size, the packet count and the ' - 'tap-to-process affordance', (tester) async { - final store = await _awaitingStore(bytes: 156, packets: 2); - final entry = store.entryFor('await1')!; - expect(entry.state, ReceivedImageState.reassembled); - expect(entry.needsManualDecode, isTrue); + 'awaiting card shows the bitstream size, the packet count and the ' + 'tap-to-process affordance', + (tester) async { + final store = await _awaitingStore(bytes: 156, packets: 2); + final entry = store.entryFor('await1')!; + expect(entry.state, ReceivedImageState.reassembled); + expect(entry.needsManualDecode, isTrue); - await _pumpBubble(tester, store); + await _pumpBubble(tester, store); - expect(find.text('156 bytes · 2 packets'), findsOneWidget); - expect(find.text('Tap to process'), findsOneWidget); - // A placeholder is never dressed up as a picture. - expect(find.text('AI-reconstructed'), findsNothing); - expect(find.byType(Image), findsNothing); - }); + expect(find.text('156 bytes · 2 packets'), findsOneWidget); + expect(find.text('Tap to process'), findsOneWidget); + // A placeholder is never dressed up as a picture. + expect(find.text('AI-reconstructed'), findsNothing); + expect(find.byType(Image), findsNothing); + }, + ); testWidgets('awaiting card honours injected strings', (tester) async { final store = await _awaitingStore(bytes: 209, packets: 3); @@ -338,8 +340,9 @@ void main() { expect(decoder.decodeCalls, 1); }); - testWidgets('every non-decoded state renders a legible label', - (tester) async { + testWidgets('every non-decoded state renders a legible label', ( + tester, + ) async { const cases = { 'failedIncomplete': 'Image incomplete — 1 of 3 packets arrived', 'failedCorrupt': 'Image could not be reconstructed', @@ -413,8 +416,9 @@ void main() { expect(find.textContaining('Fine detail is generated'), findsOneWidget); }); - testWidgets('the caption quotes the real bitstream size, not a nominal one', - (tester) async { + testWidgets('the caption quotes the real bitstream size, not a nominal one', ( + tester, + ) async { // It used to hardcode "~156 bytes" under every image, so a 209-byte image // and a 110-byte one both claimed 156. The label's whole purpose is // honesty about what was actually transmitted. @@ -448,15 +452,22 @@ void main() { await _pumpBubble(tester, store, streamId: id); await tester.pump(); - expect(find.textContaining('$bytes bytes'), findsOneWidget, - reason: 'caption must quote $bytes'); - expect(find.textContaining('156 bytes'), findsNothing, - reason: 'no nominal size may leak into the caption'); + expect( + find.textContaining('$bytes bytes'), + findsOneWidget, + reason: 'caption must quote $bytes', + ); + expect( + find.textContaining('156 bytes'), + findsNothing, + reason: 'no nominal size may leak into the caption', + ); } }); - testWidgets('the R6 caption is never truncated in a narrow bubble', - (tester) async { + testWidgets('the R6 caption is never truncated in a narrow bubble', ( + tester, + ) async { // It used to be maxLines: 2 and clipped mid-sentence — the rendered text // read "Details are invented. Not a", cutting off exactly where the // warning was. A half-shown warning is worse than none. diff --git a/untranslated.json b/untranslated.json index a851ed41..9e26dfee 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,1654 +1 @@ -{ - "bg": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "de": [ - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "es": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "fr": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "hu": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "it": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "ja": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "ko": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "nl": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "pl": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "pt": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "ru": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "sk": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "sl": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "sv": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "uk": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ], - - "zh": [ - "settings_regionSettings", - "settings_regionSettingsSubtitle", - "settings_regionManagement_screenTitle", - "settings_regionNameHint", - "settings_regionAddRegion", - "settings_regionFetchRegions", - "settings_regionFetchRegionsFail", - "settings_regionFetchRegionsAlreadyExists", - "settings_regionName", - "settings_regionDeleted", - "settings_deleteRegion", - "settings_deleteRegionConfirm", - "settings_infoHardware", - "settings_infoFirmware", - "repeater_pathHashModeOption0", - "repeater_pathHashModeOption1", - "repeater_pathHashModeOption2", - "repeater_pathHashModeOption3", - "appSettings_batteryLipoHv", - "channels_regionSetTo", - "channels_regionNotSet", - "channels_regionSelect_Title", - "channels_clearRegion", - "chat_sendImage", - "chat_imagePickFailed", - "chat_receivedGif", - "repeater_keySettings", - "repeater_keySettingsSubtitle", - "repeater_prvKey", - "repeater_prvKeyHelper", - "repeater_generatePrvKey", - "repeater_stopGeneratingPrvKey", - "repeater_pubKey", - "repeater_pubKeyHelper", - "repeater_pubKeyPrefix", - "repeater_pubKeyPrefixHelper", - "imageMessages_enableTitle", - "imageMessages_enableSubtitle", - "imageMessages_modelSectionTitle", - "imageMessages_downloadModel", - "imageMessages_cancelDownload", - "imageMessages_removeModel", - "imageMessages_modelReady", - "imageMessages_modelNotPublished", - "imageMessages_downloadFailed", - "imageMessages_autoProcessTitle", - "imageMessages_autoProcessSubtitle", - "imageSend_title", - "imageSend_cropNote", - "imageSend_originalSize", - "imageSend_onAirSize", - "imageSend_quality", - "imageSend_qualityStandard", - "imageSend_qualityHigh", - "imageSend_packetsLabel", - "imageSend_airtimeLabel", - "imageSend_sizeLabel", - "imageSend_packetsCount", - "imageSend_range", - "imageSend_unknownValue", - "imageSend_radioUnknownTitle", - "imageSend_radioUnknownBody", - "imageSend_longSendTitle", - "imageSend_longSendBody", - "imageSend_floodNote", - "imageSend_parityTitle", - "imageSend_paritySubtitle", - "imageSend_send", - "imageSend_cancel", - "imageSend_encodeFailed", - "imageSend_codecDownloading", - "imageSend_codecUnavailable", - "imageSend_codecDisabled", - "imageSend_deviceUnsupported", - "imageSend_directMessagesUnsupported", - "imageSend_tooLarge", - "imageSend_sentConfirmation", - "imageSend_sendFailed", - "imageSend_sendingProgress", - "receivedImage_senderPrefix", - "receivedImage_incoming", - "receivedImage_queued", - "receivedImage_tapToDecode", - "receivedImage_decoding", - "receivedImage_incomplete", - "receivedImage_corrupt", - "receivedImage_decoderMissing", - "receivedImage_evicted", - "receivedImage_retry", - "receivedImage_decodeAgain", - "receivedImage_openSettings", - "receivedImage_tapToProcess", - "receivedImage_awaiting", - "imageSend_secondsValue", - "imageSend_minutesSecondsValue" - ] -} +{} \ No newline at end of file