diff --git a/lib/connector/meshcore_connector.dart b/lib/connector/meshcore_connector.dart index ca5dc64..7208454 100644 --- a/lib/connector/meshcore_connector.dart +++ b/lib/connector/meshcore_connector.dart @@ -186,6 +186,7 @@ class MeshCoreConnector extends ChangeNotifier { DateTime _lastChannelMsgRxTime = DateTime.fromMillisecondsSinceEpoch(0); static const int _radioQuietMs = 3000; static const int _radioQuietMaxWaitMs = 3000; + /// When companion radio stats are unavailable, keep the legacy fixed backoff. static const int _contactMsgBackoffFallbackMs = 5000; static const int _contactMsgBackoffMinMs = 500; @@ -349,6 +350,7 @@ class MeshCoreConnector extends ChangeNotifier { if (sw == null || !sw.isRunning) return false; return sw.elapsed < const Duration(seconds: 2); } + int? get currentFreqHz => _currentFreqHz; int? get currentBwHz => _currentBwHz; int? get currentSf => _currentSf; @@ -818,18 +820,19 @@ class MeshCoreConnector extends ChangeNotifier { // Quieter (more negative) → lower score; noisier → higher. const noiseQuietDbm = -118.0; const noiseNoisyDbm = -88.0; - final noiseT = - ((nf - noiseQuietDbm) / (noiseNoisyDbm - noiseQuietDbm)).clamp(0.0, 1.0); + final noiseT = ((nf - noiseQuietDbm) / (noiseNoisyDbm - noiseQuietDbm)) + .clamp(0.0, 1.0); final snr = stats.lastSnrDb; const snrGood = 12.0; const snrBad = -2.0; - final snrT = - (1.0 - ((snr - snrBad) / (snrGood - snrBad))).clamp(0.0, 1.0); + final snrT = (1.0 - ((snr - snrBad) / (snrGood - snrBad))).clamp(0.0, 1.0); final airBusy = _recentAirtimeBusyFraction(); - final severity = - (math.max(noiseT, snrT) * 0.82 + airBusy * 0.18).clamp(0.0, 1.0); + final severity = (math.max(noiseT, snrT) * 0.82 + airBusy * 0.18).clamp( + 0.0, + 1.0, + ); return (_contactMsgBackoffMinMs + severity * (_contactMsgBackoffMaxMs - _contactMsgBackoffMinMs)) @@ -856,9 +859,7 @@ class MeshCoreConnector extends ChangeNotifier { return bumpAt.isAfter(lastInboundRxTime) ? bumpAt : lastInboundRxTime; } - Future _waitForRadioQuiet({ - required DateTime lastInboundRxTime, - }) async { + Future _waitForRadioQuiet({required DateTime lastInboundRxTime}) async { // Wait for backoff after inbound traffic / RF airtime (avoid collision with // mesh propagation). Elapsed time uses the dot's airtime bump when newer. final backoffTargetMs = _contactMessageBackoffTargetMs(); diff --git a/lib/helpers/link_handler.dart b/lib/helpers/link_handler.dart index e83897a..b931ca1 100644 --- a/lib/helpers/link_handler.dart +++ b/lib/helpers/link_handler.dart @@ -10,10 +10,7 @@ class LinkHandler { final orange = brightness == Brightness.dark ? const Color(0xFFFFB74D) : const Color(0xFFE65100); - return base.copyWith( - color: orange, - decoration: TextDecoration.underline, - ); + return base.copyWith(color: orange, decoration: TextDecoration.underline); } /// Returns a [SelectableLinkify] on desktop or a [Linkify] on mobile. @@ -23,8 +20,7 @@ class LinkHandler { required TextStyle style, TextStyle? linkStyle, }) { - final effectiveLinkStyle = - linkStyle ?? defaultLinkStyle(context, style); + final effectiveLinkStyle = linkStyle ?? defaultLinkStyle(context, style); const options = LinkifyOptions(humanize: false, defaultToHttps: false); const linkifiers = [UrlLinkifier(), EmailLinkifier()]; void onOpen(LinkableElement link) => handleLinkTap(context, link.url); diff --git a/lib/l10n/app_bg.arb b/lib/l10n/app_bg.arb index 7593577..d4ebb4b 100644 --- a/lib/l10n/app_bg.arb +++ b/lib/l10n/app_bg.arb @@ -1943,5 +1943,68 @@ "settings_multiAck": "Мулти-потвърди: {value}", "settings_telemetryModeUpdated": "Режим на телеметрията е обновен", "map_showOverlaps": "Покриване на ключа на повтаряча", - "map_runTraceWithReturnPath": "Върни се по същия път." -} \ No newline at end of file + "map_runTraceWithReturnPath": "Върни се по същия път.", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "chat_sendCooldown": "Моля, изчакайте малко, преди да изпратите отново.", + "appSettings_languageHu": "Унгарски", + "appSettings_jumpToOldestUnread": "Преминете към най-старата непочетена статия", + "appSettings_jumpToOldestUnreadSubtitle": "Когато отворите чат с непрочетени съобщения, плъзнете надолу, за да видите първото непрочетено съобщение, вместо най-новото.", + "appSettings_languageJa": "Японски", + "appSettings_languageKo": "Корейски", + "radioStats_tooltip": "Статистика за радио и мрежа", + "radioStats_screenTitle": "Статистически данни за радиопредаванията", + "radioStats_notConnected": "Свържете се с устройство, за да видите статистически данни за радиопредаване.", + "radioStats_firmwareTooOld": "Статистиката на радиостанцията изисква съвместимо софтуерно решение версия 8 или по-нова.", + "radioStats_waiting": "Изчакване на данни…", + "radioStats_noiseFloor": "Ниво на шума: {noiseDbm} dBm", + "radioStats_lastRssi": "Последен RSSI: {rssiDbm} dBm", + "radioStats_lastSnr": "Последна стойност на SNR: {snr} dB", + "radioStats_txAir": "Време на въздух (общо): {seconds} секунди", + "radioStats_rxAir": "Общо време на използване на RX (в секунди): {seconds} с", + "radioStats_chartCaption": "Ниво на шума (dBm) за последните измервания.", + "radioStats_stripNoise": "Ниво на шума: {noiseDbm} dBm", + "radioStats_stripWaiting": "Извличане на данни за радиото…", + "radioStats_settingsTile": "Статистически данни за радиостанции", + "radioStats_settingsSubtitle": "Ниво на шума, RSSI, SNR и време на пренос" +} diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 98ddb93..c128a3a 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -1971,5 +1971,68 @@ "settings_telemetryModeUpdated": "Telemetriemodus aktualisiert", "settings_multiAck": "Mehrfach-Bestätigungen: {value}", "map_showOverlaps": "Überlappungen der Repeater-Taste", - "map_runTraceWithReturnPath": "Auf dem gleichen Pfad zurückkehren." -} \ No newline at end of file + "map_runTraceWithReturnPath": "Auf dem gleichen Pfad zurückkehren.", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "chat_sendCooldown": "Bitte warten Sie einen Moment, bevor Sie erneut senden.", + "appSettings_jumpToOldestUnread": "Zum ältesten, nicht gelesenen Eintrag springen", + "appSettings_languageHu": "Ungarisch", + "appSettings_jumpToOldestUnreadSubtitle": "Wenn Sie ein Chatfenster öffnen, in dem Nachrichten vorhanden sind, die noch nicht gelesen wurden, scrollen Sie zu der ersten unlesenen Nachricht, anstatt zur neuesten.", + "appSettings_languageJa": "Japanisch", + "appSettings_languageKo": "Koreanisch", + "radioStats_tooltip": "Daten zu Radio- und Mesh-Netzwerken", + "radioStats_screenTitle": "Senderinformationen", + "radioStats_notConnected": "Verbinden Sie ein Gerät, um Radiostatisiken anzuzeigen.", + "radioStats_firmwareTooOld": "Für die Verwendung der Funkstatistiken ist die Firmware-Version 8 oder höher erforderlich.", + "radioStats_waiting": "Warte auf Daten…", + "radioStats_noiseFloor": "Rauschpegel: {noiseDbm} dBm", + "radioStats_lastRssi": "Letzter RSSI-Wert: {rssiDbm} dBm", + "radioStats_lastSnr": "Letzter SNR: {snr} dB", + "radioStats_txAir": "Gesamt-TX-Zeit: {seconds} s", + "radioStats_rxAir": "Gesamt-RX-Zeit: {seconds} s", + "radioStats_chartCaption": "Rauschpegel (dBm) basierend auf den letzten Messwerten.", + "radioStats_stripNoise": "Rauschpegel: {noiseDbm} dBm", + "radioStats_stripWaiting": "Abrufen von Radiostatus…", + "radioStats_settingsTile": "Senderinformationen", + "radioStats_settingsSubtitle": "Rauschpegel, RSSI, Signal-Rausch-Verhältnis (SNR) und Nutzzeit" +} diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index a65d80f..154fec6 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -1971,5 +1971,68 @@ "settings_telemetryModeUpdated": "Modo de telemetría actualizado", "settings_multiAck": "Multi-ACKs: {value}", "map_showOverlaps": "Superposiciones de tecla repetidora", - "map_runTraceWithReturnPath": "Volver atrás por el mismo camino." -} \ No newline at end of file + "map_runTraceWithReturnPath": "Volver atrás por el mismo camino.", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "appSettings_jumpToOldestUnread": "Salta a los mensajes más antiguos sin leer", + "chat_sendCooldown": "Por favor, espere un momento antes de reenviar.", + "appSettings_languageHu": "Húngaro", + "appSettings_jumpToOldestUnreadSubtitle": "Cuando abras una conversación con mensajes sin leer, desplázate hacia el primer mensaje sin leer en lugar del más reciente.", + "appSettings_languageJa": "Japonés", + "appSettings_languageKo": "Coreano", + "radioStats_tooltip": "Estadísticas de radio y malla", + "radioStats_screenTitle": "Estadísticas de radio", + "radioStats_notConnected": "Conéctese a un dispositivo para visualizar estadísticas de radio.", + "radioStats_firmwareTooOld": "Las estadísticas de radio requieren un firmware compatible v8 o posterior.", + "radioStats_waiting": "Esperando datos…", + "radioStats_noiseFloor": "Nivel de ruido: {noiseDbm} dBm", + "radioStats_lastRssi": "Último RSSI: {rssiDbm} dBm", + "radioStats_lastSnr": "Último SNR: {snr} dB", + "radioStats_txAir": "Tiempo de emisión en Texas (total): {seconds} s", + "radioStats_rxAir": "Tiempo de transmisión de RX (total): {seconds} s", + "radioStats_chartCaption": "Nivel de ruido (dBm) en muestras recientes.", + "radioStats_stripNoise": "Nivel de ruido: {noiseDbm} dBm", + "radioStats_stripWaiting": "Obteniendo estadísticas de la radio…", + "radioStats_settingsTile": "Estadísticas de radio", + "radioStats_settingsSubtitle": "Nivel de ruido, RSSI, SNR y tiempo de transmisión" +} diff --git a/lib/l10n/app_fr.arb b/lib/l10n/app_fr.arb index 8bb0a46..90948d0 100644 --- a/lib/l10n/app_fr.arb +++ b/lib/l10n/app_fr.arb @@ -1943,5 +1943,68 @@ "settings_multiAck": "Multi-ACKs : {value}", "settings_telemetryModeUpdated": "Le mode télémétrie a été mis à jour", "map_showOverlaps": "Chevauchement de la touche répétitive", - "map_runTraceWithReturnPath": "Revenir sur le même chemin." -} \ No newline at end of file + "map_runTraceWithReturnPath": "Revenir sur le même chemin.", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "chat_sendCooldown": "Veuillez patienter un instant avant de réessayer.", + "appSettings_jumpToOldestUnread": "Accéder au message le plus ancien non lu", + "appSettings_languageHu": "Hongrois", + "appSettings_jumpToOldestUnreadSubtitle": "Lorsque vous ouvrez une conversation contenant des messages non lus, faites défiler la page jusqu'au premier message non lu, plutôt que jusqu'au dernier.", + "appSettings_languageJa": "Japonais", + "appSettings_languageKo": "Coréen", + "radioStats_tooltip": "Statistiques des radios et des réseaux sans fil", + "radioStats_screenTitle": "Statistiques de radio", + "radioStats_notConnected": "Connectez-vous à un appareil pour visualiser les statistiques de la radio.", + "radioStats_firmwareTooOld": "Les statistiques radio nécessitent un firmware compatible v8 ou une version ultérieure.", + "radioStats_waiting": "En attente des données…", + "radioStats_noiseFloor": "Niveau de bruit : {noiseDbm} dBm", + "radioStats_lastRssi": "Dernier RSSI : {rssiDbm} dBm", + "radioStats_lastSnr": "Dernier SNR : {snr} dB", + "radioStats_txAir": "Temps d'antenne à la télévision du Texas (total) : {seconds} s", + "radioStats_rxAir": "Temps d'utilisation de l'appareil RX (total) : {seconds} s", + "radioStats_chartCaption": "Niveau de bruit (dBm) sur les échantillons récents.", + "radioStats_stripNoise": "Niveau de bruit : {noiseDbm} dBm", + "radioStats_stripWaiting": "Récupération des statistiques de la radio…", + "radioStats_settingsTile": "Statistiques de radio", + "radioStats_settingsSubtitle": "Niveau de bruit, RSSI, rapport signal/bruit (SNR) et temps d'antenne" +} diff --git a/lib/l10n/app_hu.arb b/lib/l10n/app_hu.arb new file mode 100644 index 0000000..558e1f0 --- /dev/null +++ b/lib/l10n/app_hu.arb @@ -0,0 +1,2048 @@ +{ + "@@locale": "hu", + "appTitle": "MeshCore Open", + "nav_contacts": "Kapcsolatok", + "nav_channels": "Csatornák", + "nav_map": "Térkép", + "common_cancel": "Át kell venni", + "common_ok": "Rendben", + "common_connect": "Kapcsolódj", + "common_unknownDevice": "Tudatlan eszköz", + "common_save": "Mentés", + "common_delete": "Töröl", + "common_deleteAll": "Minden törlés", + "common_close": "Bezárás", + "common_edit": "Szerkesztés", + "common_add": "Hozzáad", + "common_settings": "Beállítások", + "common_disconnect": "Csatlakozást megszakasztani", + "common_connected": "Kapcsolódó", + "common_disconnected": "Elválasztva", + "common_create": "Készítsd", + "common_continue": "Folytatás", + "common_share": "Ossza meg", + "common_copy": "Másolat", + "common_retry": "Újrapróbálja", + "common_hide": "Elrejt", + "common_remove": "Eltávolít", + "common_enable": "Engedélyezés", + "common_disable": "Leteteszt", + "common_reboot": "Újraindítás", + "common_loading": "Betöltés...", + "common_notAvailable": "—", + "common_voltageValue": "{volts} V", + "@common_voltageValue": { + "placeholders": { + "volts": { + "type": "String" + } + } + }, + "common_percentValue": "{percent}%", + "@common_percentValue": { + "placeholders": { + "percent": { + "type": "int" + } + } + }, + "scanner_title": "MeshCore nyitott", + "connectionChoiceUsbLabel": "USB", + "connectionChoiceBluetoothLabel": "Bluetooth", + "connectionChoiceTcpLabel": "TCP", + "tcpScreenTitle": "TCP-n keresztül kapcsolódjon", + "tcpHostLabel": "IP-cím", + "tcpHostHint": "192.168.40.10", + "tcpPortLabel": "Múzeum", + "tcpPortHint": "5000", + "tcpStatus_notConnected": "Adja meg a célpontot, majd kapcsolja össze.", + "tcpStatus_connectingTo": "Kapcsolat a {endpoint}-hez...", + "@tcpStatus_connectingTo": { + "placeholders": { + "endpoint": { + "type": "String" + } + } + }, + "tcpErrorHostRequired": "Az IP-címet meg kell adni.", + "tcpErrorPortInvalid": "Az érték 1 és 65535 között kell lennie.", + "tcpErrorUnsupported": "A TCP-protokoll nem támogatott ez a platformon.", + "tcpErrorTimedOut": "A TCP-kapcsolat időtúllépett.", + "tcpConnectionFailed": "A TCP-kapcsolat sikertelen: {error}", + "@tcpConnectionFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "usbScreenTitle": "USB-en keresztül csatlakoztassuk", + "usbScreenSubtitle": "Válasszon egy azonosított soros eszközt, és közvetlenül csatlakoztassa a MeshCore-hoz.", + "usbScreenStatus": "Válasszon egy USB-es eszközt", + "usbScreenNote": "Az USB-es soros kommunikáció a támogatott Android eszközökön és asztali rendszereken is elérhető.", + "usbScreenEmptyState": "Nincs USB eszköz megtalálva. Csatlakoztasson egyet, majd frissítse a rendszert.", + "usbErrorPermissionDenied": "A USB-es hozzáférés megtagadva.", + "usbErrorDeviceMissing": "Az kiválasztott USB eszköz már nem elérhető.", + "usbErrorInvalidPort": "Válasszon egy érvényes USB-eszközt.", + "usbErrorBusy": "Egy másik USB-csatlakozás kérése már folyamatban van.", + "usbErrorNotConnected": "Nincs csatlakoztatott USB eszköz.", + "usbErrorOpenFailed": "Nem sikerült megnyitni a kiválasztott USB-eszközöt.", + "usbErrorConnectFailed": "Nem sikerült kapcsolatot létesíteni a kiválasztott USB-eszközhöz.", + "usbErrorUnsupported": "Ez a platform nem támogat USB-es soros kommunikációt.", + "usbErrorAlreadyActive": "Az USB-kapcsolat már be van állítva.", + "usbErrorNoDeviceSelected": "Nincs kiválasztva USB eszköz.", + "usbErrorPortClosed": "Az USB-kapcsolat nem aktív.", + "usbErrorConnectTimedOut": "Kapcsolódás sikertelen. Ellenőrizze, hogy a eszköz rendelkezik-e USB-hez tartozó firmware-rel.", + "usbFallbackDeviceName": "Web-szériás eszköz", + "usbStatus_notConnected": "Válasszon egy USB-es eszközt", + "usbStatus_connecting": "USB eszközhez való csatlakozás...", + "usbStatus_searching": "USB eszközök keresése...", + "usbConnectionFailed": "USB-kapcsolat sikertelen: {error}", + "@usbConnectionFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "scanner_scanning": "Készülékek keresése...", + "scanner_connecting": "Kapcsolódás...", + "scanner_disconnecting": "Kapcsolat megszakad...", + "scanner_notConnected": "Nem csatlakozva", + "scanner_connectedTo": "Kapcsolódik a {deviceName}-hez", + "@scanner_connectedTo": { + "placeholders": { + "deviceName": { + "type": "String" + } + } + }, + "scanner_searchingDevices": "MeshCore eszközök keresése...", + "scanner_tapToScan": "A Tap Scan funkció segítségével kereshet MeshCore eszközöket.", + "scanner_connectionFailed": "Kapcsolódás sikertelen: {error}", + "@scanner_connectionFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "scanner_stop": "Megállj", + "scanner_scan": "Szkenálás", + "scanner_bluetoothOff": "A Bluetooth kikapcsolva", + "scanner_bluetoothOffMessage": "Kérjük, kapcsolja be a Bluetooth-ot, hogy eszközök keresése lehessen.", + "scanner_chromeRequired": "Chrome böngésző szükséges", + "scanner_chromeRequiredMessage": "Ez az alkalmazás a Bluetooth funkcióhoz Google Chrome-ot vagy Chromium alapú böngészőt igényel.", + "scanner_enableBluetooth": "Engedje be a Bluetooth funkciót", + "device_quickSwitch": "Gyors váltás", + "device_meshcore": "MeshCore", + "settings_title": "Beállítások", + "settings_deviceInfo": "A készülék információi", + "settings_appSettings": "Alkalmazási beállítások", + "settings_appSettingsSubtitle": "Értesítések, üzenetküldés és térképi beállítások", + "settings_nodeSettings": "Műközép beállítások", + "settings_nodeName": "Vonal neve", + "settings_nodeNameNotSet": "Nem megállapított", + "settings_nodeNameHint": "Adja meg a csomópont nevét", + "settings_nodeNameUpdated": "Neve frissítve", + "settings_radioSettings": "Rádióbeállítások", + "settings_radioSettingsSubtitle": "Frekvencia, teljesítmény, szélesítési tényező", + "settings_radioSettingsUpdated": "A rádió beállítások frissítve", + "settings_location": "Helyszín", + "settings_locationSubtitle": "GPS koordináták", + "settings_locationUpdated": "A helyzet és a GPS beállítások frissítve", + "settings_locationBothRequired": "Kérjük, adja meg a földrajzi szélességet és hosszúságot.", + "settings_locationInvalid": "Érvénytelen szélesszög vagy hosszszög.", + "settings_locationGPSEnable": "GPS engedélyezve", + "settings_locationGPSEnableSubtitle": "Lehetővé teszi, hogy a GPS automatikusan frissítse a helyzetet.", + "settings_locationIntervalSec": "GPS-számolási intervallum (másodpercek)", + "settings_locationIntervalInvalid": "Az intervallum legalább 60 másodpercnek, de legfeljebb 86400 másodpercnak kell lennie.", + "settings_latitude": "Nyugat-–––––––––––––––––––––––––––––––", + "settings_longitude": "hosszúság", + "settings_contactSettings": "Kapcsolat beállítások", + "settings_contactSettingsSubtitle": "Beállítások, amelyek meghatározzák, hogyan lehet új kapcsolatokat hozzáadni.", + "settings_privacyMode": "Adatvédelem mód", + "settings_privacyModeSubtitle": "Elrejtsük a nevét/a helyszínt az űrianyagokban", + "settings_privacyModeToggle": "Engedje be a privát üzemmódot, hogy elrejtse a nevét és a helyét az online hirdetésekben.", + "settings_privacyModeEnabled": "Adatvédelem mód beállítva", + "settings_privacyModeDisabled": "Adatvédelem mód kikapcsolva", + "settings_actions": "Tevékenységek", + "settings_sendAdvertisement": "Hirdetés küldése", + "settings_sendAdvertisementSubtitle": "A nyilvános megjelenés", + "settings_advertisementSent": "Hirdetés elküldve", + "settings_syncTime": "Szinkronizációs idő", + "settings_syncTimeSubtitle": "Állítsa a készülék időzítését a telefon időjére", + "settings_timeSynchronized": "Időben szinkronizált", + "settings_refreshContacts": "Újraindítsd a kapcsolatok listát", + "settings_refreshContactsSubtitle": "Újra töltse a kontaktlista-adatokat a készülékről", + "settings_rebootDevice": "Újraindítás", + "settings_rebootDeviceSubtitle": "Indítsa újra a MeshCore eszközt.", + "settings_rebootDeviceConfirm": "Biztosan szeretné újraindítani a készüléket? Ebben az esetben a kapcsolat megszűnik.", + "settings_debug": "Hibakeresés", + "settings_bleDebugLog": "BLE hibaelhárítási napló", + "settings_bleDebugLogSubtitle": "BLE parancsok, válaszok és alapvető adatok", + "settings_appDebugLog": "App-debug log", + "settings_appDebugLogSubtitle": "Programozási hibajelzések", + "settings_about": "Ról", + "settings_aboutVersion": "MeshCore Open {version} verzió", + "@settings_aboutVersion": { + "placeholders": { + "version": { + "type": "String" + } + } + }, + "settings_aboutLegalese": "2026-os MeshCore nyílt forráskódú projekt", + "settings_aboutDescription": "Egy nyílt forráskódú Flutter kliens a MeshCore LoRa hálózati eszközök számára.", + "settings_aboutOpenMeteoAttribution": "LOS magassági adatok: Open-Meteo (CC BY 4.0)", + "settings_infoName": "Név", + "settings_infoId": "Az azonosító", + "settings_infoStatus": "Állapot", + "settings_infoBattery": "Akku", + "settings_infoPublicKey": "Nyelvkönyv", + "settings_infoContactsCount": "Kapcsolatok száma", + "settings_infoChannelCount": "Csatorna száma", + "settings_presets": "Előre beállított beállítások", + "settings_frequency": "Frekvencia (MHz)", + "settings_frequencyHelper": "300,0 – 2500,0", + "settings_frequencyInvalid": "Érvénytelen frekvencia (300-2500 MHz)", + "settings_bandwidth": "Kapacitás", + "settings_spreadingFactor": "Terjesztési tényező", + "settings_codingRate": "Kódolási sebesség", + "settings_txPower": "TX teljesítmény (dBm)", + "settings_txPowerHelper": "0 – 22", + "settings_txPowerInvalid": "Érvénytelen TX teljesítmény (0-22 dBm)", + "settings_clientRepeat": "Autonóm rendszer újra", + "settings_clientRepeatSubtitle": "Engedje, hogy ez a eszköz mások számára is ismételje a hálózati csomagokat.", + "settings_clientRepeatFreqWarning": "A hálózat nélküli kommunikációhoz 433, 869 vagy 918 MHz frekvenciát igényel.", + "settings_error": "Hiba: {message}", + "@settings_error": { + "placeholders": { + "message": { + "type": "String" + } + } + }, + "appSettings_title": "Alkalmazási beállítások", + "appSettings_appearance": "Megjelenés", + "appSettings_theme": "Téma", + "appSettings_themeSystem": "Alapértékek", + "appSettings_themeLight": "Világítás", + "appSettings_themeDark": "Sötét", + "appSettings_language": "Nyelv", + "appSettings_languageSystem": "Alapértékek", + "appSettings_languageEn": "Angol", + "appSettings_languageFr": "Francia", + "appSettings_languageEs": "Spanyol", + "appSettings_languageDe": "Német", + "appSettings_languagePl": "Lengyel", + "appSettings_languageSl": "szlovén nyelv", + "appSettings_languagePt": "Portugál", + "appSettings_languageIt": "Olasz", + "appSettings_languageZh": "Kínai", + "appSettings_languageSv": "Svéd", + "appSettings_languageNl": "Hollandi", + "appSettings_languageSk": "Szlovén nyelvre fordítás", + "appSettings_languageBg": "Bulgár", + "appSettings_languageRu": "Orosz", + "appSettings_languageUk": "Украинский", + "appSettings_enableMessageTracing": "Engedje meg a üzenetek nyomon követését", + "appSettings_enableMessageTracingSubtitle": "Adja meg a üzenetek részletes útvonal- és időzítési adatokat.", + "appSettings_notifications": "Értesítések", + "appSettings_enableNotifications": "Engedélyezze az értesítéseket", + "appSettings_enableNotificationsSubtitle": "Kapjon értesítéseket üzenetekről és hirdetésekről.", + "appSettings_notificationPermissionDenied": "A értesítési engedély megtagadva", + "appSettings_notificationsEnabled": "A figyelmeztetések engedélyezve", + "appSettings_notificationsDisabled": "A figyelmeztetések kikapcsolva", + "appSettings_messageNotifications": "Üzenet értesítések", + "appSettings_messageNotificationsSubtitle": "A figyelmeztetést megjelenítve, amikor új üzenet érkezik", + "appSettings_channelMessageNotifications": "Csatorna-üzenetek értesítése", + "appSettings_channelMessageNotificationsSubtitle": "A figyelmeztetést megjelenítve, amikor új üzenet érkezik a csatornáról", + "appSettings_advertisementNotifications": "Reklám értesítések", + "appSettings_advertisementNotificationsSubtitle": "A figyelmeztetést megjelenítve, amikor új csomópontok kerülnek felfedezésre.", + "appSettings_messaging": "Üzenetek küldése", + "appSettings_clearPathOnMaxRetry": "Egyértelmű út a Max Retry funkció használatával", + "appSettings_clearPathOnMaxRetrySubtitle": "A kapcsolat visszaállítás 5 sikertelen továbbítás után", + "appSettings_pathsWillBeCleared": "Ha 5-szer sikertelenül próbálunk, a útvonalat automatikusan tisztítjuk.", + "appSettings_pathsWillNotBeCleared": "A utak automatikusan nem tisztítódnak.", + "appSettings_autoRouteRotation": "Autóútok forgása", + "appSettings_autoRouteRotationSubtitle": "Válasszon a legjobb útvonalak között, vagy válassza a vízözön-módot.", + "appSettings_autoRouteRotationEnabled": "Az automatikus útvonalváltás engedélyezve", + "appSettings_autoRouteRotationDisabled": "Az automatikus útvonal-választás funkció kikapcsolva.", + "appSettings_maxRouteWeight": "Maximális útvonal súly", + "appSettings_maxRouteWeightSubtitle": "A lehető legnagyobb súly, amit egy útvonal sikeres szállítmányok során összegyűjthet.", + "appSettings_initialRouteWeight": "A kezdeti útvonal súlya", + "appSettings_initialRouteWeightSubtitle": "Az új, felfedezett útvonalakhoz tartozó kezdeti súly", + "appSettings_routeWeightSuccessIncrement": "Sikerhez vezető növelés", + "appSettings_routeWeightSuccessIncrementSubtitle": "A sikeresen teljesített útvonalhoz hozzáadott súly.", + "appSettings_routeWeightFailureDecrement": "Hibás súly csökkenése", + "appSettings_routeWeightFailureDecrementSubtitle": "A jártatásból eltávolított súly, ami a sikertelen szállítás következménye.", + "appSettings_maxMessageRetries": "Maximális üzenetek újraküldési próbálkozások", + "appSettings_maxMessageRetriesSubtitle": "A próbálkozások száma, mielőtt egy üzenetet hibásnak jelölünk.", + "path_routeWeight": "{weight}/{max}", + "@path_routeWeight": { + "placeholders": { + "weight": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "appSettings_battery": "Akku", + "appSettings_batteryChemistry": "Aakkum töltés kémia", + "appSettings_batteryChemistryPerDevice": "Beállítások {deviceName}-hez", + "@appSettings_batteryChemistryPerDevice": { + "placeholders": { + "deviceName": { + "type": "String" + } + } + }, + "appSettings_batteryChemistryConnectFirst": "Csatlakozzon egy eszközhez, hogy kiválassza", + "appSettings_batteryNmc": "18650 NMC (3,0-4,2 V)", + "appSettings_batteryLifepo4": "LiFePO4 (2,6–3,65 V)", + "appSettings_batteryLipo": "LiPo (3,0-4,2 V)", + "appSettings_mapDisplay": "Térkép megjelenítése", + "appSettings_showRepeaters": "Megismétlés", + "appSettings_showRepeatersSubtitle": "A térképen megjelenítsük a repeater-eket.", + "appSettings_showChatNodes": "Megjeleníts kommunikációs pontokat", + "appSettings_showChatNodesSubtitle": "A chat-szobákat megjelenítsük a térképen", + "appSettings_showOtherNodes": "Mutasson további csomópontokat", + "appSettings_showOtherNodesSubtitle": "Mutassa meg a többi hálózati elemet a térképen", + "appSettings_timeFilter": "Időbeli szűrés", + "appSettings_timeFilterShowAll": "Mutassa meg az összes csomópontot", + "appSettings_timeFilterShowLast": "Mutasson az utolsó {hours} órából származó adatokat.", + "@appSettings_timeFilterShowLast": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "appSettings_mapTimeFilter": "Térkép időszűrő", + "appSettings_showNodesDiscoveredWithin": "Megjeleníts olyan węzveket, amelyek a következő területen lettek felfedezve:", + "appSettings_allTime": "Minden időpont", + "appSettings_lastHour": "Az utolsó óra", + "appSettings_last6Hours": "Az utóban 6 óra", + "appSettings_last24Hours": "Az utóbbi 24 óra", + "appSettings_lastWeek": "A múlt héten", + "appSettings_offlineMapCache": "Offline térkép tárolás", + "appSettings_unitsTitle": "Egységek", + "appSettings_unitsMetric": "Méter (m / kilométer)", + "appSettings_unitsImperial": "Királyi (láb / mérföld)", + "appSettings_noAreaSelected": "Nincs kiválasztott terület.", + "appSettings_areaSelectedZoom": "Kiválasztott terület (zoom: {minZoom}-{maxZoom})", + "@appSettings_areaSelectedZoom": { + "placeholders": { + "minZoom": { + "type": "int" + }, + "maxZoom": { + "type": "int" + } + } + }, + "appSettings_debugCard": "Hibakeresés", + "appSettings_appDebugLogging": "App-ban történő hibakereséshez használt naplózás", + "appSettings_appDebugLoggingSubtitle": "Log alkalmazás hibaelhárítási üzenetek", + "appSettings_appDebugLoggingEnabled": "Az alkalmazás hibaelhárítási naplózás engedélyezve", + "appSettings_appDebugLoggingDisabled": "Az alkalmazás hibaelhárítási naplózatának bekapcsolása kiküszöbölve", + "contacts_title": "Kapcsolatok", + "contacts_noContacts": "Jelenleg még nincs kapcsolat.", + "contacts_contactsWillAppear": "A kapcsolatok megjelennek, amikor a eszközök hirdetnek.", + "contacts_unread": "Olvasatlan", + "contacts_searchContactsNoNumber": "Kapcsolatok keresése...", + "contacts_searchContacts": "Keresés {number}-ban {str}…", + "@contacts_searchContacts": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchFavorites": "Keresés {number}{str}... Kedvencek", + "@contacts_searchFavorites": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchUsers": "Search {number}{str} Users...", + "@contacts_searchUsers": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchRepeaters": "Keresés {number}-on, {str} típusú adóállomások között...", + "@contacts_searchRepeaters": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchRoomServers": "Keresés {number}-ban {str}...", + "@contacts_searchRoomServers": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_noUnreadContacts": "Nincs olvasatlan üzenetek", + "contacts_noContactsFound": "Nincs megtalálva semmilyen kapcsolat vagy csoport.", + "contacts_deleteContact": "Kapcsolattól töröl", + "contacts_removeConfirm": "Hogy töröljem a {contactName} nevű személyt a kontaktlistából?", + "@contacts_removeConfirm": { + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + "contacts_manageRepeater": "Ellenőriző eszköz kezelése", + "contacts_manageRoom": "A szobai szerver kezelése", + "contacts_roomLogin": "Szoba szerverbe való bejelentkezés", + "contacts_openChat": "Nyitott beszélgetés", + "contacts_editGroup": "Edit csoport", + "contacts_deleteGroup": "Csoport törlése", + "contacts_deleteGroupConfirm": "Hogy töröljem a \"{groupName}\"-t?", + "@contacts_deleteGroupConfirm": { + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "contacts_newGroup": "Új csoport", + "contacts_groupName": "Csoport neve", + "contacts_groupNameRequired": "A csoportnak meg kell adni a nevét.", + "contacts_groupNameReserved": "Ez a csoportnév foglalt", + "contacts_groupAlreadyExists": "A \"{name}\" nevű csoport már létezik.", + "@contacts_groupAlreadyExists": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "contacts_filterContacts": "Szűrj kontaktokat...", + "contacts_noContactsMatchFilter": "Nincs találat a megadott szűrés alapján.", + "contacts_noMembers": "Nincsenek tagok", + "contacts_lastSeenNow": "utóbbi időben", + "contacts_lastSeenMinsAgo": "~ {minutes} perc", + "@contacts_lastSeenMinsAgo": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "contacts_lastSeenHourAgo": "Kb. 1 óra", + "contacts_lastSeenHoursAgo": "~ {hours} óra", + "@contacts_lastSeenHoursAgo": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "contacts_lastSeenDayAgo": "Kb. 1 nap", + "contacts_lastSeenDaysAgo": "~ {days} days", + "@contacts_lastSeenDaysAgo": { + "placeholders": { + "days": { + "type": "int" + } + } + }, + "channels_title": "Csatornák", + "channels_noChannelsConfigured": "Nincs konfigurált csatorna.", + "channels_addPublicChannel": "Hozzon létre nyilvános csatornát", + "channels_searchChannels": "Keresési opciók...", + "channels_noChannelsFound": "Nincs megtalálható csatorna", + "channels_channelIndex": "{index}-os csatorna", + "@channels_channelIndex": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "channels_hashtagChannel": "Hashtag-ok közössége", + "channels_public": "A nyilvánosság számára", + "channels_private": "Személyes", + "channels_publicChannel": "Össztávos csatorna", + "channels_privateChannel": "Személyes csatorna", + "channels_editChannel": "Csatorna szerkesztése", + "channels_muteChannel": "Csendes csatorna", + "channels_unmuteChannel": "Engedje be a hangot", + "channels_deleteChannel": "Mozdony törlése", + "channels_deleteChannelConfirm": "Törlés {name}? Ez nem visszafordítható.", + "@channels_deleteChannelConfirm": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_channelDeleteFailed": "Nem sikerült törölni a \"{name}\" nevű csatornát.", + "@channels_channelDeleteFailed": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_channelDeleted": "A \"{name}\" nevű csatorna törölve", + "@channels_channelDeleted": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_addChannel": "Csatorna hozzáadása", + "channels_channelIndexLabel": "Csatorna index", + "channels_channelName": "Csatorna neve", + "channels_usePublicChannel": "Használja a nyilvános csatornát", + "channels_standardPublicPsk": "Általános, állami által finanszírozott PSK", + "channels_pskHex": "PSK (Hexadecimális kód)", + "channels_generateRandomPsk": "Véletlenszerűen generáljon PSK-t", + "channels_enterChannelName": "Kérjük, adja meg egy csatorna nevét", + "channels_pskMustBe32Hex": "A PSK 32-bázisú hexadecimális karakterből áll.", + "channels_channelAdded": "A \"{name}\" csatorna hozzáadva", + "@channels_channelAdded": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_editChannelTitle": "Módosítsd a csatornát {index}", + "@channels_editChannelTitle": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "channels_smazCompression": "SMAZ kompresszió", + "channels_channelUpdated": "A {name} csatorna frissítve", + "@channels_channelUpdated": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_publicChannelAdded": "A nyilvános csatorna hozzáadva", + "channels_sortBy": "Szűrés", + "channels_sortManual": "Használati útmutató", + "channels_sortAZ": "A-Z", + "channels_sortLatestMessages": "Legfrissebb üzenetek", + "channels_sortUnread": "Olvasatlan", + "channels_createPrivateChannel": "Létrehoz egy privát csatornát", + "channels_createPrivateChannelDesc": "Titkos kulcs segítségével védelem.", + "channels_joinPrivateChannel": "Csatlakozzon egy privát csatornához", + "channels_joinPrivateChannelDesc": "Kézzel adja meg a titkos kulcsot.", + "channels_joinPublicChannel": "Csatlakozzon a nyilvános csatornához", + "channels_joinPublicChannelDesc": "Bárki csatlakozhat ehhez a csatornához.", + "channels_joinHashtagChannel": "Csatlakozzon egy hashtage-os csatornához", + "channels_joinHashtagChannelDesc": "Bárkinek lehet csatlakoznia a hashtagekhez tartozó csatornához.", + "channels_scanQrCode": "Scanned egy QR-kódot", + "channels_scanQrCodeComingSoon": "Hamarosan", + "channels_enterHashtag": "Írja be a hashtaget", + "channels_hashtagHint": "pl. #csapat", + "chat_noMessages": "Még nincs üzenet.", + "chat_sendMessageToStart": "Küldj egy üzenetet, hogy elindulj!", + "chat_originalMessageNotFound": "A eredeti üzenet nem található.", + "chat_replyingTo": "Replying to {name}", + "@chat_replyingTo": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "chat_replyTo": "Reply to {name}", + "@chat_replyTo": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "chat_location": "Helyszín", + "chat_sendMessageTo": "Küldj üzenetet {contactName}-nek", + "@chat_sendMessageTo": { + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + "chat_typeMessage": "Írjon üzenetet...", + "chat_messageTooLong": "A üzenet túl hosszú (a maximális {maxBytes} bájt).", + "@chat_messageTooLong": { + "placeholders": { + "maxBytes": { + "type": "int" + } + } + }, + "chat_messageCopied": "Üzenet másolva", + "chat_messageDeleted": "Üzenet törölve", + "chat_retryingMessage": "Újrapróbálási üzenet", + "chat_retryCount": "Újrapróbál {current}/{max}", + "@chat_retryCount": { + "placeholders": { + "current": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + "chat_sendGif": "Küldj GIF-ot", + "chat_reply": "Válasz", + "chat_addReaction": "Hozzon létre reakciót", + "chat_me": "Én", + "emojiCategorySmileys": "Emoji", + "emojiCategoryGestures": "Testmozgások", + "emojiCategoryHearts": "Szívak", + "emojiCategoryObjects": "Tárgyak", + "gifPicker_title": "Válasszon egy GIF-et", + "gifPicker_searchHint": "GIF-ek keresése...", + "gifPicker_poweredBy": "Forrás: GIPHY", + "gifPicker_noGifsFound": "Nincsenek GIF-ek megtalálva.", + "gifPicker_failedLoad": "Nem sikerült betölteni a GIF-fájlokat.", + "gifPicker_failedSearch": "Nem sikerült a GIF-eket megtalálni.", + "gifPicker_noInternet": "Nincs internetkapcsolat.", + "debugLog_appTitle": "App-debug log", + "debugLog_bleTitle": "BLE hibajelentő napló", + "debugLog_copyLog": "Másolat napló", + "debugLog_clearLog": "Jelzett napló", + "debugLog_copied": "Hibajelentő napló másolva", + "debugLog_bleCopied": "BLE-log másolva", + "debugLog_noEntries": "Jelenleg még nem léteznek hibaelhárítási naplókat.", + "debugLog_enableInSettings": "Engedje be az alkalmazás hibaelhárítási naplózását a beállítások menüben.", + "debugLog_frames": "Keretek", + "debugLog_rawLogRx": "Az eredeti Log-RX", + "debugLog_noBleActivity": "Jelenleg nincs BLE-hez kapcsolódó tevékenység.", + "debugFrame_length": "Keret hossza: {count} bájt", + "@debugFrame_length": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "debugFrame_command": "Parancs: 0x{value}", + "@debugFrame_command": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "debugFrame_textMessageHeader": "Címzett:", + "debugFrame_destinationPubKey": "- Célhely: {pubKey}", + "@debugFrame_destinationPubKey": { + "placeholders": { + "pubKey": { + "type": "String" + } + } + }, + "debugFrame_timestamp": "- Időbélyeg: {timestamp}", + "@debugFrame_timestamp": { + "placeholders": { + "timestamp": { + "type": "int" + } + } + }, + "debugFrame_flags": "- Jelvények: 0x{value}", + "@debugFrame_flags": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "debugFrame_textType": "- Tartalom típusa: {type} ({label})", + "@debugFrame_textType": { + "placeholders": { + "type": { + "type": "int" + }, + "label": { + "type": "String" + } + } + }, + "debugFrame_textTypeCli": "Parancssori felület (CLI)", + "debugFrame_textTypePlain": "Egyszerű, alap, hagyományos", + "debugFrame_text": "- Tartalom: \"{text}\"", + "@debugFrame_text": { + "placeholders": { + "text": { + "type": "String" + } + } + }, + "debugFrame_hexDump": "Hex-dump:", + "chat_pathManagement": "Útvonal-kezelés", + "chat_ShowAllPaths": "Mutasson meg minden útvonalat", + "chat_routingMode": "Útvonal-kezelési mód", + "chat_autoUseSavedPath": "Automatikus (az eddigi útvonal használata)", + "chat_forceFloodMode": "Erőforrás-alapú áramlás mód", + "chat_recentAckPaths": "Legutóbbi használt útvonalak (gombra kattintva):", + "chat_pathHistoryFull": "Az előző lépések listája teljes. Törölj ki a bejegyzéseket, hogy újokat hozzáadhatsd.", + "chat_hopSingular": "ugor", + "chat_hopPlural": "babér", + "chat_hopsCount": "{count} {count, plural, =1{ugrás} other{ugrások}}", + "@chat_hopsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chat_successes": "sikerek", + "chat_removePath": "Törölje a elérési útvonalat", + "chat_noPathHistoryYet": "Még nincs útvonal-történet.\nKüldjön egy üzenetet, hogy megtudja a lehetséges útvonalakat.", + "chat_pathActions": "Céltúrások:", + "chat_setCustomPath": "Beállítsd a saját útvonalat", + "chat_setCustomPathSubtitle": "Kézzel megadott útvonal", + "chat_clearPath": "Egyértelmű út", + "chat_clearPathSubtitle": "A parancs új küldéskor újra kell aktivizálnia.", + "chat_pathCleared": "Útvonal cleared. A következő üzenet újból feltérképezheti az útvonalat.", + "chat_floodModeSubtitle": "Használja a \"útvonal\" kapcsolót az alkalmazás sávjában.", + "chat_floodModeEnabled": "Árvízvédelmi mód bekapcsolva. A visszaállítás a alkalmazásban található útvonal ikon segítségével.", + "chat_fullPath": "Teljes elérési út", + "chat_pathDetailsNotAvailable": "Az útvonal részletei még nem elérhetők. Próbálja meg küldeni egy üzenetet, hogy frissítse az információkat.", + "chat_pathSetHops": "Path set: {hopCount} {hopCount, plural, =1{hop} other{hops}} - {status}", + "@chat_pathSetHops": { + "placeholders": { + "hopCount": { + "type": "int" + }, + "status": { + "type": "String" + } + } + }, + "chat_pathSavedLocally": "Helyileg mentve. Kapcsolódjon a szinkronizáláshoz.", + "chat_pathDeviceConfirmed": "A készülék megvan.", + "chat_pathDeviceNotConfirmed": "A készülék még nem bizonyított.", + "chat_type": "Típus", + "chat_path": "Út", + "chat_publicKey": "Nyelvkönyv", + "chat_compressOutgoingMessages": "A küldött üzenetek tömörítése", + "chat_floodForced": "Áradás (kényszerített)", + "chat_directForced": "Közvetlen (erélyes)", + "chat_hopsForced": "{count} ánusz (erővel)", + "@chat_hopsForced": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chat_floodAuto": "Vízosztás (autó)", + "chat_direct": "Közvetlen", + "chat_poiShared": "Közös erőforrás", + "chat_unread": "Olvasatlan: {count}", + "@chat_unread": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chat_openLink": "Nyisd meg a linket?", + "chat_openLinkConfirmation": "Szeretnéd megnyitni ezt a linket a böngésződben?", + "chat_open": "Nyitott", + "chat_couldNotOpenLink": "Nem sikerült megnyitni a hivat: {url}", + "@chat_couldNotOpenLink": { + "placeholders": { + "url": { + "type": "String" + } + } + }, + "chat_invalidLink": "Érvénytelen hivatkozás formátum", + "map_title": "Grafikus ábrázás", + "map_lineOfSight": "Látási vonal", + "map_losScreenTitle": "Látási vonal", + "map_noNodesWithLocation": "Nincs olyan adatpont, amelyhez helyszín-információk tartoznak.", + "map_nodesNeedGps": "A pontoknak meg kell osztaniuk GPS koordinátáikat, hogy megjelenjenek a térképen.", + "map_nodesCount": "Csúcsok: {count}", + "@map_nodesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "map_pinsCount": "Csapok: {count}", + "@map_pinsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "map_chat": "Csevegés", + "map_repeater": "Ismétlő", + "map_room": "szoba", + "map_sensor": "Érzékelő", + "map_pinDm": "Jel (DM)", + "map_pinPrivate": "Titkos (privát)", + "map_pinPublic": "Jelmez (nyilvános)", + "map_lastSeen": "Utoljára látva", + "map_disconnectConfirm": "Biztosan szeretné kiírni ezt a készüléket?", + "map_from": "Attól", + "map_source": "Forrás", + "map_flags": "Zászló", + "map_shareMarkerHere": "Osztja ezt a tartalmat itt", + "map_setAsMyLocation": "Állítsa be a jelenlegi helyzetemként", + "map_pinLabel": "Címkét ragasztani", + "map_label": "Címke", + "map_pointOfInterest": "Érdekes hely", + "map_sendToContact": "Kapcsolatfelvételi űrlap", + "map_sendToChannel": "Küldés a csatornán", + "map_noChannelsAvailable": "Nincs elérhető csatorna.", + "map_publicLocationShare": "Térköz, nyilvános hely", + "map_publicLocationShareConfirm": "Most egy helyszínt megosztasz a {channelLabel} csatornán. Ez a csatorna nyilvános, és bárki, aki rendelkezik a PSK-val, megtekintheti.", + "@map_publicLocationShareConfirm": { + "placeholders": { + "channelLabel": { + "type": "String" + } + } + }, + "map_connectToShareMarkers": "Kapcsolódjon egy eszközhöz, hogy megoszthassa a vonalzókat.", + "map_filterNodes": "Szűrési pontok", + "map_nodeTypes": "Vonalak típusai", + "map_chatNodes": "Csevegési pontok", + "map_repeaters": "Újraküldők", + "map_otherNodes": "Egyéb csomópontok", + "map_keyPrefix": "Kulcsfontosságú előtag", + "map_filterByKeyPrefix": "Szűrj a kulcsos előtér szerint", + "map_publicKeyPrefix": "Névfelhasználó kulc-prefix", + "map_markers": "Jelölők", + "map_showSharedMarkers": "Mutassa meg a közös jeleket", + "map_showGuessedLocations": "Megjelenítsa a megjósolt csomópontok helyét", + "map_showDiscoveryContacts": "Megjelenítse a Discovery-nál elérhet kontaktokat", + "map_guessedLocation": "Tippolt hely", + "map_lastSeenTime": "Utoljára megjelent idő", + "map_sharedPin": "Gemeinsames PIN-kód", + "map_joinRoom": "Csatlakozás a szobához", + "map_manageRepeater": "Ellenőriző eszköz kezelése", + "map_tapToAdd": "Nyomj meg a csomópontokhoz, hogy hozzáadd őket az útvonalhoz.", + "map_runTrace": "Útvonal követés", + "map_removeLast": "Törölj utolsó", + "map_pathTraceCancelled": "Az útvonal követés megszakadt.", + "mapCache_title": "Offline térkép tárolás", + "mapCache_selectAreaFirst": "Válasszon egy területet, amelyet először cache-oljon.", + "mapCache_noTilesToDownload": "Nincsenek letölthető tile-ok ebben a területben.", + "mapCache_downloadTilesTitle": "Letöltsd a tile-okat", + "mapCache_downloadTilesPrompt": "Töltse le {count} darab tile-t offline használatra?", + "@mapCache_downloadTilesPrompt": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_downloadAction": "Letöltés", + "mapCache_cachedTiles": "Tárolt {count} darab", + "@mapCache_cachedTiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_cachedTilesWithFailed": "Cached {downloaded} tiles ({failed} failed)", + "@mapCache_cachedTilesWithFailed": { + "placeholders": { + "downloaded": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "mapCache_clearOfflineCacheTitle": "Tiszta offline tárhely", + "mapCache_clearOfflineCachePrompt": "Távolítsa el az összes tárolt térképmegjelenítőt?", + "mapCache_offlineCacheCleared": "A helyi memóriát töröltük.", + "mapCache_noAreaSelected": "Nincs kiválasztott terület.", + "mapCache_cacheArea": "Tároló terület", + "mapCache_useCurrentView": "Használja a jelenlegi nézetet", + "mapCache_zoomRange": "Zoom tartomány", + "mapCache_estimatedTiles": "Becsült kerámiák: {count}", + "@mapCache_estimatedTiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_downloadedTiles": "Letöltve {completed} / {total}", + "@mapCache_downloadedTiles": { + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "mapCache_downloadTilesButton": "Letöltsd a tile-okat", + "mapCache_clearCacheButton": "Ósztótt adatokat", + "mapCache_failedDownloads": "Sikertelen letöltések: {count}", + "@mapCache_failedDownloads": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}", + "@mapCache_boundsLabel": { + "placeholders": { + "north": { + "type": "String" + }, + "south": { + "type": "String" + }, + "east": { + "type": "String" + }, + "west": { + "type": "String" + } + } + }, + "time_justNow": "Most", + "time_minutesAgo": "{minutes} perckel ezelőtt", + "@time_minutesAgo": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "time_hoursAgo": "{hours} óva", + "@time_hoursAgo": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "time_daysAgo": "{days}d ago", + "@time_daysAgo": { + "placeholders": { + "days": { + "type": "int" + } + } + }, + "time_hour": "óra", + "time_hours": "órák", + "time_day": "nap", + "time_days": "napok", + "time_week": "het", + "time_weeks": "het, hetek", + "time_month": "hónap", + "time_months": "hónapok", + "time_minutes": "percek", + "time_allTime": "Bármely időpont", + "dialog_disconnect": "Csatlakozást megszakasztani", + "dialog_disconnectConfirm": "Biztosan szeretné kiírni ezt a készüléket?", + "login_repeaterLogin": "Ismételt bejelentkezés", + "login_roomLogin": "Szoba szerverbe való bejelentkezés", + "login_password": "Jelszó", + "login_enterPassword": "Adja meg a jelszót", + "login_savePassword": "Mentse el a jelszót", + "login_savePasswordSubtitle": "A jelszó biztonságosan tárolódik ezen a készüléken.", + "login_repeaterDescription": "Adja meg a repeater (ismétítő) jelszót, hogy hozzáférhessen a beállításokhoz és az állapot információkhoz.", + "login_roomDescription": "Adja meg a belépési kódot, hogy hozzáférhessen a beállításokhoz és az állapot információkhoz.", + "login_routing": "Útvonal meghatározás", + "login_routingMode": "Útvonal-kezelési mód", + "login_autoUseSavedPath": "Automatikus (az eddigi útvonal használata)", + "login_forceFloodMode": "Erőforrás-alapú áramlás mód", + "login_managePaths": "Útvonalak kezelése", + "login_login": "Bejelentkezés", + "login_attempt": "Megpróbálás {current}/{max}-adik", + "@login_attempt": { + "placeholders": { + "current": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + "login_failed": "Belépés sikertelen: {error}", + "@login_failed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "login_failedMessage": "Belépés sikertelen. Vagy a jelszó helytelen, vagy a hálózati kapcsolat nem létesül.", + "common_reload": "Újra töltés", + "common_clear": "Egyértelmű", + "path_currentPath": "Jelenlegi útvonal: {path}", + "@path_currentPath": { + "placeholders": { + "path": { + "type": "String" + } + } + }, + "path_usingHopsPath": "{count} {count, plural, =1{ugrás} other{ugrások}} útvonal használata", + "@path_usingHopsPath": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "path_enterCustomPath": "Adja meg a saját elérési útvonalat", + "path_currentPathLabel": "Jelenlegi útvonal", + "path_hexPrefixInstructions": "Adja meg a 2 karakteres hexadecimális előtagokat minden lépéshez, tagolva kommával.", + "path_hexPrefixExample": "Példa: A1, F2, 3C (minden csomó az első részét használja a nyilvános kulcsából)", + "path_labelHexPrefixes": "Út (hex-prefixek)", + "path_helperMaxHops": "A maximális hossz 64 karakter. Minden előző rész 2 hatos számjegyből áll (1 bájt).", + "path_selectFromContacts": "Válasszon a kontaktlista elembek közül:", + "path_noRepeatersFound": "Nincs megtalálva semmilyen ismétlődő vagy helyiség-szolgáltató szervert.", + "path_customPathsRequire": "Az egyedi útvonalaknak szükségük van átjáró pontokra, amelyek képesek üzeneteket továbbítani.", + "path_invalidHexPrefixes": "Érvénytelen hexadecimális előtagok: {prefixes}", + "@path_invalidHexPrefixes": { + "placeholders": { + "prefixes": { + "type": "String" + } + } + }, + "path_tooLong": "Az út túl hosszú. A maximális engedélyezett lépések száma 64.", + "path_setPath": "Útvonal meghatározása", + "repeater_management": "Adatkapcsolás kezelése", + "room_management": "Szoba-szerver kezelés", + "repeater_managementTools": "Menedzsmentes eszközök", + "repeater_status": "Állapot", + "repeater_statusSubtitle": "Megtekintheted a repeater állapotát, statisztikáit és a környező eszközök adatait.", + "repeater_telemetry": "Adatvisszaadás", + "repeater_telemetrySubtitle": "Tekintsük a szenzorok és a rendszer állapotának adatát", + "repeater_cli": "Parancssori felület (CLI)", + "repeater_cliSubtitle": "Küldj parancsokat a repeaternek.", + "repeater_neighbors": "Szomszédok", + "repeater_neighborsSubtitle": "Tekintsük a nullás lépésű szomszédokat.", + "repeater_settings": "Beállítások", + "repeater_settingsSubtitle": "Állítsa be a repeater paramétereket", + "repeater_statusTitle": "Adatkapcsolódás állapot", + "repeater_routingMode": "Útvonal-kezelési mód", + "repeater_autoUseSavedPath": "Automatikus (az eddigi útvonal használata)", + "repeater_forceFloodMode": "Erőforrás-alapú áramlás mód", + "repeater_pathManagement": "Útvonal-kezelés", + "repeater_refresh": "Újrafriszol", + "repeater_statusRequestTimeout": "Az állapotkérés időtúlt.", + "repeater_errorLoadingStatus": "Hiba a státusz betöltés közben: {error}", + "@repeater_errorLoadingStatus": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_systemInformation": "Rendszerinformációk", + "repeater_battery": "Akku", + "repeater_clockAtLogin": "Óra (bejelentkezéskor)", + "repeater_uptime": "A rendszer elérhetősége", + "repeater_queueLength": "Várakozási sor hossza", + "repeater_debugFlags": "Hibakeresési beállítások", + "repeater_radioStatistics": "Rádió statisztika", + "repeater_lastRssi": "Utolsó RSSI érték", + "repeater_lastSnr": "Utolsó SNR", + "repeater_noiseFloor": "Háttérzaj szint", + "repeater_txAirtime": "TX Airtime", + "repeater_rxAirtime": "RX Airtime", + "repeater_packetStatistics": "Csomagok statisztikája", + "repeater_sent": "Elküldve", + "repeater_received": "Megérkezett", + "repeater_duplicates": "Duplák", + "repeater_daysHoursMinsSecs": "{days} days {hours}h {minutes}m {seconds}s", + "@repeater_daysHoursMinsSecs": { + "placeholders": { + "days": { + "type": "int" + }, + "hours": { + "type": "int" + }, + "minutes": { + "type": "int" + }, + "seconds": { + "type": "int" + } + } + }, + "repeater_packetTxTotal": "Összesen: {total}, Árvíz: {flood}, Közvetlen: {direct}", + "@repeater_packetTxTotal": { + "placeholders": { + "total": { + "type": "int" + }, + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } + } + }, + "repeater_packetRxTotal": "Összesen: {total}, Árvíz: {flood}, Közvetlen: {direct}", + "@repeater_packetRxTotal": { + "placeholders": { + "total": { + "type": "int" + }, + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } + } + }, + "repeater_duplicatesFloodDirect": "Áradás: {flood}, Közvetlen: {direct}", + "@repeater_duplicatesFloodDirect": { + "placeholders": { + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } + } + }, + "repeater_duplicatesTotal": "Összesen: {total}", + "@repeater_duplicatesTotal": { + "placeholders": { + "total": { + "type": "int" + } + } + }, + "repeater_settingsTitle": "Adatátvisszaadási beállítások", + "repeater_basicSettings": "Alapbeállítások", + "repeater_repeaterName": "Adóállomás neve", + "repeater_repeaterNameHelper": "Ez a repeater neve", + "repeater_adminPassword": "Adminisztrátori jelszó", + "repeater_adminPasswordHelper": "Teljes jogosultságú jelszó", + "repeater_guestPassword": "Vendég felhasználói név/jelszó", + "repeater_guestPasswordHelper": "Csak olvasási jogosítást biztosító jelszó", + "repeater_radioSettings": "Rádióbeállítások", + "repeater_frequencyMhz": "Frekvencia (MHz)", + "repeater_frequencyHelper": "300–2500 MHz", + "repeater_txPower": "TX Power", + "repeater_txPowerHelper": "1-30 dBm", + "repeater_bandwidth": "Adatkapacitás", + "repeater_spreadingFactor": "Terjesztési tényező", + "repeater_codingRate": "Kódolási sebesség", + "repeater_locationSettings": "Helyszínbeállítások", + "repeater_latitude": "Nyugat–keleti szélesség", + "repeater_latitudeHelper": "Desztes fokok (pl. 37,7749)", + "repeater_longitude": "hosszúság", + "repeater_longitudeHelper": "Desztes fokok (pl. -122.4194)", + "repeater_features": "Jellemzők", + "repeater_packetForwarding": "Csomagok továbbítás", + "repeater_packetForwardingSubtitle": "Engedje, hogy a repeater továbbítsa a csomagokat.", + "repeater_guestAccess": "Vendégek számára elérhető", + "repeater_guestAccessSubtitle": "Engedje meg a vendégek számára, hogy csak olvassák a tartalmat", + "repeater_privacyMode": "Adatvédelem mód", + "repeater_privacyModeSubtitle": "Elrejtse a nevét/a helyszínt az űrlapon", + "repeater_advertisementSettings": "Reklámbeállítások", + "repeater_localAdvertInterval": "Helyi hirdetés időtartama", + "repeater_localAdvertIntervalMinutes": "{minutes} perc", + "@repeater_localAdvertIntervalMinutes": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "repeater_floodAdvertInterval": "Vízosztály-hirdetés időtartama", + "repeater_floodAdvertIntervalHours": "{hours} óra", + "@repeater_floodAdvertIntervalHours": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "repeater_encryptedAdvertInterval": "Kódolt hirdetés-szünet", + "repeater_dangerZone": "Veszélyzóna", + "repeater_rebootRepeater": "Újraindítás", + "repeater_rebootRepeaterSubtitle": "Indítsa újra a repeater-t.", + "repeater_rebootRepeaterConfirm": "Biztosan szeretné újraindítani ezt a repeatert?", + "repeater_regenerateIdentityKey": "Újra generálja az azonosító kulcsot", + "repeater_regenerateIdentityKeySubtitle": "Új nyilvános/személyes kulcs-párt generáljon", + "repeater_regenerateIdentityKeyConfirm": "Ez új azonosítást fog létrehozni a repeater számára. Folytatni?", + "repeater_eraseFileSystem": "Törölje a fájlrendszert", + "repeater_eraseFileSystemSubtitle": "Formázza a duplázó fájlrendszert.", + "repeater_eraseFileSystemConfirm": "FIGYELEM: Ez törli az összes adatot a repeater-en. Ez nem visszafordítható!", + "repeater_eraseSerialOnly": "Az Erase funkció csak a soros konzolon érhető el.", + "repeater_commandSent": "Parancs elküldve: {command}", + "@repeater_commandSent": { + "placeholders": { + "command": { + "type": "String" + } + } + }, + "repeater_errorSendingCommand": "Hibás parancs küldés: {error}", + "@repeater_errorSendingCommand": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_confirm": "Beküldve", + "repeater_settingsSaved": "Beállítások sikeresen mentve", + "repeater_errorSavingSettings": "Hibás beállítások mentése: {error}", + "@repeater_errorSavingSettings": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_refreshBasicSettings": "Visszaállítás az alapértékekre", + "repeater_refreshRadioSettings": "Frissítse a rádió beállításait", + "repeater_refreshTxPower": "Újraindítás TX-támogatással", + "repeater_refreshLocationSettings": "Újraindítás helyszín beállításokkal", + "repeater_refreshPacketForwarding": "Csomagok továbbításának frissítése", + "repeater_refreshGuestAccess": "Újraindítás vendégHozzáférés", + "repeater_refreshPrivacyMode": "Visszaállítás a magánéletvédő módra", + "repeater_refreshAdvertisementSettings": "Újraindítás hirdetés beállítások", + "repeater_refreshed": "{label} frissítve", + "@repeater_refreshed": { + "placeholders": { + "label": { + "type": "String" + } + } + }, + "repeater_errorRefreshing": "Hiba a {label} frissítés közben", + "@repeater_errorRefreshing": { + "placeholders": { + "label": { + "type": "String" + } + } + }, + "repeater_cliTitle": "CLI (parancssori felület)", + "repeater_debugNextCommand": "Hibakeresés, következő parancs", + "repeater_commandHelp": "Segítség", + "repeater_clearHistory": "Egyértelmű történet", + "repeater_noCommandsSent": "Még egyik parancsot sem küldtünk.", + "repeater_typeCommandOrUseQuick": "Írja be a parancsot alább, vagy használja a gyors parancsokat.", + "repeater_enterCommandHint": "Írja be a parancsot...", + "repeater_previousCommand": "Előző parancs", + "repeater_nextCommand": "Következő parancs", + "repeater_enterCommandFirst": "Add meg először egy parancsot", + "repeater_cliCommandFrameTitle": "CLI parancssor felépítése", + "repeater_cliCommandError": "Hiba: {error}", + "@repeater_cliCommandError": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_cliQuickGetName": "Kapcsold össze a nevet", + "repeater_cliQuickGetRadio": "Szerezd a rádiót", + "repeater_cliQuickGetTx": "Szerezd a TX-t", + "repeater_cliQuickNeighbors": "Szomszédok", + "repeater_cliQuickVersion": "Verzió", + "repeater_cliQuickAdvertise": "Hirdetés", + "repeater_cliQuickClock": "óra", + "repeater_cliHelpAdvert": "Elküldi egy hirdetési csomagot", + "repeater_cliHelpReboot": "Újraindítja a készüléket. (Kérjük, vegye figyelembe, hogy valószínűleg \"Időhiba\" üzenetet fog kapni, ami normális)", + "repeater_cliHelpClock": "A jelenlegi időt mutatja az egyes eszközök karórája alapján.", + "repeater_cliHelpPassword": "Új adminisztrációs jelszót állít be a eszköz számára.", + "repeater_cliHelpVersion": "Megjeleníti a készülék verzióját és a szoftver verziószámát.", + "repeater_cliHelpClearStats": "Visszaállítja a különböző statisztikai mérőszámokat a nullára.", + "repeater_cliHelpSetAf": "Beállítja az idő-szabályozási tényezőt.", + "repeater_cliHelpSetTx": "Beállítja a LoRa átviteli teljesítményt dBm-ben (a rendszer újraindításával alkalmazható).", + "repeater_cliHelpSetRepeat": "Engedélyezi vagy tiltja meg a repeater szerepet ezen a csomón.", + "repeater_cliHelpSetAllowReadOnly": "(Szoba szerver) Ha \"igen\", akkor üres jelszóval történő bejelentkezés engedélyezett lesz, de nem lehet üzeneteket küldeni a szobában. (Csak olvasási funkció)", + "repeater_cliHelpSetFloodMax": "Beállítja a bejövő adatcsomagok maximális számát (ha ez a érték nagyobb vagy egyenlő a maximális értékkel, a csomag nem továbbítódik).", + "repeater_cliHelpSetIntThresh": "Beállítja az interferencia határértéket (dB-ben). Az alapérték 14. Ha 0-ra állítja, kiküntheti a csatornák közötti interferencia detektálást.", + "repeater_cliHelpSetAgcResetInterval": "Beállítja az intervallumot, amely a \"Automatikus gain\" szabályozó újraindításához szükséges. Beállítás értéke 0, ha a funkciót le kell tiltani.", + "repeater_cliHelpSetMultiAcks": "Engedélyezi vagy kikapcsolja a „dupla visszaigazolás” funkciót.", + "repeater_cliHelpSetAdvertInterval": "Beállítja az időzítő intervallumot percenként, hogy egy helyi (nincs átjáró) hirdetési csomagot küldjen. Beállítás értéke 0, ha a funkciót le szeretné tiltani.", + "repeater_cliHelpSetFloodAdvertInterval": "Beállítja az időzítő intervallumot órában, hogy egy \"áramló\" hirdetési üzenetet küldjön. Beállítás értéke 0, ha a funkciót kikapcsolni kell.", + "repeater_cliHelpSetGuestPassword": "Beállítja/frissíti a vendég felhasználói fiókot. (Ez lehetővé teszi a visszatérő felhasználók számára, hogy a \"Statistika lekérdezése\" kérést elküldjék)", + "repeater_cliHelpSetName": "Megadja az űrlap neve.", + "repeater_cliHelpSetLat": "Beállítja az hirdetés térképen megjelenő pont koordinátájának (tizedes fokokban) a latitude-ját.", + "repeater_cliHelpSetLon": "Beállítja az hirdetés térképen megjelenő hosszúság koordinátát (tizedes fokokban).", + "repeater_cliHelpSetRadio": "Teljesen új rádióparamétereket állít be, és azokat a beállításokba menti. Az alkalmazásához \"újraindítás\" parancs szükséges.", + "repeater_cliHelpSetRxDelay": "Beállítások (kísérleti): Alapérték (legalább 1 értékre kell állítani, hogy hatás legyen), amely alapján a fogadott csomagokhoz enyhe késést alkalmazunk, a jelet ereje/pontszám alapján. 0-ra állítva a funkciót lekapcsoljuk.", + "repeater_cliHelpSetTxDelay": "Beállítja egy tényezőt, amely a légköri idővel szorozva, egy áramlás-üzem módú csomaghoz, valamint egy véletlenszerű slot-rendszerhez, hogy késleltesse a továbbítását. (az ütközések valószínűségének csökkentése érdekében)", + "repeater_cliHelpSetDirectTxDelay": "Hasonló a txdelay-hez, de ebben az esetben egy véletlenszerű késést alkalmazunk a közvetlen módú csomagok továbbításakor.", + "repeater_cliHelpSetBridgeEnabled": "Engedélyez/Tiltás a híd funkciójának.", + "repeater_cliHelpSetBridgeDelay": "Állíts be egy késleztatást a csomagok újbóli továbbításakor.", + "repeater_cliHelpSetBridgeSource": "Döntse el, hogy a híd fogadott vagy elküldött csomagokat fogja-e továbbítani.", + "repeater_cliHelpSetBridgeBaud": "Állítsa be a soros kommunikáció sebességét az RS232 hídok számára.", + "repeater_cliHelpSetBridgeSecret": "Állítsa be a titkos kapcsolatot az ESPNOW hídokhoz.", + "repeater_cliHelpSetAdcMultiplier": "Lehetővé teszi a felhasználónak, hogy egyedi tényezőt állíts be a riportolt akkumulátor feszültségének módosításához (ez csak bizonyos alkatrészeken támogatott).", + "repeater_cliHelpTempRadio": "Időjárás szerinti rádióparamétereket állít be a megadott időtartamra, majd visszaállítja az eredeti beállításokat. (Nem menti a beállításokat a beállítások részben).", + "repeater_cliHelpSetPerm": "A ACL-t módosítja. Ha a \"permissions\" érték 0, akkor eltávolítja a megfelelő bejegyzést (a pubkey előtag alapján). Új bejegyzést hoz létre, ha a pubkey-hex teljes hossza, és jelenleg nem szerepel az ACL-ben. A bejegyzést frissíti a megfelelő pubkey előtag alapján. A engedélyek különbözőek a különböző firmware szerepek között, de az alsó 2 bit a következő értékeket képviseli: 0 (Vendég), 1 (Csak olvasás), 2 (Olvasás és írás), 3 (Adminisztrátor)", + "repeater_cliHelpGetBridgeType": "Kapcsolatok: hid típusú, RS232, ESPNOW", + "repeater_cliHelpLogStart": "Elindítja a csomagok naplózását a fájlrendszerbe.", + "repeater_cliHelpLogStop": "Megállítja a csomagok naplózását a fájlrendszerbe.", + "repeater_cliHelpLogErase": "Törli a fájlrendszerből a csomagok log-fájljait.", + "repeater_cliHelpNeighbors": "Mutat egy listát, amely tartalmazza a más repeater-ek által hallott adatok listáját, amelyek 0-hop hirdetések révén érhetők el. Minden sor az alábbi formát követi: id-prefix-hex:timestamp:snr-times-4", + "repeater_cliHelpNeighborRemove": "Törli az első, a megadott kulcs-prefix (hexadecimális formában) alapján megegyező bejegyzést a szomszédok listájából.", + "repeater_cliHelpRegion": "(sorozat) Lista az összes meghatározott területet és a jelenlegi árvízvédelmi engedélyeket.", + "repeater_cliHelpRegionLoad": "FIGYELEM: ez egy speciális, több parancsot tartalmazó futtatás. Minden következő parancs egy területtel kapcsolatos, amely egyenletes szóközökkel (a szülő-gyermek kapcsolatot jelző) megkülönböztethető. A parancs végrehajtása egy üres sor/parancs küldésével történik.", + "repeater_cliHelpRegionGet": "Keresések egy adott név előtérrel (vagy \"*\" globális hatókörre). Válasz: \"-> region-név (szülő-név) 'F'\"", + "repeater_cliHelpRegionPut": "Hozzáad vagy frissíti egy régió definíciót megadott néven.", + "repeater_cliHelpRegionRemove": "Eltávolítja a megadott nevet használó régió-definíciót. (pontosan meg kell egyeznie, és nem lehet gyermekrégiója)", + "repeater_cliHelpRegionAllowf": "Beállítja a megadott területre vonatkozó \"víz\" jogosultságot. (A globális/régi beállítások esetén a \"*\" jelölő)", + "repeater_cliHelpRegionDenyf": "Eltávolítja a megadott területre vonatkozó \"F\"lood (víz) engedélyt. (FIGYELEM: jelenleg nem javasolt ezt a globális/régi verzióban használni!!)", + "repeater_cliHelpRegionHome": "Visszaállítja a jelenlegi „otthoni” régiót. (Ez a beállítás még nem került alkalmazásra, csak jövőbeli használatra fenyelve)", + "repeater_cliHelpRegionHomeSet": "Beállítja a \"házi\" régiót.", + "repeater_cliHelpRegionSave": "Megőrzi a régió listát/térképet a tárolóban.", + "repeater_cliHelpGps": "Megadja a GPS állapotát. Ha a GPS kikapcsolva van, akkor csak \"ki\" választot ad, ha be van, akkor \"be\", \"állapot\", \"pozíció\", \"satellitok száma\" értékeket ad.", + "repeater_cliHelpGpsOnOff": "Engedi a GPS működés állapotát.", + "repeater_cliHelpGpsSync": "A hálózati időt az GPS óra időjével szinkronizálja.", + "repeater_cliHelpGpsSetLoc": "Beállítja a węsz pozícióját GPS koordináták alapján, és menti a beállításokat.", + "repeater_cliHelpGpsAdvert": "Adja meg a hirdetés konfigurációjának helyszín-információját:\n- none: ne tartalmazza a helyszínt a hirdetésekben\n- share: megosztja a GPS-helyszínt (SensorManager-ből)\n- prefs: hirdeti a beállításokban tárolt helyszínt", + "repeater_cliHelpGpsAdvertSet": "Beállítja a hirdetés helyszín-specifikus beállításait.", + "repeater_commandsListTitle": "Parancsok listája", + "repeater_commandsListNote": "FIGYELEM: a különböző \"set ...\" parancsok mellett létezik egy \"get ...\" parancs is.", + "repeater_general": "Általános", + "repeater_settingsCategory": "Beállítások", + "repeater_bridge": "Híd", + "repeater_logging": "Naplózás", + "repeater_neighborsRepeaterOnly": "Szomszédok (Csak ismétlő funkció)", + "repeater_regionManagementRepeaterOnly": "Regionális menedzsment (Csak egyirányú kommunikáció)", + "repeater_regionNote": "Region-specifikus parancsokat vezettek be a régiók definiálására és a hozzájuk tartozó engedélyek kezelésére.", + "repeater_gpsManagement": "GPS-vezérlés", + "repeater_gpsNote": "Az GPS-al kapcsolatos funkciók lehetővé teszik a helyszín-személyesítéssel kapcsolatos feladatok kezelését.", + "telemetry_receivedData": "Kapott adatokat a szenzorokról", + "telemetry_requestTimeout": "Az adatkapcsolati kérés sikertelen.", + "telemetry_errorLoading": "Hiba az adatok begyűjtésében: {error}", + "@telemetry_errorLoading": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "telemetry_noData": "Nincsenek elérhető telemetriadatok.", + "telemetry_channelTitle": "{channel} csatorna", + "@telemetry_channelTitle": { + "placeholders": { + "channel": { + "type": "int" + } + } + }, + "telemetry_batteryLabel": "Akku", + "telemetry_voltageLabel": "Feszültség", + "telemetry_mcuTemperatureLabel": "MCU hőmérséklet", + "telemetry_temperatureLabel": "Hőmérséklet", + "telemetry_currentLabel": "Jelenlegi", + "telemetry_batteryValue": "{percent}% / {volts}V", + "@telemetry_batteryValue": { + "placeholders": { + "percent": { + "type": "int" + }, + "volts": { + "type": "String" + } + } + }, + "telemetry_voltageValue": "{volts}V", + "@telemetry_voltageValue": { + "placeholders": { + "volts": { + "type": "String" + } + } + }, + "telemetry_currentValue": "{amps}A", + "@telemetry_currentValue": { + "placeholders": { + "amps": { + "type": "String" + } + } + }, + "telemetry_temperatureValue": "{celsius} °C / {fahrenheit} °F", + "@telemetry_temperatureValue": { + "placeholders": { + "celsius": { + "type": "String" + }, + "fahrenheit": { + "type": "String" + } + } + }, + "neighbors_receivedData": "Kapott szomszédok adatait", + "neighbors_requestTimedOut": "A szomszédok kérik, hogy tiltsák le a kamerát.", + "neighbors_errorLoading": "Hiba a szomszédok betöltésében: {error}", + "@neighbors_errorLoading": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "neighbors_repeatersNeighbors": "Ismétlő eszközök, szomszédok", + "neighbors_noData": "Nincsenek elérhető szomszédokról adatok.", + "neighbors_unknownContact": "Tudatlan {pubkey}", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "Értsd: {time} sitten", + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "channelPath_title": "Csomagok útvonala", + "channelPath_viewMap": "Megtekinthető térkép", + "channelPath_otherObservedPaths": "Egyéb megfigyelt utak", + "channelPath_repeaterHops": "Adat továbbító lépések", + "channelPath_noHopDetails": "Ez a csomag nem tartalmaz részletes információkat a \"hop\" (vagy más hasonló) szót használó kifejezésekről.", + "channelPath_messageDetails": "Üzenet részletei", + "channelPath_senderLabel": "Megküldő", + "channelPath_timeLabel": "Idő", + "channelPath_repeatsLabel": "Ismétli", + "channelPath_pathLabel": "Útvonal {index}", + "channelPath_observedLabel": "Megfigyelt", + "channelPath_observedPathTitle": "Megfigyelt útvonal: {index} • {hops}", + "@channelPath_observedPathTitle": { + "placeholders": { + "index": { + "type": "int" + }, + "hops": { + "type": "String" + } + } + }, + "channelPath_noLocationData": "Nincs helyszínadat.", + "channelPath_timeWithDate": "{day}/{month} {time}", + "@channelPath_timeWithDate": { + "placeholders": { + "day": { + "type": "int" + }, + "month": { + "type": "int" + }, + "time": { + "type": "String" + } + } + }, + "channelPath_timeOnly": "{time}", + "@channelPath_timeOnly": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "channelPath_unknownPath": "Megfejt", + "channelPath_floodPath": "Árvíz", + "channelPath_directPath": "Közvetlen", + "channelPath_observedZeroOf": "0-ból {total}", + "@channelPath_observedZeroOf": { + "placeholders": { + "total": { + "type": "int" + } + } + }, + "channelPath_observedSomeOf": "{observed} of {total} hops", + "@channelPath_observedSomeOf": { + "placeholders": { + "observed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "channelPath_mapTitle": "Útvonal térkép", + "channelPath_noRepeaterLocations": "Ez a útvonal nem támogat repeater-t.", + "channelPath_primaryPath": "Útvonal {index} (Elsődleges)", + "@channelPath_primaryPath": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "@channelPath_pathLabel": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "channelPath_pathLabelTitle": "Út", + "channelPath_observedPathHeader": "Megfigyelt útvonal", + "channelPath_selectedPathLabel": "{label} • {prefixes}", + "@channelPath_selectedPathLabel": { + "placeholders": { + "label": { + "type": "String" + }, + "prefixes": { + "type": "String" + } + } + }, + "channelPath_noHopDetailsAvailable": "Ez a csomag nem tartalmaz részletes információkat a szállításhoz.", + "channelPath_unknownRepeater": "Tudatlan erősítő", + "community_title": "Helyi közösség", + "community_create": "Teremtsd meg a közösséget", + "community_createDesc": "Légyon létre egy új közösséget, és osszák meg QR-kód segítségével.", + "community_join": "Csatlakozjon", + "community_joinTitle": "Csatlakozzon a közösséghez", + "community_joinConfirmation": "Szeretne csatlakozni a közösséghez, {name}?", + "@community_joinConfirmation": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_scanQr": "QR-kód olvasó a közösség számára", + "community_scanInstructions": "Fordítsa a kamerát egy közösségi QR-kód irányába.", + "community_showQr": "Megjelenítse a QR-kódot", + "community_publicChannel": "Összetartó, közösségi", + "community_hashtagChannel": "Helyi hashtaget", + "community_name": "Helyi közösség neve", + "community_enterName": "Kérjük, a közösség nevét írja be.", + "community_created": "A \"{name}\" nevű közösség létrehozva", + "@community_created": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_joined": "Csatlakozott a {name} közösséghez", + "@community_joined": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_qrTitle": "Osszpontosítás a közösségben", + "community_qrInstructions": "Scanned this QR-kódot, hogy csatlakozhat a {name} csoporthoz.", + "@community_qrInstructions": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_hashtagPrivacyHint": "A közösségi hashtagekhez tartozó csatornák csak a közösség tagjai számára érhetők el.", + "community_invalidQrCode": "Érvénytelen közösségi QR-kód", + "community_alreadyMember": "Már tag vagy", + "community_alreadyMemberMessage": "Már tagja {name}-nek.", + "@community_alreadyMemberMessage": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_addPublicChannel": "Hozzon létre egy közösségi nyilvános csatornát", + "community_addPublicChannelHint": "Automatikusan hozzon létre ezt a csatornát a közösség számára.", + "community_noCommunities": "Még egyik közösség sem csatlakozott.", + "community_scanOrCreate": "Scelle egy QR-kódot, vagy hozzon létre egy közösséget, hogy elinduljon.", + "community_manageCommunities": "Közösségek kezelése", + "community_delete": "Hagyományos közösségi élet", + "community_deleteConfirm": "Hagyom {name}-et?", + "@community_deleteConfirm": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_deleteChannelsWarning": "Ezem törli is {count} csatornát és a hozzá tartozó üzeneteket.", + "@community_deleteChannelsWarning": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "community_deleted": "A közösség, amely {name}", + "@community_deleted": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_regenerateSecret": "Titkos visszaállítás", + "community_regenerateSecretConfirm": "Újra kell generálni a titkos kulcsot {name} számára? Minden tagnak be kell szkennelnie az új QR-kódot, hogy továbbra is kommunikálhasson.", + "@community_regenerateSecretConfirm": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_regenerate": "Újraalakítás", + "community_secretRegenerated": "Titkos kulcs megújult {name} számára.", + "@community_secretRegenerated": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_updateSecret": "Frissítési titok", + "community_secretUpdated": "Titkos információ frissítve {name} számára", + "@community_secretUpdated": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_scanToUpdateSecret": "Scanned a új QR-kódot, hogy frissítsük a {name} számára megőrzött titkos információt.", + "@community_scanToUpdateSecret": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_addHashtagChannel": "Adjon egy közösségi hashtaget", + "community_addHashtagChannelDesc": "Hozz létre egy hashtage-os csatornát ennek a közösségnek", + "community_selectCommunity": "Válasszon közösséget", + "community_regularHashtag": "Rendszeres hashtag", + "community_regularHashtagDesc": "Önmagas szintű hashtaget (bárki csatlakozhat)", + "community_communityHashtag": "Helyi hashtaget", + "community_communityHashtagDesc": "Csak a közösség tagjai számára", + "community_forCommunity": "{name} számára", + "@community_forCommunity": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "listFilter_tooltip": "Szűrés és rendezés", + "listFilter_sortBy": "Szűrés", + "listFilter_latestMessages": "Legfrissebb üzenetek", + "listFilter_heardRecently": "Úgy hallottam, hogy...", + "listFilter_az": "A-Z", + "listFilter_filters": "Szűrők", + "listFilter_all": "Mind", + "listFilter_favorites": "Kedvencek", + "listFilter_addToFavorites": "Megerősítés kívánságlistára", + "listFilter_removeFromFavorites": "Törölj a kedvencekből", + "listFilter_users": "Felhasználók", + "listFilter_repeaters": "Újraküldők", + "listFilter_roomServers": "Szoba-szolgálatok", + "listFilter_unreadOnly": "Csak olvasatlan", + "listFilter_newGroup": "Új csoport", + "pathTrace_you": "Te", + "pathTrace_failed": "A útvonal követése sikertelen.", + "pathTrace_notAvailable": "Az útvonal követési funkció nem elérhető.", + "pathTrace_refreshTooltip": "Út mentesség frissítése.", + "pathTrace_someHopsNoLocation": "Egy vagy több búzavirág hiányozik a helyszínéről!", + "pathTrace_clearTooltip": "Egyértelmű út.", + "losSelectStartEnd": "Válassza ki a kezdő és a végpontokat a LOS-hoz.", + "losRunFailed": "A látószög ellenőrzése sikertelen: {error}", + "@losRunFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "losClearAllPoints": "Teljesen tisztázzuk az összes pontot", + "losRunToViewElevationProfile": "Használja a LOS-t, hogy megtekinthesse a magasságkülönbségek diagramját.", + "losMenuTitle": "LOS menü", + "losMenuSubtitle": "A térképen található pontok kiválasztására vagy a térképen hosszúra nyomva, hogy egyedi pontokat definiálhassunk.", + "losShowDisplayNodes": "Megjelenítsen a megjelenítési egységeket", + "losCustomPoints": "Egyedi pontok", + "losCustomPointLabel": "Egyedi {index}", + "@losCustomPointLabel": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "losPointA": "A pont A", + "losPointB": "Pont B", + "losAntennaA": "Antenna A: {value} {unit}", + "@losAntennaA": { + "placeholders": { + "value": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "losAntennaB": "Antenna B: {value} {unit}", + "@losAntennaB": { + "placeholders": { + "value": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "losRun": "Futtass a LOS-on", + "losNoElevationData": "Nincsenek emelkedési adatok.", + "losProfileClear": "{distance} {distanceUnit}, clear LOS, min clearance {clearance} {heightUnit}", + "@losProfileClear": { + "placeholders": { + "distance": { + "type": "String" + }, + "distanceUnit": { + "type": "String" + }, + "clearance": { + "type": "String" + }, + "heightUnit": { + "type": "String" + } + } + }, + "losProfileBlocked": "{distance} {distanceUnit}, amelyet {obstruction} akadályoz meg {heightUnit}-ban", + "@losProfileBlocked": { + "placeholders": { + "distance": { + "type": "String" + }, + "distanceUnit": { + "type": "String" + }, + "obstruction": { + "type": "String" + }, + "heightUnit": { + "type": "String" + } + } + }, + "losStatusChecking": "LOS: ellenőrzés...", + "losStatusNoData": "LOS: nincs adat", + "losStatusSummary": "LOS: {clear}/{total} tisztított, {blocked} blokkolt, {unknown} ismeretlen", + "@losStatusSummary": { + "placeholders": { + "clear": { + "type": "int" + }, + "total": { + "type": "int" + }, + "blocked": { + "type": "int" + }, + "unknown": { + "type": "int" + } + } + }, + "losErrorElevationUnavailable": "Az alábbi minták esetében nem áll rendelkezésre magasságadat.", + "losErrorInvalidInput": "Hibás vagy hiányos táblázatok a LOS (Loss of Signal) számításához.", + "losRenameCustomPoint": "Állítsa meg a saját pont nevét", + "losPointName": "Pont neve", + "losShowPanelTooltip": "Megjelenítse a LOS paneelt", + "losHidePanelTooltip": "Rejtse el a LOS paneelt", + "losElevationAttribution": "Magasságadatok: Open-Meteo (CC BY 4.0)", + "losLegendRadioHorizon": "Radio Horizont", + "losLegendLosBeam": "LOS jelzés", + "losLegendTerrain": "Terület", + "losFrequencyLabel": "Hatósság", + "losFrequencyInfoTooltip": "Lásd a számítás részleteit", + "losFrequencyDialogTitle": "A rádióhullámok hatótávolságának kiszámítása", + "losFrequencyDialogDescription": "A {baselineK} értékből kezdve, {baselineFreq} MHz-os frekvencián, a számítás az aktuális {frequencyMHz} MHz-os sávhoz igazítja a k-tényezőt, amely meghatározza a görbös rádióhatótávolság határát.", + "@losFrequencyDialogDescription": { + "description": "Explain how the calculation uses the baseline frequency and derived k-factor.", + "placeholders": { + "baselineK": { + "type": "double" + }, + "baselineFreq": { + "type": "double" + }, + "frequencyMHz": { + "type": "double" + }, + "kFactor": { + "type": "double" + } + } + }, + "contacts_pathTrace": "Útvonal követése", + "contacts_ping": "Ping", + "contacts_repeaterPathTrace": "Az útvonal követése a repeaterig", + "contacts_repeaterPing": "Ping-szinkronizáló", + "contacts_roomPathTrace": "Kapcsolat a szobai szerverrel", + "contacts_roomPing": "Ping-szolgáló szerver", + "contacts_chatTraceRoute": "Útvonal meghatározása", + "contacts_pathTraceTo": "Keresse meg a {name} címét.", + "@contacts_pathTraceTo": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "contacts_clipboardEmpty": "A kiválasztott szöveg üres.", + "contacts_invalidAdvertFormat": "Érvénytelen kontaktinformáció", + "contacts_contactImported": "Kapcsolat létrejött.", + "contacts_contactImportFailed": "Nem sikerült a kapcsolatot importálni.", + "contacts_zeroHopAdvert": "Zero Hop reklám", + "contacts_floodAdvert": "Árvízre vonatkozó hirdetés", + "contacts_copyAdvertToClipboard": "Másolja a hirdetést a kiválasztási ablakba", + "contacts_addContactFromClipboard": "Adjon hozzá egy kapcsolatot a kiválasztott listából", + "contacts_ShareContact": "Másolja a kapcsolatot a kiválasztóba", + "contacts_ShareContactZeroHop": "Ossza meg a kapcsolatot hirdetés segítségével", + "contacts_zeroHopContactAdvertSent": "Kapcsolatot a hirdetésen keresztül.", + "contacts_zeroHopContactAdvertFailed": "Nem sikerült a kapcsolatot elküldeni.", + "contacts_contactAdvertCopied": "A hirdetés másolva a vágólapra.", + "contacts_contactAdvertCopyFailed": "Az hirdetés másolása a vágólapra sikertelen.", + "notification_activityTitle": "MeshCore tevékenységek", + "notification_messagesCount": "{count} {count, plural, =1{üzenet} other{üzenetek}}", + "@notification_messagesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notification_channelMessagesCount": "{count} {count, plural, =1{csatornaüzenet} other{csatornaüzenetek}}", + "@notification_channelMessagesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notification_newNodesCount": "{count} {count, plural, =1{új csomópont} other{új csomópontok}}", + "@notification_newNodesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notification_newTypeDiscovered": "Új {contactType} megtalálva", + "@notification_newTypeDiscovered": { + "placeholders": { + "contactType": { + "type": "String" + } + } + }, + "notification_receivedNewMessage": "Új üzenetet kaptam", + "settings_gpxExportRepeaters": "Külső eszközök / helyi szerver a GPX formátumba", + "settings_gpxExportRepeatersSubtitle": "Exportálható repeater/szobaterm-szerver, amely egy GPX fájlban tárolja a helyzetet.", + "settings_gpxExportContacts": "GPX export funkciók", + "settings_gpxExportContactsSubtitle": "Az export funkció lehetővé teszi, hogy a GPS fájlban megadott helyszínen is megőrizzük az útvonalat.", + "settings_gpxExportAll": "Exportálja az összes kapcsolatot GPX formátumban.", + "settings_gpxExportAllSubtitle": "Az összes elérhetőséget, amelyekhez egy helyszín tartozik, egy GPX fájlba exportálja.", + "settings_gpxExportSuccess": "A GPX fájl sikeresen exportálva lett.", + "settings_gpxExportNoContacts": "Nincs exportálható kapcsolatok.", + "settings_gpxExportNotAvailable": "Nem támogatott a jelenlegi eszközön/rendszeren.", + "settings_gpxExportError": "Hiba történt az export során.", + "settings_gpxExportRepeatersRoom": "Adatátvisszaadó eszközök és helyiségi szerverek helyei", + "settings_gpxExportChat": "Kapcsolódó helyszínek", + "settings_gpxExportAllContacts": "Az összes kapcsolat helyszíne", + "settings_gpxExportShareText": "A meshcore-open-ból exportált térkéadatumok", + "settings_gpxExportShareSubject": "meshcore-open GPX formátumú térképi adatok export", + "snrIndicator_nearByRepeaters": "Helyszíni erősítők", + "snrIndicator_lastSeen": "Utoljára, amikor látták", + "contactsSettings_title": "Kapcsolatok beállításai", + "contactsSettings_autoAddTitle": "Automatikus felfedezés", + "contactsSettings_otherTitle": "Egyéb kapcsolattal kapcsolatos beállítások", + "contactsSettings_autoAddUsersTitle": "Automatikus felhasználói hozzáadás", + "contactsSettings_autoAddUsersSubtitle": "Engedje, hogy a segítő automatikusan hozzáadja az új felhasználókat.", + "contactsSettings_autoAddRepeatersTitle": "Automatikus visszatöltés", + "contactsSettings_autoAddRepeatersSubtitle": "Engedje, hogy a segítő eszköz automatikusan hozzáadja az új, megtalált jelzőállomásokat.", + "contactsSettings_autoAddRoomServersTitle": "Automatikus szobák szerverek hozzáadása", + "contactsSettings_autoAddRoomServersSubtitle": "Engedje, hogy a segítő automatikusan hozzáadja az új, megtalált hálózati szervereket.", + "contactsSettings_autoAddSensorsTitle": "Automatikus érzékelők hozzáadása", + "contactsSettings_autoAddSensorsSubtitle": "Engedje, hogy a kísérő automatikusan hozzáadja az új, megtalált szenzorokat.", + "contactsSettings_overwriteOldestTitle": "Felülírja a legrégebbet", + "contactsSettings_overwriteOldestSubtitle": "Amikor a névsor telítődik, a legidősebb, de még nem kedvencként jelölt személyt helyettesíti egy újabb.", + "discoveredContacts_Title": "Megtalált kapcsolatok", + "discoveredContacts_noMatching": "Nincs megegyező kapcsolat.", + "discoveredContacts_searchHint": "Keress új kapcsolatokat", + "discoveredContacts_contactAdded": "Kapcsolat hozzáadva", + "discoveredContacts_addContact": "Adjon személyhez", + "discoveredContacts_copyContact": "Másolja a kapcsolatot a vágólapra", + "discoveredContacts_deleteContact": "Törölj a feltalált kapcsolatot", + "discoveredContacts_deleteContactAll": "Törölj minden megtalált kapcsolatot", + "discoveredContacts_deleteContactAllContent": "Biztos, hogy szeretné törölni az összes eddig megtalált kapcsolatot?", + "chat_sendCooldown": "Kérjük, várjon egy pillanatot, mielőtt újra elküldené.", + "appSettings_jumpToOldestUnread": "Jelentkezzen az legörebb, olvasatlan üzenetre", + "appSettings_jumpToOldestUnreadSubtitle": "Amikor egy új csevet indítunk, amelyben vannak olvashatatlan üzenetek, görgessük a listát, hogy a legelső, olvashatatlan üzenet megjelenjen, nem pedig az utolsó.", + "appSettings_languageHu": "Magyar", + "appSettings_languageJa": "Japán", + "appSettings_languageKo": "Koreai", + "radioStats_tooltip": "Rádió és hálózati statisztikák", + "radioStats_screenTitle": "Rádió statisztikák", + "radioStats_notConnected": "Csatlakozzon egy eszközhöz, hogy megtekinthesse a rádió adatok statisztikáit.", + "radioStats_firmwareTooOld": "A rádió statisztikákhoz v8 vagy újabb verziójú szoftver szükséges.", + "radioStats_waiting": "Adatokra vár…", + "radioStats_noiseFloor": "Háttérzaj szint: {noiseDbm} dBm", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "radioStats_lastRssi": "Utolsó RSSI érték: {rssiDbm} dBm", + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "radioStats_lastSnr": "Utolsó SNR: {snr} dB", + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "radioStats_txAir": "TX-es idő (összesen): {seconds} másodperc", + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "radioStats_rxAir": "RX használat időtartama (összesen): {seconds} s", + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "radioStats_chartCaption": "Háttérzaj szint (dBm) a legutóbbi minták alapján.", + "radioStats_stripNoise": "Háttérzaj szint: {noiseDbm} dBm", + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "radioStats_stripWaiting": "Rádió adatok begyűjtése…", + "radioStats_settingsTile": "Rádió statisztikák", + "radioStats_settingsSubtitle": "Háttérzaj, RSSI, zaj-sűrűség, és a használat időtartama", + "@settings_multiAck": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "settings_denyAll": "Elutasítom", + "settings_privacySettingsDescription": "Válassza ki, hogy az eszközének melyik információkat oszt meg másokkal.", + "settings_privacySubtitle": "Ellenőrizd, hogy milyen információkat osztanak meg.", + "settings_privacy": "Adatvédelem beállítások", + "settings_allowByContact": "Lehetővé teszi a kapcsolatok kezelését", + "settings_allowAll": "Engedje meg mindent", + "settings_telemetryBaseMode": "Adatkapcsolati alapállapot", + "settings_telemetryLocationMode": "Adatkapcsolási helyszín mód", + "settings_telemetryEnvironmentMode": "Adatkapcsolati környezeti mód", + "settings_advertLocation": "Reklám megjelenési hely", + "settings_advertLocationSubtitle": "A hirdetés tartalmazza a helyszínt.", + "settings_multiAck": "Többszöri visszaigazolások: {value}", + "settings_telemetryModeUpdated": "A telemetriamód frissítve", + "contact_info": "Kapcsolattartási információk", + "contact_settings": "Kapcsolat beállítások", + "contact_telemetry": "Adatvisszaadás", + "contact_lastSeen": "Utoljára, amikor látták", + "contact_clearChat": "Tiszta beszélgetés", + "contact_teleBase": "Adatgyűjtő központ", + "contact_teleBaseSubtitle": "Engedje meg a akkumulátor töltöttségi szintjének és alapvető adatoknak megosztását.", + "contact_teleLoc": "Adatkapcsolati helyszín", + "contact_teleLocSubtitle": "Engedje meg a helyadatok megosztását", + "contact_teleEnv": "Adatkapcsolati környezet", + "contact_teleEnvSubtitle": "Engedje meg az érzékelő adatok megosztását", + "map_showOverlaps": "Az ismétlő kulcsok ütköznek", + "map_runTraceWithReturnPath": "Visszaforduljon az eredeti úton." +} diff --git a/lib/l10n/app_it.arb b/lib/l10n/app_it.arb index b168e75..99befbb 100644 --- a/lib/l10n/app_it.arb +++ b/lib/l10n/app_it.arb @@ -1943,5 +1943,68 @@ "settings_telemetryModeUpdated": "Modalità telemetria aggiornata", "settings_multiAck": "Multi-ACKs: {value}", "map_showOverlaps": "Sovrapposizioni della chiave ripetitore", - "map_runTraceWithReturnPath": "Tornare indietro sullo stesso percorso" -} \ No newline at end of file + "map_runTraceWithReturnPath": "Tornare indietro sullo stesso percorso", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "appSettings_jumpToOldestUnreadSubtitle": "Quando si apre una chat con messaggi non letti, scorrete verso l'alto fino al primo messaggio non letto, invece che al più recente.", + "chat_sendCooldown": "Si prega di attendere un momento prima di inviare nuovamente.", + "appSettings_jumpToOldestUnread": "Vai al messaggio più vecchio non letto", + "appSettings_languageHu": "Ungherese", + "appSettings_languageJa": "Giapponese", + "appSettings_languageKo": "Coreano", + "radioStats_tooltip": "Statistiche per radio e reti", + "radioStats_screenTitle": "Statistiche radio", + "radioStats_notConnected": "Connettiti a un dispositivo per visualizzare le statistiche radio.", + "radioStats_firmwareTooOld": "Le statistiche radio richiedono il firmware versione 8 o successiva.", + "radioStats_noiseFloor": "Livello di rumore: {noiseDbm} dBm", + "radioStats_waiting": "In attesa dei dati…", + "radioStats_lastRssi": "Ultimo valore RSSI: {rssiDbm} dBm", + "radioStats_lastSnr": "Ultimo SNR: {snr} dB", + "radioStats_txAir": "Tempo di trasmissione in diretta (totale): {seconds} s", + "radioStats_rxAir": "Tempo di trasmissione RX (totale): {seconds} s", + "radioStats_chartCaption": "Livello di rumore (dBm) misurato su campioni recenti.", + "radioStats_stripNoise": "Livello di rumore: {noiseDbm} dBm", + "radioStats_stripWaiting": "Recupero delle statistiche radio…", + "radioStats_settingsTile": "Statistiche radio", + "radioStats_settingsSubtitle": "Livello di rumore, RSSI, rapporto segnale/rumore (SNR) e tempo di trasmissione" +} diff --git a/lib/l10n/app_ja.arb b/lib/l10n/app_ja.arb new file mode 100644 index 0000000..d63834c --- /dev/null +++ b/lib/l10n/app_ja.arb @@ -0,0 +1,2048 @@ +{ + "@@locale": "ja", + "appTitle": "MeshCore Open", + "nav_contacts": "連絡先", + "nav_channels": "チャンネル", + "nav_map": "地図", + "common_cancel": "キャンセル", + "common_ok": "了解", + "common_connect": "接続する", + "common_unknownDevice": "不明なデバイス", + "common_save": "保存", + "common_delete": "削除", + "common_deleteAll": "すべて削除", + "common_close": "閉じる", + "common_edit": "編集", + "common_add": "追加", + "common_settings": "設定", + "common_disconnect": "切断する", + "common_connected": "接続されている", + "common_disconnected": "切断", + "common_create": "作成する", + "common_continue": "続き", + "common_share": "共有する", + "common_copy": "コピー", + "common_retry": "再試", + "common_hide": "隠す", + "common_remove": "削除", + "common_enable": "有効化する", + "common_disable": "無効化する", + "common_reboot": "再起動", + "common_loading": "読み込み中...", + "common_notAvailable": "—", + "common_voltageValue": "{volts} V", + "@common_voltageValue": { + "placeholders": { + "volts": { + "type": "String" + } + } + }, + "common_percentValue": "{percent}%", + "@common_percentValue": { + "placeholders": { + "percent": { + "type": "int" + } + } + }, + "scanner_title": "MeshCore オープン", + "connectionChoiceUsbLabel": "USB", + "connectionChoiceBluetoothLabel": "ブルートゥース", + "connectionChoiceTcpLabel": "TCP", + "tcpScreenTitle": "TCP を使用して接続", + "tcpHostLabel": "IPアドレス", + "tcpHostHint": "192.168.40.10", + "tcpPortLabel": "港", + "tcpPortHint": "5000", + "tcpStatus_notConnected": "エンドポイントを入力し、接続する", + "tcpStatus_connectingTo": "{endpoint} への接続中...", + "@tcpStatus_connectingTo": { + "placeholders": { + "endpoint": { + "type": "String" + } + } + }, + "tcpErrorHostRequired": "IPアドレスが必要です。", + "tcpErrorPortInvalid": "ポート番号は1から65535の範囲で指定してください。", + "tcpErrorUnsupported": "このプラットフォームでは、TCP 転送はサポートされていません。", + "tcpErrorTimedOut": "TCP 接続がタイムアウトしました。", + "tcpConnectionFailed": "TCP接続に失敗しました:{error}", + "@tcpConnectionFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "usbScreenTitle": "USB経由で接続", + "usbScreenSubtitle": "検出されたシリアルデバイスを選択し、MeshCoreノードに直接接続してください。", + "usbScreenStatus": "USBデバイスを選択する", + "usbScreenNote": "USBシリアルポートは、サポートされているAndroidデバイスおよびデスクトッププラットフォームで利用可能です。", + "usbScreenEmptyState": "USBデバイスが見つかりませんでした。「別のUSBデバイスを接続して、再度確認してください。」", + "usbErrorPermissionDenied": "USBへのアクセス許可が拒否されました。", + "usbErrorDeviceMissing": "選択されたUSBデバイスは、もう利用できません。", + "usbErrorInvalidPort": "有効なUSBデバイスを選択してください。", + "usbErrorBusy": "別のUSB接続の要求がすでに処理中です。", + "usbErrorNotConnected": "USBデバイスは接続されていません。", + "usbErrorOpenFailed": "選択したUSBデバイスを開くことができません。", + "usbErrorConnectFailed": "選択したUSBデバイスへの接続に失敗しました。", + "usbErrorUnsupported": "このプラットフォームでは、USBシリアル通信はサポートされていません。", + "usbErrorAlreadyActive": "USB接続はすでに確立されています。", + "usbErrorNoDeviceSelected": "USBデバイスは選択されていません。", + "usbErrorPortClosed": "USB接続は確立されていません。", + "usbErrorConnectTimedOut": "接続がタイムアウトしました。デバイスにUSBコンパニオンファームウェアがインストールされていることを確認してください。", + "usbFallbackDeviceName": "ウェブシリアルデバイス", + "usbStatus_notConnected": "USBデバイスを選択する", + "usbStatus_connecting": "USBデバイスへの接続中...", + "usbStatus_searching": "USBデバイスを検索中...", + "usbConnectionFailed": "USB接続に失敗しました:{error}", + "@usbConnectionFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "scanner_scanning": "デバイスをスキャン中...", + "scanner_connecting": "接続中...", + "scanner_disconnecting": "切断...", + "scanner_notConnected": "接続されていない", + "scanner_connectedTo": "{deviceName} に接続", + "@scanner_connectedTo": { + "placeholders": { + "deviceName": { + "type": "String" + } + } + }, + "scanner_searchingDevices": "MeshCoreデバイスの検索", + "scanner_tapToScan": "MeshCore デバイスを検索するには、「スキャン」ボタンをタップしてください。", + "scanner_connectionFailed": "接続に失敗しました:{error}", + "@scanner_connectionFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "scanner_stop": "停止", + "scanner_scan": "スキャン", + "scanner_bluetoothOff": "Bluetooth はオフになっています", + "scanner_bluetoothOffMessage": "Bluetoothを有効にして、デバイスを検索してください。", + "scanner_chromeRequired": "Chrome ブラウザが必須です", + "scanner_chromeRequiredMessage": "このWebアプリケーションは、Bluetooth機能を利用するために、Google ChromeまたはChromiumベースのブラウザが必要です。", + "scanner_enableBluetooth": "Bluetoothを有効にする", + "device_quickSwitch": "素早い切り替え", + "device_meshcore": "メッシュコア", + "settings_title": "設定", + "settings_deviceInfo": "デバイス情報", + "settings_appSettings": "アプリ設定", + "settings_appSettingsSubtitle": "通知、メッセージング、および地図の表示設定", + "settings_nodeSettings": "ノード設定", + "settings_nodeName": "ノード名", + "settings_nodeNameNotSet": "設定されていない", + "settings_nodeNameHint": "ノード名を入力してください", + "settings_nodeNameUpdated": "氏名変更", + "settings_radioSettings": "ラジオ設定", + "settings_radioSettingsSubtitle": "周波数、電力、スプレッドファクター", + "settings_radioSettingsUpdated": "ラジオの設定が更新されました", + "settings_location": "場所", + "settings_locationSubtitle": "GPS 座標", + "settings_locationUpdated": "場所とGPS設定が更新されました", + "settings_locationBothRequired": "緯度と経度をそれぞれ入力してください。", + "settings_locationInvalid": "無効な緯度または経度。", + "settings_locationGPSEnable": "GPS機能有効", + "settings_locationGPSEnableSubtitle": "GPSが自動的に位置情報を更新できるようにする。", + "settings_locationIntervalSec": "GPS データの取得間隔(秒)", + "settings_locationIntervalInvalid": "間隔は少なくとも60秒で、86400秒未満でなければなりません。", + "settings_latitude": "緯度", + "settings_longitude": "経度", + "settings_contactSettings": "連絡設定", + "settings_contactSettingsSubtitle": "連絡先を追加する設定", + "settings_privacyMode": "プライバシーモード", + "settings_privacyModeSubtitle": "広告に名前/場所を記載しない", + "settings_privacyModeToggle": "プライバシーモードをオンにして、広告に表示される名前や場所を非表示にします。", + "settings_privacyModeEnabled": "プライバシーモードが有効になっています", + "settings_privacyModeDisabled": "プライバシーモードは無効化されています", + "settings_actions": "行動", + "settings_sendAdvertisement": "広告を送信する", + "settings_sendAdvertisementSubtitle": "現在、放送での活動", + "settings_advertisementSent": "広告が送信されました", + "settings_syncTime": "同期時間", + "settings_syncTimeSubtitle": "デバイスの時刻を、携帯電話の時刻に合わせる", + "settings_timeSynchronized": "時間同期", + "settings_refreshContacts": "連絡先を更新する", + "settings_refreshContactsSubtitle": "デバイスから連絡先リストを再読み込みする", + "settings_rebootDevice": "デバイスを再起動する", + "settings_rebootDeviceSubtitle": "MeshCore デバイスを再起動する", + "settings_rebootDeviceConfirm": "本当にデバイスを再起動したいですか? その場合、接続が切断されます。", + "settings_debug": "デバッグ", + "settings_bleDebugLog": "BLE デバッグログ", + "settings_bleDebugLogSubtitle": "BLEコマンド、応答、および生のデータ", + "settings_appDebugLog": "アプリケーションのデバッグログ", + "settings_appDebugLogSubtitle": "アプリケーションのデバッグメッセージ", + "settings_about": "概要", + "settings_aboutVersion": "MeshCore Open {version}版", + "@settings_aboutVersion": { + "placeholders": { + "version": { + "type": "String" + } + } + }, + "settings_aboutLegalese": "2026年のMeshCoreオープンソースプロジェクト", + "settings_aboutDescription": "MeshCore LoRaメッシュネットワークデバイス用の、オープンソースのFlutterクライアント。", + "settings_aboutOpenMeteoAttribution": "LOS 標高データ:Open-Meteo (CC BY 4.0)", + "settings_infoName": "名前", + "settings_infoId": "ID", + "settings_infoStatus": "ステータス", + "settings_infoBattery": "バッテリー", + "settings_infoPublicKey": "公開鍵", + "settings_infoContactsCount": "連絡先数", + "settings_infoChannelCount": "チャンネル数", + "settings_presets": "プリセット", + "settings_frequency": "周波数 (MHz)", + "settings_frequencyHelper": "300.0 - 2500.0", + "settings_frequencyInvalid": "無効な周波数 (300-2500 MHz)", + "settings_bandwidth": "帯域幅", + "settings_spreadingFactor": "伝播係数", + "settings_codingRate": "コーディング速度", + "settings_txPower": "TX 信号電力 (dBm)", + "settings_txPowerHelper": "0 - 22", + "settings_txPowerInvalid": "無効な送信電力 (0-22 dBm)", + "settings_clientRepeat": "オフグリッド(電力網から孤立した状態)の繰り返し", + "settings_clientRepeatSubtitle": "このデバイスが、他のデバイスに対してメッシュパケットを繰り返し送信できるようにする。", + "settings_clientRepeatFreqWarning": "オフグリッドでの再送には、433MHz、869MHz、または918MHzの周波数が必要です。", + "settings_error": "エラー:{message}", + "@settings_error": { + "placeholders": { + "message": { + "type": "String" + } + } + }, + "appSettings_title": "アプリ設定", + "appSettings_appearance": "外観", + "appSettings_theme": "テーマ", + "appSettings_themeSystem": "システムデフォルト", + "appSettings_themeLight": "光", + "appSettings_themeDark": "暗い", + "appSettings_language": "言語", + "appSettings_languageSystem": "システムデフォルト", + "appSettings_languageEn": "英語", + "appSettings_languageFr": "フランス語", + "appSettings_languageEs": "スペイン語", + "appSettings_languageDe": "ドイツ語", + "appSettings_languagePl": "ポーランド語", + "appSettings_languageSl": "スロベニア語", + "appSettings_languagePt": "ポルトガル語", + "appSettings_languageIt": "イタリア語", + "appSettings_languageZh": "中国語", + "appSettings_languageSv": "スウェーデン語", + "appSettings_languageNl": "オランダ語", + "appSettings_languageSk": "スロベニア語", + "appSettings_languageBg": "ブルガリア語", + "appSettings_languageRu": "ロシア語", + "appSettings_languageUk": "ウクライナ語", + "appSettings_enableMessageTracing": "メッセージ追跡機能を有効にする", + "appSettings_enableMessageTracingSubtitle": "メッセージに関する詳細な経路およびタイミングに関するメタデータを表示する", + "appSettings_notifications": "通知", + "appSettings_enableNotifications": "通知を有効にする", + "appSettings_enableNotificationsSubtitle": "メッセージや広告に関する通知を受け取る", + "appSettings_notificationPermissionDenied": "通知の許可が拒否されました", + "appSettings_notificationsEnabled": "通知機能が有効になっています", + "appSettings_notificationsDisabled": "通知が無効化されています", + "appSettings_messageNotifications": "メッセージ通知", + "appSettings_messageNotificationsSubtitle": "新しいメッセージを受信した際に、通知を表示する", + "appSettings_channelMessageNotifications": "チャネルメッセージの通知", + "appSettings_channelMessageNotificationsSubtitle": "チャンネルからのメッセージを受信した際に、通知を表示する", + "appSettings_advertisementNotifications": "広告通知", + "appSettings_advertisementNotificationsSubtitle": "新しいノードが発見された場合に通知を表示する", + "appSettings_messaging": "メッセージング", + "appSettings_clearPathOnMaxRetry": "マックスリトライでの明確な手順", + "appSettings_clearPathOnMaxRetrySubtitle": "5回送信に失敗した場合、連絡経路をリセットする", + "appSettings_pathsWillBeCleared": "5回失敗した後、経路が再開されます。", + "appSettings_pathsWillNotBeCleared": "パスは自動で削除されません。", + "appSettings_autoRouteRotation": "自動ルートの切り替え", + "appSettings_autoRouteRotationSubtitle": "最適なルートと、洪水モードを切り替える", + "appSettings_autoRouteRotationEnabled": "自動ルートの切り替え機能が有効になっています", + "appSettings_autoRouteRotationDisabled": "自動ルートの変更機能が無効になっています。", + "appSettings_maxRouteWeight": "最大ルート重量", + "appSettings_maxRouteWeightSubtitle": "ある経路が、成功裏に配送された場合に、積み上げられる最大重量", + "appSettings_initialRouteWeight": "初期ルートの重み", + "appSettings_initialRouteWeightSubtitle": "新たに発見された経路の初期重量", + "appSettings_routeWeightSuccessIncrement": "成功時の重み増加", + "appSettings_routeWeightSuccessIncrementSubtitle": "配送が成功した場合に、経路に追加される重量", + "appSettings_routeWeightFailureDecrement": "失敗時の重み減少", + "appSettings_routeWeightFailureDecrementSubtitle": "配送に失敗した際に、経路から取り除かれた重量", + "appSettings_maxMessageRetries": "最大メッセージ再試行回数", + "appSettings_maxMessageRetriesSubtitle": "メッセージを「失敗」とマークするまでの、再試行回数", + "path_routeWeight": "{weight}/{max}", + "@path_routeWeight": { + "placeholders": { + "weight": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "appSettings_battery": "バッテリー", + "appSettings_batteryChemistry": "電池の化学", + "appSettings_batteryChemistryPerDevice": "{deviceName} 単位", + "@appSettings_batteryChemistryPerDevice": { + "placeholders": { + "deviceName": { + "type": "String" + } + } + }, + "appSettings_batteryChemistryConnectFirst": "デバイスを選択するために接続する", + "appSettings_batteryNmc": "18650型 NMC (3.0-4.2V)", + "appSettings_batteryLifepo4": "LiFePO4 (2.6-3.65V)", + "appSettings_batteryLipo": "LiPo (3.0-4.2V)", + "appSettings_mapDisplay": "地図の表示", + "appSettings_showRepeaters": "繰り返し再生機能", + "appSettings_showRepeatersSubtitle": "地図上にリピーターノードを表示する", + "appSettings_showChatNodes": "チャットノードの表示", + "appSettings_showChatNodesSubtitle": "地図上にチャットノードを表示する", + "appSettings_showOtherNodes": "他のノードを表示する", + "appSettings_showOtherNodesSubtitle": "地図上に、他のノードの種類を表示する", + "appSettings_timeFilter": "時間フィルター", + "appSettings_timeFilterShowAll": "すべてのノードを表示する", + "appSettings_timeFilterShowLast": "過去 {hours} 時間のノードを表示する", + "@appSettings_timeFilterShowLast": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "appSettings_mapTimeFilter": "地図の表示期間を絞り込む", + "appSettings_showNodesDiscoveredWithin": "以下の範囲内で発見されたノードを表示する:", + "appSettings_allTime": "すべての期間", + "appSettings_lastHour": "直前の", + "appSettings_last6Hours": "過去6時間", + "appSettings_last24Hours": "過去24時間", + "appSettings_lastWeek": "先週", + "appSettings_offlineMapCache": "オフライン用地図キャッシュ", + "appSettings_unitsTitle": "単位", + "appSettings_unitsMetric": "メートル (m) / キロメートル (km)", + "appSettings_unitsImperial": "帝国 (フィート / マイル)", + "appSettings_noAreaSelected": "選択されたエリアはありません", + "appSettings_areaSelectedZoom": "選択された範囲(ズームレベル:{minZoom}~{maxZoom})", + "@appSettings_areaSelectedZoom": { + "placeholders": { + "minZoom": { + "type": "int" + }, + "maxZoom": { + "type": "int" + } + } + }, + "appSettings_debugCard": "デバッグ", + "appSettings_appDebugLogging": "アプリケーションのデバッグ用ログ", + "appSettings_appDebugLoggingSubtitle": "ログアプリのデバッグメッセージ(トラブルシューティング用)", + "appSettings_appDebugLoggingEnabled": "アプリケーションのデバッグ用ログ機能が有効になっています。", + "appSettings_appDebugLoggingDisabled": "アプリケーションのデバッグログが無効化されています。", + "contacts_title": "連絡先", + "contacts_noContacts": "現時点では、連絡先はまだありません。", + "contacts_contactsWillAppear": "デバイスが広告を行う際に、連絡先が表示されます。", + "contacts_unread": "未読", + "contacts_searchContactsNoNumber": "連絡先を検索...", + "contacts_searchContacts": "{number}件の{str}に関する連絡先を検索...", + "@contacts_searchContacts": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchFavorites": "{number}件の{str}を検索...", + "@contacts_searchFavorites": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchUsers": "{number}件の{str}に関するユーザーを検索する...", + "@contacts_searchUsers": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchRepeaters": "{number} {str} までの検索...", + "@contacts_searchRepeaters": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchRoomServers": "{number} {str} 部屋のサーバーを検索する...", + "@contacts_searchRoomServers": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_noUnreadContacts": "未読の連絡先はありません", + "contacts_noContactsFound": "連絡先またはグループは見つかりませんでした。", + "contacts_deleteContact": "連絡先を削除", + "contacts_removeConfirm": "{contactName} を連絡先から削除しますか?", + "@contacts_removeConfirm": { + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + "contacts_manageRepeater": "リピーターの管理", + "contacts_manageRoom": "ルームサーバーの管理", + "contacts_roomLogin": "ルームサーバーへのログイン", + "contacts_openChat": "自由な会話", + "contacts_editGroup": "編集グループ", + "contacts_deleteGroup": "グループを削除", + "contacts_deleteGroupConfirm": "{groupName} を削除しますか?", + "@contacts_deleteGroupConfirm": { + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "contacts_newGroup": "新しいグループ", + "contacts_groupName": "グループ名", + "contacts_groupNameRequired": "グループ名が必須です", + "contacts_groupNameReserved": "このグループ名はすでに使用されています。", + "contacts_groupAlreadyExists": "グループ「{name}」はすでに存在しています", + "@contacts_groupAlreadyExists": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "contacts_filterContacts": "連絡先をフィルタリングする…", + "contacts_noContactsMatchFilter": "指定された条件に合致する連絡先は見つかりませんでした。", + "contacts_noMembers": "メンバーはいない", + "contacts_lastSeenNow": "最近", + "contacts_lastSeenMinsAgo": "~{minutes} 分", + "@contacts_lastSeenMinsAgo": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "contacts_lastSeenHourAgo": "約1時間", + "contacts_lastSeenHoursAgo": "~ {hours} 時間", + "@contacts_lastSeenHoursAgo": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "contacts_lastSeenDayAgo": "~1日", + "contacts_lastSeenDaysAgo": "~{days}日間", + "@contacts_lastSeenDaysAgo": { + "placeholders": { + "days": { + "type": "int" + } + } + }, + "channels_title": "チャンネル", + "channels_noChannelsConfigured": "設定されたチャンネルがありません", + "channels_addPublicChannel": "パブリックチャンネルを追加する", + "channels_searchChannels": "検索オプション...", + "channels_noChannelsFound": "チャンネルが見つかりませんでした", + "channels_channelIndex": "チャンネル {index}", + "@channels_channelIndex": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "channels_hashtagChannel": "ハッシュタグチャンネル", + "channels_public": "一般の人々", + "channels_private": "個人の", + "channels_publicChannel": "一般チャンネル", + "channels_privateChannel": "プライベートチャンネル", + "channels_editChannel": "チャンネルを編集する", + "channels_muteChannel": "ミュート機能", + "channels_unmuteChannel": "ミュートを解除する", + "channels_deleteChannel": "チャンネルを削除する", + "channels_deleteChannelConfirm": "{name} を削除しますか? これは取り消すことができません。", + "@channels_deleteChannelConfirm": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_channelDeleteFailed": "チャンネル「{name}」の削除に失敗しました。", + "@channels_channelDeleteFailed": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_channelDeleted": "チャンネル「{name}」が削除されました", + "@channels_channelDeleted": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_addChannel": "チャンネルを追加", + "channels_channelIndexLabel": "チャンネルインデックス", + "channels_channelName": "チャンネル名", + "channels_usePublicChannel": "パブリックチャンネルを使用する", + "channels_standardPublicPsk": "標準的な公用 PSK", + "channels_pskHex": "PSK (ヘックス)", + "channels_generateRandomPsk": "ランダムなPSK(正交符号分割変調)を生成する", + "channels_enterChannelName": "チャンネル名を入力してください", + "channels_pskMustBe32Hex": "PSKは32桁の16進数で構成されている必要があります。", + "channels_channelAdded": "チャンネル「{name}」を追加", + "@channels_channelAdded": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_editChannelTitle": "チャンネル {index} の編集", + "@channels_editChannelTitle": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "channels_smazCompression": "SMAZ 圧縮", + "channels_channelUpdated": "チャンネル「{name}」が更新されました", + "@channels_channelUpdated": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_publicChannelAdded": "パブリックチャンネルが追加されました", + "channels_sortBy": "並び替え", + "channels_sortManual": "マニュアル", + "channels_sortAZ": "AからZ", + "channels_sortLatestMessages": "最新のメッセージ", + "channels_sortUnread": "未読", + "channels_createPrivateChannel": "プライベートチャンネルを作成する", + "channels_createPrivateChannelDesc": "秘密鍵を使用して保護されています。", + "channels_joinPrivateChannel": "プライベートチャンネルに参加する", + "channels_joinPrivateChannelDesc": "手動で秘密のキーを入力する。", + "channels_joinPublicChannel": "公開チャンネルに参加する", + "channels_joinPublicChannelDesc": "このチャンネルには、誰でも参加できます。", + "channels_joinHashtagChannel": "ハッシュタグチャンネルに参加する", + "channels_joinHashtagChannelDesc": "誰でもハッシュタグチャンネルに参加できます。", + "channels_scanQrCode": "QRコードをスキャンする", + "channels_scanQrCodeComingSoon": "近日公開", + "channels_enterHashtag": "ハッシュタグを入力してください", + "channels_hashtagHint": "例:#チーム", + "chat_noMessages": "まだメッセージは届いていません", + "chat_sendMessageToStart": "開始するためにメッセージを送信してください", + "chat_originalMessageNotFound": "元のメッセージが見つかりませんでした", + "chat_replyingTo": "{name} への返信", + "@chat_replyingTo": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "chat_replyTo": "{name}への返信", + "@chat_replyTo": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "chat_location": "場所", + "chat_sendMessageTo": "{contactName} へのメッセージを送信する", + "@chat_sendMessageTo": { + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + "chat_typeMessage": "メッセージを入力してください…", + "chat_messageTooLong": "メッセージが長すぎる({maxBytes} バイトを超える)。", + "@chat_messageTooLong": { + "placeholders": { + "maxBytes": { + "type": "int" + } + } + }, + "chat_messageCopied": "メッセージがコピーされました", + "chat_messageDeleted": "メッセージは削除されました", + "chat_retryingMessage": "再試行メッセージ", + "chat_retryCount": "{current} / {max} 回目", + "@chat_retryCount": { + "placeholders": { + "current": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + "chat_sendGif": "GIFを送信する", + "chat_reply": "返信", + "chat_addReaction": "反応を追加", + "chat_me": "私", + "emojiCategorySmileys": "笑顔の絵文字", + "emojiCategoryGestures": "身振り、動作", + "emojiCategoryHearts": "心", + "emojiCategoryObjects": "対象物", + "gifPicker_title": "GIF を選択してください", + "gifPicker_searchHint": "GIFの検索...", + "gifPicker_poweredBy": "GIPHYによる提供", + "gifPicker_noGifsFound": "GIF形式のファイルは見つかりませんでした", + "gifPicker_failedLoad": "GIFファイルの読み込みに失敗しました", + "gifPicker_failedSearch": "GIFファイルの検索に失敗しました", + "gifPicker_noInternet": "インターネット接続なし", + "debugLog_appTitle": "アプリケーションのデバッグログ", + "debugLog_bleTitle": "BLE デバッグログ", + "debugLog_copyLog": "記録", + "debugLog_clearLog": "詳細なログ", + "debugLog_copied": "デバッグログをコピー", + "debugLog_bleCopied": "BLEログのコピー", + "debugLog_noEntries": "デバッグログはまだ生成されていません", + "debugLog_enableInSettings": "アプリのデバッグログを有効にするには、設定から操作してください。", + "debugLog_frames": "フレーム", + "debugLog_rawLogRx": "生のログ-RX", + "debugLog_noBleActivity": "現時点では、BLE関連の活動は行われていません。", + "debugFrame_length": "フレーム長: {count} バイト", + "@debugFrame_length": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "debugFrame_command": "コマンド: 0x{value}", + "@debugFrame_command": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "debugFrame_textMessageHeader": "テキストメッセージ用フレーム:", + "debugFrame_destinationPubKey": "- 宛先公開鍵: {pubKey}", + "@debugFrame_destinationPubKey": { + "placeholders": { + "pubKey": { + "type": "String" + } + } + }, + "debugFrame_timestamp": "- タイムスタンプ: {timestamp}", + "@debugFrame_timestamp": { + "placeholders": { + "timestamp": { + "type": "int" + } + } + }, + "debugFrame_flags": "- フラグ: 0x{value}", + "@debugFrame_flags": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "debugFrame_textType": "- テキストの種類: {type} ({label})", + "@debugFrame_textType": { + "placeholders": { + "type": { + "type": "int" + }, + "label": { + "type": "String" + } + } + }, + "debugFrame_textTypeCli": "CLI(コマンドラインインターフェース)", + "debugFrame_textTypePlain": "シンプルな", + "debugFrame_text": "- テキスト:「{text}」", + "@debugFrame_text": { + "placeholders": { + "text": { + "type": "String" + } + } + }, + "debugFrame_hexDump": "ヘックスダンプ:", + "chat_pathManagement": "経路管理", + "chat_ShowAllPaths": "すべての経路を表示", + "chat_routingMode": "ルーティングモード", + "chat_autoUseSavedPath": "自動 (保存されたパスを使用)", + "chat_forceFloodMode": "強制的に洪水モードを起動", + "chat_recentAckPaths": "最近使用したACKパス(タップして使用):", + "chat_pathHistoryFull": "パスの履歴は完全です。エントリを削除して、新しいものを追加できます。", + "chat_hopSingular": "ジャンプ", + "chat_hopPlural": "ホップ", + "chat_hopsCount": "{count} {count, plural, =1{ホップ} other{ホップ}}", + "@chat_hopsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chat_successes": "成功事例", + "chat_removePath": "パスを削除する", + "chat_noPathHistoryYet": "まだ履歴はありません。\nパスを特定するためにメッセージを送信してください。", + "chat_pathActions": "パスの操作:", + "chat_setCustomPath": "カスタムパスを設定", + "chat_setCustomPathSubtitle": "手動で経路を指定する", + "chat_clearPath": "明確な道", + "chat_clearPathSubtitle": "次回送信時に、以前の情報を再取得する", + "chat_pathCleared": "経路が確保されました。次のメッセージでルートを再確認します。", + "chat_floodModeSubtitle": "アプリのバーにあるルーティング切り替え機能を使用する", + "chat_floodModeEnabled": "洪水モードが有効になっています。アプリのメニューバーにあるルートアイコンを使用して、モードを切り替えることができます。", + "chat_fullPath": "フルパス", + "chat_pathDetailsNotAvailable": "経路の詳細については、まだ情報がありません。「リフレッシュ」ボタンを押して、再度お試しください。", + "chat_pathSetHops": "Path set: {hopCount} {hopCount, plural, =1{hop} other{hops}} - {status}", + "@chat_pathSetHops": { + "placeholders": { + "hopCount": { + "type": "int" + }, + "status": { + "type": "String" + } + } + }, + "chat_pathSavedLocally": "ローカルで保存。同期のために接続する。", + "chat_pathDeviceConfirmed": "デバイスの確認済み。", + "chat_pathDeviceNotConfirmed": "デバイスの確認はまだできていません。", + "chat_type": "種類", + "chat_path": "道", + "chat_publicKey": "公開鍵", + "chat_compressOutgoingMessages": "送信されるメッセージを圧縮する", + "chat_floodForced": "洪水(強制的な)", + "chat_directForced": "直接的な(強制的な)", + "chat_hopsForced": "{count} 本のホップ(強制的に採取)", + "@chat_hopsForced": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chat_floodAuto": "洪水 (自動)", + "chat_direct": "直接", + "chat_poiShared": "共有されたPOI", + "chat_unread": "未読: {count}", + "@chat_unread": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chat_openLink": "リンクを開く?", + "chat_openLinkConfirmation": "このリンクをブラウザで開くことはご希望ですか?", + "chat_open": "開く", + "chat_couldNotOpenLink": "リンクを開けられませんでした: {url}", + "@chat_couldNotOpenLink": { + "placeholders": { + "url": { + "type": "String" + } + } + }, + "chat_invalidLink": "無効なリンク形式", + "map_title": "ノードマップ", + "map_lineOfSight": "視界", + "map_losScreenTitle": "視界", + "map_noNodesWithLocation": "位置情報データを持つノードは存在しません", + "map_nodesNeedGps": "ノードは、地図上に表示されるために、GPS座標を共有する必要があります。", + "map_nodesCount": "ノード:{count}", + "@map_nodesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "map_pinsCount": "ピン:{count}個", + "@map_pinsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "map_chat": "チャット", + "map_repeater": "繰り返し送信装置", + "map_room": "部屋", + "map_sensor": "センサー", + "map_pinDm": "ピン(DM)", + "map_pinPrivate": "プライベート(非公開)", + "map_pinPublic": "公開 (一般公開)", + "map_lastSeen": "最後に確認された場所", + "map_disconnectConfirm": "本当にこのデバイスとの接続を解除したいですか?", + "map_from": "~から", + "map_source": "出典", + "map_flags": "旗", + "map_shareMarkerHere": "この場所でシェア", + "map_setAsMyLocation": "現在地として設定", + "map_pinLabel": "ピンラベル", + "map_label": "ラベル", + "map_pointOfInterest": "注目すべき点", + "map_sendToContact": "連絡先へ送信", + "map_sendToChannel": "特定のチャンネルに送信する", + "map_noChannelsAvailable": "利用可能なチャンネルはありません", + "map_publicLocationShare": "公共スペースの共有", + "map_publicLocationShareConfirm": "現在、{channelLabel} で位置情報を共有する準備をしています。このチャンネルは公開されており、PSK を持つ誰でも閲覧できます。", + "@map_publicLocationShareConfirm": { + "placeholders": { + "channelLabel": { + "type": "String" + } + } + }, + "map_connectToShareMarkers": "他のデバイスと接続して、マーカーを共有する", + "map_filterNodes": "フィルタノード", + "map_nodeTypes": "ノードの種類", + "map_chatNodes": "チャットノード", + "map_repeaters": "繰り返し送信装置", + "map_otherNodes": "その他のノード", + "map_keyPrefix": "主要なプレフィックス", + "map_filterByKeyPrefix": "主要なプレフィックスでフィルタリングする", + "map_publicKeyPrefix": "公開鍵のプレフィックス", + "map_markers": "マーカー", + "map_showSharedMarkers": "共有のマーカーを表示する", + "map_showGuessedLocations": "推測されたノードの位置を表示する", + "map_showDiscoveryContacts": "Discovery社の連絡先を表示する", + "map_guessedLocation": "推測された場所", + "map_lastSeenTime": "最後に確認された時間", + "map_sharedPin": "共有パスワード", + "map_joinRoom": "部屋に参加する", + "map_manageRepeater": "リピーターの管理", + "map_tapToAdd": "ノードをクリックして、パスに追加します。", + "map_runTrace": "パスの追跡を実行", + "map_removeLast": "最後のものを削除", + "map_pathTraceCancelled": "パスの追跡は中止。", + "mapCache_title": "オフライン用地図キャッシュ", + "mapCache_selectAreaFirst": "最初にキャッシュする領域を選択してください", + "mapCache_noTilesToDownload": "この地域にはダウンロードできるタイルは存在しません。", + "mapCache_downloadTilesTitle": "タイルをダウンロードする", + "mapCache_downloadTilesPrompt": "オフラインでの使用のために、{count}個のタイルをダウンロードしますか?", + "@mapCache_downloadTilesPrompt": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_downloadAction": "ダウンロード", + "mapCache_cachedTiles": "{count} 個のタイルをキャッシュ", + "@mapCache_cachedTiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_cachedTilesWithFailed": "Cached {downloaded} tiles ({failed} failed)", + "@mapCache_cachedTilesWithFailed": { + "placeholders": { + "downloaded": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "mapCache_clearOfflineCacheTitle": "オフラインキャッシュをクリアする", + "mapCache_clearOfflineCachePrompt": "キャッシュされた地図のタイルをすべて削除しますか?", + "mapCache_offlineCacheCleared": "オフラインキャッシュをクリア", + "mapCache_noAreaSelected": "選択されたエリアはありません", + "mapCache_cacheArea": "キャッシュエリア", + "mapCache_useCurrentView": "現在表示されている内容を保持する", + "mapCache_zoomRange": "ズーム範囲", + "mapCache_estimatedTiles": "推定されるタイル数: {count}", + "@mapCache_estimatedTiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_downloadedTiles": "Downloaded {completed} / {total}", + "@mapCache_downloadedTiles": { + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "mapCache_downloadTilesButton": "タイルをダウンロードする", + "mapCache_clearCacheButton": "キャッシュをクリアする", + "mapCache_failedDownloads": "失敗したダウンロード: {count}", + "@mapCache_failedDownloads": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}", + "@mapCache_boundsLabel": { + "placeholders": { + "north": { + "type": "String" + }, + "south": { + "type": "String" + }, + "east": { + "type": "String" + }, + "west": { + "type": "String" + } + } + }, + "time_justNow": "まさに今", + "time_minutesAgo": "{minutes}分前", + "@time_minutesAgo": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "time_hoursAgo": "{hours}時間前", + "@time_hoursAgo": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "time_daysAgo": "{days}日前", + "@time_daysAgo": { + "placeholders": { + "days": { + "type": "int" + } + } + }, + "time_hour": "1時間", + "time_hours": "時間", + "time_day": "一日", + "time_days": "日", + "time_week": "1週間", + "time_weeks": "週", + "time_month": "月", + "time_months": "月", + "time_minutes": "分", + "time_allTime": "全期間", + "dialog_disconnect": "切断する", + "dialog_disconnectConfirm": "本当にこのデバイスとの接続を解除したいですか?", + "login_repeaterLogin": "再ログイン", + "login_roomLogin": "ルームサーバーへのログイン", + "login_password": "パスワード", + "login_enterPassword": "パスワードを入力してください", + "login_savePassword": "パスワードを保存する", + "login_savePasswordSubtitle": "パスワードは、このデバイスに安全に保存されます。", + "login_repeaterDescription": "設定やステータスにアクセスするために、リピーターのパスワードを入力してください。", + "login_roomDescription": "設定やステータスへのアクセスには、部屋のパスワードを入力してください。", + "login_routing": "経路設定", + "login_routingMode": "ルーティングモード", + "login_autoUseSavedPath": "自動 (保存されたパスを使用)", + "login_forceFloodMode": "強制的に洪水モードを起動", + "login_managePaths": "パスの管理", + "login_login": "ログイン", + "login_attempt": "試行回数:{current}/{max}", + "@login_attempt": { + "placeholders": { + "current": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + "login_failed": "ログインに失敗しました:{error}", + "@login_failed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "login_failedMessage": "ログインに失敗しました。パスワードが間違っているか、または接続が確立されていません。", + "common_reload": "再読み込み", + "common_clear": "明確", + "path_currentPath": "現在のパス: {path}", + "@path_currentPath": { + "placeholders": { + "path": { + "type": "String" + } + } + }, + "path_usingHopsPath": "{count} {count, plural, =1{ホップ} other{ホップ}}のパスを使用", + "@path_usingHopsPath": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "path_enterCustomPath": "カスタムパスを入力", + "path_currentPathLabel": "現在の経路", + "path_hexPrefixInstructions": "各ホップに対して、2文字の16進数プレフィックスをカンマで区切って入力してください。", + "path_hexPrefixExample": "例:A1, F2, 3C (各ノードは、自身の公開鍵の最初のバイトを使用)", + "path_labelHexPrefixes": "パス (ヘックスプレフィックス)", + "path_helperMaxHops": "最大64個のホップ。各プレフィックスは2つの16進数文字(1バイト)で構成されています。", + "path_selectFromContacts": "または、連絡先リストから選択してください:", + "path_noRepeatersFound": "繰り返し機能やルームサーバーは見つかりませんでした。", + "path_customPathsRequire": "カスタムパスには、メッセージを中継できる中間地点が必要です。", + "path_invalidHexPrefixes": "無効な16進数プレフィックス: {prefixes}", + "@path_invalidHexPrefixes": { + "placeholders": { + "prefixes": { + "type": "String" + } + } + }, + "path_tooLong": "経路が長すぎる。最大64回のジャンプのみ許可。", + "path_setPath": "パスを設定", + "repeater_management": "リピーター管理", + "room_management": "ルームサーバーの管理", + "repeater_managementTools": "管理ツール", + "repeater_status": "ステータス", + "repeater_statusSubtitle": "リピーターの状態、統計情報、および隣接するネットワークの情報を表示する", + "repeater_telemetry": "テレメトリー", + "repeater_telemetrySubtitle": "センサーおよびシステムの状態に関するテレメトリの表示", + "repeater_cli": "CLI(コマンドラインインターフェース)", + "repeater_cliSubtitle": "リピーターへのコマンドを送信する", + "repeater_neighbors": "近隣住民", + "repeater_neighborsSubtitle": "ゼロホップの隣接ノードを表示する。", + "repeater_settings": "設定", + "repeater_settingsSubtitle": "リピーターのパラメータを設定する", + "repeater_statusTitle": "再送ステータス", + "repeater_routingMode": "ルーティングモード", + "repeater_autoUseSavedPath": "自動 (保存されたパスを使用)", + "repeater_forceFloodMode": "強制的に洪水モードを起動", + "repeater_pathManagement": "経路管理", + "repeater_refresh": "リフレッシュ", + "repeater_statusRequestTimeout": "ステータス情報の取得に失敗しました。", + "repeater_errorLoadingStatus": "ステータス読み込みエラー: {error}", + "@repeater_errorLoadingStatus": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_systemInformation": "システム情報", + "repeater_battery": "バッテリー", + "repeater_clockAtLogin": "ログイン時の時刻表示", + "repeater_uptime": "稼働率", + "repeater_queueLength": "待ち行列の長さ", + "repeater_debugFlags": "デバッグフラグ", + "repeater_radioStatistics": "ラジオに関する統計", + "repeater_lastRssi": "最後のRSSI", + "repeater_lastSnr": "最後のSNR", + "repeater_noiseFloor": "ノイズレベル", + "repeater_txAirtime": "TXの放送時間", + "repeater_rxAirtime": "RX 空き時間", + "repeater_packetStatistics": "パケット統計", + "repeater_sent": "送信", + "repeater_received": "受領", + "repeater_duplicates": "重複", + "repeater_daysHoursMinsSecs": "{days}日 {hours}時間 {minutes}分 {seconds}秒", + "@repeater_daysHoursMinsSecs": { + "placeholders": { + "days": { + "type": "int" + }, + "hours": { + "type": "int" + }, + "minutes": { + "type": "int" + }, + "seconds": { + "type": "int" + } + } + }, + "repeater_packetTxTotal": "合計: {total}, 洪水: {flood}, 直接: {direct}", + "@repeater_packetTxTotal": { + "placeholders": { + "total": { + "type": "int" + }, + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } + } + }, + "repeater_packetRxTotal": "合計: {total}, 洪水: {flood}, 直接: {direct}", + "@repeater_packetRxTotal": { + "placeholders": { + "total": { + "type": "int" + }, + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } + } + }, + "repeater_duplicatesFloodDirect": "{flood}: {flood}, 直接: {direct}", + "@repeater_duplicatesFloodDirect": { + "placeholders": { + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } + } + }, + "repeater_duplicatesTotal": "合計: {total}", + "@repeater_duplicatesTotal": { + "placeholders": { + "total": { + "type": "int" + } + } + }, + "repeater_settingsTitle": "リピーター設定", + "repeater_basicSettings": "基本設定", + "repeater_repeaterName": "送信装置名", + "repeater_repeaterNameHelper": "このリピーターの名前", + "repeater_adminPassword": "管理者パスワード", + "repeater_adminPasswordHelper": "完全アクセス権のパスワード", + "repeater_guestPassword": "ゲスト用のパスワード", + "repeater_guestPasswordHelper": "読み取り専用アクセス用のパスワード", + "repeater_radioSettings": "ラジオ設定", + "repeater_frequencyMhz": "周波数 (MHz)", + "repeater_frequencyHelper": "300~2500 MHz", + "repeater_txPower": "TXパワー", + "repeater_txPowerHelper": "-30~-10 dBm", + "repeater_bandwidth": "帯域幅", + "repeater_spreadingFactor": "伝播係数", + "repeater_codingRate": "コーディング速度", + "repeater_locationSettings": "場所設定", + "repeater_latitude": "緯度", + "repeater_latitudeHelper": "度分表記(例:37.7749)", + "repeater_longitude": "経度", + "repeater_longitudeHelper": "度分表記(例:-122.4194)", + "repeater_features": "特徴", + "repeater_packetForwarding": "パケット転送", + "repeater_packetForwardingSubtitle": "リピーターがパケットを転送できるように設定する", + "repeater_guestAccess": "ゲストへのアクセス", + "repeater_guestAccessSubtitle": "ゲストへの読み取り専用アクセスを許可する", + "repeater_privacyMode": "プライバシーモード", + "repeater_privacyModeSubtitle": "広告に名前/場所を記載しない", + "repeater_advertisementSettings": "広告設定", + "repeater_localAdvertInterval": "地域広告掲載期間", + "repeater_localAdvertIntervalMinutes": "{minutes} 分", + "@repeater_localAdvertIntervalMinutes": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "repeater_floodAdvertInterval": "洪水に関する広告の表示間隔", + "repeater_floodAdvertIntervalHours": "{hours} 時間", + "@repeater_floodAdvertIntervalHours": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "repeater_encryptedAdvertInterval": "暗号化された広告表示間", + "repeater_dangerZone": "危険区域", + "repeater_rebootRepeater": "リピーターを再起動する", + "repeater_rebootRepeaterSubtitle": "リピーターデバイスを再起動する", + "repeater_rebootRepeaterConfirm": "本当にこのリピーターを再起動したいですか?", + "repeater_regenerateIdentityKey": "IDキーの再生成", + "repeater_regenerateIdentityKeySubtitle": "新しい公開鍵/秘密鍵のペアを生成する", + "repeater_regenerateIdentityKeyConfirm": "これにより、リピーターには新しい識別情報が割り当てられます。続行しますか?", + "repeater_eraseFileSystem": "ファイルシステムを削除する", + "repeater_eraseFileSystemSubtitle": "リピーターファイルシステムをフォーマットする", + "repeater_eraseFileSystemConfirm": "警告:この操作により、リピーター内のすべてのデータが消去されます。この操作は元に戻すことができません!", + "repeater_eraseSerialOnly": "Erase機能は、シリアルコンソール経由でのみ利用可能です。", + "repeater_commandSent": "送信されたコマンド: {command}", + "@repeater_commandSent": { + "placeholders": { + "command": { + "type": "String" + } + } + }, + "repeater_errorSendingCommand": "コマンド送信エラー:{error}", + "@repeater_errorSendingCommand": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_confirm": "確認", + "repeater_settingsSaved": "設定が正常に保存されました", + "repeater_errorSavingSettings": "設定の保存に失敗しました:{error}", + "@repeater_errorSavingSettings": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_refreshBasicSettings": "基本設定をリセットする", + "repeater_refreshRadioSettings": "ラジオ設定をリセットする", + "repeater_refreshTxPower": "TX の電力レベルをリセットする", + "repeater_refreshLocationSettings": "場所設定をリセットする", + "repeater_refreshPacketForwarding": "パケット転送の刷新", + "repeater_refreshGuestAccess": "ゲストへのアクセスをリフレッシュする", + "repeater_refreshPrivacyMode": "プライバシーモードをリセットする", + "repeater_refreshAdvertisementSettings": "広告設定のリセット", + "repeater_refreshed": "{label} が更新されました", + "@repeater_refreshed": { + "placeholders": { + "label": { + "type": "String" + } + } + }, + "repeater_errorRefreshing": "{label} の更新に失敗しました", + "@repeater_errorRefreshing": { + "placeholders": { + "label": { + "type": "String" + } + } + }, + "repeater_cliTitle": "リピーターのコマンドラインインターフェース", + "repeater_debugNextCommand": "次のコマンドのデバッグ", + "repeater_commandHelp": "コマンドヘルプ", + "repeater_clearHistory": "明確な歴史", + "repeater_noCommandsSent": "まだコマンドは送信されていません", + "repeater_typeCommandOrUseQuick": "以下のコマンドを入力するか、クイックコマンドを使用してください。", + "repeater_enterCommandHint": "コマンドを入力してください...", + "repeater_previousCommand": "直前の指示", + "repeater_nextCommand": "次の指示", + "repeater_enterCommandFirst": "まず、コマンドを入力してください。", + "repeater_cliCommandFrameTitle": "CLI コマンドフレーム", + "repeater_cliCommandError": "エラー:{error}", + "@repeater_cliCommandError": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_cliQuickGetName": "名前を取得する", + "repeater_cliQuickGetRadio": "ラジオを聴く", + "repeater_cliQuickGetTx": "TXを入手する", + "repeater_cliQuickNeighbors": "近隣住民", + "repeater_cliQuickVersion": "バージョン", + "repeater_cliQuickAdvertise": "広告", + "repeater_cliQuickClock": "時計", + "repeater_cliHelpAdvert": "広告用資料を送る", + "repeater_cliHelpReboot": "デバイスを再起動します。(注:通常は「タイムアウト」が表示されますが、これは正常です)", + "repeater_cliHelpClock": "各デバイスの時計で現在の時刻を表示します。", + "repeater_cliHelpPassword": "デバイス用の新しい管理者パスワードを設定します。", + "repeater_cliHelpVersion": "デバイスのバージョンとファームウェアのビルド日を表示します。", + "repeater_cliHelpClearStats": "さまざまな統計カウンターをゼロにリセットする。", + "repeater_cliHelpSetAf": "空き時間係数を設定します。", + "repeater_cliHelpSetTx": "LoRaの送信電力をdBmで設定します。(設定変更後、再起動が必要です)", + "repeater_cliHelpSetRepeat": "このノードに対するリピーターの役割を有効化または無効化します。", + "repeater_cliHelpSetAllowReadOnly": "(ルームサーバー設定)「オン」に設定した場合、空白のパスワードでのログインは可能ですが、ルームへの投稿はできません。(閲覧のみ)", + "repeater_cliHelpSetFloodMax": "インバウンドフラッパケットの最大ホップ数を設定します(最大値を超えた場合、パケットは転送されません)。", + "repeater_cliHelpSetIntThresh": "干渉閾値を設定します(dB単位)。デフォルト値は14です。0に設定すると、チャンネル間の干渉を検出する機能を無効にします。", + "repeater_cliHelpSetAgcResetInterval": "オートゲインコントローラーのリセット間隔を設定します。 0 に設定すると無効化されます。", + "repeater_cliHelpSetMultiAcks": "「ダブルACK」機能の有効化または無効化を可能にします。", + "repeater_cliHelpSetAdvertInterval": "ローカル(ホップなし)の広告パケットを送信する間隔を分単位で設定します。 0 に設定すると、機能を無効にします。", + "repeater_cliHelpSetFloodAdvertInterval": "洪水広告の送信間隔を時間単位で設定します。0に設定すると、送信を停止します。", + "repeater_cliHelpSetGuestPassword": "ゲストのパスワードを設定/更新します。(繰り返し利用の場合、ゲストのログインは「統計情報を取得」のリクエストを送信できます)", + "repeater_cliHelpSetName": "広告の名前を設定します。", + "repeater_cliHelpSetLat": "広告表示の地図の緯度を設定します。(度分秒表記)", + "repeater_cliHelpSetLon": "広告表示の地図の経度を設定します。(度数、分)", + "repeater_cliHelpSetRadio": "完全に新しいラジオパラメータを設定し、設定として保存します。適用するには、「再起動」コマンドが必要です。", + "repeater_cliHelpSetRxDelay": "(実験用)遅延時間を設定するためのベース(1以上の値に設定する必要)\n受信パケットに対して、信号強度/スコアに基づいてわずかな遅延を適用します。 0に設定すると無効化されます。", + "repeater_cliHelpSetTxDelay": "時間経過に応じた「フラッシュモード」パケットの送信遅延を設定します。この遅延は、ランダムなスロットシステムと組み合わせて使用され、パケットの衝突を減らすことを目的としています。", + "repeater_cliHelpSetDirectTxDelay": "txdelayと同様ですが、ダイレクトモードのパケット転送にランダムな遅延を適用する場合に使用します。", + "repeater_cliHelpSetBridgeEnabled": "ブリッジを有効化/無効化", + "repeater_cliHelpSetBridgeDelay": "パケットを再送信する前に、遅延を設定する。", + "repeater_cliHelpSetBridgeSource": "橋が受信したパケットを再送信するか、送信したパケットを再送信するかどうかを選択してください。", + "repeater_cliHelpSetBridgeBaud": "RS232 橋渡しに使用するシリアルリンクのボーレートを設定する。", + "repeater_cliHelpSetBridgeSecret": "ESPNow 橋の秘密設定", + "repeater_cliHelpSetAdcMultiplier": "特定のボードでのみサポートされている、報告されるバッテリー電圧を調整するためのカスタムファクタを設定できます。", + "repeater_cliHelpTempRadio": "指定された時間(分単位)に対して、一時的にラジオパラメータを設定し、その後元のラジオパラメータに戻します。(設定を保存しません)。", + "repeater_cliHelpSetPerm": "ACL を変更します。「permissions」が 0 の場合、対応するエントリ(pubkey のプレフィックスで識別)を削除します。pubkey-hex が有効な長さで、かつ ACL に現在存在しない場合に、新しいエントリを追加します。pubkey のプレフィックスと一致するエントリを更新します。権限ビットはファームウェアの役割によって異なり、下位 2 ビットは以下のとおりです:0 (ゲスト)、1 (読み取り専用)、2 (読み書き)、3 (管理者)", + "repeater_cliHelpGetBridgeType": "ブリッジ機能なし、RS232、ESPNow", + "repeater_cliHelpLogStart": "パケットのログ記録を開始し、ファイルシステムに保存する。", + "repeater_cliHelpLogStop": "ファイルシステムへのパケットログの記録を停止する。", + "repeater_cliHelpLogErase": "ファイルシステムからパケットログを削除する。", + "repeater_cliHelpNeighbors": "ゼロホップ広告を通じて受信した他のリピーターノードの一覧を表示します。各行は、IDプレフィックス(16進数)、タイムスタンプ、SNR(シグナル強度)の情報を4つ含みます。", + "repeater_cliHelpNeighborRemove": "隣接リストから、最初に一致するエントリ(pubkeyプレフィックス(16進数)で特定)を削除します。", + "repeater_cliHelpRegion": "(特定のシリーズのみ)定義されたすべての地域と、現在の洪水許可状況を一覧表示します。", + "repeater_cliHelpRegionLoad": "注:これは特殊な複数コマンドの呼び出しです。その後の各コマンドは、地域名であり(スペースを使用して親階層を示し、少なくとも1つのスペースが必要です)、空行/コマンドで終了します。", + "repeater_cliHelpRegionGet": "指定された名前のプレフィックスを持つ地域を検索します(または、グローバルな範囲の場合は「*」)。結果として、「region-name (parent-name) 'F'」と返答します。", + "repeater_cliHelpRegionPut": "指定された名前で、領域の定義を追加または更新します。", + "repeater_cliHelpRegionRemove": "指定された名前を持つ領域の定義を削除します。(正確に一致している必要があり、子領域は存在してはなりません)", + "repeater_cliHelpRegionAllowf": "指定された領域に対して、「洪水」アクセス許可を設定します。 (グローバル/従来のスコープには「*」を使用)", + "repeater_cliHelpRegionDenyf": "指定された領域における「FLOOD」権限を削除します。(注:現時点では、グローバル/従来の範囲での使用は推奨されません!)", + "repeater_cliHelpRegionHome": "現在の「ホーム」地域に返信します。(まだ適用されていない、将来利用を予定)", + "repeater_cliHelpRegionHomeSet": "「ホーム」地域を設定します。", + "repeater_cliHelpRegionSave": "領域リスト/マップをストレージに保存する。", + "repeater_cliHelpGps": "GPSの状態を表示します。GPSがオフの場合、「オフ」と表示します。オンの場合、「オン」、「ステータス」、「位置情報」、「衛星数」と表示します。", + "repeater_cliHelpGpsOnOff": "GPS の電源状態を切り替えます。", + "repeater_cliHelpGpsSync": "ノードの時刻をGPSクロックと同期する。", + "repeater_cliHelpGpsSetLoc": "ノードの位置をGPS座標に設定し、設定を保存する。", + "repeater_cliHelpGpsAdvert": "ノードの広告設定における場所情報の指定:\n- none: 広告に場所情報を含まない\n- share: GPS位置情報を共有 (SensorManagerから取得)\n- prefs: プリファレンスに保存された場所情報を広告", + "repeater_cliHelpGpsAdvertSet": "場所に関する広告設定を行います。", + "repeater_commandsListTitle": "コマンド一覧", + "repeater_commandsListNote": "注:さまざまな「set ...」コマンドには、「get ...」コマンドも存在します。", + "repeater_general": "一般的な", + "repeater_settingsCategory": "設定", + "repeater_bridge": "橋", + "repeater_logging": "ログ記録", + "repeater_neighborsRepeaterOnly": "近隣住民(リピーターのみ)", + "repeater_regionManagementRepeaterOnly": "地域管理(ブロードキャスト用のみ)", + "repeater_regionNote": "地域レベルでの管理のため、地域定義と権限の管理を行うための機能が導入されました。", + "repeater_gpsManagement": "GPS管理", + "repeater_gpsNote": "GPSコマンドは、位置情報に関連するタスクを管理するために導入されました。", + "telemetry_receivedData": "受信したテレメトリーデータ", + "telemetry_requestTimeout": "テレメトリの要求タイムアウトしました。", + "telemetry_errorLoading": "テレメトリの読み込みに失敗しました: {error}", + "@telemetry_errorLoading": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "telemetry_noData": "テレメトリデータは利用できません。", + "telemetry_channelTitle": "チャンネル {channel}", + "@telemetry_channelTitle": { + "placeholders": { + "channel": { + "type": "int" + } + } + }, + "telemetry_batteryLabel": "バッテリー", + "telemetry_voltageLabel": "電圧", + "telemetry_mcuTemperatureLabel": "MCU の温度", + "telemetry_temperatureLabel": "温度", + "telemetry_currentLabel": "現在", + "telemetry_batteryValue": "{percent}% / {volts}V", + "@telemetry_batteryValue": { + "placeholders": { + "percent": { + "type": "int" + }, + "volts": { + "type": "String" + } + } + }, + "telemetry_voltageValue": "{volts}V", + "@telemetry_voltageValue": { + "placeholders": { + "volts": { + "type": "String" + } + } + }, + "telemetry_currentValue": "{amps}A", + "@telemetry_currentValue": { + "placeholders": { + "amps": { + "type": "String" + } + } + }, + "telemetry_temperatureValue": "{celsius}℃ / {fahrenheit}°F", + "@telemetry_temperatureValue": { + "placeholders": { + "celsius": { + "type": "String" + }, + "fahrenheit": { + "type": "String" + } + } + }, + "neighbors_receivedData": "近隣住民のデータを受信", + "neighbors_requestTimedOut": "近隣住民からの要望:時間制限を設けてください。", + "neighbors_errorLoading": "近隣情報の読み込みに失敗: {error}", + "@neighbors_errorLoading": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "neighbors_repeatersNeighbors": "繰り返し送信する、近隣", + "neighbors_noData": "近隣のデータは利用できません。", + "neighbors_unknownContact": "不明な {pubkey}", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "聞いたのは、{time} くらい前です", + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "channelPath_title": "パケットパス", + "channelPath_viewMap": "地図を表示する", + "channelPath_otherObservedPaths": "観察されたその他の経路", + "channelPath_repeaterHops": "ホップの繰り返し", + "channelPath_noHopDetails": "このパッケージに関する詳細な情報は提供されていません。", + "channelPath_messageDetails": "メッセージの詳細", + "channelPath_senderLabel": "送信者", + "channelPath_timeLabel": "時間", + "channelPath_repeatsLabel": "繰り返し", + "channelPath_pathLabel": "{index} 番目の経路", + "channelPath_observedLabel": "観察", + "channelPath_observedPathTitle": "観察された経路 {index} • {hops}", + "@channelPath_observedPathTitle": { + "placeholders": { + "index": { + "type": "int" + }, + "hops": { + "type": "String" + } + } + }, + "channelPath_noLocationData": "場所に関するデータはありません", + "channelPath_timeWithDate": "{day}/{month} {time}", + "@channelPath_timeWithDate": { + "placeholders": { + "day": { + "type": "int" + }, + "month": { + "type": "int" + }, + "time": { + "type": "String" + } + } + }, + "channelPath_timeOnly": "{time}", + "@channelPath_timeOnly": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "channelPath_unknownPath": "不明", + "channelPath_floodPath": "洪水", + "channelPath_directPath": "直接", + "channelPath_observedZeroOf": "{total}個のホップ", + "@channelPath_observedZeroOf": { + "placeholders": { + "total": { + "type": "int" + } + } + }, + "channelPath_observedSomeOf": "{observed} of {total} hops", + "@channelPath_observedSomeOf": { + "placeholders": { + "observed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "channelPath_mapTitle": "経路図", + "channelPath_noRepeaterLocations": "この経路には、中継装置の設置場所がありません。", + "channelPath_primaryPath": "{index}番目の経路(主要経路)", + "@channelPath_primaryPath": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "@channelPath_pathLabel": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "channelPath_pathLabelTitle": "道", + "channelPath_observedPathHeader": "観察された経路", + "channelPath_selectedPathLabel": "{label} • {prefixes}", + "@channelPath_selectedPathLabel": { + "placeholders": { + "label": { + "type": "String" + }, + "prefixes": { + "type": "String" + } + } + }, + "channelPath_noHopDetailsAvailable": "このパッケージに関する詳細な配送情報は利用できません。", + "channelPath_unknownRepeater": "不明な増幅機", + "community_title": "地域", + "community_create": "コミュニティを構築する", + "community_createDesc": "新しいコミュニティを作成し、QRコードで共有する。", + "community_join": "参加する", + "community_joinTitle": "コミュニティに参加する", + "community_joinConfirmation": "{name}さんのようなコミュニティに参加したいですか?", + "@community_joinConfirmation": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_scanQr": "コミュニティのQRコードをスキャン", + "community_scanInstructions": "カメラを、地域のQRコードを向けて", + "community_showQr": "QRコードを表示する", + "community_publicChannel": "地域住民向け", + "community_hashtagChannel": "コミュニティ用ハッシュタグ", + "community_name": "コミュニティ名", + "community_enterName": "コミュニティ名を入力してください", + "community_created": "コミュニティ「{name}」が作成されました", + "@community_created": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_joined": "{name} のコミュニティに参加", + "@community_joined": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_qrTitle": "コミュニティ共有", + "community_qrInstructions": "このQRコードをスキャンして、{name}に参加してください。", + "@community_qrInstructions": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_hashtagPrivacyHint": "コミュニティハッシュタグのチャンネルは、コミュニティのメンバーのみが参加できます。", + "community_invalidQrCode": "無効なコミュニティQRコード", + "community_alreadyMember": "すでに会員である", + "community_alreadyMemberMessage": "あなたはすでに {name} の会員です。", + "@community_alreadyMemberMessage": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_addPublicChannel": "コミュニティ用の公開チャンネルを追加", + "community_addPublicChannelHint": "このコミュニティの公開チャンネルを自動的に追加する", + "community_noCommunities": "まだコミュニティは形成されていません。", + "community_scanOrCreate": "QRコードをスキャンするか、コミュニティを作成して開始してください。", + "community_manageCommunities": "コミュニティの管理", + "community_delete": "コミュニティからの離脱", + "community_deleteConfirm": "{name}を辞める?", + "@community_deleteConfirm": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_deleteChannelsWarning": "これにより、{count} のチャンネルとそのメッセージも削除されます。", + "@community_deleteChannelsWarning": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "community_deleted": "コミュニティ「{name}」を離れる", + "@community_deleted": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_regenerateSecret": "秘密の復元", + "community_regenerateSecretConfirm": "{name} の秘密鍵を再生成しますか? 継続的に通信するため、すべてのメンバーは新しいQRコードをスキャンする必要があります。", + "@community_regenerateSecretConfirm": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_regenerate": "再生", + "community_secretRegenerated": "{name} への秘密が再設定されました", + "@community_secretRegenerated": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_updateSecret": "秘密情報の更新", + "community_secretUpdated": "{name} 向けの秘密設定を更新", + "@community_secretUpdated": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_scanToUpdateSecret": "新しいQRコードをスキャンして、{name}の秘密情報を更新してください。", + "@community_scanToUpdateSecret": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_addHashtagChannel": "コミュニティのハッシュタグを追加", + "community_addHashtagChannelDesc": "このコミュニティ用のハッシュタグチャンネルを追加する", + "community_selectCommunity": "コミュニティを選択", + "community_regularHashtag": "定期的なハッシュタグ", + "community_regularHashtagDesc": "一般のハッシュタグ(誰でも参加可能)", + "community_communityHashtag": "コミュニティ用ハッシュタグ", + "community_communityHashtagDesc": "コミュニティメンバーのみへの限定", + "community_forCommunity": "{name} 様", + "@community_forCommunity": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "listFilter_tooltip": "フィルタリングと並べ替え", + "listFilter_sortBy": "並び替え", + "listFilter_latestMessages": "最新のメッセージ", + "listFilter_heardRecently": "最近、聞いた", + "listFilter_az": "AからZ", + "listFilter_filters": "フィルター", + "listFilter_all": "すべて", + "listFilter_favorites": "お気に入り", + "listFilter_addToFavorites": "お気に入りに追加", + "listFilter_removeFromFavorites": "お気に入りから削除", + "listFilter_users": "利用者", + "listFilter_repeaters": "繰り返し送信装置", + "listFilter_roomServers": "ルーム用サーバー", + "listFilter_unreadOnly": "未読のみ", + "listFilter_newGroup": "新しいグループ", + "pathTrace_you": "あなた", + "pathTrace_failed": "パスの追跡に失敗しました。", + "pathTrace_notAvailable": "パスの追跡機能は利用できません。", + "pathTrace_refreshTooltip": "パスの追跡をリフレッシュする。", + "pathTrace_someHopsNoLocation": "ホップの1つまたは複数について、場所が特定されていません。", + "pathTrace_clearTooltip": "明確な道筋。", + "losSelectStartEnd": "LOS の開始ノードと終了ノードを選択してください。", + "losRunFailed": "視界確認に失敗: {error}", + "@losRunFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "losClearAllPoints": "すべての項目をクリア", + "losRunToViewElevationProfile": "LOS(レーザー測距)を使用して、標高プロファイルを表示する", + "losMenuTitle": "LOS メニュー", + "losMenuSubtitle": "特定の場所をタップするか、地図を長押ししてカスタムポイントを作成する。", + "losShowDisplayNodes": "表示ノードを表示する", + "losCustomPoints": "カスタマイズ可能なポイント", + "losCustomPointLabel": "カスタマイズ {index}", + "@losCustomPointLabel": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "losPointA": "ポイントA", + "losPointB": "ポイントB", + "losAntennaA": "アンテナ A: {value} {unit}", + "@losAntennaA": { + "placeholders": { + "value": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "losAntennaB": "アンテナ B: {value} {unit}", + "@losAntennaB": { + "placeholders": { + "value": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "losRun": "LOS(レーティングシステム)を使用する", + "losNoElevationData": "標高データは含まれていません", + "losProfileClear": "{distance} {distanceUnit}, clear LOS, min clearance {clearance} {heightUnit}", + "@losProfileClear": { + "placeholders": { + "distance": { + "type": "String" + }, + "distanceUnit": { + "type": "String" + }, + "clearance": { + "type": "String" + }, + "heightUnit": { + "type": "String" + } + } + }, + "losProfileBlocked": "{distance} {distanceUnit}, blocked by {obstruction} {heightUnit}", + "@losProfileBlocked": { + "placeholders": { + "distance": { + "type": "String" + }, + "distanceUnit": { + "type": "String" + }, + "obstruction": { + "type": "String" + }, + "heightUnit": { + "type": "String" + } + } + }, + "losStatusChecking": "LOS:確認中…", + "losStatusNoData": "LOS: データの欠如", + "losStatusSummary": "LOS: {clear}/{total} clear, {blocked} blocked, {unknown} unknown", + "@losStatusSummary": { + "placeholders": { + "clear": { + "type": "int" + }, + "total": { + "type": "int" + }, + "blocked": { + "type": "int" + }, + "unknown": { + "type": "int" + } + } + }, + "losErrorElevationUnavailable": "あるサンプルまたは複数のサンプルについて、標高データが利用できません。", + "losErrorInvalidInput": "LOS(レーダー)計算に必要な、無効な点/標高データ。", + "losRenameCustomPoint": "カスタムポイントの名前を変更する", + "losPointName": "項目名", + "losShowPanelTooltip": "LOSパネルを表示する", + "losHidePanelTooltip": "LOSパネルを隠す", + "losElevationAttribution": "標高データ:Open-Meteo (CC BY 4.0)", + "losLegendRadioHorizon": "ラジオ・ホライゾン", + "losLegendLosBeam": "LOS ビーミング", + "losLegendTerrain": "地形", + "losFrequencyLabel": "周波数", + "losFrequencyInfoTooltip": "計算の詳細を見る", + "losFrequencyDialogTitle": "ラジオによる水平線計算", + "losFrequencyDialogDescription": "k={baselineK} ( {baselineFreq} MHz) から開始し、現在の {frequencyMHz} MHz の帯域に対して k の値を調整します。これにより、曲面状の無線通信範囲の限界が定義されます。", + "@losFrequencyDialogDescription": { + "description": "Explain how the calculation uses the baseline frequency and derived k-factor.", + "placeholders": { + "baselineK": { + "type": "double" + }, + "baselineFreq": { + "type": "double" + }, + "frequencyMHz": { + "type": "double" + }, + "kFactor": { + "type": "double" + } + } + }, + "contacts_pathTrace": "経路追跡", + "contacts_ping": "パング", + "contacts_repeaterPathTrace": "リピーターまでの経路を追跡する", + "contacts_repeaterPing": "PING 繰り返し", + "contacts_roomPathTrace": "部屋のサーバーへの経路を追跡する", + "contacts_roomPing": "ピンルーム用サーバー", + "contacts_chatTraceRoute": "経路の追跡ルート", + "contacts_pathTraceTo": "{name} への経路を追跡する", + "@contacts_pathTraceTo": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "contacts_clipboardEmpty": "クリップボードは空です。", + "contacts_invalidAdvertFormat": "無効な連絡先情報", + "contacts_contactImported": "連絡先が登録されました。", + "contacts_contactImportFailed": "連絡先のインポートに失敗しました。", + "contacts_zeroHopAdvert": "ゼロホップ広告", + "contacts_floodAdvert": "洪水に関する広告", + "contacts_copyAdvertToClipboard": "広告をクリップボードにコピー", + "contacts_addContactFromClipboard": "クリップボードから連絡先を追加する", + "contacts_ShareContact": "連絡先をクリップボードにコピー", + "contacts_ShareContactZeroHop": "広告を通じて連絡先を共有する", + "contacts_zeroHopContactAdvertSent": "広告を通じて連絡先を得た。", + "contacts_zeroHopContactAdvertFailed": "連絡を送信できませんでした。", + "contacts_contactAdvertCopied": "広告がクリップボードにコピーされました。", + "contacts_contactAdvertCopyFailed": "広告のコピーがクリップボードにコピーできませんでした。", + "notification_activityTitle": "メッシュコアの活動", + "notification_messagesCount": "{count} {count, plural, =1{message} other{messages}}", + "@notification_messagesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notification_channelMessagesCount": "{count} {count, plural, =1{チャンネルメッセージ} other{チャンネルメッセージ}}", + "@notification_channelMessagesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notification_newNodesCount": "{count} {count, plural, =1{新しいノード} other{新しいノード}}", + "@notification_newNodesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notification_newTypeDiscovered": "新たに {contactType} が発見されました", + "@notification_newTypeDiscovered": { + "placeholders": { + "contactType": { + "type": "String" + } + } + }, + "notification_receivedNewMessage": "新しいメッセージを受信", + "settings_gpxExportRepeaters": "GPX へのエクスポート用リピーター/ルームサーバー", + "settings_gpxExportRepeatersSubtitle": "GPXファイルに場所情報を付加した、レピーター/ルームサーバーのエクスポート", + "settings_gpxExportContacts": "GPX 形式へのエクスポート", + "settings_gpxExportContactsSubtitle": "GPXファイルに位置情報を保存して、他の人と共有する。", + "settings_gpxExportAll": "すべての連絡先をGPX形式でエクスポートする", + "settings_gpxExportAllSubtitle": "すべての連絡先を、場所情報付きのGPXファイルにエクスポートする。", + "settings_gpxExportSuccess": "GPXファイルの正常なエクスポートが完了しました。", + "settings_gpxExportNoContacts": "エクスポートする連絡先は存在しません。", + "settings_gpxExportNotAvailable": "このデバイス/OSではサポートされていません", + "settings_gpxExportError": "エクスポート時にエラーが発生しました。", + "settings_gpxExportRepeatersRoom": "中継装置およびルームサーバーの設置場所", + "settings_gpxExportChat": "関連施設", + "settings_gpxExportAllContacts": "すべての連絡先場所", + "settings_gpxExportShareText": "meshcore-openからエクスポートされた地図データ", + "settings_gpxExportShareSubject": "meshcore-open GPX形式の地図データのエクスポート", + "snrIndicator_nearByRepeaters": "近くの電波中継局", + "snrIndicator_lastSeen": "最後に確認された場所", + "contactsSettings_title": "連絡先設定", + "contactsSettings_autoAddTitle": "自動検出", + "contactsSettings_otherTitle": "その他の連絡に関する設定", + "contactsSettings_autoAddUsersTitle": "自動でユーザーを追加する", + "contactsSettings_autoAddUsersSubtitle": "利用者が自動的に発見したユーザーを追加できるようにする。", + "contactsSettings_autoAddRepeatersTitle": "自動で繰り返し設定", + "contactsSettings_autoAddRepeatersSubtitle": "発見した中継局を、自動的に追加できるようにする。", + "contactsSettings_autoAddRoomServersTitle": "自動でルームサーバーを追加", + "contactsSettings_autoAddRoomServersSubtitle": "利用者が、発見した部屋のサーバーを自動的に追加できるようにする。", + "contactsSettings_autoAddSensorsTitle": "自動でセンサーを追加", + "contactsSettings_autoAddSensorsSubtitle": "利用者が、発見したセンサーを自動的に追加できるようにする。", + "contactsSettings_overwriteOldestTitle": "最も古いものを上書きする", + "contactsSettings_overwriteOldestSubtitle": "連絡先リストが満杯になった場合、最も古いかつ「お気に入り」ではない連絡先が削除されます。", + "discoveredContacts_Title": "連絡先が見つかった", + "discoveredContacts_noMatching": "一致する連絡先が見つかりませんでした", + "discoveredContacts_searchHint": "発見された連絡先を検索する", + "discoveredContacts_contactAdded": "連絡先を追加", + "discoveredContacts_addContact": "連絡先を追加", + "discoveredContacts_copyContact": "連絡先をクリップボードにコピー", + "discoveredContacts_deleteContact": "発見された連絡先を削除", + "discoveredContacts_deleteContactAll": "発見されたすべての連絡先を削除", + "discoveredContacts_deleteContactAllContent": "本当に、見つけたすべての連絡先を削除してもよろしいですか?", + "chat_sendCooldown": "再度送信する前に、しばらくお待ちください。", + "appSettings_jumpToOldestUnread": "最も古い未読のメッセージへ移動", + "appSettings_jumpToOldestUnreadSubtitle": "未読メッセージがあるチャットを開く際、「最新のメッセージ」ではなく、最初に未読のメッセージまでスクロールしてください。", + "appSettings_languageHu": "ハンガリー語", + "appSettings_languageJa": "日本語", + "appSettings_languageKo": "韓国語", + "radioStats_tooltip": "ラジオおよびメッシュに関する統計", + "radioStats_screenTitle": "ラジオの統計", + "radioStats_notConnected": "ラジオの統計情報を表示するために、デバイスに接続してください。", + "radioStats_firmwareTooOld": "ラジオの統計機能を使用するには、v8またはそれ以降のファームウェアが必要です。", + "radioStats_waiting": "データ待ち…", + "radioStats_noiseFloor": "ノイズレベル: {noiseDbm} dBm", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "radioStats_lastRssi": "最後のRSSI: {rssiDbm} dBm", + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "radioStats_lastSnr": "最終SNR: {snr} dB", + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "radioStats_txAir": "TX 放送時間(合計):{seconds} 秒", + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "radioStats_rxAir": "RX 放送時間(合計):{seconds} 秒", + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "radioStats_chartCaption": "最近のサンプルのノイズレベル(dBm)。", + "radioStats_stripNoise": "ノイズレベル: {noiseDbm} dBm", + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "radioStats_stripWaiting": "ラジオの統計情報を取得中…", + "radioStats_settingsTile": "ラジオの統計", + "radioStats_settingsSubtitle": "ノイズレベル、RSSI、SNR、および通信時間", + "@settings_multiAck": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "settings_privacy": "プライバシー設定", + "settings_privacySubtitle": "共有する情報の内容を管理する。", + "settings_denyAll": "すべてを否定", + "settings_privacySettingsDescription": "自分のデバイスが他の人に共有する情報を選択してください。", + "settings_allowByContact": "連絡先を明示するオプション", + "settings_allowAll": "すべて許可", + "settings_telemetryBaseMode": "テレメトリ基本モード", + "settings_telemetryLocationMode": "テレメトリ位置特定モード", + "settings_telemetryEnvironmentMode": "テレメトリ環境モード", + "settings_advertLocation": "広告掲載場所", + "settings_advertLocationSubtitle": "広告に場所を記載してください。", + "settings_multiAck": "複数のACK:{value}", + "settings_telemetryModeUpdated": "テレメトリモードが更新されました", + "contact_info": "連絡先", + "contact_settings": "連絡設定", + "contact_telemetry": "テレメトリー", + "contact_lastSeen": "最後に確認された場所", + "contact_clearChat": "チャットのクリア", + "contact_teleBase": "テレメトリ基地", + "contact_teleBaseSubtitle": "バッテリー残量と基本的なテレメトリーの共有を許可する", + "contact_teleLoc": "テレメトリの場所", + "contact_teleLocSubtitle": "位置情報共有を許可する", + "contact_teleEnv": "テレメトリ環境", + "contact_teleEnvSubtitle": "環境センサーのデータを共有することを許可する", + "map_showOverlaps": "リピーターキーの重複", + "map_runTraceWithReturnPath": "元の経路に戻る。" +} diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb new file mode 100644 index 0000000..c2215b9 --- /dev/null +++ b/lib/l10n/app_ko.arb @@ -0,0 +1,2048 @@ +{ + "@@locale": "ko", + "appTitle": "MeshCore Open", + "nav_contacts": "연락처", + "nav_channels": "채널", + "nav_map": "지도", + "common_cancel": "취소", + "common_ok": "알겠습니다", + "common_connect": "연결", + "common_unknownDevice": "알 수 없는 장치", + "common_save": "저장", + "common_delete": "삭제", + "common_deleteAll": "모두 삭제", + "common_close": "닫기", + "common_edit": "수정", + "common_add": "추가", + "common_settings": "설정", + "common_disconnect": "연결 해제", + "common_connected": "연결된", + "common_disconnected": "단절", + "common_create": "만들다", + "common_continue": "계속", + "common_share": "공유", + "common_copy": "복사", + "common_retry": "다시 시도", + "common_hide": "숨기다", + "common_remove": "제거", + "common_enable": "활성화", + "common_disable": "비활성화", + "common_reboot": "재부팅", + "common_loading": "로딩 중...", + "common_notAvailable": "—", + "common_voltageValue": "{volts} V", + "@common_voltageValue": { + "placeholders": { + "volts": { + "type": "String" + } + } + }, + "common_percentValue": "{percent}%", + "@common_percentValue": { + "placeholders": { + "percent": { + "type": "int" + } + } + }, + "scanner_title": "MeshCore 공개", + "connectionChoiceUsbLabel": "USB", + "connectionChoiceBluetoothLabel": "블루투스", + "connectionChoiceTcpLabel": "TCP", + "tcpScreenTitle": "TCP를 통해 연결", + "tcpHostLabel": "IP 주소", + "tcpHostHint": "192.168.40.10", + "tcpPortLabel": "항", + "tcpPortHint": "5000", + "tcpStatus_notConnected": "목적지 주소 입력 후 연결", + "tcpStatus_connectingTo": "{endpoint}에 연결 중...", + "@tcpStatus_connectingTo": { + "placeholders": { + "endpoint": { + "type": "String" + } + } + }, + "tcpErrorHostRequired": "IP 주소가 필요합니다.", + "tcpErrorPortInvalid": "포트 번호는 1에서 65535 사이여야 합니다.", + "tcpErrorUnsupported": "이 플랫폼에서는 TCP 트랜스포트를 지원하지 않습니다.", + "tcpErrorTimedOut": "TCP 연결이 시간 초과되었습니다.", + "tcpConnectionFailed": "TCP 연결 실패: {error}", + "@tcpConnectionFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "usbScreenTitle": "USB를 통해 연결", + "usbScreenSubtitle": "감지된 시리얼 장치를 선택하고 MeshCore 노드에 직접 연결하십시오.", + "usbScreenStatus": "USB 장치를 선택합니다.", + "usbScreenNote": "USB 직렬 통신은 지원되는 안드로이드 장치 및 데스크톱 플랫폼에서 활성화됩니다.", + "usbScreenEmptyState": "USB 장치가 탐지되지 않았습니다. USB 장치를 연결하고 다시 시도해 보세요.", + "usbErrorPermissionDenied": "USB 접근 권한이 거부되었습니다.", + "usbErrorDeviceMissing": "선택한 USB 장치는 더 이상 사용 불가능합니다.", + "usbErrorInvalidPort": "유효한 USB 장치를 선택하세요.", + "usbErrorBusy": "또 다른 USB 연결 요청이 이미 진행 중입니다.", + "usbErrorNotConnected": "USB 장치가 연결되지 않았습니다.", + "usbErrorOpenFailed": "선택한 USB 장치를 열 수 없습니다.", + "usbErrorConnectFailed": "선택한 USB 장치에 연결에 실패했습니다.", + "usbErrorUnsupported": "이 플랫폼에서는 USB 직렬 통신을 지원하지 않습니다.", + "usbErrorAlreadyActive": "USB 연결이 이미 활성화되어 있습니다.", + "usbErrorNoDeviceSelected": "USB 장치가 선택되지 않았습니다.", + "usbErrorPortClosed": "USB 연결이 활성화되지 않았습니다.", + "usbErrorConnectTimedOut": "연결이 시간 초과되었습니다. 장치가 USB Companion 펌웨어를 가지고 있는지 확인해 주세요.", + "usbFallbackDeviceName": "웹 시리얼 장치", + "usbStatus_notConnected": "USB 장치를 선택합니다.", + "usbStatus_connecting": "USB 장치에 연결 중...", + "usbStatus_searching": "USB 장치 검색 중...", + "usbConnectionFailed": "USB 연결 실패: {error}", + "@usbConnectionFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "scanner_scanning": "장치 검색 중...", + "scanner_connecting": "연결 중...", + "scanner_disconnecting": "연결 해제 중...", + "scanner_notConnected": "연결되지 않음", + "scanner_connectedTo": "{deviceName}에 연결됨", + "@scanner_connectedTo": { + "placeholders": { + "deviceName": { + "type": "String" + } + } + }, + "scanner_searchingDevices": "MeshCore 장치를 검색 중...", + "scanner_tapToScan": "MeshCore 장치를 찾기 위해 스캔 버튼을 누르세요.", + "scanner_connectionFailed": "연결 실패: {error}", + "@scanner_connectionFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "scanner_stop": "멈춰", + "scanner_scan": "스캔", + "scanner_bluetoothOff": "블루투스는 꺼져 있습니다.", + "scanner_bluetoothOffMessage": "블루투스를 켜서 장치를 검색해주세요.", + "scanner_chromeRequired": "크롬 브라우저 필요", + "scanner_chromeRequiredMessage": "이 웹 애플리케이션은 블루투드 지원을 위해 Google Chrome 또는 Chromium 기반 브라우저가 필요합니다.", + "scanner_enableBluetooth": "블루투스 활성화", + "device_quickSwitch": "빠른 전환", + "device_meshcore": "메쉬코어", + "settings_title": "설정", + "settings_deviceInfo": "장치 정보", + "settings_appSettings": "앱 설정", + "settings_appSettingsSubtitle": "알림, 메시징, 지도 설정", + "settings_nodeSettings": "노드 설정", + "settings_nodeName": "노드 이름", + "settings_nodeNameNotSet": "설정되지 않음", + "settings_nodeNameHint": "노드 이름을 입력하세요", + "settings_nodeNameUpdated": "이름 변경", + "settings_radioSettings": "라디오 설정", + "settings_radioSettingsSubtitle": "주파수, 전력, 스펙트럼", + "settings_radioSettingsUpdated": "라디오 설정이 업데이트되었습니다.", + "settings_location": "위치", + "settings_locationSubtitle": "GPS 좌표", + "settings_locationUpdated": "위치 및 GPS 설정이 업데이트되었습니다.", + "settings_locationBothRequired": "위도와 경도를 모두 입력하세요.", + "settings_locationInvalid": "유효하지 않은 위도 또는 경도.", + "settings_locationGPSEnable": "GPS 활성화", + "settings_locationGPSEnableSubtitle": "GPS를 사용하여 위치 정보를 자동으로 업데이트할 수 있도록 합니다.", + "settings_locationIntervalSec": "GPS 간격 (초)", + "settings_locationIntervalInvalid": "간격은 최소 60초 이상, 86400초 미만이어야 합니다.", + "settings_latitude": "위도", + "settings_longitude": "경도", + "settings_contactSettings": "연락처 설정", + "settings_contactSettingsSubtitle": "연락처 추가 방식 설정", + "settings_privacyMode": "개인 정보 보호 모드", + "settings_privacyModeSubtitle": "광고에 이름/위치 정보 숨기기", + "settings_privacyModeToggle": "광고에 자신의 이름과 위치를 숨기기 위해 개인 정보 보호 모드를 켜거나 끄십시오.", + "settings_privacyModeEnabled": "개인 정보 보호 모드 활성화", + "settings_privacyModeDisabled": "개인 정보 보호 모드 비활성화", + "settings_actions": "행동", + "settings_sendAdvertisement": "광고 전송", + "settings_sendAdvertisementSubtitle": "방송 활동", + "settings_advertisementSent": "광고 전송", + "settings_syncTime": "동기화 시간", + "settings_syncTimeSubtitle": "장치 시계를 휴대폰 시간으로 설정", + "settings_timeSynchronized": "시간 동기화", + "settings_refreshContacts": "연락처 갱신", + "settings_refreshContactsSubtitle": "장치에서 연락처 목록을 다시 불러오기", + "settings_rebootDevice": "장치 재부팅", + "settings_rebootDeviceSubtitle": "MeshCore 장치를 재부팅하세요.", + "settings_rebootDeviceConfirm": "정말로 장치를 재부팅하시겠습니까? 이 경우 연결이 끊어집니다.", + "settings_debug": "디버깅", + "settings_bleDebugLog": "BLE 디버그 로그", + "settings_bleDebugLogSubtitle": "BLE 명령어, 응답 및 원시 데이터", + "settings_appDebugLog": "앱 디버깅 로그", + "settings_appDebugLogSubtitle": "애플리케이션 디버깅 메시지", + "settings_about": "소개", + "settings_aboutVersion": "MeshCore Open {version} 버전", + "@settings_aboutVersion": { + "placeholders": { + "version": { + "type": "String" + } + } + }, + "settings_aboutLegalese": "2026년 MeshCore 오픈 소스 프로젝트", + "settings_aboutDescription": "MeshCore LoRa 메시 네트워크 장치를 위한 오픈 소스 Flutter 클라이언트.", + "settings_aboutOpenMeteoAttribution": "LOS 고도 데이터: Open-Meteo (CC BY 4.0)", + "settings_infoName": "이름", + "settings_infoId": "ID", + "settings_infoStatus": "상태", + "settings_infoBattery": "배터리", + "settings_infoPublicKey": "공개 키", + "settings_infoContactsCount": "연락처 수", + "settings_infoChannelCount": "채널 수", + "settings_presets": "기본 설정", + "settings_frequency": "주파수 (MHz)", + "settings_frequencyHelper": "300.0 - 2500.0", + "settings_frequencyInvalid": "유효하지 않은 주파수 (300-2500 MHz)", + "settings_bandwidth": "대역폭", + "settings_spreadingFactor": "분산 계수", + "settings_codingRate": "코딩 속도", + "settings_txPower": "TX 전력 (dBm)", + "settings_txPowerHelper": "0 - 22", + "settings_txPowerInvalid": "유효하지 않은 TX 전력 (0-22 dBm)", + "settings_clientRepeat": "오프그리드 반복", + "settings_clientRepeatSubtitle": "이 장치가 다른 사람들을 위해 메시 패킷을 반복하도록 허용합니다.", + "settings_clientRepeatFreqWarning": "오프그리드(무전력) 시스템 재연결에는 433MHz, 869MHz, 또는 918MHz 주파수가 필요합니다.", + "settings_error": "오류: {message}", + "@settings_error": { + "placeholders": { + "message": { + "type": "String" + } + } + }, + "appSettings_title": "앱 설정", + "appSettings_appearance": "외관", + "appSettings_theme": "주제", + "appSettings_themeSystem": "기본 설정", + "appSettings_themeLight": "빛", + "appSettings_themeDark": "어둡다", + "appSettings_language": "언어", + "appSettings_languageSystem": "기본 설정", + "appSettings_languageEn": "영어", + "appSettings_languageFr": "프랑스어", + "appSettings_languageEs": "스페인어", + "appSettings_languageDe": "독일어", + "appSettings_languagePl": "폴란드", + "appSettings_languageSl": "슬로베니아어", + "appSettings_languagePt": "포르투갈어", + "appSettings_languageIt": "이탈리아어", + "appSettings_languageZh": "중국어", + "appSettings_languageSv": "스웨덴어", + "appSettings_languageNl": "네덜란드어", + "appSettings_languageSk": "슬로베니아어", + "appSettings_languageBg": "불가리", + "appSettings_languageRu": "러시아어", + "appSettings_languageUk": "우크라이나", + "appSettings_enableMessageTracing": "메시지 추적 기능 활성화", + "appSettings_enableMessageTracingSubtitle": "메시지에 대한 상세한 경로 및 시간 정보를 표시", + "appSettings_notifications": "알림", + "appSettings_enableNotifications": "알림 활성화", + "appSettings_enableNotificationsSubtitle": "메시지와 광고에 대한 알림을 받으세요.", + "appSettings_notificationPermissionDenied": "알림 권한 거부", + "appSettings_notificationsEnabled": "알림 기능 활성화", + "appSettings_notificationsDisabled": "알림 기능 끄기", + "appSettings_messageNotifications": "메시지 알림", + "appSettings_messageNotificationsSubtitle": "새로운 메시지를 받을 때 알림 표시", + "appSettings_channelMessageNotifications": "채널 메시지 알림", + "appSettings_channelMessageNotificationsSubtitle": "채널 메시지를 수신할 때 알림 표시", + "appSettings_advertisementNotifications": "광고 알림", + "appSettings_advertisementNotificationsSubtitle": "새 노드가 발견되었을 때 알림 표시", + "appSettings_messaging": "메시징", + "appSettings_clearPathOnMaxRetry": "Max 재시도 시 경로 명확하게 설정", + "appSettings_clearPathOnMaxRetrySubtitle": "5번의 전송 시도가 실패하면 연락 경로를 재설정", + "appSettings_pathsWillBeCleared": "5번의 시도 실패 후, 해당 경로가 확보될 것입니다.", + "appSettings_pathsWillNotBeCleared": "경로는 자동으로 정리되지 않습니다.", + "appSettings_autoRouteRotation": "자동 경로 순환", + "appSettings_autoRouteRotationSubtitle": "최적 경로와 방수 모드 사이를 전환", + "appSettings_autoRouteRotationEnabled": "자동 경로 순환 기능 활성화", + "appSettings_autoRouteRotationDisabled": "자동 경로 순환 기능 비활성화", + "appSettings_maxRouteWeight": "최대 경로 무게", + "appSettings_maxRouteWeightSubtitle": "한 경로가 성공적인 배송을 통해 누적할 수 있는 최대 무게", + "appSettings_initialRouteWeight": "초기 경로 가중치", + "appSettings_initialRouteWeightSubtitle": "새롭게 발견된 경로의 초기 무게", + "appSettings_routeWeightSuccessIncrement": "성공 횟수 증가", + "appSettings_routeWeightSuccessIncrementSubtitle": "성공적으로 배송된 경로에 추가된 무게", + "appSettings_routeWeightFailureDecrement": "오류 가중치 감소", + "appSettings_routeWeightFailureDecrementSubtitle": "배송 실패 후 경로에서 제거된 무게", + "appSettings_maxMessageRetries": "최대 메시지 재시도 횟수", + "appSettings_maxMessageRetriesSubtitle": "메시지를 실패로 처리하기 전 시도 횟수", + "path_routeWeight": "{weight}/{max}", + "@path_routeWeight": { + "placeholders": { + "weight": { + "type": "String" + }, + "max": { + "type": "String" + } + } + }, + "appSettings_battery": "배터리", + "appSettings_batteryChemistry": "배터리 화학", + "appSettings_batteryChemistryPerDevice": "{deviceName} 당분간", + "@appSettings_batteryChemistryPerDevice": { + "placeholders": { + "deviceName": { + "type": "String" + } + } + }, + "appSettings_batteryChemistryConnectFirst": "장치를 선택하기 위해 연결", + "appSettings_batteryNmc": "18650 NMC (3.0-4.2V)", + "appSettings_batteryLifepo4": "LiFePO4 (2.6-3.65V)", + "appSettings_batteryLipo": "리튬 폴리머 (3.0-4.2V)", + "appSettings_mapDisplay": "지도 표시", + "appSettings_showRepeaters": "반복 기능 표시", + "appSettings_showRepeatersSubtitle": "지도에 반복자 노드를 표시", + "appSettings_showChatNodes": "채팅 노드 표시", + "appSettings_showChatNodesSubtitle": "지도에 채팅 노드를 표시", + "appSettings_showOtherNodes": "다른 노드 표시", + "appSettings_showOtherNodesSubtitle": "지도에서 다른 노드 유형을 표시", + "appSettings_timeFilter": "시간 필터", + "appSettings_timeFilterShowAll": "모든 노드 표시", + "appSettings_timeFilterShowLast": "지난 {hours} 시간 동안의 노드 표시", + "@appSettings_timeFilterShowLast": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "appSettings_mapTimeFilter": "지도 필터", + "appSettings_showNodesDiscoveredWithin": "다음 내역에서 발견된 노드 표시:", + "appSettings_allTime": "모든 시간", + "appSettings_lastHour": "지난 시간", + "appSettings_last6Hours": "지난 6시간", + "appSettings_last24Hours": "지난 24시간", + "appSettings_lastWeek": "지난 주", + "appSettings_offlineMapCache": "오프라인 지도 캐시", + "appSettings_unitsTitle": "단위", + "appSettings_unitsMetric": "단위 (m / km)", + "appSettings_unitsImperial": "제국 (피트/마일)", + "appSettings_noAreaSelected": "선택된 영역 없음", + "appSettings_areaSelectedZoom": "선택된 영역 (줌 레벨: {minZoom} - {maxZoom})", + "@appSettings_areaSelectedZoom": { + "placeholders": { + "minZoom": { + "type": "int" + }, + "maxZoom": { + "type": "int" + } + } + }, + "appSettings_debugCard": "디버깅", + "appSettings_appDebugLogging": "앱 디버깅 로깅", + "appSettings_appDebugLoggingSubtitle": "로그 앱 디버깅 메시지 (문제 해결을 위한)", + "appSettings_appDebugLoggingEnabled": "앱 디버깅 로깅 활성화", + "appSettings_appDebugLoggingDisabled": "앱 디버깅 로깅 비활성화", + "contacts_title": "연락처", + "contacts_noContacts": "아직 연락처는 없습니다.", + "contacts_contactsWillAppear": "장치가 광고를 할 때, 연락처 정보가 표시됩니다.", + "contacts_unread": "읽지 않음", + "contacts_searchContactsNoNumber": "연락처 검색...", + "contacts_searchContacts": "{number} {str} 연락처 검색...", + "@contacts_searchContacts": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchFavorites": "{number} {str} 검색 결과 보기...", + "@contacts_searchFavorites": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchUsers": "{number} {str} 사용자 검색...", + "@contacts_searchUsers": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchRepeaters": "{number} {str} 검색 결과 반복기 검색", + "@contacts_searchRepeaters": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_searchRoomServers": "{number} {str} 방 서버 검색", + "@contacts_searchRoomServers": { + "placeholders": { + "number": { + "type": "int" + }, + "str": { + "type": "String" + } + } + }, + "contacts_noUnreadContacts": "읽지 않은 연락처가 없습니다.", + "contacts_noContactsFound": "연락처 또는 그룹이 검색되지 않았습니다.", + "contacts_deleteContact": "연락처 삭제", + "contacts_removeConfirm": "{contactName}를 연락처 목록에서 제거하시겠습니까?", + "@contacts_removeConfirm": { + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + "contacts_manageRepeater": "리피터 관리", + "contacts_manageRoom": "방 서버 관리", + "contacts_roomLogin": "방 서버 로그인", + "contacts_openChat": "자유로운 대화", + "contacts_editGroup": "편집 그룹", + "contacts_deleteGroup": "그룹 삭제", + "contacts_deleteGroupConfirm": "{groupName} 삭제?", + "@contacts_deleteGroupConfirm": { + "placeholders": { + "groupName": { + "type": "String" + } + } + }, + "contacts_newGroup": "새로운 그룹", + "contacts_groupName": "그룹 이름", + "contacts_groupNameRequired": "그룹 이름이 필요합니다", + "contacts_groupNameReserved": "이 그룹 이름은 이미 사용 중입니다.", + "contacts_groupAlreadyExists": "그룹 \"{name}\"은 이미 존재합니다.", + "@contacts_groupAlreadyExists": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "contacts_filterContacts": "연락처 필터링...", + "contacts_noContactsMatchFilter": "입력하신 검색 조건과 일치하는 연락처가 없습니다.", + "contacts_noMembers": "회원 없음", + "contacts_lastSeenNow": "최근", + "contacts_lastSeenMinsAgo": "~ {minutes} min.", + "@contacts_lastSeenMinsAgo": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "contacts_lastSeenHourAgo": "약 1시간", + "contacts_lastSeenHoursAgo": "~ {hours} hours", + "@contacts_lastSeenHoursAgo": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "contacts_lastSeenDayAgo": "~ 1일", + "contacts_lastSeenDaysAgo": "~ {days}일", + "@contacts_lastSeenDaysAgo": { + "placeholders": { + "days": { + "type": "int" + } + } + }, + "channels_title": "채널", + "channels_noChannelsConfigured": "구성된 채널이 없습니다.", + "channels_addPublicChannel": "공개 채널 추가", + "channels_searchChannels": "검색 채널...", + "channels_noChannelsFound": "채널을 찾을 수 없습니다.", + "channels_channelIndex": "채널 {index}", + "@channels_channelIndex": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "channels_hashtagChannel": "해시태그 채널", + "channels_public": "대중의", + "channels_private": "사립", + "channels_publicChannel": "공개 채널", + "channels_privateChannel": "개인 채널", + "channels_editChannel": "채널 편집", + "channels_muteChannel": "음소거 채널", + "channels_unmuteChannel": "채널 음소거 해제", + "channels_deleteChannel": "채널 삭제", + "channels_deleteChannelConfirm": "{name} 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.", + "@channels_deleteChannelConfirm": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_channelDeleteFailed": "채널 \"{name}\" 삭제에 실패했습니다.", + "@channels_channelDeleteFailed": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_channelDeleted": "채널 \"{name}\" 삭제", + "@channels_channelDeleted": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_addChannel": "채널 추가", + "channels_channelIndexLabel": "채널 인덱스", + "channels_channelName": "채널 이름", + "channels_usePublicChannel": "공개 채널 사용", + "channels_standardPublicPsk": "표준 공공 PSK", + "channels_pskHex": "PSK (헥스)", + "channels_generateRandomPsk": "임의의 PSK 생성", + "channels_enterChannelName": "채널 이름을 입력해 주세요.", + "channels_pskMustBe32Hex": "PSK(개인식별키)는 32자리 16진수 문자여야 합니다.", + "channels_channelAdded": "채널 \"{name}\" 추가", + "@channels_channelAdded": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_editChannelTitle": "채널 {index} 편집", + "@channels_editChannelTitle": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "channels_smazCompression": "SMAZ 압축", + "channels_channelUpdated": "채널 \"{name}\"이 업데이트되었습니다.", + "@channels_channelUpdated": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "channels_publicChannelAdded": "공개 채널 추가", + "channels_sortBy": "정렬 기준 선택", + "channels_sortManual": "사용 설명서", + "channels_sortAZ": "A부터 Z까지", + "channels_sortLatestMessages": "최신 메시지", + "channels_sortUnread": "읽지 않음", + "channels_createPrivateChannel": "개인 채널 만들기", + "channels_createPrivateChannelDesc": "비밀 키로 암호화되어 있습니다.", + "channels_joinPrivateChannel": "개인 채널에 참여하기", + "channels_joinPrivateChannelDesc": "비밀 키를 수동으로 입력합니다.", + "channels_joinPublicChannel": "공개 채널에 참여하세요", + "channels_joinPublicChannelDesc": "누구나 이 채널에 참여할 수 있습니다.", + "channels_joinHashtagChannel": "해시태그 채널에 참여하세요", + "channels_joinHashtagChannelDesc": "누구나 해시태그 채널에 참여할 수 있습니다.", + "channels_scanQrCode": "QR 코드를 스캔", + "channels_scanQrCodeComingSoon": "곧 출시", + "channels_enterHashtag": "해시태그 입력", + "channels_hashtagHint": "예: #팀", + "chat_noMessages": "아직 메시지가 없습니다.", + "chat_sendMessageToStart": "시작하려면 메시지를 보내세요.", + "chat_originalMessageNotFound": "원래 메시지를 찾을 수 없음", + "chat_replyingTo": "{name}에게 답변", + "@chat_replyingTo": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "chat_replyTo": "{name}님께 회신", + "@chat_replyTo": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "chat_location": "위치", + "chat_sendMessageTo": "{contactName}에게 메시지를 보내", + "@chat_sendMessageTo": { + "placeholders": { + "contactName": { + "type": "String" + } + } + }, + "chat_typeMessage": "메시지를 입력하세요...", + "chat_messageTooLong": "메시지가 너무 길어서 (최대 {maxBytes} 바이트).", + "@chat_messageTooLong": { + "placeholders": { + "maxBytes": { + "type": "int" + } + } + }, + "chat_messageCopied": "메시지가 복사되었습니다", + "chat_messageDeleted": "메시지가 삭제되었습니다.", + "chat_retryingMessage": "재시도 메시지", + "chat_retryCount": "{current}/{max} 시도", + "@chat_retryCount": { + "placeholders": { + "current": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + "chat_sendGif": "GIF 보내기", + "chat_reply": "답변", + "chat_addReaction": "댓글 추가", + "chat_me": "나", + "emojiCategorySmileys": "이모티콘", + "emojiCategoryGestures": "제스처", + "emojiCategoryHearts": "심장", + "emojiCategoryObjects": "대상", + "gifPicker_title": "GIF 선택", + "gifPicker_searchHint": "GIF 검색...", + "gifPicker_poweredBy": "GIPHY에서 제공", + "gifPicker_noGifsFound": "GIF 파일이 없습니다.", + "gifPicker_failedLoad": "GIF 파일 로딩 실패", + "gifPicker_failedSearch": "GIF 검색에 실패했습니다.", + "gifPicker_noInternet": "인터넷 연결 없음", + "debugLog_appTitle": "앱 디버깅 로그", + "debugLog_bleTitle": "BLE 디버그 로그", + "debugLog_copyLog": "로그 기록", + "debugLog_clearLog": "명확한 로그", + "debugLog_copied": "디버깅 로그 복사", + "debugLog_bleCopied": "BLE 로그 복사", + "debugLog_noEntries": "현재 디버깅 로그는 생성되지 않았습니다.", + "debugLog_enableInSettings": "설정에서 앱 디버깅 로깅을 활성화합니다.", + "debugLog_frames": "프레임", + "debugLog_rawLogRx": "원시 로그-RX", + "debugLog_noBleActivity": "현재 BLE 관련 활동은 없습니다.", + "debugFrame_length": "프레임 길이: {count} 바이트", + "@debugFrame_length": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "debugFrame_command": "명령: 0x{value}", + "@debugFrame_command": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "debugFrame_textMessageHeader": "텍스트 메시지 프레임:", + "debugFrame_destinationPubKey": "- 목적지 공개 키: {pubKey}", + "@debugFrame_destinationPubKey": { + "placeholders": { + "pubKey": { + "type": "String" + } + } + }, + "debugFrame_timestamp": "- 시간: {timestamp}", + "@debugFrame_timestamp": { + "placeholders": { + "timestamp": { + "type": "int" + } + } + }, + "debugFrame_flags": "- 플래그: 0x{value}", + "@debugFrame_flags": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "debugFrame_textType": "- 텍스트 유형: {type} ({label})", + "@debugFrame_textType": { + "placeholders": { + "type": { + "type": "int" + }, + "label": { + "type": "String" + } + } + }, + "debugFrame_textTypeCli": "명령줄 인터페이스 (CLI)", + "debugFrame_textTypePlain": "단순한", + "debugFrame_text": "- 텍스트: \"{text}\"", + "@debugFrame_text": { + "placeholders": { + "text": { + "type": "String" + } + } + }, + "debugFrame_hexDump": "헥스 덤프:", + "chat_pathManagement": "경로 관리", + "chat_ShowAllPaths": "모든 경로 표시", + "chat_routingMode": "라우팅 방식", + "chat_autoUseSavedPath": "자동 (저장된 경로 사용)", + "chat_forceFloodMode": "강수 모드 활성화", + "chat_recentAckPaths": "최근 사용한 ACK 경로 (사용하려면 탭):", + "chat_pathHistoryFull": "이력 기록은 이미 가득 차 있습니다. 항목을 삭제하여 새로운 항목을 추가할 수 있습니다.", + "chat_hopSingular": "점프", + "chat_hopPlural": "홉", + "chat_hopsCount": "{count} {count, plural, =1{홉} other{홉}}", + "@chat_hopsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chat_successes": "성공 사례", + "chat_removePath": "경로 제거", + "chat_noPathHistoryYet": "아직 경로 기록이 없습니다.\n경로를 찾기 위해 메시지를 보내세요.", + "chat_pathActions": "경로 작업:", + "chat_setCustomPath": "사용자 지정 경로 설정", + "chat_setCustomPathSubtitle": "수동으로 경로를 지정", + "chat_clearPath": "명확한 길", + "chat_clearPathSubtitle": "다음 전송 시, 강제 재전송 설정", + "chat_pathCleared": "경로가 확보되었습니다. 다음 메시지는 경로를 다시 찾을 것입니다.", + "chat_floodModeSubtitle": "앱 바에서 라우팅 스위치를 사용", + "chat_floodModeEnabled": "홍수 모드 활성화됨. 앱 바의 경로 아이콘을 사용하여 다시 전환할 수 있습니다.", + "chat_fullPath": "전체 경로", + "chat_pathDetailsNotAvailable": "경로 정보는 아직 제공되지 않습니다. 메시지를 보내어 다시 시도해 보세요.", + "chat_pathSetHops": "Path set: {hopCount} {hopCount, plural, =1{hop} other{hops}} - {status}", + "@chat_pathSetHops": { + "placeholders": { + "hopCount": { + "type": "int" + }, + "status": { + "type": "String" + } + } + }, + "chat_pathSavedLocally": "로컬에 저장. 동기화 연결", + "chat_pathDeviceConfirmed": "장치 확인 완료.", + "chat_pathDeviceNotConfirmed": "기기가 아직 확인되지 않았습니다.", + "chat_type": "종류", + "chat_path": "경로", + "chat_publicKey": "공개 키", + "chat_compressOutgoingMessages": "전송되는 메시지 압축", + "chat_floodForced": "홍수 (강제)", + "chat_directForced": "직접적인 (강제적인)", + "chat_hopsForced": "{count}번 띄우기 (강제)", + "@chat_hopsForced": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chat_floodAuto": "홍수 (자동)", + "chat_direct": "직접", + "chat_poiShared": "공유된 POI", + "chat_unread": "읽지 않음: {count}", + "@chat_unread": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "chat_openLink": "링크를 열기?", + "chat_openLinkConfirmation": "이 링크를 브라우저에서 열고 싶으신가요?", + "chat_open": "열기", + "chat_couldNotOpenLink": "링크를 열 수 없습니다: {url}", + "@chat_couldNotOpenLink": { + "placeholders": { + "url": { + "type": "String" + } + } + }, + "chat_invalidLink": "유효하지 않은 링크 형식", + "map_title": "노드 매핑", + "map_lineOfSight": "시야", + "map_losScreenTitle": "시야", + "map_noNodesWithLocation": "위치 정보가 있는 노드가 없습니다.", + "map_nodesNeedGps": "노드는 지도에 표시되려면 GPS 좌표를 공유해야 합니다.", + "map_nodesCount": "노드: {count}", + "@map_nodesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "map_pinsCount": "핀: {count}", + "@map_pinsCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "map_chat": "채팅", + "map_repeater": "반복기", + "map_room": "방", + "map_sensor": "센서", + "map_pinDm": "핀 (DM)", + "map_pinPrivate": "개인 계정", + "map_pinPublic": "공개 (일반 공개)", + "map_lastSeen": "마지막으로 목격", + "map_disconnectConfirm": "이 장치와의 연결을 해제하시겠습니까?", + "map_from": "~부터", + "map_source": "출처", + "map_flags": "깃발", + "map_shareMarkerHere": "여기에서 마커 공유", + "map_setAsMyLocation": "내 위치로 설정", + "map_pinLabel": "핀 라벨", + "map_label": "레이블", + "map_pointOfInterest": "관심 지점", + "map_sendToContact": "연락처로 보내기", + "map_sendToChannel": "채널로 전송", + "map_noChannelsAvailable": "사용 가능한 채널이 없습니다.", + "map_publicLocationShare": "공개 장소 공유", + "map_publicLocationShareConfirm": "현재 {channelLabel} 채널에서 위치 정보를 공유하려고 합니다. 이 채널은 공개되어 있으며, PSK를 가진 모든 사용자가 이 위치 정보를 볼 수 있습니다.", + "@map_publicLocationShareConfirm": { + "placeholders": { + "channelLabel": { + "type": "String" + } + } + }, + "map_connectToShareMarkers": "장치를 연결하여 마커를 공유", + "map_filterNodes": "필터 노드", + "map_nodeTypes": "노드 유형", + "map_chatNodes": "채팅 노드", + "map_repeaters": "다시 보내는 장치", + "map_otherNodes": "다른 노드", + "map_keyPrefix": "핵심 접두사", + "map_filterByKeyPrefix": "주요 접두사 기준으로 필터링", + "map_publicKeyPrefix": "공개 키 접두사", + "map_markers": "마커", + "map_showSharedMarkers": "공통 마커 표시", + "map_showGuessedLocations": "추정된 노드 위치 표시", + "map_showDiscoveryContacts": "디스커버리 담당자 연락처 보기", + "map_guessedLocation": "추측된 위치", + "map_lastSeenTime": "마지막으로 확인된 시간", + "map_sharedPin": "공유 비밀번호", + "map_joinRoom": "방에 참여", + "map_manageRepeater": "리피터 관리", + "map_tapToAdd": "노드에 클릭하여 경로에 추가합니다.", + "map_runTrace": "경로 추적", + "map_removeLast": "마지막 항목 삭제", + "map_pathTraceCancelled": "경로 추적 기능이 취소되었습니다.", + "mapCache_title": "오프라인 지도 캐시", + "mapCache_selectAreaFirst": "캐시할 영역을 먼저 선택하세요", + "mapCache_noTilesToDownload": "이 지역에 다운로드할 타일이 없습니다.", + "mapCache_downloadTilesTitle": "타일 다운로드", + "mapCache_downloadTilesPrompt": "{count}개의 타일을 오프라인 사용을 위해 다운로드하시겠습니까?", + "@mapCache_downloadTilesPrompt": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_downloadAction": "다운로드", + "mapCache_cachedTiles": "{count} 개의 타일 캐시", + "@mapCache_cachedTiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_cachedTilesWithFailed": "Cached {downloaded} tiles ({failed} failed)", + "@mapCache_cachedTilesWithFailed": { + "placeholders": { + "downloaded": { + "type": "int" + }, + "failed": { + "type": "int" + } + } + }, + "mapCache_clearOfflineCacheTitle": "오프라인 캐시 삭제", + "mapCache_clearOfflineCachePrompt": "모든 캐시된 지도 템플릿을 삭제하시겠습니까?", + "mapCache_offlineCacheCleared": "오프라인 캐시 삭제", + "mapCache_noAreaSelected": "선택된 영역 없음", + "mapCache_cacheArea": "캐시 영역", + "mapCache_useCurrentView": "현재 보기 유지", + "mapCache_zoomRange": "줌 기능 범위", + "mapCache_estimatedTiles": "예상되는 타일 개수: {count}", + "@mapCache_estimatedTiles": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_downloadedTiles": "Downloaded {completed} / {total}", + "@mapCache_downloadedTiles": { + "placeholders": { + "completed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "mapCache_downloadTilesButton": "타일 다운로드", + "mapCache_clearCacheButton": "캐시 삭제", + "mapCache_failedDownloads": "실패한 다운로드: {count}", + "@mapCache_failedDownloads": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}", + "@mapCache_boundsLabel": { + "placeholders": { + "north": { + "type": "String" + }, + "south": { + "type": "String" + }, + "east": { + "type": "String" + }, + "west": { + "type": "String" + } + } + }, + "time_justNow": "방금", + "time_minutesAgo": "{minutes}분 전", + "@time_minutesAgo": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "time_hoursAgo": "{hours}h ago", + "@time_hoursAgo": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "time_daysAgo": "{days}일 전", + "@time_daysAgo": { + "placeholders": { + "days": { + "type": "int" + } + } + }, + "time_hour": "시간", + "time_hours": "시간", + "time_day": "하루", + "time_days": "일", + "time_week": "주", + "time_weeks": "몇 주", + "time_month": "달", + "time_months": "개월", + "time_minutes": "분", + "time_allTime": "모든 시간", + "dialog_disconnect": "연결 해제", + "dialog_disconnectConfirm": "이 장치와의 연결을 해제하시겠습니까?", + "login_repeaterLogin": "다시 로그인", + "login_roomLogin": "방 서버 로그인", + "login_password": "비밀번호", + "login_enterPassword": "비밀번호를 입력하세요", + "login_savePassword": "비밀번호 저장", + "login_savePasswordSubtitle": "비밀번호는 이 장치에 안전하게 저장됩니다.", + "login_repeaterDescription": "반복기 비밀번호를 입력하여 설정 및 상태를 확인하십시오.", + "login_roomDescription": "설정 및 상태에 액세스하려면 방 비밀번호를 입력하세요.", + "login_routing": "라우팅", + "login_routingMode": "라우팅 모드", + "login_autoUseSavedPath": "자동 (저장된 경로 사용)", + "login_forceFloodMode": "강수 모드 활성화", + "login_managePaths": "경로 관리", + "login_login": "로그인", + "login_attempt": "시도 {current}/{max}", + "@login_attempt": { + "placeholders": { + "current": { + "type": "int" + }, + "max": { + "type": "int" + } + } + }, + "login_failed": "로그인 실패: {error}", + "@login_failed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "login_failedMessage": "로그인에 실패했습니다. 비밀번호가 잘못되었거나, 연결이 되지 않는 것 같습니다.", + "common_reload": "다시 로드", + "common_clear": "명확하게", + "path_currentPath": "현재 경로: {path}", + "@path_currentPath": { + "placeholders": { + "path": { + "type": "String" + } + } + }, + "path_usingHopsPath": "Using {count} {count, plural, =1{hop} other{hops}} path", + "@path_usingHopsPath": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "path_enterCustomPath": "사용자 지정 경로 입력", + "path_currentPathLabel": "현재 경로", + "path_hexPrefixInstructions": "각 단계에 대한 2자리 헥사데진 접두사를 쉼표로 구분하여 입력하세요.", + "path_hexPrefixExample": "예시: A1, F2, 3C (각 노드는 자신의 공개 키의 첫 번째 바이트를 사용)", + "path_labelHexPrefixes": "경로 (헥스 접두사)", + "path_helperMaxHops": "최대 64개의 홉. 각 접두사는 2개의 16진수 문자(1바이트)로 구성됩니다.", + "path_selectFromContacts": "또 연락처 목록에서 선택:", + "path_noRepeatersFound": "반복 장치 또는 서버는 찾을 수 없습니다.", + "path_customPathsRequire": "사용자 정의 경로에는 메시지를 전달할 수 있는 중간 경로가 필요합니다.", + "path_invalidHexPrefixes": "유효하지 않은 16진수 접두사: {prefixes}", + "@path_invalidHexPrefixes": { + "placeholders": { + "prefixes": { + "type": "String" + } + } + }, + "path_tooLong": "경로가 너무 길어. 최대 64개의 연결만 허용됩니다.", + "path_setPath": "경로 설정", + "repeater_management": "리피터 관리", + "room_management": "방 서버 관리", + "repeater_managementTools": "관리 도구", + "repeater_status": "상태", + "repeater_statusSubtitle": "반복 장비의 상태, 통계, 및 이웃 장비 목록 보기", + "repeater_telemetry": "텔레메트리", + "repeater_telemetrySubtitle": "센서 및 시스템 상태에 대한 통신 데이터를 확인", + "repeater_cli": "명령줄 인터페이스 (CLI)", + "repeater_cliSubtitle": "리피터에 명령을 전송", + "repeater_neighbors": "이웃", + "repeater_neighborsSubtitle": "0홉 이웃 노드를 확인합니다.", + "repeater_settings": "설정", + "repeater_settingsSubtitle": "리피터 파라미터 설정", + "repeater_statusTitle": "반복 장치 상태", + "repeater_routingMode": "라우팅 방식", + "repeater_autoUseSavedPath": "자동 (저장된 경로 사용)", + "repeater_forceFloodMode": "강수 모드 활성화", + "repeater_pathManagement": "경로 관리", + "repeater_refresh": "새롭게", + "repeater_statusRequestTimeout": "상태 확인 요청이 시간 초과되었습니다.", + "repeater_errorLoadingStatus": "상태 로딩 오류: {error}", + "@repeater_errorLoadingStatus": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_systemInformation": "시스템 정보", + "repeater_battery": "배터리", + "repeater_clockAtLogin": "로그인 시 시간 표시", + "repeater_uptime": "가동 시간", + "repeater_queueLength": "대기 줄의 길이", + "repeater_debugFlags": "디버깅 플래그", + "repeater_radioStatistics": "라디오 통계", + "repeater_lastRssi": "마지막 RSSI 값", + "repeater_lastSnr": "마지막 SNR", + "repeater_noiseFloor": "잡음 수준", + "repeater_txAirtime": "TX 에어타임", + "repeater_rxAirtime": "RX 에어타임", + "repeater_packetStatistics": "패킷 통계", + "repeater_sent": "발송", + "repeater_received": "수신", + "repeater_duplicates": "중복", + "repeater_daysHoursMinsSecs": "{days}일 {hours}시간 {minutes}분 {seconds}초", + "@repeater_daysHoursMinsSecs": { + "placeholders": { + "days": { + "type": "int" + }, + "hours": { + "type": "int" + }, + "minutes": { + "type": "int" + }, + "seconds": { + "type": "int" + } + } + }, + "repeater_packetTxTotal": "총: {total}, 홍수: {flood}, 직접: {direct}", + "@repeater_packetTxTotal": { + "placeholders": { + "total": { + "type": "int" + }, + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } + } + }, + "repeater_packetRxTotal": "총: {total}, 홍수: {flood}, 직접: {direct}", + "@repeater_packetRxTotal": { + "placeholders": { + "total": { + "type": "int" + }, + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } + } + }, + "repeater_duplicatesFloodDirect": "홍수: {flood}, 직접: {direct}", + "@repeater_duplicatesFloodDirect": { + "placeholders": { + "flood": { + "type": "String" + }, + "direct": { + "type": "String" + } + } + }, + "repeater_duplicatesTotal": "총: {total}", + "@repeater_duplicatesTotal": { + "placeholders": { + "total": { + "type": "int" + } + } + }, + "repeater_settingsTitle": "리피터 설정", + "repeater_basicSettings": "기본 설정", + "repeater_repeaterName": "반복 장비 이름", + "repeater_repeaterNameHelper": "이 반복기용 표시 이름", + "repeater_adminPassword": "관리자 비밀번호", + "repeater_adminPasswordHelper": "전체 접근 권한 비밀번호", + "repeater_guestPassword": "게스트 비밀번호", + "repeater_guestPasswordHelper": "읽기 전용 접근 비밀번호", + "repeater_radioSettings": "라디오 설정", + "repeater_frequencyMhz": "주파수 (MHz)", + "repeater_frequencyHelper": "300-2500 MHz", + "repeater_txPower": "TX 파워", + "repeater_txPowerHelper": "1~30 dBm", + "repeater_bandwidth": "대역폭", + "repeater_spreadingFactor": "분산 계수", + "repeater_codingRate": "코딩 속도", + "repeater_locationSettings": "위치 설정", + "repeater_latitude": "위도", + "repeater_latitudeHelper": "십진법 위도 (예: 37.7749)", + "repeater_longitude": "경도", + "repeater_longitudeHelper": "십진법 위도 (예: -122.4194)", + "repeater_features": "특징", + "repeater_packetForwarding": "패킷 전송", + "repeater_packetForwardingSubtitle": "리피터가 패킷을 전달하도록 설정", + "repeater_guestAccess": "게스트 접근", + "repeater_guestAccessSubtitle": "게스트의 읽기 전용 접근 권한 허용", + "repeater_privacyMode": "개인 정보 보호 모드", + "repeater_privacyModeSubtitle": "광고에 이름/위치 정보 숨기기", + "repeater_advertisementSettings": "광고 설정", + "repeater_localAdvertInterval": "지역 광고 시간 간격", + "repeater_localAdvertIntervalMinutes": "{minutes} 분", + "@repeater_localAdvertIntervalMinutes": { + "placeholders": { + "minutes": { + "type": "int" + } + } + }, + "repeater_floodAdvertInterval": "홍수 광고 간격", + "repeater_floodAdvertIntervalHours": "{hours} 시간", + "@repeater_floodAdvertIntervalHours": { + "placeholders": { + "hours": { + "type": "int" + } + } + }, + "repeater_encryptedAdvertInterval": "암호화된 광고 간격", + "repeater_dangerZone": "위험 구역", + "repeater_rebootRepeater": "리부트 반복", + "repeater_rebootRepeaterSubtitle": "리피터 장치를 재시작하세요.", + "repeater_rebootRepeaterConfirm": "반복기를 재부팅하시려는 것이 맞으신가요?", + "repeater_regenerateIdentityKey": "아이디 키 재 생성", + "repeater_regenerateIdentityKeySubtitle": "새로운 공개/개인 키 쌍 생성", + "repeater_regenerateIdentityKeyConfirm": "이를 통해 리피터에 새로운 식별자를 할당합니다. 계속 진행하시겠습니까?", + "repeater_eraseFileSystem": "파일 시스템 삭제", + "repeater_eraseFileSystemSubtitle": "리피터 파일 시스템을 포맷합니다.", + "repeater_eraseFileSystemConfirm": "경고: 이 작업은 리피터에 있는 모든 데이터를 삭제합니다. 이 작업을 되돌릴 수 없습니다!", + "repeater_eraseSerialOnly": "'Erase' 기능은 시리얼 콘솔을 통해서만 사용할 수 있습니다.", + "repeater_commandSent": "명령 전송: {command}", + "@repeater_commandSent": { + "placeholders": { + "command": { + "type": "String" + } + } + }, + "repeater_errorSendingCommand": "명령 전송 오류: {error}", + "@repeater_errorSendingCommand": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_confirm": "확인", + "repeater_settingsSaved": "설정이 성공적으로 저장되었습니다.", + "repeater_errorSavingSettings": "설정 저장 오류: {error}", + "@repeater_errorSavingSettings": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_refreshBasicSettings": "기본 설정 초기화", + "repeater_refreshRadioSettings": "라디오 설정 초기화", + "repeater_refreshTxPower": "TX 전원 재설정", + "repeater_refreshLocationSettings": "위치 설정 초기화", + "repeater_refreshPacketForwarding": "패킷 전송 재시작", + "repeater_refreshGuestAccess": "게스트 접근 권한 갱신", + "repeater_refreshPrivacyMode": "개인 정보 보호 모드 재설정", + "repeater_refreshAdvertisementSettings": "광고 설정 재설정", + "repeater_refreshed": "{label}가 갱신됨", + "@repeater_refreshed": { + "placeholders": { + "label": { + "type": "String" + } + } + }, + "repeater_errorRefreshing": "{label}를 새로 고침 중 오류 발생", + "@repeater_errorRefreshing": { + "placeholders": { + "label": { + "type": "String" + } + } + }, + "repeater_cliTitle": "리피터 CLI", + "repeater_debugNextCommand": "다음 명령 디버깅", + "repeater_commandHelp": "명령 도움", + "repeater_clearHistory": "명확한 역사", + "repeater_noCommandsSent": "아직 명령이 전송되지 않았습니다.", + "repeater_typeCommandOrUseQuick": "아래에 명령어를 입력하거나, 빠른 명령어를 사용하세요.", + "repeater_enterCommandHint": "명령어를 입력하세요...", + "repeater_previousCommand": "이전 명령어", + "repeater_nextCommand": "다음 명령어", + "repeater_enterCommandFirst": "먼저 명령어를 입력하세요", + "repeater_cliCommandFrameTitle": "CLI 명령어 프레임", + "repeater_cliCommandError": "오류: {error}", + "@repeater_cliCommandError": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "repeater_cliQuickGetName": "이름을 알려주세요", + "repeater_cliQuickGetRadio": "라디오 듣기", + "repeater_cliQuickGetTx": "TX 획득", + "repeater_cliQuickNeighbors": "이웃", + "repeater_cliQuickVersion": "버전", + "repeater_cliQuickAdvertise": "광고", + "repeater_cliQuickClock": "시계", + "repeater_cliHelpAdvert": "광고 패킷을 발송", + "repeater_cliHelpReboot": "장치를 재부팅합니다. (참고: '시간 초과' 오류가 발생할 수 있으며, 이는 정상적인 현상입니다)", + "repeater_cliHelpClock": "각 기기의 시계에 표시되는 현재 시간", + "repeater_cliHelpPassword": "장치에 새로운 관리자 비밀번호를 설정합니다.", + "repeater_cliHelpVersion": "장치 버전 및 펌웨어 빌드 날짜를 표시합니다.", + "repeater_cliHelpClearStats": "다양한 통계 지표를 0으로 초기화합니다.", + "repeater_cliHelpSetAf": "에어 타임 요소를 설정합니다.", + "repeater_cliHelpSetTx": "LoRa 전송 전력을 dBm 단위로 설정합니다. (설정을 적용하려면 재부팅 필요)", + "repeater_cliHelpSetRepeat": "이 노드에 대한 리피터 역할을 활성화하거나 비활성화합니다.", + "repeater_cliHelpSetAllowReadOnly": "(방 서버) '켜짐' 상태인 경우, 빈 비밀번호로 로그인할 수 있지만, 방에 게시할 수는 없습니다 (단, 읽기만 가능).", + "repeater_cliHelpSetFloodMax": "들어오는 플러드 패킷의 최대 홉 수를 설정합니다 (최대 홉 수보다 크거나 같으면 패킷은 전달되지 않습니다).", + "repeater_cliHelpSetIntThresh": "간섭 임계값을 설정합니다 (dB 단위). 기본값은 14입니다. 0으로 설정하면 채널 간섭 감지 기능을 비활성화합니다.", + "repeater_cliHelpSetAgcResetInterval": "자동 게인 제어기를 재설정하는 간격을 설정합니다. 0으로 설정하면 비활성화됩니다.", + "repeater_cliHelpSetMultiAcks": "'더블 ACK' 기능을 활성화하거나 비활성화할 수 있습니다.", + "repeater_cliHelpSetAdvertInterval": "로컬 (제로 홉) 광고 패킷을 전송하는 간격 (분 단위)을 설정합니다. 0으로 설정하면 비활성화됩니다.", + "repeater_cliHelpSetFloodAdvertInterval": "시간 단위로 광고 패킷을 전송하는 간격을 설정합니다. 0으로 설정하면 비활성화됩니다.", + "repeater_cliHelpSetGuestPassword": "게스트 비밀번호를 설정하거나 업데이트합니다. (반복 사용자, 게스트 로그인 시 \"통계 가져오기\" 요청을 보낼 수 있음)", + "repeater_cliHelpSetName": "광고 이름을 설정합니다.", + "repeater_cliHelpSetLat": "광고 지도의 위도를 설정합니다. (십진법 단위)", + "repeater_cliHelpSetLon": "광고 지도의 경도를 설정합니다. (십진도)", + "repeater_cliHelpSetRadio": "완전히 새로운 라디오 파라미터를 설정하고, 선호 사항에 저장합니다. 적용하려면 \"재부팅\" 명령이 필요합니다.", + "repeater_cliHelpSetRxDelay": "(실험용) 기본 설정 (최소 1이어야 함)으로, 수신된 패킷에 약간의 지연을 적용하며, 신호 강도/점수를 기준으로 설정합니다. 0으로 설정하면 비활성화됩니다.", + "repeater_cliHelpSetTxDelay": "공통 패킷의 전송 지연 시간을 설정하며, 시간-공기 시간과 무작위 슬롯 시스템을 곱하여 충돌 가능성을 줄입니다.", + "repeater_cliHelpSetDirectTxDelay": "txdelay와 동일하게, 하지만 직접 모드 패킷 전송 시 무작위 지연을 적용하는 경우", + "repeater_cliHelpSetBridgeEnabled": "브리지 활성화/비활성화", + "repeater_cliHelpSetBridgeDelay": "패킷 재전송 전에 지연 시간을 설정합니다.", + "repeater_cliHelpSetBridgeSource": "브리지가 수신된 패킷을 다시 전송할지, 아니면 전송된 패킷을 다시 전송할지 선택하십시오.", + "repeater_cliHelpSetBridgeBaud": "rs232 브리지에 대한 직렬 통신 속도(baud rate)를 설정합니다.", + "repeater_cliHelpSetBridgeSecret": "ESPNow 브리지에 대한 비밀 설정", + "repeater_cliHelpSetAdcMultiplier": "특정 보드에서만 지원되는 방식으로, 보고되는 배터리 전압을 조정하기 위한 사용자 정의 요소를 설정할 수 있습니다.", + "repeater_cliHelpTempRadio": "주어진 시간(분) 동안 임시 라디오 파라미터를 설정하고, 이후 원래 라디오 파라미터로 되돌립니다. (설정을 저장하지 않습니다).", + "repeater_cliHelpSetPerm": "ACL을 수정합니다. \"permissions\" 값이 0인 경우, 일치하는 항목(pubkey 접두사)을 제거합니다. pubkey-hex 길이가 완전하고 현재 ACL에 없는 경우 새로운 항목을 추가합니다. pubkey 접두사를 기준으로 항목을 업데이트합니다. 권한 비트는 펌웨어 역할에 따라 다르지만, 하위 2비트는 다음과 같습니다: 0 (게스트), 1 (읽기 전용), 2 (읽기/쓰기), 3 (관리자)", + "repeater_cliHelpGetBridgeType": "브리지형, RS232, ESPNOW 지원", + "repeater_cliHelpLogStart": "패킷 로깅을 파일 시스템으로 시작합니다.", + "repeater_cliHelpLogStop": "패킷 로깅을 파일 시스템으로 저장하는 것을 중단합니다.", + "repeater_cliHelpLogErase": "파일 시스템에서 패킷 로그를 삭제합니다.", + "repeater_cliHelpNeighbors": "제로 홉 광고를 통해 수신된 다른 리피터 노드 목록을 보여줍니다. 각 줄은 ID-프리픽스-16진수:타임스탬프:SNR-횟수-4 형식입니다.", + "repeater_cliHelpNeighborRemove": "이 함수는 지정된 pubkey 접두사(16진수)와 일치하는 첫 번째 항목을 이웃 목록에서 제거합니다.", + "repeater_cliHelpRegion": "(단일 시리즈) 정의된 모든 지역과 현재 홍수 허가 정보를 나열합니다.", + "repeater_cliHelpRegionLoad": "참고: 이는 여러 명령을 한 번에 실행하는 특별한 방식입니다. 각 후속 명령은 영역 이름이며 (부모 계층 구조를 나타내기 위해 공백으로 들여쓰기하며, 최소 1개의 공백을 사용) 공백으로 끝나는 줄 또는 명령을 보내어 종료합니다.", + "repeater_cliHelpRegionGet": "주어진 이름 접두사(또는 전역 검색을 위한 \"\\*\" 사용)를 사용하여 특정 지역을 검색합니다. 결과를 \"-> 지역 이름 (상위 지역 이름) 'F'\" 형태로 반환합니다.", + "repeater_cliHelpRegionPut": "주어진 이름으로 지역 정의를 추가하거나 업데이트합니다.", + "repeater_cliHelpRegionRemove": "지정된 이름으로 특정 영역 정의를 제거합니다. (정확히 일치해야 하며, 하위 영역은 존재하지 않아야 합니다)", + "repeater_cliHelpRegionAllowf": "지정된 영역에 대한 '물' 접근 권한을 설정합니다. ('*'는 전역/기존 범위에 해당)", + "repeater_cliHelpRegionDenyf": "지정된 영역에 대해 'Flood' 권한을 제거합니다. (참고: 현재 단계에서는 전역/기존 범위에서 이 기능을 사용하지 않는 것이 좋습니다!!)", + "repeater_cliHelpRegionHome": "현재 '홈' 지역으로 응답합니다. (아직 적용되지 않았으며, 향후 사용을 위해 예약됨)", + "repeater_cliHelpRegionHomeSet": "'홈' 지역을 설정합니다.", + "repeater_cliHelpRegionSave": "지역 목록/지도를 저장에 유지합니다.", + "repeater_cliHelpGps": "GPS 상태를 표시합니다. GPS가 꺼져 있으면 \"꺼짐\"이라고 표시하고, 켜져 있으면 \"켜짐\", 상태, 위치 정보, 위성 수 등을 표시합니다.", + "repeater_cliHelpGpsOnOff": "GPS 전원 상태를 켜고 끄는 기능.", + "repeater_cliHelpGpsSync": "노드 시간을 GPS 시계와 동기화합니다.", + "repeater_cliHelpGpsSetLoc": "노드의 위치를 GPS 좌표로 설정하고, 설정을 저장합니다.", + "repeater_cliHelpGpsAdvert": "노드의 위치 광고 설정:\n- none: 광고에 위치 정보를 포함하지 않음\n- share: GPS 위치 정보를 공유 (SensorManager에서 가져옴)\n- prefs: 설정에 저장된 위치를 광고", + "repeater_cliHelpGpsAdvertSet": "위치 기반 광고 설정 구성", + "repeater_commandsListTitle": "명령 목록", + "repeater_commandsListNote": "참고: 다양한 \"set...\" 명령과 함께 \"get...\" 명령도 존재합니다.", + "repeater_general": "일반", + "repeater_settingsCategory": "설정", + "repeater_bridge": "다리", + "repeater_logging": "로깅", + "repeater_neighborsRepeaterOnly": "이웃 (단방향 통신만 지원)", + "repeater_regionManagementRepeaterOnly": "지역 관리 (단, 중계 기능만 사용)", + "repeater_regionNote": "지역별 관리 기능을 도입하여 지역 정의 및 권한 관리를 수행할 수 있습니다.", + "repeater_gpsManagement": "GPS 관리", + "repeater_gpsNote": "GPS 명령이 위치 관련 주제를 관리하기 위해 도입되었습니다.", + "telemetry_receivedData": "수신된 통신 데이터", + "telemetry_requestTimeout": "원격 모니터링 요청이 시간 초과되었습니다.", + "telemetry_errorLoading": "{error} 오류로 인해 통신 데이터를 로드하지 못했습니다.", + "@telemetry_errorLoading": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "telemetry_noData": "텔레메트리 데이터는 제공되지 않습니다.", + "telemetry_channelTitle": "채널 {channel}", + "@telemetry_channelTitle": { + "placeholders": { + "channel": { + "type": "int" + } + } + }, + "telemetry_batteryLabel": "배터리", + "telemetry_voltageLabel": "전압", + "telemetry_mcuTemperatureLabel": "MCU의 온도", + "telemetry_temperatureLabel": "온도", + "telemetry_currentLabel": "현재", + "telemetry_batteryValue": "{percent}% / {volts}V", + "@telemetry_batteryValue": { + "placeholders": { + "percent": { + "type": "int" + }, + "volts": { + "type": "String" + } + } + }, + "telemetry_voltageValue": "{volts}V", + "@telemetry_voltageValue": { + "placeholders": { + "volts": { + "type": "String" + } + } + }, + "telemetry_currentValue": "{amps}A", + "@telemetry_currentValue": { + "placeholders": { + "amps": { + "type": "String" + } + } + }, + "telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F", + "@telemetry_temperatureValue": { + "placeholders": { + "celsius": { + "type": "String" + }, + "fahrenheit": { + "type": "String" + } + } + }, + "neighbors_receivedData": "이웃 정보 수집", + "neighbors_requestTimedOut": "이웃들이 시간 제한을 요청하고 있습니다.", + "neighbors_errorLoading": "이웃 정보 로딩 중 오류: {error}", + "@neighbors_errorLoading": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "neighbors_repeatersNeighbors": "반복기, 이웃", + "neighbors_noData": "이웃 정보는 없습니다.", + "neighbors_unknownContact": "알 수 없는 {pubkey}", + "@neighbors_unknownContact": { + "placeholders": { + "pubkey": { + "type": "String" + } + } + }, + "neighbors_heardAgo": "Heard: {time} ago", + "@neighbors_heardAgo": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "channelPath_title": "패킷 경로", + "channelPath_viewMap": "지도 보기", + "channelPath_otherObservedPaths": "관찰된 다른 경로", + "channelPath_repeaterHops": "반복 홉", + "channelPath_noHopDetails": "이 패키지에 대한 자세한 정보는 제공되지 않습니다.", + "channelPath_messageDetails": "메시지 세부 정보", + "channelPath_senderLabel": "발신자", + "channelPath_timeLabel": "시간", + "channelPath_repeatsLabel": "반복", + "channelPath_pathLabel": "경로 {index}", + "channelPath_observedLabel": "관찰", + "channelPath_observedPathTitle": "관찰된 경로 {index} • {hops}", + "@channelPath_observedPathTitle": { + "placeholders": { + "index": { + "type": "int" + }, + "hops": { + "type": "String" + } + } + }, + "channelPath_noLocationData": "위치 정보 없음", + "channelPath_timeWithDate": "{day}/{month} {time}", + "@channelPath_timeWithDate": { + "placeholders": { + "day": { + "type": "int" + }, + "month": { + "type": "int" + }, + "time": { + "type": "String" + } + } + }, + "channelPath_timeOnly": "{time}", + "@channelPath_timeOnly": { + "placeholders": { + "time": { + "type": "String" + } + } + }, + "channelPath_unknownPath": "알 수 없음", + "channelPath_floodPath": "홍수", + "channelPath_directPath": "직접", + "channelPath_observedZeroOf": "{total} 중 0개", + "@channelPath_observedZeroOf": { + "placeholders": { + "total": { + "type": "int" + } + } + }, + "channelPath_observedSomeOf": "{observed} of {total} hops", + "@channelPath_observedSomeOf": { + "placeholders": { + "observed": { + "type": "int" + }, + "total": { + "type": "int" + } + } + }, + "channelPath_mapTitle": "경로 지도", + "channelPath_noRepeaterLocations": "이 경로에 대한 중계기 설치 위치는 없습니다.", + "channelPath_primaryPath": "경로 {index} (주 경로)", + "@channelPath_primaryPath": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "@channelPath_pathLabel": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "channelPath_pathLabelTitle": "경로", + "channelPath_observedPathHeader": "관찰된 경로", + "channelPath_selectedPathLabel": "{label} • {prefixes}", + "@channelPath_selectedPathLabel": { + "placeholders": { + "label": { + "type": "String" + }, + "prefixes": { + "type": "String" + } + } + }, + "channelPath_noHopDetailsAvailable": "이 패킷에 대한 이동 정보는 제공되지 않습니다.", + "channelPath_unknownRepeater": "알 수 없는 중계기", + "community_title": "지역 사회", + "community_create": "커뮤니티 만들기", + "community_createDesc": "새로운 커뮤니티를 만들고 QR 코드를 통해 공유하세요.", + "community_join": "참여하기", + "community_joinTitle": "커뮤니티에 참여하기", + "community_joinConfirmation": "{name}님, 커뮤니티에 참여하고 싶으신가요?", + "@community_joinConfirmation": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_scanQr": "커뮤니티 QR 스캔", + "community_scanInstructions": "카메라를 커뮤니티 QR 코드 방향으로 향하게 하세요.", + "community_showQr": "QR 코드 표시", + "community_publicChannel": "지역 사회 대상", + "community_hashtagChannel": "커뮤니티 해시태그", + "community_name": "지역 이름", + "community_enterName": "커뮤니티 이름을 입력하세요", + "community_created": "커뮤니티 \"{name}\"이 생성되었습니다.", + "@community_created": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_joined": "\"{name}\" 커뮤니티에 가입", + "@community_joined": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_qrTitle": "커뮤니티 공유", + "community_qrInstructions": "이 QR 코드를 스캔하여 \"{name}\"에 가입하세요.", + "@community_qrInstructions": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_hashtagPrivacyHint": "커뮤니티 해시태그 채널은 커뮤니티 구성원만 가입할 수 있습니다.", + "community_invalidQrCode": "유효하지 않은 커뮤니티 QR 코드", + "community_alreadyMember": "이미 회원인 경우", + "community_alreadyMemberMessage": "이미 {name}의 회원입니다.", + "@community_alreadyMemberMessage": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_addPublicChannel": "커뮤니티 공개 채널 추가", + "community_addPublicChannelHint": "이 커뮤니티에 공개 채널을 자동으로 추가합니다.", + "community_noCommunities": "아직 어느 커뮤니티도 가입하지 않았습니다.", + "community_scanOrCreate": "QR 코드를 스캔하거나 커뮤니티를 만들어 시작하세요.", + "community_manageCommunities": "커뮤니티 관리", + "community_delete": "커뮤니티 떠나기", + "community_deleteConfirm": "{name}을 묻어두나요?", + "@community_deleteConfirm": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_deleteChannelsWarning": "또한, 이 기능은 {count}개의 채널과 그에 해당하는 메시지를 삭제합니다.", + "@community_deleteChannelsWarning": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "community_deleted": "지역 커뮤니티 \"{name}\"", + "@community_deleted": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_regenerateSecret": "비밀 복원", + "community_regenerateSecretConfirm": "{name}의 비밀 키를 재생성하시겠습니까? 모든 회원은 계속 통신을 위해 새로운 QR 코드를 스캔해야 합니다.", + "@community_regenerateSecretConfirm": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_regenerate": "재생", + "community_secretRegenerated": "{name}을 위한 비밀 정보가 복원되었습니다.", + "@community_secretRegenerated": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_updateSecret": "비밀 업데이트", + "community_secretUpdated": "{name}을 위한 비밀 정보 업데이트", + "@community_secretUpdated": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_scanToUpdateSecret": "새로운 QR 코드를 스캔하여 {name}의 비밀번호를 업데이트하세요.", + "@community_scanToUpdateSecret": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "community_addHashtagChannel": "커뮤니티 해시태그 추가", + "community_addHashtagChannelDesc": "이 커뮤니티를 위한 해시태그 채널을 추가하세요.", + "community_selectCommunity": "커뮤니티 선택", + "community_regularHashtag": "일반 해시태그", + "community_regularHashtagDesc": "공개 해시태그 (누구나 참여 가능)", + "community_communityHashtag": "커뮤니티 해시태그", + "community_communityHashtagDesc": "지역 주민을 위한", + "community_forCommunity": "{name} 님께", + "@community_forCommunity": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "listFilter_tooltip": "필터링 및 정렬", + "listFilter_sortBy": "정렬 기준 선택", + "listFilter_latestMessages": "최신 메시지", + "listFilter_heardRecently": "최근에 들었습니다", + "listFilter_az": "A부터 Z까지", + "listFilter_filters": "필터", + "listFilter_all": "모든", + "listFilter_favorites": "관심 목록", + "listFilter_addToFavorites": "즐겨찾으로 추가", + "listFilter_removeFromFavorites": "즐겨찾에서 제거", + "listFilter_users": "사용자", + "listFilter_repeaters": "다시 보내는 장치", + "listFilter_roomServers": "방 내 서버", + "listFilter_unreadOnly": "읽지 않은 항목만", + "listFilter_newGroup": "새로운 그룹", + "pathTrace_you": "당신", + "pathTrace_failed": "경로 추적 실패.", + "pathTrace_notAvailable": "경로 추적 기능은 제공되지 않습니다.", + "pathTrace_refreshTooltip": "경로 추적 재시작", + "pathTrace_someHopsNoLocation": "홉 중 하나 또는 여러 개에 위치 정보가 누락되었습니다!", + "pathTrace_clearTooltip": "명확한 경로.", + "losSelectStartEnd": "LOS(최소 거리 경로)의 시작 및 종료 노드를 선택합니다.", + "losRunFailed": "시야 확인 실패: {error}", + "@losRunFailed": { + "placeholders": { + "error": { + "type": "String" + } + } + }, + "losClearAllPoints": "모든 사항을 명확히 합니다.", + "losRunToViewElevationProfile": "LOS(Line of Sight)를 사용하여 고도 프로필을 확인합니다.", + "losMenuTitle": "LOS 메뉴", + "losMenuSubtitle": "사용자 지정 지점을 추가하려면, 노드를 탭하거나 맵을 길게 눌러 주세요.", + "losShowDisplayNodes": "노드 표시", + "losCustomPoints": "사용자 지정 포인트", + "losCustomPointLabel": "맞춤형 {index}", + "@losCustomPointLabel": { + "placeholders": { + "index": { + "type": "int" + } + } + }, + "losPointA": "A 지점", + "losPointB": "점 B", + "losAntennaA": "안테나 A: {value} {unit}", + "@losAntennaA": { + "placeholders": { + "value": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "losAntennaB": "Antenna B: {value} {unit}", + "@losAntennaB": { + "placeholders": { + "value": { + "type": "String" + }, + "unit": { + "type": "String" + } + } + }, + "losRun": "LOS (Loss of Signal) 상태로 전환", + "losNoElevationData": "고도 정보 없음", + "losProfileClear": "{distance} {distanceUnit}, clear LOS, min clearance {clearance} {heightUnit}", + "@losProfileClear": { + "placeholders": { + "distance": { + "type": "String" + }, + "distanceUnit": { + "type": "String" + }, + "clearance": { + "type": "String" + }, + "heightUnit": { + "type": "String" + } + } + }, + "losProfileBlocked": "{distance} {distanceUnit}, blocked by {obstruction} {heightUnit}", + "@losProfileBlocked": { + "placeholders": { + "distance": { + "type": "String" + }, + "distanceUnit": { + "type": "String" + }, + "obstruction": { + "type": "String" + }, + "heightUnit": { + "type": "String" + } + } + }, + "losStatusChecking": "LOS: 확인 중...", + "losStatusNoData": "LOS: 데이터 없음", + "losStatusSummary": "LOS: {clear}/{total} 개, {blocked} 개, {unknown} 개", + "@losStatusSummary": { + "placeholders": { + "clear": { + "type": "int" + }, + "total": { + "type": "int" + }, + "blocked": { + "type": "int" + }, + "unknown": { + "type": "int" + } + } + }, + "losErrorElevationUnavailable": "샘플 중 하나 이상에 대한 고도 데이터가 없습니다.", + "losErrorInvalidInput": "LOS 계산에 사용되는 부정확한 지점/고도 데이터.", + "losRenameCustomPoint": "사용자 지정된 지점의 이름을 변경", + "losPointName": "항목 이름", + "losShowPanelTooltip": "LOS 패널 표시", + "losHidePanelTooltip": "LOS 패널 숨기기", + "losElevationAttribution": "고도 데이터: Open-Meteo (CC BY 4.0)", + "losLegendRadioHorizon": "라디오 호라이즌", + "losLegendLosBeam": "LOS 빔", + "losLegendTerrain": "지형", + "losFrequencyLabel": "빈도", + "losFrequencyInfoTooltip": "계산 내역 보기", + "losFrequencyDialogTitle": "라디오 수신 가능 범위 계산", + "losFrequencyDialogDescription": "{baselineK}에서 시작하여 {baselineFreq} MHz의 주파수에서 계산을 시작하면, 현재 {frequencyMHz} MHz 대역에 대한 k-값을 조정하여, 이는 곡선형 라디오 지평선 상한선을 정의합니다.", + "@losFrequencyDialogDescription": { + "description": "Explain how the calculation uses the baseline frequency and derived k-factor.", + "placeholders": { + "baselineK": { + "type": "double" + }, + "baselineFreq": { + "type": "double" + }, + "frequencyMHz": { + "type": "double" + }, + "kFactor": { + "type": "double" + } + } + }, + "contacts_pathTrace": "경로 추적", + "contacts_ping": "핑", + "contacts_repeaterPathTrace": "리피터로 가는 경로", + "contacts_repeaterPing": "핑 반복", + "contacts_roomPathTrace": "방 서버로의 경로 추적", + "contacts_roomPing": "피нг 룸 서버", + "contacts_chatTraceRoute": "경로 추적 경로", + "contacts_pathTraceTo": "{name}까지의 경로 추적", + "@contacts_pathTraceTo": { + "placeholders": { + "name": { + "type": "String" + } + } + }, + "contacts_clipboardEmpty": "클립보드가 비어 있습니다.", + "contacts_invalidAdvertFormat": "유효하지 않은 연락 정보", + "contacts_contactImported": "연락이 수신되었습니다.", + "contacts_contactImportFailed": "연락처를 가져오지 못했습니다.", + "contacts_zeroHopAdvert": "제로 홉 광고", + "contacts_floodAdvert": "홍수 광고", + "contacts_copyAdvertToClipboard": "광고 텍스트를 클립보드에 복사", + "contacts_addContactFromClipboard": "복사본에서 연락처 추가", + "contacts_ShareContact": "연락처를 복사", + "contacts_ShareContactZeroHop": "광고를 통해 연락처 공유", + "contacts_zeroHopContactAdvertSent": "광고를 통해 연락처를 받았습니다.", + "contacts_zeroHopContactAdvertFailed": "연락처 전송에 실패했습니다.", + "contacts_contactAdvertCopied": "광고 내용이 복사되었습니다.", + "contacts_contactAdvertCopyFailed": "광고를 클립보드에 복사하는 데 실패했습니다.", + "notification_activityTitle": "메쉬코어 활동", + "notification_messagesCount": "{count} {count, plural, =1{메시지} other{메시지들}}", + "@notification_messagesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notification_channelMessagesCount": "{count} {count, plural, =1{채널 메시지} other{채널 메시지}}", + "@notification_channelMessagesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notification_newNodesCount": "{count} {count, plural, =1{새 노드} other{새 노드들}}", + "@notification_newNodesCount": { + "placeholders": { + "count": { + "type": "int" + } + } + }, + "notification_newTypeDiscovered": "새로운 {contactType} 발견", + "@notification_newTypeDiscovered": { + "placeholders": { + "contactType": { + "type": "String" + } + } + }, + "notification_receivedNewMessage": "새로운 메시지를 받았습니다", + "settings_gpxExportRepeaters": "GPX로 전송/방 관리 서버", + "settings_gpxExportRepeatersSubtitle": "GPX 파일에 위치 정보를 포함하여 반복자/룸 서버를 내보냅니다.", + "settings_gpxExportContacts": "GPX 형식으로 내보내기", + "settings_gpxExportContactsSubtitle": "GPX 파일에 위치 정보를 포함하여 동행하는 기능을 내보냅니다.", + "settings_gpxExportAll": "모든 연락처를 GPX 형식으로 내보내기", + "settings_gpxExportAllSubtitle": "위치 정보가 있는 모든 연락처를 GPX 파일로 내보냅니다.", + "settings_gpxExportSuccess": "GPX 파일이 성공적으로 내보내졌습니다.", + "settings_gpxExportNoContacts": "수출할 연락처가 없습니다.", + "settings_gpxExportNotAvailable": "귀하의 장치/운영체제에서는 지원되지 않습니다.", + "settings_gpxExportError": "데이터 내보내기 과정에서 오류가 발생했습니다.", + "settings_gpxExportRepeatersRoom": "중계 장치 및 서버 위치", + "settings_gpxExportChat": "함께 방문할 장소", + "settings_gpxExportAllContacts": "모든 연락처 위치", + "settings_gpxExportShareText": "meshcore-open에서 추출한 지도 데이터", + "settings_gpxExportShareSubject": "meshcore-open GPX 지도 데이터 내보내기", + "snrIndicator_nearByRepeaters": "주변의 중계기", + "snrIndicator_lastSeen": "마지막으로 목격", + "contactsSettings_title": "연락처 설정", + "contactsSettings_autoAddTitle": "자동 검색", + "contactsSettings_otherTitle": "다른 연락 관련 설정", + "contactsSettings_autoAddUsersTitle": "자동으로 사용자 추가", + "contactsSettings_autoAddUsersSubtitle": "동반자가 자동으로 발견한 사용자를 추가할 수 있도록 합니다.", + "contactsSettings_autoAddRepeatersTitle": "자동으로 중계기 추가", + "contactsSettings_autoAddRepeatersSubtitle": "애완동물이 발견한 무선 라디오를 자동으로 추가할 수 있도록 설정합니다.", + "contactsSettings_autoAddRoomServersTitle": "자동으로 방 서버 추가", + "contactsSettings_autoAddRoomServersSubtitle": "애완동물이 발견한 방 서버를 자동으로 추가할 수 있도록 설정합니다.", + "contactsSettings_autoAddSensorsTitle": "자동으로 센서 추가", + "contactsSettings_autoAddSensorsSubtitle": "애완동물이 발견한 센서를 자동으로 추가할 수 있도록 설정합니다.", + "contactsSettings_overwriteOldestTitle": "가장 오래된 것을 덮어쓰기", + "contactsSettings_overwriteOldestSubtitle": "연락처 목록이 가득 차면, 가장 오래된 (선호하지 않은) 연락처가 대체됩니다.", + "discoveredContacts_Title": "연락처 찾기", + "discoveredContacts_noMatching": "일치하는 연락처가 없습니다.", + "discoveredContacts_searchHint": "발견된 연락처 검색", + "discoveredContacts_contactAdded": "연락처 추가", + "discoveredContacts_addContact": "연락처 추가", + "discoveredContacts_copyContact": "복사", + "discoveredContacts_deleteContact": "발견된 연락처 삭제", + "discoveredContacts_deleteContactAll": "발견된 모든 연락처 삭제", + "discoveredContacts_deleteContactAllContent": "정말로 모든 검색된 연락처를 삭제하시겠습니까?", + "chat_sendCooldown": "다시 보내기 전에 잠시 기다려 주시기 바랍니다.", + "appSettings_jumpToOldestUnread": "가장 오래된, 아직 읽지 않은 항목으로 이동", + "appSettings_jumpToOldestUnreadSubtitle": "새로운 메시지가 없는 채팅을 열 때, 최신 메시지가 아닌 첫 번째 읽지 않은 메시지로 스크롤하세요.", + "appSettings_languageHu": "헝가리", + "appSettings_languageJa": "일본어", + "appSettings_languageKo": "한국어", + "radioStats_tooltip": "라디오 및 메시 통계", + "radioStats_screenTitle": "라디오 통계", + "radioStats_notConnected": "라디오 통계를 확인하기 위해 장치에 연결합니다.", + "radioStats_firmwareTooOld": "무선 통계 기능을 사용하려면 v8 또는 그 이상의 호환 펌웨어가 필요합니다.", + "radioStats_waiting": "데이터를 기다리는 중…", + "radioStats_noiseFloor": "잡음 수준: {noiseDbm} dBm", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "radioStats_lastRssi": "마지막 RSSI: {rssiDbm} dBm", + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "radioStats_lastSnr": "마지막 SNR: {snr} dB", + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "radioStats_txAir": "TX 방송 시간 (총): {seconds} 초", + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "radioStats_rxAir": "RX 사용 시간 (총): {seconds} 초", + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "radioStats_chartCaption": "최근 샘플의 잡음 수준 (dBm)", + "radioStats_stripNoise": "잡음 수준: {noiseDbm} dBm", + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "radioStats_stripWaiting": "라디오 통계 가져오기…", + "radioStats_settingsTile": "라디오 통계", + "radioStats_settingsSubtitle": "잡음 수준, RSSI, 신호 대 잡음비, 통신 시간", + "@settings_multiAck": { + "placeholders": { + "value": { + "type": "String" + } + } + }, + "settings_privacy": "개인 정보 설정", + "settings_privacySubtitle": "어떤 정보를 공유할지 통제하세요.", + "settings_privacySettingsDescription": "어떤 정보를 기기가 다른 사람들과 공유할지 선택하세요.", + "settings_denyAll": "모든 것을 부정", + "settings_allowByContact": "연락처 표시 기능 활성화", + "settings_allowAll": "모든 것을 허용", + "settings_telemetryBaseMode": "원격 모니터링 기본 설정", + "settings_telemetryLocationMode": "텔레메트리 위치 모드", + "settings_telemetryEnvironmentMode": "텔레메트리 환경 모드", + "settings_advertLocation": "광고 위치", + "settings_advertLocationSubtitle": "광고에 위치 정보를 포함하세요.", + "settings_multiAck": "다중 ACK: {value}", + "settings_telemetryModeUpdated": "텔레메트리 모드 업데이트 완료", + "contact_info": "연락처", + "contact_settings": "연락처 설정", + "contact_telemetry": "텔레메트리", + "contact_lastSeen": "마지막으로 목격", + "contact_clearChat": "명확한 대화", + "contact_teleBase": "텔레메트리 기반", + "contact_teleBaseSubtitle": "배터리 잔량 및 기본적인 통신 데이터를 공유할 수 있도록 허용", + "contact_teleLoc": "텔레메트리 위치", + "contact_teleLocSubtitle": "위치 정보 공유 허용", + "contact_teleEnv": "텔레메트리 환경", + "contact_teleEnvSubtitle": "환경 센서 데이터를 공유하도록 허용", + "map_showOverlaps": "반복 키 중복", + "map_runTraceWithReturnPath": "원래 경로로 돌아가세요." +} diff --git a/lib/l10n/app_localizations_es.dart b/lib/l10n/app_localizations_es.dart index af57fc2..6e9c0de 100644 --- a/lib/l10n/app_localizations_es.dart +++ b/lib/l10n/app_localizations_es.dart @@ -3494,7 +3494,7 @@ class AppLocalizationsEs extends AppLocalizations { @override String get appSettings_jumpToOldestUnread => - 'Ve a el mensaje más antiguo sin leer'; + 'Salta a los mensajes más antiguos sin leer'; @override String get appSettings_jumpToOldestUnreadSubtitle => diff --git a/lib/l10n/app_localizations_hu.dart b/lib/l10n/app_localizations_hu.dart new file mode 100644 index 0000000..7a0bf11 --- /dev/null +++ b/lib/l10n/app_localizations_hu.dart @@ -0,0 +1,3589 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Hungarian (`hu`). +class AppLocalizationsHu extends AppLocalizations { + AppLocalizationsHu([String locale = 'hu']) : super(locale); + + @override + String get appTitle => 'MeshCore Open'; + + @override + String get nav_contacts => 'Kapcsolatok'; + + @override + String get nav_channels => 'Csatornák'; + + @override + String get nav_map => 'Térkép'; + + @override + String get common_cancel => 'Át kell venni'; + + @override + String get common_ok => 'Rendben'; + + @override + String get common_connect => 'Kapcsolódj'; + + @override + String get common_unknownDevice => 'Tudatlan eszköz'; + + @override + String get common_save => 'Mentés'; + + @override + String get common_delete => 'Töröl'; + + @override + String get common_deleteAll => 'Minden törlés'; + + @override + String get common_close => 'Bezárás'; + + @override + String get common_edit => 'Szerkesztés'; + + @override + String get common_add => 'Hozzáad'; + + @override + String get common_settings => 'Beállítások'; + + @override + String get common_disconnect => 'Csatlakozást megszakasztani'; + + @override + String get common_connected => 'Kapcsolódó'; + + @override + String get common_disconnected => 'Elválasztva'; + + @override + String get common_create => 'Készítsd'; + + @override + String get common_continue => 'Folytatás'; + + @override + String get common_share => 'Ossza meg'; + + @override + String get common_copy => 'Másolat'; + + @override + String get common_retry => 'Újrapróbálja'; + + @override + String get common_hide => 'Elrejt'; + + @override + String get common_remove => 'Eltávolít'; + + @override + String get common_enable => 'Engedélyezés'; + + @override + String get common_disable => 'Leteteszt'; + + @override + String get common_reboot => 'Újraindítás'; + + @override + String get common_loading => 'Betöltés...'; + + @override + String get common_notAvailable => '—'; + + @override + String common_voltageValue(String volts) { + return '$volts V'; + } + + @override + String common_percentValue(int percent) { + return '$percent%'; + } + + @override + String get scanner_title => 'MeshCore nyitott'; + + @override + String get connectionChoiceUsbLabel => 'USB'; + + @override + String get connectionChoiceBluetoothLabel => 'Bluetooth'; + + @override + String get connectionChoiceTcpLabel => 'TCP'; + + @override + String get tcpScreenTitle => 'TCP-n keresztül kapcsolódjon'; + + @override + String get tcpHostLabel => 'IP-cím'; + + @override + String get tcpHostHint => '192.168.40.10'; + + @override + String get tcpPortLabel => 'Múzeum'; + + @override + String get tcpPortHint => '5000'; + + @override + String get tcpStatus_notConnected => + 'Adja meg a célpontot, majd kapcsolja össze.'; + + @override + String tcpStatus_connectingTo(String endpoint) { + return 'Kapcsolat a $endpoint-hez...'; + } + + @override + String get tcpErrorHostRequired => 'Az IP-címet meg kell adni.'; + + @override + String get tcpErrorPortInvalid => 'Az érték 1 és 65535 között kell lennie.'; + + @override + String get tcpErrorUnsupported => + 'A TCP-protokoll nem támogatott ez a platformon.'; + + @override + String get tcpErrorTimedOut => 'A TCP-kapcsolat időtúllépett.'; + + @override + String tcpConnectionFailed(String error) { + return 'A TCP-kapcsolat sikertelen: $error'; + } + + @override + String get usbScreenTitle => 'USB-en keresztül csatlakoztassuk'; + + @override + String get usbScreenSubtitle => + 'Válasszon egy azonosított soros eszközt, és közvetlenül csatlakoztassa a MeshCore-hoz.'; + + @override + String get usbScreenStatus => 'Válasszon egy USB-es eszközt'; + + @override + String get usbScreenNote => + 'Az USB-es soros kommunikáció a támogatott Android eszközökön és asztali rendszereken is elérhető.'; + + @override + String get usbScreenEmptyState => + 'Nincs USB eszköz megtalálva. Csatlakoztasson egyet, majd frissítse a rendszert.'; + + @override + String get usbErrorPermissionDenied => 'A USB-es hozzáférés megtagadva.'; + + @override + String get usbErrorDeviceMissing => + 'Az kiválasztott USB eszköz már nem elérhető.'; + + @override + String get usbErrorInvalidPort => 'Válasszon egy érvényes USB-eszközt.'; + + @override + String get usbErrorBusy => + 'Egy másik USB-csatlakozás kérése már folyamatban van.'; + + @override + String get usbErrorNotConnected => 'Nincs csatlakoztatott USB eszköz.'; + + @override + String get usbErrorOpenFailed => + 'Nem sikerült megnyitni a kiválasztott USB-eszközöt.'; + + @override + String get usbErrorConnectFailed => + 'Nem sikerült kapcsolatot létesíteni a kiválasztott USB-eszközhöz.'; + + @override + String get usbErrorUnsupported => + 'Ez a platform nem támogat USB-es soros kommunikációt.'; + + @override + String get usbErrorAlreadyActive => 'Az USB-kapcsolat már be van állítva.'; + + @override + String get usbErrorNoDeviceSelected => 'Nincs kiválasztva USB eszköz.'; + + @override + String get usbErrorPortClosed => 'Az USB-kapcsolat nem aktív.'; + + @override + String get usbErrorConnectTimedOut => + 'Kapcsolódás sikertelen. Ellenőrizze, hogy a eszköz rendelkezik-e USB-hez tartozó firmware-rel.'; + + @override + String get usbFallbackDeviceName => 'Web-szériás eszköz'; + + @override + String get usbStatus_notConnected => 'Válasszon egy USB-es eszközt'; + + @override + String get usbStatus_connecting => 'USB eszközhez való csatlakozás...'; + + @override + String get usbStatus_searching => 'USB eszközök keresése...'; + + @override + String usbConnectionFailed(String error) { + return 'USB-kapcsolat sikertelen: $error'; + } + + @override + String get scanner_scanning => 'Készülékek keresése...'; + + @override + String get scanner_connecting => 'Kapcsolódás...'; + + @override + String get scanner_disconnecting => 'Kapcsolat megszakad...'; + + @override + String get scanner_notConnected => 'Nem csatlakozva'; + + @override + String scanner_connectedTo(String deviceName) { + return 'Kapcsolódik a $deviceName-hez'; + } + + @override + String get scanner_searchingDevices => 'MeshCore eszközök keresése...'; + + @override + String get scanner_tapToScan => + 'A Tap Scan funkció segítségével kereshet MeshCore eszközöket.'; + + @override + String scanner_connectionFailed(String error) { + return 'Kapcsolódás sikertelen: $error'; + } + + @override + String get scanner_stop => 'Megállj'; + + @override + String get scanner_scan => 'Szkenálás'; + + @override + String get scanner_bluetoothOff => 'A Bluetooth kikapcsolva'; + + @override + String get scanner_bluetoothOffMessage => + 'Kérjük, kapcsolja be a Bluetooth-ot, hogy eszközök keresése lehessen.'; + + @override + String get scanner_chromeRequired => 'Chrome böngésző szükséges'; + + @override + String get scanner_chromeRequiredMessage => + 'Ez az alkalmazás a Bluetooth funkcióhoz Google Chrome-ot vagy Chromium alapú böngészőt igényel.'; + + @override + String get scanner_enableBluetooth => 'Engedje be a Bluetooth funkciót'; + + @override + String get device_quickSwitch => 'Gyors váltás'; + + @override + String get device_meshcore => 'MeshCore'; + + @override + String get settings_title => 'Beállítások'; + + @override + String get settings_deviceInfo => 'A készülék információi'; + + @override + String get settings_appSettings => 'Alkalmazási beállítások'; + + @override + String get settings_appSettingsSubtitle => + 'Értesítések, üzenetküldés és térképi beállítások'; + + @override + String get settings_nodeSettings => 'Műközép beállítások'; + + @override + String get settings_nodeName => 'Vonal neve'; + + @override + String get settings_nodeNameNotSet => 'Nem megállapított'; + + @override + String get settings_nodeNameHint => 'Adja meg a csomópont nevét'; + + @override + String get settings_nodeNameUpdated => 'Neve frissítve'; + + @override + String get settings_radioSettings => 'Rádióbeállítások'; + + @override + String get settings_radioSettingsSubtitle => + 'Frekvencia, teljesítmény, szélesítési tényező'; + + @override + String get settings_radioSettingsUpdated => 'A rádió beállítások frissítve'; + + @override + String get settings_location => 'Helyszín'; + + @override + String get settings_locationSubtitle => 'GPS koordináták'; + + @override + String get settings_locationUpdated => + 'A helyzet és a GPS beállítások frissítve'; + + @override + String get settings_locationBothRequired => + 'Kérjük, adja meg a földrajzi szélességet és hosszúságot.'; + + @override + String get settings_locationInvalid => + 'Érvénytelen szélesszög vagy hosszszög.'; + + @override + String get settings_locationGPSEnable => 'GPS engedélyezve'; + + @override + String get settings_locationGPSEnableSubtitle => + 'Lehetővé teszi, hogy a GPS automatikusan frissítse a helyzetet.'; + + @override + String get settings_locationIntervalSec => + 'GPS-számolási intervallum (másodpercek)'; + + @override + String get settings_locationIntervalInvalid => + 'Az intervallum legalább 60 másodpercnek, de legfeljebb 86400 másodpercnak kell lennie.'; + + @override + String get settings_latitude => 'Nyugat-–––––––––––––––––––––––––––––––'; + + @override + String get settings_longitude => 'hosszúság'; + + @override + String get settings_contactSettings => 'Kapcsolat beállítások'; + + @override + String get settings_contactSettingsSubtitle => + 'Beállítások, amelyek meghatározzák, hogyan lehet új kapcsolatokat hozzáadni.'; + + @override + String get settings_privacyMode => 'Adatvédelem mód'; + + @override + String get settings_privacyModeSubtitle => + 'Elrejtsük a nevét/a helyszínt az űrianyagokban'; + + @override + String get settings_privacyModeToggle => + 'Engedje be a privát üzemmódot, hogy elrejtse a nevét és a helyét az online hirdetésekben.'; + + @override + String get settings_privacyModeEnabled => 'Adatvédelem mód beállítva'; + + @override + String get settings_privacyModeDisabled => 'Adatvédelem mód kikapcsolva'; + + @override + String get settings_privacy => 'Adatvédelem beállítások'; + + @override + String get settings_privacySubtitle => + 'Ellenőrizd, hogy milyen információkat osztanak meg.'; + + @override + String get settings_privacySettingsDescription => + 'Válassza ki, hogy az eszközének melyik információkat oszt meg másokkal.'; + + @override + String get settings_denyAll => 'Elutasítom'; + + @override + String get settings_allowByContact => + 'Lehetővé teszi a kapcsolatok kezelését'; + + @override + String get settings_allowAll => 'Engedje meg mindent'; + + @override + String get settings_telemetryBaseMode => 'Adatkapcsolati alapállapot'; + + @override + String get settings_telemetryLocationMode => 'Adatkapcsolási helyszín mód'; + + @override + String get settings_telemetryEnvironmentMode => + 'Adatkapcsolati környezeti mód'; + + @override + String get settings_advertLocation => 'Reklám megjelenési hely'; + + @override + String get settings_advertLocationSubtitle => + 'A hirdetés tartalmazza a helyszínt.'; + + @override + String settings_multiAck(String value) { + return 'Többszöri visszaigazolások: $value'; + } + + @override + String get settings_telemetryModeUpdated => 'A telemetriamód frissítve'; + + @override + String get settings_actions => 'Tevékenységek'; + + @override + String get settings_sendAdvertisement => 'Hirdetés küldése'; + + @override + String get settings_sendAdvertisementSubtitle => 'A nyilvános megjelenés'; + + @override + String get settings_advertisementSent => 'Hirdetés elküldve'; + + @override + String get settings_syncTime => 'Szinkronizációs idő'; + + @override + String get settings_syncTimeSubtitle => + 'Állítsa a készülék időzítését a telefon időjére'; + + @override + String get settings_timeSynchronized => 'Időben szinkronizált'; + + @override + String get settings_refreshContacts => 'Újraindítsd a kapcsolatok listát'; + + @override + String get settings_refreshContactsSubtitle => + 'Újra töltse a kontaktlista-adatokat a készülékről'; + + @override + String get settings_rebootDevice => 'Újraindítás'; + + @override + String get settings_rebootDeviceSubtitle => + 'Indítsa újra a MeshCore eszközt.'; + + @override + String get settings_rebootDeviceConfirm => + 'Biztosan szeretné újraindítani a készüléket? Ebben az esetben a kapcsolat megszűnik.'; + + @override + String get settings_debug => 'Hibakeresés'; + + @override + String get settings_bleDebugLog => 'BLE hibaelhárítási napló'; + + @override + String get settings_bleDebugLogSubtitle => + 'BLE parancsok, válaszok és alapvető adatok'; + + @override + String get settings_appDebugLog => 'App-debug log'; + + @override + String get settings_appDebugLogSubtitle => 'Programozási hibajelzések'; + + @override + String get settings_about => 'Ról'; + + @override + String settings_aboutVersion(String version) { + return 'MeshCore Open $version verzió'; + } + + @override + String get settings_aboutLegalese => + '2026-os MeshCore nyílt forráskódú projekt'; + + @override + String get settings_aboutDescription => + 'Egy nyílt forráskódú Flutter kliens a MeshCore LoRa hálózati eszközök számára.'; + + @override + String get settings_aboutOpenMeteoAttribution => + 'LOS magassági adatok: Open-Meteo (CC BY 4.0)'; + + @override + String get settings_infoName => 'Név'; + + @override + String get settings_infoId => 'Az azonosító'; + + @override + String get settings_infoStatus => 'Állapot'; + + @override + String get settings_infoBattery => 'Akku'; + + @override + String get settings_infoPublicKey => 'Nyelvkönyv'; + + @override + String get settings_infoContactsCount => 'Kapcsolatok száma'; + + @override + String get settings_infoChannelCount => 'Csatorna száma'; + + @override + String get settings_presets => 'Előre beállított beállítások'; + + @override + String get settings_frequency => 'Frekvencia (MHz)'; + + @override + String get settings_frequencyHelper => '300,0 – 2500,0'; + + @override + String get settings_frequencyInvalid => + 'Érvénytelen frekvencia (300-2500 MHz)'; + + @override + String get settings_bandwidth => 'Kapacitás'; + + @override + String get settings_spreadingFactor => 'Terjesztési tényező'; + + @override + String get settings_codingRate => 'Kódolási sebesség'; + + @override + String get settings_txPower => 'TX teljesítmény (dBm)'; + + @override + String get settings_txPowerHelper => '0 – 22'; + + @override + String get settings_txPowerInvalid => + 'Érvénytelen TX teljesítmény (0-22 dBm)'; + + @override + String get settings_clientRepeat => 'Autonóm rendszer újra'; + + @override + String get settings_clientRepeatSubtitle => + 'Engedje, hogy ez a eszköz mások számára is ismételje a hálózati csomagokat.'; + + @override + String get settings_clientRepeatFreqWarning => + 'A hálózat nélküli kommunikációhoz 433, 869 vagy 918 MHz frekvenciát igényel.'; + + @override + String settings_error(String message) { + return 'Hiba: $message'; + } + + @override + String get appSettings_title => 'Alkalmazási beállítások'; + + @override + String get appSettings_appearance => 'Megjelenés'; + + @override + String get appSettings_theme => 'Téma'; + + @override + String get appSettings_themeSystem => 'Alapértékek'; + + @override + String get appSettings_themeLight => 'Világítás'; + + @override + String get appSettings_themeDark => 'Sötét'; + + @override + String get appSettings_language => 'Nyelv'; + + @override + String get appSettings_languageSystem => 'Alapértékek'; + + @override + String get appSettings_languageEn => 'Angol'; + + @override + String get appSettings_languageFr => 'Francia'; + + @override + String get appSettings_languageEs => 'Spanyol'; + + @override + String get appSettings_languageDe => 'Német'; + + @override + String get appSettings_languagePl => 'Lengyel'; + + @override + String get appSettings_languageSl => 'szlovén nyelv'; + + @override + String get appSettings_languagePt => 'Portugál'; + + @override + String get appSettings_languageIt => 'Olasz'; + + @override + String get appSettings_languageZh => 'Kínai'; + + @override + String get appSettings_languageSv => 'Svéd'; + + @override + String get appSettings_languageNl => 'Hollandi'; + + @override + String get appSettings_languageSk => 'Szlovén nyelvre fordítás'; + + @override + String get appSettings_languageBg => 'Bulgár'; + + @override + String get appSettings_languageRu => 'Orosz'; + + @override + String get appSettings_languageUk => 'Украинский'; + + @override + String get appSettings_enableMessageTracing => + 'Engedje meg a üzenetek nyomon követését'; + + @override + String get appSettings_enableMessageTracingSubtitle => + 'Adja meg a üzenetek részletes útvonal- és időzítési adatokat.'; + + @override + String get appSettings_notifications => 'Értesítések'; + + @override + String get appSettings_enableNotifications => 'Engedélyezze az értesítéseket'; + + @override + String get appSettings_enableNotificationsSubtitle => + 'Kapjon értesítéseket üzenetekről és hirdetésekről.'; + + @override + String get appSettings_notificationPermissionDenied => + 'A értesítési engedély megtagadva'; + + @override + String get appSettings_notificationsEnabled => + 'A figyelmeztetések engedélyezve'; + + @override + String get appSettings_notificationsDisabled => + 'A figyelmeztetések kikapcsolva'; + + @override + String get appSettings_messageNotifications => 'Üzenet értesítések'; + + @override + String get appSettings_messageNotificationsSubtitle => + 'A figyelmeztetést megjelenítve, amikor új üzenet érkezik'; + + @override + String get appSettings_channelMessageNotifications => + 'Csatorna-üzenetek értesítése'; + + @override + String get appSettings_channelMessageNotificationsSubtitle => + 'A figyelmeztetést megjelenítve, amikor új üzenet érkezik a csatornáról'; + + @override + String get appSettings_advertisementNotifications => 'Reklám értesítések'; + + @override + String get appSettings_advertisementNotificationsSubtitle => + 'A figyelmeztetést megjelenítve, amikor új csomópontok kerülnek felfedezésre.'; + + @override + String get appSettings_messaging => 'Üzenetek küldése'; + + @override + String get appSettings_clearPathOnMaxRetry => + 'Egyértelmű út a Max Retry funkció használatával'; + + @override + String get appSettings_clearPathOnMaxRetrySubtitle => + 'A kapcsolat visszaállítás 5 sikertelen továbbítás után'; + + @override + String get appSettings_pathsWillBeCleared => + 'Ha 5-szer sikertelenül próbálunk, a útvonalat automatikusan tisztítjuk.'; + + @override + String get appSettings_pathsWillNotBeCleared => + 'A utak automatikusan nem tisztítódnak.'; + + @override + String get appSettings_autoRouteRotation => 'Autóútok forgása'; + + @override + String get appSettings_autoRouteRotationSubtitle => + 'Válasszon a legjobb útvonalak között, vagy válassza a vízözön-módot.'; + + @override + String get appSettings_autoRouteRotationEnabled => + 'Az automatikus útvonalváltás engedélyezve'; + + @override + String get appSettings_autoRouteRotationDisabled => + 'Az automatikus útvonal-választás funkció kikapcsolva.'; + + @override + String get appSettings_maxRouteWeight => 'Maximális útvonal súly'; + + @override + String get appSettings_maxRouteWeightSubtitle => + 'A lehető legnagyobb súly, amit egy útvonal sikeres szállítmányok során összegyűjthet.'; + + @override + String get appSettings_initialRouteWeight => 'A kezdeti útvonal súlya'; + + @override + String get appSettings_initialRouteWeightSubtitle => + 'Az új, felfedezett útvonalakhoz tartozó kezdeti súly'; + + @override + String get appSettings_routeWeightSuccessIncrement => + 'Sikerhez vezető növelés'; + + @override + String get appSettings_routeWeightSuccessIncrementSubtitle => + 'A sikeresen teljesített útvonalhoz hozzáadott súly.'; + + @override + String get appSettings_routeWeightFailureDecrement => 'Hibás súly csökkenése'; + + @override + String get appSettings_routeWeightFailureDecrementSubtitle => + 'A jártatásból eltávolított súly, ami a sikertelen szállítás következménye.'; + + @override + String get appSettings_maxMessageRetries => + 'Maximális üzenetek újraküldési próbálkozások'; + + @override + String get appSettings_maxMessageRetriesSubtitle => + 'A próbálkozások száma, mielőtt egy üzenetet hibásnak jelölünk.'; + + @override + String path_routeWeight(String weight, String max) { + return '$weight/$max'; + } + + @override + String get appSettings_battery => 'Akku'; + + @override + String get appSettings_batteryChemistry => 'Aakkum töltés kémia'; + + @override + String appSettings_batteryChemistryPerDevice(String deviceName) { + return 'Beállítások $deviceName-hez'; + } + + @override + String get appSettings_batteryChemistryConnectFirst => + 'Csatlakozzon egy eszközhez, hogy kiválassza'; + + @override + String get appSettings_batteryNmc => '18650 NMC (3,0-4,2 V)'; + + @override + String get appSettings_batteryLifepo4 => 'LiFePO4 (2,6–3,65 V)'; + + @override + String get appSettings_batteryLipo => 'LiPo (3,0-4,2 V)'; + + @override + String get appSettings_mapDisplay => 'Térkép megjelenítése'; + + @override + String get appSettings_showRepeaters => 'Megismétlés'; + + @override + String get appSettings_showRepeatersSubtitle => + 'A térképen megjelenítsük a repeater-eket.'; + + @override + String get appSettings_showChatNodes => 'Megjeleníts kommunikációs pontokat'; + + @override + String get appSettings_showChatNodesSubtitle => + 'A chat-szobákat megjelenítsük a térképen'; + + @override + String get appSettings_showOtherNodes => 'Mutasson további csomópontokat'; + + @override + String get appSettings_showOtherNodesSubtitle => + 'Mutassa meg a többi hálózati elemet a térképen'; + + @override + String get appSettings_timeFilter => 'Időbeli szűrés'; + + @override + String get appSettings_timeFilterShowAll => + 'Mutassa meg az összes csomópontot'; + + @override + String appSettings_timeFilterShowLast(int hours) { + return 'Mutasson az utolsó $hours órából származó adatokat.'; + } + + @override + String get appSettings_mapTimeFilter => 'Térkép időszűrő'; + + @override + String get appSettings_showNodesDiscoveredWithin => + 'Megjeleníts olyan węzveket, amelyek a következő területen lettek felfedezve:'; + + @override + String get appSettings_allTime => 'Minden időpont'; + + @override + String get appSettings_lastHour => 'Az utolsó óra'; + + @override + String get appSettings_last6Hours => 'Az utóban 6 óra'; + + @override + String get appSettings_last24Hours => 'Az utóbbi 24 óra'; + + @override + String get appSettings_lastWeek => 'A múlt héten'; + + @override + String get appSettings_offlineMapCache => 'Offline térkép tárolás'; + + @override + String get appSettings_unitsTitle => 'Egységek'; + + @override + String get appSettings_unitsMetric => 'Méter (m / kilométer)'; + + @override + String get appSettings_unitsImperial => 'Királyi (láb / mérföld)'; + + @override + String get appSettings_noAreaSelected => 'Nincs kiválasztott terület.'; + + @override + String appSettings_areaSelectedZoom(int minZoom, int maxZoom) { + return 'Kiválasztott terület (zoom: $minZoom-$maxZoom)'; + } + + @override + String get appSettings_debugCard => 'Hibakeresés'; + + @override + String get appSettings_appDebugLogging => + 'App-ban történő hibakereséshez használt naplózás'; + + @override + String get appSettings_appDebugLoggingSubtitle => + 'Log alkalmazás hibaelhárítási üzenetek'; + + @override + String get appSettings_appDebugLoggingEnabled => + 'Az alkalmazás hibaelhárítási naplózás engedélyezve'; + + @override + String get appSettings_appDebugLoggingDisabled => + 'Az alkalmazás hibaelhárítási naplózatának bekapcsolása kiküszöbölve'; + + @override + String get contacts_title => 'Kapcsolatok'; + + @override + String get contacts_noContacts => 'Jelenleg még nincs kapcsolat.'; + + @override + String get contacts_contactsWillAppear => + 'A kapcsolatok megjelennek, amikor a eszközök hirdetnek.'; + + @override + String get contacts_unread => 'Olvasatlan'; + + @override + String get contacts_searchContactsNoNumber => 'Kapcsolatok keresése...'; + + @override + String contacts_searchContacts(int number, String str) { + return 'Keresés $number-ban $str…'; + } + + @override + String contacts_searchFavorites(int number, String str) { + return 'Keresés $number$str... Kedvencek'; + } + + @override + String contacts_searchUsers(int number, String str) { + return 'Search $number$str Users...'; + } + + @override + String contacts_searchRepeaters(int number, String str) { + return 'Keresés $number-on, $str típusú adóállomások között...'; + } + + @override + String contacts_searchRoomServers(int number, String str) { + return 'Keresés $number-ban $str...'; + } + + @override + String get contacts_noUnreadContacts => 'Nincs olvasatlan üzenetek'; + + @override + String get contacts_noContactsFound => + 'Nincs megtalálva semmilyen kapcsolat vagy csoport.'; + + @override + String get contacts_deleteContact => 'Kapcsolattól töröl'; + + @override + String contacts_removeConfirm(String contactName) { + return 'Hogy töröljem a $contactName nevű személyt a kontaktlistából?'; + } + + @override + String get contacts_manageRepeater => 'Ellenőriző eszköz kezelése'; + + @override + String get contacts_manageRoom => 'A szobai szerver kezelése'; + + @override + String get contacts_roomLogin => 'Szoba szerverbe való bejelentkezés'; + + @override + String get contacts_openChat => 'Nyitott beszélgetés'; + + @override + String get contacts_editGroup => 'Edit csoport'; + + @override + String get contacts_deleteGroup => 'Csoport törlése'; + + @override + String contacts_deleteGroupConfirm(String groupName) { + return 'Hogy töröljem a \"$groupName\"-t?'; + } + + @override + String get contacts_newGroup => 'Új csoport'; + + @override + String get contacts_groupName => 'Csoport neve'; + + @override + String get contacts_groupNameRequired => + 'A csoportnak meg kell adni a nevét.'; + + @override + String get contacts_groupNameReserved => 'Ez a csoportnév foglalt'; + + @override + String contacts_groupAlreadyExists(String name) { + return 'A \"$name\" nevű csoport már létezik.'; + } + + @override + String get contacts_filterContacts => 'Szűrj kontaktokat...'; + + @override + String get contacts_noContactsMatchFilter => + 'Nincs találat a megadott szűrés alapján.'; + + @override + String get contacts_noMembers => 'Nincsenek tagok'; + + @override + String get contacts_lastSeenNow => 'utóbbi időben'; + + @override + String contacts_lastSeenMinsAgo(int minutes) { + return '~ $minutes perc'; + } + + @override + String get contacts_lastSeenHourAgo => 'Kb. 1 óra'; + + @override + String contacts_lastSeenHoursAgo(int hours) { + return '~ $hours óra'; + } + + @override + String get contacts_lastSeenDayAgo => 'Kb. 1 nap'; + + @override + String contacts_lastSeenDaysAgo(int days) { + return '~ $days days'; + } + + @override + String get contact_info => 'Kapcsolattartási információk'; + + @override + String get contact_settings => 'Kapcsolat beállítások'; + + @override + String get contact_telemetry => 'Adatvisszaadás'; + + @override + String get contact_lastSeen => 'Utoljára, amikor látták'; + + @override + String get contact_clearChat => 'Tiszta beszélgetés'; + + @override + String get contact_teleBase => 'Adatgyűjtő központ'; + + @override + String get contact_teleBaseSubtitle => + 'Engedje meg a akkumulátor töltöttségi szintjének és alapvető adatoknak megosztását.'; + + @override + String get contact_teleLoc => 'Adatkapcsolati helyszín'; + + @override + String get contact_teleLocSubtitle => 'Engedje meg a helyadatok megosztását'; + + @override + String get contact_teleEnv => 'Adatkapcsolati környezet'; + + @override + String get contact_teleEnvSubtitle => + 'Engedje meg az érzékelő adatok megosztását'; + + @override + String get channels_title => 'Csatornák'; + + @override + String get channels_noChannelsConfigured => 'Nincs konfigurált csatorna.'; + + @override + String get channels_addPublicChannel => 'Hozzon létre nyilvános csatornát'; + + @override + String get channels_searchChannels => 'Keresési opciók...'; + + @override + String get channels_noChannelsFound => 'Nincs megtalálható csatorna'; + + @override + String channels_channelIndex(int index) { + return '$index-os csatorna'; + } + + @override + String get channels_hashtagChannel => 'Hashtag-ok közössége'; + + @override + String get channels_public => 'A nyilvánosság számára'; + + @override + String get channels_private => 'Személyes'; + + @override + String get channels_publicChannel => 'Össztávos csatorna'; + + @override + String get channels_privateChannel => 'Személyes csatorna'; + + @override + String get channels_editChannel => 'Csatorna szerkesztése'; + + @override + String get channels_muteChannel => 'Csendes csatorna'; + + @override + String get channels_unmuteChannel => 'Engedje be a hangot'; + + @override + String get channels_deleteChannel => 'Mozdony törlése'; + + @override + String channels_deleteChannelConfirm(String name) { + return 'Törlés $name? Ez nem visszafordítható.'; + } + + @override + String channels_channelDeleteFailed(String name) { + return 'Nem sikerült törölni a \"$name\" nevű csatornát.'; + } + + @override + String channels_channelDeleted(String name) { + return 'A \"$name\" nevű csatorna törölve'; + } + + @override + String get channels_addChannel => 'Csatorna hozzáadása'; + + @override + String get channels_channelIndexLabel => 'Csatorna index'; + + @override + String get channels_channelName => 'Csatorna neve'; + + @override + String get channels_usePublicChannel => 'Használja a nyilvános csatornát'; + + @override + String get channels_standardPublicPsk => + 'Általános, állami által finanszírozott PSK'; + + @override + String get channels_pskHex => 'PSK (Hexadecimális kód)'; + + @override + String get channels_generateRandomPsk => 'Véletlenszerűen generáljon PSK-t'; + + @override + String get channels_enterChannelName => 'Kérjük, adja meg egy csatorna nevét'; + + @override + String get channels_pskMustBe32Hex => + 'A PSK 32-bázisú hexadecimális karakterből áll.'; + + @override + String channels_channelAdded(String name) { + return 'A \"$name\" csatorna hozzáadva'; + } + + @override + String channels_editChannelTitle(int index) { + return 'Módosítsd a csatornát $index'; + } + + @override + String get channels_smazCompression => 'SMAZ kompresszió'; + + @override + String channels_channelUpdated(String name) { + return 'A $name csatorna frissítve'; + } + + @override + String get channels_publicChannelAdded => 'A nyilvános csatorna hozzáadva'; + + @override + String get channels_sortBy => 'Szűrés'; + + @override + String get channels_sortManual => 'Használati útmutató'; + + @override + String get channels_sortAZ => 'A-Z'; + + @override + String get channels_sortLatestMessages => 'Legfrissebb üzenetek'; + + @override + String get channels_sortUnread => 'Olvasatlan'; + + @override + String get channels_createPrivateChannel => 'Létrehoz egy privát csatornát'; + + @override + String get channels_createPrivateChannelDesc => + 'Titkos kulcs segítségével védelem.'; + + @override + String get channels_joinPrivateChannel => + 'Csatlakozzon egy privát csatornához'; + + @override + String get channels_joinPrivateChannelDesc => + 'Kézzel adja meg a titkos kulcsot.'; + + @override + String get channels_joinPublicChannel => + 'Csatlakozzon a nyilvános csatornához'; + + @override + String get channels_joinPublicChannelDesc => + 'Bárki csatlakozhat ehhez a csatornához.'; + + @override + String get channels_joinHashtagChannel => + 'Csatlakozzon egy hashtage-os csatornához'; + + @override + String get channels_joinHashtagChannelDesc => + 'Bárkinek lehet csatlakoznia a hashtagekhez tartozó csatornához.'; + + @override + String get channels_scanQrCode => 'Scanned egy QR-kódot'; + + @override + String get channels_scanQrCodeComingSoon => 'Hamarosan'; + + @override + String get channels_enterHashtag => 'Írja be a hashtaget'; + + @override + String get channels_hashtagHint => 'pl. #csapat'; + + @override + String get chat_noMessages => 'Még nincs üzenet.'; + + @override + String get chat_sendMessageToStart => 'Küldj egy üzenetet, hogy elindulj!'; + + @override + String get chat_originalMessageNotFound => 'A eredeti üzenet nem található.'; + + @override + String chat_replyingTo(String name) { + return 'Replying to $name'; + } + + @override + String chat_replyTo(String name) { + return 'Reply to $name'; + } + + @override + String get chat_location => 'Helyszín'; + + @override + String chat_sendMessageTo(String contactName) { + return 'Küldj üzenetet $contactName-nek'; + } + + @override + String get chat_typeMessage => 'Írjon üzenetet...'; + + @override + String chat_messageTooLong(int maxBytes) { + return 'A üzenet túl hosszú (a maximális $maxBytes bájt).'; + } + + @override + String get chat_messageCopied => 'Üzenet másolva'; + + @override + String get chat_messageDeleted => 'Üzenet törölve'; + + @override + String get chat_retryingMessage => 'Újrapróbálási üzenet'; + + @override + String chat_retryCount(int current, int max) { + return 'Újrapróbál $current/$max'; + } + + @override + String get chat_sendGif => 'Küldj GIF-ot'; + + @override + String get chat_reply => 'Válasz'; + + @override + String get chat_addReaction => 'Hozzon létre reakciót'; + + @override + String get chat_me => 'Én'; + + @override + String get emojiCategorySmileys => 'Emoji'; + + @override + String get emojiCategoryGestures => 'Testmozgások'; + + @override + String get emojiCategoryHearts => 'Szívak'; + + @override + String get emojiCategoryObjects => 'Tárgyak'; + + @override + String get gifPicker_title => 'Válasszon egy GIF-et'; + + @override + String get gifPicker_searchHint => 'GIF-ek keresése...'; + + @override + String get gifPicker_poweredBy => 'Forrás: GIPHY'; + + @override + String get gifPicker_noGifsFound => 'Nincsenek GIF-ek megtalálva.'; + + @override + String get gifPicker_failedLoad => 'Nem sikerült betölteni a GIF-fájlokat.'; + + @override + String get gifPicker_failedSearch => 'Nem sikerült a GIF-eket megtalálni.'; + + @override + String get gifPicker_noInternet => 'Nincs internetkapcsolat.'; + + @override + String get debugLog_appTitle => 'App-debug log'; + + @override + String get debugLog_bleTitle => 'BLE hibajelentő napló'; + + @override + String get debugLog_copyLog => 'Másolat napló'; + + @override + String get debugLog_clearLog => 'Jelzett napló'; + + @override + String get debugLog_copied => 'Hibajelentő napló másolva'; + + @override + String get debugLog_bleCopied => 'BLE-log másolva'; + + @override + String get debugLog_noEntries => + 'Jelenleg még nem léteznek hibaelhárítási naplókat.'; + + @override + String get debugLog_enableInSettings => + 'Engedje be az alkalmazás hibaelhárítási naplózását a beállítások menüben.'; + + @override + String get debugLog_frames => 'Keretek'; + + @override + String get debugLog_rawLogRx => 'Az eredeti Log-RX'; + + @override + String get debugLog_noBleActivity => + 'Jelenleg nincs BLE-hez kapcsolódó tevékenység.'; + + @override + String debugFrame_length(int count) { + return 'Keret hossza: $count bájt'; + } + + @override + String debugFrame_command(String value) { + return 'Parancs: 0x$value'; + } + + @override + String get debugFrame_textMessageHeader => 'Címzett:'; + + @override + String debugFrame_destinationPubKey(String pubKey) { + return '- Célhely: $pubKey'; + } + + @override + String debugFrame_timestamp(int timestamp) { + return '- Időbélyeg: $timestamp'; + } + + @override + String debugFrame_flags(String value) { + return '- Jelvények: 0x$value'; + } + + @override + String debugFrame_textType(int type, String label) { + return '- Tartalom típusa: $type ($label)'; + } + + @override + String get debugFrame_textTypeCli => 'Parancssori felület (CLI)'; + + @override + String get debugFrame_textTypePlain => 'Egyszerű, alap, hagyományos'; + + @override + String debugFrame_text(String text) { + return '- Tartalom: \"$text\"'; + } + + @override + String get debugFrame_hexDump => 'Hex-dump:'; + + @override + String get chat_pathManagement => 'Útvonal-kezelés'; + + @override + String get chat_ShowAllPaths => 'Mutasson meg minden útvonalat'; + + @override + String get chat_routingMode => 'Útvonal-kezelési mód'; + + @override + String get chat_autoUseSavedPath => + 'Automatikus (az eddigi útvonal használata)'; + + @override + String get chat_forceFloodMode => 'Erőforrás-alapú áramlás mód'; + + @override + String get chat_recentAckPaths => + 'Legutóbbi használt útvonalak (gombra kattintva):'; + + @override + String get chat_pathHistoryFull => + 'Az előző lépések listája teljes. Törölj ki a bejegyzéseket, hogy újokat hozzáadhatsd.'; + + @override + String get chat_hopSingular => 'ugor'; + + @override + String get chat_hopPlural => 'babér'; + + @override + String chat_hopsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ugrások', + one: 'ugrás', + ); + return '$count $_temp0'; + } + + @override + String get chat_successes => 'sikerek'; + + @override + String get chat_removePath => 'Törölje a elérési útvonalat'; + + @override + String get chat_noPathHistoryYet => + 'Még nincs útvonal-történet.\nKüldjön egy üzenetet, hogy megtudja a lehetséges útvonalakat.'; + + @override + String get chat_pathActions => 'Céltúrások:'; + + @override + String get chat_setCustomPath => 'Beállítsd a saját útvonalat'; + + @override + String get chat_setCustomPathSubtitle => 'Kézzel megadott útvonal'; + + @override + String get chat_clearPath => 'Egyértelmű út'; + + @override + String get chat_clearPathSubtitle => + 'A parancs új küldéskor újra kell aktivizálnia.'; + + @override + String get chat_pathCleared => + 'Útvonal cleared. A következő üzenet újból feltérképezheti az útvonalat.'; + + @override + String get chat_floodModeSubtitle => + 'Használja a \"útvonal\" kapcsolót az alkalmazás sávjában.'; + + @override + String get chat_floodModeEnabled => + 'Árvízvédelmi mód bekapcsolva. A visszaállítás a alkalmazásban található útvonal ikon segítségével.'; + + @override + String get chat_fullPath => 'Teljes elérési út'; + + @override + String get chat_pathDetailsNotAvailable => + 'Az útvonal részletei még nem elérhetők. Próbálja meg küldeni egy üzenetet, hogy frissítse az információkat.'; + + @override + String chat_pathSetHops(int hopCount, String status) { + String _temp0 = intl.Intl.pluralLogic( + hopCount, + locale: localeName, + other: 'hops', + one: 'hop', + ); + return 'Path set: $hopCount $_temp0 - $status'; + } + + @override + String get chat_pathSavedLocally => + 'Helyileg mentve. Kapcsolódjon a szinkronizáláshoz.'; + + @override + String get chat_pathDeviceConfirmed => 'A készülék megvan.'; + + @override + String get chat_pathDeviceNotConfirmed => 'A készülék még nem bizonyított.'; + + @override + String get chat_type => 'Típus'; + + @override + String get chat_path => 'Út'; + + @override + String get chat_publicKey => 'Nyelvkönyv'; + + @override + String get chat_compressOutgoingMessages => 'A küldött üzenetek tömörítése'; + + @override + String get chat_floodForced => 'Áradás (kényszerített)'; + + @override + String get chat_directForced => 'Közvetlen (erélyes)'; + + @override + String chat_hopsForced(int count) { + return '$count ánusz (erővel)'; + } + + @override + String get chat_floodAuto => 'Vízosztás (autó)'; + + @override + String get chat_direct => 'Közvetlen'; + + @override + String get chat_poiShared => 'Közös erőforrás'; + + @override + String chat_unread(int count) { + return 'Olvasatlan: $count'; + } + + @override + String get chat_openLink => 'Nyisd meg a linket?'; + + @override + String get chat_openLinkConfirmation => + 'Szeretnéd megnyitni ezt a linket a böngésződben?'; + + @override + String get chat_open => 'Nyitott'; + + @override + String chat_couldNotOpenLink(String url) { + return 'Nem sikerült megnyitni a hivat: $url'; + } + + @override + String get chat_invalidLink => 'Érvénytelen hivatkozás formátum'; + + @override + String get map_title => 'Grafikus ábrázás'; + + @override + String get map_lineOfSight => 'Látási vonal'; + + @override + String get map_losScreenTitle => 'Látási vonal'; + + @override + String get map_noNodesWithLocation => + 'Nincs olyan adatpont, amelyhez helyszín-információk tartoznak.'; + + @override + String get map_nodesNeedGps => + 'A pontoknak meg kell osztaniuk GPS koordinátáikat, hogy megjelenjenek a térképen.'; + + @override + String map_nodesCount(int count) { + return 'Csúcsok: $count'; + } + + @override + String map_pinsCount(int count) { + return 'Csapok: $count'; + } + + @override + String get map_chat => 'Csevegés'; + + @override + String get map_repeater => 'Ismétlő'; + + @override + String get map_room => 'szoba'; + + @override + String get map_sensor => 'Érzékelő'; + + @override + String get map_pinDm => 'Jel (DM)'; + + @override + String get map_pinPrivate => 'Titkos (privát)'; + + @override + String get map_pinPublic => 'Jelmez (nyilvános)'; + + @override + String get map_lastSeen => 'Utoljára látva'; + + @override + String get map_disconnectConfirm => + 'Biztosan szeretné kiírni ezt a készüléket?'; + + @override + String get map_from => 'Attól'; + + @override + String get map_source => 'Forrás'; + + @override + String get map_flags => 'Zászló'; + + @override + String get map_shareMarkerHere => 'Osztja ezt a tartalmat itt'; + + @override + String get map_setAsMyLocation => 'Állítsa be a jelenlegi helyzetemként'; + + @override + String get map_pinLabel => 'Címkét ragasztani'; + + @override + String get map_label => 'Címke'; + + @override + String get map_pointOfInterest => 'Érdekes hely'; + + @override + String get map_sendToContact => 'Kapcsolatfelvételi űrlap'; + + @override + String get map_sendToChannel => 'Küldés a csatornán'; + + @override + String get map_noChannelsAvailable => 'Nincs elérhető csatorna.'; + + @override + String get map_publicLocationShare => 'Térköz, nyilvános hely'; + + @override + String map_publicLocationShareConfirm(String channelLabel) { + return 'Most egy helyszínt megosztasz a $channelLabel csatornán. Ez a csatorna nyilvános, és bárki, aki rendelkezik a PSK-val, megtekintheti.'; + } + + @override + String get map_connectToShareMarkers => + 'Kapcsolódjon egy eszközhöz, hogy megoszthassa a vonalzókat.'; + + @override + String get map_filterNodes => 'Szűrési pontok'; + + @override + String get map_nodeTypes => 'Vonalak típusai'; + + @override + String get map_chatNodes => 'Csevegési pontok'; + + @override + String get map_repeaters => 'Újraküldők'; + + @override + String get map_otherNodes => 'Egyéb csomópontok'; + + @override + String get map_showOverlaps => 'Az ismétlő kulcsok ütköznek'; + + @override + String get map_keyPrefix => 'Kulcsfontosságú előtag'; + + @override + String get map_filterByKeyPrefix => 'Szűrj a kulcsos előtér szerint'; + + @override + String get map_publicKeyPrefix => 'Névfelhasználó kulc-prefix'; + + @override + String get map_markers => 'Jelölők'; + + @override + String get map_showSharedMarkers => 'Mutassa meg a közös jeleket'; + + @override + String get map_showGuessedLocations => + 'Megjelenítsa a megjósolt csomópontok helyét'; + + @override + String get map_showDiscoveryContacts => + 'Megjelenítse a Discovery-nál elérhet kontaktokat'; + + @override + String get map_guessedLocation => 'Tippolt hely'; + + @override + String get map_lastSeenTime => 'Utoljára megjelent idő'; + + @override + String get map_sharedPin => 'Gemeinsames PIN-kód'; + + @override + String get map_joinRoom => 'Csatlakozás a szobához'; + + @override + String get map_manageRepeater => 'Ellenőriző eszköz kezelése'; + + @override + String get map_tapToAdd => + 'Nyomj meg a csomópontokhoz, hogy hozzáadd őket az útvonalhoz.'; + + @override + String get map_runTrace => 'Útvonal követés'; + + @override + String get map_runTraceWithReturnPath => 'Visszaforduljon az eredeti úton.'; + + @override + String get map_removeLast => 'Törölj utolsó'; + + @override + String get map_pathTraceCancelled => 'Az útvonal követés megszakadt.'; + + @override + String get mapCache_title => 'Offline térkép tárolás'; + + @override + String get mapCache_selectAreaFirst => + 'Válasszon egy területet, amelyet először cache-oljon.'; + + @override + String get mapCache_noTilesToDownload => + 'Nincsenek letölthető tile-ok ebben a területben.'; + + @override + String get mapCache_downloadTilesTitle => 'Letöltsd a tile-okat'; + + @override + String mapCache_downloadTilesPrompt(int count) { + return 'Töltse le $count darab tile-t offline használatra?'; + } + + @override + String get mapCache_downloadAction => 'Letöltés'; + + @override + String mapCache_cachedTiles(int count) { + return 'Tárolt $count darab'; + } + + @override + String mapCache_cachedTilesWithFailed(int downloaded, int failed) { + return 'Cached $downloaded tiles ($failed failed)'; + } + + @override + String get mapCache_clearOfflineCacheTitle => 'Tiszta offline tárhely'; + + @override + String get mapCache_clearOfflineCachePrompt => + 'Távolítsa el az összes tárolt térképmegjelenítőt?'; + + @override + String get mapCache_offlineCacheCleared => 'A helyi memóriát töröltük.'; + + @override + String get mapCache_noAreaSelected => 'Nincs kiválasztott terület.'; + + @override + String get mapCache_cacheArea => 'Tároló terület'; + + @override + String get mapCache_useCurrentView => 'Használja a jelenlegi nézetet'; + + @override + String get mapCache_zoomRange => 'Zoom tartomány'; + + @override + String mapCache_estimatedTiles(int count) { + return 'Becsült kerámiák: $count'; + } + + @override + String mapCache_downloadedTiles(int completed, int total) { + return 'Letöltve $completed / $total'; + } + + @override + String get mapCache_downloadTilesButton => 'Letöltsd a tile-okat'; + + @override + String get mapCache_clearCacheButton => 'Ósztótt adatokat'; + + @override + String mapCache_failedDownloads(int count) { + return 'Sikertelen letöltések: $count'; + } + + @override + String mapCache_boundsLabel( + String north, + String south, + String east, + String west, + ) { + return 'N $north, S $south, E $east, W $west'; + } + + @override + String get time_justNow => 'Most'; + + @override + String time_minutesAgo(int minutes) { + return '$minutes perckel ezelőtt'; + } + + @override + String time_hoursAgo(int hours) { + return '$hours óva'; + } + + @override + String time_daysAgo(int days) { + return '${days}d ago'; + } + + @override + String get time_hour => 'óra'; + + @override + String get time_hours => 'órák'; + + @override + String get time_day => 'nap'; + + @override + String get time_days => 'napok'; + + @override + String get time_week => 'het'; + + @override + String get time_weeks => 'het, hetek'; + + @override + String get time_month => 'hónap'; + + @override + String get time_months => 'hónapok'; + + @override + String get time_minutes => 'percek'; + + @override + String get time_allTime => 'Bármely időpont'; + + @override + String get dialog_disconnect => 'Csatlakozást megszakasztani'; + + @override + String get dialog_disconnectConfirm => + 'Biztosan szeretné kiírni ezt a készüléket?'; + + @override + String get login_repeaterLogin => 'Ismételt bejelentkezés'; + + @override + String get login_roomLogin => 'Szoba szerverbe való bejelentkezés'; + + @override + String get login_password => 'Jelszó'; + + @override + String get login_enterPassword => 'Adja meg a jelszót'; + + @override + String get login_savePassword => 'Mentse el a jelszót'; + + @override + String get login_savePasswordSubtitle => + 'A jelszó biztonságosan tárolódik ezen a készüléken.'; + + @override + String get login_repeaterDescription => + 'Adja meg a repeater (ismétítő) jelszót, hogy hozzáférhessen a beállításokhoz és az állapot információkhoz.'; + + @override + String get login_roomDescription => + 'Adja meg a belépési kódot, hogy hozzáférhessen a beállításokhoz és az állapot információkhoz.'; + + @override + String get login_routing => 'Útvonal meghatározás'; + + @override + String get login_routingMode => 'Útvonal-kezelési mód'; + + @override + String get login_autoUseSavedPath => + 'Automatikus (az eddigi útvonal használata)'; + + @override + String get login_forceFloodMode => 'Erőforrás-alapú áramlás mód'; + + @override + String get login_managePaths => 'Útvonalak kezelése'; + + @override + String get login_login => 'Bejelentkezés'; + + @override + String login_attempt(int current, int max) { + return 'Megpróbálás $current/$max-adik'; + } + + @override + String login_failed(String error) { + return 'Belépés sikertelen: $error'; + } + + @override + String get login_failedMessage => + 'Belépés sikertelen. Vagy a jelszó helytelen, vagy a hálózati kapcsolat nem létesül.'; + + @override + String get common_reload => 'Újra töltés'; + + @override + String get common_clear => 'Egyértelmű'; + + @override + String path_currentPath(String path) { + return 'Jelenlegi útvonal: $path'; + } + + @override + String path_usingHopsPath(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ugrások', + one: 'ugrás', + ); + return '$count $_temp0 útvonal használata'; + } + + @override + String get path_enterCustomPath => 'Adja meg a saját elérési útvonalat'; + + @override + String get path_currentPathLabel => 'Jelenlegi útvonal'; + + @override + String get path_hexPrefixInstructions => + 'Adja meg a 2 karakteres hexadecimális előtagokat minden lépéshez, tagolva kommával.'; + + @override + String get path_hexPrefixExample => + 'Példa: A1, F2, 3C (minden csomó az első részét használja a nyilvános kulcsából)'; + + @override + String get path_labelHexPrefixes => 'Út (hex-prefixek)'; + + @override + String get path_helperMaxHops => + 'A maximális hossz 64 karakter. Minden előző rész 2 hatos számjegyből áll (1 bájt).'; + + @override + String get path_selectFromContacts => + 'Válasszon a kontaktlista elembek közül:'; + + @override + String get path_noRepeatersFound => + 'Nincs megtalálva semmilyen ismétlődő vagy helyiség-szolgáltató szervert.'; + + @override + String get path_customPathsRequire => + 'Az egyedi útvonalaknak szükségük van átjáró pontokra, amelyek képesek üzeneteket továbbítani.'; + + @override + String path_invalidHexPrefixes(String prefixes) { + return 'Érvénytelen hexadecimális előtagok: $prefixes'; + } + + @override + String get path_tooLong => + 'Az út túl hosszú. A maximális engedélyezett lépések száma 64.'; + + @override + String get path_setPath => 'Útvonal meghatározása'; + + @override + String get repeater_management => 'Adatkapcsolás kezelése'; + + @override + String get room_management => 'Szoba-szerver kezelés'; + + @override + String get repeater_managementTools => 'Menedzsmentes eszközök'; + + @override + String get repeater_status => 'Állapot'; + + @override + String get repeater_statusSubtitle => + 'Megtekintheted a repeater állapotát, statisztikáit és a környező eszközök adatait.'; + + @override + String get repeater_telemetry => 'Adatvisszaadás'; + + @override + String get repeater_telemetrySubtitle => + 'Tekintsük a szenzorok és a rendszer állapotának adatát'; + + @override + String get repeater_cli => 'Parancssori felület (CLI)'; + + @override + String get repeater_cliSubtitle => 'Küldj parancsokat a repeaternek.'; + + @override + String get repeater_neighbors => 'Szomszédok'; + + @override + String get repeater_neighborsSubtitle => + 'Tekintsük a nullás lépésű szomszédokat.'; + + @override + String get repeater_settings => 'Beállítások'; + + @override + String get repeater_settingsSubtitle => 'Állítsa be a repeater paramétereket'; + + @override + String get repeater_statusTitle => 'Adatkapcsolódás állapot'; + + @override + String get repeater_routingMode => 'Útvonal-kezelési mód'; + + @override + String get repeater_autoUseSavedPath => + 'Automatikus (az eddigi útvonal használata)'; + + @override + String get repeater_forceFloodMode => 'Erőforrás-alapú áramlás mód'; + + @override + String get repeater_pathManagement => 'Útvonal-kezelés'; + + @override + String get repeater_refresh => 'Újrafriszol'; + + @override + String get repeater_statusRequestTimeout => 'Az állapotkérés időtúlt.'; + + @override + String repeater_errorLoadingStatus(String error) { + return 'Hiba a státusz betöltés közben: $error'; + } + + @override + String get repeater_systemInformation => 'Rendszerinformációk'; + + @override + String get repeater_battery => 'Akku'; + + @override + String get repeater_clockAtLogin => 'Óra (bejelentkezéskor)'; + + @override + String get repeater_uptime => 'A rendszer elérhetősége'; + + @override + String get repeater_queueLength => 'Várakozási sor hossza'; + + @override + String get repeater_debugFlags => 'Hibakeresési beállítások'; + + @override + String get repeater_radioStatistics => 'Rádió statisztika'; + + @override + String get repeater_lastRssi => 'Utolsó RSSI érték'; + + @override + String get repeater_lastSnr => 'Utolsó SNR'; + + @override + String get repeater_noiseFloor => 'Háttérzaj szint'; + + @override + String get repeater_txAirtime => 'TX Airtime'; + + @override + String get repeater_rxAirtime => 'RX Airtime'; + + @override + String get repeater_packetStatistics => 'Csomagok statisztikája'; + + @override + String get repeater_sent => 'Elküldve'; + + @override + String get repeater_received => 'Megérkezett'; + + @override + String get repeater_duplicates => 'Duplák'; + + @override + String repeater_daysHoursMinsSecs( + int days, + int hours, + int minutes, + int seconds, + ) { + return '$days days ${hours}h ${minutes}m ${seconds}s'; + } + + @override + String repeater_packetTxTotal(int total, String flood, String direct) { + return 'Összesen: $total, Árvíz: $flood, Közvetlen: $direct'; + } + + @override + String repeater_packetRxTotal(int total, String flood, String direct) { + return 'Összesen: $total, Árvíz: $flood, Közvetlen: $direct'; + } + + @override + String repeater_duplicatesFloodDirect(String flood, String direct) { + return 'Áradás: $flood, Közvetlen: $direct'; + } + + @override + String repeater_duplicatesTotal(int total) { + return 'Összesen: $total'; + } + + @override + String get repeater_settingsTitle => 'Adatátvisszaadási beállítások'; + + @override + String get repeater_basicSettings => 'Alapbeállítások'; + + @override + String get repeater_repeaterName => 'Adóállomás neve'; + + @override + String get repeater_repeaterNameHelper => 'Ez a repeater neve'; + + @override + String get repeater_adminPassword => 'Adminisztrátori jelszó'; + + @override + String get repeater_adminPasswordHelper => 'Teljes jogosultságú jelszó'; + + @override + String get repeater_guestPassword => 'Vendég felhasználói név/jelszó'; + + @override + String get repeater_guestPasswordHelper => + 'Csak olvasási jogosítást biztosító jelszó'; + + @override + String get repeater_radioSettings => 'Rádióbeállítások'; + + @override + String get repeater_frequencyMhz => 'Frekvencia (MHz)'; + + @override + String get repeater_frequencyHelper => '300–2500 MHz'; + + @override + String get repeater_txPower => 'TX Power'; + + @override + String get repeater_txPowerHelper => '1-30 dBm'; + + @override + String get repeater_bandwidth => 'Adatkapacitás'; + + @override + String get repeater_spreadingFactor => 'Terjesztési tényező'; + + @override + String get repeater_codingRate => 'Kódolási sebesség'; + + @override + String get repeater_locationSettings => 'Helyszínbeállítások'; + + @override + String get repeater_latitude => 'Nyugat–keleti szélesség'; + + @override + String get repeater_latitudeHelper => 'Desztes fokok (pl. 37,7749)'; + + @override + String get repeater_longitude => 'hosszúság'; + + @override + String get repeater_longitudeHelper => 'Desztes fokok (pl. -122.4194)'; + + @override + String get repeater_features => 'Jellemzők'; + + @override + String get repeater_packetForwarding => 'Csomagok továbbítás'; + + @override + String get repeater_packetForwardingSubtitle => + 'Engedje, hogy a repeater továbbítsa a csomagokat.'; + + @override + String get repeater_guestAccess => 'Vendégek számára elérhető'; + + @override + String get repeater_guestAccessSubtitle => + 'Engedje meg a vendégek számára, hogy csak olvassák a tartalmat'; + + @override + String get repeater_privacyMode => 'Adatvédelem mód'; + + @override + String get repeater_privacyModeSubtitle => + 'Elrejtse a nevét/a helyszínt az űrlapon'; + + @override + String get repeater_advertisementSettings => 'Reklámbeállítások'; + + @override + String get repeater_localAdvertInterval => 'Helyi hirdetés időtartama'; + + @override + String repeater_localAdvertIntervalMinutes(int minutes) { + return '$minutes perc'; + } + + @override + String get repeater_floodAdvertInterval => 'Vízosztály-hirdetés időtartama'; + + @override + String repeater_floodAdvertIntervalHours(int hours) { + return '$hours óra'; + } + + @override + String get repeater_encryptedAdvertInterval => 'Kódolt hirdetés-szünet'; + + @override + String get repeater_dangerZone => 'Veszélyzóna'; + + @override + String get repeater_rebootRepeater => 'Újraindítás'; + + @override + String get repeater_rebootRepeaterSubtitle => 'Indítsa újra a repeater-t.'; + + @override + String get repeater_rebootRepeaterConfirm => + 'Biztosan szeretné újraindítani ezt a repeatert?'; + + @override + String get repeater_regenerateIdentityKey => + 'Újra generálja az azonosító kulcsot'; + + @override + String get repeater_regenerateIdentityKeySubtitle => + 'Új nyilvános/személyes kulcs-párt generáljon'; + + @override + String get repeater_regenerateIdentityKeyConfirm => + 'Ez új azonosítást fog létrehozni a repeater számára. Folytatni?'; + + @override + String get repeater_eraseFileSystem => 'Törölje a fájlrendszert'; + + @override + String get repeater_eraseFileSystemSubtitle => + 'Formázza a duplázó fájlrendszert.'; + + @override + String get repeater_eraseFileSystemConfirm => + 'FIGYELEM: Ez törli az összes adatot a repeater-en. Ez nem visszafordítható!'; + + @override + String get repeater_eraseSerialOnly => + 'Az Erase funkció csak a soros konzolon érhető el.'; + + @override + String repeater_commandSent(String command) { + return 'Parancs elküldve: $command'; + } + + @override + String repeater_errorSendingCommand(String error) { + return 'Hibás parancs küldés: $error'; + } + + @override + String get repeater_confirm => 'Beküldve'; + + @override + String get repeater_settingsSaved => 'Beállítások sikeresen mentve'; + + @override + String repeater_errorSavingSettings(String error) { + return 'Hibás beállítások mentése: $error'; + } + + @override + String get repeater_refreshBasicSettings => 'Visszaállítás az alapértékekre'; + + @override + String get repeater_refreshRadioSettings => 'Frissítse a rádió beállításait'; + + @override + String get repeater_refreshTxPower => 'Újraindítás TX-támogatással'; + + @override + String get repeater_refreshLocationSettings => + 'Újraindítás helyszín beállításokkal'; + + @override + String get repeater_refreshPacketForwarding => + 'Csomagok továbbításának frissítése'; + + @override + String get repeater_refreshGuestAccess => 'Újraindítás vendégHozzáférés'; + + @override + String get repeater_refreshPrivacyMode => + 'Visszaállítás a magánéletvédő módra'; + + @override + String get repeater_refreshAdvertisementSettings => + 'Újraindítás hirdetés beállítások'; + + @override + String repeater_refreshed(String label) { + return '$label frissítve'; + } + + @override + String repeater_errorRefreshing(String label) { + return 'Hiba a $label frissítés közben'; + } + + @override + String get repeater_cliTitle => 'CLI (parancssori felület)'; + + @override + String get repeater_debugNextCommand => 'Hibakeresés, következő parancs'; + + @override + String get repeater_commandHelp => 'Segítség'; + + @override + String get repeater_clearHistory => 'Egyértelmű történet'; + + @override + String get repeater_noCommandsSent => 'Még egyik parancsot sem küldtünk.'; + + @override + String get repeater_typeCommandOrUseQuick => + 'Írja be a parancsot alább, vagy használja a gyors parancsokat.'; + + @override + String get repeater_enterCommandHint => 'Írja be a parancsot...'; + + @override + String get repeater_previousCommand => 'Előző parancs'; + + @override + String get repeater_nextCommand => 'Következő parancs'; + + @override + String get repeater_enterCommandFirst => 'Add meg először egy parancsot'; + + @override + String get repeater_cliCommandFrameTitle => 'CLI parancssor felépítése'; + + @override + String repeater_cliCommandError(String error) { + return 'Hiba: $error'; + } + + @override + String get repeater_cliQuickGetName => 'Kapcsold össze a nevet'; + + @override + String get repeater_cliQuickGetRadio => 'Szerezd a rádiót'; + + @override + String get repeater_cliQuickGetTx => 'Szerezd a TX-t'; + + @override + String get repeater_cliQuickNeighbors => 'Szomszédok'; + + @override + String get repeater_cliQuickVersion => 'Verzió'; + + @override + String get repeater_cliQuickAdvertise => 'Hirdetés'; + + @override + String get repeater_cliQuickClock => 'óra'; + + @override + String get repeater_cliHelpAdvert => 'Elküldi egy hirdetési csomagot'; + + @override + String get repeater_cliHelpReboot => + 'Újraindítja a készüléket. (Kérjük, vegye figyelembe, hogy valószínűleg \"Időhiba\" üzenetet fog kapni, ami normális)'; + + @override + String get repeater_cliHelpClock => + 'A jelenlegi időt mutatja az egyes eszközök karórája alapján.'; + + @override + String get repeater_cliHelpPassword => + 'Új adminisztrációs jelszót állít be a eszköz számára.'; + + @override + String get repeater_cliHelpVersion => + 'Megjeleníti a készülék verzióját és a szoftver verziószámát.'; + + @override + String get repeater_cliHelpClearStats => + 'Visszaállítja a különböző statisztikai mérőszámokat a nullára.'; + + @override + String get repeater_cliHelpSetAf => 'Beállítja az idő-szabályozási tényezőt.'; + + @override + String get repeater_cliHelpSetTx => + 'Beállítja a LoRa átviteli teljesítményt dBm-ben (a rendszer újraindításával alkalmazható).'; + + @override + String get repeater_cliHelpSetRepeat => + 'Engedélyezi vagy tiltja meg a repeater szerepet ezen a csomón.'; + + @override + String get repeater_cliHelpSetAllowReadOnly => + '(Szoba szerver) Ha \"igen\", akkor üres jelszóval történő bejelentkezés engedélyezett lesz, de nem lehet üzeneteket küldeni a szobában. (Csak olvasási funkció)'; + + @override + String get repeater_cliHelpSetFloodMax => + 'Beállítja a bejövő adatcsomagok maximális számát (ha ez a érték nagyobb vagy egyenlő a maximális értékkel, a csomag nem továbbítódik).'; + + @override + String get repeater_cliHelpSetIntThresh => + 'Beállítja az interferencia határértéket (dB-ben). Az alapérték 14. Ha 0-ra állítja, kiküntheti a csatornák közötti interferencia detektálást.'; + + @override + String get repeater_cliHelpSetAgcResetInterval => + 'Beállítja az intervallumot, amely a \"Automatikus gain\" szabályozó újraindításához szükséges. Beállítás értéke 0, ha a funkciót le kell tiltani.'; + + @override + String get repeater_cliHelpSetMultiAcks => + 'Engedélyezi vagy kikapcsolja a „dupla visszaigazolás” funkciót.'; + + @override + String get repeater_cliHelpSetAdvertInterval => + 'Beállítja az időzítő intervallumot percenként, hogy egy helyi (nincs átjáró) hirdetési csomagot küldjen. Beállítás értéke 0, ha a funkciót le szeretné tiltani.'; + + @override + String get repeater_cliHelpSetFloodAdvertInterval => + 'Beállítja az időzítő intervallumot órában, hogy egy \"áramló\" hirdetési üzenetet küldjön. Beállítás értéke 0, ha a funkciót kikapcsolni kell.'; + + @override + String get repeater_cliHelpSetGuestPassword => + 'Beállítja/frissíti a vendég felhasználói fiókot. (Ez lehetővé teszi a visszatérő felhasználók számára, hogy a \"Statistika lekérdezése\" kérést elküldjék)'; + + @override + String get repeater_cliHelpSetName => 'Megadja az űrlap neve.'; + + @override + String get repeater_cliHelpSetLat => + 'Beállítja az hirdetés térképen megjelenő pont koordinátájának (tizedes fokokban) a latitude-ját.'; + + @override + String get repeater_cliHelpSetLon => + 'Beállítja az hirdetés térképen megjelenő hosszúság koordinátát (tizedes fokokban).'; + + @override + String get repeater_cliHelpSetRadio => + 'Teljesen új rádióparamétereket állít be, és azokat a beállításokba menti. Az alkalmazásához \"újraindítás\" parancs szükséges.'; + + @override + String get repeater_cliHelpSetRxDelay => + 'Beállítások (kísérleti): Alapérték (legalább 1 értékre kell állítani, hogy hatás legyen), amely alapján a fogadott csomagokhoz enyhe késést alkalmazunk, a jelet ereje/pontszám alapján. 0-ra állítva a funkciót lekapcsoljuk.'; + + @override + String get repeater_cliHelpSetTxDelay => + 'Beállítja egy tényezőt, amely a légköri idővel szorozva, egy áramlás-üzem módú csomaghoz, valamint egy véletlenszerű slot-rendszerhez, hogy késleltesse a továbbítását. (az ütközések valószínűségének csökkentése érdekében)'; + + @override + String get repeater_cliHelpSetDirectTxDelay => + 'Hasonló a txdelay-hez, de ebben az esetben egy véletlenszerű késést alkalmazunk a közvetlen módú csomagok továbbításakor.'; + + @override + String get repeater_cliHelpSetBridgeEnabled => + 'Engedélyez/Tiltás a híd funkciójának.'; + + @override + String get repeater_cliHelpSetBridgeDelay => + 'Állíts be egy késleztatást a csomagok újbóli továbbításakor.'; + + @override + String get repeater_cliHelpSetBridgeSource => + 'Döntse el, hogy a híd fogadott vagy elküldött csomagokat fogja-e továbbítani.'; + + @override + String get repeater_cliHelpSetBridgeBaud => + 'Állítsa be a soros kommunikáció sebességét az RS232 hídok számára.'; + + @override + String get repeater_cliHelpSetBridgeSecret => + 'Állítsa be a titkos kapcsolatot az ESPNOW hídokhoz.'; + + @override + String get repeater_cliHelpSetAdcMultiplier => + 'Lehetővé teszi a felhasználónak, hogy egyedi tényezőt állíts be a riportolt akkumulátor feszültségének módosításához (ez csak bizonyos alkatrészeken támogatott).'; + + @override + String get repeater_cliHelpTempRadio => + 'Időjárás szerinti rádióparamétereket állít be a megadott időtartamra, majd visszaállítja az eredeti beállításokat. (Nem menti a beállításokat a beállítások részben).'; + + @override + String get repeater_cliHelpSetPerm => + 'A ACL-t módosítja. Ha a \"permissions\" érték 0, akkor eltávolítja a megfelelő bejegyzést (a pubkey előtag alapján). Új bejegyzést hoz létre, ha a pubkey-hex teljes hossza, és jelenleg nem szerepel az ACL-ben. A bejegyzést frissíti a megfelelő pubkey előtag alapján. A engedélyek különbözőek a különböző firmware szerepek között, de az alsó 2 bit a következő értékeket képviseli: 0 (Vendég), 1 (Csak olvasás), 2 (Olvasás és írás), 3 (Adminisztrátor)'; + + @override + String get repeater_cliHelpGetBridgeType => + 'Kapcsolatok: hid típusú, RS232, ESPNOW'; + + @override + String get repeater_cliHelpLogStart => + 'Elindítja a csomagok naplózását a fájlrendszerbe.'; + + @override + String get repeater_cliHelpLogStop => + 'Megállítja a csomagok naplózását a fájlrendszerbe.'; + + @override + String get repeater_cliHelpLogErase => + 'Törli a fájlrendszerből a csomagok log-fájljait.'; + + @override + String get repeater_cliHelpNeighbors => + 'Mutat egy listát, amely tartalmazza a más repeater-ek által hallott adatok listáját, amelyek 0-hop hirdetések révén érhetők el. Minden sor az alábbi formát követi: id-prefix-hex:timestamp:snr-times-4'; + + @override + String get repeater_cliHelpNeighborRemove => + 'Törli az első, a megadott kulcs-prefix (hexadecimális formában) alapján megegyező bejegyzést a szomszédok listájából.'; + + @override + String get repeater_cliHelpRegion => + '(sorozat) Lista az összes meghatározott területet és a jelenlegi árvízvédelmi engedélyeket.'; + + @override + String get repeater_cliHelpRegionLoad => + 'FIGYELEM: ez egy speciális, több parancsot tartalmazó futtatás. Minden következő parancs egy területtel kapcsolatos, amely egyenletes szóközökkel (a szülő-gyermek kapcsolatot jelző) megkülönböztethető. A parancs végrehajtása egy üres sor/parancs küldésével történik.'; + + @override + String get repeater_cliHelpRegionGet => + 'Keresések egy adott név előtérrel (vagy \"*\" globális hatókörre). Válasz: \"-> region-név (szülő-név) \'F\'\"'; + + @override + String get repeater_cliHelpRegionPut => + 'Hozzáad vagy frissíti egy régió definíciót megadott néven.'; + + @override + String get repeater_cliHelpRegionRemove => + 'Eltávolítja a megadott nevet használó régió-definíciót. (pontosan meg kell egyeznie, és nem lehet gyermekrégiója)'; + + @override + String get repeater_cliHelpRegionAllowf => + 'Beállítja a megadott területre vonatkozó \"víz\" jogosultságot. (A globális/régi beállítások esetén a \"*\" jelölő)'; + + @override + String get repeater_cliHelpRegionDenyf => + 'Eltávolítja a megadott területre vonatkozó \"F\"lood (víz) engedélyt. (FIGYELEM: jelenleg nem javasolt ezt a globális/régi verzióban használni!!)'; + + @override + String get repeater_cliHelpRegionHome => + 'Visszaállítja a jelenlegi „otthoni” régiót. (Ez a beállítás még nem került alkalmazásra, csak jövőbeli használatra fenyelve)'; + + @override + String get repeater_cliHelpRegionHomeSet => 'Beállítja a \"házi\" régiót.'; + + @override + String get repeater_cliHelpRegionSave => + 'Megőrzi a régió listát/térképet a tárolóban.'; + + @override + String get repeater_cliHelpGps => + 'Megadja a GPS állapotát. Ha a GPS kikapcsolva van, akkor csak \"ki\" választot ad, ha be van, akkor \"be\", \"állapot\", \"pozíció\", \"satellitok száma\" értékeket ad.'; + + @override + String get repeater_cliHelpGpsOnOff => 'Engedi a GPS működés állapotát.'; + + @override + String get repeater_cliHelpGpsSync => + 'A hálózati időt az GPS óra időjével szinkronizálja.'; + + @override + String get repeater_cliHelpGpsSetLoc => + 'Beállítja a węsz pozícióját GPS koordináták alapján, és menti a beállításokat.'; + + @override + String get repeater_cliHelpGpsAdvert => + 'Adja meg a hirdetés konfigurációjának helyszín-információját:\n- none: ne tartalmazza a helyszínt a hirdetésekben\n- share: megosztja a GPS-helyszínt (SensorManager-ből)\n- prefs: hirdeti a beállításokban tárolt helyszínt'; + + @override + String get repeater_cliHelpGpsAdvertSet => + 'Beállítja a hirdetés helyszín-specifikus beállításait.'; + + @override + String get repeater_commandsListTitle => 'Parancsok listája'; + + @override + String get repeater_commandsListNote => + 'FIGYELEM: a különböző \"set ...\" parancsok mellett létezik egy \"get ...\" parancs is.'; + + @override + String get repeater_general => 'Általános'; + + @override + String get repeater_settingsCategory => 'Beállítások'; + + @override + String get repeater_bridge => 'Híd'; + + @override + String get repeater_logging => 'Naplózás'; + + @override + String get repeater_neighborsRepeaterOnly => + 'Szomszédok (Csak ismétlő funkció)'; + + @override + String get repeater_regionManagementRepeaterOnly => + 'Regionális menedzsment (Csak egyirányú kommunikáció)'; + + @override + String get repeater_regionNote => + 'Region-specifikus parancsokat vezettek be a régiók definiálására és a hozzájuk tartozó engedélyek kezelésére.'; + + @override + String get repeater_gpsManagement => 'GPS-vezérlés'; + + @override + String get repeater_gpsNote => + 'Az GPS-al kapcsolatos funkciók lehetővé teszik a helyszín-személyesítéssel kapcsolatos feladatok kezelését.'; + + @override + String get telemetry_receivedData => 'Kapott adatokat a szenzorokról'; + + @override + String get telemetry_requestTimeout => 'Az adatkapcsolati kérés sikertelen.'; + + @override + String telemetry_errorLoading(String error) { + return 'Hiba az adatok begyűjtésében: $error'; + } + + @override + String get telemetry_noData => 'Nincsenek elérhető telemetriadatok.'; + + @override + String telemetry_channelTitle(int channel) { + return '$channel csatorna'; + } + + @override + String get telemetry_batteryLabel => 'Akku'; + + @override + String get telemetry_voltageLabel => 'Feszültség'; + + @override + String get telemetry_mcuTemperatureLabel => 'MCU hőmérséklet'; + + @override + String get telemetry_temperatureLabel => 'Hőmérséklet'; + + @override + String get telemetry_currentLabel => 'Jelenlegi'; + + @override + String telemetry_batteryValue(int percent, String volts) { + return '$percent% / ${volts}V'; + } + + @override + String telemetry_voltageValue(String volts) { + return '${volts}V'; + } + + @override + String telemetry_currentValue(String amps) { + return '${amps}A'; + } + + @override + String telemetry_temperatureValue(String celsius, String fahrenheit) { + return '$celsius °C / $fahrenheit °F'; + } + + @override + String get neighbors_receivedData => 'Kapott szomszédok adatait'; + + @override + String get neighbors_requestTimedOut => + 'A szomszédok kérik, hogy tiltsák le a kamerát.'; + + @override + String neighbors_errorLoading(String error) { + return 'Hiba a szomszédok betöltésében: $error'; + } + + @override + String get neighbors_repeatersNeighbors => 'Ismétlő eszközök, szomszédok'; + + @override + String get neighbors_noData => 'Nincsenek elérhető szomszédokról adatok.'; + + @override + String neighbors_unknownContact(String pubkey) { + return 'Tudatlan $pubkey'; + } + + @override + String neighbors_heardAgo(String time) { + return 'Értsd: $time sitten'; + } + + @override + String get channelPath_title => 'Csomagok útvonala'; + + @override + String get channelPath_viewMap => 'Megtekinthető térkép'; + + @override + String get channelPath_otherObservedPaths => 'Egyéb megfigyelt utak'; + + @override + String get channelPath_repeaterHops => 'Adat továbbító lépések'; + + @override + String get channelPath_noHopDetails => + 'Ez a csomag nem tartalmaz részletes információkat a \"hop\" (vagy más hasonló) szót használó kifejezésekről.'; + + @override + String get channelPath_messageDetails => 'Üzenet részletei'; + + @override + String get channelPath_senderLabel => 'Megküldő'; + + @override + String get channelPath_timeLabel => 'Idő'; + + @override + String get channelPath_repeatsLabel => 'Ismétli'; + + @override + String channelPath_pathLabel(int index) { + return 'Útvonal $index'; + } + + @override + String get channelPath_observedLabel => 'Megfigyelt'; + + @override + String channelPath_observedPathTitle(int index, String hops) { + return 'Megfigyelt útvonal: $index • $hops'; + } + + @override + String get channelPath_noLocationData => 'Nincs helyszínadat.'; + + @override + String channelPath_timeWithDate(int day, int month, String time) { + return '$day/$month $time'; + } + + @override + String channelPath_timeOnly(String time) { + return '$time'; + } + + @override + String get channelPath_unknownPath => 'Megfejt'; + + @override + String get channelPath_floodPath => 'Árvíz'; + + @override + String get channelPath_directPath => 'Közvetlen'; + + @override + String channelPath_observedZeroOf(int total) { + return '0-ból $total'; + } + + @override + String channelPath_observedSomeOf(int observed, int total) { + return '$observed of $total hops'; + } + + @override + String get channelPath_mapTitle => 'Útvonal térkép'; + + @override + String get channelPath_noRepeaterLocations => + 'Ez a útvonal nem támogat repeater-t.'; + + @override + String channelPath_primaryPath(int index) { + return 'Útvonal $index (Elsődleges)'; + } + + @override + String get channelPath_pathLabelTitle => 'Út'; + + @override + String get channelPath_observedPathHeader => 'Megfigyelt útvonal'; + + @override + String channelPath_selectedPathLabel(String label, String prefixes) { + return '$label • $prefixes'; + } + + @override + String get channelPath_noHopDetailsAvailable => + 'Ez a csomag nem tartalmaz részletes információkat a szállításhoz.'; + + @override + String get channelPath_unknownRepeater => 'Tudatlan erősítő'; + + @override + String get community_title => 'Helyi közösség'; + + @override + String get community_create => 'Teremtsd meg a közösséget'; + + @override + String get community_createDesc => + 'Légyon létre egy új közösséget, és osszák meg QR-kód segítségével.'; + + @override + String get community_join => 'Csatlakozjon'; + + @override + String get community_joinTitle => 'Csatlakozzon a közösséghez'; + + @override + String community_joinConfirmation(String name) { + return 'Szeretne csatlakozni a közösséghez, $name?'; + } + + @override + String get community_scanQr => 'QR-kód olvasó a közösség számára'; + + @override + String get community_scanInstructions => + 'Fordítsa a kamerát egy közösségi QR-kód irányába.'; + + @override + String get community_showQr => 'Megjelenítse a QR-kódot'; + + @override + String get community_publicChannel => 'Összetartó, közösségi'; + + @override + String get community_hashtagChannel => 'Helyi hashtaget'; + + @override + String get community_name => 'Helyi közösség neve'; + + @override + String get community_enterName => 'Kérjük, a közösség nevét írja be.'; + + @override + String community_created(String name) { + return 'A \"$name\" nevű közösség létrehozva'; + } + + @override + String community_joined(String name) { + return 'Csatlakozott a $name közösséghez'; + } + + @override + String get community_qrTitle => 'Osszpontosítás a közösségben'; + + @override + String community_qrInstructions(String name) { + return 'Scanned this QR-kódot, hogy csatlakozhat a $name csoporthoz.'; + } + + @override + String get community_hashtagPrivacyHint => + 'A közösségi hashtagekhez tartozó csatornák csak a közösség tagjai számára érhetők el.'; + + @override + String get community_invalidQrCode => 'Érvénytelen közösségi QR-kód'; + + @override + String get community_alreadyMember => 'Már tag vagy'; + + @override + String community_alreadyMemberMessage(String name) { + return 'Már tagja $name-nek.'; + } + + @override + String get community_addPublicChannel => + 'Hozzon létre egy közösségi nyilvános csatornát'; + + @override + String get community_addPublicChannelHint => + 'Automatikusan hozzon létre ezt a csatornát a közösség számára.'; + + @override + String get community_noCommunities => 'Még egyik közösség sem csatlakozott.'; + + @override + String get community_scanOrCreate => + 'Scelle egy QR-kódot, vagy hozzon létre egy közösséget, hogy elinduljon.'; + + @override + String get community_manageCommunities => 'Közösségek kezelése'; + + @override + String get community_delete => 'Hagyományos közösségi élet'; + + @override + String community_deleteConfirm(String name) { + return 'Hagyom $name-et?'; + } + + @override + String community_deleteChannelsWarning(int count) { + return 'Ezem törli is $count csatornát és a hozzá tartozó üzeneteket.'; + } + + @override + String community_deleted(String name) { + return 'A közösség, amely $name'; + } + + @override + String get community_regenerateSecret => 'Titkos visszaállítás'; + + @override + String community_regenerateSecretConfirm(String name) { + return 'Újra kell generálni a titkos kulcsot $name számára? Minden tagnak be kell szkennelnie az új QR-kódot, hogy továbbra is kommunikálhasson.'; + } + + @override + String get community_regenerate => 'Újraalakítás'; + + @override + String community_secretRegenerated(String name) { + return 'Titkos kulcs megújult $name számára.'; + } + + @override + String get community_updateSecret => 'Frissítési titok'; + + @override + String community_secretUpdated(String name) { + return 'Titkos információ frissítve $name számára'; + } + + @override + String community_scanToUpdateSecret(String name) { + return 'Scanned a új QR-kódot, hogy frissítsük a $name számára megőrzött titkos információt.'; + } + + @override + String get community_addHashtagChannel => 'Adjon egy közösségi hashtaget'; + + @override + String get community_addHashtagChannelDesc => + 'Hozz létre egy hashtage-os csatornát ennek a közösségnek'; + + @override + String get community_selectCommunity => 'Válasszon közösséget'; + + @override + String get community_regularHashtag => 'Rendszeres hashtag'; + + @override + String get community_regularHashtagDesc => + 'Önmagas szintű hashtaget (bárki csatlakozhat)'; + + @override + String get community_communityHashtag => 'Helyi hashtaget'; + + @override + String get community_communityHashtagDesc => 'Csak a közösség tagjai számára'; + + @override + String community_forCommunity(String name) { + return '$name számára'; + } + + @override + String get listFilter_tooltip => 'Szűrés és rendezés'; + + @override + String get listFilter_sortBy => 'Szűrés'; + + @override + String get listFilter_latestMessages => 'Legfrissebb üzenetek'; + + @override + String get listFilter_heardRecently => 'Úgy hallottam, hogy...'; + + @override + String get listFilter_az => 'A-Z'; + + @override + String get listFilter_filters => 'Szűrők'; + + @override + String get listFilter_all => 'Mind'; + + @override + String get listFilter_favorites => 'Kedvencek'; + + @override + String get listFilter_addToFavorites => 'Megerősítés kívánságlistára'; + + @override + String get listFilter_removeFromFavorites => 'Törölj a kedvencekből'; + + @override + String get listFilter_users => 'Felhasználók'; + + @override + String get listFilter_repeaters => 'Újraküldők'; + + @override + String get listFilter_roomServers => 'Szoba-szolgálatok'; + + @override + String get listFilter_unreadOnly => 'Csak olvasatlan'; + + @override + String get listFilter_newGroup => 'Új csoport'; + + @override + String get pathTrace_you => 'Te'; + + @override + String get pathTrace_failed => 'A útvonal követése sikertelen.'; + + @override + String get pathTrace_notAvailable => + 'Az útvonal követési funkció nem elérhető.'; + + @override + String get pathTrace_refreshTooltip => 'Út mentesség frissítése.'; + + @override + String get pathTrace_someHopsNoLocation => + 'Egy vagy több búzavirág hiányozik a helyszínéről!'; + + @override + String get pathTrace_clearTooltip => 'Egyértelmű út.'; + + @override + String get losSelectStartEnd => + 'Válassza ki a kezdő és a végpontokat a LOS-hoz.'; + + @override + String losRunFailed(String error) { + return 'A látószög ellenőrzése sikertelen: $error'; + } + + @override + String get losClearAllPoints => 'Teljesen tisztázzuk az összes pontot'; + + @override + String get losRunToViewElevationProfile => + 'Használja a LOS-t, hogy megtekinthesse a magasságkülönbségek diagramját.'; + + @override + String get losMenuTitle => 'LOS menü'; + + @override + String get losMenuSubtitle => + 'A térképen található pontok kiválasztására vagy a térképen hosszúra nyomva, hogy egyedi pontokat definiálhassunk.'; + + @override + String get losShowDisplayNodes => 'Megjelenítsen a megjelenítési egységeket'; + + @override + String get losCustomPoints => 'Egyedi pontok'; + + @override + String losCustomPointLabel(int index) { + return 'Egyedi $index'; + } + + @override + String get losPointA => 'A pont A'; + + @override + String get losPointB => 'Pont B'; + + @override + String losAntennaA(String value, String unit) { + return 'Antenna A: $value $unit'; + } + + @override + String losAntennaB(String value, String unit) { + return 'Antenna B: $value $unit'; + } + + @override + String get losRun => 'Futtass a LOS-on'; + + @override + String get losNoElevationData => 'Nincsenek emelkedési adatok.'; + + @override + String losProfileClear( + String distance, + String distanceUnit, + String clearance, + String heightUnit, + ) { + return '$distance $distanceUnit, clear LOS, min clearance $clearance $heightUnit'; + } + + @override + String losProfileBlocked( + String distance, + String distanceUnit, + String obstruction, + String heightUnit, + ) { + return '$distance $distanceUnit, amelyet $obstruction akadályoz meg $heightUnit-ban'; + } + + @override + String get losStatusChecking => 'LOS: ellenőrzés...'; + + @override + String get losStatusNoData => 'LOS: nincs adat'; + + @override + String losStatusSummary(int clear, int total, int blocked, int unknown) { + return 'LOS: $clear/$total tisztított, $blocked blokkolt, $unknown ismeretlen'; + } + + @override + String get losErrorElevationUnavailable => + 'Az alábbi minták esetében nem áll rendelkezésre magasságadat.'; + + @override + String get losErrorInvalidInput => + 'Hibás vagy hiányos táblázatok a LOS (Loss of Signal) számításához.'; + + @override + String get losRenameCustomPoint => 'Állítsa meg a saját pont nevét'; + + @override + String get losPointName => 'Pont neve'; + + @override + String get losShowPanelTooltip => 'Megjelenítse a LOS paneelt'; + + @override + String get losHidePanelTooltip => 'Rejtse el a LOS paneelt'; + + @override + String get losElevationAttribution => + 'Magasságadatok: Open-Meteo (CC BY 4.0)'; + + @override + String get losLegendRadioHorizon => 'Radio Horizont'; + + @override + String get losLegendLosBeam => 'LOS jelzés'; + + @override + String get losLegendTerrain => 'Terület'; + + @override + String get losFrequencyLabel => 'Hatósság'; + + @override + String get losFrequencyInfoTooltip => 'Lásd a számítás részleteit'; + + @override + String get losFrequencyDialogTitle => + 'A rádióhullámok hatótávolságának kiszámítása'; + + @override + String losFrequencyDialogDescription( + double baselineK, + double baselineFreq, + double frequencyMHz, + double kFactor, + ) { + return 'A $baselineK értékből kezdve, $baselineFreq MHz-os frekvencián, a számítás az aktuális $frequencyMHz MHz-os sávhoz igazítja a k-tényezőt, amely meghatározza a görbös rádióhatótávolság határát.'; + } + + @override + String get contacts_pathTrace => 'Útvonal követése'; + + @override + String get contacts_ping => 'Ping'; + + @override + String get contacts_repeaterPathTrace => 'Az útvonal követése a repeaterig'; + + @override + String get contacts_repeaterPing => 'Ping-szinkronizáló'; + + @override + String get contacts_roomPathTrace => 'Kapcsolat a szobai szerverrel'; + + @override + String get contacts_roomPing => 'Ping-szolgáló szerver'; + + @override + String get contacts_chatTraceRoute => 'Útvonal meghatározása'; + + @override + String contacts_pathTraceTo(String name) { + return 'Keresse meg a $name címét.'; + } + + @override + String get contacts_clipboardEmpty => 'A kiválasztott szöveg üres.'; + + @override + String get contacts_invalidAdvertFormat => 'Érvénytelen kontaktinformáció'; + + @override + String get contacts_contactImported => 'Kapcsolat létrejött.'; + + @override + String get contacts_contactImportFailed => + 'Nem sikerült a kapcsolatot importálni.'; + + @override + String get contacts_zeroHopAdvert => 'Zero Hop reklám'; + + @override + String get contacts_floodAdvert => 'Árvízre vonatkozó hirdetés'; + + @override + String get contacts_copyAdvertToClipboard => + 'Másolja a hirdetést a kiválasztási ablakba'; + + @override + String get contacts_addContactFromClipboard => + 'Adjon hozzá egy kapcsolatot a kiválasztott listából'; + + @override + String get contacts_ShareContact => 'Másolja a kapcsolatot a kiválasztóba'; + + @override + String get contacts_ShareContactZeroHop => + 'Ossza meg a kapcsolatot hirdetés segítségével'; + + @override + String get contacts_zeroHopContactAdvertSent => + 'Kapcsolatot a hirdetésen keresztül.'; + + @override + String get contacts_zeroHopContactAdvertFailed => + 'Nem sikerült a kapcsolatot elküldeni.'; + + @override + String get contacts_contactAdvertCopied => 'A hirdetés másolva a vágólapra.'; + + @override + String get contacts_contactAdvertCopyFailed => + 'Az hirdetés másolása a vágólapra sikertelen.'; + + @override + String get notification_activityTitle => 'MeshCore tevékenységek'; + + @override + String notification_messagesCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'üzenetek', + one: 'üzenet', + ); + return '$count $_temp0'; + } + + @override + String notification_channelMessagesCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'csatornaüzenetek', + one: 'csatornaüzenet', + ); + return '$count $_temp0'; + } + + @override + String notification_newNodesCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'új csomópontok', + one: 'új csomópont', + ); + return '$count $_temp0'; + } + + @override + String notification_newTypeDiscovered(String contactType) { + return 'Új $contactType megtalálva'; + } + + @override + String get notification_receivedNewMessage => 'Új üzenetet kaptam'; + + @override + String get settings_gpxExportRepeaters => + 'Külső eszközök / helyi szerver a GPX formátumba'; + + @override + String get settings_gpxExportRepeatersSubtitle => + 'Exportálható repeater/szobaterm-szerver, amely egy GPX fájlban tárolja a helyzetet.'; + + @override + String get settings_gpxExportContacts => 'GPX export funkciók'; + + @override + String get settings_gpxExportContactsSubtitle => + 'Az export funkció lehetővé teszi, hogy a GPS fájlban megadott helyszínen is megőrizzük az útvonalat.'; + + @override + String get settings_gpxExportAll => + 'Exportálja az összes kapcsolatot GPX formátumban.'; + + @override + String get settings_gpxExportAllSubtitle => + 'Az összes elérhetőséget, amelyekhez egy helyszín tartozik, egy GPX fájlba exportálja.'; + + @override + String get settings_gpxExportSuccess => + 'A GPX fájl sikeresen exportálva lett.'; + + @override + String get settings_gpxExportNoContacts => 'Nincs exportálható kapcsolatok.'; + + @override + String get settings_gpxExportNotAvailable => + 'Nem támogatott a jelenlegi eszközön/rendszeren.'; + + @override + String get settings_gpxExportError => 'Hiba történt az export során.'; + + @override + String get settings_gpxExportRepeatersRoom => + 'Adatátvisszaadó eszközök és helyiségi szerverek helyei'; + + @override + String get settings_gpxExportChat => 'Kapcsolódó helyszínek'; + + @override + String get settings_gpxExportAllContacts => 'Az összes kapcsolat helyszíne'; + + @override + String get settings_gpxExportShareText => + 'A meshcore-open-ból exportált térkéadatumok'; + + @override + String get settings_gpxExportShareSubject => + 'meshcore-open GPX formátumú térképi adatok export'; + + @override + String get snrIndicator_nearByRepeaters => 'Helyszíni erősítők'; + + @override + String get snrIndicator_lastSeen => 'Utoljára, amikor látták'; + + @override + String get contactsSettings_title => 'Kapcsolatok beállításai'; + + @override + String get contactsSettings_autoAddTitle => 'Automatikus felfedezés'; + + @override + String get contactsSettings_otherTitle => + 'Egyéb kapcsolattal kapcsolatos beállítások'; + + @override + String get contactsSettings_autoAddUsersTitle => + 'Automatikus felhasználói hozzáadás'; + + @override + String get contactsSettings_autoAddUsersSubtitle => + 'Engedje, hogy a segítő automatikusan hozzáadja az új felhasználókat.'; + + @override + String get contactsSettings_autoAddRepeatersTitle => + 'Automatikus visszatöltés'; + + @override + String get contactsSettings_autoAddRepeatersSubtitle => + 'Engedje, hogy a segítő eszköz automatikusan hozzáadja az új, megtalált jelzőállomásokat.'; + + @override + String get contactsSettings_autoAddRoomServersTitle => + 'Automatikus szobák szerverek hozzáadása'; + + @override + String get contactsSettings_autoAddRoomServersSubtitle => + 'Engedje, hogy a segítő automatikusan hozzáadja az új, megtalált hálózati szervereket.'; + + @override + String get contactsSettings_autoAddSensorsTitle => + 'Automatikus érzékelők hozzáadása'; + + @override + String get contactsSettings_autoAddSensorsSubtitle => + 'Engedje, hogy a kísérő automatikusan hozzáadja az új, megtalált szenzorokat.'; + + @override + String get contactsSettings_overwriteOldestTitle => 'Felülírja a legrégebbet'; + + @override + String get contactsSettings_overwriteOldestSubtitle => + 'Amikor a névsor telítődik, a legidősebb, de még nem kedvencként jelölt személyt helyettesíti egy újabb.'; + + @override + String get discoveredContacts_Title => 'Megtalált kapcsolatok'; + + @override + String get discoveredContacts_noMatching => 'Nincs megegyező kapcsolat.'; + + @override + String get discoveredContacts_searchHint => 'Keress új kapcsolatokat'; + + @override + String get discoveredContacts_contactAdded => 'Kapcsolat hozzáadva'; + + @override + String get discoveredContacts_addContact => 'Adjon személyhez'; + + @override + String get discoveredContacts_copyContact => + 'Másolja a kapcsolatot a vágólapra'; + + @override + String get discoveredContacts_deleteContact => + 'Törölj a feltalált kapcsolatot'; + + @override + String get discoveredContacts_deleteContactAll => + 'Törölj minden megtalált kapcsolatot'; + + @override + String get discoveredContacts_deleteContactAllContent => + 'Biztos, hogy szeretné törölni az összes eddig megtalált kapcsolatot?'; + + @override + String get chat_sendCooldown => + 'Kérjük, várjon egy pillanatot, mielőtt újra elküldené.'; + + @override + String get appSettings_jumpToOldestUnread => + 'Jelentkezzen az legörebb, olvasatlan üzenetre'; + + @override + String get appSettings_jumpToOldestUnreadSubtitle => + 'Amikor egy új csevet indítunk, amelyben vannak olvashatatlan üzenetek, görgessük a listát, hogy a legelső, olvashatatlan üzenet megjelenjen, nem pedig az utolsó.'; + + @override + String get appSettings_languageHu => 'Magyar'; + + @override + String get appSettings_languageJa => 'Japán'; + + @override + String get appSettings_languageKo => 'Koreai'; + + @override + String get radioStats_tooltip => 'Rádió és hálózati statisztikák'; + + @override + String get radioStats_screenTitle => 'Rádió statisztikák'; + + @override + String get radioStats_notConnected => + 'Csatlakozzon egy eszközhöz, hogy megtekinthesse a rádió adatok statisztikáit.'; + + @override + String get radioStats_firmwareTooOld => + 'A rádió statisztikákhoz v8 vagy újabb verziójú szoftver szükséges.'; + + @override + String get radioStats_waiting => 'Adatokra vár…'; + + @override + String radioStats_noiseFloor(int noiseDbm) { + return 'Háttérzaj szint: $noiseDbm dBm'; + } + + @override + String radioStats_lastRssi(int rssiDbm) { + return 'Utolsó RSSI érték: $rssiDbm dBm'; + } + + @override + String radioStats_lastSnr(String snr) { + return 'Utolsó SNR: $snr dB'; + } + + @override + String radioStats_txAir(int seconds) { + return 'TX-es idő (összesen): $seconds másodperc'; + } + + @override + String radioStats_rxAir(int seconds) { + return 'RX használat időtartama (összesen): $seconds s'; + } + + @override + String get radioStats_chartCaption => + 'Háttérzaj szint (dBm) a legutóbbi minták alapján.'; + + @override + String radioStats_stripNoise(int noiseDbm) { + return 'Háttérzaj szint: $noiseDbm dBm'; + } + + @override + String get radioStats_stripWaiting => 'Rádió adatok begyűjtése…'; + + @override + String get radioStats_settingsTile => 'Rádió statisztikák'; + + @override + String get radioStats_settingsSubtitle => + 'Háttérzaj, RSSI, zaj-sűrűség, és a használat időtartama'; +} diff --git a/lib/l10n/app_localizations_ja.dart b/lib/l10n/app_localizations_ja.dart new file mode 100644 index 0000000..12f7bb7 --- /dev/null +++ b/lib/l10n/app_localizations_ja.dart @@ -0,0 +1,3404 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Japanese (`ja`). +class AppLocalizationsJa extends AppLocalizations { + AppLocalizationsJa([String locale = 'ja']) : super(locale); + + @override + String get appTitle => 'MeshCore Open'; + + @override + String get nav_contacts => '連絡先'; + + @override + String get nav_channels => 'チャンネル'; + + @override + String get nav_map => '地図'; + + @override + String get common_cancel => 'キャンセル'; + + @override + String get common_ok => '了解'; + + @override + String get common_connect => '接続する'; + + @override + String get common_unknownDevice => '不明なデバイス'; + + @override + String get common_save => '保存'; + + @override + String get common_delete => '削除'; + + @override + String get common_deleteAll => 'すべて削除'; + + @override + String get common_close => '閉じる'; + + @override + String get common_edit => '編集'; + + @override + String get common_add => '追加'; + + @override + String get common_settings => '設定'; + + @override + String get common_disconnect => '切断する'; + + @override + String get common_connected => '接続されている'; + + @override + String get common_disconnected => '切断'; + + @override + String get common_create => '作成する'; + + @override + String get common_continue => '続き'; + + @override + String get common_share => '共有する'; + + @override + String get common_copy => 'コピー'; + + @override + String get common_retry => '再試'; + + @override + String get common_hide => '隠す'; + + @override + String get common_remove => '削除'; + + @override + String get common_enable => '有効化する'; + + @override + String get common_disable => '無効化する'; + + @override + String get common_reboot => '再起動'; + + @override + String get common_loading => '読み込み中...'; + + @override + String get common_notAvailable => '—'; + + @override + String common_voltageValue(String volts) { + return '$volts V'; + } + + @override + String common_percentValue(int percent) { + return '$percent%'; + } + + @override + String get scanner_title => 'MeshCore オープン'; + + @override + String get connectionChoiceUsbLabel => 'USB'; + + @override + String get connectionChoiceBluetoothLabel => 'ブルートゥース'; + + @override + String get connectionChoiceTcpLabel => 'TCP'; + + @override + String get tcpScreenTitle => 'TCP を使用して接続'; + + @override + String get tcpHostLabel => 'IPアドレス'; + + @override + String get tcpHostHint => '192.168.40.10'; + + @override + String get tcpPortLabel => '港'; + + @override + String get tcpPortHint => '5000'; + + @override + String get tcpStatus_notConnected => 'エンドポイントを入力し、接続する'; + + @override + String tcpStatus_connectingTo(String endpoint) { + return '$endpoint への接続中...'; + } + + @override + String get tcpErrorHostRequired => 'IPアドレスが必要です。'; + + @override + String get tcpErrorPortInvalid => 'ポート番号は1から65535の範囲で指定してください。'; + + @override + String get tcpErrorUnsupported => 'このプラットフォームでは、TCP 転送はサポートされていません。'; + + @override + String get tcpErrorTimedOut => 'TCP 接続がタイムアウトしました。'; + + @override + String tcpConnectionFailed(String error) { + return 'TCP接続に失敗しました:$error'; + } + + @override + String get usbScreenTitle => 'USB経由で接続'; + + @override + String get usbScreenSubtitle => '検出されたシリアルデバイスを選択し、MeshCoreノードに直接接続してください。'; + + @override + String get usbScreenStatus => 'USBデバイスを選択する'; + + @override + String get usbScreenNote => + 'USBシリアルポートは、サポートされているAndroidデバイスおよびデスクトッププラットフォームで利用可能です。'; + + @override + String get usbScreenEmptyState => + 'USBデバイスが見つかりませんでした。「別のUSBデバイスを接続して、再度確認してください。」'; + + @override + String get usbErrorPermissionDenied => 'USBへのアクセス許可が拒否されました。'; + + @override + String get usbErrorDeviceMissing => '選択されたUSBデバイスは、もう利用できません。'; + + @override + String get usbErrorInvalidPort => '有効なUSBデバイスを選択してください。'; + + @override + String get usbErrorBusy => '別のUSB接続の要求がすでに処理中です。'; + + @override + String get usbErrorNotConnected => 'USBデバイスは接続されていません。'; + + @override + String get usbErrorOpenFailed => '選択したUSBデバイスを開くことができません。'; + + @override + String get usbErrorConnectFailed => '選択したUSBデバイスへの接続に失敗しました。'; + + @override + String get usbErrorUnsupported => 'このプラットフォームでは、USBシリアル通信はサポートされていません。'; + + @override + String get usbErrorAlreadyActive => 'USB接続はすでに確立されています。'; + + @override + String get usbErrorNoDeviceSelected => 'USBデバイスは選択されていません。'; + + @override + String get usbErrorPortClosed => 'USB接続は確立されていません。'; + + @override + String get usbErrorConnectTimedOut => + '接続がタイムアウトしました。デバイスにUSBコンパニオンファームウェアがインストールされていることを確認してください。'; + + @override + String get usbFallbackDeviceName => 'ウェブシリアルデバイス'; + + @override + String get usbStatus_notConnected => 'USBデバイスを選択する'; + + @override + String get usbStatus_connecting => 'USBデバイスへの接続中...'; + + @override + String get usbStatus_searching => 'USBデバイスを検索中...'; + + @override + String usbConnectionFailed(String error) { + return 'USB接続に失敗しました:$error'; + } + + @override + String get scanner_scanning => 'デバイスをスキャン中...'; + + @override + String get scanner_connecting => '接続中...'; + + @override + String get scanner_disconnecting => '切断...'; + + @override + String get scanner_notConnected => '接続されていない'; + + @override + String scanner_connectedTo(String deviceName) { + return '$deviceName に接続'; + } + + @override + String get scanner_searchingDevices => 'MeshCoreデバイスの検索'; + + @override + String get scanner_tapToScan => 'MeshCore デバイスを検索するには、「スキャン」ボタンをタップしてください。'; + + @override + String scanner_connectionFailed(String error) { + return '接続に失敗しました:$error'; + } + + @override + String get scanner_stop => '停止'; + + @override + String get scanner_scan => 'スキャン'; + + @override + String get scanner_bluetoothOff => 'Bluetooth はオフになっています'; + + @override + String get scanner_bluetoothOffMessage => 'Bluetoothを有効にして、デバイスを検索してください。'; + + @override + String get scanner_chromeRequired => 'Chrome ブラウザが必須です'; + + @override + String get scanner_chromeRequiredMessage => + 'このWebアプリケーションは、Bluetooth機能を利用するために、Google ChromeまたはChromiumベースのブラウザが必要です。'; + + @override + String get scanner_enableBluetooth => 'Bluetoothを有効にする'; + + @override + String get device_quickSwitch => '素早い切り替え'; + + @override + String get device_meshcore => 'メッシュコア'; + + @override + String get settings_title => '設定'; + + @override + String get settings_deviceInfo => 'デバイス情報'; + + @override + String get settings_appSettings => 'アプリ設定'; + + @override + String get settings_appSettingsSubtitle => '通知、メッセージング、および地図の表示設定'; + + @override + String get settings_nodeSettings => 'ノード設定'; + + @override + String get settings_nodeName => 'ノード名'; + + @override + String get settings_nodeNameNotSet => '設定されていない'; + + @override + String get settings_nodeNameHint => 'ノード名を入力してください'; + + @override + String get settings_nodeNameUpdated => '氏名変更'; + + @override + String get settings_radioSettings => 'ラジオ設定'; + + @override + String get settings_radioSettingsSubtitle => '周波数、電力、スプレッドファクター'; + + @override + String get settings_radioSettingsUpdated => 'ラジオの設定が更新されました'; + + @override + String get settings_location => '場所'; + + @override + String get settings_locationSubtitle => 'GPS 座標'; + + @override + String get settings_locationUpdated => '場所とGPS設定が更新されました'; + + @override + String get settings_locationBothRequired => '緯度と経度をそれぞれ入力してください。'; + + @override + String get settings_locationInvalid => '無効な緯度または経度。'; + + @override + String get settings_locationGPSEnable => 'GPS機能有効'; + + @override + String get settings_locationGPSEnableSubtitle => 'GPSが自動的に位置情報を更新できるようにする。'; + + @override + String get settings_locationIntervalSec => 'GPS データの取得間隔(秒)'; + + @override + String get settings_locationIntervalInvalid => + '間隔は少なくとも60秒で、86400秒未満でなければなりません。'; + + @override + String get settings_latitude => '緯度'; + + @override + String get settings_longitude => '経度'; + + @override + String get settings_contactSettings => '連絡設定'; + + @override + String get settings_contactSettingsSubtitle => '連絡先を追加する設定'; + + @override + String get settings_privacyMode => 'プライバシーモード'; + + @override + String get settings_privacyModeSubtitle => '広告に名前/場所を記載しない'; + + @override + String get settings_privacyModeToggle => + 'プライバシーモードをオンにして、広告に表示される名前や場所を非表示にします。'; + + @override + String get settings_privacyModeEnabled => 'プライバシーモードが有効になっています'; + + @override + String get settings_privacyModeDisabled => 'プライバシーモードは無効化されています'; + + @override + String get settings_privacy => 'プライバシー設定'; + + @override + String get settings_privacySubtitle => '共有する情報の内容を管理する。'; + + @override + String get settings_privacySettingsDescription => + '自分のデバイスが他の人に共有する情報を選択してください。'; + + @override + String get settings_denyAll => 'すべてを否定'; + + @override + String get settings_allowByContact => '連絡先を明示するオプション'; + + @override + String get settings_allowAll => 'すべて許可'; + + @override + String get settings_telemetryBaseMode => 'テレメトリ基本モード'; + + @override + String get settings_telemetryLocationMode => 'テレメトリ位置特定モード'; + + @override + String get settings_telemetryEnvironmentMode => 'テレメトリ環境モード'; + + @override + String get settings_advertLocation => '広告掲載場所'; + + @override + String get settings_advertLocationSubtitle => '広告に場所を記載してください。'; + + @override + String settings_multiAck(String value) { + return '複数のACK:$value'; + } + + @override + String get settings_telemetryModeUpdated => 'テレメトリモードが更新されました'; + + @override + String get settings_actions => '行動'; + + @override + String get settings_sendAdvertisement => '広告を送信する'; + + @override + String get settings_sendAdvertisementSubtitle => '現在、放送での活動'; + + @override + String get settings_advertisementSent => '広告が送信されました'; + + @override + String get settings_syncTime => '同期時間'; + + @override + String get settings_syncTimeSubtitle => 'デバイスの時刻を、携帯電話の時刻に合わせる'; + + @override + String get settings_timeSynchronized => '時間同期'; + + @override + String get settings_refreshContacts => '連絡先を更新する'; + + @override + String get settings_refreshContactsSubtitle => 'デバイスから連絡先リストを再読み込みする'; + + @override + String get settings_rebootDevice => 'デバイスを再起動する'; + + @override + String get settings_rebootDeviceSubtitle => 'MeshCore デバイスを再起動する'; + + @override + String get settings_rebootDeviceConfirm => + '本当にデバイスを再起動したいですか? その場合、接続が切断されます。'; + + @override + String get settings_debug => 'デバッグ'; + + @override + String get settings_bleDebugLog => 'BLE デバッグログ'; + + @override + String get settings_bleDebugLogSubtitle => 'BLEコマンド、応答、および生のデータ'; + + @override + String get settings_appDebugLog => 'アプリケーションのデバッグログ'; + + @override + String get settings_appDebugLogSubtitle => 'アプリケーションのデバッグメッセージ'; + + @override + String get settings_about => '概要'; + + @override + String settings_aboutVersion(String version) { + return 'MeshCore Open $version版'; + } + + @override + String get settings_aboutLegalese => '2026年のMeshCoreオープンソースプロジェクト'; + + @override + String get settings_aboutDescription => + 'MeshCore LoRaメッシュネットワークデバイス用の、オープンソースのFlutterクライアント。'; + + @override + String get settings_aboutOpenMeteoAttribution => + 'LOS 標高データ:Open-Meteo (CC BY 4.0)'; + + @override + String get settings_infoName => '名前'; + + @override + String get settings_infoId => 'ID'; + + @override + String get settings_infoStatus => 'ステータス'; + + @override + String get settings_infoBattery => 'バッテリー'; + + @override + String get settings_infoPublicKey => '公開鍵'; + + @override + String get settings_infoContactsCount => '連絡先数'; + + @override + String get settings_infoChannelCount => 'チャンネル数'; + + @override + String get settings_presets => 'プリセット'; + + @override + String get settings_frequency => '周波数 (MHz)'; + + @override + String get settings_frequencyHelper => '300.0 - 2500.0'; + + @override + String get settings_frequencyInvalid => '無効な周波数 (300-2500 MHz)'; + + @override + String get settings_bandwidth => '帯域幅'; + + @override + String get settings_spreadingFactor => '伝播係数'; + + @override + String get settings_codingRate => 'コーディング速度'; + + @override + String get settings_txPower => 'TX 信号電力 (dBm)'; + + @override + String get settings_txPowerHelper => '0 - 22'; + + @override + String get settings_txPowerInvalid => '無効な送信電力 (0-22 dBm)'; + + @override + String get settings_clientRepeat => 'オフグリッド(電力網から孤立した状態)の繰り返し'; + + @override + String get settings_clientRepeatSubtitle => + 'このデバイスが、他のデバイスに対してメッシュパケットを繰り返し送信できるようにする。'; + + @override + String get settings_clientRepeatFreqWarning => + 'オフグリッドでの再送には、433MHz、869MHz、または918MHzの周波数が必要です。'; + + @override + String settings_error(String message) { + return 'エラー:$message'; + } + + @override + String get appSettings_title => 'アプリ設定'; + + @override + String get appSettings_appearance => '外観'; + + @override + String get appSettings_theme => 'テーマ'; + + @override + String get appSettings_themeSystem => 'システムデフォルト'; + + @override + String get appSettings_themeLight => '光'; + + @override + String get appSettings_themeDark => '暗い'; + + @override + String get appSettings_language => '言語'; + + @override + String get appSettings_languageSystem => 'システムデフォルト'; + + @override + String get appSettings_languageEn => '英語'; + + @override + String get appSettings_languageFr => 'フランス語'; + + @override + String get appSettings_languageEs => 'スペイン語'; + + @override + String get appSettings_languageDe => 'ドイツ語'; + + @override + String get appSettings_languagePl => 'ポーランド語'; + + @override + String get appSettings_languageSl => 'スロベニア語'; + + @override + String get appSettings_languagePt => 'ポルトガル語'; + + @override + String get appSettings_languageIt => 'イタリア語'; + + @override + String get appSettings_languageZh => '中国語'; + + @override + String get appSettings_languageSv => 'スウェーデン語'; + + @override + String get appSettings_languageNl => 'オランダ語'; + + @override + String get appSettings_languageSk => 'スロベニア語'; + + @override + String get appSettings_languageBg => 'ブルガリア語'; + + @override + String get appSettings_languageRu => 'ロシア語'; + + @override + String get appSettings_languageUk => 'ウクライナ語'; + + @override + String get appSettings_enableMessageTracing => 'メッセージ追跡機能を有効にする'; + + @override + String get appSettings_enableMessageTracingSubtitle => + 'メッセージに関する詳細な経路およびタイミングに関するメタデータを表示する'; + + @override + String get appSettings_notifications => '通知'; + + @override + String get appSettings_enableNotifications => '通知を有効にする'; + + @override + String get appSettings_enableNotificationsSubtitle => 'メッセージや広告に関する通知を受け取る'; + + @override + String get appSettings_notificationPermissionDenied => '通知の許可が拒否されました'; + + @override + String get appSettings_notificationsEnabled => '通知機能が有効になっています'; + + @override + String get appSettings_notificationsDisabled => '通知が無効化されています'; + + @override + String get appSettings_messageNotifications => 'メッセージ通知'; + + @override + String get appSettings_messageNotificationsSubtitle => + '新しいメッセージを受信した際に、通知を表示する'; + + @override + String get appSettings_channelMessageNotifications => 'チャネルメッセージの通知'; + + @override + String get appSettings_channelMessageNotificationsSubtitle => + 'チャンネルからのメッセージを受信した際に、通知を表示する'; + + @override + String get appSettings_advertisementNotifications => '広告通知'; + + @override + String get appSettings_advertisementNotificationsSubtitle => + '新しいノードが発見された場合に通知を表示する'; + + @override + String get appSettings_messaging => 'メッセージング'; + + @override + String get appSettings_clearPathOnMaxRetry => 'マックスリトライでの明確な手順'; + + @override + String get appSettings_clearPathOnMaxRetrySubtitle => + '5回送信に失敗した場合、連絡経路をリセットする'; + + @override + String get appSettings_pathsWillBeCleared => '5回失敗した後、経路が再開されます。'; + + @override + String get appSettings_pathsWillNotBeCleared => 'パスは自動で削除されません。'; + + @override + String get appSettings_autoRouteRotation => '自動ルートの切り替え'; + + @override + String get appSettings_autoRouteRotationSubtitle => '最適なルートと、洪水モードを切り替える'; + + @override + String get appSettings_autoRouteRotationEnabled => '自動ルートの切り替え機能が有効になっています'; + + @override + String get appSettings_autoRouteRotationDisabled => '自動ルートの変更機能が無効になっています。'; + + @override + String get appSettings_maxRouteWeight => '最大ルート重量'; + + @override + String get appSettings_maxRouteWeightSubtitle => + 'ある経路が、成功裏に配送された場合に、積み上げられる最大重量'; + + @override + String get appSettings_initialRouteWeight => '初期ルートの重み'; + + @override + String get appSettings_initialRouteWeightSubtitle => '新たに発見された経路の初期重量'; + + @override + String get appSettings_routeWeightSuccessIncrement => '成功時の重み増加'; + + @override + String get appSettings_routeWeightSuccessIncrementSubtitle => + '配送が成功した場合に、経路に追加される重量'; + + @override + String get appSettings_routeWeightFailureDecrement => '失敗時の重み減少'; + + @override + String get appSettings_routeWeightFailureDecrementSubtitle => + '配送に失敗した際に、経路から取り除かれた重量'; + + @override + String get appSettings_maxMessageRetries => '最大メッセージ再試行回数'; + + @override + String get appSettings_maxMessageRetriesSubtitle => + 'メッセージを「失敗」とマークするまでの、再試行回数'; + + @override + String path_routeWeight(String weight, String max) { + return '$weight/$max'; + } + + @override + String get appSettings_battery => 'バッテリー'; + + @override + String get appSettings_batteryChemistry => '電池の化学'; + + @override + String appSettings_batteryChemistryPerDevice(String deviceName) { + return '$deviceName 単位'; + } + + @override + String get appSettings_batteryChemistryConnectFirst => 'デバイスを選択するために接続する'; + + @override + String get appSettings_batteryNmc => '18650型 NMC (3.0-4.2V)'; + + @override + String get appSettings_batteryLifepo4 => 'LiFePO4 (2.6-3.65V)'; + + @override + String get appSettings_batteryLipo => 'LiPo (3.0-4.2V)'; + + @override + String get appSettings_mapDisplay => '地図の表示'; + + @override + String get appSettings_showRepeaters => '繰り返し再生機能'; + + @override + String get appSettings_showRepeatersSubtitle => '地図上にリピーターノードを表示する'; + + @override + String get appSettings_showChatNodes => 'チャットノードの表示'; + + @override + String get appSettings_showChatNodesSubtitle => '地図上にチャットノードを表示する'; + + @override + String get appSettings_showOtherNodes => '他のノードを表示する'; + + @override + String get appSettings_showOtherNodesSubtitle => '地図上に、他のノードの種類を表示する'; + + @override + String get appSettings_timeFilter => '時間フィルター'; + + @override + String get appSettings_timeFilterShowAll => 'すべてのノードを表示する'; + + @override + String appSettings_timeFilterShowLast(int hours) { + return '過去 $hours 時間のノードを表示する'; + } + + @override + String get appSettings_mapTimeFilter => '地図の表示期間を絞り込む'; + + @override + String get appSettings_showNodesDiscoveredWithin => '以下の範囲内で発見されたノードを表示する:'; + + @override + String get appSettings_allTime => 'すべての期間'; + + @override + String get appSettings_lastHour => '直前の'; + + @override + String get appSettings_last6Hours => '過去6時間'; + + @override + String get appSettings_last24Hours => '過去24時間'; + + @override + String get appSettings_lastWeek => '先週'; + + @override + String get appSettings_offlineMapCache => 'オフライン用地図キャッシュ'; + + @override + String get appSettings_unitsTitle => '単位'; + + @override + String get appSettings_unitsMetric => 'メートル (m) / キロメートル (km)'; + + @override + String get appSettings_unitsImperial => '帝国 (フィート / マイル)'; + + @override + String get appSettings_noAreaSelected => '選択されたエリアはありません'; + + @override + String appSettings_areaSelectedZoom(int minZoom, int maxZoom) { + return '選択された範囲(ズームレベル:$minZoom~$maxZoom)'; + } + + @override + String get appSettings_debugCard => 'デバッグ'; + + @override + String get appSettings_appDebugLogging => 'アプリケーションのデバッグ用ログ'; + + @override + String get appSettings_appDebugLoggingSubtitle => + 'ログアプリのデバッグメッセージ(トラブルシューティング用)'; + + @override + String get appSettings_appDebugLoggingEnabled => + 'アプリケーションのデバッグ用ログ機能が有効になっています。'; + + @override + String get appSettings_appDebugLoggingDisabled => + 'アプリケーションのデバッグログが無効化されています。'; + + @override + String get contacts_title => '連絡先'; + + @override + String get contacts_noContacts => '現時点では、連絡先はまだありません。'; + + @override + String get contacts_contactsWillAppear => 'デバイスが広告を行う際に、連絡先が表示されます。'; + + @override + String get contacts_unread => '未読'; + + @override + String get contacts_searchContactsNoNumber => '連絡先を検索...'; + + @override + String contacts_searchContacts(int number, String str) { + return '$number件の$strに関する連絡先を検索...'; + } + + @override + String contacts_searchFavorites(int number, String str) { + return '$number件の$strを検索...'; + } + + @override + String contacts_searchUsers(int number, String str) { + return '$number件の$strに関するユーザーを検索する...'; + } + + @override + String contacts_searchRepeaters(int number, String str) { + return '$number $str までの検索...'; + } + + @override + String contacts_searchRoomServers(int number, String str) { + return '$number $str 部屋のサーバーを検索する...'; + } + + @override + String get contacts_noUnreadContacts => '未読の連絡先はありません'; + + @override + String get contacts_noContactsFound => '連絡先またはグループは見つかりませんでした。'; + + @override + String get contacts_deleteContact => '連絡先を削除'; + + @override + String contacts_removeConfirm(String contactName) { + return '$contactName を連絡先から削除しますか?'; + } + + @override + String get contacts_manageRepeater => 'リピーターの管理'; + + @override + String get contacts_manageRoom => 'ルームサーバーの管理'; + + @override + String get contacts_roomLogin => 'ルームサーバーへのログイン'; + + @override + String get contacts_openChat => '自由な会話'; + + @override + String get contacts_editGroup => '編集グループ'; + + @override + String get contacts_deleteGroup => 'グループを削除'; + + @override + String contacts_deleteGroupConfirm(String groupName) { + return '$groupName を削除しますか?'; + } + + @override + String get contacts_newGroup => '新しいグループ'; + + @override + String get contacts_groupName => 'グループ名'; + + @override + String get contacts_groupNameRequired => 'グループ名が必須です'; + + @override + String get contacts_groupNameReserved => 'このグループ名はすでに使用されています。'; + + @override + String contacts_groupAlreadyExists(String name) { + return 'グループ「$name」はすでに存在しています'; + } + + @override + String get contacts_filterContacts => '連絡先をフィルタリングする…'; + + @override + String get contacts_noContactsMatchFilter => '指定された条件に合致する連絡先は見つかりませんでした。'; + + @override + String get contacts_noMembers => 'メンバーはいない'; + + @override + String get contacts_lastSeenNow => '最近'; + + @override + String contacts_lastSeenMinsAgo(int minutes) { + return '~$minutes 分'; + } + + @override + String get contacts_lastSeenHourAgo => '約1時間'; + + @override + String contacts_lastSeenHoursAgo(int hours) { + return '~ $hours 時間'; + } + + @override + String get contacts_lastSeenDayAgo => '~1日'; + + @override + String contacts_lastSeenDaysAgo(int days) { + return '~$days日間'; + } + + @override + String get contact_info => '連絡先'; + + @override + String get contact_settings => '連絡設定'; + + @override + String get contact_telemetry => 'テレメトリー'; + + @override + String get contact_lastSeen => '最後に確認された場所'; + + @override + String get contact_clearChat => 'チャットのクリア'; + + @override + String get contact_teleBase => 'テレメトリ基地'; + + @override + String get contact_teleBaseSubtitle => 'バッテリー残量と基本的なテレメトリーの共有を許可する'; + + @override + String get contact_teleLoc => 'テレメトリの場所'; + + @override + String get contact_teleLocSubtitle => '位置情報共有を許可する'; + + @override + String get contact_teleEnv => 'テレメトリ環境'; + + @override + String get contact_teleEnvSubtitle => '環境センサーのデータを共有することを許可する'; + + @override + String get channels_title => 'チャンネル'; + + @override + String get channels_noChannelsConfigured => '設定されたチャンネルがありません'; + + @override + String get channels_addPublicChannel => 'パブリックチャンネルを追加する'; + + @override + String get channels_searchChannels => '検索オプション...'; + + @override + String get channels_noChannelsFound => 'チャンネルが見つかりませんでした'; + + @override + String channels_channelIndex(int index) { + return 'チャンネル $index'; + } + + @override + String get channels_hashtagChannel => 'ハッシュタグチャンネル'; + + @override + String get channels_public => '一般の人々'; + + @override + String get channels_private => '個人の'; + + @override + String get channels_publicChannel => '一般チャンネル'; + + @override + String get channels_privateChannel => 'プライベートチャンネル'; + + @override + String get channels_editChannel => 'チャンネルを編集する'; + + @override + String get channels_muteChannel => 'ミュート機能'; + + @override + String get channels_unmuteChannel => 'ミュートを解除する'; + + @override + String get channels_deleteChannel => 'チャンネルを削除する'; + + @override + String channels_deleteChannelConfirm(String name) { + return '$name を削除しますか? これは取り消すことができません。'; + } + + @override + String channels_channelDeleteFailed(String name) { + return 'チャンネル「$name」の削除に失敗しました。'; + } + + @override + String channels_channelDeleted(String name) { + return 'チャンネル「$name」が削除されました'; + } + + @override + String get channels_addChannel => 'チャンネルを追加'; + + @override + String get channels_channelIndexLabel => 'チャンネルインデックス'; + + @override + String get channels_channelName => 'チャンネル名'; + + @override + String get channels_usePublicChannel => 'パブリックチャンネルを使用する'; + + @override + String get channels_standardPublicPsk => '標準的な公用 PSK'; + + @override + String get channels_pskHex => 'PSK (ヘックス)'; + + @override + String get channels_generateRandomPsk => 'ランダムなPSK(正交符号分割変調)を生成する'; + + @override + String get channels_enterChannelName => 'チャンネル名を入力してください'; + + @override + String get channels_pskMustBe32Hex => 'PSKは32桁の16進数で構成されている必要があります。'; + + @override + String channels_channelAdded(String name) { + return 'チャンネル「$name」を追加'; + } + + @override + String channels_editChannelTitle(int index) { + return 'チャンネル $index の編集'; + } + + @override + String get channels_smazCompression => 'SMAZ 圧縮'; + + @override + String channels_channelUpdated(String name) { + return 'チャンネル「$name」が更新されました'; + } + + @override + String get channels_publicChannelAdded => 'パブリックチャンネルが追加されました'; + + @override + String get channels_sortBy => '並び替え'; + + @override + String get channels_sortManual => 'マニュアル'; + + @override + String get channels_sortAZ => 'AからZ'; + + @override + String get channels_sortLatestMessages => '最新のメッセージ'; + + @override + String get channels_sortUnread => '未読'; + + @override + String get channels_createPrivateChannel => 'プライベートチャンネルを作成する'; + + @override + String get channels_createPrivateChannelDesc => '秘密鍵を使用して保護されています。'; + + @override + String get channels_joinPrivateChannel => 'プライベートチャンネルに参加する'; + + @override + String get channels_joinPrivateChannelDesc => '手動で秘密のキーを入力する。'; + + @override + String get channels_joinPublicChannel => '公開チャンネルに参加する'; + + @override + String get channels_joinPublicChannelDesc => 'このチャンネルには、誰でも参加できます。'; + + @override + String get channels_joinHashtagChannel => 'ハッシュタグチャンネルに参加する'; + + @override + String get channels_joinHashtagChannelDesc => '誰でもハッシュタグチャンネルに参加できます。'; + + @override + String get channels_scanQrCode => 'QRコードをスキャンする'; + + @override + String get channels_scanQrCodeComingSoon => '近日公開'; + + @override + String get channels_enterHashtag => 'ハッシュタグを入力してください'; + + @override + String get channels_hashtagHint => '例:#チーム'; + + @override + String get chat_noMessages => 'まだメッセージは届いていません'; + + @override + String get chat_sendMessageToStart => '開始するためにメッセージを送信してください'; + + @override + String get chat_originalMessageNotFound => '元のメッセージが見つかりませんでした'; + + @override + String chat_replyingTo(String name) { + return '$name への返信'; + } + + @override + String chat_replyTo(String name) { + return '$nameへの返信'; + } + + @override + String get chat_location => '場所'; + + @override + String chat_sendMessageTo(String contactName) { + return '$contactName へのメッセージを送信する'; + } + + @override + String get chat_typeMessage => 'メッセージを入力してください…'; + + @override + String chat_messageTooLong(int maxBytes) { + return 'メッセージが長すぎる($maxBytes バイトを超える)。'; + } + + @override + String get chat_messageCopied => 'メッセージがコピーされました'; + + @override + String get chat_messageDeleted => 'メッセージは削除されました'; + + @override + String get chat_retryingMessage => '再試行メッセージ'; + + @override + String chat_retryCount(int current, int max) { + return '$current / $max 回目'; + } + + @override + String get chat_sendGif => 'GIFを送信する'; + + @override + String get chat_reply => '返信'; + + @override + String get chat_addReaction => '反応を追加'; + + @override + String get chat_me => '私'; + + @override + String get emojiCategorySmileys => '笑顔の絵文字'; + + @override + String get emojiCategoryGestures => '身振り、動作'; + + @override + String get emojiCategoryHearts => '心'; + + @override + String get emojiCategoryObjects => '対象物'; + + @override + String get gifPicker_title => 'GIF を選択してください'; + + @override + String get gifPicker_searchHint => 'GIFの検索...'; + + @override + String get gifPicker_poweredBy => 'GIPHYによる提供'; + + @override + String get gifPicker_noGifsFound => 'GIF形式のファイルは見つかりませんでした'; + + @override + String get gifPicker_failedLoad => 'GIFファイルの読み込みに失敗しました'; + + @override + String get gifPicker_failedSearch => 'GIFファイルの検索に失敗しました'; + + @override + String get gifPicker_noInternet => 'インターネット接続なし'; + + @override + String get debugLog_appTitle => 'アプリケーションのデバッグログ'; + + @override + String get debugLog_bleTitle => 'BLE デバッグログ'; + + @override + String get debugLog_copyLog => '記録'; + + @override + String get debugLog_clearLog => '詳細なログ'; + + @override + String get debugLog_copied => 'デバッグログをコピー'; + + @override + String get debugLog_bleCopied => 'BLEログのコピー'; + + @override + String get debugLog_noEntries => 'デバッグログはまだ生成されていません'; + + @override + String get debugLog_enableInSettings => 'アプリのデバッグログを有効にするには、設定から操作してください。'; + + @override + String get debugLog_frames => 'フレーム'; + + @override + String get debugLog_rawLogRx => '生のログ-RX'; + + @override + String get debugLog_noBleActivity => '現時点では、BLE関連の活動は行われていません。'; + + @override + String debugFrame_length(int count) { + return 'フレーム長: $count バイト'; + } + + @override + String debugFrame_command(String value) { + return 'コマンド: 0x$value'; + } + + @override + String get debugFrame_textMessageHeader => 'テキストメッセージ用フレーム:'; + + @override + String debugFrame_destinationPubKey(String pubKey) { + return '- 宛先公開鍵: $pubKey'; + } + + @override + String debugFrame_timestamp(int timestamp) { + return '- タイムスタンプ: $timestamp'; + } + + @override + String debugFrame_flags(String value) { + return '- フラグ: 0x$value'; + } + + @override + String debugFrame_textType(int type, String label) { + return '- テキストの種類: $type ($label)'; + } + + @override + String get debugFrame_textTypeCli => 'CLI(コマンドラインインターフェース)'; + + @override + String get debugFrame_textTypePlain => 'シンプルな'; + + @override + String debugFrame_text(String text) { + return '- テキスト:「$text」'; + } + + @override + String get debugFrame_hexDump => 'ヘックスダンプ:'; + + @override + String get chat_pathManagement => '経路管理'; + + @override + String get chat_ShowAllPaths => 'すべての経路を表示'; + + @override + String get chat_routingMode => 'ルーティングモード'; + + @override + String get chat_autoUseSavedPath => '自動 (保存されたパスを使用)'; + + @override + String get chat_forceFloodMode => '強制的に洪水モードを起動'; + + @override + String get chat_recentAckPaths => '最近使用したACKパス(タップして使用):'; + + @override + String get chat_pathHistoryFull => 'パスの履歴は完全です。エントリを削除して、新しいものを追加できます。'; + + @override + String get chat_hopSingular => 'ジャンプ'; + + @override + String get chat_hopPlural => 'ホップ'; + + @override + String chat_hopsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ホップ', + one: 'ホップ', + ); + return '$count $_temp0'; + } + + @override + String get chat_successes => '成功事例'; + + @override + String get chat_removePath => 'パスを削除する'; + + @override + String get chat_noPathHistoryYet => 'まだ履歴はありません。\nパスを特定するためにメッセージを送信してください。'; + + @override + String get chat_pathActions => 'パスの操作:'; + + @override + String get chat_setCustomPath => 'カスタムパスを設定'; + + @override + String get chat_setCustomPathSubtitle => '手動で経路を指定する'; + + @override + String get chat_clearPath => '明確な道'; + + @override + String get chat_clearPathSubtitle => '次回送信時に、以前の情報を再取得する'; + + @override + String get chat_pathCleared => '経路が確保されました。次のメッセージでルートを再確認します。'; + + @override + String get chat_floodModeSubtitle => 'アプリのバーにあるルーティング切り替え機能を使用する'; + + @override + String get chat_floodModeEnabled => + '洪水モードが有効になっています。アプリのメニューバーにあるルートアイコンを使用して、モードを切り替えることができます。'; + + @override + String get chat_fullPath => 'フルパス'; + + @override + String get chat_pathDetailsNotAvailable => + '経路の詳細については、まだ情報がありません。「リフレッシュ」ボタンを押して、再度お試しください。'; + + @override + String chat_pathSetHops(int hopCount, String status) { + String _temp0 = intl.Intl.pluralLogic( + hopCount, + locale: localeName, + other: 'hops', + one: 'hop', + ); + return 'Path set: $hopCount $_temp0 - $status'; + } + + @override + String get chat_pathSavedLocally => 'ローカルで保存。同期のために接続する。'; + + @override + String get chat_pathDeviceConfirmed => 'デバイスの確認済み。'; + + @override + String get chat_pathDeviceNotConfirmed => 'デバイスの確認はまだできていません。'; + + @override + String get chat_type => '種類'; + + @override + String get chat_path => '道'; + + @override + String get chat_publicKey => '公開鍵'; + + @override + String get chat_compressOutgoingMessages => '送信されるメッセージを圧縮する'; + + @override + String get chat_floodForced => '洪水(強制的な)'; + + @override + String get chat_directForced => '直接的な(強制的な)'; + + @override + String chat_hopsForced(int count) { + return '$count 本のホップ(強制的に採取)'; + } + + @override + String get chat_floodAuto => '洪水 (自動)'; + + @override + String get chat_direct => '直接'; + + @override + String get chat_poiShared => '共有されたPOI'; + + @override + String chat_unread(int count) { + return '未読: $count'; + } + + @override + String get chat_openLink => 'リンクを開く?'; + + @override + String get chat_openLinkConfirmation => 'このリンクをブラウザで開くことはご希望ですか?'; + + @override + String get chat_open => '開く'; + + @override + String chat_couldNotOpenLink(String url) { + return 'リンクを開けられませんでした: $url'; + } + + @override + String get chat_invalidLink => '無効なリンク形式'; + + @override + String get map_title => 'ノードマップ'; + + @override + String get map_lineOfSight => '視界'; + + @override + String get map_losScreenTitle => '視界'; + + @override + String get map_noNodesWithLocation => '位置情報データを持つノードは存在しません'; + + @override + String get map_nodesNeedGps => 'ノードは、地図上に表示されるために、GPS座標を共有する必要があります。'; + + @override + String map_nodesCount(int count) { + return 'ノード:$count'; + } + + @override + String map_pinsCount(int count) { + return 'ピン:$count個'; + } + + @override + String get map_chat => 'チャット'; + + @override + String get map_repeater => '繰り返し送信装置'; + + @override + String get map_room => '部屋'; + + @override + String get map_sensor => 'センサー'; + + @override + String get map_pinDm => 'ピン(DM)'; + + @override + String get map_pinPrivate => 'プライベート(非公開)'; + + @override + String get map_pinPublic => '公開 (一般公開)'; + + @override + String get map_lastSeen => '最後に確認された場所'; + + @override + String get map_disconnectConfirm => '本当にこのデバイスとの接続を解除したいですか?'; + + @override + String get map_from => '~から'; + + @override + String get map_source => '出典'; + + @override + String get map_flags => '旗'; + + @override + String get map_shareMarkerHere => 'この場所でシェア'; + + @override + String get map_setAsMyLocation => '現在地として設定'; + + @override + String get map_pinLabel => 'ピンラベル'; + + @override + String get map_label => 'ラベル'; + + @override + String get map_pointOfInterest => '注目すべき点'; + + @override + String get map_sendToContact => '連絡先へ送信'; + + @override + String get map_sendToChannel => '特定のチャンネルに送信する'; + + @override + String get map_noChannelsAvailable => '利用可能なチャンネルはありません'; + + @override + String get map_publicLocationShare => '公共スペースの共有'; + + @override + String map_publicLocationShareConfirm(String channelLabel) { + return '現在、$channelLabel で位置情報を共有する準備をしています。このチャンネルは公開されており、PSK を持つ誰でも閲覧できます。'; + } + + @override + String get map_connectToShareMarkers => '他のデバイスと接続して、マーカーを共有する'; + + @override + String get map_filterNodes => 'フィルタノード'; + + @override + String get map_nodeTypes => 'ノードの種類'; + + @override + String get map_chatNodes => 'チャットノード'; + + @override + String get map_repeaters => '繰り返し送信装置'; + + @override + String get map_otherNodes => 'その他のノード'; + + @override + String get map_showOverlaps => 'リピーターキーの重複'; + + @override + String get map_keyPrefix => '主要なプレフィックス'; + + @override + String get map_filterByKeyPrefix => '主要なプレフィックスでフィルタリングする'; + + @override + String get map_publicKeyPrefix => '公開鍵のプレフィックス'; + + @override + String get map_markers => 'マーカー'; + + @override + String get map_showSharedMarkers => '共有のマーカーを表示する'; + + @override + String get map_showGuessedLocations => '推測されたノードの位置を表示する'; + + @override + String get map_showDiscoveryContacts => 'Discovery社の連絡先を表示する'; + + @override + String get map_guessedLocation => '推測された場所'; + + @override + String get map_lastSeenTime => '最後に確認された時間'; + + @override + String get map_sharedPin => '共有パスワード'; + + @override + String get map_joinRoom => '部屋に参加する'; + + @override + String get map_manageRepeater => 'リピーターの管理'; + + @override + String get map_tapToAdd => 'ノードをクリックして、パスに追加します。'; + + @override + String get map_runTrace => 'パスの追跡を実行'; + + @override + String get map_runTraceWithReturnPath => '元の経路に戻る。'; + + @override + String get map_removeLast => '最後のものを削除'; + + @override + String get map_pathTraceCancelled => 'パスの追跡は中止。'; + + @override + String get mapCache_title => 'オフライン用地図キャッシュ'; + + @override + String get mapCache_selectAreaFirst => '最初にキャッシュする領域を選択してください'; + + @override + String get mapCache_noTilesToDownload => 'この地域にはダウンロードできるタイルは存在しません。'; + + @override + String get mapCache_downloadTilesTitle => 'タイルをダウンロードする'; + + @override + String mapCache_downloadTilesPrompt(int count) { + return 'オフラインでの使用のために、$count個のタイルをダウンロードしますか?'; + } + + @override + String get mapCache_downloadAction => 'ダウンロード'; + + @override + String mapCache_cachedTiles(int count) { + return '$count 個のタイルをキャッシュ'; + } + + @override + String mapCache_cachedTilesWithFailed(int downloaded, int failed) { + return 'Cached $downloaded tiles ($failed failed)'; + } + + @override + String get mapCache_clearOfflineCacheTitle => 'オフラインキャッシュをクリアする'; + + @override + String get mapCache_clearOfflineCachePrompt => 'キャッシュされた地図のタイルをすべて削除しますか?'; + + @override + String get mapCache_offlineCacheCleared => 'オフラインキャッシュをクリア'; + + @override + String get mapCache_noAreaSelected => '選択されたエリアはありません'; + + @override + String get mapCache_cacheArea => 'キャッシュエリア'; + + @override + String get mapCache_useCurrentView => '現在表示されている内容を保持する'; + + @override + String get mapCache_zoomRange => 'ズーム範囲'; + + @override + String mapCache_estimatedTiles(int count) { + return '推定されるタイル数: $count'; + } + + @override + String mapCache_downloadedTiles(int completed, int total) { + return 'Downloaded $completed / $total'; + } + + @override + String get mapCache_downloadTilesButton => 'タイルをダウンロードする'; + + @override + String get mapCache_clearCacheButton => 'キャッシュをクリアする'; + + @override + String mapCache_failedDownloads(int count) { + return '失敗したダウンロード: $count'; + } + + @override + String mapCache_boundsLabel( + String north, + String south, + String east, + String west, + ) { + return 'N $north, S $south, E $east, W $west'; + } + + @override + String get time_justNow => 'まさに今'; + + @override + String time_minutesAgo(int minutes) { + return '$minutes分前'; + } + + @override + String time_hoursAgo(int hours) { + return '$hours時間前'; + } + + @override + String time_daysAgo(int days) { + return '$days日前'; + } + + @override + String get time_hour => '1時間'; + + @override + String get time_hours => '時間'; + + @override + String get time_day => '一日'; + + @override + String get time_days => '日'; + + @override + String get time_week => '1週間'; + + @override + String get time_weeks => '週'; + + @override + String get time_month => '月'; + + @override + String get time_months => '月'; + + @override + String get time_minutes => '分'; + + @override + String get time_allTime => '全期間'; + + @override + String get dialog_disconnect => '切断する'; + + @override + String get dialog_disconnectConfirm => '本当にこのデバイスとの接続を解除したいですか?'; + + @override + String get login_repeaterLogin => '再ログイン'; + + @override + String get login_roomLogin => 'ルームサーバーへのログイン'; + + @override + String get login_password => 'パスワード'; + + @override + String get login_enterPassword => 'パスワードを入力してください'; + + @override + String get login_savePassword => 'パスワードを保存する'; + + @override + String get login_savePasswordSubtitle => 'パスワードは、このデバイスに安全に保存されます。'; + + @override + String get login_repeaterDescription => + '設定やステータスにアクセスするために、リピーターのパスワードを入力してください。'; + + @override + String get login_roomDescription => '設定やステータスへのアクセスには、部屋のパスワードを入力してください。'; + + @override + String get login_routing => '経路設定'; + + @override + String get login_routingMode => 'ルーティングモード'; + + @override + String get login_autoUseSavedPath => '自動 (保存されたパスを使用)'; + + @override + String get login_forceFloodMode => '強制的に洪水モードを起動'; + + @override + String get login_managePaths => 'パスの管理'; + + @override + String get login_login => 'ログイン'; + + @override + String login_attempt(int current, int max) { + return '試行回数:$current/$max'; + } + + @override + String login_failed(String error) { + return 'ログインに失敗しました:$error'; + } + + @override + String get login_failedMessage => + 'ログインに失敗しました。パスワードが間違っているか、または接続が確立されていません。'; + + @override + String get common_reload => '再読み込み'; + + @override + String get common_clear => '明確'; + + @override + String path_currentPath(String path) { + return '現在のパス: $path'; + } + + @override + String path_usingHopsPath(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'ホップ', + one: 'ホップ', + ); + return '$count $_temp0のパスを使用'; + } + + @override + String get path_enterCustomPath => 'カスタムパスを入力'; + + @override + String get path_currentPathLabel => '現在の経路'; + + @override + String get path_hexPrefixInstructions => + '各ホップに対して、2文字の16進数プレフィックスをカンマで区切って入力してください。'; + + @override + String get path_hexPrefixExample => '例:A1, F2, 3C (各ノードは、自身の公開鍵の最初のバイトを使用)'; + + @override + String get path_labelHexPrefixes => 'パス (ヘックスプレフィックス)'; + + @override + String get path_helperMaxHops => + '最大64個のホップ。各プレフィックスは2つの16進数文字(1バイト)で構成されています。'; + + @override + String get path_selectFromContacts => 'または、連絡先リストから選択してください:'; + + @override + String get path_noRepeatersFound => '繰り返し機能やルームサーバーは見つかりませんでした。'; + + @override + String get path_customPathsRequire => 'カスタムパスには、メッセージを中継できる中間地点が必要です。'; + + @override + String path_invalidHexPrefixes(String prefixes) { + return '無効な16進数プレフィックス: $prefixes'; + } + + @override + String get path_tooLong => '経路が長すぎる。最大64回のジャンプのみ許可。'; + + @override + String get path_setPath => 'パスを設定'; + + @override + String get repeater_management => 'リピーター管理'; + + @override + String get room_management => 'ルームサーバーの管理'; + + @override + String get repeater_managementTools => '管理ツール'; + + @override + String get repeater_status => 'ステータス'; + + @override + String get repeater_statusSubtitle => 'リピーターの状態、統計情報、および隣接するネットワークの情報を表示する'; + + @override + String get repeater_telemetry => 'テレメトリー'; + + @override + String get repeater_telemetrySubtitle => 'センサーおよびシステムの状態に関するテレメトリの表示'; + + @override + String get repeater_cli => 'CLI(コマンドラインインターフェース)'; + + @override + String get repeater_cliSubtitle => 'リピーターへのコマンドを送信する'; + + @override + String get repeater_neighbors => '近隣住民'; + + @override + String get repeater_neighborsSubtitle => 'ゼロホップの隣接ノードを表示する。'; + + @override + String get repeater_settings => '設定'; + + @override + String get repeater_settingsSubtitle => 'リピーターのパラメータを設定する'; + + @override + String get repeater_statusTitle => '再送ステータス'; + + @override + String get repeater_routingMode => 'ルーティングモード'; + + @override + String get repeater_autoUseSavedPath => '自動 (保存されたパスを使用)'; + + @override + String get repeater_forceFloodMode => '強制的に洪水モードを起動'; + + @override + String get repeater_pathManagement => '経路管理'; + + @override + String get repeater_refresh => 'リフレッシュ'; + + @override + String get repeater_statusRequestTimeout => 'ステータス情報の取得に失敗しました。'; + + @override + String repeater_errorLoadingStatus(String error) { + return 'ステータス読み込みエラー: $error'; + } + + @override + String get repeater_systemInformation => 'システム情報'; + + @override + String get repeater_battery => 'バッテリー'; + + @override + String get repeater_clockAtLogin => 'ログイン時の時刻表示'; + + @override + String get repeater_uptime => '稼働率'; + + @override + String get repeater_queueLength => '待ち行列の長さ'; + + @override + String get repeater_debugFlags => 'デバッグフラグ'; + + @override + String get repeater_radioStatistics => 'ラジオに関する統計'; + + @override + String get repeater_lastRssi => '最後のRSSI'; + + @override + String get repeater_lastSnr => '最後のSNR'; + + @override + String get repeater_noiseFloor => 'ノイズレベル'; + + @override + String get repeater_txAirtime => 'TXの放送時間'; + + @override + String get repeater_rxAirtime => 'RX 空き時間'; + + @override + String get repeater_packetStatistics => 'パケット統計'; + + @override + String get repeater_sent => '送信'; + + @override + String get repeater_received => '受領'; + + @override + String get repeater_duplicates => '重複'; + + @override + String repeater_daysHoursMinsSecs( + int days, + int hours, + int minutes, + int seconds, + ) { + return '$days日 $hours時間 $minutes分 $seconds秒'; + } + + @override + String repeater_packetTxTotal(int total, String flood, String direct) { + return '合計: $total, 洪水: $flood, 直接: $direct'; + } + + @override + String repeater_packetRxTotal(int total, String flood, String direct) { + return '合計: $total, 洪水: $flood, 直接: $direct'; + } + + @override + String repeater_duplicatesFloodDirect(String flood, String direct) { + return '$flood: $flood, 直接: $direct'; + } + + @override + String repeater_duplicatesTotal(int total) { + return '合計: $total'; + } + + @override + String get repeater_settingsTitle => 'リピーター設定'; + + @override + String get repeater_basicSettings => '基本設定'; + + @override + String get repeater_repeaterName => '送信装置名'; + + @override + String get repeater_repeaterNameHelper => 'このリピーターの名前'; + + @override + String get repeater_adminPassword => '管理者パスワード'; + + @override + String get repeater_adminPasswordHelper => '完全アクセス権のパスワード'; + + @override + String get repeater_guestPassword => 'ゲスト用のパスワード'; + + @override + String get repeater_guestPasswordHelper => '読み取り専用アクセス用のパスワード'; + + @override + String get repeater_radioSettings => 'ラジオ設定'; + + @override + String get repeater_frequencyMhz => '周波数 (MHz)'; + + @override + String get repeater_frequencyHelper => '300~2500 MHz'; + + @override + String get repeater_txPower => 'TXパワー'; + + @override + String get repeater_txPowerHelper => '-30~-10 dBm'; + + @override + String get repeater_bandwidth => '帯域幅'; + + @override + String get repeater_spreadingFactor => '伝播係数'; + + @override + String get repeater_codingRate => 'コーディング速度'; + + @override + String get repeater_locationSettings => '場所設定'; + + @override + String get repeater_latitude => '緯度'; + + @override + String get repeater_latitudeHelper => '度分表記(例:37.7749)'; + + @override + String get repeater_longitude => '経度'; + + @override + String get repeater_longitudeHelper => '度分表記(例:-122.4194)'; + + @override + String get repeater_features => '特徴'; + + @override + String get repeater_packetForwarding => 'パケット転送'; + + @override + String get repeater_packetForwardingSubtitle => 'リピーターがパケットを転送できるように設定する'; + + @override + String get repeater_guestAccess => 'ゲストへのアクセス'; + + @override + String get repeater_guestAccessSubtitle => 'ゲストへの読み取り専用アクセスを許可する'; + + @override + String get repeater_privacyMode => 'プライバシーモード'; + + @override + String get repeater_privacyModeSubtitle => '広告に名前/場所を記載しない'; + + @override + String get repeater_advertisementSettings => '広告設定'; + + @override + String get repeater_localAdvertInterval => '地域広告掲載期間'; + + @override + String repeater_localAdvertIntervalMinutes(int minutes) { + return '$minutes 分'; + } + + @override + String get repeater_floodAdvertInterval => '洪水に関する広告の表示間隔'; + + @override + String repeater_floodAdvertIntervalHours(int hours) { + return '$hours 時間'; + } + + @override + String get repeater_encryptedAdvertInterval => '暗号化された広告表示間'; + + @override + String get repeater_dangerZone => '危険区域'; + + @override + String get repeater_rebootRepeater => 'リピーターを再起動する'; + + @override + String get repeater_rebootRepeaterSubtitle => 'リピーターデバイスを再起動する'; + + @override + String get repeater_rebootRepeaterConfirm => '本当にこのリピーターを再起動したいですか?'; + + @override + String get repeater_regenerateIdentityKey => 'IDキーの再生成'; + + @override + String get repeater_regenerateIdentityKeySubtitle => '新しい公開鍵/秘密鍵のペアを生成する'; + + @override + String get repeater_regenerateIdentityKeyConfirm => + 'これにより、リピーターには新しい識別情報が割り当てられます。続行しますか?'; + + @override + String get repeater_eraseFileSystem => 'ファイルシステムを削除する'; + + @override + String get repeater_eraseFileSystemSubtitle => 'リピーターファイルシステムをフォーマットする'; + + @override + String get repeater_eraseFileSystemConfirm => + '警告:この操作により、リピーター内のすべてのデータが消去されます。この操作は元に戻すことができません!'; + + @override + String get repeater_eraseSerialOnly => 'Erase機能は、シリアルコンソール経由でのみ利用可能です。'; + + @override + String repeater_commandSent(String command) { + return '送信されたコマンド: $command'; + } + + @override + String repeater_errorSendingCommand(String error) { + return 'コマンド送信エラー:$error'; + } + + @override + String get repeater_confirm => '確認'; + + @override + String get repeater_settingsSaved => '設定が正常に保存されました'; + + @override + String repeater_errorSavingSettings(String error) { + return '設定の保存に失敗しました:$error'; + } + + @override + String get repeater_refreshBasicSettings => '基本設定をリセットする'; + + @override + String get repeater_refreshRadioSettings => 'ラジオ設定をリセットする'; + + @override + String get repeater_refreshTxPower => 'TX の電力レベルをリセットする'; + + @override + String get repeater_refreshLocationSettings => '場所設定をリセットする'; + + @override + String get repeater_refreshPacketForwarding => 'パケット転送の刷新'; + + @override + String get repeater_refreshGuestAccess => 'ゲストへのアクセスをリフレッシュする'; + + @override + String get repeater_refreshPrivacyMode => 'プライバシーモードをリセットする'; + + @override + String get repeater_refreshAdvertisementSettings => '広告設定のリセット'; + + @override + String repeater_refreshed(String label) { + return '$label が更新されました'; + } + + @override + String repeater_errorRefreshing(String label) { + return '$label の更新に失敗しました'; + } + + @override + String get repeater_cliTitle => 'リピーターのコマンドラインインターフェース'; + + @override + String get repeater_debugNextCommand => '次のコマンドのデバッグ'; + + @override + String get repeater_commandHelp => 'コマンドヘルプ'; + + @override + String get repeater_clearHistory => '明確な歴史'; + + @override + String get repeater_noCommandsSent => 'まだコマンドは送信されていません'; + + @override + String get repeater_typeCommandOrUseQuick => + '以下のコマンドを入力するか、クイックコマンドを使用してください。'; + + @override + String get repeater_enterCommandHint => 'コマンドを入力してください...'; + + @override + String get repeater_previousCommand => '直前の指示'; + + @override + String get repeater_nextCommand => '次の指示'; + + @override + String get repeater_enterCommandFirst => 'まず、コマンドを入力してください。'; + + @override + String get repeater_cliCommandFrameTitle => 'CLI コマンドフレーム'; + + @override + String repeater_cliCommandError(String error) { + return 'エラー:$error'; + } + + @override + String get repeater_cliQuickGetName => '名前を取得する'; + + @override + String get repeater_cliQuickGetRadio => 'ラジオを聴く'; + + @override + String get repeater_cliQuickGetTx => 'TXを入手する'; + + @override + String get repeater_cliQuickNeighbors => '近隣住民'; + + @override + String get repeater_cliQuickVersion => 'バージョン'; + + @override + String get repeater_cliQuickAdvertise => '広告'; + + @override + String get repeater_cliQuickClock => '時計'; + + @override + String get repeater_cliHelpAdvert => '広告用資料を送る'; + + @override + String get repeater_cliHelpReboot => + 'デバイスを再起動します。(注:通常は「タイムアウト」が表示されますが、これは正常です)'; + + @override + String get repeater_cliHelpClock => '各デバイスの時計で現在の時刻を表示します。'; + + @override + String get repeater_cliHelpPassword => 'デバイス用の新しい管理者パスワードを設定します。'; + + @override + String get repeater_cliHelpVersion => 'デバイスのバージョンとファームウェアのビルド日を表示します。'; + + @override + String get repeater_cliHelpClearStats => 'さまざまな統計カウンターをゼロにリセットする。'; + + @override + String get repeater_cliHelpSetAf => '空き時間係数を設定します。'; + + @override + String get repeater_cliHelpSetTx => 'LoRaの送信電力をdBmで設定します。(設定変更後、再起動が必要です)'; + + @override + String get repeater_cliHelpSetRepeat => 'このノードに対するリピーターの役割を有効化または無効化します。'; + + @override + String get repeater_cliHelpSetAllowReadOnly => + '(ルームサーバー設定)「オン」に設定した場合、空白のパスワードでのログインは可能ですが、ルームへの投稿はできません。(閲覧のみ)'; + + @override + String get repeater_cliHelpSetFloodMax => + 'インバウンドフラッパケットの最大ホップ数を設定します(最大値を超えた場合、パケットは転送されません)。'; + + @override + String get repeater_cliHelpSetIntThresh => + '干渉閾値を設定します(dB単位)。デフォルト値は14です。0に設定すると、チャンネル間の干渉を検出する機能を無効にします。'; + + @override + String get repeater_cliHelpSetAgcResetInterval => + 'オートゲインコントローラーのリセット間隔を設定します。 0 に設定すると無効化されます。'; + + @override + String get repeater_cliHelpSetMultiAcks => '「ダブルACK」機能の有効化または無効化を可能にします。'; + + @override + String get repeater_cliHelpSetAdvertInterval => + 'ローカル(ホップなし)の広告パケットを送信する間隔を分単位で設定します。 0 に設定すると、機能を無効にします。'; + + @override + String get repeater_cliHelpSetFloodAdvertInterval => + '洪水広告の送信間隔を時間単位で設定します。0に設定すると、送信を停止します。'; + + @override + String get repeater_cliHelpSetGuestPassword => + 'ゲストのパスワードを設定/更新します。(繰り返し利用の場合、ゲストのログインは「統計情報を取得」のリクエストを送信できます)'; + + @override + String get repeater_cliHelpSetName => '広告の名前を設定します。'; + + @override + String get repeater_cliHelpSetLat => '広告表示の地図の緯度を設定します。(度分秒表記)'; + + @override + String get repeater_cliHelpSetLon => '広告表示の地図の経度を設定します。(度数、分)'; + + @override + String get repeater_cliHelpSetRadio => + '完全に新しいラジオパラメータを設定し、設定として保存します。適用するには、「再起動」コマンドが必要です。'; + + @override + String get repeater_cliHelpSetRxDelay => + '(実験用)遅延時間を設定するためのベース(1以上の値に設定する必要)\n受信パケットに対して、信号強度/スコアに基づいてわずかな遅延を適用します。 0に設定すると無効化されます。'; + + @override + String get repeater_cliHelpSetTxDelay => + '時間経過に応じた「フラッシュモード」パケットの送信遅延を設定します。この遅延は、ランダムなスロットシステムと組み合わせて使用され、パケットの衝突を減らすことを目的としています。'; + + @override + String get repeater_cliHelpSetDirectTxDelay => + 'txdelayと同様ですが、ダイレクトモードのパケット転送にランダムな遅延を適用する場合に使用します。'; + + @override + String get repeater_cliHelpSetBridgeEnabled => 'ブリッジを有効化/無効化'; + + @override + String get repeater_cliHelpSetBridgeDelay => 'パケットを再送信する前に、遅延を設定する。'; + + @override + String get repeater_cliHelpSetBridgeSource => + '橋が受信したパケットを再送信するか、送信したパケットを再送信するかどうかを選択してください。'; + + @override + String get repeater_cliHelpSetBridgeBaud => + 'RS232 橋渡しに使用するシリアルリンクのボーレートを設定する。'; + + @override + String get repeater_cliHelpSetBridgeSecret => 'ESPNow 橋の秘密設定'; + + @override + String get repeater_cliHelpSetAdcMultiplier => + '特定のボードでのみサポートされている、報告されるバッテリー電圧を調整するためのカスタムファクタを設定できます。'; + + @override + String get repeater_cliHelpTempRadio => + '指定された時間(分単位)に対して、一時的にラジオパラメータを設定し、その後元のラジオパラメータに戻します。(設定を保存しません)。'; + + @override + String get repeater_cliHelpSetPerm => + 'ACL を変更します。「permissions」が 0 の場合、対応するエントリ(pubkey のプレフィックスで識別)を削除します。pubkey-hex が有効な長さで、かつ ACL に現在存在しない場合に、新しいエントリを追加します。pubkey のプレフィックスと一致するエントリを更新します。権限ビットはファームウェアの役割によって異なり、下位 2 ビットは以下のとおりです:0 (ゲスト)、1 (読み取り専用)、2 (読み書き)、3 (管理者)'; + + @override + String get repeater_cliHelpGetBridgeType => 'ブリッジ機能なし、RS232、ESPNow'; + + @override + String get repeater_cliHelpLogStart => 'パケットのログ記録を開始し、ファイルシステムに保存する。'; + + @override + String get repeater_cliHelpLogStop => 'ファイルシステムへのパケットログの記録を停止する。'; + + @override + String get repeater_cliHelpLogErase => 'ファイルシステムからパケットログを削除する。'; + + @override + String get repeater_cliHelpNeighbors => + 'ゼロホップ広告を通じて受信した他のリピーターノードの一覧を表示します。各行は、IDプレフィックス(16進数)、タイムスタンプ、SNR(シグナル強度)の情報を4つ含みます。'; + + @override + String get repeater_cliHelpNeighborRemove => + '隣接リストから、最初に一致するエントリ(pubkeyプレフィックス(16進数)で特定)を削除します。'; + + @override + String get repeater_cliHelpRegion => + '(特定のシリーズのみ)定義されたすべての地域と、現在の洪水許可状況を一覧表示します。'; + + @override + String get repeater_cliHelpRegionLoad => + '注:これは特殊な複数コマンドの呼び出しです。その後の各コマンドは、地域名であり(スペースを使用して親階層を示し、少なくとも1つのスペースが必要です)、空行/コマンドで終了します。'; + + @override + String get repeater_cliHelpRegionGet => + '指定された名前のプレフィックスを持つ地域を検索します(または、グローバルな範囲の場合は「*」)。結果として、「region-name (parent-name) \'F\'」と返答します。'; + + @override + String get repeater_cliHelpRegionPut => '指定された名前で、領域の定義を追加または更新します。'; + + @override + String get repeater_cliHelpRegionRemove => + '指定された名前を持つ領域の定義を削除します。(正確に一致している必要があり、子領域は存在してはなりません)'; + + @override + String get repeater_cliHelpRegionAllowf => + '指定された領域に対して、「洪水」アクセス許可を設定します。 (グローバル/従来のスコープには「*」を使用)'; + + @override + String get repeater_cliHelpRegionDenyf => + '指定された領域における「FLOOD」権限を削除します。(注:現時点では、グローバル/従来の範囲での使用は推奨されません!)'; + + @override + String get repeater_cliHelpRegionHome => + '現在の「ホーム」地域に返信します。(まだ適用されていない、将来利用を予定)'; + + @override + String get repeater_cliHelpRegionHomeSet => '「ホーム」地域を設定します。'; + + @override + String get repeater_cliHelpRegionSave => '領域リスト/マップをストレージに保存する。'; + + @override + String get repeater_cliHelpGps => + 'GPSの状態を表示します。GPSがオフの場合、「オフ」と表示します。オンの場合、「オン」、「ステータス」、「位置情報」、「衛星数」と表示します。'; + + @override + String get repeater_cliHelpGpsOnOff => 'GPS の電源状態を切り替えます。'; + + @override + String get repeater_cliHelpGpsSync => 'ノードの時刻をGPSクロックと同期する。'; + + @override + String get repeater_cliHelpGpsSetLoc => 'ノードの位置をGPS座標に設定し、設定を保存する。'; + + @override + String get repeater_cliHelpGpsAdvert => + 'ノードの広告設定における場所情報の指定:\n- none: 広告に場所情報を含まない\n- share: GPS位置情報を共有 (SensorManagerから取得)\n- prefs: プリファレンスに保存された場所情報を広告'; + + @override + String get repeater_cliHelpGpsAdvertSet => '場所に関する広告設定を行います。'; + + @override + String get repeater_commandsListTitle => 'コマンド一覧'; + + @override + String get repeater_commandsListNote => + '注:さまざまな「set ...」コマンドには、「get ...」コマンドも存在します。'; + + @override + String get repeater_general => '一般的な'; + + @override + String get repeater_settingsCategory => '設定'; + + @override + String get repeater_bridge => '橋'; + + @override + String get repeater_logging => 'ログ記録'; + + @override + String get repeater_neighborsRepeaterOnly => '近隣住民(リピーターのみ)'; + + @override + String get repeater_regionManagementRepeaterOnly => '地域管理(ブロードキャスト用のみ)'; + + @override + String get repeater_regionNote => '地域レベルでの管理のため、地域定義と権限の管理を行うための機能が導入されました。'; + + @override + String get repeater_gpsManagement => 'GPS管理'; + + @override + String get repeater_gpsNote => 'GPSコマンドは、位置情報に関連するタスクを管理するために導入されました。'; + + @override + String get telemetry_receivedData => '受信したテレメトリーデータ'; + + @override + String get telemetry_requestTimeout => 'テレメトリの要求タイムアウトしました。'; + + @override + String telemetry_errorLoading(String error) { + return 'テレメトリの読み込みに失敗しました: $error'; + } + + @override + String get telemetry_noData => 'テレメトリデータは利用できません。'; + + @override + String telemetry_channelTitle(int channel) { + return 'チャンネル $channel'; + } + + @override + String get telemetry_batteryLabel => 'バッテリー'; + + @override + String get telemetry_voltageLabel => '電圧'; + + @override + String get telemetry_mcuTemperatureLabel => 'MCU の温度'; + + @override + String get telemetry_temperatureLabel => '温度'; + + @override + String get telemetry_currentLabel => '現在'; + + @override + String telemetry_batteryValue(int percent, String volts) { + return '$percent% / ${volts}V'; + } + + @override + String telemetry_voltageValue(String volts) { + return '${volts}V'; + } + + @override + String telemetry_currentValue(String amps) { + return '${amps}A'; + } + + @override + String telemetry_temperatureValue(String celsius, String fahrenheit) { + return '$celsius℃ / $fahrenheit°F'; + } + + @override + String get neighbors_receivedData => '近隣住民のデータを受信'; + + @override + String get neighbors_requestTimedOut => '近隣住民からの要望:時間制限を設けてください。'; + + @override + String neighbors_errorLoading(String error) { + return '近隣情報の読み込みに失敗: $error'; + } + + @override + String get neighbors_repeatersNeighbors => '繰り返し送信する、近隣'; + + @override + String get neighbors_noData => '近隣のデータは利用できません。'; + + @override + String neighbors_unknownContact(String pubkey) { + return '不明な $pubkey'; + } + + @override + String neighbors_heardAgo(String time) { + return '聞いたのは、$time くらい前です'; + } + + @override + String get channelPath_title => 'パケットパス'; + + @override + String get channelPath_viewMap => '地図を表示する'; + + @override + String get channelPath_otherObservedPaths => '観察されたその他の経路'; + + @override + String get channelPath_repeaterHops => 'ホップの繰り返し'; + + @override + String get channelPath_noHopDetails => 'このパッケージに関する詳細な情報は提供されていません。'; + + @override + String get channelPath_messageDetails => 'メッセージの詳細'; + + @override + String get channelPath_senderLabel => '送信者'; + + @override + String get channelPath_timeLabel => '時間'; + + @override + String get channelPath_repeatsLabel => '繰り返し'; + + @override + String channelPath_pathLabel(int index) { + return '$index 番目の経路'; + } + + @override + String get channelPath_observedLabel => '観察'; + + @override + String channelPath_observedPathTitle(int index, String hops) { + return '観察された経路 $index • $hops'; + } + + @override + String get channelPath_noLocationData => '場所に関するデータはありません'; + + @override + String channelPath_timeWithDate(int day, int month, String time) { + return '$day/$month $time'; + } + + @override + String channelPath_timeOnly(String time) { + return '$time'; + } + + @override + String get channelPath_unknownPath => '不明'; + + @override + String get channelPath_floodPath => '洪水'; + + @override + String get channelPath_directPath => '直接'; + + @override + String channelPath_observedZeroOf(int total) { + return '$total個のホップ'; + } + + @override + String channelPath_observedSomeOf(int observed, int total) { + return '$observed of $total hops'; + } + + @override + String get channelPath_mapTitle => '経路図'; + + @override + String get channelPath_noRepeaterLocations => 'この経路には、中継装置の設置場所がありません。'; + + @override + String channelPath_primaryPath(int index) { + return '$index番目の経路(主要経路)'; + } + + @override + String get channelPath_pathLabelTitle => '道'; + + @override + String get channelPath_observedPathHeader => '観察された経路'; + + @override + String channelPath_selectedPathLabel(String label, String prefixes) { + return '$label • $prefixes'; + } + + @override + String get channelPath_noHopDetailsAvailable => 'このパッケージに関する詳細な配送情報は利用できません。'; + + @override + String get channelPath_unknownRepeater => '不明な増幅機'; + + @override + String get community_title => '地域'; + + @override + String get community_create => 'コミュニティを構築する'; + + @override + String get community_createDesc => '新しいコミュニティを作成し、QRコードで共有する。'; + + @override + String get community_join => '参加する'; + + @override + String get community_joinTitle => 'コミュニティに参加する'; + + @override + String community_joinConfirmation(String name) { + return '$nameさんのようなコミュニティに参加したいですか?'; + } + + @override + String get community_scanQr => 'コミュニティのQRコードをスキャン'; + + @override + String get community_scanInstructions => 'カメラを、地域のQRコードを向けて'; + + @override + String get community_showQr => 'QRコードを表示する'; + + @override + String get community_publicChannel => '地域住民向け'; + + @override + String get community_hashtagChannel => 'コミュニティ用ハッシュタグ'; + + @override + String get community_name => 'コミュニティ名'; + + @override + String get community_enterName => 'コミュニティ名を入力してください'; + + @override + String community_created(String name) { + return 'コミュニティ「$name」が作成されました'; + } + + @override + String community_joined(String name) { + return '$name のコミュニティに参加'; + } + + @override + String get community_qrTitle => 'コミュニティ共有'; + + @override + String community_qrInstructions(String name) { + return 'このQRコードをスキャンして、$nameに参加してください。'; + } + + @override + String get community_hashtagPrivacyHint => + 'コミュニティハッシュタグのチャンネルは、コミュニティのメンバーのみが参加できます。'; + + @override + String get community_invalidQrCode => '無効なコミュニティQRコード'; + + @override + String get community_alreadyMember => 'すでに会員である'; + + @override + String community_alreadyMemberMessage(String name) { + return 'あなたはすでに $name の会員です。'; + } + + @override + String get community_addPublicChannel => 'コミュニティ用の公開チャンネルを追加'; + + @override + String get community_addPublicChannelHint => 'このコミュニティの公開チャンネルを自動的に追加する'; + + @override + String get community_noCommunities => 'まだコミュニティは形成されていません。'; + + @override + String get community_scanOrCreate => 'QRコードをスキャンするか、コミュニティを作成して開始してください。'; + + @override + String get community_manageCommunities => 'コミュニティの管理'; + + @override + String get community_delete => 'コミュニティからの離脱'; + + @override + String community_deleteConfirm(String name) { + return '$nameを辞める?'; + } + + @override + String community_deleteChannelsWarning(int count) { + return 'これにより、$count のチャンネルとそのメッセージも削除されます。'; + } + + @override + String community_deleted(String name) { + return 'コミュニティ「$name」を離れる'; + } + + @override + String get community_regenerateSecret => '秘密の復元'; + + @override + String community_regenerateSecretConfirm(String name) { + return '$name の秘密鍵を再生成しますか? 継続的に通信するため、すべてのメンバーは新しいQRコードをスキャンする必要があります。'; + } + + @override + String get community_regenerate => '再生'; + + @override + String community_secretRegenerated(String name) { + return '$name への秘密が再設定されました'; + } + + @override + String get community_updateSecret => '秘密情報の更新'; + + @override + String community_secretUpdated(String name) { + return '$name 向けの秘密設定を更新'; + } + + @override + String community_scanToUpdateSecret(String name) { + return '新しいQRコードをスキャンして、$nameの秘密情報を更新してください。'; + } + + @override + String get community_addHashtagChannel => 'コミュニティのハッシュタグを追加'; + + @override + String get community_addHashtagChannelDesc => 'このコミュニティ用のハッシュタグチャンネルを追加する'; + + @override + String get community_selectCommunity => 'コミュニティを選択'; + + @override + String get community_regularHashtag => '定期的なハッシュタグ'; + + @override + String get community_regularHashtagDesc => '一般のハッシュタグ(誰でも参加可能)'; + + @override + String get community_communityHashtag => 'コミュニティ用ハッシュタグ'; + + @override + String get community_communityHashtagDesc => 'コミュニティメンバーのみへの限定'; + + @override + String community_forCommunity(String name) { + return '$name 様'; + } + + @override + String get listFilter_tooltip => 'フィルタリングと並べ替え'; + + @override + String get listFilter_sortBy => '並び替え'; + + @override + String get listFilter_latestMessages => '最新のメッセージ'; + + @override + String get listFilter_heardRecently => '最近、聞いた'; + + @override + String get listFilter_az => 'AからZ'; + + @override + String get listFilter_filters => 'フィルター'; + + @override + String get listFilter_all => 'すべて'; + + @override + String get listFilter_favorites => 'お気に入り'; + + @override + String get listFilter_addToFavorites => 'お気に入りに追加'; + + @override + String get listFilter_removeFromFavorites => 'お気に入りから削除'; + + @override + String get listFilter_users => '利用者'; + + @override + String get listFilter_repeaters => '繰り返し送信装置'; + + @override + String get listFilter_roomServers => 'ルーム用サーバー'; + + @override + String get listFilter_unreadOnly => '未読のみ'; + + @override + String get listFilter_newGroup => '新しいグループ'; + + @override + String get pathTrace_you => 'あなた'; + + @override + String get pathTrace_failed => 'パスの追跡に失敗しました。'; + + @override + String get pathTrace_notAvailable => 'パスの追跡機能は利用できません。'; + + @override + String get pathTrace_refreshTooltip => 'パスの追跡をリフレッシュする。'; + + @override + String get pathTrace_someHopsNoLocation => 'ホップの1つまたは複数について、場所が特定されていません。'; + + @override + String get pathTrace_clearTooltip => '明確な道筋。'; + + @override + String get losSelectStartEnd => 'LOS の開始ノードと終了ノードを選択してください。'; + + @override + String losRunFailed(String error) { + return '視界確認に失敗: $error'; + } + + @override + String get losClearAllPoints => 'すべての項目をクリア'; + + @override + String get losRunToViewElevationProfile => 'LOS(レーザー測距)を使用して、標高プロファイルを表示する'; + + @override + String get losMenuTitle => 'LOS メニュー'; + + @override + String get losMenuSubtitle => '特定の場所をタップするか、地図を長押ししてカスタムポイントを作成する。'; + + @override + String get losShowDisplayNodes => '表示ノードを表示する'; + + @override + String get losCustomPoints => 'カスタマイズ可能なポイント'; + + @override + String losCustomPointLabel(int index) { + return 'カスタマイズ $index'; + } + + @override + String get losPointA => 'ポイントA'; + + @override + String get losPointB => 'ポイントB'; + + @override + String losAntennaA(String value, String unit) { + return 'アンテナ A: $value $unit'; + } + + @override + String losAntennaB(String value, String unit) { + return 'アンテナ B: $value $unit'; + } + + @override + String get losRun => 'LOS(レーティングシステム)を使用する'; + + @override + String get losNoElevationData => '標高データは含まれていません'; + + @override + String losProfileClear( + String distance, + String distanceUnit, + String clearance, + String heightUnit, + ) { + return '$distance $distanceUnit, clear LOS, min clearance $clearance $heightUnit'; + } + + @override + String losProfileBlocked( + String distance, + String distanceUnit, + String obstruction, + String heightUnit, + ) { + return '$distance $distanceUnit, blocked by $obstruction $heightUnit'; + } + + @override + String get losStatusChecking => 'LOS:確認中…'; + + @override + String get losStatusNoData => 'LOS: データの欠如'; + + @override + String losStatusSummary(int clear, int total, int blocked, int unknown) { + return 'LOS: $clear/$total clear, $blocked blocked, $unknown unknown'; + } + + @override + String get losErrorElevationUnavailable => + 'あるサンプルまたは複数のサンプルについて、標高データが利用できません。'; + + @override + String get losErrorInvalidInput => 'LOS(レーダー)計算に必要な、無効な点/標高データ。'; + + @override + String get losRenameCustomPoint => 'カスタムポイントの名前を変更する'; + + @override + String get losPointName => '項目名'; + + @override + String get losShowPanelTooltip => 'LOSパネルを表示する'; + + @override + String get losHidePanelTooltip => 'LOSパネルを隠す'; + + @override + String get losElevationAttribution => '標高データ:Open-Meteo (CC BY 4.0)'; + + @override + String get losLegendRadioHorizon => 'ラジオ・ホライゾン'; + + @override + String get losLegendLosBeam => 'LOS ビーミング'; + + @override + String get losLegendTerrain => '地形'; + + @override + String get losFrequencyLabel => '周波数'; + + @override + String get losFrequencyInfoTooltip => '計算の詳細を見る'; + + @override + String get losFrequencyDialogTitle => 'ラジオによる水平線計算'; + + @override + String losFrequencyDialogDescription( + double baselineK, + double baselineFreq, + double frequencyMHz, + double kFactor, + ) { + return 'k=$baselineK ( $baselineFreq MHz) から開始し、現在の $frequencyMHz MHz の帯域に対して k の値を調整します。これにより、曲面状の無線通信範囲の限界が定義されます。'; + } + + @override + String get contacts_pathTrace => '経路追跡'; + + @override + String get contacts_ping => 'パング'; + + @override + String get contacts_repeaterPathTrace => 'リピーターまでの経路を追跡する'; + + @override + String get contacts_repeaterPing => 'PING 繰り返し'; + + @override + String get contacts_roomPathTrace => '部屋のサーバーへの経路を追跡する'; + + @override + String get contacts_roomPing => 'ピンルーム用サーバー'; + + @override + String get contacts_chatTraceRoute => '経路の追跡ルート'; + + @override + String contacts_pathTraceTo(String name) { + return '$name への経路を追跡する'; + } + + @override + String get contacts_clipboardEmpty => 'クリップボードは空です。'; + + @override + String get contacts_invalidAdvertFormat => '無効な連絡先情報'; + + @override + String get contacts_contactImported => '連絡先が登録されました。'; + + @override + String get contacts_contactImportFailed => '連絡先のインポートに失敗しました。'; + + @override + String get contacts_zeroHopAdvert => 'ゼロホップ広告'; + + @override + String get contacts_floodAdvert => '洪水に関する広告'; + + @override + String get contacts_copyAdvertToClipboard => '広告をクリップボードにコピー'; + + @override + String get contacts_addContactFromClipboard => 'クリップボードから連絡先を追加する'; + + @override + String get contacts_ShareContact => '連絡先をクリップボードにコピー'; + + @override + String get contacts_ShareContactZeroHop => '広告を通じて連絡先を共有する'; + + @override + String get contacts_zeroHopContactAdvertSent => '広告を通じて連絡先を得た。'; + + @override + String get contacts_zeroHopContactAdvertFailed => '連絡を送信できませんでした。'; + + @override + String get contacts_contactAdvertCopied => '広告がクリップボードにコピーされました。'; + + @override + String get contacts_contactAdvertCopyFailed => '広告のコピーがクリップボードにコピーできませんでした。'; + + @override + String get notification_activityTitle => 'メッシュコアの活動'; + + @override + String notification_messagesCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'messages', + one: 'message', + ); + return '$count $_temp0'; + } + + @override + String notification_channelMessagesCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'チャンネルメッセージ', + one: 'チャンネルメッセージ', + ); + return '$count $_temp0'; + } + + @override + String notification_newNodesCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '新しいノード', + one: '新しいノード', + ); + return '$count $_temp0'; + } + + @override + String notification_newTypeDiscovered(String contactType) { + return '新たに $contactType が発見されました'; + } + + @override + String get notification_receivedNewMessage => '新しいメッセージを受信'; + + @override + String get settings_gpxExportRepeaters => 'GPX へのエクスポート用リピーター/ルームサーバー'; + + @override + String get settings_gpxExportRepeatersSubtitle => + 'GPXファイルに場所情報を付加した、レピーター/ルームサーバーのエクスポート'; + + @override + String get settings_gpxExportContacts => 'GPX 形式へのエクスポート'; + + @override + String get settings_gpxExportContactsSubtitle => + 'GPXファイルに位置情報を保存して、他の人と共有する。'; + + @override + String get settings_gpxExportAll => 'すべての連絡先をGPX形式でエクスポートする'; + + @override + String get settings_gpxExportAllSubtitle => + 'すべての連絡先を、場所情報付きのGPXファイルにエクスポートする。'; + + @override + String get settings_gpxExportSuccess => 'GPXファイルの正常なエクスポートが完了しました。'; + + @override + String get settings_gpxExportNoContacts => 'エクスポートする連絡先は存在しません。'; + + @override + String get settings_gpxExportNotAvailable => 'このデバイス/OSではサポートされていません'; + + @override + String get settings_gpxExportError => 'エクスポート時にエラーが発生しました。'; + + @override + String get settings_gpxExportRepeatersRoom => '中継装置およびルームサーバーの設置場所'; + + @override + String get settings_gpxExportChat => '関連施設'; + + @override + String get settings_gpxExportAllContacts => 'すべての連絡先場所'; + + @override + String get settings_gpxExportShareText => 'meshcore-openからエクスポートされた地図データ'; + + @override + String get settings_gpxExportShareSubject => + 'meshcore-open GPX形式の地図データのエクスポート'; + + @override + String get snrIndicator_nearByRepeaters => '近くの電波中継局'; + + @override + String get snrIndicator_lastSeen => '最後に確認された場所'; + + @override + String get contactsSettings_title => '連絡先設定'; + + @override + String get contactsSettings_autoAddTitle => '自動検出'; + + @override + String get contactsSettings_otherTitle => 'その他の連絡に関する設定'; + + @override + String get contactsSettings_autoAddUsersTitle => '自動でユーザーを追加する'; + + @override + String get contactsSettings_autoAddUsersSubtitle => + '利用者が自動的に発見したユーザーを追加できるようにする。'; + + @override + String get contactsSettings_autoAddRepeatersTitle => '自動で繰り返し設定'; + + @override + String get contactsSettings_autoAddRepeatersSubtitle => + '発見した中継局を、自動的に追加できるようにする。'; + + @override + String get contactsSettings_autoAddRoomServersTitle => '自動でルームサーバーを追加'; + + @override + String get contactsSettings_autoAddRoomServersSubtitle => + '利用者が、発見した部屋のサーバーを自動的に追加できるようにする。'; + + @override + String get contactsSettings_autoAddSensorsTitle => '自動でセンサーを追加'; + + @override + String get contactsSettings_autoAddSensorsSubtitle => + '利用者が、発見したセンサーを自動的に追加できるようにする。'; + + @override + String get contactsSettings_overwriteOldestTitle => '最も古いものを上書きする'; + + @override + String get contactsSettings_overwriteOldestSubtitle => + '連絡先リストが満杯になった場合、最も古いかつ「お気に入り」ではない連絡先が削除されます。'; + + @override + String get discoveredContacts_Title => '連絡先が見つかった'; + + @override + String get discoveredContacts_noMatching => '一致する連絡先が見つかりませんでした'; + + @override + String get discoveredContacts_searchHint => '発見された連絡先を検索する'; + + @override + String get discoveredContacts_contactAdded => '連絡先を追加'; + + @override + String get discoveredContacts_addContact => '連絡先を追加'; + + @override + String get discoveredContacts_copyContact => '連絡先をクリップボードにコピー'; + + @override + String get discoveredContacts_deleteContact => '発見された連絡先を削除'; + + @override + String get discoveredContacts_deleteContactAll => '発見されたすべての連絡先を削除'; + + @override + String get discoveredContacts_deleteContactAllContent => + '本当に、見つけたすべての連絡先を削除してもよろしいですか?'; + + @override + String get chat_sendCooldown => '再度送信する前に、しばらくお待ちください。'; + + @override + String get appSettings_jumpToOldestUnread => '最も古い未読のメッセージへ移動'; + + @override + String get appSettings_jumpToOldestUnreadSubtitle => + '未読メッセージがあるチャットを開く際、「最新のメッセージ」ではなく、最初に未読のメッセージまでスクロールしてください。'; + + @override + String get appSettings_languageHu => 'ハンガリー語'; + + @override + String get appSettings_languageJa => '日本語'; + + @override + String get appSettings_languageKo => '韓国語'; + + @override + String get radioStats_tooltip => 'ラジオおよびメッシュに関する統計'; + + @override + String get radioStats_screenTitle => 'ラジオの統計'; + + @override + String get radioStats_notConnected => 'ラジオの統計情報を表示するために、デバイスに接続してください。'; + + @override + String get radioStats_firmwareTooOld => + 'ラジオの統計機能を使用するには、v8またはそれ以降のファームウェアが必要です。'; + + @override + String get radioStats_waiting => 'データ待ち…'; + + @override + String radioStats_noiseFloor(int noiseDbm) { + return 'ノイズレベル: $noiseDbm dBm'; + } + + @override + String radioStats_lastRssi(int rssiDbm) { + return '最後のRSSI: $rssiDbm dBm'; + } + + @override + String radioStats_lastSnr(String snr) { + return '最終SNR: $snr dB'; + } + + @override + String radioStats_txAir(int seconds) { + return 'TX 放送時間(合計):$seconds 秒'; + } + + @override + String radioStats_rxAir(int seconds) { + return 'RX 放送時間(合計):$seconds 秒'; + } + + @override + String get radioStats_chartCaption => '最近のサンプルのノイズレベル(dBm)。'; + + @override + String radioStats_stripNoise(int noiseDbm) { + return 'ノイズレベル: $noiseDbm dBm'; + } + + @override + String get radioStats_stripWaiting => 'ラジオの統計情報を取得中…'; + + @override + String get radioStats_settingsTile => 'ラジオの統計'; + + @override + String get radioStats_settingsSubtitle => 'ノイズレベル、RSSI、SNR、および通信時間'; +} diff --git a/lib/l10n/app_localizations_ko.dart b/lib/l10n/app_localizations_ko.dart new file mode 100644 index 0000000..57ee40a --- /dev/null +++ b/lib/l10n/app_localizations_ko.dart @@ -0,0 +1,3403 @@ +// ignore: unused_import +import 'package:intl/intl.dart' as intl; +import 'app_localizations.dart'; + +// ignore_for_file: type=lint + +/// The translations for Korean (`ko`). +class AppLocalizationsKo extends AppLocalizations { + AppLocalizationsKo([String locale = 'ko']) : super(locale); + + @override + String get appTitle => 'MeshCore Open'; + + @override + String get nav_contacts => '연락처'; + + @override + String get nav_channels => '채널'; + + @override + String get nav_map => '지도'; + + @override + String get common_cancel => '취소'; + + @override + String get common_ok => '알겠습니다'; + + @override + String get common_connect => '연결'; + + @override + String get common_unknownDevice => '알 수 없는 장치'; + + @override + String get common_save => '저장'; + + @override + String get common_delete => '삭제'; + + @override + String get common_deleteAll => '모두 삭제'; + + @override + String get common_close => '닫기'; + + @override + String get common_edit => '수정'; + + @override + String get common_add => '추가'; + + @override + String get common_settings => '설정'; + + @override + String get common_disconnect => '연결 해제'; + + @override + String get common_connected => '연결된'; + + @override + String get common_disconnected => '단절'; + + @override + String get common_create => '만들다'; + + @override + String get common_continue => '계속'; + + @override + String get common_share => '공유'; + + @override + String get common_copy => '복사'; + + @override + String get common_retry => '다시 시도'; + + @override + String get common_hide => '숨기다'; + + @override + String get common_remove => '제거'; + + @override + String get common_enable => '활성화'; + + @override + String get common_disable => '비활성화'; + + @override + String get common_reboot => '재부팅'; + + @override + String get common_loading => '로딩 중...'; + + @override + String get common_notAvailable => '—'; + + @override + String common_voltageValue(String volts) { + return '$volts V'; + } + + @override + String common_percentValue(int percent) { + return '$percent%'; + } + + @override + String get scanner_title => 'MeshCore 공개'; + + @override + String get connectionChoiceUsbLabel => 'USB'; + + @override + String get connectionChoiceBluetoothLabel => '블루투스'; + + @override + String get connectionChoiceTcpLabel => 'TCP'; + + @override + String get tcpScreenTitle => 'TCP를 통해 연결'; + + @override + String get tcpHostLabel => 'IP 주소'; + + @override + String get tcpHostHint => '192.168.40.10'; + + @override + String get tcpPortLabel => '항'; + + @override + String get tcpPortHint => '5000'; + + @override + String get tcpStatus_notConnected => '목적지 주소 입력 후 연결'; + + @override + String tcpStatus_connectingTo(String endpoint) { + return '$endpoint에 연결 중...'; + } + + @override + String get tcpErrorHostRequired => 'IP 주소가 필요합니다.'; + + @override + String get tcpErrorPortInvalid => '포트 번호는 1에서 65535 사이여야 합니다.'; + + @override + String get tcpErrorUnsupported => '이 플랫폼에서는 TCP 트랜스포트를 지원하지 않습니다.'; + + @override + String get tcpErrorTimedOut => 'TCP 연결이 시간 초과되었습니다.'; + + @override + String tcpConnectionFailed(String error) { + return 'TCP 연결 실패: $error'; + } + + @override + String get usbScreenTitle => 'USB를 통해 연결'; + + @override + String get usbScreenSubtitle => '감지된 시리얼 장치를 선택하고 MeshCore 노드에 직접 연결하십시오.'; + + @override + String get usbScreenStatus => 'USB 장치를 선택합니다.'; + + @override + String get usbScreenNote => 'USB 직렬 통신은 지원되는 안드로이드 장치 및 데스크톱 플랫폼에서 활성화됩니다.'; + + @override + String get usbScreenEmptyState => + 'USB 장치가 탐지되지 않았습니다. USB 장치를 연결하고 다시 시도해 보세요.'; + + @override + String get usbErrorPermissionDenied => 'USB 접근 권한이 거부되었습니다.'; + + @override + String get usbErrorDeviceMissing => '선택한 USB 장치는 더 이상 사용 불가능합니다.'; + + @override + String get usbErrorInvalidPort => '유효한 USB 장치를 선택하세요.'; + + @override + String get usbErrorBusy => '또 다른 USB 연결 요청이 이미 진행 중입니다.'; + + @override + String get usbErrorNotConnected => 'USB 장치가 연결되지 않았습니다.'; + + @override + String get usbErrorOpenFailed => '선택한 USB 장치를 열 수 없습니다.'; + + @override + String get usbErrorConnectFailed => '선택한 USB 장치에 연결에 실패했습니다.'; + + @override + String get usbErrorUnsupported => '이 플랫폼에서는 USB 직렬 통신을 지원하지 않습니다.'; + + @override + String get usbErrorAlreadyActive => 'USB 연결이 이미 활성화되어 있습니다.'; + + @override + String get usbErrorNoDeviceSelected => 'USB 장치가 선택되지 않았습니다.'; + + @override + String get usbErrorPortClosed => 'USB 연결이 활성화되지 않았습니다.'; + + @override + String get usbErrorConnectTimedOut => + '연결이 시간 초과되었습니다. 장치가 USB Companion 펌웨어를 가지고 있는지 확인해 주세요.'; + + @override + String get usbFallbackDeviceName => '웹 시리얼 장치'; + + @override + String get usbStatus_notConnected => 'USB 장치를 선택합니다.'; + + @override + String get usbStatus_connecting => 'USB 장치에 연결 중...'; + + @override + String get usbStatus_searching => 'USB 장치 검색 중...'; + + @override + String usbConnectionFailed(String error) { + return 'USB 연결 실패: $error'; + } + + @override + String get scanner_scanning => '장치 검색 중...'; + + @override + String get scanner_connecting => '연결 중...'; + + @override + String get scanner_disconnecting => '연결 해제 중...'; + + @override + String get scanner_notConnected => '연결되지 않음'; + + @override + String scanner_connectedTo(String deviceName) { + return '$deviceName에 연결됨'; + } + + @override + String get scanner_searchingDevices => 'MeshCore 장치를 검색 중...'; + + @override + String get scanner_tapToScan => 'MeshCore 장치를 찾기 위해 스캔 버튼을 누르세요.'; + + @override + String scanner_connectionFailed(String error) { + return '연결 실패: $error'; + } + + @override + String get scanner_stop => '멈춰'; + + @override + String get scanner_scan => '스캔'; + + @override + String get scanner_bluetoothOff => '블루투스는 꺼져 있습니다.'; + + @override + String get scanner_bluetoothOffMessage => '블루투스를 켜서 장치를 검색해주세요.'; + + @override + String get scanner_chromeRequired => '크롬 브라우저 필요'; + + @override + String get scanner_chromeRequiredMessage => + '이 웹 애플리케이션은 블루투드 지원을 위해 Google Chrome 또는 Chromium 기반 브라우저가 필요합니다.'; + + @override + String get scanner_enableBluetooth => '블루투스 활성화'; + + @override + String get device_quickSwitch => '빠른 전환'; + + @override + String get device_meshcore => '메쉬코어'; + + @override + String get settings_title => '설정'; + + @override + String get settings_deviceInfo => '장치 정보'; + + @override + String get settings_appSettings => '앱 설정'; + + @override + String get settings_appSettingsSubtitle => '알림, 메시징, 지도 설정'; + + @override + String get settings_nodeSettings => '노드 설정'; + + @override + String get settings_nodeName => '노드 이름'; + + @override + String get settings_nodeNameNotSet => '설정되지 않음'; + + @override + String get settings_nodeNameHint => '노드 이름을 입력하세요'; + + @override + String get settings_nodeNameUpdated => '이름 변경'; + + @override + String get settings_radioSettings => '라디오 설정'; + + @override + String get settings_radioSettingsSubtitle => '주파수, 전력, 스펙트럼'; + + @override + String get settings_radioSettingsUpdated => '라디오 설정이 업데이트되었습니다.'; + + @override + String get settings_location => '위치'; + + @override + String get settings_locationSubtitle => 'GPS 좌표'; + + @override + String get settings_locationUpdated => '위치 및 GPS 설정이 업데이트되었습니다.'; + + @override + String get settings_locationBothRequired => '위도와 경도를 모두 입력하세요.'; + + @override + String get settings_locationInvalid => '유효하지 않은 위도 또는 경도.'; + + @override + String get settings_locationGPSEnable => 'GPS 활성화'; + + @override + String get settings_locationGPSEnableSubtitle => + 'GPS를 사용하여 위치 정보를 자동으로 업데이트할 수 있도록 합니다.'; + + @override + String get settings_locationIntervalSec => 'GPS 간격 (초)'; + + @override + String get settings_locationIntervalInvalid => + '간격은 최소 60초 이상, 86400초 미만이어야 합니다.'; + + @override + String get settings_latitude => '위도'; + + @override + String get settings_longitude => '경도'; + + @override + String get settings_contactSettings => '연락처 설정'; + + @override + String get settings_contactSettingsSubtitle => '연락처 추가 방식 설정'; + + @override + String get settings_privacyMode => '개인 정보 보호 모드'; + + @override + String get settings_privacyModeSubtitle => '광고에 이름/위치 정보 숨기기'; + + @override + String get settings_privacyModeToggle => + '광고에 자신의 이름과 위치를 숨기기 위해 개인 정보 보호 모드를 켜거나 끄십시오.'; + + @override + String get settings_privacyModeEnabled => '개인 정보 보호 모드 활성화'; + + @override + String get settings_privacyModeDisabled => '개인 정보 보호 모드 비활성화'; + + @override + String get settings_privacy => '개인 정보 설정'; + + @override + String get settings_privacySubtitle => '어떤 정보를 공유할지 통제하세요.'; + + @override + String get settings_privacySettingsDescription => + '어떤 정보를 기기가 다른 사람들과 공유할지 선택하세요.'; + + @override + String get settings_denyAll => '모든 것을 부정'; + + @override + String get settings_allowByContact => '연락처 표시 기능 활성화'; + + @override + String get settings_allowAll => '모든 것을 허용'; + + @override + String get settings_telemetryBaseMode => '원격 모니터링 기본 설정'; + + @override + String get settings_telemetryLocationMode => '텔레메트리 위치 모드'; + + @override + String get settings_telemetryEnvironmentMode => '텔레메트리 환경 모드'; + + @override + String get settings_advertLocation => '광고 위치'; + + @override + String get settings_advertLocationSubtitle => '광고에 위치 정보를 포함하세요.'; + + @override + String settings_multiAck(String value) { + return '다중 ACK: $value'; + } + + @override + String get settings_telemetryModeUpdated => '텔레메트리 모드 업데이트 완료'; + + @override + String get settings_actions => '행동'; + + @override + String get settings_sendAdvertisement => '광고 전송'; + + @override + String get settings_sendAdvertisementSubtitle => '방송 활동'; + + @override + String get settings_advertisementSent => '광고 전송'; + + @override + String get settings_syncTime => '동기화 시간'; + + @override + String get settings_syncTimeSubtitle => '장치 시계를 휴대폰 시간으로 설정'; + + @override + String get settings_timeSynchronized => '시간 동기화'; + + @override + String get settings_refreshContacts => '연락처 갱신'; + + @override + String get settings_refreshContactsSubtitle => '장치에서 연락처 목록을 다시 불러오기'; + + @override + String get settings_rebootDevice => '장치 재부팅'; + + @override + String get settings_rebootDeviceSubtitle => 'MeshCore 장치를 재부팅하세요.'; + + @override + String get settings_rebootDeviceConfirm => + '정말로 장치를 재부팅하시겠습니까? 이 경우 연결이 끊어집니다.'; + + @override + String get settings_debug => '디버깅'; + + @override + String get settings_bleDebugLog => 'BLE 디버그 로그'; + + @override + String get settings_bleDebugLogSubtitle => 'BLE 명령어, 응답 및 원시 데이터'; + + @override + String get settings_appDebugLog => '앱 디버깅 로그'; + + @override + String get settings_appDebugLogSubtitle => '애플리케이션 디버깅 메시지'; + + @override + String get settings_about => '소개'; + + @override + String settings_aboutVersion(String version) { + return 'MeshCore Open $version 버전'; + } + + @override + String get settings_aboutLegalese => '2026년 MeshCore 오픈 소스 프로젝트'; + + @override + String get settings_aboutDescription => + 'MeshCore LoRa 메시 네트워크 장치를 위한 오픈 소스 Flutter 클라이언트.'; + + @override + String get settings_aboutOpenMeteoAttribution => + 'LOS 고도 데이터: Open-Meteo (CC BY 4.0)'; + + @override + String get settings_infoName => '이름'; + + @override + String get settings_infoId => 'ID'; + + @override + String get settings_infoStatus => '상태'; + + @override + String get settings_infoBattery => '배터리'; + + @override + String get settings_infoPublicKey => '공개 키'; + + @override + String get settings_infoContactsCount => '연락처 수'; + + @override + String get settings_infoChannelCount => '채널 수'; + + @override + String get settings_presets => '기본 설정'; + + @override + String get settings_frequency => '주파수 (MHz)'; + + @override + String get settings_frequencyHelper => '300.0 - 2500.0'; + + @override + String get settings_frequencyInvalid => '유효하지 않은 주파수 (300-2500 MHz)'; + + @override + String get settings_bandwidth => '대역폭'; + + @override + String get settings_spreadingFactor => '분산 계수'; + + @override + String get settings_codingRate => '코딩 속도'; + + @override + String get settings_txPower => 'TX 전력 (dBm)'; + + @override + String get settings_txPowerHelper => '0 - 22'; + + @override + String get settings_txPowerInvalid => '유효하지 않은 TX 전력 (0-22 dBm)'; + + @override + String get settings_clientRepeat => '오프그리드 반복'; + + @override + String get settings_clientRepeatSubtitle => + '이 장치가 다른 사람들을 위해 메시 패킷을 반복하도록 허용합니다.'; + + @override + String get settings_clientRepeatFreqWarning => + '오프그리드(무전력) 시스템 재연결에는 433MHz, 869MHz, 또는 918MHz 주파수가 필요합니다.'; + + @override + String settings_error(String message) { + return '오류: $message'; + } + + @override + String get appSettings_title => '앱 설정'; + + @override + String get appSettings_appearance => '외관'; + + @override + String get appSettings_theme => '주제'; + + @override + String get appSettings_themeSystem => '기본 설정'; + + @override + String get appSettings_themeLight => '빛'; + + @override + String get appSettings_themeDark => '어둡다'; + + @override + String get appSettings_language => '언어'; + + @override + String get appSettings_languageSystem => '기본 설정'; + + @override + String get appSettings_languageEn => '영어'; + + @override + String get appSettings_languageFr => '프랑스어'; + + @override + String get appSettings_languageEs => '스페인어'; + + @override + String get appSettings_languageDe => '독일어'; + + @override + String get appSettings_languagePl => '폴란드'; + + @override + String get appSettings_languageSl => '슬로베니아어'; + + @override + String get appSettings_languagePt => '포르투갈어'; + + @override + String get appSettings_languageIt => '이탈리아어'; + + @override + String get appSettings_languageZh => '중국어'; + + @override + String get appSettings_languageSv => '스웨덴어'; + + @override + String get appSettings_languageNl => '네덜란드어'; + + @override + String get appSettings_languageSk => '슬로베니아어'; + + @override + String get appSettings_languageBg => '불가리'; + + @override + String get appSettings_languageRu => '러시아어'; + + @override + String get appSettings_languageUk => '우크라이나'; + + @override + String get appSettings_enableMessageTracing => '메시지 추적 기능 활성화'; + + @override + String get appSettings_enableMessageTracingSubtitle => + '메시지에 대한 상세한 경로 및 시간 정보를 표시'; + + @override + String get appSettings_notifications => '알림'; + + @override + String get appSettings_enableNotifications => '알림 활성화'; + + @override + String get appSettings_enableNotificationsSubtitle => '메시지와 광고에 대한 알림을 받으세요.'; + + @override + String get appSettings_notificationPermissionDenied => '알림 권한 거부'; + + @override + String get appSettings_notificationsEnabled => '알림 기능 활성화'; + + @override + String get appSettings_notificationsDisabled => '알림 기능 끄기'; + + @override + String get appSettings_messageNotifications => '메시지 알림'; + + @override + String get appSettings_messageNotificationsSubtitle => '새로운 메시지를 받을 때 알림 표시'; + + @override + String get appSettings_channelMessageNotifications => '채널 메시지 알림'; + + @override + String get appSettings_channelMessageNotificationsSubtitle => + '채널 메시지를 수신할 때 알림 표시'; + + @override + String get appSettings_advertisementNotifications => '광고 알림'; + + @override + String get appSettings_advertisementNotificationsSubtitle => + '새 노드가 발견되었을 때 알림 표시'; + + @override + String get appSettings_messaging => '메시징'; + + @override + String get appSettings_clearPathOnMaxRetry => 'Max 재시도 시 경로 명확하게 설정'; + + @override + String get appSettings_clearPathOnMaxRetrySubtitle => + '5번의 전송 시도가 실패하면 연락 경로를 재설정'; + + @override + String get appSettings_pathsWillBeCleared => '5번의 시도 실패 후, 해당 경로가 확보될 것입니다.'; + + @override + String get appSettings_pathsWillNotBeCleared => '경로는 자동으로 정리되지 않습니다.'; + + @override + String get appSettings_autoRouteRotation => '자동 경로 순환'; + + @override + String get appSettings_autoRouteRotationSubtitle => '최적 경로와 방수 모드 사이를 전환'; + + @override + String get appSettings_autoRouteRotationEnabled => '자동 경로 순환 기능 활성화'; + + @override + String get appSettings_autoRouteRotationDisabled => '자동 경로 순환 기능 비활성화'; + + @override + String get appSettings_maxRouteWeight => '최대 경로 무게'; + + @override + String get appSettings_maxRouteWeightSubtitle => + '한 경로가 성공적인 배송을 통해 누적할 수 있는 최대 무게'; + + @override + String get appSettings_initialRouteWeight => '초기 경로 가중치'; + + @override + String get appSettings_initialRouteWeightSubtitle => '새롭게 발견된 경로의 초기 무게'; + + @override + String get appSettings_routeWeightSuccessIncrement => '성공 횟수 증가'; + + @override + String get appSettings_routeWeightSuccessIncrementSubtitle => + '성공적으로 배송된 경로에 추가된 무게'; + + @override + String get appSettings_routeWeightFailureDecrement => '오류 가중치 감소'; + + @override + String get appSettings_routeWeightFailureDecrementSubtitle => + '배송 실패 후 경로에서 제거된 무게'; + + @override + String get appSettings_maxMessageRetries => '최대 메시지 재시도 횟수'; + + @override + String get appSettings_maxMessageRetriesSubtitle => '메시지를 실패로 처리하기 전 시도 횟수'; + + @override + String path_routeWeight(String weight, String max) { + return '$weight/$max'; + } + + @override + String get appSettings_battery => '배터리'; + + @override + String get appSettings_batteryChemistry => '배터리 화학'; + + @override + String appSettings_batteryChemistryPerDevice(String deviceName) { + return '$deviceName 당분간'; + } + + @override + String get appSettings_batteryChemistryConnectFirst => '장치를 선택하기 위해 연결'; + + @override + String get appSettings_batteryNmc => '18650 NMC (3.0-4.2V)'; + + @override + String get appSettings_batteryLifepo4 => 'LiFePO4 (2.6-3.65V)'; + + @override + String get appSettings_batteryLipo => '리튬 폴리머 (3.0-4.2V)'; + + @override + String get appSettings_mapDisplay => '지도 표시'; + + @override + String get appSettings_showRepeaters => '반복 기능 표시'; + + @override + String get appSettings_showRepeatersSubtitle => '지도에 반복자 노드를 표시'; + + @override + String get appSettings_showChatNodes => '채팅 노드 표시'; + + @override + String get appSettings_showChatNodesSubtitle => '지도에 채팅 노드를 표시'; + + @override + String get appSettings_showOtherNodes => '다른 노드 표시'; + + @override + String get appSettings_showOtherNodesSubtitle => '지도에서 다른 노드 유형을 표시'; + + @override + String get appSettings_timeFilter => '시간 필터'; + + @override + String get appSettings_timeFilterShowAll => '모든 노드 표시'; + + @override + String appSettings_timeFilterShowLast(int hours) { + return '지난 $hours 시간 동안의 노드 표시'; + } + + @override + String get appSettings_mapTimeFilter => '지도 필터'; + + @override + String get appSettings_showNodesDiscoveredWithin => '다음 내역에서 발견된 노드 표시:'; + + @override + String get appSettings_allTime => '모든 시간'; + + @override + String get appSettings_lastHour => '지난 시간'; + + @override + String get appSettings_last6Hours => '지난 6시간'; + + @override + String get appSettings_last24Hours => '지난 24시간'; + + @override + String get appSettings_lastWeek => '지난 주'; + + @override + String get appSettings_offlineMapCache => '오프라인 지도 캐시'; + + @override + String get appSettings_unitsTitle => '단위'; + + @override + String get appSettings_unitsMetric => '단위 (m / km)'; + + @override + String get appSettings_unitsImperial => '제국 (피트/마일)'; + + @override + String get appSettings_noAreaSelected => '선택된 영역 없음'; + + @override + String appSettings_areaSelectedZoom(int minZoom, int maxZoom) { + return '선택된 영역 (줌 레벨: $minZoom - $maxZoom)'; + } + + @override + String get appSettings_debugCard => '디버깅'; + + @override + String get appSettings_appDebugLogging => '앱 디버깅 로깅'; + + @override + String get appSettings_appDebugLoggingSubtitle => '로그 앱 디버깅 메시지 (문제 해결을 위한)'; + + @override + String get appSettings_appDebugLoggingEnabled => '앱 디버깅 로깅 활성화'; + + @override + String get appSettings_appDebugLoggingDisabled => '앱 디버깅 로깅 비활성화'; + + @override + String get contacts_title => '연락처'; + + @override + String get contacts_noContacts => '아직 연락처는 없습니다.'; + + @override + String get contacts_contactsWillAppear => '장치가 광고를 할 때, 연락처 정보가 표시됩니다.'; + + @override + String get contacts_unread => '읽지 않음'; + + @override + String get contacts_searchContactsNoNumber => '연락처 검색...'; + + @override + String contacts_searchContacts(int number, String str) { + return '$number $str 연락처 검색...'; + } + + @override + String contacts_searchFavorites(int number, String str) { + return '$number $str 검색 결과 보기...'; + } + + @override + String contacts_searchUsers(int number, String str) { + return '$number $str 사용자 검색...'; + } + + @override + String contacts_searchRepeaters(int number, String str) { + return '$number $str 검색 결과 반복기 검색'; + } + + @override + String contacts_searchRoomServers(int number, String str) { + return '$number $str 방 서버 검색'; + } + + @override + String get contacts_noUnreadContacts => '읽지 않은 연락처가 없습니다.'; + + @override + String get contacts_noContactsFound => '연락처 또는 그룹이 검색되지 않았습니다.'; + + @override + String get contacts_deleteContact => '연락처 삭제'; + + @override + String contacts_removeConfirm(String contactName) { + return '$contactName를 연락처 목록에서 제거하시겠습니까?'; + } + + @override + String get contacts_manageRepeater => '리피터 관리'; + + @override + String get contacts_manageRoom => '방 서버 관리'; + + @override + String get contacts_roomLogin => '방 서버 로그인'; + + @override + String get contacts_openChat => '자유로운 대화'; + + @override + String get contacts_editGroup => '편집 그룹'; + + @override + String get contacts_deleteGroup => '그룹 삭제'; + + @override + String contacts_deleteGroupConfirm(String groupName) { + return '$groupName 삭제?'; + } + + @override + String get contacts_newGroup => '새로운 그룹'; + + @override + String get contacts_groupName => '그룹 이름'; + + @override + String get contacts_groupNameRequired => '그룹 이름이 필요합니다'; + + @override + String get contacts_groupNameReserved => '이 그룹 이름은 이미 사용 중입니다.'; + + @override + String contacts_groupAlreadyExists(String name) { + return '그룹 \"$name\"은 이미 존재합니다.'; + } + + @override + String get contacts_filterContacts => '연락처 필터링...'; + + @override + String get contacts_noContactsMatchFilter => '입력하신 검색 조건과 일치하는 연락처가 없습니다.'; + + @override + String get contacts_noMembers => '회원 없음'; + + @override + String get contacts_lastSeenNow => '최근'; + + @override + String contacts_lastSeenMinsAgo(int minutes) { + return '~ $minutes min.'; + } + + @override + String get contacts_lastSeenHourAgo => '약 1시간'; + + @override + String contacts_lastSeenHoursAgo(int hours) { + return '~ $hours hours'; + } + + @override + String get contacts_lastSeenDayAgo => '~ 1일'; + + @override + String contacts_lastSeenDaysAgo(int days) { + return '~ $days일'; + } + + @override + String get contact_info => '연락처'; + + @override + String get contact_settings => '연락처 설정'; + + @override + String get contact_telemetry => '텔레메트리'; + + @override + String get contact_lastSeen => '마지막으로 목격'; + + @override + String get contact_clearChat => '명확한 대화'; + + @override + String get contact_teleBase => '텔레메트리 기반'; + + @override + String get contact_teleBaseSubtitle => '배터리 잔량 및 기본적인 통신 데이터를 공유할 수 있도록 허용'; + + @override + String get contact_teleLoc => '텔레메트리 위치'; + + @override + String get contact_teleLocSubtitle => '위치 정보 공유 허용'; + + @override + String get contact_teleEnv => '텔레메트리 환경'; + + @override + String get contact_teleEnvSubtitle => '환경 센서 데이터를 공유하도록 허용'; + + @override + String get channels_title => '채널'; + + @override + String get channels_noChannelsConfigured => '구성된 채널이 없습니다.'; + + @override + String get channels_addPublicChannel => '공개 채널 추가'; + + @override + String get channels_searchChannels => '검색 채널...'; + + @override + String get channels_noChannelsFound => '채널을 찾을 수 없습니다.'; + + @override + String channels_channelIndex(int index) { + return '채널 $index'; + } + + @override + String get channels_hashtagChannel => '해시태그 채널'; + + @override + String get channels_public => '대중의'; + + @override + String get channels_private => '사립'; + + @override + String get channels_publicChannel => '공개 채널'; + + @override + String get channels_privateChannel => '개인 채널'; + + @override + String get channels_editChannel => '채널 편집'; + + @override + String get channels_muteChannel => '음소거 채널'; + + @override + String get channels_unmuteChannel => '채널 음소거 해제'; + + @override + String get channels_deleteChannel => '채널 삭제'; + + @override + String channels_deleteChannelConfirm(String name) { + return '$name 삭제하시겠습니까? 이 작업은 취소할 수 없습니다.'; + } + + @override + String channels_channelDeleteFailed(String name) { + return '채널 \"$name\" 삭제에 실패했습니다.'; + } + + @override + String channels_channelDeleted(String name) { + return '채널 \"$name\" 삭제'; + } + + @override + String get channels_addChannel => '채널 추가'; + + @override + String get channels_channelIndexLabel => '채널 인덱스'; + + @override + String get channels_channelName => '채널 이름'; + + @override + String get channels_usePublicChannel => '공개 채널 사용'; + + @override + String get channels_standardPublicPsk => '표준 공공 PSK'; + + @override + String get channels_pskHex => 'PSK (헥스)'; + + @override + String get channels_generateRandomPsk => '임의의 PSK 생성'; + + @override + String get channels_enterChannelName => '채널 이름을 입력해 주세요.'; + + @override + String get channels_pskMustBe32Hex => 'PSK(개인식별키)는 32자리 16진수 문자여야 합니다.'; + + @override + String channels_channelAdded(String name) { + return '채널 \"$name\" 추가'; + } + + @override + String channels_editChannelTitle(int index) { + return '채널 $index 편집'; + } + + @override + String get channels_smazCompression => 'SMAZ 압축'; + + @override + String channels_channelUpdated(String name) { + return '채널 \"$name\"이 업데이트되었습니다.'; + } + + @override + String get channels_publicChannelAdded => '공개 채널 추가'; + + @override + String get channels_sortBy => '정렬 기준 선택'; + + @override + String get channels_sortManual => '사용 설명서'; + + @override + String get channels_sortAZ => 'A부터 Z까지'; + + @override + String get channels_sortLatestMessages => '최신 메시지'; + + @override + String get channels_sortUnread => '읽지 않음'; + + @override + String get channels_createPrivateChannel => '개인 채널 만들기'; + + @override + String get channels_createPrivateChannelDesc => '비밀 키로 암호화되어 있습니다.'; + + @override + String get channels_joinPrivateChannel => '개인 채널에 참여하기'; + + @override + String get channels_joinPrivateChannelDesc => '비밀 키를 수동으로 입력합니다.'; + + @override + String get channels_joinPublicChannel => '공개 채널에 참여하세요'; + + @override + String get channels_joinPublicChannelDesc => '누구나 이 채널에 참여할 수 있습니다.'; + + @override + String get channels_joinHashtagChannel => '해시태그 채널에 참여하세요'; + + @override + String get channels_joinHashtagChannelDesc => '누구나 해시태그 채널에 참여할 수 있습니다.'; + + @override + String get channels_scanQrCode => 'QR 코드를 스캔'; + + @override + String get channels_scanQrCodeComingSoon => '곧 출시'; + + @override + String get channels_enterHashtag => '해시태그 입력'; + + @override + String get channels_hashtagHint => '예: #팀'; + + @override + String get chat_noMessages => '아직 메시지가 없습니다.'; + + @override + String get chat_sendMessageToStart => '시작하려면 메시지를 보내세요.'; + + @override + String get chat_originalMessageNotFound => '원래 메시지를 찾을 수 없음'; + + @override + String chat_replyingTo(String name) { + return '$name에게 답변'; + } + + @override + String chat_replyTo(String name) { + return '$name님께 회신'; + } + + @override + String get chat_location => '위치'; + + @override + String chat_sendMessageTo(String contactName) { + return '$contactName에게 메시지를 보내'; + } + + @override + String get chat_typeMessage => '메시지를 입력하세요...'; + + @override + String chat_messageTooLong(int maxBytes) { + return '메시지가 너무 길어서 (최대 $maxBytes 바이트).'; + } + + @override + String get chat_messageCopied => '메시지가 복사되었습니다'; + + @override + String get chat_messageDeleted => '메시지가 삭제되었습니다.'; + + @override + String get chat_retryingMessage => '재시도 메시지'; + + @override + String chat_retryCount(int current, int max) { + return '$current/$max 시도'; + } + + @override + String get chat_sendGif => 'GIF 보내기'; + + @override + String get chat_reply => '답변'; + + @override + String get chat_addReaction => '댓글 추가'; + + @override + String get chat_me => '나'; + + @override + String get emojiCategorySmileys => '이모티콘'; + + @override + String get emojiCategoryGestures => '제스처'; + + @override + String get emojiCategoryHearts => '심장'; + + @override + String get emojiCategoryObjects => '대상'; + + @override + String get gifPicker_title => 'GIF 선택'; + + @override + String get gifPicker_searchHint => 'GIF 검색...'; + + @override + String get gifPicker_poweredBy => 'GIPHY에서 제공'; + + @override + String get gifPicker_noGifsFound => 'GIF 파일이 없습니다.'; + + @override + String get gifPicker_failedLoad => 'GIF 파일 로딩 실패'; + + @override + String get gifPicker_failedSearch => 'GIF 검색에 실패했습니다.'; + + @override + String get gifPicker_noInternet => '인터넷 연결 없음'; + + @override + String get debugLog_appTitle => '앱 디버깅 로그'; + + @override + String get debugLog_bleTitle => 'BLE 디버그 로그'; + + @override + String get debugLog_copyLog => '로그 기록'; + + @override + String get debugLog_clearLog => '명확한 로그'; + + @override + String get debugLog_copied => '디버깅 로그 복사'; + + @override + String get debugLog_bleCopied => 'BLE 로그 복사'; + + @override + String get debugLog_noEntries => '현재 디버깅 로그는 생성되지 않았습니다.'; + + @override + String get debugLog_enableInSettings => '설정에서 앱 디버깅 로깅을 활성화합니다.'; + + @override + String get debugLog_frames => '프레임'; + + @override + String get debugLog_rawLogRx => '원시 로그-RX'; + + @override + String get debugLog_noBleActivity => '현재 BLE 관련 활동은 없습니다.'; + + @override + String debugFrame_length(int count) { + return '프레임 길이: $count 바이트'; + } + + @override + String debugFrame_command(String value) { + return '명령: 0x$value'; + } + + @override + String get debugFrame_textMessageHeader => '텍스트 메시지 프레임:'; + + @override + String debugFrame_destinationPubKey(String pubKey) { + return '- 목적지 공개 키: $pubKey'; + } + + @override + String debugFrame_timestamp(int timestamp) { + return '- 시간: $timestamp'; + } + + @override + String debugFrame_flags(String value) { + return '- 플래그: 0x$value'; + } + + @override + String debugFrame_textType(int type, String label) { + return '- 텍스트 유형: $type ($label)'; + } + + @override + String get debugFrame_textTypeCli => '명령줄 인터페이스 (CLI)'; + + @override + String get debugFrame_textTypePlain => '단순한'; + + @override + String debugFrame_text(String text) { + return '- 텍스트: \"$text\"'; + } + + @override + String get debugFrame_hexDump => '헥스 덤프:'; + + @override + String get chat_pathManagement => '경로 관리'; + + @override + String get chat_ShowAllPaths => '모든 경로 표시'; + + @override + String get chat_routingMode => '라우팅 방식'; + + @override + String get chat_autoUseSavedPath => '자동 (저장된 경로 사용)'; + + @override + String get chat_forceFloodMode => '강수 모드 활성화'; + + @override + String get chat_recentAckPaths => '최근 사용한 ACK 경로 (사용하려면 탭):'; + + @override + String get chat_pathHistoryFull => + '이력 기록은 이미 가득 차 있습니다. 항목을 삭제하여 새로운 항목을 추가할 수 있습니다.'; + + @override + String get chat_hopSingular => '점프'; + + @override + String get chat_hopPlural => '홉'; + + @override + String chat_hopsCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '홉', + one: '홉', + ); + return '$count $_temp0'; + } + + @override + String get chat_successes => '성공 사례'; + + @override + String get chat_removePath => '경로 제거'; + + @override + String get chat_noPathHistoryYet => '아직 경로 기록이 없습니다.\n경로를 찾기 위해 메시지를 보내세요.'; + + @override + String get chat_pathActions => '경로 작업:'; + + @override + String get chat_setCustomPath => '사용자 지정 경로 설정'; + + @override + String get chat_setCustomPathSubtitle => '수동으로 경로를 지정'; + + @override + String get chat_clearPath => '명확한 길'; + + @override + String get chat_clearPathSubtitle => '다음 전송 시, 강제 재전송 설정'; + + @override + String get chat_pathCleared => '경로가 확보되었습니다. 다음 메시지는 경로를 다시 찾을 것입니다.'; + + @override + String get chat_floodModeSubtitle => '앱 바에서 라우팅 스위치를 사용'; + + @override + String get chat_floodModeEnabled => + '홍수 모드 활성화됨. 앱 바의 경로 아이콘을 사용하여 다시 전환할 수 있습니다.'; + + @override + String get chat_fullPath => '전체 경로'; + + @override + String get chat_pathDetailsNotAvailable => + '경로 정보는 아직 제공되지 않습니다. 메시지를 보내어 다시 시도해 보세요.'; + + @override + String chat_pathSetHops(int hopCount, String status) { + String _temp0 = intl.Intl.pluralLogic( + hopCount, + locale: localeName, + other: 'hops', + one: 'hop', + ); + return 'Path set: $hopCount $_temp0 - $status'; + } + + @override + String get chat_pathSavedLocally => '로컬에 저장. 동기화 연결'; + + @override + String get chat_pathDeviceConfirmed => '장치 확인 완료.'; + + @override + String get chat_pathDeviceNotConfirmed => '기기가 아직 확인되지 않았습니다.'; + + @override + String get chat_type => '종류'; + + @override + String get chat_path => '경로'; + + @override + String get chat_publicKey => '공개 키'; + + @override + String get chat_compressOutgoingMessages => '전송되는 메시지 압축'; + + @override + String get chat_floodForced => '홍수 (강제)'; + + @override + String get chat_directForced => '직접적인 (강제적인)'; + + @override + String chat_hopsForced(int count) { + return '$count번 띄우기 (강제)'; + } + + @override + String get chat_floodAuto => '홍수 (자동)'; + + @override + String get chat_direct => '직접'; + + @override + String get chat_poiShared => '공유된 POI'; + + @override + String chat_unread(int count) { + return '읽지 않음: $count'; + } + + @override + String get chat_openLink => '링크를 열기?'; + + @override + String get chat_openLinkConfirmation => '이 링크를 브라우저에서 열고 싶으신가요?'; + + @override + String get chat_open => '열기'; + + @override + String chat_couldNotOpenLink(String url) { + return '링크를 열 수 없습니다: $url'; + } + + @override + String get chat_invalidLink => '유효하지 않은 링크 형식'; + + @override + String get map_title => '노드 매핑'; + + @override + String get map_lineOfSight => '시야'; + + @override + String get map_losScreenTitle => '시야'; + + @override + String get map_noNodesWithLocation => '위치 정보가 있는 노드가 없습니다.'; + + @override + String get map_nodesNeedGps => '노드는 지도에 표시되려면 GPS 좌표를 공유해야 합니다.'; + + @override + String map_nodesCount(int count) { + return '노드: $count'; + } + + @override + String map_pinsCount(int count) { + return '핀: $count'; + } + + @override + String get map_chat => '채팅'; + + @override + String get map_repeater => '반복기'; + + @override + String get map_room => '방'; + + @override + String get map_sensor => '센서'; + + @override + String get map_pinDm => '핀 (DM)'; + + @override + String get map_pinPrivate => '개인 계정'; + + @override + String get map_pinPublic => '공개 (일반 공개)'; + + @override + String get map_lastSeen => '마지막으로 목격'; + + @override + String get map_disconnectConfirm => '이 장치와의 연결을 해제하시겠습니까?'; + + @override + String get map_from => '~부터'; + + @override + String get map_source => '출처'; + + @override + String get map_flags => '깃발'; + + @override + String get map_shareMarkerHere => '여기에서 마커 공유'; + + @override + String get map_setAsMyLocation => '내 위치로 설정'; + + @override + String get map_pinLabel => '핀 라벨'; + + @override + String get map_label => '레이블'; + + @override + String get map_pointOfInterest => '관심 지점'; + + @override + String get map_sendToContact => '연락처로 보내기'; + + @override + String get map_sendToChannel => '채널로 전송'; + + @override + String get map_noChannelsAvailable => '사용 가능한 채널이 없습니다.'; + + @override + String get map_publicLocationShare => '공개 장소 공유'; + + @override + String map_publicLocationShareConfirm(String channelLabel) { + return '현재 $channelLabel 채널에서 위치 정보를 공유하려고 합니다. 이 채널은 공개되어 있으며, PSK를 가진 모든 사용자가 이 위치 정보를 볼 수 있습니다.'; + } + + @override + String get map_connectToShareMarkers => '장치를 연결하여 마커를 공유'; + + @override + String get map_filterNodes => '필터 노드'; + + @override + String get map_nodeTypes => '노드 유형'; + + @override + String get map_chatNodes => '채팅 노드'; + + @override + String get map_repeaters => '다시 보내는 장치'; + + @override + String get map_otherNodes => '다른 노드'; + + @override + String get map_showOverlaps => '반복 키 중복'; + + @override + String get map_keyPrefix => '핵심 접두사'; + + @override + String get map_filterByKeyPrefix => '주요 접두사 기준으로 필터링'; + + @override + String get map_publicKeyPrefix => '공개 키 접두사'; + + @override + String get map_markers => '마커'; + + @override + String get map_showSharedMarkers => '공통 마커 표시'; + + @override + String get map_showGuessedLocations => '추정된 노드 위치 표시'; + + @override + String get map_showDiscoveryContacts => '디스커버리 담당자 연락처 보기'; + + @override + String get map_guessedLocation => '추측된 위치'; + + @override + String get map_lastSeenTime => '마지막으로 확인된 시간'; + + @override + String get map_sharedPin => '공유 비밀번호'; + + @override + String get map_joinRoom => '방에 참여'; + + @override + String get map_manageRepeater => '리피터 관리'; + + @override + String get map_tapToAdd => '노드에 클릭하여 경로에 추가합니다.'; + + @override + String get map_runTrace => '경로 추적'; + + @override + String get map_runTraceWithReturnPath => '원래 경로로 돌아가세요.'; + + @override + String get map_removeLast => '마지막 항목 삭제'; + + @override + String get map_pathTraceCancelled => '경로 추적 기능이 취소되었습니다.'; + + @override + String get mapCache_title => '오프라인 지도 캐시'; + + @override + String get mapCache_selectAreaFirst => '캐시할 영역을 먼저 선택하세요'; + + @override + String get mapCache_noTilesToDownload => '이 지역에 다운로드할 타일이 없습니다.'; + + @override + String get mapCache_downloadTilesTitle => '타일 다운로드'; + + @override + String mapCache_downloadTilesPrompt(int count) { + return '$count개의 타일을 오프라인 사용을 위해 다운로드하시겠습니까?'; + } + + @override + String get mapCache_downloadAction => '다운로드'; + + @override + String mapCache_cachedTiles(int count) { + return '$count 개의 타일 캐시'; + } + + @override + String mapCache_cachedTilesWithFailed(int downloaded, int failed) { + return 'Cached $downloaded tiles ($failed failed)'; + } + + @override + String get mapCache_clearOfflineCacheTitle => '오프라인 캐시 삭제'; + + @override + String get mapCache_clearOfflineCachePrompt => '모든 캐시된 지도 템플릿을 삭제하시겠습니까?'; + + @override + String get mapCache_offlineCacheCleared => '오프라인 캐시 삭제'; + + @override + String get mapCache_noAreaSelected => '선택된 영역 없음'; + + @override + String get mapCache_cacheArea => '캐시 영역'; + + @override + String get mapCache_useCurrentView => '현재 보기 유지'; + + @override + String get mapCache_zoomRange => '줌 기능 범위'; + + @override + String mapCache_estimatedTiles(int count) { + return '예상되는 타일 개수: $count'; + } + + @override + String mapCache_downloadedTiles(int completed, int total) { + return 'Downloaded $completed / $total'; + } + + @override + String get mapCache_downloadTilesButton => '타일 다운로드'; + + @override + String get mapCache_clearCacheButton => '캐시 삭제'; + + @override + String mapCache_failedDownloads(int count) { + return '실패한 다운로드: $count'; + } + + @override + String mapCache_boundsLabel( + String north, + String south, + String east, + String west, + ) { + return 'N $north, S $south, E $east, W $west'; + } + + @override + String get time_justNow => '방금'; + + @override + String time_minutesAgo(int minutes) { + return '$minutes분 전'; + } + + @override + String time_hoursAgo(int hours) { + return '${hours}h ago'; + } + + @override + String time_daysAgo(int days) { + return '$days일 전'; + } + + @override + String get time_hour => '시간'; + + @override + String get time_hours => '시간'; + + @override + String get time_day => '하루'; + + @override + String get time_days => '일'; + + @override + String get time_week => '주'; + + @override + String get time_weeks => '몇 주'; + + @override + String get time_month => '달'; + + @override + String get time_months => '개월'; + + @override + String get time_minutes => '분'; + + @override + String get time_allTime => '모든 시간'; + + @override + String get dialog_disconnect => '연결 해제'; + + @override + String get dialog_disconnectConfirm => '이 장치와의 연결을 해제하시겠습니까?'; + + @override + String get login_repeaterLogin => '다시 로그인'; + + @override + String get login_roomLogin => '방 서버 로그인'; + + @override + String get login_password => '비밀번호'; + + @override + String get login_enterPassword => '비밀번호를 입력하세요'; + + @override + String get login_savePassword => '비밀번호 저장'; + + @override + String get login_savePasswordSubtitle => '비밀번호는 이 장치에 안전하게 저장됩니다.'; + + @override + String get login_repeaterDescription => '반복기 비밀번호를 입력하여 설정 및 상태를 확인하십시오.'; + + @override + String get login_roomDescription => '설정 및 상태에 액세스하려면 방 비밀번호를 입력하세요.'; + + @override + String get login_routing => '라우팅'; + + @override + String get login_routingMode => '라우팅 모드'; + + @override + String get login_autoUseSavedPath => '자동 (저장된 경로 사용)'; + + @override + String get login_forceFloodMode => '강수 모드 활성화'; + + @override + String get login_managePaths => '경로 관리'; + + @override + String get login_login => '로그인'; + + @override + String login_attempt(int current, int max) { + return '시도 $current/$max'; + } + + @override + String login_failed(String error) { + return '로그인 실패: $error'; + } + + @override + String get login_failedMessage => + '로그인에 실패했습니다. 비밀번호가 잘못되었거나, 연결이 되지 않는 것 같습니다.'; + + @override + String get common_reload => '다시 로드'; + + @override + String get common_clear => '명확하게'; + + @override + String path_currentPath(String path) { + return '현재 경로: $path'; + } + + @override + String path_usingHopsPath(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: 'hops', + one: 'hop', + ); + return 'Using $count $_temp0 path'; + } + + @override + String get path_enterCustomPath => '사용자 지정 경로 입력'; + + @override + String get path_currentPathLabel => '현재 경로'; + + @override + String get path_hexPrefixInstructions => + '각 단계에 대한 2자리 헥사데진 접두사를 쉼표로 구분하여 입력하세요.'; + + @override + String get path_hexPrefixExample => + '예시: A1, F2, 3C (각 노드는 자신의 공개 키의 첫 번째 바이트를 사용)'; + + @override + String get path_labelHexPrefixes => '경로 (헥스 접두사)'; + + @override + String get path_helperMaxHops => + '최대 64개의 홉. 각 접두사는 2개의 16진수 문자(1바이트)로 구성됩니다.'; + + @override + String get path_selectFromContacts => '또 연락처 목록에서 선택:'; + + @override + String get path_noRepeatersFound => '반복 장치 또는 서버는 찾을 수 없습니다.'; + + @override + String get path_customPathsRequire => + '사용자 정의 경로에는 메시지를 전달할 수 있는 중간 경로가 필요합니다.'; + + @override + String path_invalidHexPrefixes(String prefixes) { + return '유효하지 않은 16진수 접두사: $prefixes'; + } + + @override + String get path_tooLong => '경로가 너무 길어. 최대 64개의 연결만 허용됩니다.'; + + @override + String get path_setPath => '경로 설정'; + + @override + String get repeater_management => '리피터 관리'; + + @override + String get room_management => '방 서버 관리'; + + @override + String get repeater_managementTools => '관리 도구'; + + @override + String get repeater_status => '상태'; + + @override + String get repeater_statusSubtitle => '반복 장비의 상태, 통계, 및 이웃 장비 목록 보기'; + + @override + String get repeater_telemetry => '텔레메트리'; + + @override + String get repeater_telemetrySubtitle => '센서 및 시스템 상태에 대한 통신 데이터를 확인'; + + @override + String get repeater_cli => '명령줄 인터페이스 (CLI)'; + + @override + String get repeater_cliSubtitle => '리피터에 명령을 전송'; + + @override + String get repeater_neighbors => '이웃'; + + @override + String get repeater_neighborsSubtitle => '0홉 이웃 노드를 확인합니다.'; + + @override + String get repeater_settings => '설정'; + + @override + String get repeater_settingsSubtitle => '리피터 파라미터 설정'; + + @override + String get repeater_statusTitle => '반복 장치 상태'; + + @override + String get repeater_routingMode => '라우팅 방식'; + + @override + String get repeater_autoUseSavedPath => '자동 (저장된 경로 사용)'; + + @override + String get repeater_forceFloodMode => '강수 모드 활성화'; + + @override + String get repeater_pathManagement => '경로 관리'; + + @override + String get repeater_refresh => '새롭게'; + + @override + String get repeater_statusRequestTimeout => '상태 확인 요청이 시간 초과되었습니다.'; + + @override + String repeater_errorLoadingStatus(String error) { + return '상태 로딩 오류: $error'; + } + + @override + String get repeater_systemInformation => '시스템 정보'; + + @override + String get repeater_battery => '배터리'; + + @override + String get repeater_clockAtLogin => '로그인 시 시간 표시'; + + @override + String get repeater_uptime => '가동 시간'; + + @override + String get repeater_queueLength => '대기 줄의 길이'; + + @override + String get repeater_debugFlags => '디버깅 플래그'; + + @override + String get repeater_radioStatistics => '라디오 통계'; + + @override + String get repeater_lastRssi => '마지막 RSSI 값'; + + @override + String get repeater_lastSnr => '마지막 SNR'; + + @override + String get repeater_noiseFloor => '잡음 수준'; + + @override + String get repeater_txAirtime => 'TX 에어타임'; + + @override + String get repeater_rxAirtime => 'RX 에어타임'; + + @override + String get repeater_packetStatistics => '패킷 통계'; + + @override + String get repeater_sent => '발송'; + + @override + String get repeater_received => '수신'; + + @override + String get repeater_duplicates => '중복'; + + @override + String repeater_daysHoursMinsSecs( + int days, + int hours, + int minutes, + int seconds, + ) { + return '$days일 $hours시간 $minutes분 $seconds초'; + } + + @override + String repeater_packetTxTotal(int total, String flood, String direct) { + return '총: $total, 홍수: $flood, 직접: $direct'; + } + + @override + String repeater_packetRxTotal(int total, String flood, String direct) { + return '총: $total, 홍수: $flood, 직접: $direct'; + } + + @override + String repeater_duplicatesFloodDirect(String flood, String direct) { + return '홍수: $flood, 직접: $direct'; + } + + @override + String repeater_duplicatesTotal(int total) { + return '총: $total'; + } + + @override + String get repeater_settingsTitle => '리피터 설정'; + + @override + String get repeater_basicSettings => '기본 설정'; + + @override + String get repeater_repeaterName => '반복 장비 이름'; + + @override + String get repeater_repeaterNameHelper => '이 반복기용 표시 이름'; + + @override + String get repeater_adminPassword => '관리자 비밀번호'; + + @override + String get repeater_adminPasswordHelper => '전체 접근 권한 비밀번호'; + + @override + String get repeater_guestPassword => '게스트 비밀번호'; + + @override + String get repeater_guestPasswordHelper => '읽기 전용 접근 비밀번호'; + + @override + String get repeater_radioSettings => '라디오 설정'; + + @override + String get repeater_frequencyMhz => '주파수 (MHz)'; + + @override + String get repeater_frequencyHelper => '300-2500 MHz'; + + @override + String get repeater_txPower => 'TX 파워'; + + @override + String get repeater_txPowerHelper => '1~30 dBm'; + + @override + String get repeater_bandwidth => '대역폭'; + + @override + String get repeater_spreadingFactor => '분산 계수'; + + @override + String get repeater_codingRate => '코딩 속도'; + + @override + String get repeater_locationSettings => '위치 설정'; + + @override + String get repeater_latitude => '위도'; + + @override + String get repeater_latitudeHelper => '십진법 위도 (예: 37.7749)'; + + @override + String get repeater_longitude => '경도'; + + @override + String get repeater_longitudeHelper => '십진법 위도 (예: -122.4194)'; + + @override + String get repeater_features => '특징'; + + @override + String get repeater_packetForwarding => '패킷 전송'; + + @override + String get repeater_packetForwardingSubtitle => '리피터가 패킷을 전달하도록 설정'; + + @override + String get repeater_guestAccess => '게스트 접근'; + + @override + String get repeater_guestAccessSubtitle => '게스트의 읽기 전용 접근 권한 허용'; + + @override + String get repeater_privacyMode => '개인 정보 보호 모드'; + + @override + String get repeater_privacyModeSubtitle => '광고에 이름/위치 정보 숨기기'; + + @override + String get repeater_advertisementSettings => '광고 설정'; + + @override + String get repeater_localAdvertInterval => '지역 광고 시간 간격'; + + @override + String repeater_localAdvertIntervalMinutes(int minutes) { + return '$minutes 분'; + } + + @override + String get repeater_floodAdvertInterval => '홍수 광고 간격'; + + @override + String repeater_floodAdvertIntervalHours(int hours) { + return '$hours 시간'; + } + + @override + String get repeater_encryptedAdvertInterval => '암호화된 광고 간격'; + + @override + String get repeater_dangerZone => '위험 구역'; + + @override + String get repeater_rebootRepeater => '리부트 반복'; + + @override + String get repeater_rebootRepeaterSubtitle => '리피터 장치를 재시작하세요.'; + + @override + String get repeater_rebootRepeaterConfirm => '반복기를 재부팅하시려는 것이 맞으신가요?'; + + @override + String get repeater_regenerateIdentityKey => '아이디 키 재 생성'; + + @override + String get repeater_regenerateIdentityKeySubtitle => '새로운 공개/개인 키 쌍 생성'; + + @override + String get repeater_regenerateIdentityKeyConfirm => + '이를 통해 리피터에 새로운 식별자를 할당합니다. 계속 진행하시겠습니까?'; + + @override + String get repeater_eraseFileSystem => '파일 시스템 삭제'; + + @override + String get repeater_eraseFileSystemSubtitle => '리피터 파일 시스템을 포맷합니다.'; + + @override + String get repeater_eraseFileSystemConfirm => + '경고: 이 작업은 리피터에 있는 모든 데이터를 삭제합니다. 이 작업을 되돌릴 수 없습니다!'; + + @override + String get repeater_eraseSerialOnly => + '\'Erase\' 기능은 시리얼 콘솔을 통해서만 사용할 수 있습니다.'; + + @override + String repeater_commandSent(String command) { + return '명령 전송: $command'; + } + + @override + String repeater_errorSendingCommand(String error) { + return '명령 전송 오류: $error'; + } + + @override + String get repeater_confirm => '확인'; + + @override + String get repeater_settingsSaved => '설정이 성공적으로 저장되었습니다.'; + + @override + String repeater_errorSavingSettings(String error) { + return '설정 저장 오류: $error'; + } + + @override + String get repeater_refreshBasicSettings => '기본 설정 초기화'; + + @override + String get repeater_refreshRadioSettings => '라디오 설정 초기화'; + + @override + String get repeater_refreshTxPower => 'TX 전원 재설정'; + + @override + String get repeater_refreshLocationSettings => '위치 설정 초기화'; + + @override + String get repeater_refreshPacketForwarding => '패킷 전송 재시작'; + + @override + String get repeater_refreshGuestAccess => '게스트 접근 권한 갱신'; + + @override + String get repeater_refreshPrivacyMode => '개인 정보 보호 모드 재설정'; + + @override + String get repeater_refreshAdvertisementSettings => '광고 설정 재설정'; + + @override + String repeater_refreshed(String label) { + return '$label가 갱신됨'; + } + + @override + String repeater_errorRefreshing(String label) { + return '$label를 새로 고침 중 오류 발생'; + } + + @override + String get repeater_cliTitle => '리피터 CLI'; + + @override + String get repeater_debugNextCommand => '다음 명령 디버깅'; + + @override + String get repeater_commandHelp => '명령 도움'; + + @override + String get repeater_clearHistory => '명확한 역사'; + + @override + String get repeater_noCommandsSent => '아직 명령이 전송되지 않았습니다.'; + + @override + String get repeater_typeCommandOrUseQuick => '아래에 명령어를 입력하거나, 빠른 명령어를 사용하세요.'; + + @override + String get repeater_enterCommandHint => '명령어를 입력하세요...'; + + @override + String get repeater_previousCommand => '이전 명령어'; + + @override + String get repeater_nextCommand => '다음 명령어'; + + @override + String get repeater_enterCommandFirst => '먼저 명령어를 입력하세요'; + + @override + String get repeater_cliCommandFrameTitle => 'CLI 명령어 프레임'; + + @override + String repeater_cliCommandError(String error) { + return '오류: $error'; + } + + @override + String get repeater_cliQuickGetName => '이름을 알려주세요'; + + @override + String get repeater_cliQuickGetRadio => '라디오 듣기'; + + @override + String get repeater_cliQuickGetTx => 'TX 획득'; + + @override + String get repeater_cliQuickNeighbors => '이웃'; + + @override + String get repeater_cliQuickVersion => '버전'; + + @override + String get repeater_cliQuickAdvertise => '광고'; + + @override + String get repeater_cliQuickClock => '시계'; + + @override + String get repeater_cliHelpAdvert => '광고 패킷을 발송'; + + @override + String get repeater_cliHelpReboot => + '장치를 재부팅합니다. (참고: \'시간 초과\' 오류가 발생할 수 있으며, 이는 정상적인 현상입니다)'; + + @override + String get repeater_cliHelpClock => '각 기기의 시계에 표시되는 현재 시간'; + + @override + String get repeater_cliHelpPassword => '장치에 새로운 관리자 비밀번호를 설정합니다.'; + + @override + String get repeater_cliHelpVersion => '장치 버전 및 펌웨어 빌드 날짜를 표시합니다.'; + + @override + String get repeater_cliHelpClearStats => '다양한 통계 지표를 0으로 초기화합니다.'; + + @override + String get repeater_cliHelpSetAf => '에어 타임 요소를 설정합니다.'; + + @override + String get repeater_cliHelpSetTx => + 'LoRa 전송 전력을 dBm 단위로 설정합니다. (설정을 적용하려면 재부팅 필요)'; + + @override + String get repeater_cliHelpSetRepeat => '이 노드에 대한 리피터 역할을 활성화하거나 비활성화합니다.'; + + @override + String get repeater_cliHelpSetAllowReadOnly => + '(방 서버) \'켜짐\' 상태인 경우, 빈 비밀번호로 로그인할 수 있지만, 방에 게시할 수는 없습니다 (단, 읽기만 가능).'; + + @override + String get repeater_cliHelpSetFloodMax => + '들어오는 플러드 패킷의 최대 홉 수를 설정합니다 (최대 홉 수보다 크거나 같으면 패킷은 전달되지 않습니다).'; + + @override + String get repeater_cliHelpSetIntThresh => + '간섭 임계값을 설정합니다 (dB 단위). 기본값은 14입니다. 0으로 설정하면 채널 간섭 감지 기능을 비활성화합니다.'; + + @override + String get repeater_cliHelpSetAgcResetInterval => + '자동 게인 제어기를 재설정하는 간격을 설정합니다. 0으로 설정하면 비활성화됩니다.'; + + @override + String get repeater_cliHelpSetMultiAcks => + '\'더블 ACK\' 기능을 활성화하거나 비활성화할 수 있습니다.'; + + @override + String get repeater_cliHelpSetAdvertInterval => + '로컬 (제로 홉) 광고 패킷을 전송하는 간격 (분 단위)을 설정합니다. 0으로 설정하면 비활성화됩니다.'; + + @override + String get repeater_cliHelpSetFloodAdvertInterval => + '시간 단위로 광고 패킷을 전송하는 간격을 설정합니다. 0으로 설정하면 비활성화됩니다.'; + + @override + String get repeater_cliHelpSetGuestPassword => + '게스트 비밀번호를 설정하거나 업데이트합니다. (반복 사용자, 게스트 로그인 시 \"통계 가져오기\" 요청을 보낼 수 있음)'; + + @override + String get repeater_cliHelpSetName => '광고 이름을 설정합니다.'; + + @override + String get repeater_cliHelpSetLat => '광고 지도의 위도를 설정합니다. (십진법 단위)'; + + @override + String get repeater_cliHelpSetLon => '광고 지도의 경도를 설정합니다. (십진도)'; + + @override + String get repeater_cliHelpSetRadio => + '완전히 새로운 라디오 파라미터를 설정하고, 선호 사항에 저장합니다. 적용하려면 \"재부팅\" 명령이 필요합니다.'; + + @override + String get repeater_cliHelpSetRxDelay => + '(실험용) 기본 설정 (최소 1이어야 함)으로, 수신된 패킷에 약간의 지연을 적용하며, 신호 강도/점수를 기준으로 설정합니다. 0으로 설정하면 비활성화됩니다.'; + + @override + String get repeater_cliHelpSetTxDelay => + '공통 패킷의 전송 지연 시간을 설정하며, 시간-공기 시간과 무작위 슬롯 시스템을 곱하여 충돌 가능성을 줄입니다.'; + + @override + String get repeater_cliHelpSetDirectTxDelay => + 'txdelay와 동일하게, 하지만 직접 모드 패킷 전송 시 무작위 지연을 적용하는 경우'; + + @override + String get repeater_cliHelpSetBridgeEnabled => '브리지 활성화/비활성화'; + + @override + String get repeater_cliHelpSetBridgeDelay => '패킷 재전송 전에 지연 시간을 설정합니다.'; + + @override + String get repeater_cliHelpSetBridgeSource => + '브리지가 수신된 패킷을 다시 전송할지, 아니면 전송된 패킷을 다시 전송할지 선택하십시오.'; + + @override + String get repeater_cliHelpSetBridgeBaud => + 'rs232 브리지에 대한 직렬 통신 속도(baud rate)를 설정합니다.'; + + @override + String get repeater_cliHelpSetBridgeSecret => 'ESPNow 브리지에 대한 비밀 설정'; + + @override + String get repeater_cliHelpSetAdcMultiplier => + '특정 보드에서만 지원되는 방식으로, 보고되는 배터리 전압을 조정하기 위한 사용자 정의 요소를 설정할 수 있습니다.'; + + @override + String get repeater_cliHelpTempRadio => + '주어진 시간(분) 동안 임시 라디오 파라미터를 설정하고, 이후 원래 라디오 파라미터로 되돌립니다. (설정을 저장하지 않습니다).'; + + @override + String get repeater_cliHelpSetPerm => + 'ACL을 수정합니다. \"permissions\" 값이 0인 경우, 일치하는 항목(pubkey 접두사)을 제거합니다. pubkey-hex 길이가 완전하고 현재 ACL에 없는 경우 새로운 항목을 추가합니다. pubkey 접두사를 기준으로 항목을 업데이트합니다. 권한 비트는 펌웨어 역할에 따라 다르지만, 하위 2비트는 다음과 같습니다: 0 (게스트), 1 (읽기 전용), 2 (읽기/쓰기), 3 (관리자)'; + + @override + String get repeater_cliHelpGetBridgeType => '브리지형, RS232, ESPNOW 지원'; + + @override + String get repeater_cliHelpLogStart => '패킷 로깅을 파일 시스템으로 시작합니다.'; + + @override + String get repeater_cliHelpLogStop => '패킷 로깅을 파일 시스템으로 저장하는 것을 중단합니다.'; + + @override + String get repeater_cliHelpLogErase => '파일 시스템에서 패킷 로그를 삭제합니다.'; + + @override + String get repeater_cliHelpNeighbors => + '제로 홉 광고를 통해 수신된 다른 리피터 노드 목록을 보여줍니다. 각 줄은 ID-프리픽스-16진수:타임스탬프:SNR-횟수-4 형식입니다.'; + + @override + String get repeater_cliHelpNeighborRemove => + '이 함수는 지정된 pubkey 접두사(16진수)와 일치하는 첫 번째 항목을 이웃 목록에서 제거합니다.'; + + @override + String get repeater_cliHelpRegion => + '(단일 시리즈) 정의된 모든 지역과 현재 홍수 허가 정보를 나열합니다.'; + + @override + String get repeater_cliHelpRegionLoad => + '참고: 이는 여러 명령을 한 번에 실행하는 특별한 방식입니다. 각 후속 명령은 영역 이름이며 (부모 계층 구조를 나타내기 위해 공백으로 들여쓰기하며, 최소 1개의 공백을 사용) 공백으로 끝나는 줄 또는 명령을 보내어 종료합니다.'; + + @override + String get repeater_cliHelpRegionGet => + '주어진 이름 접두사(또는 전역 검색을 위한 \"\\*\" 사용)를 사용하여 특정 지역을 검색합니다. 결과를 \"-> 지역 이름 (상위 지역 이름) \'F\'\" 형태로 반환합니다.'; + + @override + String get repeater_cliHelpRegionPut => '주어진 이름으로 지역 정의를 추가하거나 업데이트합니다.'; + + @override + String get repeater_cliHelpRegionRemove => + '지정된 이름으로 특정 영역 정의를 제거합니다. (정확히 일치해야 하며, 하위 영역은 존재하지 않아야 합니다)'; + + @override + String get repeater_cliHelpRegionAllowf => + '지정된 영역에 대한 \'물\' 접근 권한을 설정합니다. (\'*\'는 전역/기존 범위에 해당)'; + + @override + String get repeater_cliHelpRegionDenyf => + '지정된 영역에 대해 \'Flood\' 권한을 제거합니다. (참고: 현재 단계에서는 전역/기존 범위에서 이 기능을 사용하지 않는 것이 좋습니다!!)'; + + @override + String get repeater_cliHelpRegionHome => + '현재 \'홈\' 지역으로 응답합니다. (아직 적용되지 않았으며, 향후 사용을 위해 예약됨)'; + + @override + String get repeater_cliHelpRegionHomeSet => '\'홈\' 지역을 설정합니다.'; + + @override + String get repeater_cliHelpRegionSave => '지역 목록/지도를 저장에 유지합니다.'; + + @override + String get repeater_cliHelpGps => + 'GPS 상태를 표시합니다. GPS가 꺼져 있으면 \"꺼짐\"이라고 표시하고, 켜져 있으면 \"켜짐\", 상태, 위치 정보, 위성 수 등을 표시합니다.'; + + @override + String get repeater_cliHelpGpsOnOff => 'GPS 전원 상태를 켜고 끄는 기능.'; + + @override + String get repeater_cliHelpGpsSync => '노드 시간을 GPS 시계와 동기화합니다.'; + + @override + String get repeater_cliHelpGpsSetLoc => '노드의 위치를 GPS 좌표로 설정하고, 설정을 저장합니다.'; + + @override + String get repeater_cliHelpGpsAdvert => + '노드의 위치 광고 설정:\n- none: 광고에 위치 정보를 포함하지 않음\n- share: GPS 위치 정보를 공유 (SensorManager에서 가져옴)\n- prefs: 설정에 저장된 위치를 광고'; + + @override + String get repeater_cliHelpGpsAdvertSet => '위치 기반 광고 설정 구성'; + + @override + String get repeater_commandsListTitle => '명령 목록'; + + @override + String get repeater_commandsListNote => + '참고: 다양한 \"set...\" 명령과 함께 \"get...\" 명령도 존재합니다.'; + + @override + String get repeater_general => '일반'; + + @override + String get repeater_settingsCategory => '설정'; + + @override + String get repeater_bridge => '다리'; + + @override + String get repeater_logging => '로깅'; + + @override + String get repeater_neighborsRepeaterOnly => '이웃 (단방향 통신만 지원)'; + + @override + String get repeater_regionManagementRepeaterOnly => '지역 관리 (단, 중계 기능만 사용)'; + + @override + String get repeater_regionNote => + '지역별 관리 기능을 도입하여 지역 정의 및 권한 관리를 수행할 수 있습니다.'; + + @override + String get repeater_gpsManagement => 'GPS 관리'; + + @override + String get repeater_gpsNote => 'GPS 명령이 위치 관련 주제를 관리하기 위해 도입되었습니다.'; + + @override + String get telemetry_receivedData => '수신된 통신 데이터'; + + @override + String get telemetry_requestTimeout => '원격 모니터링 요청이 시간 초과되었습니다.'; + + @override + String telemetry_errorLoading(String error) { + return '$error 오류로 인해 통신 데이터를 로드하지 못했습니다.'; + } + + @override + String get telemetry_noData => '텔레메트리 데이터는 제공되지 않습니다.'; + + @override + String telemetry_channelTitle(int channel) { + return '채널 $channel'; + } + + @override + String get telemetry_batteryLabel => '배터리'; + + @override + String get telemetry_voltageLabel => '전압'; + + @override + String get telemetry_mcuTemperatureLabel => 'MCU의 온도'; + + @override + String get telemetry_temperatureLabel => '온도'; + + @override + String get telemetry_currentLabel => '현재'; + + @override + String telemetry_batteryValue(int percent, String volts) { + return '$percent% / ${volts}V'; + } + + @override + String telemetry_voltageValue(String volts) { + return '${volts}V'; + } + + @override + String telemetry_currentValue(String amps) { + return '${amps}A'; + } + + @override + String telemetry_temperatureValue(String celsius, String fahrenheit) { + return '$celsius°C / $fahrenheit°F'; + } + + @override + String get neighbors_receivedData => '이웃 정보 수집'; + + @override + String get neighbors_requestTimedOut => '이웃들이 시간 제한을 요청하고 있습니다.'; + + @override + String neighbors_errorLoading(String error) { + return '이웃 정보 로딩 중 오류: $error'; + } + + @override + String get neighbors_repeatersNeighbors => '반복기, 이웃'; + + @override + String get neighbors_noData => '이웃 정보는 없습니다.'; + + @override + String neighbors_unknownContact(String pubkey) { + return '알 수 없는 $pubkey'; + } + + @override + String neighbors_heardAgo(String time) { + return 'Heard: $time ago'; + } + + @override + String get channelPath_title => '패킷 경로'; + + @override + String get channelPath_viewMap => '지도 보기'; + + @override + String get channelPath_otherObservedPaths => '관찰된 다른 경로'; + + @override + String get channelPath_repeaterHops => '반복 홉'; + + @override + String get channelPath_noHopDetails => '이 패키지에 대한 자세한 정보는 제공되지 않습니다.'; + + @override + String get channelPath_messageDetails => '메시지 세부 정보'; + + @override + String get channelPath_senderLabel => '발신자'; + + @override + String get channelPath_timeLabel => '시간'; + + @override + String get channelPath_repeatsLabel => '반복'; + + @override + String channelPath_pathLabel(int index) { + return '경로 $index'; + } + + @override + String get channelPath_observedLabel => '관찰'; + + @override + String channelPath_observedPathTitle(int index, String hops) { + return '관찰된 경로 $index • $hops'; + } + + @override + String get channelPath_noLocationData => '위치 정보 없음'; + + @override + String channelPath_timeWithDate(int day, int month, String time) { + return '$day/$month $time'; + } + + @override + String channelPath_timeOnly(String time) { + return '$time'; + } + + @override + String get channelPath_unknownPath => '알 수 없음'; + + @override + String get channelPath_floodPath => '홍수'; + + @override + String get channelPath_directPath => '직접'; + + @override + String channelPath_observedZeroOf(int total) { + return '$total 중 0개'; + } + + @override + String channelPath_observedSomeOf(int observed, int total) { + return '$observed of $total hops'; + } + + @override + String get channelPath_mapTitle => '경로 지도'; + + @override + String get channelPath_noRepeaterLocations => '이 경로에 대한 중계기 설치 위치는 없습니다.'; + + @override + String channelPath_primaryPath(int index) { + return '경로 $index (주 경로)'; + } + + @override + String get channelPath_pathLabelTitle => '경로'; + + @override + String get channelPath_observedPathHeader => '관찰된 경로'; + + @override + String channelPath_selectedPathLabel(String label, String prefixes) { + return '$label • $prefixes'; + } + + @override + String get channelPath_noHopDetailsAvailable => '이 패킷에 대한 이동 정보는 제공되지 않습니다.'; + + @override + String get channelPath_unknownRepeater => '알 수 없는 중계기'; + + @override + String get community_title => '지역 사회'; + + @override + String get community_create => '커뮤니티 만들기'; + + @override + String get community_createDesc => '새로운 커뮤니티를 만들고 QR 코드를 통해 공유하세요.'; + + @override + String get community_join => '참여하기'; + + @override + String get community_joinTitle => '커뮤니티에 참여하기'; + + @override + String community_joinConfirmation(String name) { + return '$name님, 커뮤니티에 참여하고 싶으신가요?'; + } + + @override + String get community_scanQr => '커뮤니티 QR 스캔'; + + @override + String get community_scanInstructions => '카메라를 커뮤니티 QR 코드 방향으로 향하게 하세요.'; + + @override + String get community_showQr => 'QR 코드 표시'; + + @override + String get community_publicChannel => '지역 사회 대상'; + + @override + String get community_hashtagChannel => '커뮤니티 해시태그'; + + @override + String get community_name => '지역 이름'; + + @override + String get community_enterName => '커뮤니티 이름을 입력하세요'; + + @override + String community_created(String name) { + return '커뮤니티 \"$name\"이 생성되었습니다.'; + } + + @override + String community_joined(String name) { + return '\"$name\" 커뮤니티에 가입'; + } + + @override + String get community_qrTitle => '커뮤니티 공유'; + + @override + String community_qrInstructions(String name) { + return '이 QR 코드를 스캔하여 \"$name\"에 가입하세요.'; + } + + @override + String get community_hashtagPrivacyHint => + '커뮤니티 해시태그 채널은 커뮤니티 구성원만 가입할 수 있습니다.'; + + @override + String get community_invalidQrCode => '유효하지 않은 커뮤니티 QR 코드'; + + @override + String get community_alreadyMember => '이미 회원인 경우'; + + @override + String community_alreadyMemberMessage(String name) { + return '이미 $name의 회원입니다.'; + } + + @override + String get community_addPublicChannel => '커뮤니티 공개 채널 추가'; + + @override + String get community_addPublicChannelHint => '이 커뮤니티에 공개 채널을 자동으로 추가합니다.'; + + @override + String get community_noCommunities => '아직 어느 커뮤니티도 가입하지 않았습니다.'; + + @override + String get community_scanOrCreate => 'QR 코드를 스캔하거나 커뮤니티를 만들어 시작하세요.'; + + @override + String get community_manageCommunities => '커뮤니티 관리'; + + @override + String get community_delete => '커뮤니티 떠나기'; + + @override + String community_deleteConfirm(String name) { + return '$name을 묻어두나요?'; + } + + @override + String community_deleteChannelsWarning(int count) { + return '또한, 이 기능은 $count개의 채널과 그에 해당하는 메시지를 삭제합니다.'; + } + + @override + String community_deleted(String name) { + return '지역 커뮤니티 \"$name\"'; + } + + @override + String get community_regenerateSecret => '비밀 복원'; + + @override + String community_regenerateSecretConfirm(String name) { + return '$name의 비밀 키를 재생성하시겠습니까? 모든 회원은 계속 통신을 위해 새로운 QR 코드를 스캔해야 합니다.'; + } + + @override + String get community_regenerate => '재생'; + + @override + String community_secretRegenerated(String name) { + return '$name을 위한 비밀 정보가 복원되었습니다.'; + } + + @override + String get community_updateSecret => '비밀 업데이트'; + + @override + String community_secretUpdated(String name) { + return '$name을 위한 비밀 정보 업데이트'; + } + + @override + String community_scanToUpdateSecret(String name) { + return '새로운 QR 코드를 스캔하여 $name의 비밀번호를 업데이트하세요.'; + } + + @override + String get community_addHashtagChannel => '커뮤니티 해시태그 추가'; + + @override + String get community_addHashtagChannelDesc => '이 커뮤니티를 위한 해시태그 채널을 추가하세요.'; + + @override + String get community_selectCommunity => '커뮤니티 선택'; + + @override + String get community_regularHashtag => '일반 해시태그'; + + @override + String get community_regularHashtagDesc => '공개 해시태그 (누구나 참여 가능)'; + + @override + String get community_communityHashtag => '커뮤니티 해시태그'; + + @override + String get community_communityHashtagDesc => '지역 주민을 위한'; + + @override + String community_forCommunity(String name) { + return '$name 님께'; + } + + @override + String get listFilter_tooltip => '필터링 및 정렬'; + + @override + String get listFilter_sortBy => '정렬 기준 선택'; + + @override + String get listFilter_latestMessages => '최신 메시지'; + + @override + String get listFilter_heardRecently => '최근에 들었습니다'; + + @override + String get listFilter_az => 'A부터 Z까지'; + + @override + String get listFilter_filters => '필터'; + + @override + String get listFilter_all => '모든'; + + @override + String get listFilter_favorites => '관심 목록'; + + @override + String get listFilter_addToFavorites => '즐겨찾으로 추가'; + + @override + String get listFilter_removeFromFavorites => '즐겨찾에서 제거'; + + @override + String get listFilter_users => '사용자'; + + @override + String get listFilter_repeaters => '다시 보내는 장치'; + + @override + String get listFilter_roomServers => '방 내 서버'; + + @override + String get listFilter_unreadOnly => '읽지 않은 항목만'; + + @override + String get listFilter_newGroup => '새로운 그룹'; + + @override + String get pathTrace_you => '당신'; + + @override + String get pathTrace_failed => '경로 추적 실패.'; + + @override + String get pathTrace_notAvailable => '경로 추적 기능은 제공되지 않습니다.'; + + @override + String get pathTrace_refreshTooltip => '경로 추적 재시작'; + + @override + String get pathTrace_someHopsNoLocation => '홉 중 하나 또는 여러 개에 위치 정보가 누락되었습니다!'; + + @override + String get pathTrace_clearTooltip => '명확한 경로.'; + + @override + String get losSelectStartEnd => 'LOS(최소 거리 경로)의 시작 및 종료 노드를 선택합니다.'; + + @override + String losRunFailed(String error) { + return '시야 확인 실패: $error'; + } + + @override + String get losClearAllPoints => '모든 사항을 명확히 합니다.'; + + @override + String get losRunToViewElevationProfile => + 'LOS(Line of Sight)를 사용하여 고도 프로필을 확인합니다.'; + + @override + String get losMenuTitle => 'LOS 메뉴'; + + @override + String get losMenuSubtitle => '사용자 지정 지점을 추가하려면, 노드를 탭하거나 맵을 길게 눌러 주세요.'; + + @override + String get losShowDisplayNodes => '노드 표시'; + + @override + String get losCustomPoints => '사용자 지정 포인트'; + + @override + String losCustomPointLabel(int index) { + return '맞춤형 $index'; + } + + @override + String get losPointA => 'A 지점'; + + @override + String get losPointB => '점 B'; + + @override + String losAntennaA(String value, String unit) { + return '안테나 A: $value $unit'; + } + + @override + String losAntennaB(String value, String unit) { + return 'Antenna B: $value $unit'; + } + + @override + String get losRun => 'LOS (Loss of Signal) 상태로 전환'; + + @override + String get losNoElevationData => '고도 정보 없음'; + + @override + String losProfileClear( + String distance, + String distanceUnit, + String clearance, + String heightUnit, + ) { + return '$distance $distanceUnit, clear LOS, min clearance $clearance $heightUnit'; + } + + @override + String losProfileBlocked( + String distance, + String distanceUnit, + String obstruction, + String heightUnit, + ) { + return '$distance $distanceUnit, blocked by $obstruction $heightUnit'; + } + + @override + String get losStatusChecking => 'LOS: 확인 중...'; + + @override + String get losStatusNoData => 'LOS: 데이터 없음'; + + @override + String losStatusSummary(int clear, int total, int blocked, int unknown) { + return 'LOS: $clear/$total 개, $blocked 개, $unknown 개'; + } + + @override + String get losErrorElevationUnavailable => '샘플 중 하나 이상에 대한 고도 데이터가 없습니다.'; + + @override + String get losErrorInvalidInput => 'LOS 계산에 사용되는 부정확한 지점/고도 데이터.'; + + @override + String get losRenameCustomPoint => '사용자 지정된 지점의 이름을 변경'; + + @override + String get losPointName => '항목 이름'; + + @override + String get losShowPanelTooltip => 'LOS 패널 표시'; + + @override + String get losHidePanelTooltip => 'LOS 패널 숨기기'; + + @override + String get losElevationAttribution => '고도 데이터: Open-Meteo (CC BY 4.0)'; + + @override + String get losLegendRadioHorizon => '라디오 호라이즌'; + + @override + String get losLegendLosBeam => 'LOS 빔'; + + @override + String get losLegendTerrain => '지형'; + + @override + String get losFrequencyLabel => '빈도'; + + @override + String get losFrequencyInfoTooltip => '계산 내역 보기'; + + @override + String get losFrequencyDialogTitle => '라디오 수신 가능 범위 계산'; + + @override + String losFrequencyDialogDescription( + double baselineK, + double baselineFreq, + double frequencyMHz, + double kFactor, + ) { + return '$baselineK에서 시작하여 $baselineFreq MHz의 주파수에서 계산을 시작하면, 현재 $frequencyMHz MHz 대역에 대한 k-값을 조정하여, 이는 곡선형 라디오 지평선 상한선을 정의합니다.'; + } + + @override + String get contacts_pathTrace => '경로 추적'; + + @override + String get contacts_ping => '핑'; + + @override + String get contacts_repeaterPathTrace => '리피터로 가는 경로'; + + @override + String get contacts_repeaterPing => '핑 반복'; + + @override + String get contacts_roomPathTrace => '방 서버로의 경로 추적'; + + @override + String get contacts_roomPing => '피нг 룸 서버'; + + @override + String get contacts_chatTraceRoute => '경로 추적 경로'; + + @override + String contacts_pathTraceTo(String name) { + return '$name까지의 경로 추적'; + } + + @override + String get contacts_clipboardEmpty => '클립보드가 비어 있습니다.'; + + @override + String get contacts_invalidAdvertFormat => '유효하지 않은 연락 정보'; + + @override + String get contacts_contactImported => '연락이 수신되었습니다.'; + + @override + String get contacts_contactImportFailed => '연락처를 가져오지 못했습니다.'; + + @override + String get contacts_zeroHopAdvert => '제로 홉 광고'; + + @override + String get contacts_floodAdvert => '홍수 광고'; + + @override + String get contacts_copyAdvertToClipboard => '광고 텍스트를 클립보드에 복사'; + + @override + String get contacts_addContactFromClipboard => '복사본에서 연락처 추가'; + + @override + String get contacts_ShareContact => '연락처를 복사'; + + @override + String get contacts_ShareContactZeroHop => '광고를 통해 연락처 공유'; + + @override + String get contacts_zeroHopContactAdvertSent => '광고를 통해 연락처를 받았습니다.'; + + @override + String get contacts_zeroHopContactAdvertFailed => '연락처 전송에 실패했습니다.'; + + @override + String get contacts_contactAdvertCopied => '광고 내용이 복사되었습니다.'; + + @override + String get contacts_contactAdvertCopyFailed => '광고를 클립보드에 복사하는 데 실패했습니다.'; + + @override + String get notification_activityTitle => '메쉬코어 활동'; + + @override + String notification_messagesCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '메시지들', + one: '메시지', + ); + return '$count $_temp0'; + } + + @override + String notification_channelMessagesCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '채널 메시지', + one: '채널 메시지', + ); + return '$count $_temp0'; + } + + @override + String notification_newNodesCount(int count) { + String _temp0 = intl.Intl.pluralLogic( + count, + locale: localeName, + other: '새 노드들', + one: '새 노드', + ); + return '$count $_temp0'; + } + + @override + String notification_newTypeDiscovered(String contactType) { + return '새로운 $contactType 발견'; + } + + @override + String get notification_receivedNewMessage => '새로운 메시지를 받았습니다'; + + @override + String get settings_gpxExportRepeaters => 'GPX로 전송/방 관리 서버'; + + @override + String get settings_gpxExportRepeatersSubtitle => + 'GPX 파일에 위치 정보를 포함하여 반복자/룸 서버를 내보냅니다.'; + + @override + String get settings_gpxExportContacts => 'GPX 형식으로 내보내기'; + + @override + String get settings_gpxExportContactsSubtitle => + 'GPX 파일에 위치 정보를 포함하여 동행하는 기능을 내보냅니다.'; + + @override + String get settings_gpxExportAll => '모든 연락처를 GPX 형식으로 내보내기'; + + @override + String get settings_gpxExportAllSubtitle => + '위치 정보가 있는 모든 연락처를 GPX 파일로 내보냅니다.'; + + @override + String get settings_gpxExportSuccess => 'GPX 파일이 성공적으로 내보내졌습니다.'; + + @override + String get settings_gpxExportNoContacts => '수출할 연락처가 없습니다.'; + + @override + String get settings_gpxExportNotAvailable => '귀하의 장치/운영체제에서는 지원되지 않습니다.'; + + @override + String get settings_gpxExportError => '데이터 내보내기 과정에서 오류가 발생했습니다.'; + + @override + String get settings_gpxExportRepeatersRoom => '중계 장치 및 서버 위치'; + + @override + String get settings_gpxExportChat => '함께 방문할 장소'; + + @override + String get settings_gpxExportAllContacts => '모든 연락처 위치'; + + @override + String get settings_gpxExportShareText => 'meshcore-open에서 추출한 지도 데이터'; + + @override + String get settings_gpxExportShareSubject => 'meshcore-open GPX 지도 데이터 내보내기'; + + @override + String get snrIndicator_nearByRepeaters => '주변의 중계기'; + + @override + String get snrIndicator_lastSeen => '마지막으로 목격'; + + @override + String get contactsSettings_title => '연락처 설정'; + + @override + String get contactsSettings_autoAddTitle => '자동 검색'; + + @override + String get contactsSettings_otherTitle => '다른 연락 관련 설정'; + + @override + String get contactsSettings_autoAddUsersTitle => '자동으로 사용자 추가'; + + @override + String get contactsSettings_autoAddUsersSubtitle => + '동반자가 자동으로 발견한 사용자를 추가할 수 있도록 합니다.'; + + @override + String get contactsSettings_autoAddRepeatersTitle => '자동으로 중계기 추가'; + + @override + String get contactsSettings_autoAddRepeatersSubtitle => + '애완동물이 발견한 무선 라디오를 자동으로 추가할 수 있도록 설정합니다.'; + + @override + String get contactsSettings_autoAddRoomServersTitle => '자동으로 방 서버 추가'; + + @override + String get contactsSettings_autoAddRoomServersSubtitle => + '애완동물이 발견한 방 서버를 자동으로 추가할 수 있도록 설정합니다.'; + + @override + String get contactsSettings_autoAddSensorsTitle => '자동으로 센서 추가'; + + @override + String get contactsSettings_autoAddSensorsSubtitle => + '애완동물이 발견한 센서를 자동으로 추가할 수 있도록 설정합니다.'; + + @override + String get contactsSettings_overwriteOldestTitle => '가장 오래된 것을 덮어쓰기'; + + @override + String get contactsSettings_overwriteOldestSubtitle => + '연락처 목록이 가득 차면, 가장 오래된 (선호하지 않은) 연락처가 대체됩니다.'; + + @override + String get discoveredContacts_Title => '연락처 찾기'; + + @override + String get discoveredContacts_noMatching => '일치하는 연락처가 없습니다.'; + + @override + String get discoveredContacts_searchHint => '발견된 연락처 검색'; + + @override + String get discoveredContacts_contactAdded => '연락처 추가'; + + @override + String get discoveredContacts_addContact => '연락처 추가'; + + @override + String get discoveredContacts_copyContact => '복사'; + + @override + String get discoveredContacts_deleteContact => '발견된 연락처 삭제'; + + @override + String get discoveredContacts_deleteContactAll => '발견된 모든 연락처 삭제'; + + @override + String get discoveredContacts_deleteContactAllContent => + '정말로 모든 검색된 연락처를 삭제하시겠습니까?'; + + @override + String get chat_sendCooldown => '다시 보내기 전에 잠시 기다려 주시기 바랍니다.'; + + @override + String get appSettings_jumpToOldestUnread => '가장 오래된, 아직 읽지 않은 항목으로 이동'; + + @override + String get appSettings_jumpToOldestUnreadSubtitle => + '새로운 메시지가 없는 채팅을 열 때, 최신 메시지가 아닌 첫 번째 읽지 않은 메시지로 스크롤하세요.'; + + @override + String get appSettings_languageHu => '헝가리'; + + @override + String get appSettings_languageJa => '일본어'; + + @override + String get appSettings_languageKo => '한국어'; + + @override + String get radioStats_tooltip => '라디오 및 메시 통계'; + + @override + String get radioStats_screenTitle => '라디오 통계'; + + @override + String get radioStats_notConnected => '라디오 통계를 확인하기 위해 장치에 연결합니다.'; + + @override + String get radioStats_firmwareTooOld => + '무선 통계 기능을 사용하려면 v8 또는 그 이상의 호환 펌웨어가 필요합니다.'; + + @override + String get radioStats_waiting => '데이터를 기다리는 중…'; + + @override + String radioStats_noiseFloor(int noiseDbm) { + return '잡음 수준: $noiseDbm dBm'; + } + + @override + String radioStats_lastRssi(int rssiDbm) { + return '마지막 RSSI: $rssiDbm dBm'; + } + + @override + String radioStats_lastSnr(String snr) { + return '마지막 SNR: $snr dB'; + } + + @override + String radioStats_txAir(int seconds) { + return 'TX 방송 시간 (총): $seconds 초'; + } + + @override + String radioStats_rxAir(int seconds) { + return 'RX 사용 시간 (총): $seconds 초'; + } + + @override + String get radioStats_chartCaption => '최근 샘플의 잡음 수준 (dBm)'; + + @override + String radioStats_stripNoise(int noiseDbm) { + return '잡음 수준: $noiseDbm dBm'; + } + + @override + String get radioStats_stripWaiting => '라디오 통계 가져오기…'; + + @override + String get radioStats_settingsTile => '라디오 통계'; + + @override + String get radioStats_settingsSubtitle => '잡음 수준, RSSI, 신호 대 잡음비, 통신 시간'; +} diff --git a/lib/l10n/app_localizations_pl.dart b/lib/l10n/app_localizations_pl.dart index b1a58c1..946c26f 100644 --- a/lib/l10n/app_localizations_pl.dart +++ b/lib/l10n/app_localizations_pl.dart @@ -744,42 +744,42 @@ class AppLocalizationsPl extends AppLocalizations { 'Automatyczne obracanie tras wyłączone'; @override - String get appSettings_maxRouteWeight => 'Maksymalna waga ścieżki'; + String get appSettings_maxRouteWeight => + 'Maksymalny dopuszczalny ciężar pojazdu'; @override String get appSettings_maxRouteWeightSubtitle => - 'Maksymalna waga, jaką ścieżka może osiągnąć dzięki udanym dostarczeniom'; + 'Maksymalna waga, jaką ścieżka może zgromadzić dzięki udanym dostawom.'; @override - String get appSettings_initialRouteWeight => 'Początkowa waga ścieżki'; + String get appSettings_initialRouteWeight => 'Początkowa waga trasy'; @override String get appSettings_initialRouteWeightSubtitle => - 'Waga początkowa dla nowo odkrytych ścieżek'; + 'Początkowa waga dla nowych, odkrytych ścieżek'; @override - String get appSettings_routeWeightSuccessIncrement => - 'Przyrost wagi po sukcesie'; + String get appSettings_routeWeightSuccessIncrement => 'Wzrost wagi sukcesu'; @override String get appSettings_routeWeightSuccessIncrementSubtitle => - 'Waga dodawana do ścieżki po udanym dostarczeniu'; + 'Waga dodana do ścieżki po pomyślnym dostarczeniu'; @override String get appSettings_routeWeightFailureDecrement => - 'Spadek wagi po niepowodzeniu'; + 'Zmniejszenie wagi kary'; @override String get appSettings_routeWeightFailureDecrementSubtitle => - 'Waga odejmowana od ścieżki po nieudanym dostarczeniu'; + 'Waga usunięta z trasy po nieudanej dostawie'; @override String get appSettings_maxMessageRetries => - 'Maksymalna liczba ponowień wiadomości'; + 'Maksymalna liczba prób wysłania wiadomości'; @override String get appSettings_maxMessageRetriesSubtitle => - 'Liczba prób ponowienia przed oznaczeniem wiadomości jako nieudanej'; + 'Liczba prób ponownego wysłania wiadomości przed oznaczaniem jej jako nieudanej'; @override String path_routeWeight(String weight, String max) { diff --git a/lib/l10n/app_localizations_sl.dart b/lib/l10n/app_localizations_sl.dart index 953a89b..72cbc7d 100644 --- a/lib/l10n/app_localizations_sl.dart +++ b/lib/l10n/app_localizations_sl.dart @@ -3501,7 +3501,7 @@ class AppLocalizationsSl extends AppLocalizations { @override String get radioStats_firmwareTooOld => - 'Statistika za radio zahteva združljivo programsko opremo v8 ali kasnejše različice.'; + 'Statistika za radio zahteva združljivo programsko opremo v8 ali kasnejše.'; @override String get radioStats_waiting => 'Čakam na podatke…'; diff --git a/lib/l10n/app_localizations_zh.dart b/lib/l10n/app_localizations_zh.dart index de334f6..66981e1 100644 --- a/lib/l10n/app_localizations_zh.dart +++ b/lib/l10n/app_localizations_zh.dart @@ -3227,7 +3227,7 @@ class AppLocalizationsZh extends AppLocalizations { String get chat_sendCooldown => '请稍等片刻后再尝试发送。'; @override - String get appSettings_jumpToOldestUnread => '跳转到最旧未读的文章'; + String get appSettings_jumpToOldestUnread => '跳转到最旧、未读的文章'; @override String get appSettings_jumpToOldestUnreadSubtitle => diff --git a/lib/l10n/app_nl.arb b/lib/l10n/app_nl.arb index 43c08b1..0288e70 100644 --- a/lib/l10n/app_nl.arb +++ b/lib/l10n/app_nl.arb @@ -1943,5 +1943,68 @@ "settings_telemetryModeUpdated": "Telemetrie-modus bijgewerkt", "settings_multiAck": "Multi-ACKs: {value}", "map_showOverlaps": "Herhalingssleutel overlapt", - "map_runTraceWithReturnPath": "Terugkeren op hetzelfde pad." -} \ No newline at end of file + "map_runTraceWithReturnPath": "Terugkeren op hetzelfde pad.", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "appSettings_jumpToOldestUnread": "Ga naar het oudste ongelezen bericht", + "appSettings_jumpToOldestUnreadSubtitle": "Bij het openen van een chat met ongelezen berichten, scroll dan naar het eerste ongelezen bericht, in plaats van naar het meest recente.", + "chat_sendCooldown": "Gelieve even te wachten voordat u opnieuw verzendt.", + "appSettings_languageHu": "Hongaars", + "appSettings_languageJa": "Japanisch", + "appSettings_languageKo": "Koreaans", + "radioStats_tooltip": "Statistieken voor radio en mesh-netwerken", + "radioStats_screenTitle": "Statistieken over radio", + "radioStats_notConnected": "Verbind met een apparaat om radio-statistieken te bekijken.", + "radioStats_firmwareTooOld": "Om de statistieken via radio te kunnen gebruiken, is firmware versie 8 of een nieuwere vereist.", + "radioStats_waiting": "Wacht op gegevens…", + "radioStats_noiseFloor": "Ruisfrequentie: {noiseDbm} dBm", + "radioStats_lastRssi": "Laatste RSSI-waarde: {rssiDbm} dBm", + "radioStats_lastSnr": "Laatste SNR: {snr} dB", + "radioStats_txAir": "TX-tijd (totaal): {seconds} s", + "radioStats_rxAir": "Tijd besteed met RX (totaal): {seconds} s", + "radioStats_chartCaption": "Ruisfrequentie (dBm) over recente metingen.", + "radioStats_stripNoise": "Ruisfrequentie: {noiseDbm} dBm", + "radioStats_stripWaiting": "Radio-statistieken ophalen…", + "radioStats_settingsTile": "Statistieken over radio", + "radioStats_settingsSubtitle": "Ruimtelijke ruis, RSSI, SNR en beschikbare tijd" +} diff --git a/lib/l10n/app_pl.arb b/lib/l10n/app_pl.arb index 27c4fc1..234fa3e 100644 --- a/lib/l10n/app_pl.arb +++ b/lib/l10n/app_pl.arb @@ -1981,5 +1981,68 @@ "settings_telemetryModeUpdated": "Tryb telemetryczny zaktualizowany", "settings_multiAck": "Wiele potwierdzeń: {value}", "map_showOverlaps": "Nakładające się klucze powtarzalne", - "map_runTraceWithReturnPath": "Wróć z powrotem tą samą ścieżką" + "map_runTraceWithReturnPath": "Wróć z powrotem tą samą ścieżką", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "appSettings_languageHu": "Węgierski", + "appSettings_jumpToOldestUnreadSubtitle": "Przy otwieraniu czatu z nieodczytanymi wiadomościami, przewijaj, aby przejść do pierwszej nieodczytanej wiadomości, zamiast do najnowszej.", + "appSettings_jumpToOldestUnread": "Przejdź do najstarszego nieodczytanej wiadomości", + "chat_sendCooldown": "Prosimy o chwilowe oczekiwanie przed ponownym wysłaniem.", + "appSettings_languageJa": "Japoński", + "appSettings_languageKo": "Koreański", + "radioStats_tooltip": "Statystyki dotyczące radia i siatki", + "radioStats_screenTitle": "Statystyki radiowe", + "radioStats_notConnected": "Połącz się z urządzeniem, aby wyświetlić statystyki radiowe.", + "radioStats_firmwareTooOld": "Statystyki radiowe wymagają towarzyszącej oprogramowania w wersji 8 lub nowszej.", + "radioStats_waiting": "Czekam na dane…", + "radioStats_noiseFloor": "Poziom szumów: {noiseDbm} dBm", + "radioStats_lastRssi": "Ostatni poziom RSSI: {rssiDbm} dBm", + "radioStats_lastSnr": "Ostatni poziom SNR: {snr} dB", + "radioStats_txAir": "Czas emisji w stacji TX (całkowity): {seconds} s", + "radioStats_rxAir": "Czas wykorzystania kanału RX (całkowity): {seconds} s", + "radioStats_chartCaption": "Poziom szumów (dBm) w ostatnich próbkach.", + "radioStats_stripNoise": "Poziom szumów: {noiseDbm} dBm", + "radioStats_stripWaiting": "Pobieranie danych dotyczących radia…", + "radioStats_settingsTile": "Statystyki radiowe", + "radioStats_settingsSubtitle": "Szum tła, RSSI, SNR oraz czas dostępny" } diff --git a/lib/l10n/app_pt.arb b/lib/l10n/app_pt.arb index 1ee4130..1ed3dd3 100644 --- a/lib/l10n/app_pt.arb +++ b/lib/l10n/app_pt.arb @@ -1943,5 +1943,68 @@ "settings_telemetryModeUpdated": "Modo de telemetria atualizado", "settings_multiAck": "Multi-ACKs: {value}", "map_showOverlaps": "Sobreposições da Chave Repeater", - "map_runTraceWithReturnPath": "Retornar ao mesmo caminho." -} \ No newline at end of file + "map_runTraceWithReturnPath": "Retornar ao mesmo caminho.", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "appSettings_jumpToOldestUnread": "Vá para a mensagem mais antiga não lida", + "chat_sendCooldown": "Por favor, aguarde um momento antes de reenviar.", + "appSettings_languageHu": "Húngaro", + "appSettings_jumpToOldestUnreadSubtitle": "Ao abrir uma conversa com mensagens não lidas, role para a primeira mensagem não lida, em vez da mais recente.", + "appSettings_languageJa": "Japonês", + "appSettings_languageKo": "Coreano", + "radioStats_tooltip": "Estatísticas de rádio e malha", + "radioStats_screenTitle": "Estatísticas de rádio", + "radioStats_notConnected": "Conecte-se a um dispositivo para visualizar estatísticas de rádio.", + "radioStats_firmwareTooOld": "As estatísticas de rádio exigem o firmware v8 ou uma versão mais recente.", + "radioStats_waiting": "Aguardando dados…", + "radioStats_noiseFloor": "Nível de ruído: {noiseDbm} dBm", + "radioStats_lastRssi": "Último RSSI: {rssiDbm} dBm", + "radioStats_lastSnr": "Último SNR: {snr} dB", + "radioStats_txAir": "Tempo de transmissão da TX (total): {seconds} s", + "radioStats_rxAir": "Tempo de uso do RX (total): {seconds} s", + "radioStats_chartCaption": "Nível de ruído (dBm) em amostras recentes.", + "radioStats_stripNoise": "Nível de ruído: {noiseDbm} dBm", + "radioStats_stripWaiting": "Obtendo estatísticas de rádio…", + "radioStats_settingsTile": "Estatísticas de rádio", + "radioStats_settingsSubtitle": "Nível de ruído, RSSI, SNR e tempo de transmissão" +} diff --git a/lib/l10n/app_ru.arb b/lib/l10n/app_ru.arb index ab32362..7b40819 100644 --- a/lib/l10n/app_ru.arb +++ b/lib/l10n/app_ru.arb @@ -1183,5 +1183,68 @@ "settings_telemetryModeUpdated": "Режим телеметрии обновлен", "settings_multiAck": "Мульти-ACK: {value}", "map_showOverlaps": "Перекрытия ключа повтора", - "map_runTraceWithReturnPath": "Вернуться обратно по тому же пути" -} \ No newline at end of file + "map_runTraceWithReturnPath": "Вернуться обратно по тому же пути", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "chat_sendCooldown": "Пожалуйста, подождите немного, прежде чем отправлять сообщение снова.", + "appSettings_jumpToOldestUnread": "Перейти к самому старому непрочитанному сообщению", + "appSettings_languageHu": "Венгерский", + "appSettings_jumpToOldestUnreadSubtitle": "При открытии чата с непрочитанными сообщениями, прокрутите страницу, чтобы увидеть первое непрочитанное сообщение, а не последнее.", + "appSettings_languageJa": "Японский", + "appSettings_languageKo": "Корейский", + "radioStats_tooltip": "Статистика радио и беспроводной сети", + "radioStats_screenTitle": "Статистика радиовещания", + "radioStats_notConnected": "Подключитесь к устройству, чтобы просмотреть статистику радио.", + "radioStats_firmwareTooOld": "Для работы радиостатистики требуется установленная версия прошивки v8 или более новая.", + "radioStats_waiting": "Ожидаем данных…", + "radioStats_noiseFloor": "Уровень шума: {noiseDbm} дБм", + "radioStats_lastRssi": "Последнее значение RSSI: {rssiDbm} дБм", + "radioStats_lastSnr": "Последнее значение SNR: {snr} дБ", + "radioStats_txAir": "Время эфира на телеканале TX (общее): {seconds} секунд", + "radioStats_rxAir": "Общее время использования RX (в секундах): {seconds} с", + "radioStats_chartCaption": "Уровень шума (дБм) на основе последних измерений.", + "radioStats_stripNoise": "Уровень шума: {noiseDbm} дБм", + "radioStats_stripWaiting": "Получение данных о радио…", + "radioStats_settingsTile": "Статистика радиовещания", + "radioStats_settingsSubtitle": "Уровень шума, RSSI, SNR и время передачи" +} diff --git a/lib/l10n/app_sk.arb b/lib/l10n/app_sk.arb index 12c2f9a..59303ba 100644 --- a/lib/l10n/app_sk.arb +++ b/lib/l10n/app_sk.arb @@ -1943,5 +1943,68 @@ "settings_telemetryModeUpdated": "Režim telemetrie bol aktualizovaný", "settings_multiAck": "Viaceré ACK: {value}", "map_showOverlaps": "Prekrývanie opakovača kľúča", - "map_runTraceWithReturnPath": "Vráťte sa späť po tej istej ceste." -} \ No newline at end of file + "map_runTraceWithReturnPath": "Vráťte sa späť po tej istej ceste.", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "chat_sendCooldown": "Prosím, počkajte chvíľu, než zašlete znova.", + "appSettings_jumpToOldestUnread": "Presk oceň", + "appSettings_jumpToOldestUnreadSubtitle": "Pri otvorení chatu s neprečítanými správami, prejdite do prvého neprečítaného, namiesto poslednej.", + "appSettings_languageHu": "Maďarský", + "appSettings_languageJa": "Japonský", + "appSettings_languageKo": "Kórejský", + "radioStats_tooltip": "Statistiky rádiových a sieťových kanálov", + "radioStats_screenTitle": "Štatistiky rádiových vysielaní", + "radioStats_notConnected": "Pripojte sa k zariadeniu, aby ste mohli sledovať štatistiky rádiového vysielania.", + "radioStats_firmwareTooOld": "Statistické údaje z rádia vyžadujú sprievodný softvér verzie v8 alebo novšej.", + "radioStats_waiting": "Čakám na údaje…", + "radioStats_noiseFloor": "Úroveň hluku: {noiseDbm} dBm", + "radioStats_lastRssi": "Posledný údaj RSSI: {rssiDbm} dBm", + "radioStats_lastSnr": "Posledná hodnota SNR: {snr} dB", + "radioStats_txAir": "Čas vysielania na TX (celkový): {seconds} s", + "radioStats_rxAir": "Čas RX (celkový): {seconds} s", + "radioStats_chartCaption": "Úroveň šumu (dBm) pre posledné vzorky.", + "radioStats_stripNoise": "Úroveň hluku: {noiseDbm} dBm", + "radioStats_stripWaiting": "Získavanie údajov o rádiu…", + "radioStats_settingsTile": "Štatistiky rádiových vysielaní", + "radioStats_settingsSubtitle": "Úroveň hluku, RSSI, SNR a časové rozloženie" +} diff --git a/lib/l10n/app_sl.arb b/lib/l10n/app_sl.arb index 54ea1f5..005054c 100644 --- a/lib/l10n/app_sl.arb +++ b/lib/l10n/app_sl.arb @@ -1943,5 +1943,68 @@ "settings_multiAck": "Večkratni potrditvi: {value}", "settings_telemetryModeUpdated": "Način telemetrije posodobljen", "map_showOverlaps": "Prekrivanje ključa ponovnega predvajanja", - "map_runTraceWithReturnPath": "Vrni se nazaj po isti poti." -} \ No newline at end of file + "map_runTraceWithReturnPath": "Vrni se nazaj po isti poti.", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "appSettings_languageHu": "Madžarski", + "appSettings_jumpToOldestUnreadSubtitle": "Ko odpirate klepet z neprebranimi sporočili, se premaknite na prvo neprebrano sporočilo, namesto najnovejšega.", + "chat_sendCooldown": "Prosimo, počakajte trenutek, preden pošljete ponovno.", + "appSettings_jumpToOldestUnread": "Pritisnite za najstarejše nepročitano sporočilo", + "appSettings_languageJa": "Japonski", + "appSettings_languageKo": "Korejski", + "radioStats_tooltip": "Statistike za radio in mrežo", + "radioStats_notConnected": "Povežite se z napravo, da si ogledate statistiko o radiju.", + "radioStats_screenTitle": "Radijske statistike", + "radioStats_firmwareTooOld": "Statistika za radio zahteva združljivo programsko opremo v8 ali kasnejše.", + "radioStats_waiting": "Čakam na podatke…", + "radioStats_noiseFloor": "Število šuma: {noiseDbm} dBm", + "radioStats_lastRssi": "Najkasnejše vrednost RSSI: {rssiDbm} dBm", + "radioStats_lastSnr": "Najkasnejše vrednost SNR: {snr} dB", + "radioStats_txAir": "Čas na TX (skupno): {seconds} s", + "radioStats_rxAir": "Čas, namenjen RX-ju (skupno): {seconds} s", + "radioStats_chartCaption": "Ravnovredna raven šuma (dBm) za nedavne vzorce.", + "radioStats_stripNoise": "Število šuma: {noiseDbm} dBm", + "radioStats_stripWaiting": "Prejemanje statistike o radiju…", + "radioStats_settingsTile": "Radijske statistike", + "radioStats_settingsSubtitle": "Število šumov, RSSI, SNR in čas, ki ga je napolnila oprema" +} diff --git a/lib/l10n/app_sv.arb b/lib/l10n/app_sv.arb index 1bb0c8a..0784229 100644 --- a/lib/l10n/app_sv.arb +++ b/lib/l10n/app_sv.arb @@ -1943,5 +1943,68 @@ "settings_telemetryModeUpdated": "Telemetri-läge uppdaterat", "settings_multiAck": "Multi-ACKs: {value}", "map_showOverlaps": "Repeater-nyckelöverlappningar", - "map_runTraceWithReturnPath": "Gå tillbaka på samma väg" -} \ No newline at end of file + "map_runTraceWithReturnPath": "Gå tillbaka på samma väg", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "appSettings_jumpToOldestUnreadSubtitle": "När du öppnar en chatt med oinlästa meddelanden, scrolla till det första oinlästa meddelandet istället för det senaste.", + "chat_sendCooldown": "Vänligen vänta en stund innan du skickar igen.", + "appSettings_jumpToOldestUnread": "Gå direkt till det äldsta, obesvarade meddelandet", + "appSettings_languageHu": "Ungerskt", + "appSettings_languageJa": "Japanska", + "appSettings_languageKo": "Koreanska", + "radioStats_tooltip": "Radio- och mesh-statistik", + "radioStats_screenTitle": "Radiostation", + "radioStats_notConnected": "Anslut till en enhet för att visa radiostatistik.", + "radioStats_firmwareTooOld": "Radio statistik kräver kompatibel firmware version 8 eller senare.", + "radioStats_waiting": "Väntar på data…", + "radioStats_noiseFloor": "Bakgrundsnivå: {noiseDbm} dBm", + "radioStats_lastRssi": "Senaste RSSI-värde: {rssiDbm} dBm", + "radioStats_lastSnr": "Senaste SNR: {snr} dB", + "radioStats_txAir": "TX-tid (total): {seconds} sekunder", + "radioStats_rxAir": "RX-tid (total): {seconds} s", + "radioStats_chartCaption": "Ljudnivå (dBm) baserat på de senaste mätningarna.", + "radioStats_stripNoise": "Bakgrundsnivå: {noiseDbm} dBm", + "radioStats_stripWaiting": "Hämtar radiostatistik…", + "radioStats_settingsTile": "Radiostation", + "radioStats_settingsSubtitle": "Bakgrundsnivå, RSSI, SNR och tillgänglig tid" +} diff --git a/lib/l10n/app_uk.arb b/lib/l10n/app_uk.arb index e55a582..cfed24b 100644 --- a/lib/l10n/app_uk.arb +++ b/lib/l10n/app_uk.arb @@ -1943,5 +1943,68 @@ "settings_telemetryModeUpdated": "Режим телеметрії оновлено", "settings_multiAck": "Багатократне підтвердження: {value}", "map_showOverlaps": "Перекриття ключа повторювача", - "map_runTraceWithReturnPath": "Повернутися назад тим же шляхом" -} \ No newline at end of file + "map_runTraceWithReturnPath": "Повернутися назад тим же шляхом", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "chat_sendCooldown": "Будь ласка, зачекайте трохи, перш ніж відправляти знову.", + "appSettings_languageHu": "Угорський", + "appSettings_jumpToOldestUnreadSubtitle": "При відкритті чату з не прочитаними повідомленнями, прокрутіть до першого не прочитаного повідомлення, а не до останнього.", + "appSettings_jumpToOldestUnread": "Перейти до найстарішого непрочитаного повідомлення", + "appSettings_languageJa": "Японська", + "appSettings_languageKo": "Кореєська", + "radioStats_tooltip": "Статистика радіо та мережі", + "radioStats_screenTitle": "Дані про радіостанції", + "radioStats_notConnected": "Підключіться до пристрою, щоб переглядати статистику радіопередач.", + "radioStats_firmwareTooOld": "Статистика радіо приймача вимагає супутнього програмного забезпечення версії 8 або новішої.", + "radioStats_waiting": "Очікую на отримання даних…", + "radioStats_noiseFloor": "Рівень шуму: {noiseDbm} дБм", + "radioStats_lastRssi": "Останній показник RSSI: {rssiDbm} дБм", + "radioStats_lastSnr": "Останній показник SNR: {snr} дБ", + "radioStats_txAir": "Час трансляції на телеканалі TX (загальний): {seconds} секунд", + "radioStats_rxAir": "Загальний час використання RX: {seconds} секунд", + "radioStats_chartCaption": "Рівень шуму (дБм) на основі останніх вимірювань.", + "radioStats_stripNoise": "Рівень шуму: {noiseDbm} дБм", + "radioStats_stripWaiting": "Отримано статистику радіо…", + "radioStats_settingsTile": "Дані про радіостанції", + "radioStats_settingsSubtitle": "Рівень шуму, RSSI, SNR та час, протягом якого пристрій використовує радіоканал." +} diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index b415904..fb758b5 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -1948,5 +1948,68 @@ "settings_multiAck": "多重ACK:{value}", "settings_telemetryModeUpdated": "遥测模式已更新", "map_showOverlaps": "重复键重叠", - "map_runTraceWithReturnPath": "沿着相同的路径返回" -} \ No newline at end of file + "map_runTraceWithReturnPath": "沿着相同的路径返回", + "@radioStats_noiseFloor": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "@radioStats_lastRssi": { + "placeholders": { + "rssiDbm": { + "type": "int" + } + } + }, + "@radioStats_lastSnr": { + "placeholders": { + "snr": { + "type": "String" + } + } + }, + "@radioStats_txAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_rxAir": { + "placeholders": { + "seconds": { + "type": "int" + } + } + }, + "@radioStats_stripNoise": { + "placeholders": { + "noiseDbm": { + "type": "int" + } + } + }, + "chat_sendCooldown": "请稍等片刻后再尝试发送。", + "appSettings_jumpToOldestUnreadSubtitle": "在打开包含未读消息的聊天时,请滚动到第一个未读消息,而不是最新的消息。", + "appSettings_jumpToOldestUnread": "跳转到最旧、未读的文章", + "appSettings_languageHu": "匈牙利", + "appSettings_languageJa": "日语", + "appSettings_languageKo": "韩语", + "radioStats_tooltip": "无线电和网状结构统计数据", + "radioStats_screenTitle": "广播统计数据", + "radioStats_notConnected": "连接到设备以查看收音机统计信息。", + "radioStats_firmwareTooOld": "使用无线电统计功能需要配合使用 v8 或更高版本的固件。", + "radioStats_waiting": "正在等待数据…", + "radioStats_noiseFloor": "噪声水平:{noiseDbm} dBm", + "radioStats_lastRssi": "上次 RSSI 值:{rssiDbm} dBm", + "radioStats_lastSnr": "上次 SNR:{snr} dB", + "radioStats_txAir": "TX 频道播出时间(总时长):{seconds} 秒", + "radioStats_rxAir": "RX 使用时长(总时长):{seconds} 秒", + "radioStats_chartCaption": "近期的噪声水平(dBm)。", + "radioStats_stripNoise": "噪声水平:{noiseDbm} dBm", + "radioStats_stripWaiting": "正在获取收音机数据…", + "radioStats_settingsTile": "广播统计数据", + "radioStats_settingsSubtitle": "噪声水平、RSSI、信噪比和空中时间" +} diff --git a/lib/models/companion_radio_stats.dart b/lib/models/companion_radio_stats.dart new file mode 100644 index 0000000..1e3d3c1 --- /dev/null +++ b/lib/models/companion_radio_stats.dart @@ -0,0 +1,48 @@ +import 'dart:typed_data'; + +import '../connector/meshcore_protocol.dart'; +import '../utils/app_logger.dart'; + +/// Parsed `RESP_CODE_STATS` + `STATS_TYPE_RADIO` (14 bytes total). +class CompanionRadioStats { + final int noiseFloorDbm; + final int lastRssiDbm; + final double lastSnrDb; + final int txAirSecs; + final int rxAirSecs; + final DateTime receivedAt; + + const CompanionRadioStats({ + required this.noiseFloorDbm, + required this.lastRssiDbm, + required this.lastSnrDb, + required this.txAirSecs, + required this.rxAirSecs, + required this.receivedAt, + }); + + static CompanionRadioStats? tryParse(Uint8List frame) { + if (frame.length < 14) return null; + if (frame[0] != respCodeStats || frame[1] != statsTypeRadio) return null; + try { + final reader = BufferReader(frame); + reader.skipBytes(2); + final noise = reader.readInt16LE(); + final rssi = reader.readInt8(); + final snrRaw = reader.readInt8(); + final txAir = reader.readUInt32LE(); + final rxAir = reader.readUInt32LE(); + return CompanionRadioStats( + noiseFloorDbm: noise, + lastRssiDbm: rssi, + lastSnrDb: snrRaw / 4.0, + txAirSecs: txAir, + rxAirSecs: rxAir, + receivedAt: DateTime.now(), + ); + } catch (e) { + appLogger.warn('CompanionRadioStats parse error: $e'); + return null; + } + } +} diff --git a/lib/screens/app_settings_screen.dart b/lib/screens/app_settings_screen.dart index f417715..82b0f1f 100644 --- a/lib/screens/app_settings_screen.dart +++ b/lib/screens/app_settings_screen.dart @@ -294,9 +294,7 @@ class AppSettingsScreen extends StatelessWidget { SwitchListTile( secondary: const Icon(Icons.vertical_align_top), title: Text(context.l10n.appSettings_jumpToOldestUnread), - subtitle: Text( - context.l10n.appSettings_jumpToOldestUnreadSubtitle, - ), + subtitle: Text(context.l10n.appSettings_jumpToOldestUnreadSubtitle), value: settingsService.settings.jumpToOldestUnread, onChanged: settingsService.setJumpToOldestUnread, ), diff --git a/lib/screens/channel_chat_screen.dart b/lib/screens/channel_chat_screen.dart index 7cfba56..12e98d6 100644 --- a/lib/screens/channel_chat_screen.dart +++ b/lib/screens/channel_chat_screen.dart @@ -1119,9 +1119,9 @@ class _ChannelChatScreenState extends State { final now = DateTime.now(); if (_lastChannelSendAt != null && now.difference(_lastChannelSendAt!) < const Duration(seconds: 1)) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(context.l10n.chat_sendCooldown)), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(context.l10n.chat_sendCooldown))); return; } _lastChannelSendAt = now; diff --git a/lib/screens/channel_message_path_screen.dart b/lib/screens/channel_message_path_screen.dart index dd36c21..94b8eee 100644 --- a/lib/screens/channel_message_path_screen.dart +++ b/lib/screens/channel_message_path_screen.dart @@ -64,8 +64,9 @@ class ChannelMessagePathScreen extends StatelessWidget { flipPathAround: true, reversePathAround: !(!channelMessage && !message.isOutgoing), - pathHashByteWidth: - context.read().pathHashByteWidth, + pathHashByteWidth: context + .read() + .pathHashByteWidth, ), ), ), diff --git a/lib/screens/channels_screen.dart b/lib/screens/channels_screen.dart index 3e34568..d67d03d 100644 --- a/lib/screens/channels_screen.dart +++ b/lib/screens/channels_screen.dart @@ -127,10 +127,7 @@ class _ChannelsScreenState extends State canPop: allowBack, child: Scaffold( appBar: AppBar( - title: AppBarTitle( - context.l10n.channels_title, - indicators: false, - ), + title: AppBarTitle(context.l10n.channels_title, indicators: false), centerTitle: true, automaticallyImplyLeading: false, actions: [ diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart index 1a5a79b..2caddcd 100644 --- a/lib/screens/chat_screen.dart +++ b/lib/screens/chat_screen.dart @@ -613,9 +613,9 @@ class _ChatScreenState extends State { final now = DateTime.now(); if (_lastTextSendAt != null && now.difference(_lastTextSendAt!) < const Duration(seconds: 1)) { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text(context.l10n.chat_sendCooldown)), - ); + ScaffoldMessenger.of( + context, + ).showSnackBar(SnackBar(content: Text(context.l10n.chat_sendCooldown))); return; } _lastTextSendAt = now; diff --git a/lib/screens/companion_radio_stats_screen.dart b/lib/screens/companion_radio_stats_screen.dart new file mode 100644 index 0000000..01fb64d --- /dev/null +++ b/lib/screens/companion_radio_stats_screen.dart @@ -0,0 +1,250 @@ +import 'package:flutter/material.dart'; +import 'package:meshcore_open/connector/meshcore_connector.dart'; +import 'package:meshcore_open/models/companion_radio_stats.dart'; +import 'package:meshcore_open/l10n/l10n.dart'; +import 'package:provider/provider.dart'; + +class CompanionRadioStatsScreen extends StatefulWidget { + const CompanionRadioStatsScreen({super.key}); + + @override + State createState() => + _CompanionRadioStatsScreenState(); +} + +class _CompanionRadioStatsScreenState extends State { + final List _noiseHistory = []; + static const int _maxSamples = 120; + MeshCoreConnector? _connector; + DateTime? _lastChartSampleAt; + + @override + void initState() { + super.initState(); + final c = context.read(); + _connector = c; + c.acquireRadioStatsPolling(); + c.radioStatsNotifier.addListener(_onStatsUpdate); + } + + void _onStatsUpdate() { + final s = _connector?.radioStatsNotifier.value; + if (s == null || !mounted) return; + if (_lastChartSampleAt == s.receivedAt) return; + _lastChartSampleAt = s.receivedAt; + setState(() { + _noiseHistory.add(s.noiseFloorDbm.toDouble()); + while (_noiseHistory.length > _maxSamples) { + _noiseHistory.removeAt(0); + } + }); + } + + @override + void dispose() { + _connector?.radioStatsNotifier.removeListener(_onStatsUpdate); + _connector?.releaseRadioStatsPolling(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final l10n = context.l10n; + return Scaffold( + appBar: AppBar( + title: Text(l10n.radioStats_screenTitle), + centerTitle: true, + ), + body: Selector( + selector: (_, c) => ( + connected: c.isConnected, + supported: c.supportsCompanionRadioStats, + ), + builder: (context, state, _) { + if (!state.connected) { + return Center(child: Text(l10n.radioStats_notConnected)); + } + if (!state.supported) { + return Center( + child: Padding( + padding: const EdgeInsets.all(24), + child: Text( + l10n.radioStats_firmwareTooOld, + textAlign: TextAlign.center, + ), + ), + ); + } + final connector = context.read(); + final scheme = Theme.of(context).colorScheme; + final tt = Theme.of(context).textTheme; + + return ValueListenableBuilder( + valueListenable: connector.radioStatsNotifier, + builder: (context, stats, _) { + return ListView( + padding: const EdgeInsets.all(16), + children: [ + if (stats != null) ...[ + Text( + l10n.radioStats_noiseFloor(stats.noiseFloorDbm), + style: tt.titleMedium, + ), + const SizedBox(height: 4), + Text(l10n.radioStats_lastRssi(stats.lastRssiDbm)), + Text( + l10n.radioStats_lastSnr( + stats.lastSnrDb.toStringAsFixed(1), + ), + ), + Text(l10n.radioStats_txAir(stats.txAirSecs)), + Text(l10n.radioStats_rxAir(stats.rxAirSecs)), + const SizedBox(height: 16), + ] else + Text(l10n.radioStats_waiting), + const SizedBox(height: 16), + SizedBox( + height: 200, + child: CustomPaint( + painter: _NoiseChartPainter( + samples: List.from(_noiseHistory), + colorScheme: scheme, + textTheme: tt, + ), + child: const SizedBox.expand(), + ), + ), + const SizedBox(height: 8), + Text( + l10n.radioStats_chartCaption, + style: tt.bodySmall?.copyWith( + color: scheme.onSurfaceVariant, + ), + ), + ], + ); + }, + ); + }, + ), + ); + } +} + +class _NoiseChartPainter extends CustomPainter { + final List samples; + final ColorScheme colorScheme; + final TextTheme textTheme; + + _NoiseChartPainter({ + required this.samples, + required this.colorScheme, + required this.textTheme, + }); + + @override + void paint(Canvas canvas, Size size) { + final bg = Paint()..color = colorScheme.surfaceContainerHighest; + final border = Paint() + ..color = colorScheme.outlineVariant + ..style = PaintingStyle.stroke + ..strokeWidth = 1; + final grid = Paint() + ..color = colorScheme.outlineVariant.withValues(alpha: 0.5) + ..strokeWidth = 1; + final line = Paint() + ..color = colorScheme.primary + ..strokeWidth = 2 + ..style = PaintingStyle.stroke; + + final rect = Rect.fromLTWH(0, 0, size.width, size.height); + canvas.drawRRect( + RRect.fromRectAndRadius(rect, const Radius.circular(8)), + bg, + ); + canvas.drawRRect( + RRect.fromRectAndRadius(rect, const Radius.circular(8)), + border, + ); + + const padL = 40.0; + const padR = 8.0; + const padT = 8.0; + const padB = 24.0; + final chart = Rect.fromLTRB( + padL, + padT, + size.width - padR, + size.height - padB, + ); + + for (var i = 0; i <= 4; i++) { + final y = chart.top + (chart.height * i / 4); + canvas.drawLine(Offset(chart.left, y), Offset(chart.right, y), grid); + } + + if (samples.length < 2) { + final tp = TextPainter( + text: TextSpan( + text: '—', + style: textTheme.bodySmall?.copyWith( + color: colorScheme.onSurfaceVariant, + ), + ), + textDirection: TextDirection.ltr, + )..layout(); + tp.paint( + canvas, + Offset(chart.left + 4, chart.top + chart.height / 2 - tp.height / 2), + ); + return; + } + + double minV = samples.reduce((a, b) => a < b ? a : b); + double maxV = samples.reduce((a, b) => a > b ? a : b); + if ((maxV - minV).abs() < 1) { + minV -= 2; + maxV += 2; + } + final span = maxV - minV; + + for (var i = 0; i <= 2; i++) { + final v = maxV - span * i / 2; + final tp = _yAxisLabel(v); + final y = chart.top + (chart.height * i / 2) - tp.height / 2; + tp.paint(canvas, Offset(4, y)); + } + + final path = Path(); + for (var i = 0; i < samples.length; i++) { + final x = chart.left + (chart.width * i / (samples.length - 1)); + final t = (samples[i] - minV) / span; + final y = chart.bottom - t * chart.height; + if (i == 0) { + path.moveTo(x, y); + } else { + path.lineTo(x, y); + } + } + canvas.drawPath(path, line); + } + + @override + bool shouldRepaint(covariant _NoiseChartPainter oldDelegate) { + return oldDelegate.samples.length != samples.length || + oldDelegate.colorScheme != colorScheme; + } + + TextPainter _yAxisLabel(double v) { + final tp = TextPainter( + text: TextSpan( + text: v.round().toString(), + style: textTheme.labelSmall?.copyWith( + color: colorScheme.onSurfaceVariant, + ), + ), + textDirection: TextDirection.ltr, + )..layout(); + return tp; + } +} diff --git a/lib/screens/contacts_screen.dart b/lib/screens/contacts_screen.dart index cce6a39..d5b01f2 100644 --- a/lib/screens/contacts_screen.dart +++ b/lib/screens/contacts_screen.dart @@ -1244,8 +1244,9 @@ class _ContactsScreenState extends State ? Text(context.l10n.contacts_pathTrace) : Text(context.l10n.contacts_ping), onTap: () { - final hw = - context.read().pathHashByteWidth; + final hw = context + .read() + .pathHashByteWidth; Navigator.push( context, MaterialPageRoute( @@ -1277,8 +1278,9 @@ class _ContactsScreenState extends State ? Text(context.l10n.contacts_pathTrace) : Text(context.l10n.contacts_ping), onTap: () { - final hw = - context.read().pathHashByteWidth; + final hw = context + .read() + .pathHashByteWidth; Navigator.push( context, MaterialPageRoute( @@ -1324,8 +1326,9 @@ class _ContactsScreenState extends State leading: const Icon(Icons.radar, color: Colors.green), title: Text(context.l10n.contacts_chatTraceRoute), onTap: () { - final hw = - context.read().pathHashByteWidth; + final hw = context + .read() + .pathHashByteWidth; Navigator.push( context, MaterialPageRoute( diff --git a/lib/screens/device_screen.dart b/lib/screens/device_screen.dart deleted file mode 100644 index 2343400..0000000 --- a/lib/screens/device_screen.dart +++ /dev/null @@ -1,267 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -import '../connector/meshcore_connector.dart'; -import '../l10n/l10n.dart'; -import '../utils/dialog_utils.dart'; -import '../utils/disconnect_navigation_mixin.dart'; -import '../utils/route_transitions.dart'; -import '../widgets/quick_switch_bar.dart'; -import '../widgets/battery_indicator_chip.dart'; -import '../widgets/radio_stats_entry.dart'; -import 'channels_screen.dart'; -import 'contacts_screen.dart'; -import 'map_screen.dart'; -import 'settings_screen.dart'; - -/// Main hub screen after connecting to a MeshCore device -class DeviceScreen extends StatefulWidget { - const DeviceScreen({super.key}); - - @override - State createState() => _DeviceScreenState(); -} - -class _DeviceScreenState extends State - with DisconnectNavigationMixin { - bool _showBatteryVoltage = false; - int _quickIndex = 0; - - @override - Widget build(BuildContext context) { - return Consumer( - builder: (context, connector, child) { - // Auto-navigate back to scanner if disconnected - if (!checkConnectionAndNavigate(connector)) { - return const SizedBox.shrink(); - } - - final theme = Theme.of(context); - - return PopScope( - canPop: false, - child: Scaffold( - appBar: AppBar( - leadingWidth: 128, - leading: Row( - mainAxisSize: MainAxisSize.min, - children: [ - BatteryIndicatorChip( - connector: connector, - showVoltage: _showBatteryVoltage, - onPressed: () { - setState(() { - _showBatteryVoltage = !_showBatteryVoltage; - }); - }, - ), - const RadioStatsIconButton(), - ], - ), - titleSpacing: 16, - centerTitle: false, - title: _buildAppBarTitle(connector, theme), - automaticallyImplyLeading: false, - actions: [ - IconButton( - icon: const Icon(Icons.bluetooth_disabled), - tooltip: context.l10n.common_disconnect, - onPressed: () => _disconnect(context, connector), - ), - IconButton( - icon: const Icon(Icons.tune), - tooltip: context.l10n.common_settings, - onPressed: () => Navigator.push( - context, - MaterialPageRoute( - builder: (context) => const SettingsScreen(), - ), - ), - ), - ], - ), - body: SafeArea( - child: ListView( - padding: const EdgeInsets.fromLTRB(16, 12, 16, 24), - children: [ - _buildConnectionCard(connector, context), - const SizedBox(height: 16), - _buildSectionLabel(theme, context.l10n.device_quickSwitch), - const SizedBox(height: 12), - _buildQuickSwitchBar(context), - ], - ), - ), - ), - ); - }, - ); - } - - Widget _buildAppBarTitle(MeshCoreConnector connector, ThemeData theme) { - final colorScheme = theme.colorScheme; - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - context.l10n.device_meshcore, - style: theme.textTheme.labelSmall?.copyWith( - fontWeight: FontWeight.w600, - letterSpacing: 0.8, - color: colorScheme.onSurfaceVariant, - ), - ), - Text( - connector.deviceDisplayName, - overflow: TextOverflow.ellipsis, - style: theme.textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w700, - ), - ), - ], - ); - } - - Widget _buildSectionLabel(ThemeData theme, String text) { - return Text( - text, - style: theme.textTheme.titleSmall?.copyWith( - fontWeight: FontWeight.w600, - letterSpacing: 0.6, - color: theme.colorScheme.onSurfaceVariant, - ), - ); - } - - Widget _buildConnectionCard( - MeshCoreConnector connector, - BuildContext context, - ) { - final theme = Theme.of(context); - final colorScheme = theme.colorScheme; - - return Card( - elevation: 0, - color: colorScheme.surfaceContainerHighest, - shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), - child: Padding( - padding: const EdgeInsets.all(16), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - CircleAvatar( - radius: 24, - backgroundColor: colorScheme.primaryContainer, - child: Icon( - Icons.wifi_tethering_rounded, - color: colorScheme.onPrimaryContainer, - ), - ), - const SizedBox(width: 12), - Expanded( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - connector.deviceDisplayName, - style: theme.textTheme.titleMedium?.copyWith( - fontWeight: FontWeight.w700, - ), - ), - const SizedBox(height: 4), - Text( - connector.deviceIdLabel, - style: theme.textTheme.bodySmall?.copyWith( - color: colorScheme.onSurfaceVariant, - ), - ), - ], - ), - ), - ], - ), - const SizedBox(height: 12), - Wrap( - spacing: 8, - runSpacing: 8, - crossAxisAlignment: WrapCrossAlignment.center, - children: [ - Chip( - avatar: Icon( - Icons.check_circle, - size: 18, - color: colorScheme.onSecondaryContainer, - ), - label: Text(context.l10n.common_connected), - backgroundColor: colorScheme.secondaryContainer, - labelStyle: theme.textTheme.labelMedium?.copyWith( - color: colorScheme.onSecondaryContainer, - fontWeight: FontWeight.w600, - ), - visualDensity: VisualDensity.compact, - ), - BatteryIndicatorChip( - connector: connector, - showVoltage: _showBatteryVoltage, - onPressed: () { - setState(() { - _showBatteryVoltage = !_showBatteryVoltage; - }); - }, - ), - ], - ), - ], - ), - ), - ); - } - - Widget _buildQuickSwitchBar(BuildContext context) { - return QuickSwitchBar( - selectedIndex: _quickIndex, - onDestinationSelected: (index) { - _openQuickDestination(index, context); - }, - ); - } - - void _openQuickDestination(int index, BuildContext context) { - if (_quickIndex != index) { - setState(() { - _quickIndex = index; - }); - } - switch (index) { - case 0: - Navigator.pushReplacement( - context, - buildQuickSwitchRoute(const ContactsScreen(hideBackButton: true)), - ); - break; - case 1: - Navigator.pushReplacement( - context, - buildQuickSwitchRoute(const ChannelsScreen(hideBackButton: true)), - ); - break; - case 2: - Navigator.pushReplacement( - context, - buildQuickSwitchRoute(const MapScreen(hideBackButton: true)), - ); - break; - } - } - - Future _disconnect( - BuildContext context, - MeshCoreConnector connector, - ) async { - await showDisconnectDialog(context, connector); - } -} diff --git a/lib/screens/map_screen.dart b/lib/screens/map_screen.dart index f42790c..9616d47 100644 --- a/lib/screens/map_screen.dart +++ b/lib/screens/map_screen.dart @@ -2191,8 +2191,9 @@ class _MapScreenState extends State { if (_pathTrace.isNotEmpty) IconButton( onPressed: () { - final hashW = - context.read().pathHashByteWidth; + final hashW = context + .read() + .pathHashByteWidth; Navigator.push( context, MaterialPageRoute( diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index a926e2b..d9e0d20 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -275,8 +275,8 @@ class _SettingsScreenState extends State { title: Text(l10n.radioStats_settingsTile), subtitle: Text(l10n.radioStats_settingsSubtitle), trailing: const Icon(Icons.chevron_right), - enabled: connector.isConnected && - connector.supportsCompanionRadioStats, + enabled: + connector.isConnected && connector.supportsCompanionRadioStats, onTap: () => pushCompanionRadioStatsScreen(context), ), const Divider(height: 1), diff --git a/lib/widgets/app_bar.dart b/lib/widgets/app_bar.dart index 4a49daf..3062b59 100644 --- a/lib/widgets/app_bar.dart +++ b/lib/widgets/app_bar.dart @@ -36,8 +36,7 @@ class AppBarTitle extends StatelessWidget { final compact = availableWidth < 170; final showSubtitle = !compact && connector.isConnected && selfName != null && subtitle; - final showBattery = - showBatteryIndicator && availableWidth >= 60; + final showBattery = showBatteryIndicator && availableWidth >= 60; final showSnr = availableWidth >= 110; final showIndicators = (showBattery || showSnr) && indicators; @@ -64,21 +63,13 @@ class AppBarTitle extends StatelessWidget { if (showIndicators) const SizedBox(width: 6), if (showIndicators) Row( - crossAxisAlignment: CrossAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ if (showBattery) BatteryIndicator(connector: connector), if (showSnr) SNRIndicator(connector: connector), if (connector.supportsCompanionRadioStats) - ValueListenableBuilder( - valueListenable: connector.radioStatsNotifier, - builder: (context, _, child) => Padding( - padding: const EdgeInsets.only(left: 4), - child: AirActivityDot( - active: connector.radioStatsAirActivityPulse, - ), - ), - ), + const RadioStatsIconButton(compact: true), ], ), trailing ?? const SizedBox.shrink(), diff --git a/lib/widgets/radio_stats_entry.dart b/lib/widgets/radio_stats_entry.dart new file mode 100644 index 0000000..eda0848 --- /dev/null +++ b/lib/widgets/radio_stats_entry.dart @@ -0,0 +1,147 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:meshcore_open/connector/meshcore_connector.dart'; +import 'package:meshcore_open/models/companion_radio_stats.dart'; +import 'package:meshcore_open/l10n/l10n.dart'; +import 'package:meshcore_open/screens/companion_radio_stats_screen.dart'; +import 'package:provider/provider.dart'; + +void pushCompanionRadioStatsScreen(BuildContext context) { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => const CompanionRadioStatsScreen(), + ), + ); +} + +class RadioStatsIconButton extends StatefulWidget { + final bool compact; + + const RadioStatsIconButton({super.key, this.compact = false}); + + @override + State createState() => _RadioStatsIconButtonState(); +} + +class _RadioStatsIconButtonState extends State { + MeshCoreConnector? _connector; + + @override + void initState() { + super.initState(); + final c = context.read(); + _connector = c; + c.acquireRadioStatsPolling(); + } + + @override + void dispose() { + _connector?.releaseRadioStatsPolling(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Selector( + selector: (_, c) => + (connected: c.isConnected, supported: c.supportsCompanionRadioStats), + builder: (context, state, _) { + if (!state.connected || !state.supported) { + return const SizedBox.shrink(); + } + final connector = context.read(); + return ValueListenableBuilder( + valueListenable: connector.radioStatsNotifier, + builder: (context, _, child) { + final dot = AirActivityDot( + active: connector.radioStatsAirActivityPulse, + ); + if (widget.compact) { + return GestureDetector( + onTap: () => pushCompanionRadioStatsScreen(context), + child: Padding( + padding: const EdgeInsets.only(left: 4), + child: dot, + ), + ); + } + return Tooltip( + message: context.l10n.radioStats_tooltip, + child: InkWell( + customBorder: const CircleBorder(), + onTap: () => pushCompanionRadioStatsScreen(context), + child: SizedBox( + width: 48, + height: 48, + child: Center(child: dot), + ), + ), + ); + }, + ); + }, + ); + } +} + +class AirActivityDot extends StatefulWidget { + final bool active; + + const AirActivityDot({super.key, required this.active}); + + @override + State createState() => AirActivityDotState(); +} + +class AirActivityDotState extends State { + Timer? _timer; + bool _blink = true; + + @override + void initState() { + super.initState(); + if (widget.active) _startTimer(); + } + + @override + void didUpdateWidget(covariant AirActivityDot oldWidget) { + super.didUpdateWidget(oldWidget); + if (widget.active && !oldWidget.active) { + _startTimer(); + } else if (!widget.active && oldWidget.active) { + _stopTimer(); + _blink = true; + } + } + + void _startTimer() { + _timer ??= Timer.periodic(const Duration(milliseconds: 400), (_) { + if (!mounted) return; + setState(() => _blink = !_blink); + }); + } + + void _stopTimer() { + _timer?.cancel(); + _timer = null; + } + + @override + void dispose() { + _stopTimer(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final scheme = Theme.of(context).colorScheme; + final on = widget.active && _blink; + return Icon( + Icons.circle, + size: 12, + color: on ? scheme.primary : scheme.outline, + ); + } +} diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 2428a77..ffc8c59 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,7 +9,6 @@ import flutter_blue_plus_darwin import flutter_local_notifications import mobile_scanner import package_info_plus -import path_provider_foundation import share_plus import shared_preferences_foundation import sqflite_darwin @@ -20,7 +19,6 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) MobileScannerPlugin.register(with: registry.registrar(forPlugin: "MobileScannerPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) - PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) SharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "SharedPreferencesPlugin")) SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) diff --git a/test/companion_radio_stats_test.dart b/test/companion_radio_stats_test.dart new file mode 100644 index 0000000..0650ff6 --- /dev/null +++ b/test/companion_radio_stats_test.dart @@ -0,0 +1,39 @@ +import 'dart:typed_data'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:meshcore_open/connector/meshcore_protocol.dart'; +import 'package:meshcore_open/models/companion_radio_stats.dart'; + +void main() { + test('CompanionRadioStats.tryParse golden 14-byte radio frame', () { + // noise -90 (0xA6FF LE), rssi -70 (0xBA), snr raw 8 -> 2.0 dB, + // tx_air 1000 LE, rx_air 2000 LE + final frame = Uint8List.fromList([ + respCodeStats, + statsTypeRadio, + 0xA6, + 0xFF, + 0xBA, + 0x08, + 0xE8, + 0x03, + 0x00, + 0x00, + 0xD0, + 0x07, + 0x00, + 0x00, + ]); + final s = CompanionRadioStats.tryParse(frame); + expect(s, isNotNull); + expect(s!.noiseFloorDbm, -90); + expect(s.lastRssiDbm, -70); + expect(s.lastSnrDb, 2.0); + expect(s.txAirSecs, 1000); + expect(s.rxAirSecs, 2000); + }); + + test('CompanionRadioStats.tryParse rejects short frame', () { + expect(CompanionRadioStats.tryParse(Uint8List(10)), isNull); + }); +}