From 26fdf74d69fbdd10a1995b09754944b59b94ded8 Mon Sep 17 00:00:00 2001 From: zjs81 Date: Thu, 11 Jun 2026 00:28:13 -0700 Subject: [PATCH] Refactor UI code for better readability and consistency - Improved formatting of ListTile icons and text styles in settings_screen.dart, telemetry_screen.dart, usb_screen.dart, gif_picker.dart, path_editor_sheet.dart, repeater_login_dialog.dart, and room_login_dialog.dart for better readability. - Consolidated TextStyle definitions into single lines where applicable. - Updated notification_service.dart to enhance readability of notification ID assignment. - Simplified function signatures in routing_sheet.dart for clarity. - Cleaned up test assertions in usb_flow_test.dart for conciseness. - Removed unused translations in untranslated.json to streamline localization files. --- lib/connector/meshcore_connector.dart | 31 +- lib/connector/meshcore_protocol.dart | 2 +- lib/l10n/app_bg.arb | 97 +- lib/l10n/app_de.arb | 97 +- lib/l10n/app_es.arb | 97 +- lib/l10n/app_fr.arb | 97 +- lib/l10n/app_hu.arb | 97 +- lib/l10n/app_it.arb | 97 +- lib/l10n/app_ja.arb | 97 +- lib/l10n/app_ko.arb | 97 +- lib/l10n/app_localizations_bg.dart | 108 +- lib/l10n/app_localizations_de.dart | 110 ++- lib/l10n/app_localizations_es.dart | 107 +- lib/l10n/app_localizations_fr.dart | 110 ++- lib/l10n/app_localizations_hu.dart | 110 ++- lib/l10n/app_localizations_it.dart | 106 +- lib/l10n/app_localizations_ja.dart | 111 +-- lib/l10n/app_localizations_ko.dart | 110 +-- lib/l10n/app_localizations_nl.dart | 104 +- lib/l10n/app_localizations_pl.dart | 110 ++- lib/l10n/app_localizations_pt.dart | 106 +- lib/l10n/app_localizations_ru.dart | 112 ++- lib/l10n/app_localizations_sk.dart | 106 +- lib/l10n/app_localizations_sl.dart | 107 +- lib/l10n/app_localizations_sv.dart | 106 +- lib/l10n/app_localizations_uk.dart | 108 +- lib/l10n/app_localizations_zh.dart | 111 +-- lib/l10n/app_nl.arb | 97 +- lib/l10n/app_pl.arb | 97 +- lib/l10n/app_pt.arb | 97 +- lib/l10n/app_ru.arb | 97 +- lib/l10n/app_sk.arb | 97 +- lib/l10n/app_sl.arb | 97 +- lib/l10n/app_sv.arb | 97 +- lib/l10n/app_uk.arb | 97 +- lib/l10n/app_zh.arb | 97 +- lib/screens/app_debug_log_screen.dart | 12 +- lib/screens/app_settings_screen.dart | 252 +++-- lib/screens/channel_chat_screen.dart | 369 +++---- lib/screens/channel_message_path_screen.dart | 45 +- lib/screens/channels_screen.dart | 16 +- lib/screens/chat_screen.dart | 360 +++---- lib/screens/chrome_required_screen.dart | 10 +- lib/screens/contacts_screen.dart | 8 +- lib/screens/discovery_screen.dart | 4 +- lib/screens/line_of_sight_map_screen.dart | 32 +- lib/screens/map_cache_screen.dart | 4 +- lib/screens/map_screen.dart | 124 ++- lib/screens/neighbors_screen.dart | 5 +- lib/screens/path_trace_map.dart | 33 +- lib/screens/repeater_cli_screen.dart | 16 +- lib/screens/repeater_hub_screen.dart | 36 +- lib/screens/repeater_settings_screen.dart | 8 +- lib/screens/scanner_screen.dart | 19 +- lib/screens/settings_screen.dart | 10 +- lib/screens/tcp_screen.dart | 5 +- lib/screens/telemetry_screen.dart | 5 +- lib/screens/usb_screen.dart | 27 +- lib/services/notification_service.dart | 3 +- lib/widgets/gif_picker.dart | 27 +- lib/widgets/path_editor_sheet.dart | 9 +- lib/widgets/repeater_login_dialog.dart | 5 +- lib/widgets/room_login_dialog.dart | 5 +- lib/widgets/routing_sheet.dart | 61 +- test/screens/usb_flow_test.dart | 10 +- untranslated.json | 988 +------------------ 66 files changed, 3436 insertions(+), 2596 deletions(-) diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index dee34fb0..c9f11dd8 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -1484,23 +1484,22 @@ class MeshCoreConnector extends ChangeNotifier { _linuxSystemScanResults ..clear() ..addAll( - systemDevices - .map( - (device) => ScanResult( - device: device, - advertisementData: AdvertisementData( - advName: device.platformName, - txPowerLevel: null, - appearance: null, - connectable: true, - manufacturerData: const >{}, - serviceData: const >{}, - serviceUuids: [Guid(MeshCoreUuids.service)], - ), - rssi: 0, - timeStamp: DateTime.now(), - ), + systemDevices.map( + (device) => ScanResult( + device: device, + advertisementData: AdvertisementData( + advName: device.platformName, + txPowerLevel: null, + appearance: null, + connectable: true, + manufacturerData: const >{}, + serviceData: const >{}, + serviceUuids: [Guid(MeshCoreUuids.service)], ), + rssi: 0, + timeStamp: DateTime.now(), + ), + ), ); _mergeLinuxSystemScanResults(); notifyListeners(); diff --git a/lib/connector/meshcore_protocol.dart b/lib/connector/meshcore_protocol.dart index 7213b753..7b594894 100644 --- a/lib/connector/meshcore_protocol.dart +++ b/lib/connector/meshcore_protocol.dart @@ -956,7 +956,7 @@ Uint8List buildSendTelemetryReq(Uint8List? pubKey) { writer.writeBytes(Uint8List(3)); // reserved bytes writer.writeBytes(pubKey); } else { - writer.writeBytes(Uint8List(4)); // reserved bytes + writer.writeBytes(Uint8List(3)); // reserved bytes } return writer.toBytes(); } diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index 496b3e3d..f288b774 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Брой заявки", "telemetry_error": "Неуспешно получаване на данни", "telemetry_noData": "Няма налични данни за телеметрията.", @@ -2353,5 +2353,98 @@ "settings_companionDebugLogSubtitle": "Команди, отговори и сурови данни за протоколите BLE/TCP/USB", "chat_newMessages": "Нови съобщения", "settings_companionDebugLog": "Лог за отстраняване на грешки (за съпътстваща програма)", - "repeater_chanUtil": "Използване на канала" + "repeater_chanUtil": "Използване на канала", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_pending": "Изпращане", + "common_undo": "Отмяни", + "messageStatus_delivered": "Доставен", + "messageStatus_sent": "Изпратено", + "messageStatus_failed": "Не успях да изпратя", + "messageStatus_repeated": "Слушах го многократно", + "contacts_moreOptions": "Повече възможности", + "contacts_searchOpen": "Търсене на контакти", + "contacts_searchClose": "Затвори търсене", + "routing_title": "Маршрутизиране", + "routing_modeAuto": "Автомобил", + "routing_modeFlood": "Наводнение", + "routing_modeManual": "Ръководство", + "routing_modeAutoHint": "Автоматично избира най-известния път, като при липса на информация, използва стратегия за \"запълване\" на празните пространства.", + "routing_modeFloodHint": "Излъчване през всички ретранслатори. Най-надежният начин, но изисква повече време на въздуха.", + "routing_modeManualHint": "Винаги следва точно пътя, който сте определили.", + "routing_currentRoute": "Текущ маршрут", + "routing_directNoHops": "Директ – без превключватели", + "routing_noPathYet": "Все още няма път. Съобщението продължава да се изпраща, докато не бъде открит маршрут.", + "routing_floodBroadcast": "Предаване през всички ретранслатори", + "routing_editPath": "Редактиране на пътя", + "routing_forgetPath": "Забравете за пътя", + "routing_knownPaths": "Известни маршрути", + "routing_knownPathsHint": "Натиснете бутона, за да превключите към него.", + "routing_inUse": "В експлоатация", + "routing_qualityStrong": "Силен първи скок", + "routing_qualityGood": "Добър първи опит", + "routing_qualityFair": "Първият добър скок", + "routing_qualityWorked": "Беше изпълнено/Доведено до край", + "routing_qualityFlood": "Получено чрез информация, разпространена в резултат на навод.", + "routing_qualityUntested": "Не тестван", + "routing_neverWorked": "никога не е потвърдено", + "routing_floodDelivery": "Доставка при навод", + "pathEditor_title": "Създаване на път", + "pathEditor_hopCounter": "{count} от 64 различни вида малц", + "pathEditor_noHops": "Все още няма добавени хмел. Можете да използвате бутоните по-долу, за да ги добавите по ред, или да запазите рецептата без хмел, за да я изпратите директно.", + "pathEditor_addHops": "Добавете хмела в реда, в който е посочено.", + "pathEditor_searchRepeaters": "Търсене на повтори", + "pathEditor_advancedHex": "Разширено: необработен шестничен път", + "pathEditor_hexLabel": "Префикси на шестнадесетична система", + "pathEditor_hexHelper": "Два шест-символни идентификатора на скок, разделени със запетаи", + "pathEditor_invalidTokens": "Невалидно: {tokens}", + "routing_lastWorked": "worked {when}", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "pathEditor_tooManyHops": "Максимум 64 крачета", + "pathEditor_usePath": "Използвайте този маршрут.", + "pathEditor_removeHop": "Премахнете хмела", + "pathEditor_unknownHop": "Неизвестен репитер", + "map_zoomIn": "Увеличи", + "map_zoomOut": "Приближете се по-малко", + "map_centerMap": "Карта на центъра", + "chrome_bluetoothRequiresChromium": "Web Bluetooth изисква браузър, базиран на Chromium.", + "channels_communityShortId": "Идентификационен номер: {id}...", + "pathTrace_legendGpsConfirmed": "GPS потвърдено", + "pathTrace_legendInferred": "Извлечена позиция" } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index f7cb8040..47062aa6 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Anzahl der Anfragen", "telemetry_error": "Daten konnten nicht abgerufen werden", "telemetry_noData": "Keine Telemetriedaten verfügbar.", @@ -2381,5 +2381,98 @@ "chat_newMessages": "Neue Nachrichten", "settings_companionDebugLog": "Debug-Protokoll für die Begleitsoftware", "settings_companionDebugLogSubtitle": "BLE/TCP/USB-Befehle, Antworten und Rohdaten", - "repeater_chanUtil": "Nutzung des Kanals" + "repeater_chanUtil": "Nutzung des Kanals", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_sent": "Gesendet", + "messageStatus_delivered": "Geliefert", + "common_undo": "Rückgängig machen", + "messageStatus_pending": "Versenden", + "messageStatus_failed": "Nicht gesendet", + "messageStatus_repeated": "Wiederholt gehört", + "contacts_moreOptions": "Weitere Optionen", + "contacts_searchOpen": "Kontakte suchen", + "contacts_searchClose": "Erweiterte Suche", + "routing_title": "Routenplanung", + "routing_modeAuto": "Auto", + "routing_modeFlood": "Überschwemmung", + "routing_modeManual": "Handbuch", + "routing_modeFloodHint": "Übertragung über alle Repeater. Die zuverlässigste Methode, jedoch mit höherem Datenverbrauch.", + "routing_modeAutoHint": "Wählt automatisch den bekanntesten Pfad aus und verwendet eine Flutungsmethode, wenn kein Pfad bekannt ist.", + "routing_modeManualHint": "Sendet immer genau den von Ihnen festgelegten Weg.", + "routing_currentRoute": "Aktuelle Route", + "routing_directNoHops": "Direkt – ohne Zwischenverstärkung", + "routing_noPathYet": "Noch kein Pfad gefunden. Die Nachricht wird gesendet, bis ein Weg entdeckt wurde.", + "routing_floodBroadcast": "Übertragung über jeden Repeater", + "routing_editPath": "Pfad bearbeiten", + "routing_forgetPath": "Vergiss den Weg", + "routing_knownPaths": "Bekannte Routen", + "routing_knownPathsHint": "Wählen Sie den Pfad, um zu diesem zu wechseln.", + "routing_inUse": "Im Gebrauch", + "routing_qualityStrong": "Ein starker erster Sprung", + "routing_qualityGood": "Ein guter erster Schritt", + "routing_qualityFair": "Erster erfolgreicher Schritt", + "routing_qualityWorked": "Hat erfolgreich geliefert", + "routing_qualityFlood": "Information erhalten durch Nachrichten über die Überschwemmung", + "routing_qualityUntested": "Nicht getestet", + "routing_lastWorked": "war beschäftigt {when}", + "routing_neverWorked": "nie bestätigt", + "routing_floodDelivery": "Lieferung bei Überschwemmung", + "pathEditor_title": "Pfad erstellen", + "pathEditor_hopCounter": "{count} von 64 Hopfengewächsen", + "pathEditor_noHops": "Noch keine Hopfen hinzugefügt. Klicken Sie auf die Schaltflächen unten, um sie nacheinander hinzuzufügen, oder speichern Sie die Rezepter ohne Hopfen, um sie direkt zu versenden.", + "pathEditor_addHops": "Fügen Sie die Hopfen in der richtigen Reihenfolge hinzu.", + "pathEditor_searchRepeaters": "Suche nach wiederholten Nachrichten", + "pathEditor_advancedHex": "Fortgeschritten: Roh-Hex-Pfad", + "pathEditor_hexLabel": "Hex-Präfixe", + "pathEditor_hexHelper": "Zwei Hexadezimalzeichen pro Sprung, getrennt durch Kommas", + "pathEditor_invalidTokens": "Ungültig: {tokens}", + "pathEditor_tooManyHops": "Maximal 64 Hopfengreifer", + "pathEditor_usePath": "Verwenden Sie diesen Pfad.", + "pathEditor_removeHop": "Hop entfernen", + "pathEditor_unknownHop": "Unbekannter Repeater", + "map_zoomIn": "Zoomen", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "map_zoomOut": "Auszoomen", + "map_centerMap": "Zentralkarte", + "chrome_bluetoothRequiresChromium": "Web Bluetooth benötigt einen Chromium-Browser.", + "channels_communityShortId": "ID: {id}…", + "pathTrace_legendGpsConfirmed": "GPS-Bestätigung", + "pathTrace_legendInferred": "Abgeleitete Position" } diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index f24fb52a..31b6dc7d 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Número de solicitudes", "telemetry_error": "No se pudieron obtener los datos", "telemetry_noData": "No hay datos de telemetría disponibles.", @@ -2381,5 +2381,98 @@ "chat_newMessages": "Nuevos mensajes", "settings_companionDebugLogSubtitle": "Comandos, respuestas y datos brutos para protocolos BLE/TCP/USB", "chat_markAsUnread": "Marcar como no leído", - "repeater_chanUtil": "Utilización del canal" + "repeater_chanUtil": "Utilización del canal", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_pending": "Enviar", + "common_undo": "Deshacer", + "messageStatus_sent": "Sentido", + "messageStatus_delivered": "Entregado", + "messageStatus_failed": "No se pudo enviar", + "messageStatus_repeated": "Escuché repetidamente", + "contacts_moreOptions": "Más opciones", + "contacts_searchOpen": "Buscar contactos", + "contacts_searchClose": "Búsqueda avanzada", + "routing_title": "Ruteo", + "routing_modeAuto": "Coche", + "routing_modeFlood": "Inundación", + "routing_modeManual": "Manual", + "routing_modeAutoHint": "Selecciona automáticamente la ruta más conocida, y si no hay ninguna ruta conocida, utiliza la ruta más directa.", + "routing_modeFloodHint": "Transmisiones a través de todos los repetidores. Es la opción más fiable, pero utiliza más tiempo de transmisión.", + "routing_modeManualHint": "Siempre sigue exactamente la ruta que usted ha definido.", + "routing_currentRoute": "Ruta actual", + "routing_directNoHops": "Directo — sin saltos de repetidor", + "routing_noPathYet": "Aún no hay un camino definido. El mensaje se envía continuamente hasta que se encuentre una ruta.", + "routing_floodBroadcast": "Transmisión a través de todos los repetidores.", + "routing_editPath": "Editar ruta", + "routing_forgetPath": "Olvídate del camino", + "routing_knownPaths": "Rutas conocidas", + "routing_knownPathsHint": "Seleccione una opción para cambiar a esa.", + "routing_inUse": "En uso", + "routing_qualityStrong": "Primer salto exitoso", + "routing_qualityGood": "Primer paso exitoso", + "routing_qualityWorked": "Ha cumplido", + "routing_qualityFair": "Primer salto de calidad", + "routing_qualityFlood": "Se ha escuchado a través de rumores.", + "routing_qualityUntested": "Sin probar", + "routing_lastWorked": "trabajó {when}", + "routing_neverWorked": "nunca confirmado", + "routing_floodDelivery": "Entrega por inundación", + "pathEditor_title": "Crear ruta", + "pathEditor_hopCounter": "{count} de 64 granos de lúpulo", + "pathEditor_noHops": "Aún no se han añadido lúpulos. Haga clic en los repetidores para añadirlos en el orden deseado, o guarde la receta sin lúpulos para enviarla directamente.", + "pathEditor_addHops": "Añadir los lúpulos en el orden adecuado.", + "pathEditor_searchRepeaters": "Buscar repetidores", + "pathEditor_advancedHex": "Avanzado: ruta hexadecimal sin procesar", + "pathEditor_hexLabel": "Prefijos hexadecimales", + "pathEditor_hexHelper": "Dos caracteres hexadecimales por salto, separados por comas.", + "pathEditor_invalidTokens": "Inválido: {tokens}", + "pathEditor_tooManyHops": "Máximo 64 saltos", + "pathEditor_usePath": "Utilice esta ruta.", + "pathEditor_removeHop": "Eliminar el lúpulo", + "pathEditor_unknownHop": "Repetidor desconocido", + "map_zoomIn": "Acercar", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "map_zoomOut": "Acercar", + "map_centerMap": "Mapa del centro", + "chrome_bluetoothRequiresChromium": "Web Bluetooth requiere un navegador Chromium.", + "channels_communityShortId": "ID: {id}...", + "pathTrace_legendGpsConfirmed": "Confirmado mediante GPS", + "pathTrace_legendInferred": "Posición inferida" } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 710ee53a..76d6244b 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Nombre de requêtes", "telemetry_error": "Impossible de récupérer les données", "telemetry_noData": "Aucune donnée de télémétrie disponible.", @@ -2360,5 +2360,98 @@ "chat_markAsUnread": "Signaler comme non lu", "chat_newMessages": "Nouveaux messages", "settings_companionDebugLogSubtitle": "Commandes, réponses et données brutes pour les protocoles BLE/TCP/USB", - "repeater_chanUtil": "Utilisation du canal" + "repeater_chanUtil": "Utilisation du canal", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "common_undo": "Annuler", + "messageStatus_sent": "Envoyer", + "messageStatus_delivered": "Livré", + "messageStatus_pending": "Envoyer", + "messageStatus_failed": "Échec de l'envoi", + "messageStatus_repeated": "Répété plusieurs fois", + "contacts_searchOpen": "Rechercher des contacts", + "contacts_moreOptions": "Plus d'options", + "contacts_searchClose": "Recherche avancée", + "routing_title": "Planification des itinéraires", + "routing_modeAuto": "Voiture", + "routing_modeFlood": "Inondation", + "routing_modeManual": "Manuel", + "routing_modeFloodHint": "Diffusion via tous les répéteurs. La méthode la plus fiable, mais qui utilise plus de temps d'antenne.", + "routing_modeAutoHint": "Sélectionne automatiquement le chemin le plus connu, et utilise la méthode de \"inondation\" si aucun chemin n'est connu.", + "routing_modeManualHint": "Il suit toujours le chemin précis que vous avez défini.", + "routing_currentRoute": "Itinéraire actuel", + "routing_directNoHops": "Direct — sans relais", + "routing_noPathYet": "Aucune voie encore trouvée. Le message suivant est envoyé jusqu'à ce qu'une route soit découverte.", + "routing_floodBroadcast": "Diffusion via tous les répéteurs", + "routing_editPath": "Modifier le chemin", + "routing_forgetPath": "Oubliez le chemin", + "routing_knownPaths": "Chemins connus", + "routing_knownPathsHint": "Créez un raccourci pour y accéder.", + "routing_inUse": "En cours d'utilisation", + "routing_qualityStrong": "Première étape réussie", + "routing_qualityGood": "Première étape réussie", + "routing_qualityFair": "Première étape réussie", + "routing_qualityWorked": "A livré", + "routing_qualityFlood": "Rapporté par des informations provenant de plusieurs sources.", + "routing_qualityUntested": "Non testé", + "routing_lastWorked": "a travaillé {when}", + "routing_neverWorked": "jamais confirmé", + "routing_floodDelivery": "Livraison en cas de inondation", + "pathEditor_hopCounter": "{count} parmi 64 houblons", + "pathEditor_title": "Créer un chemin", + "pathEditor_noHops": "Aucun houblon ajouté pour le moment. Cliquez sur les répétiteurs ci-dessous pour les ajouter dans l'ordre souhaité, ou enregistrez sans houblon pour envoyer directement.", + "pathEditor_addHops": "Ajoutez les houblons dans l'ordre souhaité.", + "pathEditor_searchRepeaters": "Rechercher des répétiteurs", + "pathEditor_advancedHex": "Avancé : chemin hexadécimal brut", + "pathEditor_hexLabel": "Préfixes hexadécimaux", + "pathEditor_hexHelper": "Deux caractères hexadécimaux par saut, séparés par des virgules.", + "pathEditor_invalidTokens": "Incorrect : {tokens}", + "pathEditor_tooManyHops": "Maximum 64 sauts", + "pathEditor_usePath": "Utilisez ce chemin.", + "pathEditor_removeHop": "Éliminer le haricot", + "pathEditor_unknownHop": "Répéteur non identifié", + "map_zoomIn": "Zoomez", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "map_zoomOut": "Zoomez", + "map_centerMap": "Carte du centre", + "chrome_bluetoothRequiresChromium": "Web Bluetooth nécessite un navigateur Chromium.", + "channels_communityShortId": "ID : {id}…", + "pathTrace_legendGpsConfirmed": "Le GPS a confirmé.", + "pathTrace_legendInferred": "Position déduite" } diff --git a/lib/l10n/app_hu.arb b/lib/l10n/app_hu.arb index 1807fa68..cd5ed8c8 100644 --- a/lib/l10n/app_hu.arb +++ b/lib/l10n/app_hu.arb @@ -1502,7 +1502,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Kérések száma", "telemetry_error": "Nem sikerült lekérni az adatokat", "telemetry_noData": "Nincsenek elérhető telemetriadatok.", @@ -2391,5 +2391,98 @@ "chat_newMessages": "Új üzenetek", "settings_companionDebugLog": "Párhuzamos hibakeresési napló", "settings_companionDebugLogSubtitle": "BLE/TCP/USB parancsok, válaszok és alapvető adatok", - "repeater_chanUtil": "Csatorna-használat" + "repeater_chanUtil": "Csatorna-használat", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_delivered": "Szállítva", + "common_undo": "Még egyszer", + "messageStatus_sent": "Elküldve", + "messageStatus_pending": "Elküldés", + "messageStatus_failed": "Nem sikerült elküldeni", + "messageStatus_repeated": "Ismételtem", + "contacts_moreOptions": "További lehetőségek", + "contacts_searchOpen": "Keresssz kapcsolatokat", + "contacts_searchClose": "Teljesítse a keresést", + "routing_title": "Útvonal meghatározás", + "routing_modeAuto": "Autó", + "routing_modeFlood": "Áradás", + "routing_modeManual": "Használati útmutató", + "routing_modeAutoHint": "Automatikusan kiválasztja a legismertebb útvonalat, és ha egyik sem ismert, akkor \"vízzel\" tölti ki.", + "routing_modeFloodHint": "Átvisszaadások minden erősítőn keresztül. A legmegbízhatóbb megoldás, de több időt igényel.", + "routing_modeManualHint": "Mindig pontosan az útvonalat követi, amelyet megad.", + "routing_currentRoute": "Jelenlegi útvonal", + "routing_directNoHops": "Közvetlen – nincs átjáró állomás", + "routing_noPathYet": "Még nincs útvonal. A következő üzenet a keresésig vár.", + "routing_floodBroadcast": "Azonnali továbbítás minden erősítőn keresztül.", + "routing_editPath": "Útvonal szerkesztése", + "routing_forgetPath": "Felejtsd el a útvonalat", + "routing_knownPaths": "Jellegzetes útvonalak", + "routing_knownPathsHint": "Készíts egy útvonalat, hogy átválhass rá.", + "routing_inUse": "Használatban", + "routing_qualityStrong": "Erős első lépés", + "routing_qualityGood": "Jó első lépés", + "routing_qualityFair": "Jó első lépés", + "routing_qualityWorked": "Előállított", + "routing_qualityFlood": "Információt hallottam a katasztrófa miatt.", + "routing_qualityUntested": "Vizsgálatnak nem подвержен", + "routing_neverWorked": "sosem megerősítve", + "routing_floodDelivery": "Vízparti szállítás", + "pathEditor_title": "Út megépítése", + "pathEditor_hopCounter": "{count} db 64-ből", + "pathEditor_noHops": "Még nem adtam hozzá a bazsalikomot. A lent található gombokat használhatod, hogy sorrendben adjd hozzá, vagy mentheted anélkül, hogy bazsalikomot adnál hozzá, hogy közvetlenül elküldd.", + "pathEditor_addHops": "Adja hozzá a bazsaidat a megfelelő sorrendben.", + "pathEditor_searchRepeaters": "Ismétlő eszközök keresése", + "pathEditor_advancedHex": "Haladó szint: alapvető hex-út", + "pathEditor_hexLabel": "Hex előtagok", + "pathEditor_hexHelper": "Két hatjegyű szám minden lépésen, amelyek egymástól elválasztják a kommák.", + "pathEditor_invalidTokens": "Érvénytelen: {tokens}", + "routing_lastWorked": "worked {when}", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "pathEditor_tooManyHops": "A maximális szám 64.", + "pathEditor_usePath": "Használja ezt az útvonalat.", + "pathEditor_removeHop": "Távolítsa el a bazsalikomot", + "pathEditor_unknownHop": "Tudatlan erősítő", + "map_zoomIn": "Nagyítva", + "map_zoomOut": "Kicsökkentett nézet", + "map_centerMap": "Központi tér térkép", + "chrome_bluetoothRequiresChromium": "A Web Bluetooth-hoz egy Chromium-alapú böngésző szükséges.", + "channels_communityShortId": "Az azonosító: {id}...", + "pathTrace_legendGpsConfirmed": "GPS-en megerősítve", + "pathTrace_legendInferred": "Feltehető helyzet" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index d378d19d..10fc16e4 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Numero di richieste", "telemetry_error": "Impossibile recuperare i dati", "telemetry_noData": "Nessun dato di telemetria disponibile.", @@ -2353,5 +2353,98 @@ "settings_companionDebugLog": "Registro di debug per il supporto", "chat_newMessages": "Nuovi messaggi", "chat_markAsUnread": "Segna come non letto", - "repeater_chanUtil": "Utilizzo del canale" + "repeater_chanUtil": "Utilizzo del canale", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "common_undo": "Annulla", + "messageStatus_delivered": "Consegnato", + "messageStatus_sent": "Invia", + "messageStatus_pending": "Invio", + "messageStatus_failed": "Impossibile inviare", + "messageStatus_repeated": "Sentito ripetutamente", + "contacts_moreOptions": "Ulteriori opzioni", + "contacts_searchOpen": "Cerca contatti", + "contacts_searchClose": "Ricerca avanzata", + "routing_title": "Instradamento", + "routing_modeAuto": "Auto", + "routing_modeFlood": "Inondazione", + "routing_modeManual": "Manuale", + "routing_modeAutoHint": "Seleziona automaticamente il percorso più noto, e in caso di assenza di informazioni, utilizza un percorso casuale.", + "routing_modeFloodHint": "Trasmissioni tramite ogni ripetitore. Il metodo più affidabile, ma richiede più tempo di trasmissione.", + "routing_modeManualHint": "Invia sempre esattamente il percorso che hai definito.", + "routing_currentRoute": "Percorso attuale", + "routing_directNoHops": "Diretto — senza passaggi tramite ripetitori", + "routing_noPathYet": "Al momento non è stata individuata alcuna via. Il messaggio viene inviato ripetutamente finché non viene trovata una rotta.", + "routing_floodBroadcast": "Trasmissione attraverso ogni ripetitore", + "routing_editPath": "Percorso di modifica", + "routing_forgetPath": "Dimentica il percorso", + "routing_knownPaths": "Percorsi noti", + "routing_knownPathsHint": "Seleziona un percorso per accedere a questa opzione.", + "routing_inUse": "In uso", + "routing_qualityStrong": "Primo salto molto deciso", + "routing_qualityGood": "Primo tentativo di successo", + "routing_qualityFair": "Primo salto di qualità", + "routing_qualityWorked": "È stato consegnato", + "routing_qualityFlood": "Ho sentito tramite un messaggio urgente", + "routing_qualityUntested": "Non testato", + "routing_neverWorked": "mai confermato", + "routing_floodDelivery": "Consegna in caso di alluvione", + "pathEditor_title": "Creare percorso", + "pathEditor_hopCounter": "{count} tra 64 varietà di luppolo", + "pathEditor_noHops": "Al momento non ci sono ingredienti aggiuntivi. Per aggiungerli nell'ordine desiderato, cliccate sui ripetitori sottostanti. In alternativa, potete salvare la ricetta senza ingredienti aggiuntivi per inviarla direttamente.", + "pathEditor_addHops": "Aggiungere i luppoli nell'ordine desiderato.", + "pathEditor_searchRepeaters": "Ricerca ripetitori", + "pathEditor_advancedHex": "Avanzato: percorso esadecimale grezzo", + "pathEditor_hexLabel": "Prefissi esadecimali", + "pathEditor_hexHelper": "Due caratteri esadecimali per ogni salto, separati da virgole.", + "pathEditor_invalidTokens": "Non valido: {tokens}", + "routing_lastWorked": "worked {when}", + "pathEditor_tooManyHops": "Massimo 64 orari", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "pathEditor_usePath": "Utilizza questo percorso", + "pathEditor_removeHop": "Rimuovere il luppolo", + "pathEditor_unknownHop": "Ripetitore sconosciuto", + "map_zoomIn": "Ingrandisci", + "map_zoomOut": "Riduci la visualizzazione", + "map_centerMap": "Mappa del centro", + "channels_communityShortId": "ID: {id}...", + "chrome_bluetoothRequiresChromium": "Web Bluetooth richiede un browser basato su Chromium.", + "pathTrace_legendGpsConfirmed": "Il GPS conferma", + "pathTrace_legendInferred": "Posizione dedotta" } diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb index e000a0d9..4afea945 100644 --- a/lib/l10n/app_ja.arb +++ b/lib/l10n/app_ja.arb @@ -1502,7 +1502,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "リクエスト数", "telemetry_error": "データを取得できません", "telemetry_noData": "テレメトリデータは利用できません。", @@ -2391,5 +2391,98 @@ "settings_companionDebugLog": "同伴デバッグログ", "chat_newMessages": "新しいメッセージ", "chat_markAsUnread": "未読としてマークする", - "repeater_chanUtil": "チャンネルの利用状況" + "repeater_chanUtil": "チャンネルの利用状況", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_delivered": "配達", + "common_undo": "元に戻す", + "messageStatus_pending": "送信", + "messageStatus_sent": "送信", + "messageStatus_failed": "送信できませんでした", + "contacts_moreOptions": "さらに多くの選択肢", + "messageStatus_repeated": "何度も聞いた", + "contacts_searchOpen": "連絡先を検索する", + "contacts_searchClose": "検索を終了", + "routing_modeFlood": "洪水", + "routing_title": "経路設定", + "routing_modeAuto": "自動車", + "routing_modeManual": "マニュアル", + "routing_modeAutoHint": "最も一般的な経路を自動的に選択し、経路が不明な場合は、水没状態にします。", + "routing_modeFloodHint": "すべてのリピーターを通じて放送。最も信頼性が高いですが、より多くの時間を使用します。", + "routing_modeManualHint": "常に、あなたが設定した正確な経路を辿って移動します。", + "routing_currentRoute": "現在までのルート", + "routing_directNoHops": "直接接続—中継装置を経由しない", + "routing_noPathYet": "まだ経路は確立されていません。「次のメッセージを送信し、経路が特定されるまで待ちます」。", + "routing_floodBroadcast": "すべてのリピーターを通じて放送", + "routing_editPath": "パスの編集", + "routing_forgetPath": "道にこだわらない", + "routing_knownPaths": "既知の経路", + "routing_knownPathsHint": "そのアプリケーションに切り替えるためのショートカットを作成します。", + "routing_inUse": "使用中", + "routing_qualityStrong": "最初の段階で大きな成果を上げる", + "routing_qualityGood": "最初の成功", + "routing_qualityFair": "最初の試みは成功を収めた", + "routing_qualityWorked": "完了しました", + "routing_qualityFlood": "氾濫によって伝聞", + "routing_qualityUntested": "未検証", + "routing_lastWorked": "{when}に勤務", + "routing_neverWorked": "確認されていない", + "routing_floodDelivery": "洪水による配送", + "pathEditor_title": "経路の作成", + "pathEditor_hopCounter": "64個のホップのうち、{count}個", + "pathEditor_noHops": "まだホップは追加されていません。ホップを順番に追加するには、以下の「タップ」ボタンをクリックしてください。または、ホップを一切追加せずに直接送信するには、「保存」ボタンをクリックしてください。", + "pathEditor_addHops": "ホップを、指定された順番に加える", + "pathEditor_searchRepeaters": "繰り返し検索", + "pathEditor_advancedHex": "高度なレベル:生のヘックスパス", + "pathEditor_hexLabel": "ヘックスプレフィックス", + "pathEditor_hexHelper": "各ホップごとに2つのハッシュ文字を、カンマで区切って記述", + "pathEditor_invalidTokens": "無効: {tokens}", + "pathEditor_tooManyHops": "最大64段階", + "pathEditor_usePath": "この経路を使用してください", + "pathEditor_removeHop": "ホップを取り除く", + "pathEditor_unknownHop": "不明な増幅器", + "map_zoomIn": "ズームイン", + "map_zoomOut": "ズームアウト", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "map_centerMap": "中心地図", + "chrome_bluetoothRequiresChromium": "Web Bluetooth は、Chromium ブラウザが必要です。", + "channels_communityShortId": "ID: {id}…", + "pathTrace_legendGpsConfirmed": "GPSによる確認", + "pathTrace_legendInferred": "推測される位置" } diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index 8f6781e3..f6f804e4 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -1502,7 +1502,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "요청 수", "telemetry_error": "데이터를 가져올 수 없습니다", "telemetry_noData": "텔레메트리 데이터는 제공되지 않습니다.", @@ -2391,5 +2391,98 @@ "chat_newMessages": "새로운 메시지", "settings_companionDebugLogSubtitle": "BLE/TCP/USB 명령어, 응답 및 원시 데이터", "chat_markAsUnread": "미리 읽지 않음으로 표시", - "repeater_chanUtil": "채널 활용도" + "repeater_chanUtil": "채널 활용도", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_pending": "발송", + "messageStatus_sent": "발송", + "messageStatus_delivered": "배송 완료", + "common_undo": "취소", + "messageStatus_failed": "발송 실패", + "messageStatus_repeated": "반복적으로 들었습니다", + "contacts_searchOpen": "연락처 검색", + "contacts_moreOptions": "더 많은 옵션", + "contacts_searchClose": "검색 닫기", + "routing_title": "라우팅", + "routing_modeAuto": "자동", + "routing_modeFlood": "홍수", + "routing_modeManual": "사용 설명서", + "routing_modeAutoHint": "가장 잘 알려진 경로를 자동으로 선택하고, 경로가 없을 경우에는 무작위로 경로를 선택합니다.", + "routing_modeFloodHint": "모든 증폭기를 통해 방송됩니다. 가장 안정적이지만, 더 많은 송출 시간을 사용합니다.", + "routing_modeManualHint": "항상 설정하신 정확한 경로를 따라 이동합니다.", + "routing_currentRoute": "현재 경로", + "routing_directNoHops": "직접 연결 – 중계 장치 사용 없이", + "routing_noPathYet": "아직 경로가 없습니다. 다음 메시지가 도착할 때까지 계속 탐색합니다.", + "routing_floodBroadcast": "모든 증폭기를 통해 방송", + "routing_editPath": "경로 편집", + "routing_forgetPath": "길을 잊어라", + "routing_knownPaths": "알려진 경로", + "routing_knownPathsHint": "해당 항목으로 전환하기 위한 경로를 선택합니다.", + "routing_inUse": "사용 중", + "routing_qualityStrong": "강력한 첫 번째 단계", + "routing_qualityGood": "좋은 첫 시작", + "routing_qualityFair": "처음 시도", + "routing_qualityWorked": "완료됨", + "routing_qualityFlood": "홍수 피해 상황을 통해 들었습니다.", + "routing_qualityUntested": "검증되지 않음", + "routing_lastWorked": "{when}에 일했습니다", + "routing_neverWorked": "확인되지 않음", + "routing_floodDelivery": "홍수 피해 지역 배송", + "pathEditor_title": "경로 만들기", + "pathEditor_hopCounter": "64개의 홉 중 {count}", + "pathEditor_noHops": "현재 홉은 추가되지 않았습니다. 아래의 탭을 사용하여 순서대로 추가하거나, 홉 없이 바로 전송하려면 \"홉 없음\"으로 저장하십시오.", + "pathEditor_addHops": "홉을 순서대로 첨가해주세요.", + "pathEditor_searchRepeaters": "반복 검색", + "pathEditor_advancedHex": "고급: 원시 헥스 경로", + "pathEditor_hexLabel": "헥스 접두사", + "pathEditor_hexHelper": "각 홉마다 2개의 6자리 숫자, 쉼표로 구분", + "pathEditor_invalidTokens": "유효하지 않음: {tokens}", + "pathEditor_tooManyHops": "최대 64개의 홉", + "pathEditor_usePath": "이 경로를 사용하세요", + "pathEditor_removeHop": "홉 제거", + "pathEditor_unknownHop": "알 수 없는 중계기", + "map_zoomIn": "줌 인", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "map_zoomOut": "줌 아웃", + "map_centerMap": "중심 지도", + "chrome_bluetoothRequiresChromium": "웹 블루투스는 크롬 브라우저가 필요합니다.", + "channels_communityShortId": "ID: {id}...", + "pathTrace_legendGpsConfirmed": "GPS 확인 완료", + "pathTrace_legendInferred": "추론된 위치" } diff --git a/lib/l10n/app_localizations_bg.dart b/lib/l10n/app_localizations_bg.dart index 68742652..d22848c3 100644 --- a/lib/l10n/app_localizations_bg.dart +++ b/lib/l10n/app_localizations_bg.dart @@ -93,22 +93,22 @@ class AppLocalizationsBg extends AppLocalizations { String get common_disable => 'Деактивирай'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Отмяни'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Изпратено'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Доставен'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Изпращане'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Не успях да изпратя'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Слушах го многократно'; @override String get common_reboot => 'Рестартирай'; @@ -1016,13 +1016,13 @@ class AppLocalizationsBg extends AppLocalizations { String get contacts_newGroup => 'Нова група'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Повече възможности'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Търсене на контакти'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Затвори търсене'; @override String get contacts_groupName => 'Група'; @@ -1530,74 +1530,76 @@ class AppLocalizationsBg extends AppLocalizations { String get chat_fullPath => 'Пълен път'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Маршрутизиране'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Автомобил'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Наводнение'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Ръководство'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Автоматично избира най-известния път, като при липса на информация, използва стратегия за \"запълване\" на празните пространства.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Излъчване през всички ретранслатори. Най-надежният начин, но изисква повече време на въздуха.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Винаги следва точно пътя, който сте определили.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Текущ маршрут'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Директ – без превключватели'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Все още няма път. Съобщението продължава да се изпраща, докато не бъде открит маршрут.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => 'Предаване през всички ретранслатори'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Редактиране на пътя'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Забравете за пътя'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Известни маршрути'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Натиснете бутона, за да превключите към него.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'В експлоатация'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Силен първи скок'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Добър първи опит'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Първият добър скок'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Беше изпълнено/Доведено до край'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => + 'Получено чрез информация, разпространена в резултат на навод.'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Не тестван'; @override String routing_lastWorked(String when) { @@ -1605,7 +1607,7 @@ class AppLocalizationsBg extends AppLocalizations { } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'никога не е потвърдено'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1613,52 +1615,52 @@ class AppLocalizationsBg extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Доставка при навод'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Създаване на път'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count от 64 различни вида малц'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Все още няма добавени хмел. Можете да използвате бутоните по-долу, за да ги добавите по ред, или да запазите рецептата без хмел, за да я изпратите директно.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'Добавете хмела в реда, в който е посочено.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Търсене на повтори'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Разширено: необработен шестничен път'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Префикси на шестнадесетична система'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Два шест-символни идентификатора на скок, разделени със запетаи'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Невалидно: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Максимум 64 крачета'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Използвайте този маршрут.'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Премахнете хмела'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Неизвестен репитер'; @override String get chat_pathSavedLocally => @@ -4455,26 +4457,26 @@ class AppLocalizationsBg extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Увеличи'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Приближете се по-малко'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Карта на центъра'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth изисква браузър, базиран на Chromium.'; @override String channels_communityShortId(String id) { - return 'ID: $id...'; + return 'Идентификационен номер: $id...'; } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS потвърдено'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Извлечена позиция'; } diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 62df5bb6..98d25a6d 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -93,22 +93,22 @@ class AppLocalizationsDe extends AppLocalizations { String get common_disable => 'Deaktivieren'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Rückgängig machen'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Gesendet'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Geliefert'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Versenden'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Nicht gesendet'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Wiederholt gehört'; @override String get common_reboot => 'Neustart'; @@ -1012,13 +1012,13 @@ class AppLocalizationsDe extends AppLocalizations { String get contacts_newGroup => 'Neue Gruppe'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Weitere Optionen'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Kontakte suchen'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Erweiterte Suche'; @override String get contacts_groupName => 'Gruppenname'; @@ -1528,82 +1528,84 @@ class AppLocalizationsDe extends AppLocalizations { String get chat_fullPath => 'Vollständiger Pfad'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Routenplanung'; @override String get routing_modeAuto => 'Auto'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Überschwemmung'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Handbuch'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Wählt automatisch den bekanntesten Pfad aus und verwendet eine Flutungsmethode, wenn kein Pfad bekannt ist.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Übertragung über alle Repeater. Die zuverlässigste Methode, jedoch mit höherem Datenverbrauch.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Sendet immer genau den von Ihnen festgelegten Weg.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Aktuelle Route'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Direkt – ohne Zwischenverstärkung'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Noch kein Pfad gefunden. Die Nachricht wird gesendet, bis ein Weg entdeckt wurde.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => 'Übertragung über jeden Repeater'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Pfad bearbeiten'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Vergiss den Weg'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Bekannte Routen'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Wählen Sie den Pfad, um zu diesem zu wechseln.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'Im Gebrauch'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Ein starker erster Sprung'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Ein guter erster Schritt'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Erster erfolgreicher Schritt'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Hat erfolgreich geliefert'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => + 'Information erhalten durch Nachrichten über die Überschwemmung'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Nicht getestet'; @override String routing_lastWorked(String when) { - return 'worked $when'; + return 'war beschäftigt $when'; } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'nie bestätigt'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1611,52 +1613,54 @@ class AppLocalizationsDe extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Lieferung bei Überschwemmung'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Pfad erstellen'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count von 64 Hopfengewächsen'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Noch keine Hopfen hinzugefügt. Klicken Sie auf die Schaltflächen unten, um sie nacheinander hinzuzufügen, oder speichern Sie die Rezepter ohne Hopfen, um sie direkt zu versenden.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => + 'Fügen Sie die Hopfen in der richtigen Reihenfolge hinzu.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => + 'Suche nach wiederholten Nachrichten'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Fortgeschritten: Roh-Hex-Pfad'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Hex-Präfixe'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Zwei Hexadezimalzeichen pro Sprung, getrennt durch Kommas'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Ungültig: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Maximal 64 Hopfengreifer'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Verwenden Sie diesen Pfad.'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Hop entfernen'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Unbekannter Repeater'; @override String get chat_pathSavedLocally => @@ -4474,26 +4478,26 @@ class AppLocalizationsDe extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Zoomen'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Auszoomen'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Zentralkarte'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth benötigt einen Chromium-Browser.'; @override String channels_communityShortId(String id) { - return 'ID: $id...'; + return 'ID: $id…'; } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS-Bestätigung'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Abgeleitete Position'; } diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index aa17930b..e0268b4f 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -93,22 +93,22 @@ class AppLocalizationsEs extends AppLocalizations { String get common_disable => 'Desactivar'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Deshacer'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Sentido'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Entregado'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Enviar'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'No se pudo enviar'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Escuché repetidamente'; @override String get common_reboot => 'Reiniciar'; @@ -1011,13 +1011,13 @@ class AppLocalizationsEs extends AppLocalizations { String get contacts_newGroup => 'Nuevo Grupo'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Más opciones'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Buscar contactos'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Búsqueda avanzada'; @override String get contacts_groupName => 'Nombre del grupo'; @@ -1527,82 +1527,84 @@ class AppLocalizationsEs extends AppLocalizations { String get chat_fullPath => 'Ruta completa'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Ruteo'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Coche'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Inundación'; @override String get routing_modeManual => 'Manual'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Selecciona automáticamente la ruta más conocida, y si no hay ninguna ruta conocida, utiliza la ruta más directa.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Transmisiones a través de todos los repetidores. Es la opción más fiable, pero utiliza más tiempo de transmisión.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Siempre sigue exactamente la ruta que usted ha definido.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Ruta actual'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Directo — sin saltos de repetidor'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Aún no hay un camino definido. El mensaje se envía continuamente hasta que se encuentre una ruta.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => + 'Transmisión a través de todos los repetidores.'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Editar ruta'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Olvídate del camino'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Rutas conocidas'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Seleccione una opción para cambiar a esa.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'En uso'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Primer salto exitoso'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Primer paso exitoso'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Primer salto de calidad'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Ha cumplido'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => 'Se ha escuchado a través de rumores.'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Sin probar'; @override String routing_lastWorked(String when) { - return 'worked $when'; + return 'trabajó $when'; } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'nunca confirmado'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1610,52 +1612,53 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Entrega por inundación'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Crear ruta'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count de 64 granos de lúpulo'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Aún no se han añadido lúpulos. Haga clic en los repetidores para añadirlos en el orden deseado, o guarde la receta sin lúpulos para enviarla directamente.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'Añadir los lúpulos en el orden adecuado.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Buscar repetidores'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => + 'Avanzado: ruta hexadecimal sin procesar'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Prefijos hexadecimales'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Dos caracteres hexadecimales por salto, separados por comas.'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Inválido: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Máximo 64 saltos'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Utilice esta ruta.'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Eliminar el lúpulo'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Repetidor desconocido'; @override String get chat_pathSavedLocally => @@ -4461,17 +4464,17 @@ class AppLocalizationsEs extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Acercar'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Acercar'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Mapa del centro'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth requiere un navegador Chromium.'; @override String channels_communityShortId(String id) { @@ -4479,8 +4482,8 @@ class AppLocalizationsEs extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'Confirmado mediante GPS'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Posición inferida'; } diff --git a/lib/l10n/app_localizations_fr.dart b/lib/l10n/app_localizations_fr.dart index 69e2af85..7bb38a0d 100644 --- a/lib/l10n/app_localizations_fr.dart +++ b/lib/l10n/app_localizations_fr.dart @@ -93,22 +93,22 @@ class AppLocalizationsFr extends AppLocalizations { String get common_disable => 'Désactiver'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Annuler'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Envoyer'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Livré'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Envoyer'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Échec de l\'envoi'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Répété plusieurs fois'; @override String get common_reboot => 'Redémarrer'; @@ -1017,13 +1017,13 @@ class AppLocalizationsFr extends AppLocalizations { String get contacts_newGroup => 'Nouveau Groupe'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Plus d\'options'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Rechercher des contacts'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Recherche avancée'; @override String get contacts_groupName => 'Nom du groupe'; @@ -1533,82 +1533,83 @@ class AppLocalizationsFr extends AppLocalizations { String get chat_fullPath => 'Chemin complet'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Planification des itinéraires'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Voiture'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Inondation'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Manuel'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Sélectionne automatiquement le chemin le plus connu, et utilise la méthode de \"inondation\" si aucun chemin n\'est connu.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Diffusion via tous les répéteurs. La méthode la plus fiable, mais qui utilise plus de temps d\'antenne.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Il suit toujours le chemin précis que vous avez défini.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Itinéraire actuel'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Direct — sans relais'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Aucune voie encore trouvée. Le message suivant est envoyé jusqu\'à ce qu\'une route soit découverte.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => 'Diffusion via tous les répéteurs'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Modifier le chemin'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Oubliez le chemin'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Chemins connus'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => 'Créez un raccourci pour y accéder.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'En cours d\'utilisation'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Première étape réussie'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Première étape réussie'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Première étape réussie'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'A livré'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => + 'Rapporté par des informations provenant de plusieurs sources.'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Non testé'; @override String routing_lastWorked(String when) { - return 'worked $when'; + return 'a travaillé $when'; } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'jamais confirmé'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1616,52 +1617,53 @@ class AppLocalizationsFr extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Livraison en cas de inondation'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Créer un chemin'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count parmi 64 houblons'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Aucun houblon ajouté pour le moment. Cliquez sur les répétiteurs ci-dessous pour les ajouter dans l\'ordre souhaité, ou enregistrez sans houblon pour envoyer directement.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => + 'Ajoutez les houblons dans l\'ordre souhaité.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Rechercher des répétiteurs'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Avancé : chemin hexadécimal brut'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Préfixes hexadécimaux'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Deux caractères hexadécimaux par saut, séparés par des virgules.'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Incorrect : $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Maximum 64 sauts'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Utilisez ce chemin.'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Éliminer le haricot'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Répéteur non identifié'; @override String get chat_pathSavedLocally => @@ -4488,26 +4490,26 @@ class AppLocalizationsFr extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Zoomez'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Zoomez'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Carte du centre'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth nécessite un navigateur Chromium.'; @override String channels_communityShortId(String id) { - return 'ID: $id...'; + return 'ID : $id…'; } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'Le GPS a confirmé.'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Position déduite'; } diff --git a/lib/l10n/app_localizations_hu.dart b/lib/l10n/app_localizations_hu.dart index f58b8afc..eef91d09 100644 --- a/lib/l10n/app_localizations_hu.dart +++ b/lib/l10n/app_localizations_hu.dart @@ -93,22 +93,22 @@ class AppLocalizationsHu extends AppLocalizations { String get common_disable => 'Leteteszt'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Még egyszer'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Elküldve'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Szállítva'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Elküldés'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Nem sikerült elküldeni'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Ismételtem'; @override String get common_reboot => 'Újraindítás'; @@ -1017,13 +1017,13 @@ class AppLocalizationsHu extends AppLocalizations { String get contacts_newGroup => 'Új csoport'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'További lehetőségek'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Keresssz kapcsolatokat'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Teljesítse a keresést'; @override String get contacts_groupName => 'Csoport neve'; @@ -1536,74 +1536,77 @@ class AppLocalizationsHu extends AppLocalizations { String get chat_fullPath => 'Teljes elérési út'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Útvonal meghatározás'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Autó'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Áradás'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Használati útmutató'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Automatikusan kiválasztja a legismertebb útvonalat, és ha egyik sem ismert, akkor \"vízzel\" tölti ki.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Átvisszaadások minden erősítőn keresztül. A legmegbízhatóbb megoldás, de több időt igényel.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Mindig pontosan az útvonalat követi, amelyet megad.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Jelenlegi útvonal'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Közvetlen – nincs átjáró állomás'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Még nincs útvonal. A következő üzenet a keresésig vár.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => + 'Azonnali továbbítás minden erősítőn keresztül.'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Útvonal szerkesztése'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Felejtsd el a útvonalat'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Jellegzetes útvonalak'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Készíts egy útvonalat, hogy átválhass rá.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'Használatban'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Erős első lépés'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Jó első lépés'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Jó első lépés'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Előállított'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => + 'Információt hallottam a katasztrófa miatt.'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Vizsgálatnak nem подвержен'; @override String routing_lastWorked(String when) { @@ -1611,7 +1614,7 @@ class AppLocalizationsHu extends AppLocalizations { } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'sosem megerősítve'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1619,52 +1622,53 @@ class AppLocalizationsHu extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Vízparti szállítás'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Út megépítése'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count db 64-ből'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Még nem adtam hozzá a bazsalikomot. A lent található gombokat használhatod, hogy sorrendben adjd hozzá, vagy mentheted anélkül, hogy bazsalikomot adnál hozzá, hogy közvetlenül elküldd.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => + 'Adja hozzá a bazsaidat a megfelelő sorrendben.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Ismétlő eszközök keresése'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Haladó szint: alapvető hex-út'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Hex előtagok'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Két hatjegyű szám minden lépésen, amelyek egymástól elválasztják a kommák.'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Érvénytelen: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'A maximális szám 64.'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Használja ezt az útvonalat.'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Távolítsa el a bazsalikomot'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Tudatlan erősítő'; @override String get chat_pathSavedLocally => @@ -4474,26 +4478,26 @@ class AppLocalizationsHu extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Nagyítva'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Kicsökkentett nézet'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Központi tér térkép'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'A Web Bluetooth-hoz egy Chromium-alapú böngésző szükséges.'; @override String channels_communityShortId(String id) { - return 'ID: $id...'; + return 'Az azonosító: $id...'; } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS-en megerősítve'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Feltehető helyzet'; } diff --git a/lib/l10n/app_localizations_it.dart b/lib/l10n/app_localizations_it.dart index 7a7043bb..89fb77e7 100644 --- a/lib/l10n/app_localizations_it.dart +++ b/lib/l10n/app_localizations_it.dart @@ -93,22 +93,22 @@ class AppLocalizationsIt extends AppLocalizations { String get common_disable => 'Disattivare'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Annulla'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Invia'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Consegnato'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Invio'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Impossibile inviare'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Sentito ripetutamente'; @override String get common_reboot => 'Riavvia'; @@ -1013,13 +1013,13 @@ class AppLocalizationsIt extends AppLocalizations { String get contacts_newGroup => 'Nuovo Gruppo'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Ulteriori opzioni'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Cerca contatti'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Ricerca avanzata'; @override String get contacts_groupName => 'Nome gruppo'; @@ -1529,74 +1529,77 @@ class AppLocalizationsIt extends AppLocalizations { String get chat_fullPath => 'Percorso Completo'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Instradamento'; @override String get routing_modeAuto => 'Auto'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Inondazione'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Manuale'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Seleziona automaticamente il percorso più noto, e in caso di assenza di informazioni, utilizza un percorso casuale.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Trasmissioni tramite ogni ripetitore. Il metodo più affidabile, ma richiede più tempo di trasmissione.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Invia sempre esattamente il percorso che hai definito.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Percorso attuale'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => + 'Diretto — senza passaggi tramite ripetitori'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Al momento non è stata individuata alcuna via. Il messaggio viene inviato ripetutamente finché non viene trovata una rotta.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => + 'Trasmissione attraverso ogni ripetitore'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Percorso di modifica'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Dimentica il percorso'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Percorsi noti'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Seleziona un percorso per accedere a questa opzione.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'In uso'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Primo salto molto deciso'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Primo tentativo di successo'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Primo salto di qualità'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'È stato consegnato'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => 'Ho sentito tramite un messaggio urgente'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Non testato'; @override String routing_lastWorked(String when) { @@ -1604,7 +1607,7 @@ class AppLocalizationsIt extends AppLocalizations { } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'mai confermato'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1612,52 +1615,53 @@ class AppLocalizationsIt extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Consegna in caso di alluvione'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Creare percorso'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count tra 64 varietà di luppolo'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Al momento non ci sono ingredienti aggiuntivi. Per aggiungerli nell\'ordine desiderato, cliccate sui ripetitori sottostanti. In alternativa, potete salvare la ricetta senza ingredienti aggiuntivi per inviarla direttamente.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => + 'Aggiungere i luppoli nell\'ordine desiderato.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Ricerca ripetitori'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Avanzato: percorso esadecimale grezzo'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Prefissi esadecimali'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Due caratteri esadecimali per ogni salto, separati da virgole.'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Non valido: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Massimo 64 orari'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Utilizza questo percorso'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Rimuovere il luppolo'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Ripetitore sconosciuto'; @override String get chat_pathSavedLocally => @@ -4466,17 +4470,17 @@ class AppLocalizationsIt extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Ingrandisci'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Riduci la visualizzazione'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Mappa del centro'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth richiede un browser basato su Chromium.'; @override String channels_communityShortId(String id) { @@ -4484,8 +4488,8 @@ class AppLocalizationsIt extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'Il GPS conferma'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Posizione dedotta'; } diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart index ee79c6ee..c60816ee 100644 --- a/lib/l10n/app_localizations_ja.dart +++ b/lib/l10n/app_localizations_ja.dart @@ -93,22 +93,22 @@ class AppLocalizationsJa extends AppLocalizations { String get common_disable => '無効化する'; @override - String get common_undo => 'Undo'; + String get common_undo => '元に戻す'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => '送信'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => '配達'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => '送信'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => '送信できませんでした'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => '何度も聞いた'; @override String get common_reboot => '再起動'; @@ -964,13 +964,13 @@ class AppLocalizationsJa extends AppLocalizations { String get contacts_newGroup => '新しいグループ'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'さらに多くの選択肢'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => '連絡先を検索する'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => '検索を終了'; @override String get contacts_groupName => 'グループ名'; @@ -1462,82 +1462,80 @@ class AppLocalizationsJa extends AppLocalizations { String get chat_fullPath => 'フルパス'; @override - String get routing_title => 'Routing'; + String get routing_title => '経路設定'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => '自動車'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => '洪水'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'マニュアル'; @override - String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + String get routing_modeAutoHint => '最も一般的な経路を自動的に選択し、経路が不明な場合は、水没状態にします。'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'すべてのリピーターを通じて放送。最も信頼性が高いですが、より多くの時間を使用します。'; @override - String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + String get routing_modeManualHint => '常に、あなたが設定した正確な経路を辿って移動します。'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => '現在までのルート'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => '直接接続—中継装置を経由しない'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'まだ経路は確立されていません。「次のメッセージを送信し、経路が特定されるまで待ちます」。'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => 'すべてのリピーターを通じて放送'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'パスの編集'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => '道にこだわらない'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => '既知の経路'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => 'そのアプリケーションに切り替えるためのショートカットを作成します。'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => '使用中'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => '最初の段階で大きな成果を上げる'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => '最初の成功'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => '最初の試みは成功を収めた'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => '完了しました'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => '氾濫によって伝聞'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => '未検証'; @override String routing_lastWorked(String when) { - return 'worked $when'; + return '$whenに勤務'; } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => '確認されていない'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1545,52 +1543,51 @@ class AppLocalizationsJa extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => '洪水による配送'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => '経路の作成'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '64個のホップのうち、$count個'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'まだホップは追加されていません。ホップを順番に追加するには、以下の「タップ」ボタンをクリックしてください。または、ホップを一切追加せずに直接送信するには、「保存」ボタンをクリックしてください。'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'ホップを、指定された順番に加える'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => '繰り返し検索'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => '高度なレベル:生のヘックスパス'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'ヘックスプレフィックス'; @override - String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + String get pathEditor_hexHelper => '各ホップごとに2つのハッシュ文字を、カンマで区切って記述'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return '無効: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => '最大64段階'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'この経路を使用してください'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'ホップを取り除く'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => '不明な増幅器'; @override String get chat_pathSavedLocally => 'ローカルで保存。同期のために接続する。'; @@ -4238,26 +4235,26 @@ class AppLocalizationsJa extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'ズームイン'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'ズームアウト'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => '中心地図'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth は、Chromium ブラウザが必要です。'; @override String channels_communityShortId(String id) { - return 'ID: $id...'; + return 'ID: $id…'; } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPSによる確認'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => '推測される位置'; } diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart index 64c5a6a6..812c2f94 100644 --- a/lib/l10n/app_localizations_ko.dart +++ b/lib/l10n/app_localizations_ko.dart @@ -93,22 +93,22 @@ class AppLocalizationsKo extends AppLocalizations { String get common_disable => '비활성화'; @override - String get common_undo => 'Undo'; + String get common_undo => '취소'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => '발송'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => '배송 완료'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => '발송'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => '발송 실패'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => '반복적으로 들었습니다'; @override String get common_reboot => '재부팅'; @@ -959,13 +959,13 @@ class AppLocalizationsKo extends AppLocalizations { String get contacts_newGroup => '새로운 그룹'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => '더 많은 옵션'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => '연락처 검색'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => '검색 닫기'; @override String get contacts_groupName => '그룹 이름'; @@ -1457,82 +1457,80 @@ class AppLocalizationsKo extends AppLocalizations { String get chat_fullPath => '전체 경로'; @override - String get routing_title => 'Routing'; + String get routing_title => '라우팅'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => '자동'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => '홍수'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => '사용 설명서'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + '가장 잘 알려진 경로를 자동으로 선택하고, 경로가 없을 경우에는 무작위로 경로를 선택합니다.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + '모든 증폭기를 통해 방송됩니다. 가장 안정적이지만, 더 많은 송출 시간을 사용합니다.'; @override - String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + String get routing_modeManualHint => '항상 설정하신 정확한 경로를 따라 이동합니다.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => '현재 경로'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => '직접 연결 – 중계 장치 사용 없이'; @override - String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + String get routing_noPathYet => '아직 경로가 없습니다. 다음 메시지가 도착할 때까지 계속 탐색합니다.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => '모든 증폭기를 통해 방송'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => '경로 편집'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => '길을 잊어라'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => '알려진 경로'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => '해당 항목으로 전환하기 위한 경로를 선택합니다.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => '사용 중'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => '강력한 첫 번째 단계'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => '좋은 첫 시작'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => '처음 시도'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => '완료됨'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => '홍수 피해 상황을 통해 들었습니다.'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => '검증되지 않음'; @override String routing_lastWorked(String when) { - return 'worked $when'; + return '$when에 일했습니다'; } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => '확인되지 않음'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1540,52 +1538,51 @@ class AppLocalizationsKo extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => '홍수 피해 지역 배송'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => '경로 만들기'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '64개의 홉 중 $count'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + '현재 홉은 추가되지 않았습니다. 아래의 탭을 사용하여 순서대로 추가하거나, 홉 없이 바로 전송하려면 \"홉 없음\"으로 저장하십시오.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => '홉을 순서대로 첨가해주세요.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => '반복 검색'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => '고급: 원시 헥스 경로'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => '헥스 접두사'; @override - String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + String get pathEditor_hexHelper => '각 홉마다 2개의 6자리 숫자, 쉼표로 구분'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return '유효하지 않음: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => '최대 64개의 홉'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => '이 경로를 사용하세요'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => '홉 제거'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => '알 수 없는 중계기'; @override String get chat_pathSavedLocally => '로컬에 저장. 동기화 연결'; @@ -4236,17 +4233,16 @@ class AppLocalizationsKo extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => '줌 인'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => '줌 아웃'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => '중심 지도'; @override - String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + String get chrome_bluetoothRequiresChromium => '웹 블루투스는 크롬 브라우저가 필요합니다.'; @override String channels_communityShortId(String id) { @@ -4254,8 +4250,8 @@ class AppLocalizationsKo extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS 확인 완료'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => '추론된 위치'; } diff --git a/lib/l10n/app_localizations_nl.dart b/lib/l10n/app_localizations_nl.dart index 6f4d9fbb..94d5e1e3 100644 --- a/lib/l10n/app_localizations_nl.dart +++ b/lib/l10n/app_localizations_nl.dart @@ -93,22 +93,22 @@ class AppLocalizationsNl extends AppLocalizations { String get common_disable => 'Uitschakelen'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Achterhalen/Annuleren'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Verzonden'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Leverd'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Verzenden'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Niet verzonden'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Hearsay, herhaald'; @override String get common_reboot => 'Herstarten'; @@ -1005,13 +1005,13 @@ class AppLocalizationsNl extends AppLocalizations { String get contacts_newGroup => 'Nieuwe Groep'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Meer opties'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Zoek contactpersonen'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Zoeken'; @override String get contacts_groupName => 'Groepnaam'; @@ -1516,74 +1516,74 @@ class AppLocalizationsNl extends AppLocalizations { String get chat_fullPath => 'Volledige Pad'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Routeplanning'; @override String get routing_modeAuto => 'Auto'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Overstroming'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Handleiding'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Selecteert automatisch het bekendste pad, en gebruikt een flood-algoritme als er geen bekend pad is.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Uitzendingen via elke zender. De meest betrouwbare methode, maar vereist meer uitzendtijd.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Stuurt altijd de exacte route die u heeft aangegeven.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Huidige route'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Direct – zonder tussenliggende schakels'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Er is nog geen route gevonden. De berichten blijven binnenkomen totdat een route is ontdekt.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => 'Uitgestoten via elke zender.'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Pad bewerken'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Vergeet het pad'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Bekende routes'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => 'Maak een route om er naartoe te gaan.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'In gebruik'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Sterke eerste sprong'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Een goede eerste stap'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Een goede eerste hop'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Is geleverd'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => 'Hears via een overstroming'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Niet getest'; @override String routing_lastWorked(String when) { @@ -1591,60 +1591,60 @@ class AppLocalizationsNl extends AppLocalizations { } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'nooit bevestigd'; @override String routing_deliveryCounts(int successes, int failures) { - return '$successes delivered, $failures failed'; + return '$successes zijn behaald, $failures zijn mislukt'; } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Levering bij overstroming'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Pad creëren'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count van 64 hopgranen'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Er zijn nog geen hop toegevoegd. Klik op de onderstaande knoppen om ze in de juiste volgorde toe te voegen, of sla de bestelling op zonder hop om deze direct te versturen.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'Voeg hop toe in de juiste volgorde.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Zoek naar herhaaldelijke zenders'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Geavanceerd: ruwe hex-pad'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Hex-voorkanten'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Twee hex-tekens per stap, gescheiden door komma\'s'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Ongeldig: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Maximaal 64 hopken'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Gebruik deze route.'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Verwijder de hop'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Onbekend type zender'; @override String get chat_pathSavedLocally => @@ -4441,17 +4441,17 @@ class AppLocalizationsNl extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Inzoomen'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Inzoomen'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Centraal overzicht'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth vereist een Chromium-browser.'; @override String channels_communityShortId(String id) { @@ -4459,8 +4459,8 @@ class AppLocalizationsNl extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS-locatie bevestigd'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Afgeleide positie'; } diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index f582d2df..b95dcbfc 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -93,22 +93,22 @@ class AppLocalizationsPl extends AppLocalizations { String get common_disable => 'Wyłącz'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Wycofaj'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Wysłane'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Dostarczone'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Wysyłanie'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Nie udało się wysłać'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Usłyszałem to wielokrotnie'; @override String get common_reboot => 'Uruchom ponownie'; @@ -1023,13 +1023,13 @@ class AppLocalizationsPl extends AppLocalizations { String get contacts_newGroup => 'Nowa Grupa'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Więcej opcji'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Wyszukaj kontakty'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Zaawansowane wyszukiwanie'; @override String get contacts_groupName => 'Nazwa grupy'; @@ -1541,82 +1541,85 @@ class AppLocalizationsPl extends AppLocalizations { String get chat_fullPath => 'Pełna ścieżka'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Planowanie tras'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Samochód'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Powódź'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Instrukcja obsługi'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Automatycznie wybiera najpopularniejszą ścieżkę, a w przypadku braku znanej, przechodzi do trybu \"przepływu\".'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Transmisje za pośrednictwem każdego repeatera. Najbardziej niezawodna metoda, ale zużywa więcej czasu transmisji.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Zawsze prowadzi dokładnie po trasie, którą określiłeś.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Obecna trasa'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => + 'Bezpośrednio – bez pośrednictwa repeaterów'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Na razie nie ma żadnej ścieżki. Komunikacja trwa do momentu, gdy zostanie odkryta trasa.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => + 'Transmisja za pośrednictwem każdego urządzenia powielającego'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Edytuj ścieżkę'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Zapomnij o ścieżce'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Znane trasy'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Wybierz ścieżkę, aby przełączyć się na nią.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'W użyciu'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Silny pierwszy skok'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Świetny początek'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Świetny pierwszy krzak'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Zostało dostarczone'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => 'Usłyszano dzięki doniesieniom'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Nieużywany'; @override String routing_lastWorked(String when) { - return 'worked $when'; + return 'pracował $when'; } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'nigdy nie zostało potwierdzone'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1624,52 +1627,53 @@ class AppLocalizationsPl extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Dostawa w przypadku powodzi'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Stworzenie ścieżki'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count z 64 rodzajów chmielu'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Na razie nie dodano żadnych chmielu. Aby dodać je w odpowiedniej kolejności, kliknij w odpowiednie przyciski poniżej, lub zapisz przepis bez chmielu, aby wysłać go bezpośrednio.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'Dodawaj chmiel zgodnie z kolejnością.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Funkcje powtarzania'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => + 'Zaawansowane: ścieżka w formacie szesnastkowym'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Prefiksy heksadecymalne'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Dwa znaki szesnastkowe na każdym kroku, oddzielone przecinkami'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Nieprawidłowe: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Maksymalnie 64 hopów'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Użyj tej ścieżki.'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Usuń dziką psiankę'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Nieznany repeater'; @override String get chat_pathSavedLocally => @@ -4475,17 +4479,17 @@ class AppLocalizationsPl extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Przybliż'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Przybliż z powrotem'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Mapa centrum'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth wymaga przeglądarki Chromium.'; @override String channels_communityShortId(String id) { @@ -4493,8 +4497,8 @@ class AppLocalizationsPl extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS potwierdzone'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Wywnioskowana pozycja'; } diff --git a/lib/l10n/app_localizations_pt.dart b/lib/l10n/app_localizations_pt.dart index 23495d55..09a4fa79 100644 --- a/lib/l10n/app_localizations_pt.dart +++ b/lib/l10n/app_localizations_pt.dart @@ -93,22 +93,22 @@ class AppLocalizationsPt extends AppLocalizations { String get common_disable => 'Desativar'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Desfazer'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Enviado'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Entregue'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Enviar'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Falhou ao enviar'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Ouvi repetidamente'; @override String get common_reboot => 'Reiniciar'; @@ -1013,13 +1013,13 @@ class AppLocalizationsPt extends AppLocalizations { String get contacts_newGroup => 'Novo Grupo'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Mais opções'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Pesquisar contatos'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Pesquisa avançada'; @override String get contacts_groupName => 'Nome do grupo'; @@ -1526,74 +1526,77 @@ class AppLocalizationsPt extends AppLocalizations { String get chat_fullPath => 'Caminho Completo'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Rotas'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Carro'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Inundação'; @override String get routing_modeManual => 'Manual'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Seleciona automaticamente o caminho mais conhecido, e, se nenhum caminho conhecido for encontrado, utiliza a estratégia de \"inundação\".'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Transmissão através de todos os repetidores. É a opção mais confiável, mas utiliza mais tempo de transmissão.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Sempre segue exatamente o caminho que você define.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Rota atual'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Direto – sem saltos de repetidor'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Ainda não há um caminho definido. A mensagem continua a ser enviada até que uma rota seja encontrada.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => + 'Transmissão através de todos os repetidores'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Editar caminho'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Esqueça o caminho'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Rotas conhecidas'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Toque em um caminho para alternar para ele.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'Em uso'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Primeiro salto notável'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Primeiro salto bem-sucedido'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Primeira etapa bem-sucedida'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Foi entregue'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => + 'Informação obtida através de relatos generalizados.'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Não testado'; @override String routing_lastWorked(String when) { @@ -1601,7 +1604,7 @@ class AppLocalizationsPt extends AppLocalizations { } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'nunca confirmado'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1609,52 +1612,53 @@ class AppLocalizationsPt extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => + 'Entrega em áreas afetadas por inundações'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Criar Caminho'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count de 64 gramas de lúpulo'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Ainda não há lúpulos adicionados. Clique nos repetidores abaixo para adicioná-los na ordem desejada, ou salve sem adicionar lúpulos para enviar diretamente.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'Adicione os lúpulos na seguinte ordem.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Encontrar repetidores'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Avançado: caminho hexadecimal bruto'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Prefixos hexadecimais'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Dois caracteres hexadecimais por salto, separados por vírgulas.'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Inválido: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Máximo de 64 saltos'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Utilize este caminho.'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Remova o lúpulo'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Repetidor desconhecido'; @override String get chat_pathSavedLocally => @@ -4454,17 +4458,17 @@ class AppLocalizationsPt extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Ampliar'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Ampliar'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Mapa do centro'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'O Web Bluetooth requer um navegador Chromium.'; @override String channels_communityShortId(String id) { @@ -4472,8 +4476,8 @@ class AppLocalizationsPt extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS confirmado'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Posição inferida'; } diff --git a/lib/l10n/app_localizations_ru.dart b/lib/l10n/app_localizations_ru.dart index fe535172..6503c5c1 100644 --- a/lib/l10n/app_localizations_ru.dart +++ b/lib/l10n/app_localizations_ru.dart @@ -93,22 +93,22 @@ class AppLocalizationsRu extends AppLocalizations { String get common_disable => 'Выключить'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Отменить'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Отправлено'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Доставлено'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Отправка'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Не удалось отправить'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Услышал несколько раз'; @override String get common_reboot => 'Перезагрузить'; @@ -1014,13 +1014,13 @@ class AppLocalizationsRu extends AppLocalizations { String get contacts_newGroup => 'Новая группа'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Больше вариантов'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Найти контакты'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Закрыть поиск'; @override String get contacts_groupName => 'Имя группы'; @@ -1529,74 +1529,77 @@ class AppLocalizationsRu extends AppLocalizations { String get chat_fullPath => 'Полный маршрут'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Маршрутизация'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Авто'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Наводнение'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Инструкция'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Автоматически выбирает наиболее известный путь, и если такой путь неизвестен, использует алгоритм поиска пути.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Передача сигнала через все ретрансляторы. Самый надежный способ, но требует больше времени на передачу.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Всегда следует точно по указанному вами маршруту.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Текущий маршрут'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => + 'Прямое соединение – без использования ретрансляторов'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Пока нет пути. Следующее сообщение будет отправлено до тех пор, пока не будет обнаружен маршрут.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => 'Транслируется через все ретрансляторы'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Изменить путь'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Забудьте о маршруте'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Известные маршруты'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Создайте маршрут для переключения на этот пункт.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'В эксплуатации'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Сильный первый скачок'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Хорошее начало'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Первый хороший урожай'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Осуществлено'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => + 'Узнал из новостей, распространяющихся в интернете.'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Непроверенный'; @override String routing_lastWorked(String when) { @@ -1604,7 +1607,7 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'никогда не было подтверждено'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1612,52 +1615,55 @@ class AppLocalizationsRu extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Доставка при затоплении'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Создать маршрут'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count из 64 хмеля'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'На данный момент хмель еще не добавлен. Чтобы добавить его, нажмите на соответствующие кнопки ниже в нужном порядке, или сохраните рецепт без хмеля, чтобы отправить его напрямую.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => + 'Добавляйте хмель в соответствии с указанным порядком.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Поиск повторителей'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => + 'Продвинутый уровень: прямой путь в шестнадцатеричном формате'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Префиксы шестнадцатеричной системы'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Два шестнадцатеричных символа на каждом шаге, разделенные запятыми.'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Неверно: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => + 'Максимальное количество ингредиентов – 64'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Используйте этот путь'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Удалить хмель'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Неизвестный ретранслятор'; @override String get chat_pathSavedLocally => @@ -4468,26 +4474,26 @@ class AppLocalizationsRu extends AppLocalizations { String get contact_typeUnknown => 'Неизвестно'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Увеличить масштаб'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Увеличить масштаб'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Карта центра'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Для работы Web Bluetooth требуется браузер на основе Chromium.'; @override String channels_communityShortId(String id) { - return 'ID: $id...'; + return 'Идентификатор: $id...'; } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS подтверждено'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Выведенная позиция'; } diff --git a/lib/l10n/app_localizations_sk.dart b/lib/l10n/app_localizations_sk.dart index f15bcfc1..3bb7ac5f 100644 --- a/lib/l10n/app_localizations_sk.dart +++ b/lib/l10n/app_localizations_sk.dart @@ -93,22 +93,22 @@ class AppLocalizationsSk extends AppLocalizations { String get common_disable => 'Zakázať'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Zrušiť'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Odoslané'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Doručené'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Odoslanie'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Neúspešné odeslanie'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Slyšal som to opakovane'; @override String get common_reboot => 'Restartovať'; @@ -1002,13 +1002,13 @@ class AppLocalizationsSk extends AppLocalizations { String get contacts_newGroup => 'Nová skupina'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Ďalšie možnosti'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Vyhľadajte kontakty'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Zavrieť vyhľadávanie'; @override String get contacts_groupName => 'Názov skupiny'; @@ -1517,74 +1517,77 @@ class AppLocalizationsSk extends AppLocalizations { String get chat_fullPath => 'Celá cesta'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Navigácia'; @override String get routing_modeAuto => 'Auto'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Povodňová vlna'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Ručná príručka'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Automaticky vyberá najznámejší trasa, a ak žiadna nie je známa, použije náhodnú trasu.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Prenos prostredníctvom všetkých opakovačov. Najspoľahlivejší spôsob, ale vyžaduje viac času vysielania.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Vždy dodáva presne podľa zadaného trasy.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Aktuálna trasa'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Priamo – bez prechodných trás'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Zatiaľ neexistuje žiadna cesta. Nasledujúce správy budú pokračovať, kým sa nenájde trasa.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => + 'Prenos prostredníctvom každého opakovača'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Upraviť trasu'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Zabudnite na trasu'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Známe cesty'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Kliknite na cestu, aby ste sa k nej presunuli.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'V prevádzke'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Silný prvý krok'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Úspešný prvý krok'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Prvá, spravodlivá fáza'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Dosiahnutý úspech'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => + 'Zistil som to z informácií, ktoré som získal v dôsledku povodňovej situácie.'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Neotestované'; @override String routing_lastWorked(String when) { @@ -1592,7 +1595,7 @@ class AppLocalizationsSk extends AppLocalizations { } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'nikedy nebolo potvrdené'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1600,52 +1603,53 @@ class AppLocalizationsSk extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Doručenie v prípade povodní'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Vytvorenie cesty'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count z 64 chmelových zŕš'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Zatiaľ žiadne chmel. Kliknite na opakované, aby ste ich pridali postupne, alebo uložte bez chmelu, aby ste ho mohli poslať priamo.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'Pridávajte chmel podľa zadaného poriadku.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Hľadať opakované'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Pokročilé: pôvodná hexová cesta'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Prefiksy pre hexadecimálne čísla'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Dve hexové čísla na každý krok, oddelené čiarkami'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Neplatné: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Maximálne 64 krokov'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Použite túto cestu'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Odstráňte chmel'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => + 'Neznáme zariadenie na opakované vysielanie'; @override String get chat_pathSavedLocally => @@ -4436,17 +4440,17 @@ class AppLocalizationsSk extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Zväčšiť'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Zmenť zamer zblízka'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Mapa centra'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth vyžaduje prehliadač Chromium.'; @override String channels_communityShortId(String id) { @@ -4454,8 +4458,8 @@ class AppLocalizationsSk extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS potvrdilo'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Odvodená poloha'; } diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index c2dc192b..e1efed05 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -93,22 +93,23 @@ class AppLocalizationsSl extends AppLocalizations { String get common_disable => 'Izklopiti'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Preobrn'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Pošljeno'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Dostavljeno'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Pošiljanje'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => + 'Uspešno ni bilo mogo, da se sporočilo pošlje'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Slišal sem večkrat'; @override String get common_reboot => 'Ponoviti'; @@ -1001,13 +1002,13 @@ class AppLocalizationsSl extends AppLocalizations { String get contacts_newGroup => 'Nova skupina'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Več možnosti'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Iskanje kontaktov'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Izklopi iskanje'; @override String get contacts_groupName => 'Ime skupine'; @@ -1514,82 +1515,82 @@ class AppLocalizationsSl extends AppLocalizations { String get chat_fullPath => 'Polna pot'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Navigacija'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Avto'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Poplavo'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Navodilo'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Samodejno izbere najbolj poznano pot, in sicer, ko ni na voljo nobena.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Prenosi preko vseh repetitorjev. Najzanesljivejši način, vendar zahteva več časa.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Vedno sledi natančni poti, ki jo ste določili.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Trenutna pot'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Neposredno – brez prehodov'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Žep trenutno ni mogoče najti. Naslednje sporočilo bo posredovano, dokler ne bo ugotovljeno, kje je pot.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => 'Prenos preko vseh repetitiv'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Uredi pot'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Pozabi na pot'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Poznati poti'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => 'Kliknite na pot, da jo izberete.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'V uporabi'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Močan prvi korak'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Prva uspešna faza'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Prva, uspešna faza'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Izpolnil'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => 'Slišano preko poplave'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Ne preizkušen'; @override String routing_lastWorked(String when) { - return 'worked $when'; + return 'delal/a $when'; } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'nikoli ni bilo potrjeno'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1597,52 +1598,52 @@ class AppLocalizationsSl extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Dostava zaradi poplave'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Izgradnja poti'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count od 64 različnih sort hropa'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Še niso dodani hmelji. Za dodajanje hmelja v vrstnem redu kliknite na povezavo spodaj, ali pa shranite brez dodanega hmelja, da ga lahko posredujete neposredno.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'Dodajte suho travo v skladu s postopkom.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Iskanje ponovitev'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Napredno: surovi šestnajstni pot'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Predfiks za heksadecimalno šifro'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Dva šestbitna znaka na vsak skok, ločena z vejico'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Neveljaven: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Največ 64 hopov'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Uporabite to poto'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Odstranite hmelj'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Neznani ponovitelj'; @override String get chat_pathSavedLocally => @@ -4438,17 +4439,17 @@ class AppLocalizationsSl extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Povečaj'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Povečajte pogled'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Krajšarska karta'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth zahteva brskalnik Chromium.'; @override String channels_communityShortId(String id) { @@ -4456,8 +4457,8 @@ class AppLocalizationsSl extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS potrdilo'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Izpeljana lokacija'; } diff --git a/lib/l10n/app_localizations_sv.dart b/lib/l10n/app_localizations_sv.dart index ef0df94c..a95e8903 100644 --- a/lib/l10n/app_localizations_sv.dart +++ b/lib/l10n/app_localizations_sv.dart @@ -93,22 +93,22 @@ class AppLocalizationsSv extends AppLocalizations { String get common_disable => 'Inaktivera'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Ångra'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Sen'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Levererad'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Skicka'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Misslyckades med att skicka'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Hördes upprepade gånger'; @override String get common_reboot => 'Start om'; @@ -996,13 +996,13 @@ class AppLocalizationsSv extends AppLocalizations { String get contacts_newGroup => 'Ny grupp'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Fler alternativ'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Sök efter kontakter'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Avancerad sökning'; @override String get contacts_groupName => 'Gruppnamn'; @@ -1508,82 +1508,82 @@ class AppLocalizationsSv extends AppLocalizations { String get chat_fullPath => 'Fullständig sökväg'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Ruttplanering'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Bil'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Översvämning'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Instruktioner'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Väljer automatiskt den bästa kända vägen, och använder en \"flooding\"-strategi om ingen väg är känd.'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Sändningar via alla repetrar. Det mest pålitliga alternativet, men kräver mer sändtid.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Skickar alltid den exakta väg du har angivit.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Nuvarande rutt'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => 'Direkt – utan mellanliggande routrar'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Ingen väg hittad ännu. Nästa meddelande skickas tills en rutt har upptäckts.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => 'Sändas via alla repetrar'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Redigera sökväg'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Glöm vägen'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Kända vägar'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => 'Välj en väg för att byta till den.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'I användning'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'En stark start'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Bra första steg'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Bra första hopp'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Har levererat'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => 'Fått information via nyhetsflöde'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Ej testat'; @override String routing_lastWorked(String when) { - return 'worked $when'; + return 'arbetade $when'; } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'aldrig bekräftat'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1591,52 +1591,52 @@ class AppLocalizationsSv extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Leverans vid översvämningsområde'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Skapa väg'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count av 64 humlor'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Inga humle än. Använd knapparna nedan för att lägga till dem i rätt ordning, eller spara utan humle för att skicka direkt.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'Tillsätt humlen i rätt ordning.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Sök efter återupptagna samtal'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => 'Avancerat: rå hex-sökväg'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => 'Hex-prefikser'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Två hex-tecken per steg, separerade med kommatecken.'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Ogiltigt: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Maximalt 64 humlörter'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Använd denna väg'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Ta bort humlen'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Okänd förstärkare'; @override String get chat_pathSavedLocally => @@ -4413,17 +4413,17 @@ class AppLocalizationsSv extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Zooma in'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Zooma ut'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Kartöversikt'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth kräver en Chromium-baserad webbläsare.'; @override String channels_communityShortId(String id) { @@ -4431,8 +4431,8 @@ class AppLocalizationsSv extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS-verifierat'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Antagen position'; } diff --git a/lib/l10n/app_localizations_uk.dart b/lib/l10n/app_localizations_uk.dart index beb14024..989acdb8 100644 --- a/lib/l10n/app_localizations_uk.dart +++ b/lib/l10n/app_localizations_uk.dart @@ -93,22 +93,22 @@ class AppLocalizationsUk extends AppLocalizations { String get common_disable => 'Вимкнути'; @override - String get common_undo => 'Undo'; + String get common_undo => 'Скасувати'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => 'Надіслано'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => 'Доставлено'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => 'Надсилання'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => 'Не вдалося надіслати'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => 'Почув неодноразово'; @override String get common_reboot => 'Перезавантажити'; @@ -1009,13 +1009,13 @@ class AppLocalizationsUk extends AppLocalizations { String get contacts_newGroup => 'Нова група'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => 'Більше можливостей'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => 'Пошук контактів'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => 'Закрити пошук'; @override String get contacts_groupName => 'Назва групи'; @@ -1524,74 +1524,76 @@ class AppLocalizationsUk extends AppLocalizations { String get chat_fullPath => 'Повний шлях'; @override - String get routing_title => 'Routing'; + String get routing_title => 'Маршрутизація'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => 'Автомобіль'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => 'Повені'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => 'Інструкція'; @override String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + 'Автоматично обирає найкращий відомий шлях, та у разі відсутності відомого шляху, використовує алгоритм \"занурення\".'; @override String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + 'Передавання через усі ретранслятори. Найбільш надійний спосіб, але потребує більше часу.'; @override String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + 'Завжди доставляє точно за вказаним вами маршрутом.'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => 'Поточний маршрут'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => + 'Пряме з\'єднання – без проміжних ретрансляторів'; @override String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + 'Поки що немає жодного шляху. Повідомлення продовжуються надходити, поки не буде знайдено маршрут.'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => 'Поширення через усі ретранслятори'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => 'Редагувати шлях'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => 'Забудь про шлях'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => 'Відомі маршрути'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => + 'Виберіть опцію, щоб переключитися на неї.'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => 'У робочому стані'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => 'Сильний перший стрибок'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => 'Чудова перша спроба'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => 'Перший, але вдалий, крок'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => 'Доставлено'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => 'Дізнався через новини'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => 'Не протестовано'; @override String routing_lastWorked(String when) { @@ -1599,7 +1601,7 @@ class AppLocalizationsUk extends AppLocalizations { } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => 'ніколи не підтверджено'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1607,52 +1609,54 @@ class AppLocalizationsUk extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => 'Доставка під час повені'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => 'Створити маршрут'; @override String pathEditor_hopCounter(int count) { - return '$count of 64 hops'; + return '$count з 64 штук хмелю'; } @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + 'Ще не додано хміль. Натисніть на відповідні кнопки, щоб додати його в потрібному порядку, або збережіть рецепт без хмілю, щоб відправити його безпосередньо.'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => 'Додавайте хміль у наступній послідовності.'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => 'Пошук повторювачів'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => + 'Просунутий рівень: пряма шлях у форматі шестнадцяткової системи.'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => + 'Префікси для шестнадцяткової системи числення'; @override String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + 'Два шестизначні символи на кожний крок, розділені комами'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return 'Неправильно: $tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => 'Максимум 64 хмелеві колоди'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => 'Використовуйте цей шлях'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => 'Видалити хміль'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => 'Невідомий ретранслятор'; @override String get chat_pathSavedLocally => @@ -4469,17 +4473,17 @@ class AppLocalizationsUk extends AppLocalizations { String get contact_typeUnknown => 'Невідомо'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => 'Увійти в режим збільшення'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => 'Видалити зум'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => 'Карта центру'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth вимагає браузера на основі Chromium'; @override String channels_communityShortId(String id) { @@ -4487,8 +4491,8 @@ class AppLocalizationsUk extends AppLocalizations { } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => 'GPS підтверджено'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => 'Висновок щодо положення'; } diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index 41374057..bf4131b8 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -93,22 +93,22 @@ class AppLocalizationsZh extends AppLocalizations { String get common_disable => '禁用'; @override - String get common_undo => 'Undo'; + String get common_undo => '撤销'; @override - String get messageStatus_sent => 'Sent'; + String get messageStatus_sent => '发送'; @override - String get messageStatus_delivered => 'Delivered'; + String get messageStatus_delivered => '已送达'; @override - String get messageStatus_pending => 'Sending'; + String get messageStatus_pending => '发送'; @override - String get messageStatus_failed => 'Failed to send'; + String get messageStatus_failed => '发送失败'; @override - String get messageStatus_repeated => 'Heard repeated'; + String get messageStatus_repeated => '多次听到'; @override String get common_reboot => '重启'; @@ -945,13 +945,13 @@ class AppLocalizationsZh extends AppLocalizations { String get contacts_newGroup => '新建群聊'; @override - String get contacts_moreOptions => 'More options'; + String get contacts_moreOptions => '更多选择'; @override - String get contacts_searchOpen => 'Search contacts'; + String get contacts_searchOpen => '搜索联系人'; @override - String get contacts_searchClose => 'Close search'; + String get contacts_searchClose => '高级搜索'; @override String get contacts_groupName => '群聊名称'; @@ -1437,82 +1437,78 @@ class AppLocalizationsZh extends AppLocalizations { String get chat_fullPath => '完整路径'; @override - String get routing_title => 'Routing'; + String get routing_title => '路由'; @override - String get routing_modeAuto => 'Auto'; + String get routing_modeAuto => '汽车'; @override - String get routing_modeFlood => 'Flood'; + String get routing_modeFlood => '洪水'; @override - String get routing_modeManual => 'Manual'; + String get routing_modeManual => '手册'; @override - String get routing_modeAutoHint => - 'Picks the best known path automatically, flooding when none is known.'; + String get routing_modeAutoHint => '自动选择已知最佳路径,当没有已知路径时,则进行“洪水”搜索。'; @override - String get routing_modeFloodHint => - 'Broadcasts through every repeater. Most reliable, but uses more airtime.'; + String get routing_modeFloodHint => '通过所有中继站进行广播。 这种方式最可靠,但占用更多的时间。'; @override - String get routing_modeManualHint => - 'Always sends along the exact path you set.'; + String get routing_modeManualHint => '总是按照您设置的路径进行导航。'; @override - String get routing_currentRoute => 'Current route'; + String get routing_currentRoute => '当前路线'; @override - String get routing_directNoHops => 'Direct — no repeater hops'; + String get routing_directNoHops => '直接连接— 无中继跳'; @override - String get routing_noPathYet => - 'No path yet. The next message floods until a route is discovered.'; + String get routing_noPathYet => '目前还没有找到路径。直到找到路径,才会收到后续消息。'; @override - String get routing_floodBroadcast => 'Broadcast through every repeater'; + String get routing_floodBroadcast => '通过所有中继器进行广播'; @override - String get routing_editPath => 'Edit path'; + String get routing_editPath => '编辑路径'; @override - String get routing_forgetPath => 'Forget path'; + String get routing_forgetPath => '忘记原路'; @override - String get routing_knownPaths => 'Known paths'; + String get routing_knownPaths => '已知的路径'; @override - String get routing_knownPathsHint => 'Tap a path to switch to it.'; + String get routing_knownPathsHint => '点击该路径以切换到它。'; @override - String get routing_inUse => 'In use'; + String get routing_inUse => '使用中'; @override - String get routing_qualityStrong => 'Strong first hop'; + String get routing_qualityStrong => '强劲的初始阶段'; @override - String get routing_qualityGood => 'Good first hop'; + String get routing_qualityGood => '不错的开端'; @override - String get routing_qualityFair => 'Fair first hop'; + String get routing_qualityFair => '第一次尝试,结果良好'; @override - String get routing_qualityWorked => 'Has delivered'; + String get routing_qualityWorked => '已完成'; @override - String get routing_qualityFlood => 'Heard via flood'; + String get routing_qualityFlood => '通过新闻报道'; @override - String get routing_qualityUntested => 'Untested'; + String get routing_qualityUntested => '未经测试'; @override String routing_lastWorked(String when) { - return 'worked $when'; + return '工作于 $when'; } @override - String get routing_neverWorked => 'never confirmed'; + String get routing_neverWorked => '从未得到证实'; @override String routing_deliveryCounts(int successes, int failures) { @@ -1520,10 +1516,10 @@ class AppLocalizationsZh extends AppLocalizations { } @override - String get routing_floodDelivery => 'Flood delivery'; + String get routing_floodDelivery => '洪水配送'; @override - String get pathEditor_title => 'Build Path'; + String get pathEditor_title => '构建路径'; @override String pathEditor_hopCounter(int count) { @@ -1532,40 +1528,39 @@ class AppLocalizationsZh extends AppLocalizations { @override String get pathEditor_noHops => - 'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.'; + '目前还没有添加任何啤酒花。点击下面的“添加”按钮,按顺序添加,或者直接保存,不添加任何啤酒花。'; @override - String get pathEditor_addHops => 'Add hops in order'; + String get pathEditor_addHops => '按照顺序添加啤酒花'; @override - String get pathEditor_searchRepeaters => 'Search repeaters'; + String get pathEditor_searchRepeaters => '重复搜索'; @override - String get pathEditor_advancedHex => 'Advanced: raw hex path'; + String get pathEditor_advancedHex => '高级:原始十六进制路径'; @override - String get pathEditor_hexLabel => 'Hex prefixes'; + String get pathEditor_hexLabel => '十六进制前缀'; @override - String get pathEditor_hexHelper => - 'Two hex characters per hop, separated by commas'; + String get pathEditor_hexHelper => '每次跳跃,使用两个十六进制字符,用逗号分隔。'; @override String pathEditor_invalidTokens(String tokens) { - return 'Invalid: $tokens'; + return '无效:$tokens'; } @override - String get pathEditor_tooManyHops => 'Maximum 64 hops'; + String get pathEditor_tooManyHops => '最多 64 个跳跃'; @override - String get pathEditor_usePath => 'Use this path'; + String get pathEditor_usePath => '请使用此路径'; @override - String get pathEditor_removeHop => 'Remove hop'; + String get pathEditor_removeHop => '去除啤酒花'; @override - String get pathEditor_unknownHop => 'Unknown repeater'; + String get pathEditor_unknownHop => '未知的重复器'; @override String get chat_pathSavedLocally => '已本地保存,连接设备后可同步。'; @@ -4128,26 +4123,26 @@ class AppLocalizationsZh extends AppLocalizations { String get contact_typeUnknown => 'Unknown'; @override - String get map_zoomIn => 'Zoom in'; + String get map_zoomIn => '放大'; @override - String get map_zoomOut => 'Zoom out'; + String get map_zoomOut => '放大'; @override - String get map_centerMap => 'Center map'; + String get map_centerMap => '中心地图'; @override String get chrome_bluetoothRequiresChromium => - 'Web Bluetooth requires a Chromium browser'; + 'Web Bluetooth 需要 Chromium 浏览器'; @override String channels_communityShortId(String id) { - return 'ID: $id...'; + return 'ID:$id...'; } @override - String get pathTrace_legendGpsConfirmed => 'GPS confirmed'; + String get pathTrace_legendGpsConfirmed => '通过GPS确认'; @override - String get pathTrace_legendInferred => 'Inferred position'; + String get pathTrace_legendInferred => '推测的位置'; } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index dfcf03b1..7c72900b 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Aantal aanvragen", "telemetry_error": "Kan gegevens niet ophalen", "telemetry_noData": "Geen telemetriedata beschikbaar.", @@ -2353,5 +2353,98 @@ "chat_newMessages": "Nieuwe berichten", "chat_markAsUnread": "Markeer als ongelezen", "settings_companionDebugLogSubtitle": "BLE/TCP/USB commando's, antwoorden en ruwe data", - "repeater_chanUtil": "Gebruik van het kanaal" + "repeater_chanUtil": "Gebruik van het kanaal", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_sent": "Verzonden", + "common_undo": "Achterhalen/Annuleren", + "messageStatus_delivered": "Leverd", + "messageStatus_pending": "Verzenden", + "messageStatus_failed": "Niet verzonden", + "messageStatus_repeated": "Hearsay, herhaald", + "contacts_moreOptions": "Meer opties", + "contacts_searchOpen": "Zoek contactpersonen", + "contacts_searchClose": "Zoeken", + "routing_title": "Routeplanning", + "routing_modeAuto": "Auto", + "routing_modeFlood": "Overstroming", + "routing_modeManual": "Handleiding", + "routing_modeAutoHint": "Selecteert automatisch het bekendste pad, en gebruikt een flood-algoritme als er geen bekend pad is.", + "routing_modeFloodHint": "Uitzendingen via elke zender. De meest betrouwbare methode, maar vereist meer uitzendtijd.", + "routing_modeManualHint": "Stuurt altijd de exacte route die u heeft aangegeven.", + "routing_currentRoute": "Huidige route", + "routing_directNoHops": "Direct – zonder tussenliggende schakels", + "routing_noPathYet": "Er is nog geen route gevonden. De berichten blijven binnenkomen totdat een route is ontdekt.", + "routing_floodBroadcast": "Uitgestoten via elke zender.", + "routing_editPath": "Pad bewerken", + "routing_forgetPath": "Vergeet het pad", + "routing_knownPaths": "Bekende routes", + "routing_knownPathsHint": "Maak een route om er naartoe te gaan.", + "routing_inUse": "In gebruik", + "routing_qualityStrong": "Sterke eerste sprong", + "routing_qualityGood": "Een goede eerste stap", + "routing_qualityFair": "Een goede eerste hop", + "routing_qualityWorked": "Is geleverd", + "routing_qualityFlood": "Hears via een overstroming", + "routing_qualityUntested": "Niet getest", + "routing_neverWorked": "nooit bevestigd", + "routing_deliveryCounts": "{successes} zijn behaald, {failures} zijn mislukt", + "routing_floodDelivery": "Levering bij overstroming", + "pathEditor_title": "Pad creëren", + "pathEditor_hopCounter": "{count} van 64 hopgranen", + "pathEditor_noHops": "Er zijn nog geen hop toegevoegd. Klik op de onderstaande knoppen om ze in de juiste volgorde toe te voegen, of sla de bestelling op zonder hop om deze direct te versturen.", + "pathEditor_addHops": "Voeg hop toe in de juiste volgorde.", + "pathEditor_searchRepeaters": "Zoek naar herhaaldelijke zenders", + "pathEditor_advancedHex": "Geavanceerd: ruwe hex-pad", + "pathEditor_hexLabel": "Hex-voorkanten", + "pathEditor_hexHelper": "Twee hex-tekens per stap, gescheiden door komma's", + "pathEditor_invalidTokens": "Ongeldig: {tokens}", + "pathEditor_tooManyHops": "Maximaal 64 hopken", + "pathEditor_usePath": "Gebruik deze route.", + "pathEditor_removeHop": "Verwijder de hop", + "pathEditor_unknownHop": "Onbekend type zender", + "map_zoomIn": "Inzoomen", + "routing_lastWorked": "worked {when}", + "map_zoomOut": "Inzoomen", + "map_centerMap": "Centraal overzicht", + "chrome_bluetoothRequiresChromium": "Web Bluetooth vereist een Chromium-browser.", + "channels_communityShortId": "ID: {id}...", + "pathTrace_legendGpsConfirmed": "GPS-locatie bevestigd", + "pathTrace_legendInferred": "Afgeleide positie" } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 2dcdc7d8..92fc6797 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -1326,7 +1326,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Liczba żądań", "telemetry_error": "Nie udało się pobrać danych", "telemetry_noData": "Brak dostępnych danych telemetrycznych.", @@ -2391,5 +2391,98 @@ "settings_companionDebugLogSubtitle": "Polecenia, odpowiedzi i surowe dane związane z protokołami BLE/TCP/USB", "chat_markAsUnread": "Oznacz jako nieprzeczytane", "settings_companionDebugLog": "Log debugowania (dla pomocy w rozwiązywaniu problemów)", - "repeater_chanUtil": "Wykorzystanie kanału" + "repeater_chanUtil": "Wykorzystanie kanału", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_sent": "Wysłane", + "messageStatus_delivered": "Dostarczone", + "messageStatus_pending": "Wysyłanie", + "common_undo": "Wycofaj", + "messageStatus_failed": "Nie udało się wysłać", + "messageStatus_repeated": "Usłyszałem to wielokrotnie", + "contacts_moreOptions": "Więcej opcji", + "contacts_searchOpen": "Wyszukaj kontakty", + "contacts_searchClose": "Zaawansowane wyszukiwanie", + "routing_title": "Planowanie tras", + "routing_modeAuto": "Samochód", + "routing_modeFlood": "Powódź", + "routing_modeManual": "Instrukcja obsługi", + "routing_modeAutoHint": "Automatycznie wybiera najpopularniejszą ścieżkę, a w przypadku braku znanej, przechodzi do trybu \"przepływu\".", + "routing_modeFloodHint": "Transmisje za pośrednictwem każdego repeatera. Najbardziej niezawodna metoda, ale zużywa więcej czasu transmisji.", + "routing_modeManualHint": "Zawsze prowadzi dokładnie po trasie, którą określiłeś.", + "routing_currentRoute": "Obecna trasa", + "routing_directNoHops": "Bezpośrednio – bez pośrednictwa repeaterów", + "routing_noPathYet": "Na razie nie ma żadnej ścieżki. Komunikacja trwa do momentu, gdy zostanie odkryta trasa.", + "routing_floodBroadcast": "Transmisja za pośrednictwem każdego urządzenia powielającego", + "routing_editPath": "Edytuj ścieżkę", + "routing_forgetPath": "Zapomnij o ścieżce", + "routing_knownPaths": "Znane trasy", + "routing_knownPathsHint": "Wybierz ścieżkę, aby przełączyć się na nią.", + "routing_inUse": "W użyciu", + "routing_qualityStrong": "Silny pierwszy skok", + "routing_qualityGood": "Świetny początek", + "routing_qualityFair": "Świetny pierwszy krzak", + "routing_qualityWorked": "Zostało dostarczone", + "routing_qualityFlood": "Usłyszano dzięki doniesieniom", + "routing_qualityUntested": "Nieużywany", + "routing_lastWorked": "pracował {when}", + "routing_neverWorked": "nigdy nie zostało potwierdzone", + "routing_floodDelivery": "Dostawa w przypadku powodzi", + "pathEditor_title": "Stworzenie ścieżki", + "pathEditor_hopCounter": "{count} z 64 rodzajów chmielu", + "pathEditor_noHops": "Na razie nie dodano żadnych chmielu. Aby dodać je w odpowiedniej kolejności, kliknij w odpowiednie przyciski poniżej, lub zapisz przepis bez chmielu, aby wysłać go bezpośrednio.", + "pathEditor_addHops": "Dodawaj chmiel zgodnie z kolejnością.", + "pathEditor_searchRepeaters": "Funkcje powtarzania", + "pathEditor_advancedHex": "Zaawansowane: ścieżka w formacie szesnastkowym", + "pathEditor_hexLabel": "Prefiksy heksadecymalne", + "pathEditor_hexHelper": "Dwa znaki szesnastkowe na każdym kroku, oddzielone przecinkami", + "pathEditor_invalidTokens": "Nieprawidłowe: {tokens}", + "pathEditor_tooManyHops": "Maksymalnie 64 hopów", + "pathEditor_usePath": "Użyj tej ścieżki.", + "pathEditor_removeHop": "Usuń dziką psiankę", + "pathEditor_unknownHop": "Nieznany repeater", + "map_zoomIn": "Przybliż", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "map_zoomOut": "Przybliż z powrotem", + "map_centerMap": "Mapa centrum", + "chrome_bluetoothRequiresChromium": "Web Bluetooth wymaga przeglądarki Chromium.", + "channels_communityShortId": "ID: {id}...", + "pathTrace_legendGpsConfirmed": "GPS potwierdzone", + "pathTrace_legendInferred": "Wywnioskowana pozycja" } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 9dff4417..e9c72cf4 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Número de solicitações", "telemetry_error": "Não foi possível obter os dados", "telemetry_noData": "Não estão disponíveis dados de telemetria.", @@ -2353,5 +2353,98 @@ "settings_companionDebugLogSubtitle": "Comandos, respostas e dados brutos para protocolos BLE/TCP/USB", "chat_markAsUnread": "Marcar como não lido", "chat_newMessages": "Novas mensagens", - "repeater_chanUtil": "Utilização do canal" + "repeater_chanUtil": "Utilização do canal", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "common_undo": "Desfazer", + "messageStatus_sent": "Enviado", + "messageStatus_pending": "Enviar", + "messageStatus_delivered": "Entregue", + "messageStatus_failed": "Falhou ao enviar", + "messageStatus_repeated": "Ouvi repetidamente", + "contacts_moreOptions": "Mais opções", + "contacts_searchOpen": "Pesquisar contatos", + "contacts_searchClose": "Pesquisa avançada", + "routing_title": "Rotas", + "routing_modeAuto": "Carro", + "routing_modeFlood": "Inundação", + "routing_modeManual": "Manual", + "routing_modeAutoHint": "Seleciona automaticamente o caminho mais conhecido, e, se nenhum caminho conhecido for encontrado, utiliza a estratégia de \"inundação\".", + "routing_modeFloodHint": "Transmissão através de todos os repetidores. É a opção mais confiável, mas utiliza mais tempo de transmissão.", + "routing_modeManualHint": "Sempre segue exatamente o caminho que você define.", + "routing_currentRoute": "Rota atual", + "routing_directNoHops": "Direto – sem saltos de repetidor", + "routing_noPathYet": "Ainda não há um caminho definido. A mensagem continua a ser enviada até que uma rota seja encontrada.", + "routing_floodBroadcast": "Transmissão através de todos os repetidores", + "routing_editPath": "Editar caminho", + "routing_forgetPath": "Esqueça o caminho", + "routing_knownPaths": "Rotas conhecidas", + "routing_knownPathsHint": "Toque em um caminho para alternar para ele.", + "routing_inUse": "Em uso", + "routing_qualityStrong": "Primeiro salto notável", + "routing_qualityGood": "Primeiro salto bem-sucedido", + "routing_qualityFair": "Primeira etapa bem-sucedida", + "routing_qualityWorked": "Foi entregue", + "routing_qualityFlood": "Informação obtida através de relatos generalizados.", + "routing_qualityUntested": "Não testado", + "routing_neverWorked": "nunca confirmado", + "routing_floodDelivery": "Entrega em áreas afetadas por inundações", + "pathEditor_title": "Criar Caminho", + "pathEditor_hopCounter": "{count} de 64 gramas de lúpulo", + "pathEditor_noHops": "Ainda não há lúpulos adicionados. Clique nos repetidores abaixo para adicioná-los na ordem desejada, ou salve sem adicionar lúpulos para enviar diretamente.", + "pathEditor_addHops": "Adicione os lúpulos na seguinte ordem.", + "pathEditor_searchRepeaters": "Encontrar repetidores", + "pathEditor_advancedHex": "Avançado: caminho hexadecimal bruto", + "pathEditor_hexLabel": "Prefixos hexadecimais", + "pathEditor_hexHelper": "Dois caracteres hexadecimais por salto, separados por vírgulas.", + "pathEditor_invalidTokens": "Inválido: {tokens}", + "routing_lastWorked": "worked {when}", + "pathEditor_tooManyHops": "Máximo de 64 saltos", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "pathEditor_usePath": "Utilize este caminho.", + "pathEditor_removeHop": "Remova o lúpulo", + "pathEditor_unknownHop": "Repetidor desconhecido", + "map_zoomIn": "Ampliar", + "map_zoomOut": "Ampliar", + "map_centerMap": "Mapa do centro", + "chrome_bluetoothRequiresChromium": "O Web Bluetooth requer um navegador Chromium.", + "channels_communityShortId": "ID: {id}...", + "pathTrace_legendGpsConfirmed": "GPS confirmado", + "pathTrace_legendInferred": "Posição inferida" } diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index 0ae3eda4..58ddacc8 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -722,7 +722,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Количество запросов", "telemetry_error": "Не удалось получить данные", "neighbors_receivedData": "Полученные данные о соседях", @@ -1656,5 +1656,98 @@ "repeater_cliHelpStatsCore": "(Только для серийного оборудования) Отображает основные статистические данные прошивки.", "settings_companionDebugLogSubtitle": "Команды, ответы и необработанные данные, используемые для протоколов BLE, TCP и USB.", "repeater_chanUtil": "Использование канала", - "settings_companionDebugLog": "Журнал отладки (для сопутствующего приложения)" + "settings_companionDebugLog": "Журнал отладки (для сопутствующего приложения)", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_pending": "Отправка", + "common_undo": "Отменить", + "messageStatus_delivered": "Доставлено", + "messageStatus_sent": "Отправлено", + "messageStatus_failed": "Не удалось отправить", + "messageStatus_repeated": "Услышал несколько раз", + "contacts_moreOptions": "Больше вариантов", + "contacts_searchOpen": "Найти контакты", + "contacts_searchClose": "Закрыть поиск", + "routing_title": "Маршрутизация", + "routing_modeAuto": "Авто", + "routing_modeFlood": "Наводнение", + "routing_modeManual": "Инструкция", + "routing_modeAutoHint": "Автоматически выбирает наиболее известный путь, и если такой путь неизвестен, использует алгоритм поиска пути.", + "routing_modeFloodHint": "Передача сигнала через все ретрансляторы. Самый надежный способ, но требует больше времени на передачу.", + "routing_modeManualHint": "Всегда следует точно по указанному вами маршруту.", + "routing_currentRoute": "Текущий маршрут", + "routing_directNoHops": "Прямое соединение – без использования ретрансляторов", + "routing_noPathYet": "Пока нет пути. Следующее сообщение будет отправлено до тех пор, пока не будет обнаружен маршрут.", + "routing_floodBroadcast": "Транслируется через все ретрансляторы", + "routing_editPath": "Изменить путь", + "routing_forgetPath": "Забудьте о маршруте", + "routing_knownPaths": "Известные маршруты", + "routing_knownPathsHint": "Создайте маршрут для переключения на этот пункт.", + "routing_inUse": "В эксплуатации", + "routing_qualityStrong": "Сильный первый скачок", + "routing_qualityGood": "Хорошее начало", + "routing_qualityFair": "Первый хороший урожай", + "routing_qualityWorked": "Осуществлено", + "routing_qualityFlood": "Узнал из новостей, распространяющихся в интернете.", + "routing_qualityUntested": "Непроверенный", + "routing_neverWorked": "никогда не было подтверждено", + "routing_floodDelivery": "Доставка при затоплении", + "pathEditor_title": "Создать маршрут", + "pathEditor_hopCounter": "{count} из 64 хмеля", + "pathEditor_noHops": "На данный момент хмель еще не добавлен. Чтобы добавить его, нажмите на соответствующие кнопки ниже в нужном порядке, или сохраните рецепт без хмеля, чтобы отправить его напрямую.", + "pathEditor_addHops": "Добавляйте хмель в соответствии с указанным порядком.", + "pathEditor_searchRepeaters": "Поиск повторителей", + "pathEditor_advancedHex": "Продвинутый уровень: прямой путь в шестнадцатеричном формате", + "pathEditor_hexLabel": "Префиксы шестнадцатеричной системы", + "pathEditor_hexHelper": "Два шестнадцатеричных символа на каждом шаге, разделенные запятыми.", + "pathEditor_invalidTokens": "Неверно: {tokens}", + "routing_lastWorked": "worked {when}", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "pathEditor_tooManyHops": "Максимальное количество ингредиентов – 64", + "pathEditor_usePath": "Используйте этот путь", + "pathEditor_removeHop": "Удалить хмель", + "pathEditor_unknownHop": "Неизвестный ретранслятор", + "map_zoomIn": "Увеличить масштаб", + "map_zoomOut": "Увеличить масштаб", + "map_centerMap": "Карта центра", + "chrome_bluetoothRequiresChromium": "Для работы Web Bluetooth требуется браузер на основе Chromium.", + "channels_communityShortId": "Идентификатор: {id}...", + "pathTrace_legendGpsConfirmed": "GPS подтверждено", + "pathTrace_legendInferred": "Выведенная позиция" } diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb index 3ade2e0d..2a8ac872 100644 --- a/lib/l10n/app_sk.arb +++ b/lib/l10n/app_sk.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Počet požiadaviek", "telemetry_error": "Nepodarilo sa získať údaje", "telemetry_noData": "Nejsú dostupné žiadne údaje z telemetrie.", @@ -2353,5 +2353,98 @@ "settings_companionDebugLogSubtitle": "Príkazy, odpovede a surové dáta pre protokoly BLE/TCP/USB", "settings_companionDebugLog": "Logovanie pre ladenie (sprievodný log)", "chat_newMessages": "Nové správy", - "repeater_chanUtil": "Využitie kanálu" + "repeater_chanUtil": "Využitie kanálu", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_sent": "Odoslané", + "messageStatus_delivered": "Doručené", + "messageStatus_pending": "Odoslanie", + "common_undo": "Zrušiť", + "messageStatus_failed": "Neúspešné odeslanie", + "messageStatus_repeated": "Slyšal som to opakovane", + "contacts_moreOptions": "Ďalšie možnosti", + "contacts_searchOpen": "Vyhľadajte kontakty", + "contacts_searchClose": "Zavrieť vyhľadávanie", + "routing_title": "Navigácia", + "routing_modeAuto": "Auto", + "routing_modeFlood": "Povodňová vlna", + "routing_modeManual": "Ručná príručka", + "routing_modeAutoHint": "Automaticky vyberá najznámejší trasa, a ak žiadna nie je známa, použije náhodnú trasu.", + "routing_modeFloodHint": "Prenos prostredníctvom všetkých opakovačov. Najspoľahlivejší spôsob, ale vyžaduje viac času vysielania.", + "routing_modeManualHint": "Vždy dodáva presne podľa zadaného trasy.", + "routing_currentRoute": "Aktuálna trasa", + "routing_directNoHops": "Priamo – bez prechodných trás", + "routing_noPathYet": "Zatiaľ neexistuje žiadna cesta. Nasledujúce správy budú pokračovať, kým sa nenájde trasa.", + "routing_floodBroadcast": "Prenos prostredníctvom každého opakovača", + "routing_editPath": "Upraviť trasu", + "routing_forgetPath": "Zabudnite na trasu", + "routing_knownPaths": "Známe cesty", + "routing_knownPathsHint": "Kliknite na cestu, aby ste sa k nej presunuli.", + "routing_inUse": "V prevádzke", + "routing_qualityStrong": "Silný prvý krok", + "routing_qualityGood": "Úspešný prvý krok", + "routing_qualityFair": "Prvá, spravodlivá fáza", + "routing_qualityWorked": "Dosiahnutý úspech", + "routing_qualityFlood": "Zistil som to z informácií, ktoré som získal v dôsledku povodňovej situácie.", + "routing_qualityUntested": "Neotestované", + "routing_neverWorked": "nikedy nebolo potvrdené", + "routing_floodDelivery": "Doručenie v prípade povodní", + "pathEditor_title": "Vytvorenie cesty", + "pathEditor_hopCounter": "{count} z 64 chmelových zŕš", + "pathEditor_noHops": "Zatiaľ žiadne chmel. Kliknite na opakované, aby ste ich pridali postupne, alebo uložte bez chmelu, aby ste ho mohli poslať priamo.", + "pathEditor_addHops": "Pridávajte chmel podľa zadaného poriadku.", + "pathEditor_searchRepeaters": "Hľadať opakované", + "pathEditor_advancedHex": "Pokročilé: pôvodná hexová cesta", + "pathEditor_hexLabel": "Prefiksy pre hexadecimálne čísla", + "pathEditor_hexHelper": "Dve hexové čísla na každý krok, oddelené čiarkami", + "routing_lastWorked": "worked {when}", + "pathEditor_invalidTokens": "Neplatné: {tokens}", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "pathEditor_tooManyHops": "Maximálne 64 krokov", + "pathEditor_usePath": "Použite túto cestu", + "pathEditor_removeHop": "Odstráňte chmel", + "pathEditor_unknownHop": "Neznáme zariadenie na opakované vysielanie", + "map_zoomIn": "Zväčšiť", + "map_zoomOut": "Zmenť zamer zblízka", + "map_centerMap": "Mapa centra", + "chrome_bluetoothRequiresChromium": "Web Bluetooth vyžaduje prehliadač Chromium.", + "channels_communityShortId": "ID: {id}...", + "pathTrace_legendGpsConfirmed": "GPS potvrdilo", + "pathTrace_legendInferred": "Odvodená poloha" } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index fa3e2676..0c7ce198 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Število zahtev", "telemetry_error": "Podatkov ni bilo mogoče pridobiti", "telemetry_noData": "Niso na voljo podatki o telemetriji.", @@ -2353,5 +2353,98 @@ "chat_markAsUnread": "Označiti kot neneobdelano", "chat_newMessages": "Nove novice", "settings_companionDebugLogSubtitle": "Navodila, odgovori in surova podatka za BLE/TCP/USB.", - "repeater_chanUtil": "Uporaba kanala" + "repeater_chanUtil": "Uporaba kanala", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "common_undo": "Preobrn", + "messageStatus_delivered": "Dostavljeno", + "messageStatus_sent": "Pošljeno", + "messageStatus_pending": "Pošiljanje", + "messageStatus_failed": "Uspešno ni bilo mogo, da se sporočilo pošlje", + "messageStatus_repeated": "Slišal sem večkrat", + "contacts_moreOptions": "Več možnosti", + "contacts_searchOpen": "Iskanje kontaktov", + "contacts_searchClose": "Izklopi iskanje", + "routing_title": "Navigacija", + "routing_modeAuto": "Avto", + "routing_modeFlood": "Poplavo", + "routing_modeManual": "Navodilo", + "routing_modeAutoHint": "Samodejno izbere najbolj poznano pot, in sicer, ko ni na voljo nobena.", + "routing_modeFloodHint": "Prenosi preko vseh repetitorjev. Najzanesljivejši način, vendar zahteva več časa.", + "routing_modeManualHint": "Vedno sledi natančni poti, ki jo ste določili.", + "routing_currentRoute": "Trenutna pot", + "routing_directNoHops": "Neposredno – brez prehodov", + "routing_noPathYet": "Žep trenutno ni mogoče najti. Naslednje sporočilo bo posredovano, dokler ne bo ugotovljeno, kje je pot.", + "routing_floodBroadcast": "Prenos preko vseh repetitiv", + "routing_editPath": "Uredi pot", + "routing_forgetPath": "Pozabi na pot", + "routing_knownPaths": "Poznati poti", + "routing_knownPathsHint": "Kliknite na pot, da jo izberete.", + "routing_inUse": "V uporabi", + "routing_qualityStrong": "Močan prvi korak", + "routing_qualityGood": "Prva uspešna faza", + "routing_qualityFair": "Prva, uspešna faza", + "routing_qualityWorked": "Izpolnil", + "routing_qualityFlood": "Slišano preko poplave", + "routing_qualityUntested": "Ne preizkušen", + "routing_lastWorked": "delal/a {when}", + "routing_neverWorked": "nikoli ni bilo potrjeno", + "routing_floodDelivery": "Dostava zaradi poplave", + "pathEditor_title": "Izgradnja poti", + "pathEditor_hopCounter": "{count} od 64 različnih sort hropa", + "pathEditor_noHops": "Še niso dodani hmelji. Za dodajanje hmelja v vrstnem redu kliknite na povezavo spodaj, ali pa shranite brez dodanega hmelja, da ga lahko posredujete neposredno.", + "pathEditor_addHops": "Dodajte suho travo v skladu s postopkom.", + "pathEditor_searchRepeaters": "Iskanje ponovitev", + "pathEditor_advancedHex": "Napredno: surovi šestnajstni pot", + "pathEditor_hexLabel": "Predfiks za heksadecimalno šifro", + "pathEditor_hexHelper": "Dva šestbitna znaka na vsak skok, ločena z vejico", + "pathEditor_invalidTokens": "Neveljaven: {tokens}", + "pathEditor_tooManyHops": "Največ 64 hopov", + "pathEditor_usePath": "Uporabite to poto", + "pathEditor_removeHop": "Odstranite hmelj", + "pathEditor_unknownHop": "Neznani ponovitelj", + "map_zoomIn": "Povečaj", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "map_zoomOut": "Povečajte pogled", + "map_centerMap": "Krajšarska karta", + "chrome_bluetoothRequiresChromium": "Web Bluetooth zahteva brskalnik Chromium.", + "channels_communityShortId": "ID: {id}...", + "pathTrace_legendGpsConfirmed": "GPS potrdilo", + "pathTrace_legendInferred": "Izpeljana lokacija" } diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index 1658f186..e5ae55d8 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -1316,7 +1316,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Antal förfrågningar", "telemetry_error": "Det gick inte att hämta data", "telemetry_noData": "Inga telemetridata tillgängliga.", @@ -2353,5 +2353,98 @@ "settings_companionDebugLog": "Följande felsökningslogg", "chat_newMessages": "Nya meddelanden", "settings_companionDebugLogSubtitle": "BLE/TCP/USB-kommandon, svar och rådata", - "repeater_chanUtil": "Användning av kanal" + "repeater_chanUtil": "Användning av kanal", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_sent": "Sen", + "messageStatus_delivered": "Levererad", + "common_undo": "Ångra", + "messageStatus_pending": "Skicka", + "messageStatus_failed": "Misslyckades med att skicka", + "messageStatus_repeated": "Hördes upprepade gånger", + "contacts_moreOptions": "Fler alternativ", + "contacts_searchOpen": "Sök efter kontakter", + "contacts_searchClose": "Avancerad sökning", + "routing_title": "Ruttplanering", + "routing_modeAuto": "Bil", + "routing_modeFlood": "Översvämning", + "routing_modeManual": "Instruktioner", + "routing_modeAutoHint": "Väljer automatiskt den bästa kända vägen, och använder en \"flooding\"-strategi om ingen väg är känd.", + "routing_modeFloodHint": "Sändningar via alla repetrar. Det mest pålitliga alternativet, men kräver mer sändtid.", + "routing_modeManualHint": "Skickar alltid den exakta väg du har angivit.", + "routing_currentRoute": "Nuvarande rutt", + "routing_directNoHops": "Direkt – utan mellanliggande routrar", + "routing_noPathYet": "Ingen väg hittad ännu. Nästa meddelande skickas tills en rutt har upptäckts.", + "routing_floodBroadcast": "Sändas via alla repetrar", + "routing_editPath": "Redigera sökväg", + "routing_forgetPath": "Glöm vägen", + "routing_knownPaths": "Kända vägar", + "routing_knownPathsHint": "Välj en väg för att byta till den.", + "routing_inUse": "I användning", + "routing_qualityStrong": "En stark start", + "routing_qualityGood": "Bra första steg", + "routing_qualityFair": "Bra första hopp", + "routing_qualityWorked": "Har levererat", + "routing_qualityFlood": "Fått information via nyhetsflöde", + "routing_qualityUntested": "Ej testat", + "routing_lastWorked": "arbetade {when}", + "routing_neverWorked": "aldrig bekräftat", + "routing_floodDelivery": "Leverans vid översvämningsområde", + "pathEditor_title": "Skapa väg", + "pathEditor_hopCounter": "{count} av 64 humlor", + "pathEditor_noHops": "Inga humle än. Använd knapparna nedan för att lägga till dem i rätt ordning, eller spara utan humle för att skicka direkt.", + "pathEditor_addHops": "Tillsätt humlen i rätt ordning.", + "pathEditor_searchRepeaters": "Sök efter återupptagna samtal", + "pathEditor_advancedHex": "Avancerat: rå hex-sökväg", + "pathEditor_hexLabel": "Hex-prefikser", + "pathEditor_hexHelper": "Två hex-tecken per steg, separerade med kommatecken.", + "pathEditor_invalidTokens": "Ogiltigt: {tokens}", + "pathEditor_tooManyHops": "Maximalt 64 humlörter", + "pathEditor_usePath": "Använd denna väg", + "pathEditor_removeHop": "Ta bort humlen", + "pathEditor_unknownHop": "Okänd förstärkare", + "map_zoomIn": "Zooma in", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "map_zoomOut": "Zooma ut", + "map_centerMap": "Kartöversikt", + "chrome_bluetoothRequiresChromium": "Web Bluetooth kräver en Chromium-baserad webbläsare.", + "channels_communityShortId": "ID: {id}...", + "pathTrace_legendGpsConfirmed": "GPS-verifierat", + "pathTrace_legendInferred": "Antagen position" } diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index 990ecb90..4ceecbb2 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -1327,7 +1327,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "Кількість запитів", "telemetry_error": "Не вдалося отримати дані", "telemetry_noData": "Дані телеметрії недоступні.", @@ -2333,5 +2333,98 @@ "settings_companionDebugLogSubtitle": "Команди, відповіді та необроблена інформація для протоколів BLE/TCP/USB", "chat_newMessages": "Нові повідомлення", "chat_markAsUnread": "Позначити як непрочитане", - "repeater_chanUtil": "Використання каналу" + "repeater_chanUtil": "Використання каналу", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_delivered": "Доставлено", + "messageStatus_sent": "Надіслано", + "common_undo": "Скасувати", + "messageStatus_pending": "Надсилання", + "messageStatus_failed": "Не вдалося надіслати", + "messageStatus_repeated": "Почув неодноразово", + "contacts_moreOptions": "Більше можливостей", + "contacts_searchOpen": "Пошук контактів", + "contacts_searchClose": "Закрити пошук", + "routing_title": "Маршрутизація", + "routing_modeAuto": "Автомобіль", + "routing_modeFlood": "Повені", + "routing_modeManual": "Інструкція", + "routing_modeAutoHint": "Автоматично обирає найкращий відомий шлях, та у разі відсутності відомого шляху, використовує алгоритм \"занурення\".", + "routing_modeFloodHint": "Передавання через усі ретранслятори. Найбільш надійний спосіб, але потребує більше часу.", + "routing_modeManualHint": "Завжди доставляє точно за вказаним вами маршрутом.", + "routing_currentRoute": "Поточний маршрут", + "routing_directNoHops": "Пряме з'єднання – без проміжних ретрансляторів", + "routing_noPathYet": "Поки що немає жодного шляху. Повідомлення продовжуються надходити, поки не буде знайдено маршрут.", + "routing_floodBroadcast": "Поширення через усі ретранслятори", + "routing_editPath": "Редагувати шлях", + "routing_forgetPath": "Забудь про шлях", + "routing_knownPaths": "Відомі маршрути", + "routing_knownPathsHint": "Виберіть опцію, щоб переключитися на неї.", + "routing_inUse": "У робочому стані", + "routing_qualityStrong": "Сильний перший стрибок", + "routing_qualityGood": "Чудова перша спроба", + "routing_qualityFair": "Перший, але вдалий, крок", + "routing_qualityWorked": "Доставлено", + "routing_qualityFlood": "Дізнався через новини", + "routing_qualityUntested": "Не протестовано", + "routing_neverWorked": "ніколи не підтверджено", + "routing_floodDelivery": "Доставка під час повені", + "pathEditor_title": "Створити маршрут", + "pathEditor_hopCounter": "{count} з 64 штук хмелю", + "pathEditor_noHops": "Ще не додано хміль. Натисніть на відповідні кнопки, щоб додати його в потрібному порядку, або збережіть рецепт без хмілю, щоб відправити його безпосередньо.", + "pathEditor_addHops": "Додавайте хміль у наступній послідовності.", + "pathEditor_searchRepeaters": "Пошук повторювачів", + "pathEditor_advancedHex": "Просунутий рівень: пряма шлях у форматі шестнадцяткової системи.", + "pathEditor_hexLabel": "Префікси для шестнадцяткової системи числення", + "pathEditor_hexHelper": "Два шестизначні символи на кожний крок, розділені комами", + "pathEditor_invalidTokens": "Неправильно: {tokens}", + "routing_lastWorked": "worked {when}", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "pathEditor_tooManyHops": "Максимум 64 хмелеві колоди", + "pathEditor_usePath": "Використовуйте цей шлях", + "pathEditor_removeHop": "Видалити хміль", + "pathEditor_unknownHop": "Невідомий ретранслятор", + "map_zoomIn": "Увійти в режим збільшення", + "map_zoomOut": "Видалити зум", + "map_centerMap": "Карта центру", + "chrome_bluetoothRequiresChromium": "Web Bluetooth вимагає браузера на основі Chromium", + "channels_communityShortId": "ID: {id}...", + "pathTrace_legendGpsConfirmed": "GPS підтверджено", + "pathTrace_legendInferred": "Висновок щодо положення" } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 170e7212..d1ee964c 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1346,7 +1346,7 @@ "telemetry_directionValue": "{degrees}°", "telemetry_concentrationValue": "{ppm} ppm", "telemetry_percentageValue": "{percent}%", - "telemetry_analogValue": "{value}", + "telemetry_analogValue": "{value}", "telemetry_autoFetchQuantity": "请求次数", "telemetry_error": "无法获取数据", "telemetry_noData": "暂无遥测数据", @@ -2358,5 +2358,98 @@ "settings_companionDebugLog": "调试日志", "chat_newMessages": "新的消息", "settings_companionDebugLogSubtitle": "BLE/TCP/USB 协议、响应和原始数据", - "repeater_chanUtil": "频道利用率" + "repeater_chanUtil": "频道利用率", + "@routing_lastWorked": { + "placeholders": { + "when": { + "type": "String" + } + } + }, + "@routing_deliveryCounts": { + "placeholders": { + "successes": { + "type": "int" + }, + "failures": { + "type": "int" + } + } + }, + "@pathEditor_hopCounter": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "@pathEditor_invalidTokens": { + "placeholders": { + "tokens": { + "type": "String" + } + } + }, + "@channels_communityShortId": { + "placeholders": { + "id": { + "type": "String" + } + } + }, + "messageStatus_sent": "发送", + "common_undo": "撤销", + "messageStatus_delivered": "已送达", + "messageStatus_pending": "发送", + "messageStatus_failed": "发送失败", + "messageStatus_repeated": "多次听到", + "contacts_moreOptions": "更多选择", + "contacts_searchOpen": "搜索联系人", + "contacts_searchClose": "高级搜索", + "routing_title": "路由", + "routing_modeAuto": "汽车", + "routing_modeFlood": "洪水", + "routing_modeManual": "手册", + "routing_modeAutoHint": "自动选择已知最佳路径,当没有已知路径时,则进行“洪水”搜索。", + "routing_modeFloodHint": "通过所有中继站进行广播。 这种方式最可靠,但占用更多的时间。", + "routing_modeManualHint": "总是按照您设置的路径进行导航。", + "routing_currentRoute": "当前路线", + "routing_directNoHops": "直接连接— 无中继跳", + "routing_noPathYet": "目前还没有找到路径。直到找到路径,才会收到后续消息。", + "routing_floodBroadcast": "通过所有中继器进行广播", + "routing_editPath": "编辑路径", + "routing_forgetPath": "忘记原路", + "routing_knownPaths": "已知的路径", + "routing_knownPathsHint": "点击该路径以切换到它。", + "routing_inUse": "使用中", + "routing_qualityStrong": "强劲的初始阶段", + "routing_qualityGood": "不错的开端", + "routing_qualityFair": "第一次尝试,结果良好", + "routing_qualityWorked": "已完成", + "routing_qualityFlood": "通过新闻报道", + "routing_qualityUntested": "未经测试", + "routing_lastWorked": "工作于 {when}", + "routing_neverWorked": "从未得到证实", + "routing_floodDelivery": "洪水配送", + "pathEditor_title": "构建路径", + "pathEditor_noHops": "目前还没有添加任何啤酒花。点击下面的“添加”按钮,按顺序添加,或者直接保存,不添加任何啤酒花。", + "pathEditor_addHops": "按照顺序添加啤酒花", + "pathEditor_searchRepeaters": "重复搜索", + "pathEditor_advancedHex": "高级:原始十六进制路径", + "pathEditor_hexLabel": "十六进制前缀", + "pathEditor_hexHelper": "每次跳跃,使用两个十六进制字符,用逗号分隔。", + "pathEditor_invalidTokens": "无效:{tokens}", + "pathEditor_tooManyHops": "最多 64 个跳跃", + "pathEditor_usePath": "请使用此路径", + "pathEditor_removeHop": "去除啤酒花", + "routing_deliveryCounts": "{successes} delivered, {failures} failed", + "pathEditor_hopCounter": "{count} of 64 hops", + "pathEditor_unknownHop": "未知的重复器", + "map_zoomIn": "放大", + "map_zoomOut": "放大", + "map_centerMap": "中心地图", + "chrome_bluetoothRequiresChromium": "Web Bluetooth 需要 Chromium 浏览器", + "channels_communityShortId": "ID:{id}...", + "pathTrace_legendGpsConfirmed": "通过GPS确认", + "pathTrace_legendInferred": "推测的位置" } diff --git a/lib/screens/app_debug_log_screen.dart b/lib/screens/app_debug_log_screen.dart index 719e5735..522a2c5c 100644 --- a/lib/screens/app_debug_log_screen.dart +++ b/lib/screens/app_debug_log_screen.dart @@ -75,7 +75,9 @@ class AppDebugLogScreen extends StatelessWidget { entry.formattedTime, style: TextStyle( fontSize: 10, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), ), ); @@ -95,7 +97,9 @@ class AppDebugLogScreen extends StatelessWidget { context.l10n.debugLog_noEntries, style: TextStyle( fontSize: 16, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), ), const SizedBox(height: 8), @@ -103,7 +107,9 @@ class AppDebugLogScreen extends StatelessWidget { context.l10n.debugLog_enableInSettings, style: TextStyle( fontSize: 12, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), ), ], diff --git a/lib/screens/app_settings_screen.dart b/lib/screens/app_settings_screen.dart index 76ce1f07..d1ccfd09 100644 --- a/lib/screens/app_settings_screen.dart +++ b/lib/screens/app_settings_screen.dart @@ -359,113 +359,129 @@ class AppSettingsScreen extends StatelessWidget { const Divider(height: 1), ListTile( title: Text(context.l10n.appSettings_maxRouteWeight), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(context.l10n.appSettings_maxRouteWeightSubtitle), - Slider( - value: settingsService.settings.maxRouteWeight, - min: 1, - max: 10, - divisions: 9, - label: settingsService.settings.maxRouteWeight - .round() - .toString(), - onChanged: (value) => - settingsService.setMaxRouteWeight(value), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(context.l10n.appSettings_maxRouteWeightSubtitle), + Slider( + value: settingsService.settings.maxRouteWeight, + min: 1, + max: 10, + divisions: 9, + label: settingsService.settings.maxRouteWeight + .round() + .toString(), + onChanged: (value) => + settingsService.setMaxRouteWeight(value), + ), + ], + ), ), - ], - ), - ), - const Divider(height: 1), - ListTile( - title: Text(context.l10n.appSettings_initialRouteWeight), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(context.l10n.appSettings_initialRouteWeightSubtitle), - Slider( - value: settingsService.settings.initialRouteWeight, - min: 0.5, - max: 5.0, - divisions: 9, - label: settingsService.settings.initialRouteWeight - .toStringAsFixed(1), - onChanged: (value) => - settingsService.setInitialRouteWeight(value), + const Divider(height: 1), + ListTile( + title: Text(context.l10n.appSettings_initialRouteWeight), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + context.l10n.appSettings_initialRouteWeightSubtitle, + ), + Slider( + value: settingsService.settings.initialRouteWeight, + min: 0.5, + max: 5.0, + divisions: 9, + label: settingsService.settings.initialRouteWeight + .toStringAsFixed(1), + onChanged: (value) => + settingsService.setInitialRouteWeight(value), + ), + ], + ), ), - ], - ), - ), - const Divider(height: 1), - ListTile( - title: Text(context.l10n.appSettings_routeWeightSuccessIncrement), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - context - .l10n - .appSettings_routeWeightSuccessIncrementSubtitle, + const Divider(height: 1), + ListTile( + title: Text( + context.l10n.appSettings_routeWeightSuccessIncrement, + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + context + .l10n + .appSettings_routeWeightSuccessIncrementSubtitle, + ), + Slider( + value: settingsService + .settings + .routeWeightSuccessIncrement, + min: 0.1, + max: 2.0, + divisions: 19, + label: settingsService + .settings + .routeWeightSuccessIncrement + .toStringAsFixed(1), + onChanged: (value) => settingsService + .setRouteWeightSuccessIncrement(value), + ), + ], + ), ), - Slider( - value: settingsService.settings.routeWeightSuccessIncrement, - min: 0.1, - max: 2.0, - divisions: 19, - label: settingsService.settings.routeWeightSuccessIncrement - .toStringAsFixed(1), - onChanged: (value) => - settingsService.setRouteWeightSuccessIncrement(value), + const Divider(height: 1), + ListTile( + title: Text( + context.l10n.appSettings_routeWeightFailureDecrement, + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + context + .l10n + .appSettings_routeWeightFailureDecrementSubtitle, + ), + Slider( + value: settingsService + .settings + .routeWeightFailureDecrement, + min: 0.1, + max: 2.0, + divisions: 19, + label: settingsService + .settings + .routeWeightFailureDecrement + .toStringAsFixed(1), + onChanged: (value) => settingsService + .setRouteWeightFailureDecrement(value), + ), + ], + ), ), - ], - ), - ), - const Divider(height: 1), - ListTile( - title: Text(context.l10n.appSettings_routeWeightFailureDecrement), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - context - .l10n - .appSettings_routeWeightFailureDecrementSubtitle, + const Divider(height: 1), + ListTile( + title: Text(context.l10n.appSettings_maxMessageRetries), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + context.l10n.appSettings_maxMessageRetriesSubtitle, + ), + Slider( + value: settingsService.settings.maxMessageRetries + .toDouble(), + min: 2, + max: 10, + divisions: 8, + label: settingsService.settings.maxMessageRetries + .toString(), + onChanged: (value) => settingsService + .setMaxMessageRetries(value.toInt()), + ), + ], + ), ), - Slider( - value: settingsService.settings.routeWeightFailureDecrement, - min: 0.1, - max: 2.0, - divisions: 19, - label: settingsService.settings.routeWeightFailureDecrement - .toStringAsFixed(1), - onChanged: (value) => - settingsService.setRouteWeightFailureDecrement(value), - ), - ], - ), - ), - const Divider(height: 1), - ListTile( - title: Text(context.l10n.appSettings_maxMessageRetries), - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text(context.l10n.appSettings_maxMessageRetriesSubtitle), - Slider( - value: settingsService.settings.maxMessageRetries - .toDouble(), - min: 2, - max: 10, - divisions: 8, - label: settingsService.settings.maxMessageRetries - .toString(), - onChanged: (value) => - settingsService.setMaxMessageRetries(value.toInt()), - ), - ], - ), - ), ], ), ), @@ -610,15 +626,25 @@ class AppSettingsScreen extends StatelessWidget { SwitchListTile( secondary: Icon( Icons.auto_awesome_outlined, - color: translationEnabled ? null : Theme.of(context).disabledColor, + color: translationEnabled + ? null + : Theme.of(context).disabledColor, ), title: Text( context.l10n.translation_autoIncomingTitle, - style: TextStyle(color: translationEnabled ? null : Theme.of(context).disabledColor), + style: TextStyle( + color: translationEnabled + ? null + : Theme.of(context).disabledColor, + ), ), subtitle: Text( context.l10n.translation_autoIncomingSubtitle, - style: TextStyle(color: translationEnabled ? null : Theme.of(context).disabledColor), + style: TextStyle( + color: translationEnabled + ? null + : Theme.of(context).disabledColor, + ), ), value: settings.autoTranslateIncomingMessages, onChanged: translationEnabled @@ -629,15 +655,25 @@ class AppSettingsScreen extends StatelessWidget { SwitchListTile( secondary: Icon( Icons.outgoing_mail, - color: translationEnabled ? null : Theme.of(context).disabledColor, + color: translationEnabled + ? null + : Theme.of(context).disabledColor, ), title: Text( context.l10n.translation_composerTitle, - style: TextStyle(color: translationEnabled ? null : Theme.of(context).disabledColor), + style: TextStyle( + color: translationEnabled + ? null + : Theme.of(context).disabledColor, + ), ), subtitle: Text( context.l10n.translation_composerSubtitle, - style: TextStyle(color: translationEnabled ? null : Theme.of(context).disabledColor), + style: TextStyle( + color: translationEnabled + ? null + : Theme.of(context).disabledColor, + ), ), value: settings.composerTranslationEnabled, onChanged: translationEnabled diff --git a/lib/screens/channel_chat_screen.dart b/lib/screens/channel_chat_screen.dart index c43c6c67..e2c63c35 100644 --- a/lib/screens/channel_chat_screen.dart +++ b/lib/screens/channel_chat_screen.dart @@ -512,149 +512,133 @@ class _ChannelChatScreenState extends State { const bodyFontSize = 14.0; final messageBody = LayoutBuilder( builder: (context, constraints) => Column( - crossAxisAlignment: isOutgoing - ? CrossAxisAlignment.end - : CrossAxisAlignment.start, - children: [ - Row( - mainAxisAlignment: isOutgoing - ? MainAxisAlignment.end - : MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!isOutgoing) ...[ - _buildAvatar(message.senderName), - const SizedBox(width: 8), - ], - Flexible( - child: GestureDetector( - onLongPress: () => _showMessageActions(message), - onSecondaryTapUp: PlatformInfo.isDesktop - ? (_) => _showMessageActions(message) - : null, - child: Container( - padding: gifId != null - ? const EdgeInsets.all(4) - : const EdgeInsets.symmetric(horizontal: 12, vertical: 8), - constraints: BoxConstraints( - maxWidth: constraints.maxWidth * 0.65, - ), - decoration: BoxDecoration( - color: isOutgoing - ? Theme.of(context).colorScheme.primaryContainer - : Theme.of(context).colorScheme.surfaceContainerHighest, - borderRadius: BorderRadius.circular(12), - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!isOutgoing) ...[ - Padding( - padding: gifId != null - ? const EdgeInsets.only( - left: 8, - top: 4, - bottom: 4, - ) - : EdgeInsets.zero, - child: Text( + crossAxisAlignment: isOutgoing + ? CrossAxisAlignment.end + : CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: isOutgoing + ? MainAxisAlignment.end + : MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!isOutgoing) ...[ + _buildAvatar(message.senderName), + const SizedBox(width: 8), + ], + Flexible( + child: GestureDetector( + onLongPress: () => _showMessageActions(message), + onSecondaryTapUp: PlatformInfo.isDesktop + ? (_) => _showMessageActions(message) + : null, + child: Container( + padding: gifId != null + ? const EdgeInsets.all(4) + : const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), + constraints: BoxConstraints( + maxWidth: constraints.maxWidth * 0.65, + ), + decoration: BoxDecoration( + color: isOutgoing + ? Theme.of(context).colorScheme.primaryContainer + : Theme.of( + context, + ).colorScheme.surfaceContainerHighest, + borderRadius: BorderRadius.circular(12), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!isOutgoing) ...[ + Padding( + padding: gifId != null + ? const EdgeInsets.only( + left: 8, + top: 4, + bottom: 4, + ) + : EdgeInsets.zero, + child: Text( + message.senderName, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), + if (gifId == null) const SizedBox(height: 4), + ], + if (message.replyToMessageId != null) ...[ + _buildReplyPreview(message, textScale), + const SizedBox(height: 8), + ], + if (poi != null) + _buildPoiMessage( + context, + poi, + isOutgoing, + textScale, message.senderName, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - color: Theme.of(context).colorScheme.primary, - ), - ), - ), - if (gifId == null) const SizedBox(height: 4), - ], - if (message.replyToMessageId != null) ...[ - _buildReplyPreview(message, textScale), - const SizedBox(height: 8), - ], - if (poi != null) - _buildPoiMessage( - context, - poi, - isOutgoing, - textScale, - message.senderName, - ) - else if (gifId != null) - Stack( - children: [ - ClipRRect( - borderRadius: BorderRadius.circular(8), - child: GifMessage( - url: - 'https://media.giphy.com/media/$gifId/giphy.gif', - backgroundColor: Colors.transparent, - fallbackTextColor: isOutgoing - ? Theme.of(context) - .colorScheme - .onPrimaryContainer - .withValues(alpha: 0.7) - : Theme.of(context).colorScheme.onSurface - .withValues(alpha: 0.6), - ), - ), - ], - ) - else - Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Flexible( - child: TranslatedMessageContent( - displayText: translatedDisplayText, - originalText: originalDisplayText, - style: TextStyle( - fontSize: bodyFontSize * textScale, - ), - originalStyle: TextStyle( - fontSize: bodyFontSize * textScale, - fontStyle: FontStyle.italic, - color: Theme.of(context).colorScheme.onSurface - .withValues(alpha: 0.72), + ) + else if (gifId != null) + Stack( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(8), + child: GifMessage( + url: + 'https://media.giphy.com/media/$gifId/giphy.gif', + backgroundColor: Colors.transparent, + fallbackTextColor: isOutgoing + ? Theme.of(context) + .colorScheme + .onPrimaryContainer + .withValues(alpha: 0.7) + : Theme.of(context).colorScheme.onSurface + .withValues(alpha: 0.6), ), ), - ), - ], - ), - if (enableTracing && displayPath.isNotEmpty) ...[ - const SizedBox(height: 4), - Padding( - padding: gifId != null - ? const EdgeInsets.symmetric(horizontal: 8) - : EdgeInsets.zero, - child: Text( - context.l10n.channels_via( - _formatPathPrefixes(displayPath), - ), - style: TextStyle( - fontSize: 11 * textScale, - color: Theme.of( - context, - ).colorScheme.onSurfaceVariant, - ), + ], + ) + else + Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Flexible( + child: TranslatedMessageContent( + displayText: translatedDisplayText, + originalText: originalDisplayText, + style: TextStyle( + fontSize: bodyFontSize * textScale, + ), + originalStyle: TextStyle( + fontSize: bodyFontSize * textScale, + fontStyle: FontStyle.italic, + color: Theme.of(context) + .colorScheme + .onSurface + .withValues(alpha: 0.72), + ), + ), + ), + ], ), - ), - ], - const SizedBox(height: 4), - Padding( - padding: gifId != null - ? const EdgeInsets.only( - left: 8, - right: 8, - bottom: 4, - ) - : EdgeInsets.zero, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text( - _formatTime(context, message.timestamp), + if (enableTracing && displayPath.isNotEmpty) ...[ + const SizedBox(height: 4), + Padding( + padding: gifId != null + ? const EdgeInsets.symmetric(horizontal: 8) + : EdgeInsets.zero, + child: Text( + context.l10n.channels_via( + _formatPathPrefixes(displayPath), + ), style: TextStyle( fontSize: 11 * textScale, color: Theme.of( @@ -662,18 +646,22 @@ class _ChannelChatScreenState extends State { ).colorScheme.onSurfaceVariant, ), ), - if (enableTracing && message.repeatCount > 0) ...[ - const SizedBox(width: 6), - Icon( - Icons.repeat, - size: 12 * textScale, - color: Theme.of( - context, - ).colorScheme.onSurfaceVariant, - ), - const SizedBox(width: 2), + ), + ], + const SizedBox(height: 4), + Padding( + padding: gifId != null + ? const EdgeInsets.only( + left: 8, + right: 8, + bottom: 4, + ) + : EdgeInsets.zero, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ Text( - '${message.repeatCount}', + _formatTime(context, message.timestamp), style: TextStyle( fontSize: 11 * textScale, color: Theme.of( @@ -681,43 +669,62 @@ class _ChannelChatScreenState extends State { ).colorScheme.onSurfaceVariant, ), ), + if (enableTracing && message.repeatCount > 0) ...[ + const SizedBox(width: 6), + Icon( + Icons.repeat, + size: 12 * textScale, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, + ), + const SizedBox(width: 2), + Text( + '${message.repeatCount}', + style: TextStyle( + fontSize: 11 * textScale, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, + ), + ), + ], + if (isOutgoing) ...[ + const SizedBox(width: 4), + MessageStatusIcon( + isAcked: + message.status == + ChannelMessageStatus.sent, + isRepeated: + message.status == + ChannelMessageStatus.sent && + displayPath.isNotEmpty, + isPending: + message.status == + ChannelMessageStatus.pending, + isFailed: + message.status == + ChannelMessageStatus.failed, + ), + ], ], - if (isOutgoing) ...[ - const SizedBox(width: 4), - MessageStatusIcon( - isAcked: - message.status == - ChannelMessageStatus.sent, - isRepeated: - message.status == - ChannelMessageStatus.sent && - displayPath.isNotEmpty, - isPending: - message.status == - ChannelMessageStatus.pending, - isFailed: - message.status == - ChannelMessageStatus.failed, - ), - ], - ], + ), ), - ), - ], + ], + ), ), ), ), + ], + ), + if (message.reactions.isNotEmpty) ...[ + const SizedBox(height: 4), + Padding( + padding: EdgeInsets.only(left: isOutgoing ? 0 : 48), + child: _buildReactionsDisplay(message), ), ], - ), - if (message.reactions.isNotEmpty) ...[ - const SizedBox(height: 4), - Padding( - padding: EdgeInsets.only(left: isOutgoing ? 0 : 48), - child: _buildReactionsDisplay(message), - ), ], - ], ), ); @@ -922,7 +929,9 @@ class _ChannelChatScreenState extends State { padding: EdgeInsets.zero, constraints: const BoxConstraints(minWidth: 40, minHeight: 40), onPressed: () { - final selfName = context.read().selfName ?? context.l10n.chat_me; + final selfName = + context.read().selfName ?? + context.l10n.chat_me; final fromName = isOutgoing ? selfName : senderName; final key = buildSharedMarkerKey( sourceId: 'channel:${widget.channel.index}', diff --git a/lib/screens/channel_message_path_screen.dart b/lib/screens/channel_message_path_screen.dart index 6e9f3882..e7f21459 100644 --- a/lib/screens/channel_message_path_screen.dart +++ b/lib/screens/channel_message_path_screen.dart @@ -106,7 +106,9 @@ class ChannelMessagePathScreen extends StatelessWidget { if (!hasHopDetails) Text( l10n.channelPath_noHopDetails, - style: TextStyle(color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ) else ..._buildHopTiles(context, hops), @@ -131,7 +133,11 @@ class ChannelMessagePathScreen extends StatelessWidget { style: Theme.of(context).textTheme.titleSmall, ), const SizedBox(height: 8), - _buildDetailRow(context, l10n.channelPath_senderLabel, message.senderName), + _buildDetailRow( + context, + l10n.channelPath_senderLabel, + message.senderName, + ), _buildDetailRow( context, l10n.channelPath_timeLabel, @@ -149,7 +155,11 @@ class ChannelMessagePathScreen extends StatelessWidget { _formatPathLabel(message.pathLength, l10n), ), if (observedLabel != null) - _buildDetailRow(context, l10n.channelPath_observedLabel, observedLabel), + _buildDetailRow( + context, + l10n.channelPath_observedLabel, + observedLabel, + ), ], ), ), @@ -261,7 +271,12 @@ class ChannelMessagePathScreen extends StatelessWidget { children: [ SizedBox( width: 70, - child: Text(label, style: TextStyle(color: Theme.of(context).colorScheme.onSurfaceVariant)), + child: Text( + label, + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), + ), ), Expanded(child: Text(value)), ], @@ -596,7 +611,9 @@ class _ChannelMessagePathMapScreenState if (points.isEmpty) Center( child: Card( - color: Theme.of(context).colorScheme.surface.withValues(alpha: 0.9), + color: Theme.of( + context, + ).colorScheme.surface.withValues(alpha: 0.9), child: Padding( padding: EdgeInsets.all(12), child: Text( @@ -667,7 +684,10 @@ class _ChannelMessagePathMapScreenState label, _formatPathPrefixes(selectedPath.pathBytes), ), - style: TextStyle(color: Theme.of(context).colorScheme.onSurfaceVariant, fontSize: 12), + style: TextStyle( + color: Theme.of(context).colorScheme.onSurfaceVariant, + fontSize: 12, + ), ), ], ), @@ -816,10 +836,10 @@ class _ChannelMessagePathMapScreenState } Widget _colorDot(Color color) => Container( - width: 10, - height: 10, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ); + width: 10, + height: 10, + decoration: BoxDecoration(color: color, shape: BoxShape.circle), + ); Widget _buildLegendCard( BuildContext context, @@ -855,7 +875,10 @@ class _ChannelMessagePathMapScreenState children: [ _colorDot(Colors.green), const SizedBox(width: 4), - Text(l10n.pathTrace_legendGpsConfirmed, style: const TextStyle(fontSize: 11)), + Text( + l10n.pathTrace_legendGpsConfirmed, + style: const TextStyle(fontSize: 11), + ), ], ), ], diff --git a/lib/screens/channels_screen.dart b/lib/screens/channels_screen.dart index b725cc61..36e82049 100644 --- a/lib/screens/channels_screen.dart +++ b/lib/screens/channels_screen.dart @@ -253,8 +253,7 @@ class _ChannelsScreenState extends State ), child: EmptyState( icon: Icons.search_off, - title: - context.l10n.channels_noChannelsFound, + title: context.l10n.channels_noChannelsFound, ), ), ], @@ -953,7 +952,11 @@ class _ChannelsScreenState extends State Channel.publicChannelPsk, ); Navigator.pop(dialogContext); - connector.setChannel(nextIndex, context.l10n.channels_public, psk); + connector.setChannel( + nextIndex, + context.l10n.channels_public, + psk, + ); if (context.mounted) { showDismissibleSnackBar( context, @@ -1240,7 +1243,8 @@ class _ChannelsScreenState extends State child: FilledButton( onPressed: () async { final name = nameController.text.trim(); - final publicLabel = context.l10n.channels_public; + final publicLabel = + context.l10n.channels_public; if (name.isEmpty) { showDismissibleSnackBar( context, @@ -1727,7 +1731,9 @@ class _ChannelsScreenState extends State ), title: Text(community.name), subtitle: Text( - context.l10n.channels_communityShortId(community.shortCommunityId), + context.l10n.channels_communityShortId( + community.shortCommunityId, + ), style: TextStyle( fontSize: 12, color: Theme.of( diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart index b96095bf..89310bbd 100644 --- a/lib/screens/chat_screen.dart +++ b/lib/screens/chat_screen.dart @@ -187,7 +187,11 @@ class _ChatScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min, children: [ - Text(contact.name, maxLines: 1, overflow: TextOverflow.ellipsis), + Text( + contact.name, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), GestureDetector( behavior: HitTestBehavior.opaque, onTap: () => @@ -1251,202 +1255,202 @@ class _MessageBubble extends StatelessWidget { children: [ LayoutBuilder( builder: (context, constraints) => GestureDetector( - onLongPress: onLongPress, - onSecondaryTapUp: PlatformInfo.isDesktop - ? (_) => onLongPress?.call() - : null, - child: Row( - mainAxisAlignment: isOutgoing - ? MainAxisAlignment.end - : MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!isOutgoing) ...[ - _buildAvatar(senderName, colorScheme), - const SizedBox(width: 8), - ], - Flexible( - child: Container( - padding: gifId != null - ? const EdgeInsets.all(4) - : const EdgeInsets.symmetric( - horizontal: 12, - vertical: 8, - ), - constraints: BoxConstraints( - maxWidth: constraints.maxWidth * 0.65, - ), - decoration: BoxDecoration( - color: bubbleColor, - borderRadius: BorderRadius.circular(16), - border: isFailed - ? Border.all(color: colorScheme.error) - : null, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (!isOutgoing) ...[ + onLongPress: onLongPress, + onSecondaryTapUp: PlatformInfo.isDesktop + ? (_) => onLongPress?.call() + : null, + child: Row( + mainAxisAlignment: isOutgoing + ? MainAxisAlignment.end + : MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!isOutgoing) ...[ + _buildAvatar(senderName, colorScheme), + const SizedBox(width: 8), + ], + Flexible( + child: Container( + padding: gifId != null + ? const EdgeInsets.all(4) + : const EdgeInsets.symmetric( + horizontal: 12, + vertical: 8, + ), + constraints: BoxConstraints( + maxWidth: constraints.maxWidth * 0.65, + ), + decoration: BoxDecoration( + color: bubbleColor, + borderRadius: BorderRadius.circular(16), + border: isFailed + ? Border.all(color: colorScheme.error) + : null, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!isOutgoing) ...[ + Padding( + padding: gifId != null + ? const EdgeInsets.only( + left: 8, + top: 4, + bottom: 4, + ) + : EdgeInsets.zero, + child: Text( + senderName, + style: TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + color: colorScheme.primary, + ), + ), + ), + if (gifId == null) const SizedBox(height: 4), + ], + if (poi != null) + _buildPoiMessage( + context, + poi, + textColor, + metaColor, + textScale, + senderName, + ) + else if (gifId != null) + Stack( + children: [ + ClipRRect( + borderRadius: BorderRadius.circular(12), + child: GifMessage( + url: + 'https://media.giphy.com/media/$gifId/giphy.gif', + backgroundColor: Colors.transparent, + fallbackTextColor: textColor.withValues( + alpha: 0.7, + ), + ), + ), + ], + ) + else + Row( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Flexible( + child: TranslatedMessageContent( + displayText: translatedDisplayText, + originalText: originalDisplayText, + style: TextStyle( + color: textColor, + fontSize: bodyFontSize * textScale, + ), + originalStyle: TextStyle( + color: textColor.withValues(alpha: 0.78), + fontSize: bodyFontSize * textScale, + ), + ), + ), + ], + ), + if (enableTracing && + isOutgoing && + message.retryCount > 0) ...[ + const SizedBox(height: 4), + Padding( + padding: gifId != null + ? const EdgeInsets.symmetric(horizontal: 8) + : EdgeInsets.zero, + child: Text( + context.l10n.chat_retryCount( + message.retryCount, + context + .read() + .settings + .maxMessageRetries, + ), + style: TextStyle( + fontSize: 10 * textScale, + color: metaColor, + fontWeight: FontWeight.w500, + ), + ), + ), + ], + const SizedBox(height: 4), Padding( padding: gifId != null ? const EdgeInsets.only( left: 8, - top: 4, + right: 8, bottom: 4, ) : EdgeInsets.zero, - child: Text( - senderName, - style: TextStyle( - fontSize: 12, - fontWeight: FontWeight.bold, - color: colorScheme.primary, - ), - ), - ), - if (gifId == null) const SizedBox(height: 4), - ], - if (poi != null) - _buildPoiMessage( - context, - poi, - textColor, - metaColor, - textScale, - senderName, - ) - else if (gifId != null) - Stack( - children: [ - ClipRRect( - borderRadius: BorderRadius.circular(12), - child: GifMessage( - url: - 'https://media.giphy.com/media/$gifId/giphy.gif', - backgroundColor: Colors.transparent, - fallbackTextColor: textColor.withValues( - alpha: 0.7, - ), - ), - ), - ], - ) - else - Row( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.end, - children: [ - Flexible( - child: TranslatedMessageContent( - displayText: translatedDisplayText, - originalText: originalDisplayText, - style: TextStyle( - color: textColor, - fontSize: bodyFontSize * textScale, - ), - originalStyle: TextStyle( - color: textColor.withValues(alpha: 0.78), - fontSize: bodyFontSize * textScale, - ), - ), - ), - ], - ), - if (enableTracing && - isOutgoing && - message.retryCount > 0) ...[ - const SizedBox(height: 4), - Padding( - padding: gifId != null - ? const EdgeInsets.symmetric(horizontal: 8) - : EdgeInsets.zero, - child: Text( - context.l10n.chat_retryCount( - message.retryCount, - context - .read() - .settings - .maxMessageRetries, - ), - style: TextStyle( - fontSize: 10 * textScale, - color: metaColor, - fontWeight: FontWeight.w500, - ), - ), - ), - ], - const SizedBox(height: 4), - Padding( - padding: gifId != null - ? const EdgeInsets.only( - left: 8, - right: 8, - bottom: 4, - ) - : EdgeInsets.zero, - child: Wrap( - spacing: 4, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Text( - _formatTime(message.timestamp), - style: TextStyle( - fontSize: 10 * textScale, - color: metaColor, - ), - ), - if (isOutgoing) ...[ - const SizedBox(width: 4), - MessageStatusIcon( - size: 12 * textScale, - onColor: metaColor, - isAcked: - message.status == - MessageStatus.delivered, - isPending: - message.status == MessageStatus.pending, - isFailed: - message.status == MessageStatus.failed, - ), - ], - if (enableTracing && - message.tripTimeMs != null && - message.status == - MessageStatus.delivered) ...[ - const SizedBox(width: 4), - Icon( - Icons.speed, - size: 10 * textScale, - color: isOutgoing - ? metaColor - : Theme.of( - context, - ).colorScheme.tertiary, - ), + child: Wrap( + spacing: 4, + crossAxisAlignment: WrapCrossAlignment.center, + children: [ Text( - '${(message.tripTimeMs! / 1000).toStringAsFixed(1)}s', + _formatTime(message.timestamp), style: TextStyle( - fontSize: 9 * textScale, + fontSize: 10 * textScale, + color: metaColor, + ), + ), + if (isOutgoing) ...[ + const SizedBox(width: 4), + MessageStatusIcon( + size: 12 * textScale, + onColor: metaColor, + isAcked: + message.status == + MessageStatus.delivered, + isPending: + message.status == MessageStatus.pending, + isFailed: + message.status == MessageStatus.failed, + ), + ], + if (enableTracing && + message.tripTimeMs != null && + message.status == + MessageStatus.delivered) ...[ + const SizedBox(width: 4), + Icon( + Icons.speed, + size: 10 * textScale, color: isOutgoing ? metaColor : Theme.of( context, ).colorScheme.tertiary, ), - ), + Text( + '${(message.tripTimeMs! / 1000).toStringAsFixed(1)}s', + style: TextStyle( + fontSize: 9 * textScale, + color: isOutgoing + ? metaColor + : Theme.of( + context, + ).colorScheme.tertiary, + ), + ), + ], ], - ], + ), ), - ), - ], + ], + ), ), ), - ), - ], + ], + ), ), ), - ), if (message.reactions.isNotEmpty) ...[ const SizedBox(height: 4), Padding( @@ -1476,7 +1480,9 @@ class _MessageBubble extends StatelessWidget { padding: EdgeInsets.zero, constraints: const BoxConstraints(minWidth: 40, minHeight: 40), onPressed: () async { - final selfName = context.read().selfName ?? context.l10n.chat_me; + final selfName = + context.read().selfName ?? + context.l10n.chat_me; final fromName = message.isOutgoing ? selfName : senderName; final key = buildSharedMarkerKey( sourceId: sourceId, diff --git a/lib/screens/chrome_required_screen.dart b/lib/screens/chrome_required_screen.dart index 53271d8f..cdf3c938 100644 --- a/lib/screens/chrome_required_screen.dart +++ b/lib/screens/chrome_required_screen.dart @@ -55,12 +55,18 @@ class ChromeRequiredScreen extends StatelessWidget { decoration: BoxDecoration( color: colorScheme.secondaryContainer.withValues(alpha: 0.4), borderRadius: BorderRadius.circular(30), - border: Border.all(color: colorScheme.outline.withValues(alpha: 0.4)), + border: Border.all( + color: colorScheme.outline.withValues(alpha: 0.4), + ), ), child: Row( mainAxisSize: MainAxisSize.min, children: [ - Icon(Icons.info_outline, size: 20, color: colorScheme.secondary), + Icon( + Icons.info_outline, + size: 20, + color: colorScheme.secondary, + ), const SizedBox(width: 12), Text( l10n.chrome_bluetoothRequiresChromium, diff --git a/lib/screens/contacts_screen.dart b/lib/screens/contacts_screen.dart index d64b8dd1..95cbb55d 100644 --- a/lib/screens/contacts_screen.dart +++ b/lib/screens/contacts_screen.dart @@ -705,9 +705,7 @@ class _ContactsScreenState extends State action: FilledButton.icon( onPressed: () => Navigator.push( context, - MaterialPageRoute( - builder: (context) => const DiscoveryScreen(), - ), + MaterialPageRoute(builder: (context) => const DiscoveryScreen()), ), icon: const Icon(Icons.person_add_rounded), label: Text(context.l10n.discoveredContacts_Title), @@ -1496,9 +1494,7 @@ class _ContactsScreenState extends State ), title: Text( context.l10n.contacts_deleteContact, - style: TextStyle( - color: Theme.of(context).colorScheme.error, - ), + style: TextStyle(color: Theme.of(context).colorScheme.error), ), onTap: () { Navigator.pop(sheetContext); diff --git a/lib/screens/discovery_screen.dart b/lib/screens/discovery_screen.dart index 736e8f36..1bc392bf 100644 --- a/lib/screens/discovery_screen.dart +++ b/lib/screens/discovery_screen.dart @@ -189,8 +189,7 @@ class _DiscoveryScreenState extends State { ), action: SnackBarAction( label: context.l10n.common_undo, - onPressed: () => - connector.removeContact(contact), + onPressed: () => connector.removeContact(contact), ), ); }, @@ -444,7 +443,6 @@ class _DiscoveryScreenState extends State { } } - String _formatLastSeen(BuildContext context, DateTime lastSeen) { final now = DateTime.now(); final diff = now.difference(lastSeen); diff --git a/lib/screens/line_of_sight_map_screen.dart b/lib/screens/line_of_sight_map_screen.dart index 1d63b910..af80ca22 100644 --- a/lib/screens/line_of_sight_map_screen.dart +++ b/lib/screens/line_of_sight_map_screen.dart @@ -507,7 +507,9 @@ class _LineOfSightMapScreenState extends State { bottom: 12, child: DecoratedBox( decoration: BoxDecoration( - color: Theme.of(context).colorScheme.surfaceContainerHighest.withValues(alpha: 0.85), + color: Theme.of( + context, + ).colorScheme.surfaceContainerHighest.withValues(alpha: 0.85), borderRadius: BorderRadius.circular(8), ), child: Padding( @@ -517,7 +519,10 @@ class _LineOfSightMapScreenState extends State { ), child: Text( context.l10n.losElevationAttribution, - style: TextStyle(fontSize: 10, color: Theme.of(context).colorScheme.onSurface), + style: TextStyle( + fontSize: 10, + color: Theme.of(context).colorScheme.onSurface, + ), ), ), ), @@ -631,7 +636,10 @@ class _LineOfSightMapScreenState extends State { const SizedBox(height: 4), Text( context.l10n.losBlockedSpotsHint, - style: TextStyle(fontSize: 11, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 11, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), const SizedBox(height: 6), Wrap( @@ -700,7 +708,9 @@ class _LineOfSightMapScreenState extends State { '${_selectedObstruction!.point.longitude.toStringAsFixed(5)}', style: TextStyle( fontSize: 11, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), ), ], @@ -726,7 +736,10 @@ class _LineOfSightMapScreenState extends State { const SizedBox(width: 8), Text( '${displayFrequencyMHz.toStringAsFixed(3)} MHz', - style: TextStyle(fontSize: 11, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 11, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), if (kFactorUsed != null) ...[ const SizedBox(width: 8), @@ -734,7 +747,9 @@ class _LineOfSightMapScreenState extends State { 'k=${kFactorUsed.toStringAsFixed(3)}', style: TextStyle( fontSize: 11, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), ), const SizedBox(width: 4), @@ -758,7 +773,10 @@ class _LineOfSightMapScreenState extends State { ), Text( context.l10n.losElevationAttribution, - style: TextStyle(fontSize: 10, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 10, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), const SizedBox(height: 6), ExpansionTile( diff --git a/lib/screens/map_cache_screen.dart b/lib/screens/map_cache_screen.dart index 6bc62018..e627bd58 100644 --- a/lib/screens/map_cache_screen.dart +++ b/lib/screens/map_cache_screen.dart @@ -458,7 +458,9 @@ class _MapCacheScreenState extends State { padding: const EdgeInsets.only(top: 8), child: Text( l10n.mapCache_failedDownloads(_failedTiles), - style: TextStyle(color: Theme.of(context).colorScheme.error), + style: TextStyle( + color: Theme.of(context).colorScheme.error, + ), ), ), ], diff --git a/lib/screens/map_screen.dart b/lib/screens/map_screen.dart index dd6462b7..3e4193c0 100644 --- a/lib/screens/map_screen.dart +++ b/lib/screens/map_screen.dart @@ -486,7 +486,10 @@ class _MapScreenState extends State { PopupMenuItem( child: Row( children: [ - Icon(Icons.logout, color: Theme.of(context).colorScheme.error), + Icon( + Icons.logout, + color: Theme.of(context).colorScheme.error, + ), const SizedBox(width: 8), Text(context.l10n.common_disconnect), ], @@ -1223,7 +1226,9 @@ class _MapScreenState extends State { Icon( Icons.location_on, size: 16, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), Text( ": $nodeCount", @@ -1239,7 +1244,9 @@ class _MapScreenState extends State { Icon( Icons.wrong_location, size: 16, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), Text( ": ${nodeCountAll - nodeCount}", @@ -1255,7 +1262,9 @@ class _MapScreenState extends State { Icon( Icons.add_outlined, size: 16, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), Text( ": $nodeCountAll", @@ -1612,51 +1621,56 @@ class _MapScreenState extends State { return SafeArea( child: Padding( padding: const EdgeInsets.fromLTRB(16, 0, 16, 16), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Icon( - _getNodeIcon(contact.type), - color: _getNodeColor(contact.type), - ), - const SizedBox(width: 8), - Expanded(child: SelectableText(contact.name)), - ], - ), - const SizedBox(height: 8), - _buildInfoRow( - context.l10n.map_type, - contact.typeLabel(context.l10n), - ), - _buildInfoRow( - context.l10n.map_path, - contact.pathLabel(context.l10n), - ), - if (contact.hasLocation) - _buildInfoRow( - context.l10n.map_location, - '${contact.latitude!.toStringAsFixed(6)}, ${contact.longitude!.toStringAsFixed(6)}', - ) - else if (guessedPosition != null) - _buildInfoRow( - context.l10n.map_estLocation, - '~${guessedPosition.latitude.toStringAsFixed(6)}, ${guessedPosition.longitude.toStringAsFixed(6)}', + child: SingleChildScrollView( + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Icon( + _getNodeIcon(contact.type), + color: _getNodeColor(contact.type), + ), + const SizedBox(width: 8), + Expanded(child: SelectableText(contact.name)), + ], ), - _buildInfoRow( - context.l10n.map_lastSeen, - _formatLastSeen(contact.lastSeen), - ), - _buildInfoRow(context.l10n.map_publicKey, contact.publicKeyHex), - const SizedBox(height: 16), - ...actions, - TextButton( - onPressed: () => Navigator.pop(sheetContext), - child: Text(context.l10n.common_close), - ), - ], + const SizedBox(height: 8), + _buildInfoRow( + context.l10n.map_type, + contact.typeLabel(context.l10n), + ), + _buildInfoRow( + context.l10n.map_path, + contact.pathLabel(context.l10n), + ), + if (contact.hasLocation) + _buildInfoRow( + context.l10n.map_location, + '${contact.latitude!.toStringAsFixed(6)}, ${contact.longitude!.toStringAsFixed(6)}', + ) + else if (guessedPosition != null) + _buildInfoRow( + context.l10n.map_estLocation, + '~${guessedPosition.latitude.toStringAsFixed(6)}, ${guessedPosition.longitude.toStringAsFixed(6)}', + ), + _buildInfoRow( + context.l10n.map_lastSeen, + _formatLastSeen(contact.lastSeen), + ), + _buildInfoRow( + context.l10n.map_publicKey, + contact.publicKeyHex, + ), + const SizedBox(height: 16), + ...actions, + TextButton( + onPressed: () => Navigator.pop(sheetContext), + child: Text(context.l10n.common_close), + ), + ], + ), ), ), ); @@ -1844,9 +1858,7 @@ class _MapScreenState extends State { ); await connector.refreshDeviceInfo(); if (!mounted) return; - messenger.showSnackBar( - SnackBar(content: Text(successMsg)), - ); + messenger.showSnackBar(SnackBar(content: Text(successMsg))); }, ), ListTile( @@ -2235,7 +2247,10 @@ class _MapScreenState extends State { const SizedBox(height: 8), Text( _getTimeFilterLabel(settings.mapTimeFilterHours), - style: TextStyle(fontSize: 14, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 14, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), Slider( value: _hoursToSliderValue(settings.mapTimeFilterHours), @@ -2387,7 +2402,10 @@ class _MapScreenState extends State { if (_pathTrace.isNotEmpty) Text( "${l10n.path_currentPathLabel} ${formatDistance(getPathDistanceMeters(_points), isImperial: isImperial)}", - style: TextStyle(fontSize: 12, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 12, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), SelectableText( _pathTrace diff --git a/lib/screens/neighbors_screen.dart b/lib/screens/neighbors_screen.dart index e92a5cc0..c34af7f1 100644 --- a/lib/screens/neighbors_screen.dart +++ b/lib/screens/neighbors_screen.dart @@ -326,10 +326,7 @@ class _NeighborsScreenState extends State { if (!_isLoaded && !_hasData && (_parsedNeighbors == null || _parsedNeighbors!.isEmpty)) - EmptyState( - icon: Icons.wifi_find, - title: l10n.neighbors_noData, - ), + EmptyState(icon: Icons.wifi_find, title: l10n.neighbors_noData), if (_isLoaded || _hasData && !(_parsedNeighbors == null || _parsedNeighbors!.isEmpty)) diff --git a/lib/screens/path_trace_map.dart b/lib/screens/path_trace_map.dart index 81082b9e..99bc4deb 100644 --- a/lib/screens/path_trace_map.dart +++ b/lib/screens/path_trace_map.dart @@ -274,8 +274,8 @@ class _PathTraceMapScreenState extends State { final frame = buildTraceReq( DateTime.now().millisecondsSinceEpoch ~/ 1000, - 0, //flags 0, //auth + 0, //flag payload: path, ); connector.sendFrame(frame); @@ -350,11 +350,16 @@ class _PathTraceMapScreenState extends State { try { buffer.skipBytes(2); // Skip push code and reserved byte int pathLength = buffer.readUInt8(); - buffer.skipBytes(5); // Skip Flag byte and tag data + final int flags = buffer + .readUInt8(); // path_sz = flags & 0x03 (path-hash mode, fw v1.11+) + buffer.skipBytes(4); // Skip tag data buffer.skipBytes(4); // Skip auth code + final int pathSz = flags & 0x03; Uint8List pathData = buffer.readBytes(pathLength); + // Firmware emits (path_len >> path_sz) hop SNRs plus 1 final SNR (to this node). + final int snrCount = (pathLength >> pathSz) + 1; List snrData = buffer - .readRemainingBytes() + .readBytes(snrCount) .map((snr) => snr.toSigned(8).toDouble() / 4) .toList(); @@ -616,7 +621,9 @@ class _PathTraceMapScreenState extends State { !_failed2Loaded) Center( child: Card( - color: Theme.of(context).colorScheme.surface.withValues(alpha: 0.9), + color: Theme.of( + context, + ).colorScheme.surface.withValues(alpha: 0.9), child: Padding( padding: EdgeInsets.all(12), child: Text( @@ -963,10 +970,10 @@ class _PathTraceMapScreenState extends State { } Widget _colorDot(Color color) => Container( - width: 10, - height: 10, - decoration: BoxDecoration(color: color, shape: BoxShape.circle), - ); + width: 10, + height: 10, + decoration: BoxDecoration(color: color, shape: BoxShape.circle), + ); Widget _buildLegendCard( BuildContext context, @@ -1002,11 +1009,17 @@ class _PathTraceMapScreenState extends State { children: [ _colorDot(Colors.green), const SizedBox(width: 4), - Text(l10n.pathTrace_legendGpsConfirmed, style: const TextStyle(fontSize: 11)), + Text( + l10n.pathTrace_legendGpsConfirmed, + style: const TextStyle(fontSize: 11), + ), const SizedBox(width: 12), _colorDot(Colors.orange), const SizedBox(width: 4), - Text(l10n.pathTrace_legendInferred, style: const TextStyle(fontSize: 11)), + Text( + l10n.pathTrace_legendInferred, + style: const TextStyle(fontSize: 11), + ), ], ), ], diff --git a/lib/screens/repeater_cli_screen.dart b/lib/screens/repeater_cli_screen.dart index 93720f28..80269061 100644 --- a/lib/screens/repeater_cli_screen.dart +++ b/lib/screens/repeater_cli_screen.dart @@ -385,16 +385,26 @@ class _RepeaterCliScreenState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(Icons.terminal, size: 64, color: Theme.of(context).colorScheme.onSurfaceVariant), + Icon( + Icons.terminal, + size: 64, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), const SizedBox(height: 16), Text( l10n.repeater_noCommandsSent, - style: TextStyle(fontSize: 16, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), const SizedBox(height: 8), Text( l10n.repeater_typeCommandOrUseQuick, - style: TextStyle(fontSize: 14, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 14, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), ], ), diff --git a/lib/screens/repeater_hub_screen.dart b/lib/screens/repeater_hub_screen.dart index 337d148c..2aebcf03 100644 --- a/lib/screens/repeater_hub_screen.dart +++ b/lib/screens/repeater_hub_screen.dart @@ -72,11 +72,15 @@ class RepeaterHubScreen extends StatelessWidget { children: [ CircleAvatar( radius: 40, - backgroundColor: Theme.of(context).colorScheme.tertiaryContainer, + backgroundColor: Theme.of( + context, + ).colorScheme.tertiaryContainer, child: Icon( Icons.cell_tower, size: 40, - color: Theme.of(context).colorScheme.onTertiaryContainer, + color: Theme.of( + context, + ).colorScheme.onTertiaryContainer, ), ), const SizedBox(height: 16), @@ -90,12 +94,18 @@ class RepeaterHubScreen extends StatelessWidget { const SizedBox(height: 8), Text( repeater.shortPubKeyHex, - style: TextStyle(fontSize: 14, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 14, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), const SizedBox(height: 8), Text( repeater.pathLabel(context.l10n), - style: TextStyle(fontSize: 14, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 14, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), if (repeater.hasLocation) ...[ const SizedBox(height: 4), @@ -105,14 +115,18 @@ class RepeaterHubScreen extends StatelessWidget { Icon( Icons.location_on, size: 14, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), const SizedBox(width: 4), Text( '${repeater.latitude?.toStringAsFixed(4)}, ${repeater.longitude?.toStringAsFixed(4)}', style: TextStyle( fontSize: 12, - color: Theme.of(context).colorScheme.onSurfaceVariant, + color: Theme.of( + context, + ).colorScheme.onSurfaceVariant, ), ), ], @@ -329,12 +343,18 @@ class RepeaterHubScreen extends StatelessWidget { const SizedBox(height: 4), Text( subtitle, - style: TextStyle(fontSize: 14, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 14, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), ], ), ), - Icon(Icons.chevron_right, color: Theme.of(context).colorScheme.onSurfaceVariant), + Icon( + Icons.chevron_right, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ], ), ), diff --git a/lib/screens/repeater_settings_screen.dart b/lib/screens/repeater_settings_screen.dart index 1d8ae3bc..e04cfb70 100644 --- a/lib/screens/repeater_settings_screen.dart +++ b/lib/screens/repeater_settings_screen.dart @@ -459,7 +459,9 @@ class _RepeaterSettingsScreenState extends State { ? l10n.repeater_refreshed(label) : l10n.repeater_errorRefreshing(label), ), - backgroundColor: successCount > 0 ? null : Theme.of(context).colorScheme.error, + backgroundColor: successCount > 0 + ? null + : Theme.of(context).colorScheme.error, ); setState(() => setRefreshing(false)); } @@ -2229,7 +2231,9 @@ class _RepeaterSettingsScreenState extends State { onConfirm(); }, style: isDestructive - ? FilledButton.styleFrom(backgroundColor: Theme.of(context).colorScheme.error) + ? FilledButton.styleFrom( + backgroundColor: Theme.of(context).colorScheme.error, + ) : null, child: Text(l10n.repeater_confirm), ), diff --git a/lib/screens/scanner_screen.dart b/lib/screens/scanner_screen.dart index e665cbc7..1fd2c53c 100644 --- a/lib/screens/scanner_screen.dart +++ b/lib/screens/scanner_screen.dart @@ -113,9 +113,9 @@ class _ScannerScreenState extends State { 'USB selected, opening UsbScreen', tag: 'ScannerScreen', ); - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => const UsbScreen()), - ); + Navigator.of( + context, + ).push(MaterialPageRoute(builder: (_) => const UsbScreen())); }, ), if (!PlatformInfo.isWeb) @@ -123,9 +123,9 @@ class _ScannerScreenState extends State { icon: const Icon(Icons.lan), tooltip: context.l10n.connectionChoiceTcpLabel, onPressed: () { - Navigator.of(context).push( - MaterialPageRoute(builder: (_) => const TcpScreen()), - ); + Navigator.of( + context, + ).push(MaterialPageRoute(builder: (_) => const TcpScreen())); }, ), ], @@ -167,7 +167,9 @@ class _ScannerScreenState extends State { ) : const Icon(Icons.bluetooth_searching), label: Text( - isScanning ? context.l10n.scanner_stop : context.l10n.scanner_scan, + isScanning + ? context.l10n.scanner_stop + : context.l10n.scanner_scan, ), ); }, @@ -256,8 +258,7 @@ class _ScannerScreenState extends State { ); } - final isConnecting = - connector.state == MeshCoreConnectionState.connecting; + final isConnecting = connector.state == MeshCoreConnectionState.connecting; return ListView.separated( padding: const EdgeInsets.all(8), itemCount: connector.scanResults.length, diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 0fe077cb..b6eefb05 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -343,7 +343,10 @@ class _SettingsScreenState extends State { ), ), ListTile( - leading: Icon(Icons.delete_outline, color: Theme.of(context).colorScheme.error), + leading: Icon( + Icons.delete_outline, + color: Theme.of(context).colorScheme.error, + ), title: Text(l10n.settings_deleteAllPaths), subtitle: Text( l10n.settings_deleteAllPathsSubtitle, @@ -367,7 +370,10 @@ class _SettingsScreenState extends State { ), const Divider(height: 1), ListTile( - leading: Icon(Icons.restart_alt, color: Theme.of(context).colorScheme.tertiary), + leading: Icon( + Icons.restart_alt, + color: Theme.of(context).colorScheme.tertiary, + ), title: Text(l10n.settings_rebootDevice), subtitle: Text(l10n.settings_rebootDeviceSubtitle), onTap: () => _confirmReboot(context, connector), diff --git a/lib/screens/tcp_screen.dart b/lib/screens/tcp_screen.dart index 755a4298..517b39a6 100644 --- a/lib/screens/tcp_screen.dart +++ b/lib/screens/tcp_screen.dart @@ -224,10 +224,7 @@ class _TcpScreenState extends State { statusText, maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle( - color: statusColor, - fontWeight: FontWeight.w500, - ), + style: TextStyle(color: statusColor, fontWeight: FontWeight.w500), ), ), ], diff --git a/lib/screens/telemetry_screen.dart b/lib/screens/telemetry_screen.dart index 6634a6af..4559adac 100644 --- a/lib/screens/telemetry_screen.dart +++ b/lib/screens/telemetry_screen.dart @@ -385,7 +385,10 @@ class _TelemetryScreenState extends State { Center( child: Text( l10n.telemetry_noData, - style: TextStyle(fontSize: 16, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), ), if ((_isLoaded || _hasData) && diff --git a/lib/screens/usb_screen.dart b/lib/screens/usb_screen.dart index 331de5e3..ec551c6f 100644 --- a/lib/screens/usb_screen.dart +++ b/lib/screens/usb_screen.dart @@ -203,10 +203,7 @@ class _UsbScreenState extends State { statusText, maxLines: 1, overflow: TextOverflow.ellipsis, - style: TextStyle( - color: statusColor, - fontWeight: FontWeight.w500, - ), + style: TextStyle(color: statusColor, fontWeight: FontWeight.w500), ), ), ], @@ -222,11 +219,18 @@ class _UsbScreenState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(Icons.usb, size: 64, color: Theme.of(context).colorScheme.onSurfaceVariant), + Icon( + Icons.usb, + size: 64, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), const SizedBox(height: 16), Text( l10n.usbStatus_searching, - style: TextStyle(fontSize: 16, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), ], ), @@ -238,12 +242,19 @@ class _UsbScreenState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(Icons.usb, size: 64, color: Theme.of(context).colorScheme.onSurfaceVariant), + Icon( + Icons.usb, + size: 64, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), const SizedBox(height: 16), Text( l10n.usbScreenEmptyState, textAlign: TextAlign.center, - style: TextStyle(fontSize: 16, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), ], ), diff --git a/lib/services/notification_service.dart b/lib/services/notification_service.dart index d8e70ce3..36027917 100644 --- a/lib/services/notification_service.dart +++ b/lib/services/notification_service.dart @@ -304,7 +304,8 @@ class NotificationService { try { await _notifications.show( - id: channelIndex?.hashCode ?? + id: + channelIndex?.hashCode ?? DateTime.now().millisecondsSinceEpoch & 0x7FFFFFFF, title: channelName, body: body, diff --git a/lib/widgets/gif_picker.dart b/lib/widgets/gif_picker.dart index df27ec68..90b6261b 100644 --- a/lib/widgets/gif_picker.dart +++ b/lib/widgets/gif_picker.dart @@ -180,7 +180,10 @@ class _GifPickerState extends State { const SizedBox(height: 8), Text( context.l10n.gifPicker_poweredBy, - style: TextStyle(fontSize: 11, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 11, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), ], ), @@ -197,11 +200,18 @@ class _GifPickerState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(Icons.error_outline, size: 64, color: Theme.of(context).colorScheme.onSurfaceVariant), + Icon( + Icons.error_outline, + size: 64, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), const SizedBox(height: 16), Text( _error!, - style: TextStyle(fontSize: 16, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), const SizedBox(height: 16), ElevatedButton.icon( @@ -219,11 +229,18 @@ class _GifPickerState extends State { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Icon(Icons.search_off, size: 64, color: Theme.of(context).colorScheme.onSurfaceVariant), + Icon( + Icons.search_off, + size: 64, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), const SizedBox(height: 16), Text( context.l10n.gifPicker_noGifsFound, - style: TextStyle(fontSize: 16, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 16, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), ], ), diff --git a/lib/widgets/path_editor_sheet.dart b/lib/widgets/path_editor_sheet.dart index 66c1fa4b..ee6ba006 100644 --- a/lib/widgets/path_editor_sheet.dart +++ b/lib/widgets/path_editor_sheet.dart @@ -119,7 +119,9 @@ class _PathEditorSheetState extends State { _hexError = null; _hops ..clear() - ..addAll(tokens.map((t) => _Hop(_nextHopId++, int.parse(t, radix: 16)))); + ..addAll( + tokens.map((t) => _Hop(_nextHopId++, int.parse(t, radix: 16))), + ); }); } @@ -287,10 +289,7 @@ class _PathEditorSheetState extends State { ), const Divider(), const SizedBox(height: 8), - Text( - l10n.pathEditor_addHops, - style: theme.textTheme.titleSmall, - ), + Text(l10n.pathEditor_addHops, style: theme.textTheme.titleSmall), const SizedBox(height: 8), TextField( onChanged: (value) => setState(() => _search = value), diff --git a/lib/widgets/repeater_login_dialog.dart b/lib/widgets/repeater_login_dialog.dart index 9ba8efd9..5b45037d 100644 --- a/lib/widgets/repeater_login_dialog.dart +++ b/lib/widgets/repeater_login_dialog.dart @@ -466,7 +466,10 @@ class _RepeaterLoginDialogState extends State { const SizedBox(height: 4), Text( repeater.pathLabel(context.l10n), - style: TextStyle(fontSize: 11, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 11, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), const SizedBox(height: 8), Align( diff --git a/lib/widgets/room_login_dialog.dart b/lib/widgets/room_login_dialog.dart index 8a737130..a6475cfb 100644 --- a/lib/widgets/room_login_dialog.dart +++ b/lib/widgets/room_login_dialog.dart @@ -395,7 +395,10 @@ class _RoomLoginDialogState extends State { const SizedBox(height: 4), Text( repeater.pathLabel(context.l10n), - style: TextStyle(fontSize: 11, color: Theme.of(context).colorScheme.onSurfaceVariant), + style: TextStyle( + fontSize: 11, + color: Theme.of(context).colorScheme.onSurfaceVariant, + ), ), const SizedBox(height: 8), Align( diff --git a/lib/widgets/routing_sheet.dart b/lib/widgets/routing_sheet.dart index ddb0bb04..71fe2a4d 100644 --- a/lib/widgets/routing_sheet.dart +++ b/lib/widgets/routing_sheet.dart @@ -150,10 +150,7 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> { ); } - Future _forgetPath( - MeshCoreConnector connector, - Contact contact, - ) async { + Future _forgetPath(MeshCoreConnector connector, Contact contact) async { await connector.clearContactPath(contact); if (!mounted) return; setState(() => _syncStatus = context.l10n.chat_pathCleared); @@ -235,7 +232,8 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> { case _RoutingMode.auto: if (contact.pathLength < 0) return l10n.routing_noPathYet; if (contact.pathLength == 0) return l10n.routing_directNoHops; - if (contact.path.isEmpty) return l10n.chat_hopsCount(contact.pathLength); + if (contact.path.isEmpty) + return l10n.chat_hopsCount(contact.pathLength); return PathHelper.resolvePathNames(contact.path, connector.allContacts); } } @@ -325,7 +323,8 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> { int failureCount, int lastTripTimeMs, DateTime? lastUsed, - })? floodStats, + })? + floodStats, ) { final l10n = context.l10n; final theme = Theme.of(context); @@ -347,7 +346,10 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> { color: scheme.primary, ), const SizedBox(width: 8), - Text(l10n.routing_currentRoute, style: theme.textTheme.titleSmall), + Text( + l10n.routing_currentRoute, + style: theme.textTheme.titleSmall, + ), ], ), const SizedBox(height: 8), @@ -418,7 +420,8 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> { int failureCount, int lastTripTimeMs, DateTime? lastUsed, - }) stats, + }) + stats, ) { final l10n = context.l10n; final parts = [ @@ -441,7 +444,8 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> { int failureCount, int lastTripTimeMs, DateTime? lastUsed, - }) stats, + }) + stats, ) { final l10n = context.l10n; final scheme = Theme.of(context).colorScheme; @@ -487,7 +491,10 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> { final scheme = theme.colorScheme; final (Color bg, Color fg) = switch (quality) { - _PathQuality.strong => (scheme.primaryContainer, scheme.onPrimaryContainer), + _PathQuality.strong => ( + scheme.primaryContainer, + scheme.onPrimaryContainer, + ), _PathQuality.good => ( scheme.secondaryContainer, scheme.onSecondaryContainer, @@ -504,7 +511,8 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> { }; final hasBytes = record.pathBytes.isNotEmpty; - final inUse = hasBytes && + final inUse = + hasBytes && ((mode == _RoutingMode.manual && listEquals(record.pathBytes, contact.pathOverrideBytes)) || (mode == _RoutingMode.auto && @@ -596,19 +604,24 @@ class _RoutingSheetBodyState extends State<_RoutingSheetBody> { final rankedRepeaters = List.of(connector.directRepeaters) ..sort((a, b) => b.ranking.compareTo(a.ranking)); - final entries = pathService - .getRecentPaths(contact.publicKeyHex) - .map((r) => (quality: _qualityOf(r, rankedRepeaters), record: r)) - .toList() - ..sort((a, b) { - final byQuality = a.quality.index.compareTo(b.quality.index); - if (byQuality != 0) return byQuality; - final aTime = - a.record.timestamp ?? DateTime.fromMillisecondsSinceEpoch(0); - final bTime = - b.record.timestamp ?? DateTime.fromMillisecondsSinceEpoch(0); - return bTime.compareTo(aTime); - }); + final entries = + pathService + .getRecentPaths(contact.publicKeyHex) + .map( + (r) => (quality: _qualityOf(r, rankedRepeaters), record: r), + ) + .toList() + ..sort((a, b) { + final byQuality = a.quality.index.compareTo(b.quality.index); + if (byQuality != 0) return byQuality; + final aTime = + a.record.timestamp ?? + DateTime.fromMillisecondsSinceEpoch(0); + final bTime = + b.record.timestamp ?? + DateTime.fromMillisecondsSinceEpoch(0); + return bTime.compareTo(aTime); + }); return ListView( controller: widget.scrollController, diff --git a/test/screens/usb_flow_test.dart b/test/screens/usb_flow_test.dart index ecd33ee9..4c6b8bd2 100644 --- a/test/screens/usb_flow_test.dart +++ b/test/screens/usb_flow_test.dart @@ -160,15 +160,9 @@ void main() { final context = tester.element(find.byType(ScannerScreen)); final l10n = AppLocalizations.of(context); if (PlatformInfo.supportsUsbSerial) { - expect( - find.byTooltip(l10n.connectionChoiceUsbLabel), - findsOneWidget, - ); + expect(find.byTooltip(l10n.connectionChoiceUsbLabel), findsOneWidget); } else { - expect( - find.byTooltip(l10n.connectionChoiceUsbLabel), - findsNothing, - ); + expect(find.byTooltip(l10n.connectionChoiceUsbLabel), findsNothing); } // ScannerScreen.dispose() schedules disconnect work that debounces notify. diff --git a/untranslated.json b/untranslated.json index c3a9394b..9e26dfee 100644 --- a/untranslated.json +++ b/untranslated.json @@ -1,987 +1 @@ -{ - "bg": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "de": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "es": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "fr": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "hu": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "it": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "ja": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "ko": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "nl": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "pl": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "pt": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "ru": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "sk": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "sl": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "sv": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "uk": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ], - - "zh": [ - "common_undo", - "messageStatus_sent", - "messageStatus_delivered", - "messageStatus_pending", - "messageStatus_failed", - "messageStatus_repeated", - "contacts_moreOptions", - "contacts_searchOpen", - "contacts_searchClose", - "routing_title", - "routing_modeAuto", - "routing_modeFlood", - "routing_modeManual", - "routing_modeAutoHint", - "routing_modeFloodHint", - "routing_modeManualHint", - "routing_currentRoute", - "routing_directNoHops", - "routing_noPathYet", - "routing_floodBroadcast", - "routing_editPath", - "routing_forgetPath", - "routing_knownPaths", - "routing_knownPathsHint", - "routing_inUse", - "routing_qualityStrong", - "routing_qualityGood", - "routing_qualityFair", - "routing_qualityWorked", - "routing_qualityFlood", - "routing_qualityUntested", - "routing_lastWorked", - "routing_neverWorked", - "routing_deliveryCounts", - "routing_floodDelivery", - "pathEditor_title", - "pathEditor_hopCounter", - "pathEditor_noHops", - "pathEditor_addHops", - "pathEditor_searchRepeaters", - "pathEditor_advancedHex", - "pathEditor_hexLabel", - "pathEditor_hexHelper", - "pathEditor_invalidTokens", - "pathEditor_tooManyHops", - "pathEditor_usePath", - "pathEditor_removeHop", - "pathEditor_unknownHop", - "map_zoomIn", - "map_zoomOut", - "map_centerMap", - "chrome_bluetoothRequiresChromium", - "channels_communityShortId", - "pathTrace_legendGpsConfirmed", - "pathTrace_legendInferred" - ] -} +{} \ No newline at end of file