feat(i18n): translate Settings, the Device modal and the registries (stage 9b)

Second slice of app.js: the Device modal (Info rows, Stats table, Share tab),
Settings device/radio saves and the shared "Settings saved" toasts, contacts
cleanup, device commands, the PWA notification toasts, and everything app.js
renders into the Region, Analyzer and Observer registries plus the per-channel
region picker and the Backup/Optimize modal.

Radio parameter names stay English per the glossary (Bandwidth, Spreading
Factor, Coding Rate, Multi Acks), as do the node roles in the type column; the
generic row labels around them are translated. The five `x.error || 'Failed to
save'` fallbacks are normalised onto the existing common.save_failed rather
than minting a near-duplicate key.

Verified against the local container with F:\tmp\pwverify\i18n-stage9b.js,
which drives the three Device tabs, five Settings tabs and the Backup modal in
both languages: 12 identical strings, all of them device names, hex keys,
MQTT topic literals or a backup filename.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
MarekWo
2026-08-01 11:19:31 +02:00
parent 75f8b4cfca
commit 8bd7ce6ab6
3 changed files with 452 additions and 167 deletions
+174 -167
View File
File diff suppressed because it is too large Load Diff
+139
View File
@@ -1,17 +1,51 @@
{
"analyzer.add": "Add analyzer",
"analyzer.choose": "Choose analyzer",
"analyzer.clear_default_title": "Clear default",
"analyzer.edit": "Edit analyzer",
"analyzer.empty": "No analyzers configured. Click \"Add analyzer\" to add one.",
"analyzer.load_failed": "Failed to load analyzers",
"analyzer.name_ph": "e.g. MarWoj Analyzer",
"analyzer.name_required": "Name is required",
"analyzer.set_default_title": "Mark as default",
"analyzer.toast.default_error": "Network error updating default",
"analyzer.toast.default_failed": "Failed to update default",
"analyzer.toast.delete_error": "Network error deleting analyzer",
"analyzer.toast.delete_failed": "Failed to delete analyzer",
"analyzer.toast.none_configured": "No analyzer configured. Add one in Settings → Analyzer.",
"analyzer.toast.save_error": "Network error saving analyzer",
"analyzer.toast.save_failed": "Failed to save analyzer",
"analyzer.toast.update_error": "Network error updating analyzer",
"analyzer.toast.update_failed": "Failed to update analyzer",
"analyzer.url": "URL template",
"analyzer.url_hint": "Must include <code>{packetHash}</code>.",
"analyzer.url_invalid": "URL must start with http:// or https://",
"backup.auto_off": "Auto-backup disabled",
"backup.auto_on": "Auto: daily at {time}, keep {days}d",
"backup.create": "Create Backup",
"backup.created": "Backup created: {filename}",
"backup.creating": "Creating...",
"backup.current_size": "Current size: …",
"backup.download_title": "Download",
"backup.empty": "No backups yet",
"backup.error": "Backup failed",
"backup.failed": "Backup failed: {error}",
"backup.freed": "freed {size}",
"backup.freed_none": "no space to reclaim",
"backup.load_failed": "Failed to load backups",
"backup.optimize_error": "Optimize failed",
"backup.optimize_failed": "Optimize failed: {error}",
"backup.optimize_hint": "Reclaim space freed by message retention. Runs SQLite <code>VACUUM</code>; readers keep working but writes are paused for a few seconds.",
"backup.optimize_now": "Optimize now",
"backup.optimize_stuck": "Optimize is still running after 10 minutes — check container logs",
"backup.optimize_title": "Optimize database",
"backup.optimized": "Optimized: {freed} in {seconds}s",
"backup.optimizing": "Optimizing…",
"backup.size": "Current size: {size}",
"backup.size_unknown": "Size: unknown",
"backup.title": "Database Backup",
"backup.vacuum_running": "Running VACUUM…",
"backup.vacuum_running_for": "Running VACUUM… ({seconds}s)",
"channels.add_new": "Add New Channel",
"channels.confirm.remove": "Remove channel \"{name}\"?",
"channels.create_btn": "Create & Auto-generate Key",
@@ -142,6 +176,7 @@
"common.deleting": "Deleting...",
"common.disabled": "Disabled",
"common.disconnected": "Disconnected",
"common.edit": "Edit",
"common.enabled": "Enabled",
"common.failed_with": "Failed: {error}",
"common.hours_ago": "{count}h ago",
@@ -166,6 +201,7 @@
"common.network_error": "Network error",
"common.network_error_detail": "Network error: {error}",
"common.never": "Never",
"common.no": "No",
"common.refresh": "Refresh",
"common.remove": "Remove",
"common.save": "Save",
@@ -181,6 +217,7 @@
"one": "{count} year ago",
"other": "{count} years ago"
},
"common.yes": "Yes",
"common.yesterday": "Yesterday",
"console.clear_title": "Clear output history",
"console.connect_failed": "Failed to connect: {error}",
@@ -234,6 +271,7 @@
"contacts.card.add_desc": "Add from URI, QR code, or manual entry",
"contacts.card.existing_desc": "Manage all stored contacts",
"contacts.card.pending_desc": "Contacts awaiting manual approval",
"contacts.cleanup.confirm": "Remove all contacts inactive for more than {hours} hours?",
"contacts.cleanup.confirm_title": "Confirm Contact Cleanup",
"contacts.cleanup.date_field": "Date Field:",
"contacts.cleanup.days": "Days of Inactivity (0 = ignore):",
@@ -242,6 +280,8 @@
"contacts.cleanup.delete_confirm": "The following <span id=\"cleanupContactCount\">0</span> contact(s) will be permanently deleted:",
"contacts.cleanup.enable": "Enable Auto-Cleanup",
"contacts.cleanup.enable_hint": "When enabled, contacts matching the above criteria will be automatically deleted daily at the specified hour",
"contacts.cleanup.error": "Cleanup failed",
"contacts.cleanup.failed": "Cleanup failed: {error}",
"contacts.cleanup.last_advert": "Last Advert",
"contacts.cleanup.last_modified": "Last Modified",
"contacts.cleanup.name_filter": "Name Filter (optional):",
@@ -344,7 +384,44 @@
"coord.confirm": "Confirm",
"coord.hint": "Click on the map to select coordinates",
"coord.title": "Pick Coordinates",
"device.cmd.failed": "Command failed: {error}",
"device.cmd.sent": "{command} sent successfully",
"device.info.bw": "Bandwidth",
"device.info.copy_title": "Copy to clipboard",
"device.info.cr": "Coding Rate",
"device.info.freq": "Frequency",
"device.info.load_failed": "Failed to load device info",
"device.info.loc_sharing": "Location Sharing",
"device.info.location": "Location",
"device.info.location_none": "Not available",
"device.info.manual_add": "Manual Add Contacts",
"device.info.multi_acks": "Multi Acks",
"device.info.name": "Name",
"device.info.none": "No device info available",
"device.info.pubkey": "Public Key",
"device.info.sf": "Spreading Factor",
"device.info.tx_power": "TX Power",
"device.info.type": "Type",
"device.info.type_unknown": "Unknown ({code})",
"device.share.copy_uri": "Copy URI",
"device.share.hint": "Share this QR code or URI so others can add your device as a contact.",
"device.share.unavailable": "Device info not available",
"device.share.uri": "Contact URI:",
"device.share_hint": "Click to generate share code",
"device.stats.battery": "Battery",
"device.stats.channel_msgs": "Channel Msgs",
"device.stats.contacts_db": "Contacts (DB)",
"device.stats.db_size": "DB Size",
"device.stats.direct_msgs": "Direct Msgs",
"device.stats.errors": "Errors",
"device.stats.load_failed": "Failed to load stats",
"device.stats.none": "No statistics available",
"device.stats.packets_rx": "Packets RX",
"device.stats.packets_tx": "Packets TX",
"device.stats.queue": "Queue",
"device.stats.rx_air": "RX Air Time",
"device.stats.tx_air": "TX Air Time",
"device.stats.uptime": "Uptime",
"device.stats_hint": "Click to load stats",
"device.tab.info": "Info",
"device.tab.share": "Share",
@@ -453,13 +530,34 @@
"nav.select_channel_title": "Select channel",
"nav.tcp_title": "TCP connection",
"observer.add_broker": "Add broker",
"observer.counters": "packets captured: <strong>{seen}</strong>, published: <strong>{published}</strong>",
"observer.edit_broker": "Edit broker",
"observer.empty": "No brokers configured. Click \"Add broker\" to add one.",
"observer.host": "Host",
"observer.host_required": "Host is required",
"observer.iata_invalid": "Location code must be empty or exactly 3 letters",
"observer.load_failed": "Failed to load observer status",
"observer.name_ph": "e.g. My MQTT server",
"observer.name_required": "Name is required",
"observer.off": "Observer is <strong>off</strong>.",
"observer.password": "Password",
"observer.password_hint": "Leave the password blank to keep the current one.",
"observer.port": "Port",
"observer.port_invalid": "Port must be 1-65535",
"observer.ports_hint": "Typical ports: 1883 (plain), 8883 (TLS).",
"observer.state.connected": "connected",
"observer.state.error": "error",
"observer.state.offline": "offline",
"observer.state.running": "running",
"observer.state.waiting": "waiting",
"observer.toast.delete_error": "Network error deleting broker",
"observer.toast.delete_failed": "Failed to delete broker",
"observer.toast.save_error": "Network error saving broker",
"observer.toast.save_failed": "Failed to save broker",
"observer.toast.settings_error": "Network error saving observer settings",
"observer.toast.settings_failed": "Failed to save observer settings",
"observer.toast.update_error": "Network error updating broker",
"observer.toast.update_failed": "Failed to update broker",
"observer.use_tls": "Use TLS",
"observer.username": "Username",
"observer.verify_tls": "Verify TLS certificate",
@@ -840,6 +938,8 @@
"settings.appear.theme_dark_desc": "Easy on the eyes, deep navy palette",
"settings.appear.theme_light": "Light",
"settings.appear.theme_light_desc": "Classic bright interface",
"settings.appear.toast.reload_failed": "Failed to reload translations",
"settings.appear.toast.reloaded": "Translations reloaded: {names}",
"settings.chat.autoclose": "Auto-close after (s)",
"settings.chat.autoclose_help": "Seconds before the route popup closes automatically",
"settings.chat.no_autoclose": "Don't close automatically",
@@ -856,6 +956,7 @@
"settings.contacts.suppress_notifs": "Suppress new advert notifications",
"settings.contacts.suppress_notifs_help": "Hide the badge over Contact Management and the browser notification when new pending contacts arrive. The Pending Contacts list itself still shows them. Requires Manual approval ON.",
"settings.device.bw": "Bandwidth (kHz)",
"settings.device.confirm.radio": "Changing radio settings will disconnect from the mesh network. Continue?",
"settings.device.cr": "Coding Rate",
"settings.device.freq": "Frequency (MHz)",
"settings.device.hash_1b": "1 byte (default)",
@@ -870,6 +971,15 @@
"settings.device.sf": "Spreading Factor",
"settings.device.share_pos": "Share position in advert",
"settings.device.share_pos_help": "Include GPS coordinates in device advertisement",
"settings.device.toast.cr_invalid": "Coding rate must be 5-8",
"settings.device.toast.freq_invalid": "Invalid frequency",
"settings.device.toast.info_save_failed": "Failed to save public info",
"settings.device.toast.info_saved": "Public info saved",
"settings.device.toast.name_empty": "Device name cannot be empty",
"settings.device.toast.radio_save_failed": "Failed to save radio settings",
"settings.device.toast.radio_saved": "Radio settings saved",
"settings.device.toast.sf_invalid": "Spreading factor must be 5-12",
"settings.device.toast.tx_invalid": "TX power must be 0-30 dBm",
"settings.device.tx_power": "TX Power (dBm)",
"settings.iface.breakpoint": "Sidebar breakpoint (px)",
"settings.iface.breakpoint_help": "Default: 992. Range: 600-2000.",
@@ -882,6 +992,7 @@
"settings.iface.pos_top_left": "Top left",
"settings.iface.pos_top_right": "Top right",
"settings.iface.position": "Position on screen",
"settings.iface.toast.autoclose_invalid": "Invalid auto-close duration",
"settings.iface.toast_autoclose_help": "Seconds before a notification closes automatically",
"settings.iface.toast_desc": "Controls the small toasts shown after actions (e.g. \"Advert Sent\", errors).",
"settings.iface.toast_no_autoclose_help": "Notifications stay until dismissed via their close button",
@@ -902,6 +1013,12 @@
"settings.msg.other": "Other",
"settings.notif.blocked": "Blocked",
"settings.notif.desc": "Browser notifications appear when the app is hidden or in the background.",
"settings.notif.toast.blocked_help": "Notifications are blocked. Change browser settings: Settings → Site Settings → Notifications",
"settings.notif.toast.denied": "Notifications blocked. Change browser settings to enable them.",
"settings.notif.toast.disabled": "Notifications disabled",
"settings.notif.toast.enabled": "Notifications enabled",
"settings.notif.toast.error": "Error enabling notifications",
"settings.notif.toast.unsupported": "Notifications are not supported in this browser",
"settings.notif.unavailable": "Unavailable",
"settings.notif.works_hidden": "Works when app is hidden",
"settings.observer.advert_interval": "Flood advert interval (h)",
@@ -912,10 +1029,28 @@
"settings.observer.iata": "Location code (IATA)",
"settings.observer.iata_ph": "e.g. KRK",
"settings.observer.intro": "Publish every mesh packet this device overhears to MQTT brokers, in the <code>meshcore-packet-capture</code> format (topics <code>meshcore/IATA/PUBKEY/packets</code>). Compatible with letsmesh-style packet analyzers.",
"settings.regions.delete_title": "Delete region",
"settings.regions.empty": "No regions defined. Add one below.",
"settings.regions.intro": "Only repeaters allowing a region will forward messages tagged with it. Find standardised region names at <a href=\"https://regions.meshcore.nz/\" target=\"_blank\" rel=\"noopener\">regions.meshcore.nz</a>.",
"settings.regions.is_default": "default",
"settings.regions.load_failed": "Failed to load regions",
"settings.regions.name_ph": "Region name (e.g. pl, pl-ma)",
"settings.regions.none_row": "None — use firmware default",
"settings.regions.picker_empty": "No regions defined yet.",
"settings.regions.picker_manage": "Manage Regions",
"settings.regions.registry": "Region Registry",
"settings.regions.tip": "Tip: pick the default region via the radio button, or select <em>None</em> to fall back to the firmware default. The chosen region is also pushed to the firmware so any untagged channel uses it.",
"settings.regions.toast.add_error": "Network error adding region",
"settings.regions.toast.add_failed": "Failed to add region",
"settings.regions.toast.clear_error": "Network error clearing default",
"settings.regions.toast.clear_failed": "Failed to clear default region",
"settings.regions.toast.default_error": "Network error setting default",
"settings.regions.toast.default_failed": "Failed to set default region",
"settings.regions.toast.delete_error": "Network error deleting region",
"settings.regions.toast.delete_failed": "Failed to delete region",
"settings.regions.toast.name_invalid": "Invalid region name. Allowed: letters, digits, - $ # (max 30 bytes, no spaces).",
"settings.regions.toast.scope_error": "Network error saving region scope",
"settings.regions.toast.scope_failed": "Failed to save region scope",
"settings.reset_defaults": "Reset to defaults",
"settings.tab.analyzer": "Analyzer",
"settings.tab.appearance": "Appearance",
@@ -926,6 +1061,10 @@
"settings.tab.notifications": "Notifications",
"settings.tab.observer": "Observer",
"settings.tab.regions": "Regions",
"settings.toast.save_failed": "Failed to save settings",
"settings.toast.saved": "Settings saved",
"settings.toast.setting_network_error": "Network error saving setting",
"settings.toast.setting_save_failed": "Failed to save setting",
"update.checking": "Checking for updates...",
"update.now": "Update Now",
"update.reload": "Reload Page",
+139
View File
@@ -1,17 +1,51 @@
{
"analyzer.add": "Dodaj analizator",
"analyzer.choose": "Wybierz analizator",
"analyzer.clear_default_title": "Wyczyść domyślny",
"analyzer.edit": "Edytuj analizator",
"analyzer.empty": "Brak skonfigurowanych analizatorów. Kliknij \"Dodaj analizator\", aby dodać.",
"analyzer.load_failed": "Nie udało się wczytać analizatorów",
"analyzer.name_ph": "np. Mój analizator",
"analyzer.name_required": "Nazwa jest wymagana",
"analyzer.set_default_title": "Ustaw jako domyślny",
"analyzer.toast.default_error": "Błąd sieci przy zmianie domyślnego analizatora",
"analyzer.toast.default_failed": "Nie udało się zmienić domyślnego analizatora",
"analyzer.toast.delete_error": "Błąd sieci przy usuwaniu analizatora",
"analyzer.toast.delete_failed": "Nie udało się usunąć analizatora",
"analyzer.toast.none_configured": "Brak skonfigurowanego analizatora. Dodaj go w Ustawienia → Analyzer.",
"analyzer.toast.save_error": "Błąd sieci przy zapisie analizatora",
"analyzer.toast.save_failed": "Nie udało się zapisać analizatora",
"analyzer.toast.update_error": "Błąd sieci przy aktualizacji analizatora",
"analyzer.toast.update_failed": "Nie udało się zaktualizować analizatora",
"analyzer.url": "Szablon URL",
"analyzer.url_hint": "Musi zawierać <code>{packetHash}</code>.",
"analyzer.url_invalid": "URL musi zaczynać się od http:// lub https://",
"backup.auto_off": "Automatyczna kopia wyłączona",
"backup.auto_on": "Automatycznie: codziennie o {time}, przechowywanie {days} dni",
"backup.create": "Utwórz kopię",
"backup.created": "Utworzono kopię: {filename}",
"backup.creating": "Tworzenie...",
"backup.current_size": "Bieżący rozmiar: …",
"backup.download_title": "Pobierz",
"backup.empty": "Brak kopii zapasowych",
"backup.error": "Kopia zapasowa nie powiodła się",
"backup.failed": "Kopia zapasowa nie powiodła się: {error}",
"backup.freed": "zwolniono {size}",
"backup.freed_none": "brak miejsca do odzyskania",
"backup.load_failed": "Nie udało się wczytać kopii zapasowych",
"backup.optimize_error": "Optymalizacja nie powiodła się",
"backup.optimize_failed": "Optymalizacja nie powiodła się: {error}",
"backup.optimize_hint": "Odzyskaj miejsce zwolnione przez retencję wiadomości. Uruchamia SQLite <code>VACUUM</code>; odczyty działają, ale zapisy są wstrzymane na kilka sekund.",
"backup.optimize_now": "Optymalizuj teraz",
"backup.optimize_stuck": "Optymalizacja trwa już ponad 10 minut — sprawdź logi kontenera",
"backup.optimize_title": "Optymalizuj bazę danych",
"backup.optimized": "Zoptymalizowano: {freed} w {seconds}s",
"backup.optimizing": "Optymalizowanie…",
"backup.size": "Bieżący rozmiar: {size}",
"backup.size_unknown": "Rozmiar: nieznany",
"backup.title": "Kopia zapasowa bazy danych",
"backup.vacuum_running": "Trwa VACUUM…",
"backup.vacuum_running_for": "Trwa VACUUM… ({seconds}s)",
"channels.add_new": "Dodaj nowy kanał",
"channels.confirm.remove": "Usunąć kanał \"{name}\"?",
"channels.create_btn": "Utwórz i wygeneruj klucz",
@@ -148,6 +182,7 @@
"common.deleting": "Usuwanie...",
"common.disabled": "Wyłączone",
"common.disconnected": "Rozłączono",
"common.edit": "Edytuj",
"common.enabled": "Włączone",
"common.failed_with": "Niepowodzenie: {error}",
"common.hours_ago": "{count} godz. temu",
@@ -178,6 +213,7 @@
"common.network_error": "Błąd sieci",
"common.network_error_detail": "Błąd sieci: {error}",
"common.never": "Nigdy",
"common.no": "Nie",
"common.refresh": "Odśwież",
"common.remove": "Usuń",
"common.save": "Zapisz",
@@ -195,6 +231,7 @@
"many": "{count} lat temu",
"other": "{count} roku temu"
},
"common.yes": "Tak",
"common.yesterday": "Wczoraj",
"console.clear_title": "Wyczyść zapis konsoli",
"console.connect_failed": "Nie udało się połączyć: {error}",
@@ -248,6 +285,7 @@
"contacts.card.add_desc": "Dodaj z URI, kodu QR lub ręcznie",
"contacts.card.existing_desc": "Zarządzaj wszystkimi zapisanymi kontaktami",
"contacts.card.pending_desc": "Kontakty oczekujące na ręczne zatwierdzenie",
"contacts.cleanup.confirm": "Usunąć wszystkie kontakty nieaktywne dłużej niż {hours} godz.?",
"contacts.cleanup.confirm_title": "Potwierdź czyszczenie kontaktów",
"contacts.cleanup.date_field": "Pole daty:",
"contacts.cleanup.days": "Dni nieaktywności (0 = pomiń):",
@@ -256,6 +294,8 @@
"contacts.cleanup.delete_confirm": "Następujące kontakty (<span id=\"cleanupContactCount\">0</span>) zostaną trwale usunięte:",
"contacts.cleanup.enable": "Włącz automatyczne czyszczenie",
"contacts.cleanup.enable_hint": "Gdy włączone, kontakty spełniające powyższe kryteria będą usuwane codziennie o wskazanej godzinie",
"contacts.cleanup.error": "Czyszczenie nie powiodło się",
"contacts.cleanup.failed": "Czyszczenie nie powiodło się: {error}",
"contacts.cleanup.last_advert": "Ostatni advert",
"contacts.cleanup.last_modified": "Ostatnia zmiana",
"contacts.cleanup.name_filter": "Filtr nazwy (opcjonalnie):",
@@ -364,7 +404,44 @@
"coord.confirm": "Zatwierdź",
"coord.hint": "Kliknij na mapie, aby wybrać współrzędne",
"coord.title": "Wybierz współrzędne",
"device.cmd.failed": "Polecenie nie powiodło się: {error}",
"device.cmd.sent": "Wysłano: {command}",
"device.info.bw": "Bandwidth",
"device.info.copy_title": "Kopiuj do schowka",
"device.info.cr": "Coding Rate",
"device.info.freq": "Częstotliwość",
"device.info.load_failed": "Nie udało się wczytać informacji o urządzeniu",
"device.info.loc_sharing": "Udostępnianie lokalizacji",
"device.info.location": "Lokalizacja",
"device.info.location_none": "Niedostępna",
"device.info.manual_add": "Ręczne dodawanie kontaktów",
"device.info.multi_acks": "Multi Acks",
"device.info.name": "Nazwa",
"device.info.none": "Brak informacji o urządzeniu",
"device.info.pubkey": "Klucz publiczny",
"device.info.sf": "Spreading Factor",
"device.info.tx_power": "Moc TX",
"device.info.type": "Typ",
"device.info.type_unknown": "Nieznany ({code})",
"device.share.copy_uri": "Kopiuj URI",
"device.share.hint": "Udostępnij ten kod QR lub URI, aby inni mogli dodać Twoje urządzenie jako kontakt.",
"device.share.unavailable": "Informacje o urządzeniu niedostępne",
"device.share.uri": "URI kontaktu:",
"device.share_hint": "Kliknij, aby wygenerować kod udostępniania",
"device.stats.battery": "Bateria",
"device.stats.channel_msgs": "Wiadomości kanałowe",
"device.stats.contacts_db": "Kontakty (DB)",
"device.stats.db_size": "Rozmiar bazy",
"device.stats.direct_msgs": "Wiadomości prywatne",
"device.stats.errors": "Błędy",
"device.stats.load_failed": "Nie udało się wczytać statystyk",
"device.stats.none": "Brak statystyk",
"device.stats.packets_rx": "Pakiety RX",
"device.stats.packets_tx": "Pakiety TX",
"device.stats.queue": "Kolejka",
"device.stats.rx_air": "Czas antenowy RX",
"device.stats.tx_air": "Czas antenowy TX",
"device.stats.uptime": "Czas pracy",
"device.stats_hint": "Kliknij, aby wczytać statystyki",
"device.tab.info": "Informacje",
"device.tab.share": "Udostępnij",
@@ -479,13 +556,34 @@
"nav.select_channel_title": "Wybierz kanał",
"nav.tcp_title": "Połączenie TCP",
"observer.add_broker": "Dodaj brokera",
"observer.counters": "przechwycone pakiety: <strong>{seen}</strong>, opublikowane: <strong>{published}</strong>",
"observer.edit_broker": "Edytuj brokera",
"observer.empty": "Brak skonfigurowanych brokerów. Kliknij \"Dodaj brokera\", aby dodać.",
"observer.host": "Host",
"observer.host_required": "Host jest wymagany",
"observer.iata_invalid": "Kod lokalizacji musi być pusty albo mieć dokładnie 3 litery",
"observer.load_failed": "Nie udało się wczytać statusu obserwatora",
"observer.name_ph": "np. Mój serwer MQTT",
"observer.name_required": "Nazwa jest wymagana",
"observer.off": "Obserwator jest <strong>wyłączony</strong>.",
"observer.password": "Hasło",
"observer.password_hint": "Zostaw hasło puste, aby zachować bieżące.",
"observer.port": "Port",
"observer.port_invalid": "Port musi być z zakresu 1-65535",
"observer.ports_hint": "Typowe porty: 1883 (bez szyfrowania), 8883 (TLS).",
"observer.state.connected": "połączony",
"observer.state.error": "błąd",
"observer.state.offline": "offline",
"observer.state.running": "działa",
"observer.state.waiting": "czeka",
"observer.toast.delete_error": "Błąd sieci przy usuwaniu brokera",
"observer.toast.delete_failed": "Nie udało się usunąć brokera",
"observer.toast.save_error": "Błąd sieci przy zapisie brokera",
"observer.toast.save_failed": "Nie udało się zapisać brokera",
"observer.toast.settings_error": "Błąd sieci przy zapisie ustawień obserwatora",
"observer.toast.settings_failed": "Nie udało się zapisać ustawień obserwatora",
"observer.toast.update_error": "Błąd sieci przy aktualizacji brokera",
"observer.toast.update_failed": "Nie udało się zaktualizować brokera",
"observer.use_tls": "Użyj TLS",
"observer.username": "Nazwa użytkownika",
"observer.verify_tls": "Weryfikuj certyfikat TLS",
@@ -898,6 +996,8 @@
"settings.appear.theme_dark_desc": "Łagodny dla oczu, głęboki granat",
"settings.appear.theme_light": "Jasny",
"settings.appear.theme_light_desc": "Klasyczny jasny interfejs",
"settings.appear.toast.reload_failed": "Nie udało się przeładować tłumaczeń",
"settings.appear.toast.reloaded": "Przeładowano tłumaczenia: {names}",
"settings.chat.autoclose": "Zamknij automatycznie po (s)",
"settings.chat.autoclose_help": "Ile sekund do automatycznego zamknięcia popupu trasy",
"settings.chat.no_autoclose": "Nie zamykaj automatycznie",
@@ -914,6 +1014,7 @@
"settings.contacts.suppress_notifs": "Wycisz powiadomienia o nowych advertach",
"settings.contacts.suppress_notifs_help": "Ukryj plakietkę nad Zarządzaniem kontaktami oraz powiadomienie przeglądarki, gdy pojawiają się nowe oczekujące kontakty. Sama lista oczekujących kontaktów nadal je pokazuje. Wymaga włączonego zatwierdzania ręcznego.",
"settings.device.bw": "Bandwidth (kHz)",
"settings.device.confirm.radio": "Zmiana ustawień radia rozłączy urządzenie z siecią mesh. Kontynuować?",
"settings.device.cr": "Coding Rate",
"settings.device.freq": "Częstotliwość (MHz)",
"settings.device.hash_1b": "1 bajt (domyślnie)",
@@ -928,6 +1029,15 @@
"settings.device.sf": "Spreading Factor",
"settings.device.share_pos": "Udostępniaj pozycję w advert",
"settings.device.share_pos_help": "Dołącz współrzędne GPS do advertu urządzenia",
"settings.device.toast.cr_invalid": "Coding Rate musi być z zakresu 5-8",
"settings.device.toast.freq_invalid": "Nieprawidłowa częstotliwość",
"settings.device.toast.info_save_failed": "Nie udało się zapisać informacji publicznych",
"settings.device.toast.info_saved": "Informacje publiczne zapisane",
"settings.device.toast.name_empty": "Nazwa urządzenia nie może być pusta",
"settings.device.toast.radio_save_failed": "Nie udało się zapisać ustawień radia",
"settings.device.toast.radio_saved": "Ustawienia radia zapisane",
"settings.device.toast.sf_invalid": "Spreading Factor musi być z zakresu 5-12",
"settings.device.toast.tx_invalid": "Moc TX musi być z zakresu 0-30 dBm",
"settings.device.tx_power": "Moc TX (dBm)",
"settings.iface.breakpoint": "Próg szerokości paska bocznego (px)",
"settings.iface.breakpoint_help": "Domyślnie: 992. Zakres: 600-2000.",
@@ -940,6 +1050,7 @@
"settings.iface.pos_top_left": "Lewy górny",
"settings.iface.pos_top_right": "Prawy górny",
"settings.iface.position": "Pozycja na ekranie",
"settings.iface.toast.autoclose_invalid": "Nieprawidłowy czas automatycznego zamknięcia",
"settings.iface.toast_autoclose_help": "Ile sekund do automatycznego zamknięcia powiadomienia",
"settings.iface.toast_desc": "Steruje małymi powiadomieniami po akcjach (np. \"Advert wysłany\", błędy).",
"settings.iface.toast_no_autoclose_help": "Powiadomienia pozostają, dopóki nie zamkniesz ich przyciskiem",
@@ -960,6 +1071,12 @@
"settings.msg.other": "Inne",
"settings.notif.blocked": "Zablokowane",
"settings.notif.desc": "Powiadomienia przeglądarki pojawiają się, gdy aplikacja jest ukryta lub w tle.",
"settings.notif.toast.blocked_help": "Powiadomienia są zablokowane. Zmień ustawienia przeglądarki: Ustawienia → Ustawienia witryn → Powiadomienia",
"settings.notif.toast.denied": "Powiadomienia zablokowane. Zmień ustawienia przeglądarki, aby je włączyć.",
"settings.notif.toast.disabled": "Powiadomienia wyłączone",
"settings.notif.toast.enabled": "Powiadomienia włączone",
"settings.notif.toast.error": "Błąd włączania powiadomień",
"settings.notif.toast.unsupported": "Powiadomienia nie są obsługiwane w tej przeglądarce",
"settings.notif.unavailable": "Niedostępne",
"settings.notif.works_hidden": "Działa, gdy aplikacja jest ukryta",
"settings.observer.advert_interval": "Interwał flood advert (h)",
@@ -970,10 +1087,28 @@
"settings.observer.iata": "Kod lokalizacji (IATA)",
"settings.observer.iata_ph": "np. KRK",
"settings.observer.intro": "Publikuj każdy pakiet mesh usłyszany przez to urządzenie do brokerów MQTT, w formacie <code>meshcore-packet-capture</code> (tematy <code>meshcore/IATA/PUBKEY/packets</code>). Zgodne z analizatorami pakietów w stylu letsmesh.",
"settings.regions.delete_title": "Usuń region",
"settings.regions.empty": "Brak zdefiniowanych regionów. Dodaj poniżej.",
"settings.regions.intro": "Tylko repeatery zezwalające na dany region będą przekazywać oznaczone nim wiadomości. Standardowe nazwy regionów znajdziesz na <a href=\"https://regions.meshcore.nz/\" target=\"_blank\" rel=\"noopener\">regions.meshcore.nz</a>.",
"settings.regions.is_default": "domyślny",
"settings.regions.load_failed": "Nie udało się wczytać regionów",
"settings.regions.name_ph": "Nazwa regionu (np. pl, pl-ma)",
"settings.regions.none_row": "Brak — użyj domyślnego z firmware",
"settings.regions.picker_empty": "Nie zdefiniowano jeszcze żadnego regionu.",
"settings.regions.picker_manage": "Zarządzaj regionami",
"settings.regions.registry": "Rejestr regionów",
"settings.regions.tip": "Wskazówka: wybierz domyślny region przyciskiem radiowym albo wybierz <em>Brak</em>, aby wrócić do domyślnego ustawienia firmware. Wybrany region jest też wysyłany do firmware, więc użyje go każdy nieoznaczony kanał.",
"settings.regions.toast.add_error": "Błąd sieci przy dodawaniu regionu",
"settings.regions.toast.add_failed": "Nie udało się dodać regionu",
"settings.regions.toast.clear_error": "Błąd sieci przy czyszczeniu domyślnego regionu",
"settings.regions.toast.clear_failed": "Nie udało się wyczyścić domyślnego regionu",
"settings.regions.toast.default_error": "Błąd sieci przy ustawianiu domyślnego regionu",
"settings.regions.toast.default_failed": "Nie udało się ustawić domyślnego regionu",
"settings.regions.toast.delete_error": "Błąd sieci przy usuwaniu regionu",
"settings.regions.toast.delete_failed": "Nie udało się usunąć regionu",
"settings.regions.toast.name_invalid": "Nieprawidłowa nazwa regionu. Dozwolone: litery, cyfry, - $ # (maks. 30 bajtów, bez spacji).",
"settings.regions.toast.scope_error": "Błąd sieci przy zapisie zasięgu regionu",
"settings.regions.toast.scope_failed": "Nie udało się zapisać zasięgu regionu",
"settings.reset_defaults": "Przywróć domyślne",
"settings.tab.analyzer": "Analizator",
"settings.tab.appearance": "Wygląd",
@@ -984,6 +1119,10 @@
"settings.tab.notifications": "Powiadomienia",
"settings.tab.observer": "Observer",
"settings.tab.regions": "Regiony",
"settings.toast.save_failed": "Nie udało się zapisać ustawień",
"settings.toast.saved": "Ustawienia zapisane",
"settings.toast.setting_network_error": "Błąd sieci przy zapisie ustawienia",
"settings.toast.setting_save_failed": "Nie udało się zapisać ustawienia",
"update.checking": "Sprawdzanie aktualizacji...",
"update.now": "Aktualizuj teraz",
"update.reload": "Przeładuj stronę",