diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index a49fa5a..b9a221d 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Входът не беше успешен. Или паролата е грешна, или повторителят е недостъпен.", - "common_reload": "Презареди", "common_clear": "Изчисти", "path_currentPath": "Текущ път: {path}", @@ -1363,5 +1362,21 @@ "channels_scanQrCode": "Сканирайте QR код", "channels_scanQrCodeComingSoon": "Ще излезе скоро", "channels_enterHashtag": "Въведете хаштаг", - "channels_hashtagHint": "напр. #отбор" + "channels_hashtagHint": "напр. #отбор", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "Слушано преди {time}.", + "neighbors_unknownContact": "Неизвестна {pubkey}" } diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index cf3e290..953d529 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Anmeldung fehlgeschlagen. Entweder ist das Passwort falsch oder der Repeater ist nicht erreichbar.", - "common_reload": "Neu laden", "common_clear": "Löschen", "path_currentPath": "Aktiver Pfad: {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Raumserver", "listFilter_unreadOnly": "Nur nicht gelesen", "listFilter_newGroup": "Neue Gruppe", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Fehler beim Laden der Nachbarn: {error}", "neighbors_repeatersNeighbours": "Wiederholer Nachbarn", "neighbors_noData": "Keine Nachbardaten verfügbar.", - "channels_joinPrivateChannel": "Treten Sie einem privaten Kanal bei", "channels_joinPrivateChannelDesc": "Manuelle Eingabe eines geheimen Schlüssels.", "channels_createPrivateChannel": "Erstelle einen privaten Kanal", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Scannen Sie einen QR-Code", "channels_scanQrCodeComingSoon": "Bald verfügbar", "channels_enterHashtag": "Gib Hashtag ein", - "channels_hashtagHint": "z.B. #team" + "channels_hashtagHint": "z.B. #team", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "Hörte: {time} vor her.", + "neighbors_unknownContact": "Unbekannte {pubkey}" } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index ad85401..a098e27 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -1082,7 +1082,18 @@ }, "neighbors_repeatersNeighbours": "Repeaters Neighbours", "neighbors_noData": "No neighbours data available.", - + "neighbors_unknownContact": "Unknown {pubkey}", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": {"type": "String"} + } + }, + "neighbors_heardAgo": "Heard: {time} ago", + "@neighbors_heardAgo": { + "placeholders": { + "time": {"type": "String"} + } + }, "channelPath_title": "Packet Path", "channelPath_viewMap": "View map", "channelPath_otherObservedPaths": "Other Observed Paths", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 12325ac..0581a63 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Inicio fallido. La contraseña es incorrecta o el repetidor no está disponible.", - "common_reload": "Recargar", "common_clear": "Borrar", "path_currentPath": "Ruta actual: {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Servidores de la sala", "listFilter_unreadOnly": "Solo sin leer", "listFilter_newGroup": "Nuevo grupo", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Error al cargar vecinos: {error}", "neighbors_repeatersNeighbours": "Repetidores Vecinos", "neighbors_noData": "No hay datos de vecinos disponibles.", - "channels_joinPrivateChannel": "Únete a un Canal Privado", "channels_createPrivateChannel": "Crear un Canal Privado", "channels_createPrivateChannelDesc": "Cifrado con una clave secreta.", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Escanear un Código QR", "channels_scanQrCodeComingSoon": "Próximamente", "channels_enterHashtag": "Introducir hashtag", - "channels_hashtagHint": "ej. #equipo" + "channels_hashtagHint": "ej. #equipo", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_unknownContact": "Clave pública desconocida {pubkey}", + "neighbors_heardAgo": "Escuchado: {time} hace atrás" } diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 6f21dfe..d69de69 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Connexion échouée. Soit le mot de passe est incorrect, soit le relais est injoignable.", - "common_reload": "Recharger", "common_clear": "Effacer", "path_currentPath": "Chemin actuel : {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Serveurs de pièce", "listFilter_unreadOnly": "Messages non lus seulement", "listFilter_newGroup": "Nouvelle groupe", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Erreur lors du chargement des voisins : {error}", "neighbors_repeatersNeighbours": "Répéteurs Voisins", "neighbors_noData": "Aucune donnée concernant les voisins disponible.", - "channels_createPrivateChannelDesc": "Sécurisé avec une clé secrète.", "channels_joinPrivateChannel": "Rejoindre un Canal Privé", "channels_createPrivateChannel": "Créer un Canal Privé", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Scanner un code QR", "channels_scanQrCodeComingSoon": "Bientôt disponible", "channels_enterHashtag": "Entrez le hashtag", - "channels_hashtagHint": "ex. #équipe" + "channels_hashtagHint": "ex. #équipe", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_unknownContact": "Clé publique inconnue {pubkey}", + "neighbors_heardAgo": "Écouté : {time} auparavant" } diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index 5d61ff7..f34029e 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Accesso fallito. La password non è corretta oppure il ripetitore non è raggiungibile.", - "common_reload": "Ricaricare", "common_clear": "Cancella", "path_currentPath": "Percorso corrente: {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Server della stanza", "listFilter_unreadOnly": "Solo non letto", "listFilter_newGroup": "Nuovo gruppo", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Errore nel caricamento dei vicini: {error}", "neighbors_repeatersNeighbours": "Ripetitori Vicini", "neighbors_noData": "Nessun dato sugli vicini disponibile.", - "channels_createPrivateChannel": "Crea un Canale Privato", "channels_createPrivateChannelDesc": "Protetta con una chiave segreta.", "channels_joinPrivateChannel": "Unisciti a un Canale Privato", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Scansiona un codice QR", "channels_scanQrCodeComingSoon": "Arriverà presto", "channels_enterHashtag": "Inserisci hashtag", - "channels_hashtagHint": "es. #team" + "channels_hashtagHint": "es. #team", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "Sentito: {time} fa", + "neighbors_unknownContact": "Chiave pubblica sconosciuta {pubkey}" } diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 44f2f48..754e606 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Inloggen mislukt. Het wachtwoord is onjuist of de repeater is niet bereikbaar.", - "common_reload": "Opnieuw laden", "common_clear": "Schoonmaken", "path_currentPath": "Huidige pad: {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Roomservers", "listFilter_unreadOnly": "Alleen ongelezen", "listFilter_newGroup": "Nieuwe groep", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Fout bij het laden van buren: {error}", "neighbors_repeatersNeighbours": "Herhalingen Buren", "neighbors_noData": "Geen gegevens van buren beschikbaar.", - "channels_createPrivateChannelDesc": "Beveiligd met een geheime sleutel.", "channels_createPrivateChannel": "Maak een Privé Kanaal", "channels_joinPrivateChannel": "Sluit een Privé Kanaal aan", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Scan een QR-code", "channels_scanQrCodeComingSoon": "Komt later", "channels_enterHashtag": "Voer hashtag in", - "channels_hashtagHint": "bijv. #team" + "channels_hashtagHint": "bijv. #team", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_unknownContact": "Onbekende {pubkey}", + "neighbors_heardAgo": "Horen: {time} geleden" } diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index ff8f058..f54644c 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Logowanie nie powiodło się. Hasło jest nieprawidłowe albo repeater jest nieosiągalny.", - "common_reload": "Ponownie załadować", "common_clear": "Wyczyść", "path_currentPath": "Aktualny ścieżka: {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Serwery pokoju", "listFilter_unreadOnly": "Tylko nieprzeczytane", "listFilter_newGroup": "Nowa grupa", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Błąd podczas ładowania sąsiadów: {error}", "neighbors_repeatersNeighbours": "Powtarzacze Sąsiedzi", "neighbors_noData": "Brak danych dotyczących sąsiadów.", - "channels_joinPrivateChannelDesc": "Ręcznie wprowadź klucz tajny.", "channels_createPrivateChannel": "Utwórz Prywatny Kanał", "channels_createPrivateChannelDesc": "Zabezpieczone kluczem szyfrowym.", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Skanuj kod QR", "channels_scanQrCodeComingSoon": "Wkrótce", "channels_enterHashtag": "Wprowadź hashtag", - "channels_hashtagHint": "np. #zespół" + "channels_hashtagHint": "np. #zespół", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "Usłyszano: {time} temu", + "neighbors_unknownContact": "Nieznana {pubkey}" } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 7ecf0cb..ee9ff56 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Falha no login. A senha está incorreta ou o repetidor está inacessível.", - "common_reload": "Recarregar", "common_clear": "Limpar", "path_currentPath": "Caminho atual: {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Servidores de sala", "listFilter_unreadOnly": "Apenas não lido", "listFilter_newGroup": "Novo grupo", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Erro ao carregar vizinhos: {error}", "neighbors_repeatersNeighbours": "Repetidores Vizinhos", "neighbors_noData": "Não estão disponíveis dados de vizinhos.", - "channels_createPrivateChannelDesc": "Protegido com uma chave secreta.", "channels_joinPrivateChannelDesc": "Inserir uma chave secreta manualmente.", "channels_createPrivateChannel": "Criar um Canal Privado", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Digitalizar um Código QR", "channels_scanQrCodeComingSoon": "Em breve", "channels_enterHashtag": "Insira hashtag", - "channels_hashtagHint": "ex. #equipe" + "channels_hashtagHint": "ex. #equipe", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "Ouvido: {time} atrás", + "neighbors_unknownContact": "{pubkey} Desconhecido" } diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb index ff602ec..2355258 100644 --- a/lib/l10n/app_sk.arb +++ b/lib/l10n/app_sk.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Prihlásenie zlyhalo. Heslo je nesprávne alebo je opakovač nedostupný.", - "common_reload": "Načítať", "common_clear": "Zmazať", "path_currentPath": "Aktívna cesta: {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Servéry miestnosti", "listFilter_unreadOnly": "Nezaregistrované len", "listFilter_newGroup": "Nová skupina", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Chyba pri načítaní susedov: {error}", "neighbors_repeatersNeighbours": "Opakovadlá Súsezná", "neighbors_noData": "Nie je dostupná žiadna informácia o susedoch.", - "channels_createPrivateChannel": "Vytvorte súkromný kanál", "channels_joinPrivateChannel": "Pripojiť sa k súkromnému kanálu", "channels_joinPrivateChannelDesc": "Ručne zadajte tajný kľúč.", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Skenujte QR kód", "channels_scanQrCodeComingSoon": "Čoskoro", "channels_enterHashtag": "Zadajte hashtag", - "channels_hashtagHint": "napr. #tím" + "channels_hashtagHint": "napr. #tím", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "Počuli sme to: {time} dozadu", + "neighbors_unknownContact": "Neznáma {pubkey}" } diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index 9b63d01..2390bad 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Prijava je bila neuspešna. Geslo je napačno ali pa je repetitor nedosegljiv.", - "common_reload": "Ponovno naloži", "common_clear": "Ponoviti", "path_currentPath": "Trenutna pot: {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Smeti za prostore", "listFilter_unreadOnly": "Nezbrani samo", "listFilter_newGroup": "Nova skupina", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Napaka pri obnašanju sosedov: {error}", "neighbors_repeatersNeighbours": "Ponovitve Sosedi", "neighbors_noData": "Niso na voljo podatki o sosedih.", - "channels_joinPrivateChannel": "Pridružite se zasebni skupini", "channels_createPrivateChannelDesc": "Varno zaklenjeno s skrivnim ključem.", "channels_joinPrivateChannelDesc": "Ročno vnesite zaporni ključ.", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Skeniraj QR kodo", "channels_scanQrCodeComingSoon": "Prihajajoča", "channels_enterHashtag": "Vnesite hashtag", - "channels_hashtagHint": "npr. #ekipa" + "channels_hashtagHint": "npr. #ekipa", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_unknownContact": "Nepoznano {pubkey}", + "neighbors_heardAgo": "Udeleženec je prejel sporočilo {time} nazaj." } diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index a91835d..58adcca 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "Inloggning misslyckades. Antingen är lösenordet fel eller så går det inte att nå repeatern.", - "common_reload": "Ladda om", "common_clear": "Rensa", "path_currentPath": "Nuvarande sökväg: {path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "Rumservrar", "listFilter_unreadOnly": "Endast oinlästa", "listFilter_newGroup": "Ny grupp", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "Fel vid inläsning av grannar: {error}", "neighbors_repeatersNeighbours": "Upprepar grannar", "neighbors_noData": "Inga grannuppgifter finns tillgängliga.", - "channels_createPrivateChannel": "Skapa en privat kanal", "channels_joinPrivateChannel": "Gå med i en Privat Kanal", "channels_joinPrivateChannelDesc": "Ange en hemlig nyckel manuellt.", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "Skanna en QR-kod", "channels_scanQrCodeComingSoon": "Kommer snart", "channels_enterHashtag": "Ange hashtag", - "channels_hashtagHint": "t.ex. #team" + "channels_hashtagHint": "t.ex. #team", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "Hördes: {time} sedan", + "neighbors_unknownContact": "Okänd {pubkey}" } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index 1ad2c5c..b71190f 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -822,7 +822,6 @@ } }, "login_failedMessage": "登录失败。密码不正确或中继器不可达。", - "common_reload": "重新加载", "common_clear": "清除", "path_currentPath": "当前路径:{path}", @@ -1338,7 +1337,6 @@ "listFilter_roomServers": "房间服务器", "listFilter_unreadOnly": "未读消息", "listFilter_newGroup": "新组", - "@neighbors_errorLoading": { "placeholders": { "error": { @@ -1353,7 +1351,6 @@ "neighbors_errorLoading": "加载邻居时出错:{error}", "neighbors_repeatersNeighbours": "重复器邻居", "neighbors_noData": "没有可用的邻居数据。", - "channels_joinPrivateChannel": "加入私密频道", "channels_createPrivateChannelDesc": "使用密钥保护。", "channels_joinPrivateChannelDesc": "手动输入密钥。", @@ -1365,5 +1362,21 @@ "channels_scanQrCode": "扫描二维码", "channels_scanQrCodeComingSoon": "即将到来", "channels_enterHashtag": "输入标签", - "channels_hashtagHint": "例如 #团队" + "channels_hashtagHint": "例如 #团队", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "听到的时间:{time}前", + "neighbors_unknownContact": "未知{pubkey}" } diff --git a/lib/screens/neighbours_screen.dart b/lib/screens/neighbours_screen.dart index b31295c..03c6062 100644 --- a/lib/screens/neighbours_screen.dart +++ b/lib/screens/neighbours_screen.dart @@ -1,5 +1,4 @@ import 'dart:async'; -import 'dart:math'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -70,7 +69,7 @@ class _NeighboursScreenState extends State { // Check if it's a binary response if (frame[0] == pushCodeBinaryResponse && listEquals(frame.sublist(2, 6), _tagData)) { - _handleNeighboursResponse(context, connector, frame.sublist(6)); + _handleNeighboursResponse(connector, frame.sublist(6)); } }); } @@ -116,18 +115,14 @@ class _NeighboursScreenState extends State { return neighbours.values.toList(); } - void _handleNeighboursResponse( - BuildContext context, - MeshCoreConnector connector, - Uint8List frame, - ) { + void _handleNeighboursResponse(MeshCoreConnector connector, Uint8List frame) { final buffer = BufferReader(frame); final neighbourCount = buffer.readUInt16LE(); final parsedNeighbours = parseNeighboursData(buffer, buffer.readUInt16LE()); connector.contacts.where((c) => c.type == advTypeRepeater).forEach(( repeater, ) { - parsedNeighbours.forEach((neighbourData) { + for (var neighbourData in parsedNeighbours) { final publicKey = neighbourData['publicKey']; if (listEquals( repeater.publicKey.sublist(0, _reqNeighboursKeyLen), @@ -135,7 +130,7 @@ class _NeighboursScreenState extends State { )) { neighbourData['contact'] = repeater; } - }); + } }); setState(() { @@ -376,7 +371,9 @@ class _NeighboursScreenState extends State { _hasData && !(_parsedNeighbours == null || _parsedNeighbours!.isEmpty)) - _buildNeighboursInfoCard(l10n.repeater_neighbours), + _buildNeighboursInfoCard( + "${l10n.repeater_neighbours} - $_neighbourCount", + ), ], ), ), @@ -413,8 +410,12 @@ class _NeighboursScreenState extends State { _buildInfoRow( entry.value['contact'] != null ? entry.value['contact'].name - : 'Unknown (${pubKeyToHex(entry.value['publicKey'])})', - 'Heard: ${fmtDuration(entry.value['lastHeard'] + 0.0)} ago', + : context.l10n.neighbors_unknownContact( + "<${pubKeyToHex(entry.value['publicKey'])}>", + ), + context.l10n.neighbors_heardAgo( + fmtDuration(entry.value['lastHeard'] + 0.0), + ), entry.value['snr'], connector.currentSf!, ),