From eb439c8baa8411ad197b02b3f372bc7894e19dae Mon Sep 17 00:00:00 2001 From: Kaj Schittecat Date: Sat, 22 Aug 2026 22:29:05 +0200 Subject: [PATCH] i18n: find the strings the audit could not see, and the apps it never checked pisti87 reported a long list of text that stays English whatever the language, and said the strings were in his language file and still did not appear (#257). Both halves are true, and the reason is the audit. The extractor only ever recognised TR("literal"). Three very common shapes were therefore invisible: mk_row_btn("Reload tiles in view", cb) // helper TR()s its parameter for (auto& r : rows) TR(r.label) // literal lives in a local table TR(contactsSortOptName(m)) // helper returns one of several All three translate correctly at runtime, so the source looks properly wrapped. But the literal at the call site was never emitted as a key, so it never entered a .lang file, so no translator could ever supply it -- and adding it by hand did nothing, because the audit's key list is what the files are checked against. That is 51 strings across the map options sheet, the sort sheets, the contacts filters and the home launcher. The audit now understands all three, plus tr("...") in the Lua apps, and the newly visible keys are in all thirteen files as placeholders so translators can see them. 1017 keys, up from 966. Four strings were genuinely raw and are now wrapped: the reader's idle status, the Discover empty feed, the crash-report export button and Paste (move/copy). Lua apps had no way to translate anything at all, so every built-in was hard English regardless of the device language. wada.sys.tr() gives them the same table the interface uses; airtime 1.4 is the first to use it, with the `sys.tr or identity` fallback so it still runs on older firmware. Two more instances of the drift this issue is really about: - gen-lua-builtin.py read out/firmware/apps/, which nothing writes -- the deploy rsyncs deploy/apps/ straight to the VPS. So the mirror was stale and the two apps added in beta_68 were never baked in: boards that cannot reach the Store shipped without them. It reads the canonical directory now, and regenerates from the same pre-build hook as the language table. - Baking a row whose translation equals its key does nothing, since TR() returns the key on a miss. Skipping them takes the header from 1.11 MB to 939 KB and gives the V4 back 16 KB of flash, which matters at 89%. Co-Authored-By: Claude Opus 5 --- LUA_APPS.md | 3 +- deploy/apps/airtime/1.4/airtime.json | 6 + deploy/apps/airtime/1.4/airtime.lua | 95 ++ deploy/apps/apps.json | 2 +- deploy/apps/lang/bg.lang | 61 ++ deploy/apps/lang/de.lang | 61 ++ deploy/apps/lang/el.lang | 61 ++ deploy/apps/lang/es.lang | 61 ++ deploy/apps/lang/fr.lang | 61 ++ deploy/apps/lang/hu.lang | 50 + deploy/apps/lang/it.lang | 61 ++ deploy/apps/lang/nl.lang | 61 ++ deploy/apps/lang/pt-br.lang | 61 ++ deploy/apps/lang/ro.lang | 61 ++ deploy/apps/lang/ru.lang | 61 ++ deploy/apps/lang/sr.lang | 61 ++ deploy/apps/lang/uk.lang | 61 ++ deploy/site/sdk.html | 1 + platformio.ini | 14 +- scripts/build/gen-lang-builtin.py | 10 +- scripts/build/gen-lua-builtin.py | 14 +- scripts/build/i18n-audit.py | 150 +++ scripts/build/pre_gen_baked.py | 46 + scripts/build/pre_gen_lang.py | 31 - src/ui-touch/LuaAppHost.cpp | 16 + src/ui-touch/UITask.cpp | 11 +- src/ui-touch/i18n_builtin.h | 1108 ------------------- src/ui-touch/lua_builtin.h | 1467 +++++++++++++++++++++++++- tanmatsu/build.sh | 8 +- tdisplay_p4/build.sh | 8 +- 30 files changed, 2596 insertions(+), 1176 deletions(-) create mode 100644 deploy/apps/airtime/1.4/airtime.json create mode 100644 deploy/apps/airtime/1.4/airtime.lua create mode 100644 scripts/build/pre_gen_baked.py delete mode 100644 scripts/build/pre_gen_lang.py diff --git a/LUA_APPS.md b/LUA_APPS.md index 27d3c080..eb880e29 100644 --- a/LUA_APPS.md +++ b/LUA_APPS.md @@ -50,7 +50,8 @@ We do NOT bind LVGL wholesale. We bind a stable, versioned surface we own - `wada.store` — per-app KV: `get/set(key, value)` under an `app..` prefix in the file-mode prefs. Quota 2 KB/app (respects the SdNvsPrefs blob cap). - `wada.sys` — `millis()`, `board()` (id, screen w/h, caps: keyboard, - trackball, gps), `version()`, `toast(msg)`. + trackball, gps), `version()`, `toast(msg)`, `tr(s)` (the firmware's own + translation table, so an app is not stuck in English). - `wada.timer` — `every(ms)` drives `on_tick` cadence (min 33 ms). Sandbox env (no `io`, `os`, `require`, `dofile`, `load` of new chunks; diff --git a/deploy/apps/airtime/1.4/airtime.json b/deploy/apps/airtime/1.4/airtime.json new file mode 100644 index 00000000..98263bbc --- /dev/null +++ b/deploy/apps/airtime/1.4/airtime.json @@ -0,0 +1,6 @@ +{ + "id": "airtime", + "name": "Airtime", + "ver": "1.4", + "desc": "Utilization bars with a % axis, rx/tx split, duty ceiling, budget. Reset button top-right." +} diff --git a/deploy/apps/airtime/1.4/airtime.lua b/deploy/apps/airtime/1.4/airtime.lua new file mode 100644 index 00000000..d8ae4389 --- /dev/null +++ b/deploy/apps/airtime/1.4/airtime.lua @@ -0,0 +1,95 @@ +-- Airtime (Lua) — channel utilization over time: live + average bars with a % +-- axis, rx/tx air split, duty ceiling, tx budget and packet counters. +local ui, sys, mesh, timer = wada.ui, wada.sys, wada.mesh, wada.timer +-- Translate through the device's language table (wada.sys.tr, added for #257). +-- Older firmware has no sys.tr, so fall back to the English string rather than error. +local tr = sys.tr or function(x) return x end +local C = ui.colors +local app = {} + +local W, narrow +local head, sub, legend, detail, chart +local base, t0, last +local peak_pct = 0 + +local function restart_window() + local st = mesh.stats() + base = { rx = st.rx_air_s, tx = st.tx_air_s } + t0 = sys.millis() + last = { ms = t0, rx = st.rx_air_s, tx = st.tx_air_s } + peak_pct = 0 + chart:fill(1, 0) + chart:fill(2, 0) + head:set(tr("sampling...")) + head:color(C.accent) + sys.toast(tr("window restarted"), 900) +end + +local function refresh() + local st = mesh.stats() + local now = sys.millis() + local wall = (now - t0) / 1000 + if wall < 0.5 then return end + + local rx_air, tx_air = st.rx_air_s - base.rx, st.tx_air_s - base.tx + local avg = math.min(100, (rx_air + tx_air) * 100 / wall) + + local dw = (now - last.ms) / 1000 + local live = 0 + if dw > 0 then + live = math.min(100, ((st.rx_air_s - last.rx) + (st.tx_air_s - last.tx)) * 100 / dw) + end + last = { ms = now, rx = st.rx_air_s, tx = st.tx_air_s } + if live > peak_pct then peak_pct = live end + + chart:push(1, math.floor(live)) + chart:push(2, math.floor(avg)) + + head:set(string.format(tr("channel busy %.1f%%"), live)) + head:color(live > 50 and C.bad or live > 20 and 0xE8A33D or C.good) + sub:set(string.format(tr("avg %.1f%% peak %.1f%% over %ds"), avg, peak_pct, math.floor(wall))) + if narrow then + detail:set(string.format("air rx %ds / tx %ds\nduty %d%% budget %dms\ntx %d rx %d err %d", + rx_air, tx_air, st.duty_pct, st.tx_budget_ms, st.tx_pkts, st.rx_pkts, st.rx_err)) + else + detail:set(string.format("air rx %ds / tx %ds duty %d%% budget %dms\ntx %d rx %d err %d drop %d SF%d", + rx_air, tx_air, st.duty_pct, st.tx_budget_ms, st.tx_pkts, st.rx_pkts, st.rx_err, st.rx_dropped, st.sf)) + end +end + +function app.on_open(w, h) + W, narrow = w, w < 280 + local LH12, LH16 = ui.text_h(12), ui.text_h(16) + + local y = 2 + head = ui.label(tr("sampling..."), 4, y, 16, C.accent); head:width(w - 86) + ui.button(tr("Reset"), w - 76, y, 70, 30, function() restart_window() end) -- top-right + y = y + LH16 + 4 + sub = ui.label("", 4, y, 12, C.sub); sub:width(w - 10) + y = y + LH12 + 5 + + local AX = 34 + local det_lines = narrow and 3 or 2 + local ch_h = h - y - (det_lines * LH12) - LH12 - 14 + if ch_h < 48 then ch_h = 48 end + if ch_h > 110 then ch_h = 110 end + chart = ui.chart(w - AX - 8, ch_h, 60, C.accent, 0x4F9DF7, true) + chart:pos(AX, y) + chart:range(0, 100) + chart:axis(3, AX) + y = y + ch_h + 4 + + legend = ui.label(tr("teal = now blue = average"), 4, y, 12, C.sub); legend:width(w - 10) + y = y + LH12 + 2 + detail = ui.label("", 4, y, 12, C.text); detail:width(w - 10) + + local st = mesh.stats() + base = { rx = st.rx_air_s, tx = st.tx_air_s } + t0 = sys.millis() + last = { ms = t0, rx = st.rx_air_s, tx = st.tx_air_s } + timer.every(1000) +end + +function app.on_tick(dt) refresh() end + +return app diff --git a/deploy/apps/apps.json b/deploy/apps/apps.json index 5453dbfd..ca29d7ac 100644 --- a/deploy/apps/apps.json +++ b/deploy/apps/apps.json @@ -9,7 +9,7 @@ { "id": "airtime", "name": "Airtime", - "ver": "1.3", + "ver": "1.4", "desc": "Utilization bars with a % axis, rx/tx split, duty ceiling, budget. Reset button top-right." }, { diff --git a/deploy/apps/lang/bg.lang b/deploy/apps/lang/bg.lang index ddbe0ded..71da0481 100644 --- a/deploy/apps/lang/bg.lang +++ b/deploy/apps/lang/bg.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/de.lang b/deploy/apps/lang/de.lang index 340f2584..d5e06085 100644 --- a/deploy/apps/lang/de.lang +++ b/deploy/apps/lang/de.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/el.lang b/deploy/apps/lang/el.lang index 61b4322f..2d20bd9b 100644 --- a/deploy/apps/lang/el.lang +++ b/deploy/apps/lang/el.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/es.lang b/deploy/apps/lang/es.lang index ee8e8ab6..cb284f6a 100644 --- a/deploy/apps/lang/es.lang +++ b/deploy/apps/lang/es.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/fr.lang b/deploy/apps/lang/fr.lang index 95b4bed4..beb2ff88 100644 --- a/deploy/apps/lang/fr.lang +++ b/deploy/apps/lang/fr.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/hu.lang b/deploy/apps/lang/hu.lang index 56c1d849..3a502ebc 100644 --- a/deploy/apps/lang/hu.lang +++ b/deploy/apps/lang/hu.lang @@ -1066,3 +1066,53 @@ Auto-add on for %s — new %s land in Contacts automatically. Automatikus hozzá Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Térkép adatok © OpenStreetMap közreműködői.\nopenstreetmap.org/copyright\nAz Open Database License (ODbL) licenc alatt.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Térkép stílus © OpenTopoMap (CC-BY-SA) — opentopomap.org\nTérkép adatok © OpenStreetMap közreműködői (ODbL) + SRTM.\n\n How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. A csempék működése:\nA térkép 256×256 képpontos „slippy” csempékből épül fel. Csak a megtekintett területhez szükséges csempék töltődnek le — nincs tömeges előzetes letöltés.\n\nMivel az eszköz nem támogatja a HTTPS-t (a Wi-Fi elindítása után nincs elegendő heap memória), és a JPEG képek dekódolása sokkal kevesebb erőforrást igényel, mint a PNG-é, a csempék a wadamesh proxyn keresztül érkeznek: a proxy HTTPS-en keresztül lekéri a forrásból a PNG-t egy azonosító User-Agent használatával, JPEG formátumba kódolja át, majd eltárolja a gyorsítótárban. Az eszköz ezután minden csempét a saját flash memóriájában is eltárol, így egy csempét csak egyszer kell letölteni.\n\nAz Options → Reload tiles lehetőséggel újra letöltheted a jelenleg megtekintett terület csempéit, ha valamelyik hibásan jelenik meg. +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +Auth failed Auth failed +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/it.lang b/deploy/apps/lang/it.lang index aec09695..d87d47b1 100644 --- a/deploy/apps/lang/it.lang +++ b/deploy/apps/lang/it.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/nl.lang b/deploy/apps/lang/nl.lang index dfc0e87b..262cf315 100644 --- a/deploy/apps/lang/nl.lang +++ b/deploy/apps/lang/nl.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/pt-br.lang b/deploy/apps/lang/pt-br.lang index 7004dfd9..9cd58765 100644 --- a/deploy/apps/lang/pt-br.lang +++ b/deploy/apps/lang/pt-br.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/ro.lang b/deploy/apps/lang/ro.lang index e887db0d..8f89bd99 100644 --- a/deploy/apps/lang/ro.lang +++ b/deploy/apps/lang/ro.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/ru.lang b/deploy/apps/lang/ru.lang index 2635fc23..cab3c5e5 100644 --- a/deploy/apps/lang/ru.lang +++ b/deploy/apps/lang/ru.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/sr.lang b/deploy/apps/lang/sr.lang index 0e18b084..1f229464 100644 --- a/deploy/apps/lang/sr.lang +++ b/deploy/apps/lang/sr.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/apps/lang/uk.lang b/deploy/apps/lang/uk.lang index 0f2c4f96..ea29c55a 100644 --- a/deploy/apps/lang/uk.lang +++ b/deploy/apps/lang/uk.lang @@ -1037,3 +1037,64 @@ Send private messages as me Send private messages as me What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back. Wi-Fi off, new map areas can't download Wi-Fi off, new map areas can't download App permissions App permissions +"%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. "%s" wants to send discovery probes.\n\nEach probe asks every node in range to reply, so it uses airtime on the whole local mesh, not just yours.\n\nNothing is sent under your name and no message is transmitted. +? ? +About / credits About / credits +Auth failed Auth failed +Auto-add on for %s — new %s land in Contacts automatically. Auto-add on for %s — new %s land in Contacts automatically. +Batteryactivityon Batteryactivityon +Console mode Console mode +Console mode (experimental) Console mode (experimental) +Direct (0-hop) only Direct (0-hop) only +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back, and if it ever fails to start the device returns here on its own. Toggling reboots. +EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. EXPERIMENTAL. Boots into a text console with no graphical interface: type commands, read replies. Frees the memory and processor time the interface uses. Type 'ui' in the console to come back. Toggling reboots. +Enter text Enter text +Entering console mode - rebooting... Entering console mode - rebooting... +Favorite Favorite +Geblokkeerde gebruikers Geblokkeerde gebruikers +Hide system filesShow system files Hide system filesShow system files +How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. How tiles work:\nThe map is built from 256×256 "slippy" tiles. Only the tiles for the area you're viewing are fetched — there is no bulk pre-download.\n\nBecause this device can't do HTTPS (not enough heap after Wi-Fi starts) and decodes JPEG far more cheaply than PNG, tiles come from the wadamesh proxy: it fetches the upstream PNG over HTTPS with an identifying User-Agent, re-encodes it as JPEG, and caches it. Your device then caches each tile to its own flash, so a tile is only downloaded once.\n\nUse Options → Reload tiles to re-download the tiles currently in view if one looks corrupted. +Init… Init… +Leaving console mode - rebooting... Leaving console mode - rebooting... +Link lost Link lost +MESH MESH +Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n +Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n +Name (A-Z) Name (A-Z) +Nearest first Nearest first +Other networksNetworks Other networksNetworks +Paste (move)Paste (copy) Paste (move)Paste (copy) +Recent message Recent message +Reload tiles in view Reload tiles in view +Repeaters Repeaters +SIGNAL SIGNAL +SSID not found SSID not found +Saved networks Saved networks +Select to delete Select to delete +Send discovery probes Send discovery probes +Show contacts Show contacts +Show coordinates Show coordinates +Show tile z/x/y Show tile z/x/y +Starting… Starting… +Stop sharing loc Share my loc Stop sharing loc Share my loc +Supprimer Supprimer +Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.Turn on legacy per-transmit switching?\n\nDiagnostic mode, for comparison only. It transmits on the on-board antenna and listens on the external one, so your outbound signal will be much weaker than your inbound.\n\nResets to the on-board antenna on every reboot. +Text console (experimental) Text console (experimental) +Tile debug overlay Tile debug overlay +Unblock Block Unblock Block +Unfav Favorite Unfav Favorite +chats chats +repeaters repeaters +rooms rooms +sensors sensors +tap to cycle off / on / auto tap to cycle off / on / auto +#7A7F87 Scanning… nothing has answered yet# #7A7F87 Scanning… nothing has answered yet# +Export crash report (%uK) Export crash report (%uK) +On-device text browser · no proxy, no tracking On-device text browser · no proxy, no tracking +Paste (copy) Paste (copy) +Paste (move) Paste (move) +avg %.1f%% peak %.1f%% over %ds avg %.1f%% peak %.1f%% over %ds +channel busy %.1f%% channel busy %.1f%% +sampling... sampling... +teal = now blue = average teal = now blue = average +window restarted window restarted diff --git a/deploy/site/sdk.html b/deploy/site/sdk.html index aa95fa8f..1a62687e 100644 --- a/deploy/site/sdk.html +++ b/deploy/site/sdk.html @@ -460,6 +460,7 @@ end wada.sys.random(n)Integer in 1..n. wada.sys.epoch()Unix time in seconds, or nil when the clock has not been set yet (no GPS fix and no NTP). Always handle the nil. wada.sys.datetime(){year, month, day, hour, min, sec, wday} in local time. wday is 0 for Sunday. + wada.sys.tr(s)Translate s through the device's active language, using the same table the firmware's own interface uses. Returns s unchanged when there is no translation, so it is always safe to wrap a string. Add your keys to deploy/apps/lang/<code>.lang alongside the firmware's. Older firmware has no sys.tr: write local tr = sys.tr or function(x) return x end and call tr(). wada.sys.beep()Short beep on boards with a buzzer; silent elsewhere, and silent when the user has sound off. wada.sys.caps(){sdk_ext, keyboard, touch, sd, sd_list, discover, input, rx_identity, list, packets, sensors, map, measure}. Check sdk_ext before using anything marked ext, and sd_list before using wada.sd. Feature flags let an app degrade on older firmware instead of erroring. wada.sys.battery() ext{mv, pct, charging}. diff --git a/platformio.ini b/platformio.ini index fbe4c1fb..7f067bf5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -15,7 +15,7 @@ framework = arduino board = heltec_v4 monitor_speed = 115200 board_build.partitions = partitions_tft_touch.csv -extra_scripts = pre:scripts/build/pre_gen_lang.py, pre:scripts/inject_wifi_env.py, merge-bin.py +extra_scripts = pre:scripts/build/pre_gen_baked.py, pre:scripts/inject_wifi_env.py, merge-bin.py build_flags = ; 1.17 core: ESP32Board.cpp includes -> MicroNMEALocationProvider.h (header-only @@ -330,7 +330,7 @@ framework = arduino board = attaky_mesh_series monitor_speed = 115200 board_build.partitions = partitions_tft_touch.csv -extra_scripts = pre:scripts/build/pre_gen_lang.py, pre:scripts/inject_wifi_env.py, merge-bin.py +extra_scripts = pre:scripts/build/pre_gen_baked.py, pre:scripts/inject_wifi_env.py, merge-bin.py build_flags = ; 1.17 core: ESP32Board.cpp includes -> MicroNMEALocationProvider.h (header-only @@ -516,7 +516,7 @@ framework = arduino board = t-deck monitor_speed = 115200 board_build.partitions = variants/lilygo_tdeck/partitions_tdeck_touch.csv -extra_scripts = pre:scripts/build/pre_gen_lang.py, pre:scripts/inject_wifi_env.py, merge-bin.py +extra_scripts = pre:scripts/build/pre_gen_baked.py, pre:scripts/inject_wifi_env.py, merge-bin.py build_flags = ; 1.17 core: ESP32Board.cpp includes -> MicroNMEALocationProvider.h (header-only @@ -684,7 +684,7 @@ framework = arduino board = lilygo-t-lora-pager monitor_speed = 115200 board_build.partitions = variants/lilygo_tlora_pager/partitions_tlora_pager_touch.csv -extra_scripts = pre:scripts/build/pre_gen_lang.py, pre:scripts/inject_wifi_env.py, pre:scripts/build/patch_nimble_freertos_timer.py, merge-bin.py +extra_scripts = pre:scripts/build/pre_gen_baked.py, pre:scripts/inject_wifi_env.py, pre:scripts/build/patch_nimble_freertos_timer.py, merge-bin.py build_flags = ; 1.17 core: ESP32Board.cpp includes -> MicroNMEALocationProvider.h (header-only @@ -919,7 +919,7 @@ framework = arduino board = lilygo-t-lora-pager monitor_speed = 115200 board_build.partitions = variants/lilygo_tlora_pager/partitions_tlora_pager_touch.csv -extra_scripts = pre:scripts/build/pre_gen_lang.py, pre:scripts/inject_wifi_env.py, pre:scripts/build/patch_nimble_freertos_timer.py, merge-bin.py +extra_scripts = pre:scripts/build/pre_gen_baked.py, pre:scripts/inject_wifi_env.py, pre:scripts/build/patch_nimble_freertos_timer.py, merge-bin.py build_flags = ; 1.17 core: ESP32Board.cpp includes -> MicroNMEALocationProvider.h (header-only @@ -1143,7 +1143,7 @@ board_build.partitions = variants/thinknode_m9/partitions_m9_touch.csv ; DriveDiosInSleepMode (0x012A, FW 0x0308+) with CMD_PERR -> begin() = -706. ; The pre-script makes RadioLib's config() skip it on old FW (idempotent, ; per-env libdeps copy). See scripts/build/patch_radiolib_lr11x0.py. -extra_scripts = pre:scripts/build/pre_gen_lang.py, pre:scripts/inject_wifi_env.py, pre:scripts/build/patch_radiolib_lr11x0.py, merge-bin.py +extra_scripts = pre:scripts/build/pre_gen_baked.py, pre:scripts/inject_wifi_env.py, pre:scripts/build/patch_radiolib_lr11x0.py, merge-bin.py build_flags = ; 1.17 core: ESP32Board.cpp includes -> MicroNMEALocationProvider.h (header-only @@ -1391,7 +1391,7 @@ board = rak_tap_v2 monitor_speed = 115200 board_build.flash_mode = dio ; RAK3312 requires DIO (board JSON defaults to qio) board_build.partitions = variants/rak_tap_v2/partitions_rak_tap_v2_touch.csv -extra_scripts = pre:scripts/build/pre_gen_lang.py, pre:scripts/inject_wifi_env.py, merge-bin.py +extra_scripts = pre:scripts/build/pre_gen_baked.py, pre:scripts/inject_wifi_env.py, merge-bin.py ; Round-1b USB: MODE=1 HW CDC (single COM7). No 1200bps touch — use DTR/RTS reset. build_unflags = diff --git a/scripts/build/gen-lang-builtin.py b/scripts/build/gen-lang-builtin.py index e9960ef8..01c09cb9 100644 --- a/scripts/build/gen-lang-builtin.py +++ b/scripts/build/gen-lang-builtin.py @@ -82,7 +82,13 @@ def main(): rows = langs.get(code, {}) sym = 'kBuiltin_' + code.replace('-', '_') w.append('static const I18nPair %s[] = {' % sym) + # A row whose translation IS the key does nothing: TR() already returns the + # key when it finds no match. The .lang files carry those deliberately, as + # placeholders telling translators the string exists, but baking them costs + # flash on exactly the board that needs the flash (the V4 sits at ~90%). for k in sorted(rows): # sorted: TR() binary-searches + if rows[k] == k: + continue w.append(' { "%s", "%s" },' % (c_escape(k), c_escape(rows[k]))) w.append('};') @@ -103,8 +109,8 @@ def main(): w.append('') open(OUT, 'w', encoding='utf-8').write('\n'.join(w)) - total = sum(len(r) for r in langs.values()) - print('%s: %d languages, %d rows, %d bytes' % + total = sum(sum(1 for k, v in r.items() if v != k) for r in langs.values()) + print('%s: %d languages, %d translated rows, %d bytes' % (os.path.relpath(OUT, ROOT), len(langs), total, os.path.getsize(OUT))) diff --git a/scripts/build/gen-lua-builtin.py b/scripts/build/gen-lua-builtin.py index d7048638..bc990bc6 100644 --- a/scripts/build/gen-lua-builtin.py +++ b/scripts/build/gen-lua-builtin.py @@ -7,16 +7,22 @@ tries /apps/.lua first and falls back to an embedded source when the file is not there. That file-first order is what makes a seeded app updatable — download a newer version from the Store and the file simply wins. -This generates src/ui-touch/lua_builtin.h from out/firmware/apps/, i.e. exactly -the sources the Store serves, so a board that cannot reach the Store still ships +This generates src/ui-touch/lua_builtin.h from deploy/apps/, i.e. exactly the +sources the Store serves, so a board that cannot reach the Store still ships with the apps rather than an empty drawer. +It used to read out/firmware/apps/ instead. Nothing writes that directory -- +deploy-apps.sh rsyncs deploy/apps/ straight to the VPS -- so it was a stale +mirror, and the "same sources the Store serves" guarantee was false: a bumped +app shipped to the Store while the baked-in copy stayed on whatever version was +mirrored last (#257). + Run from the repo root: python3 scripts/build/gen-lua-builtin.py """ import json, os, re, sys ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -APPS = os.path.join(ROOT, 'out/firmware/apps') +APPS = os.path.join(ROOT, 'deploy/apps') # canonical; what deploy-apps.sh publishes OUT = os.path.join(ROOT, 'src/ui-touch/lua_builtin.h') DELIM = 'WADALUA' # raw-string delimiter: keeps Lua source verbatim @@ -43,7 +49,7 @@ def main(): sys.exit('no app sources found under ' + APPS) w = ['// Generated by scripts/build/gen-lua-builtin.py — DO NOT EDIT.', - '// Source: out/firmware/apps/ (the same .lua the Lua Store serves).', + '// Source: deploy/apps/ (the same .lua the Lua Store serves).', '// Seeded built-ins: a downloaded /apps/.lua always wins.', '#pragma once', '', 'struct LuaBuiltinApp { const char* id; const char* name; const char* ver; const char* src; };', ''] diff --git a/scripts/build/i18n-audit.py b/scripts/build/i18n-audit.py index 3806e505..14664016 100644 --- a/scripts/build/i18n-audit.py +++ b/scripts/build/i18n-audit.py @@ -67,8 +67,158 @@ def source_keys(): k = unescape_c(lit) if k.strip(): keys.add(k) + + # HELPER-WRAPPED keys: mk_row_btn("Reload tiles in view", cb) and its ~20 + # siblings take a raw literal and call TR() on it *inside* the helper. At + # runtime they translate correctly -- but the extractor above only ever saw + # TR("literal"), so the literal at the CALL SITE was never emitted as a key, + # so it never landed in a .lang file, so no translator could ever supply it. + # That is why a whole map/options/settings sheet stayed English in every + # language while looking perfectly wrapped in the source (#257). + # + # Two passes: find every function or lambda that calls TR() on one of its own + # parameters and note which parameter, then pull the literal out of that + # argument position at every call site. + for f in _sources(): + src = open(f, encoding='utf-8').read() + for name, idx in _tr_wrapping_helpers(src): + for arg in _call_args_at(src, name, idx): + parts = re.findall(r'"((?:[^"\\]|\\.)*)"', arg) + if not parts: + continue + k = unescape_c(''.join(parts)) + while k and 0xE000 <= ord(k[0]) <= 0xF8FF: + k = k[1:] + k = k.lstrip(' ') + if k.strip(): + keys.add(k) + + # RANGE-FOR over a local table: `struct {...} rows[] = {{"Show contacts", ...}};` + # then `for (auto& r : rows) TR(r.label)`. Same blind spot as the helper case -- + # correct at runtime, invisible to a TR("literal") scan, so untranslatable. + for f in _sources(): + src = open(f, encoding='utf-8').read() + for m in re.finditer(r'for\s*\(\s*(?:const\s+)?auto\s*&?\s*(\w+)\s*:\s*(\w+)\s*\)', src): + var, tbl = m.group(1), m.group(2) + brace = src.find('{', m.end()) + if brace < 0 or brace - m.end() > 8: # single-statement body, no block + brace = -1 + body = src[m.end():_balanced(src, brace)] if brace >= 0 else src[m.end():m.end() + 400] + if not re.search(r'\bTR\(\s*' + re.escape(var) + r'\s*(?:\.|->)', body): + continue + init = None + for d in re.finditer(r'\b' + re.escape(tbl) + r'\s*\[[^\]]*\]\s*=\s*\{', src[:m.start()]): + init = d + if init: + seg = src[init.end():_balanced(src, init.end() - 1)] + for lit in re.findall(r'"((?:[^"\\]|\\.)*)"', seg): + k = unescape_c(lit) + if k.strip(): + keys.add(k) + + # TR(someFunc(...)): a helper that RETURNS one of several literals, translated + # by the caller. Every literal it can return is a key. + for f in _sources(): + src = open(f, encoding='utf-8').read() + for name in set(re.findall(r'TR\(\s*([A-Za-z_]\w*)\s*\(', src)): + for d in re.finditer(r'\b' + re.escape(name) + r'\s*\([^;{}]*\)\s*\{', src): + seg = src[d.end() - 1:_balanced(src, d.end() - 1)] + for lit in re.findall(r'"((?:[^"\\]|\\.)*)"', seg): + k = unescape_c(lit) + if k.strip(): + keys.add(k) + # LUA APPS: wada.sys.tr("...") (aliased to a local `tr` by convention). The + # apps ship from the same catalog and their strings belong in the same files. + for f in sorted(glob.glob(os.path.join(ROOT, 'deploy/apps/*/*/*.lua'))): + src = open(f, encoding='utf-8').read() + for lit in re.findall(r'\b(?:sys\.)?tr\(\s*"((?:[^"\\]|\\.)*)"', src): + k = unescape_c(lit) + if k.strip(): + keys.add(k) return keys + +def _sources(): + return sorted(glob.glob(os.path.join(ROOT, 'src/ui-touch/*.cpp')) + + glob.glob(os.path.join(ROOT, 'src/ui-touch/*.h'))) + + +def _balanced(src, i): + """Index just past the '}' closing the block whose '{' is at src[i].""" + depth = 0 + while i < len(src): + if src[i] == '{': depth += 1 + elif src[i] == '}': + depth -= 1 + if depth == 0: return i + 1 + i += 1 + return len(src) + + +def _split_args(s): + """Top-level comma split, ignoring commas inside (), [], {} or a string.""" + out, cur, depth, q, i = [], [], 0, None, 0 + while i < len(s): + c = s[i] + if q: + cur.append(c) + if c == '\\': + if i + 1 < len(s): cur.append(s[i+1]); i += 1 + elif c == q: q = None + elif c in '"\'': q = c; cur.append(c) + elif c in '([{': depth += 1; cur.append(c) + elif c in ')]}': depth -= 1; cur.append(c) + elif c == ',' and depth == 0: out.append(''.join(cur)); cur = [] + else: cur.append(c) + i += 1 + out.append(''.join(cur)) + return out + + +# A function/lambda header: a name, a parenthesised parameter list, then '{'. +_HDR = re.compile(r'(?:auto\s+(?P[A-Za-z_]\w*)\s*=\s*\[[^\]]*\]\s*' + r'|\b(?P[A-Za-z_]\w*)\s*)\((?P[^;{}]*)\)\s*' + r'(?:const\s*)?(?:->\s*[\w:*&<> ]+\s*)?\{') + + +def _tr_wrapping_helpers(src): + """(helper name, argument index) for every helper that TR()s a parameter.""" + found = set() + for m in _HDR.finditer(src): + name = m.group('lam') or m.group('fn') + if not name or name in ('if', 'for', 'while', 'switch', 'catch', 'TR'): + continue + params = [] + for a in _split_args(m.group('args')): + names = re.findall(r'[A-Za-z_]\w*', a) + params.append(names[-1] if names else '') + body = src[m.end() - 1:_balanced(src, m.end() - 1)] + for i, pn in enumerate(params): + if pn and re.search(r'\bTR\(\s*' + re.escape(pn) + r'\s*\)', body): + found.add((name, i)) + return found + + +def _call_args_at(src, name, idx): + """Every argument at position idx across all calls to name(...).""" + out = [] + for m in re.finditer(r'\b' + re.escape(name) + r'\s*\(', src): + i = m.end() + depth, q, start = 1, None, i + while i < len(src) and depth: + c = src[i] + if q: + if c == '\\': i += 1 + elif c == q: q = None + elif c in '"\'': q = c + elif c == '(': depth += 1 + elif c == ')': depth -= 1 + i += 1 + args = _split_args(src[start:i - 1]) + if idx < len(args): + out.append(args[idx]) + return out + # Known untranslatable / identical-everywhere keys. SKIP = {'...', '😊', 'Snake', '© OpenStreetMap', '© OpenTopoMap'} diff --git a/scripts/build/pre_gen_baked.py b/scripts/build/pre_gen_baked.py new file mode 100644 index 00000000..7b8eafb5 --- /dev/null +++ b/scripts/build/pre_gen_baked.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""PlatformIO pre-build hook: keep the baked-in tables in step with deploy/apps/. + +gen-lang-builtin.py's whole point is that the baked-in table and the .lang files +the store serves can never drift. That only holds if something runs it. Nothing +did: its docstring promised a pre-build step that was never wired up, so editing +a .lang and building produced an image with the OLD translations and no warning +(caught 2026-08-22 adding the Hungarian map credits, #257). + +The same hazard applies to lua_builtin.h, which seeds the Lua apps into boards +that cannot reach the Store: it read a mirror directory nothing writes, so two +apps added in beta_68 were never baked in at all. + +Regenerates only when a source file is newer than its generated output, so a +normal rebuild pays a handful of stat() calls. +""" +import glob, os, subprocess, sys + +# PlatformIO runs pre: scripts through SConscript, where __file__ is undefined; +# there the project dir is the cwd. Standalone (the IDF build.sh) has __file__. +try: + ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +except NameError: + ROOT = os.getcwd() +HERE = os.path.join(ROOT, "scripts", "build") +HDR = os.path.join(ROOT, "src", "ui-touch", "i18n_builtin.h") +GEN = os.path.join(HERE, "gen-lang-builtin.py") +LUAH = os.path.join(ROOT, "src", "ui-touch", "lua_builtin.h") +LUAG = os.path.join(HERE, "gen-lua-builtin.py") + +def _stale(out, sources): + if not sources: + return False + return not os.path.exists(out) or os.path.getmtime(out) < max(os.path.getmtime(f) for f in sources) + + +if _stale(HDR, glob.glob(os.path.join(ROOT, "deploy", "apps", "lang", "*.lang"))): + print("i18n: a .lang changed, regenerating i18n_builtin.h") + subprocess.run([sys.executable, GEN], cwd=ROOT, check=True) + +lua_src = glob.glob(os.path.join(ROOT, "deploy", "apps", "*", "*", "*.lua")) +lua_src += [os.path.join(ROOT, "deploy", "apps", "apps.json")] +if _stale(LUAH, [f for f in lua_src if os.path.exists(f)]): + print("lua: an app changed, regenerating lua_builtin.h") + subprocess.run([sys.executable, LUAG], cwd=ROOT, check=True) diff --git a/scripts/build/pre_gen_lang.py b/scripts/build/pre_gen_lang.py deleted file mode 100644 index f4d87370..00000000 --- a/scripts/build/pre_gen_lang.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -"""PlatformIO pre-build hook: keep i18n_builtin.h in step with deploy/apps/lang. - -gen-lang-builtin.py's whole point is that the baked-in table and the .lang files -the store serves can never drift. That only holds if something runs it. Nothing -did: its docstring promised a pre-build step that was never wired up, so editing -a .lang and building produced an image with the OLD translations and no warning -(caught 2026-08-22 adding the Hungarian map credits, #257). - -Regenerates only when a .lang is newer than the header, so a normal rebuild -pays one stat() per language. -""" -import glob, os, subprocess, sys - -# PlatformIO runs pre: scripts through SConscript, where __file__ is undefined; -# there the project dir is the cwd. Standalone (the IDF build.sh) has __file__. -try: - ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -except NameError: - ROOT = os.getcwd() -HERE = os.path.join(ROOT, "scripts", "build") -HDR = os.path.join(ROOT, "src", "ui-touch", "i18n_builtin.h") -GEN = os.path.join(HERE, "gen-lang-builtin.py") - -langs = glob.glob(os.path.join(ROOT, "deploy", "apps", "lang", "*.lang")) -if langs: - newest = max(os.path.getmtime(f) for f in langs) - if not os.path.exists(HDR) or os.path.getmtime(HDR) < newest: - print("i18n: a .lang changed, regenerating i18n_builtin.h") - subprocess.run([sys.executable, GEN], cwd=ROOT, check=True) diff --git a/src/ui-touch/LuaAppHost.cpp b/src/ui-touch/LuaAppHost.cpp index 566abcc9..f566b47b 100644 --- a/src/ui-touch/LuaAppHost.cpp +++ b/src/ui-touch/LuaAppHost.cpp @@ -17,6 +17,7 @@ #include // isnan for optional sensor fields // wada.sys.epoch/datetime (#245) #include "AppPage.h" #include "device_caps.h" +#include "i18n.h" // wada.sys.tr: apps can use the same translation table the UI does #include "helpers/esp32/WdtHeavyGuard.h" // wada.fs writes can trigger SPIFFS GC extern "C" { @@ -852,6 +853,20 @@ int sysRandom(lua_State* L) { lua_pushinteger(L, lo + (lua_Integer)(esp_random() % (uint32_t)(hi - lo + 1))); return 1; } +// wada.sys.tr(s) -- translate through the same table the UI uses. +// +// Lua apps had no way to reach it, so every built-in app (airtime's "channel +// busy", the monitor, the games) was hard-English no matter what language the +// device was set to, and a translator could file the string but nothing could +// consume it (#257). Keys go in deploy/apps/lang/*.lang exactly like the +// firmware's own; an untranslated key returns unchanged, so an app that calls +// this is never worse off than one that does not. +static int sysTr(lua_State* L) { + const char* s = luaL_checkstring(L, 1); + lua_pushstring(L, TR(s)); + return 1; +} + int sysBoard(lua_State* L) { lua_createtable(L, 0, 6); lua_pushinteger(L, s_h ? s_h->body_w : lv_disp_get_hor_res(nullptr)); @@ -1981,6 +1996,7 @@ void openWada(lua_State* L) { lua_pushcfunction(L, sysMillis); lua_setfield(L, -2, "millis"); lua_pushcfunction(L, sysToast); lua_setfield(L, -2, "toast"); lua_pushcfunction(L, sysBoard); lua_setfield(L, -2, "board"); + lua_pushcfunction(L, sysTr); lua_setfield(L, -2, "tr"); // #257 lua_pushcfunction(L, sysRandom); lua_setfield(L, -2, "random"); lua_pushcfunction(L, sysEpoch); lua_setfield(L, -2, "epoch"); // #245 lua_pushcfunction(L, sysDatetime); lua_setfield(L, -2, "datetime"); // #245 diff --git a/src/ui-touch/UITask.cpp b/src/ui-touch/UITask.cpp index 1a03a741..e361625b 100644 --- a/src/ui-touch/UITask.cpp +++ b/src/ui-touch/UITask.cpp @@ -20662,7 +20662,7 @@ static void fmOpenActions(const char* name, bool isdir) { #endif } if (s_fm_clip.active) { - fmActionBtn(card, s_fm_clip.is_cut ? "Paste (move)" : "Paste (copy)", fmActPasteCb, 0x2D4A2D); + fmActionBtn(card, s_fm_clip.is_cut ? TR("Paste (move)") : TR("Paste (copy)"), fmActPasteCb, 0x2D4A2D); } } @@ -22414,7 +22414,8 @@ static void openReaderPage() { lv_obj_set_pos(s_reader_status, 6, top + 44); lv_obj_set_style_text_font(s_reader_status, &g_font_12, LV_PART_MAIN); lv_obj_set_style_text_color(s_reader_status, lv_color_hex(COLOR_SUB), LV_PART_MAIN); - lv_label_set_text(s_reader_status, s_reader_msg[0] ? s_reader_msg : "On-device text browser \xc2\xb7 no proxy, no tracking"); + lv_label_set_text(s_reader_status, s_reader_msg[0] ? s_reader_msg + : TR("On-device text browser \xc2\xb7 no proxy, no tracking")); // (Collapsed state shows the URL in the status-bar title zone — see readerSetAddrExpanded.) // --- Body: a vertical scroll container we fill with paragraph + link labels --- s_reader_scroll = lv_obj_create(s_reader_root); @@ -22675,7 +22676,7 @@ static void discoverBuildFeed() { (unsigned)discTypeColor(h.node_type), disp_esc, discTypeShort(h.node_type), (int)h.our_rssi, (double)h.our_snr_q4 / 4.0, direct, dist_seg, ago); } - if (q == 0) snprintf(buf, sizeof buf, "#7A7F87 Scanning\xE2\x80\xA6 nothing has answered yet#"); + if (q == 0) snprintf(buf, sizeof buf, TR("#7A7F87 Scanning\xE2\x80\xA6 nothing has answered yet#")); else if (buf[q - 1] == '\n') buf[q - 1] = '\0'; lv_label_set_text(s_discover_feed, buf); if (s_discover_status) @@ -31574,8 +31575,8 @@ static void settingsCatBuild(int cat) { lv_obj_set_style_bg_color(crash_btn, lv_color_hex(0x8A3B2E), LV_PART_MAIN); // warning red-brown lv_obj_add_event_cb(crash_btn, crashDumpExportCb, LV_EVENT_CLICKED, nullptr); lv_obj_t* cbl = lv_label_create(crash_btn); - char ct[56]; - snprintf(ct, sizeof ct, LV_SYMBOL_WARNING " Export crash report (%uK)", + char ct[96]; // room for a translated label + snprintf(ct, sizeof ct, TR(LV_SYMBOL_WARNING " Export crash report (%uK)"), (unsigned)(s_crash_dump_size / 1024)); lv_label_set_text(cbl, ct); lv_obj_set_style_text_font(cbl, &g_font_14, LV_PART_MAIN); diff --git a/src/ui-touch/i18n_builtin.h b/src/ui-touch/i18n_builtin.h index 907af850..a2d3a196 100644 --- a/src/ui-touch/i18n_builtin.h +++ b/src/ui-touch/i18n_builtin.h @@ -6,13 +6,9 @@ static const I18nPair kBuiltin_hu[] = { { " (device behind)", " (készülék hátulján)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" üzeneteket szeretne küldeni a mesh hálózaton.\n\nAz üzeneteket %s néven küldi, és nem különböztethetők meg az általad beírt üzenetektől.\n\nCsak megbízható alkalmazásnak engedélyezd." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d lefedettségi pont · %lu mentve SD-re#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: várakozás GPS-jelre…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, { "%d of %d on map", "%d / %d a térképen" }, { "%d on map", "%d a térképen" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d közeli (%d ism, %d társ)" }, @@ -20,7 +16,6 @@ static const I18nPair kBuiltin_hu[] = { { "(RTC unset)", "(RTC nincs beállítva)" }, { "(device behind)", "(eszköz lemaradt)" }, { "(no default)", "(nincs alapértelmezett)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 bájt (hagyományos)\n2 bájt\n3 bájt" }, { "1-character messages will be ignored", "Az 1 karakteres üzenetek figyelmen kívül lesznek hagyva" }, { "1-character messages will be shown", "Az 1 karakteres üzenetek megjelennek" }, @@ -31,15 +26,12 @@ static const I18nPair kBuiltin_hu[] = { { ">_ Terminal", ">_ Terminál" }, { "@ Mentions", "@ Említések" }, { "@ mention sound", "@ említés hangja" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "AUTOMATIKUS ADVERTEK" }, { "About", "Névjegy" }, { "About / credits", "Névjegy / köszönet" }, { "About the map", "A térképről" }, - { "Accent popups", "Accent popups" }, { "Accent popups: off", "Accent popups: kikapcsolva" }, { "Accent popups: on", "Accent popups: bekapcsolva" }, - { "Ack", "Ack" }, { "Active", "Aktív" }, { "Add", "Hozzáad" }, { "Add channel", "Csatorna hozzáadás" }, @@ -47,8 +39,6 @@ static const I18nPair kBuiltin_hu[] = { { "Added", "Hozzáadva" }, { "Added to contacts", "Hozzáadva a névjegyekhez" }, { "Added to favorites", "Hozzáadva a kedvencekhez" }, - { "Admin", "Admin" }, - { "Advert", "Advert" }, { "Advert failed", "Advert sikertelen" }, { "Advert location", "Advert helye" }, { "Advert policy saved", "Advert szabályzat mentve" }, @@ -66,7 +56,6 @@ static const I18nPair kBuiltin_hu[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Bárki csatlakozhat. A kulcs a hashtagből származik (kisbetűs)." }, { "App drawer as home", "Alkalmazásfiók kezdőlapként" }, { "App icon size", "Alkalmazás ikon mérete" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Újraindítás után érvényes." }, { "Apply", "Alkalmaz" }, { "Apply auto-poll", "Automatikus szavazás alkalmazása" }, @@ -76,8 +65,6 @@ static const I18nPair kBuiltin_hu[] = { { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "A nyilak + Enter mindig működik. Ezek a betűk extra – koppintson egy sorra, majd nyomjon meg egy billentyűt." }, { "Auto advert", "Auto. advert" }, { "Auto chat", "Auto. csevegés" }, - { "Auto repeater", "Auto repeater" }, - { "Auto room", "Auto room" }, { "Auto sensor", "Auto szenzor" }, { "Auto-Join", "Auto. csatlakozás" }, { "Auto-add", "Auto. hozzáad." }, @@ -97,7 +84,6 @@ static const I18nPair kBuiltin_hu[] = { { "Available", "Elérhető" }, { "BLE off", "BLE kikapcsolva" }, { "BLE on", "BLE bekapcsolva" }, - { "BT", "BT" }, { "Back", "Vissza" }, { "Backups", "Mentés" }, { "Battery", "Akkumlátor" }, @@ -117,7 +103,6 @@ static const I18nPair kBuiltin_hu[] = { { "Blocking unsupported", "A blokkolás nem támogatott" }, { "Blue battery Last 6 min", "Kék akkumulátor töltöttségi szintje: utolsó 6 perc" }, { "Blue battery Orange temp Cyan humidity", "Kék akkumulátor Narancssárga hőmérséklet Ciánkék páratartalom" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth már ki van kapcsolva" }, { "Bluetooth already on", "Bluetooth már be van kapcsolva" }, { "Bluetooth deferred; retry from Settings", "Bluetooth késleltetve; próbálja újra a Beállításokból" }, @@ -126,11 +111,9 @@ static const I18nPair kBuiltin_hu[] = { { "Bluetooth pairing isn't available on this device.\n\nThe radio chip's factory firmware doesn't support it.\n\nPair the phone app over Wi-Fi instead: connect this device to your network, then add it in the app by its IP address (TCP, port 5000) — shown under Settings > Network. USB works too.", "Ezen az eszközön nincs Bluetooth-párosítás.\n\nA rádiócsip gyári firmware-e nem támogatja.\n\nPárosítsd a telefonos appot Wi-Fin: csatlakoztasd az eszközt a hálózatodra, majd add hozzá az appban IP-cím szerint (TCP, 5000-es port) — a Beállítások > Hálózat alatt látható. USB is működik." }, { "Bluetooth unavailable; retry from Settings", "Bluetooth nem elérhető; próbálja újra a Beállításokból" }, { "Bluetooth will start after Wi-Fi connects or times out.", "A Bluetooth a Wi-Fi csatlakozása vagy időtúllépés után elindul." }, - { "Broker host / IP", "Broker host / IP" }, { "Buffered receive (experimental)", "Pufferelt fogadás (kísérleti)" }, { "Built-in", "Beépített" }, { "Built-in (default)", "Beépített (alapértelmezett)" }, - { "CR", "CR" }, { "Calendar", "Naptár" }, { "Calibrate battery (full = 100%)", "Akkumulátor kalibrálása (full = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Kalibrálva: 100%% = %u.%02u V (hosszan nyomva a visszaállításhoz)" }, @@ -171,7 +154,6 @@ static const I18nPair kBuiltin_hu[] = { { "Clear battery history?", "Törli az akkumulátorelőzményeket?" }, { "Clear history", "Előzmények törlése" }, { "Clear telemetry history for this node?", "Törli a telemetriai előzményeket ehhez a csomóponthoz?" }, - { "Client repeat", "Client repeat" }, { "Clock & time", "Idő és dátum" }, { "Clock synced", "Óra szinkronizálva" }, { "Clock: 12-hour", "Óra: 12 órás" }, @@ -238,7 +220,6 @@ static const I18nPair kBuiltin_hu[] = { { "Cut", "Kivágás" }, { "Cut - Paste in a folder", "Kivágás - Beillesztés egy mappába" }, { "DM sound", "DM hang" }, - { "DND", "DND" }, { "Danger zone", "Veszélyes zóna" }, { "Data -> SD card on reboot\n(card must be inserted)", "Adatok -> SD-kártya újraindításkor\n(a kártyát be kell helyezni)" }, { "Data -> internal on reboot", "Adatok -> belső újraindításkor" }, @@ -299,7 +280,6 @@ static const I18nPair kBuiltin_hu[] = { { "Enter SSID first", "Először adja meg az SSID-t" }, { "Enter a name", "Írjon be egy nevet" }, { "Enter a network name", "Adjon meg egy hálózatnevet" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Az Enter új sort ad hozzá" }, { "Enter exactly 32 hex characters.", "Pontosan 32 hex karaktert adjon meg." }, { "Enter key sends message", "Az Enter billentyű elküldi az üzenetet" }, @@ -334,9 +314,7 @@ static const I18nPair kBuiltin_hu[] = { { "Find", "Keresés" }, { "Finish", "Befejezés" }, { "Firmware beta_%d\nCouldn't reach the update server", "Firmware beta_%d\nNem sikerült elérni a frissítőszervert" }, - { "Firmware:", "Firmware:" }, { "Flash on new message", "Villog, ha új üzenet érkezett" }, - { "Flood", "Flood" }, { "Flood advert sent", "Flood advert elküldve" }, { "Flood every", "Flood időköz" }, { "Flood: relayed across the mesh (multi-hop).\nZero-hop: neighbours only (no relaying).", "Flood: a hálón keresztül továbbítva (multi-hop).\nZero-hop: csak neighbours (nincs továbbítás)." }, @@ -348,15 +326,11 @@ static const I18nPair kBuiltin_hu[] = { { "Format failed (no card / SD error)", "Formázás sikertelen (nincs kártya / SD hiba)" }, { "Frequency / bandwidth", "Frekvencia / sávszélesség" }, { "Full", "Tele" }, - { "GPS", "GPS" }, - { "GPS %s · Buzzer %s", "GPS %s · Buzzer %s" }, - { "GPS %s · Buzzer %s\n%s", "GPS %s · Buzzer %s\n%s" }, { "GPS off", "GPS kikapcsolva" }, { "GPS on", "GPS bekapcsolva" }, { "GPS serial baud", "GPS soros baud" }, { "GPS unset", "GPS nincs beállítva" }, { "GPS: acquiring...", "GPS: begyűjtés..." }, - { "GPS: fix", "GPS: fix" }, { "GPS: off", "GPS: kikapcsolva" }, { "GPS: searching", "GPS: keresés" }, { "Game over — score %d (tap to restart)", "Vége a játéknak — %d pont (érintsd meg az újraindításhoz)" }, @@ -432,7 +406,6 @@ static const I18nPair kBuiltin_hu[] = { { "Keyboard nav: off", "Billentyűzetnavigáció: kikapcsolva" }, { "Keyboard navigation", "Billentyűzetnavigáció" }, { "Keys", "Kulcsok" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Rálátás → %s" }, { "Landscape (desktop)", "Fekvő (asztali)" }, { "Landscape set - applies when remote mode starts.", "Fekvő beállítva - a távoli mód indulásakor lép életbe." }, @@ -447,7 +420,6 @@ static const I18nPair kBuiltin_hu[] = { { "Left", "Balra" }, { "Let's set up your device.\n\nYou'll pick a name and choose your LoRa region. Takes about a minute.", "Állítsuk be az eszközt.\n\nVálassz egy nevet, és válaszd ki a LoRa régiódat. Körülbelül egy percet vesz igénybe." }, { "Letters only", "Csak betűk" }, - { "LoRa antenna (P4)", "LoRa antenna (P4)" }, { "Loading catalog…", "Katalógus betöltése…" }, { "Loading map tiles…\n\nKeep Wi-Fi connected.\nTiles appear as they arrive.", "Térképcsempék betöltése…\n\nWi-Fi kapcsolaton keresztül.\nA csempék érkezésükkor jelennek meg." }, { "Loading map…", "Térkép betöltése…" }, @@ -482,13 +454,10 @@ static const I18nPair kBuiltin_hu[] = { { "Logs", "Naplók" }, { "Longitude", "Hosszúság" }, { "Lua Store", "Lua áruház" }, - { "MHz", "MHz" }, { "MQTT bridge", "MQTT híd" }, { "Map", "Térkép" }, { "Map data © OpenStreetMap contributors.\nopenstreetmap.org/copyright\nLicensed under the Open Database License (ODbL).\n\n", "Térkép adatok © OpenStreetMap közreműködői.\nopenstreetmap.org/copyright\nAz Open Database License (ODbL) licenc alatt.\n\n" }, { "Map options", "Térkép opciók" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Térképtárolási hiba.\n\nAz SD-kártya észlelve, de a\ntime gyorsítótár nem csatlakozott.\nIndítsa újra a gépet az újrapróbálkozáshoz." }, { "Map storage error.\nReflash the tiles partition.", "Térképtárolási hiba.\nFlasheld újra a csempék partícióját." }, { "Map style © OpenTopoMap (CC-BY-SA) — opentopomap.org\nMap data © OpenStreetMap contributors (ODbL) + SRTM.\n\n", "Térkép stílus © OpenTopoMap (CC-BY-SA) — opentopomap.org\nTérkép adatok © OpenStreetMap közreműködői (ODbL) + SRTM.\n\n" }, @@ -499,7 +468,6 @@ static const I18nPair kBuiltin_hu[] = { { "Map — set your location\nin Settings → Profile to\nshow the map here.", "Térkép – a Beállítások → Profil menüpontban állítsd be a tartózkodási helyedet, hogy itt jelenjen meg a térkép." }, { "Mark all chats and channels as read?", "Az összes csevegést és csatornát megjelölöd olvasottként?" }, { "Mark as read", "Olvasottnak jelöl" }, - { "Mark read", "Mark read" }, { "Marked read", "Olvasottként megjelölve" }, { "Max dots", "Max. pontok" }, { "Max hops (0..64)", "Max ugrások (0-64)" }, @@ -520,7 +488,6 @@ static const I18nPair kBuiltin_hu[] = { { "Mode: BLE starting / low memory", "Mód: BLE indítás / kevés memória" }, { "Model:", "Modell" }, { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "A legtöbb mesh spam jelenleg egyetlen karakterből áll, mert ez a legolcsóbban elküldhető üzenet. Csendben eldobva: nem jelenik meg a csevegésben, nincs értesítés és nincs hangjelzés." }, - { "Multi ACKs", "Multi ACKs" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Multi-ack %s · Ismétlés %s · Vételnövelés %s" }, { "Multi-byte routing (path hash)", "Többbájtos útválasztás (útvonal-hash)" }, { "Mute @", "Némítás @" }, @@ -573,7 +540,6 @@ static const I18nPair kBuiltin_hu[] = { { "No onboard GPS", "Nincs beépített GPS" }, { "No other networks found", "Nem található más hálózat" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Még nincs pozíció. A hidegindításhoz szabad égbolt kell, és több percig is tarthat." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Nincs válasz %s-tól" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Nincs válasz. Ellenőrizze a jelszót, a szervert,\nvagy az eszköz óráját (eszköz: %s)" }, { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "Nincs válasz. Az útvonal hash értéke %u bájt;\na régebbi átjátszók eldobhatják ezeket.\nPróbáld 1 bájttal (Beállítások > Rádió és Mesh)" }, @@ -582,7 +548,6 @@ static const I18nPair kBuiltin_hu[] = { { "No telemetry in this window.\nRequest one, or widen the range below.", "Nincs telemetria ebben az ablakban.\nKérjen egyet, vagy szélesítse az alábbi tartományt." }, { "No tiles (non-ESP32)", "Nincsenek csempék (nem ESP32)" }, { "No version known yet. Wi-Fi and a completed update check are needed first.", "Egyelőre nincs ismert verzió. Először Wi-Fi-kapcsolat és egy frissítés-ellenőrzés szükséges." }, - { "Node\nRegion\nRadio\nSignal\nContacts\nChannels\nBattery\nUptime", "Node\nRegion\nRadio\nSignal\nContacts\nChannels\nBattery\nUptime" }, { "Node name", "Node név" }, { "Normal (100%)\nLarge (150%)\nHuge (200%)", "Normál (100%)\nLarge (150%)\nHuge (200%)" }, { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Nincs elég szabad memória a Bluetooth-hoz. Először kapcsold ki a Wi-Fi-t." }, @@ -596,7 +561,6 @@ static const I18nPair kBuiltin_hu[] = { { "Off\n1\n2\n3\n5\n8", "Ki\n1\n2\n3\n5\n8" }, { "Off\n1 day\n2 days\n3 days\n7 days", "Ki\n1 nap\n2 nap\n3 nap\n7 nap" }, { "Off\n60 min\n90 min\n2 hours\n3 hours\n4 hours", "Ki\n60 perc\n90 perc\n2 óra\n3 óra\n4 óra" }, - { "Offline", "Offline" }, { "Older messages in a chat are dropped past this. A very large or unlimited history makes the chat list slower.", "Ezen túl a régebbi üzenetek törlődnek. A nagyon nagy vagy korlátlan előzmény lassítja a csevegőlistát." }, { "On - open the address above in a phone browser.", "Bekapcsolva - nyisd meg a fenti címet a telefon böngészőjében." }, { "On boot", "Indításkor" }, @@ -636,9 +600,7 @@ static const I18nPair kBuiltin_hu[] = { { "Paused — score %d", "Szünet — Pontok %d" }, { "Peers", "Partnerek" }, { "Per-transmit switching on", "Adásonkénti váltás bekapcsolva" }, - { "Perf:", "Perf:" }, { "Pick colour", "Színválasztás" }, - { "Ping", "Ping" }, { "Ping failed", "Ping sikertelen" }, { "Pinged (direct) — waiting…", "Pingelt (közvetlen) — várakozás…" }, { "Pinged (flood) — waiting…", "Pingelt (flood) — várakozás…" }, @@ -646,14 +608,11 @@ static const I18nPair kBuiltin_hu[] = { { "Poll (min)", "Lekérdezés (perc)" }, { "Poll every", "össz. lekér." }, { "Poll every %d min", "Lekérdezés %d percenként" }, - { "Port", "Port" }, { "Portrait set - applies when remote mode starts.", "Álló beállítva - a távoli mód indulásakor lép életbe." }, { "Position saved", "Pozíció mentve" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Energia" }, { "Power off", "Kikapcsolás" }, { "Powering off… click trackball to wake", "Kikapcsolás… kattintson a görgetőgombbal az ébresztéshez" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Nyomj meg egy billentyűt…" }, { "Probe now", "Teszt most" }, { "Probing neighbours…", "Szomszédok fürkészése…" }, @@ -668,7 +627,6 @@ static const I18nPair kBuiltin_hu[] = { { "Purge all discovered nodes?", "Törölje az összes felfedezett csomópontot?" }, { "Quick replies", "Gyors válaszok" }, { "Quick reply", "Gyors válasz" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d bejegyzés · Raw %d bejegyzés" }, { "RX boosted gain", "RX fokozott erősítés" }, { "RX log", "RX napló" }, @@ -682,9 +640,7 @@ static const I18nPair kBuiltin_hu[] = { { "RangeTest sent (direct)", "RangeTest küldve (közvetlenül)" }, { "RangeTest sent (flood)", "RangeTest elküldve (elárasztás)" }, { "Raw log", "Raw napló" }, - { "Read channel messages", "Read channel messages" }, { "Read incoming messages", "Beérkező üzenetek olvasása" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Csomagokat olvas egy háttérfeladatban, így egy zsúfolt képernyő nem tudja azokat eldobni." }, { "Reboot", "Újraindítás" }, { "Reboot device", "Eszköz újraindítása" }, @@ -695,7 +651,6 @@ static const I18nPair kBuiltin_hu[] = { { "Reconnected to %.40s", "Újracsatlakozva ehhez: %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Újraformázza az SD kártyát MESHCOMOD (FAT32) formátumban?\nA kártyán lévő ÖSSZES adat törlődik." }, { "Region & scope", "Régió és hatókör" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Régió hatóköre (#tag) ehhez a csatornához.\nÜres = az alapértelmezett hatókör használata." }, { "Region scope (#tag), blank = default.", "Régió hatóköre (#tag), üres = alapértelmezett." }, { "Region scope (#tag, blank = none)", "Régió hatóköre (#címke, üres = nincs)" }, @@ -739,7 +694,6 @@ static const I18nPair kBuiltin_hu[] = { { "SD card %s", "SD-kártya %s" }, { "SD card %s (hold: format)", "SD-kártya %s (tartás: formázás)" }, { "SD card (tap to mount)", "SD-kártya (érintésre csatlakoztatható)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "SD-kártya behelyezve" }, { "SD card lost - reinsert to recover", "SD-kártya elveszett - helyezze be újra a helyreállításhoz" }, { "SD card remounted", "SD kártya újracsatolva" }, @@ -752,9 +706,6 @@ static const I18nPair kBuiltin_hu[] = { { "SD is busy - close tools and retry", "Az SD-kártya foglalt – zárd be az eszközöket, majd próbáld újra." }, { "SD removed - card-backed data cannot be saved", "SD-kártya eltávolítva – az SD-kártyán tárolt adatok nem menthetők." }, { "SD stayed busy - format cancelled, retry", "Az SD-kártya továbbra is foglalt – a formázás megszakítva, próbáld újra." }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB felhasználva" }, { "SSID not found", "SSID nem található" }, { "SSID set — enter password, then Save", "SSID beállítva — adja meg a jelszót, majd mentse el" }, @@ -785,8 +736,6 @@ static const I18nPair kBuiltin_hu[] = { { "Saved — rebooting", "Mentve — újraindítás" }, { "Saved — reconnecting…", "Mentve — újracsatlakozás…" }, { "Saved: %s\nFlash it from the Launcher.", "Mentett: %s\nFlash-eld a Launcher-ből." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Mentés SD-kártyára… %d%%" }, { "Saving to SD… 0%", "Mentés SD-kártyára… 0%" }, { "Scan", "Keres" }, @@ -825,7 +774,6 @@ static const I18nPair kBuiltin_hu[] = { { "Send an advert now, or set how often you re-advertise.", "Küldjön hirdetést most, vagy állítsa be, hogy milyen gyakran szeretné újrahirdetni." }, { "Send failed", "Küldés sikertelen" }, { "Send messages as me", "Üzenetek küldése a nevemben" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Feladó blokkolva" }, { "Sensors", "Szenzorok" }, { "Sensors tab: off (restart to apply)", "Érzékelők lap: kikapcsolva (újraindítás az alkalmazáshoz)" }, @@ -865,10 +813,7 @@ static const I18nPair kBuiltin_hu[] = { { "Slot %d cleared", "%d hely kiürítve" }, { "Slot empty", "Üres hely" }, { "Small\nMedium\nLarge", "Kicsi\nKözepes\nNagy" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, - { "Snake", "Snake" }, { "Snake — swipe or roll the trackball", "Kígyó – pöccintsd vagy görgesd a görgetőgolyót" }, - { "Sort", "Sort" }, { "Sort by", "Rendezés szerint" }, { "Sort discovered", "Felfedezettek rendezése" }, { "Sound", "Hang" }, @@ -896,8 +841,6 @@ static const I18nPair kBuiltin_hu[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nWS kliensek %d GPS %s Buzzer %s" }, { "TCP off", "TCP kikapcsolva" }, { "TCP on", "TCP bekapcsolva" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Tab gyorsbillentyűk – koppintson egy sorra, majd nyomjon meg egy billentyűt" }, { "Tap Use to switch - the device reboots to apply.", "Koppints a Használ gombra a váltáshoz – az eszköz újraindul." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Váltáshoz koppints a Használ gombra - az eszköz újraindul. A nyelvi fájlok a tároló /lang mappájában vannak; szerkesztheted őket vagy hozzáadhatod a sajátodat." }, @@ -983,13 +926,9 @@ static const I18nPair kBuiltin_hu[] = { { "Username (optional)", "Felhasználónév (nem kötelező)" }, { "Volume", "Hangerő" }, { "W up · A left · D right · Z down · S select · Q back", "W fel · A balra · D jobbra · Z le · S kiválasztás · Q vissza" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Várakozás Wi-Fire..." }, { "Welcome to WADAMESH", "Üdvözöl a WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Amíg be van kapcsolva, a Wi-Fi hálózatodon bárki láthatja és vezérelheti az eszközt. Sima HTTP-t használ (csak helyi hálózat)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi és Bluetooth" }, { "Wi-Fi and Bluetooth unavailable; retry from Settings", "A Wi-Fi és a Bluetooth nem érhető el; próbáld újra a Beállításokban." }, { "Wi-Fi is not enabled in this build.", "Ebben a buildben nincs engedélyezve a Wi-Fi." }, @@ -997,7 +936,6 @@ static const I18nPair kBuiltin_hu[] = { { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Wi-Fi szükséges a terepprofil lekéréséhez ehhez az útvonalhoz. Csatlakozás a Beállítások → Wi-Fi menüpontban." }, { "Wi-Fi not connected", "Nincs Wi-Fi-kapcsolat" }, { "Wi-Fi off", "WiFi kikapcsolva" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "WiFi bekapcsolva" }, { "Wi-Fi on, scanning…", "Wi-Fi bekapcsolva, szkennelés…" }, { "Wi-Fi paused; Bluetooth disconnect timed out", "Wi-Fi szüneteltetve; a Bluetooth bontása időtúllépés miatt meghiúsult." }, @@ -1011,10 +949,8 @@ static const I18nPair kBuiltin_hu[] = { { "Your location is unknown.\nSet GPS / position in\nSettings → Profile first.", "A tartózkodási helye ismeretlen.\nElőször állítsa be a GPS-t / pozíciót a\nBeállítások → Profil menüpontban." }, { "Your name", "A neved" }, { "Your own apps", "Saját appok" }, - { "Zero-hop", "Zero-hop" }, { "Zero-hop advert sent", "Zero-hop advert elküldve" }, { "Zoom: +/- buttons", "Nagyítás: +/- gombok" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "another region", "másik régió" }, { "chats", "csevegések" }, { "client connected", "kliens csatlakozva" }, @@ -1025,12 +961,10 @@ static const I18nPair kBuiltin_hu[] = { { "drive the UI without the screen; keys still type in text fields", "a felhasználói felületet képernyő nélkül működtetik; a billentyűk továbbra is szövegmezőkben írnak" }, { "e.g. Family", "pl. Család" }, { "e.g. mesh", "pl. mesh" }, - { "from", "from" }, { "h to", "ó →" }, { "hold Backspace to unlock", "feloldás: tartsd nyomva a Backspace-t" }, { "hold the d-pad to unlock", "tartsa lenyomva a d-padot a feloldáshoz" }, { "hold the trackball to unlock", "tartsa lenyomva a trackballt a feloldáshoz" }, - { "kHz", "kHz" }, { "keep holding", "tartsd ki" }, { "last wake:", "utolsó ébresztés:" }, { "last wake: ", "utolsó ébredés: " }, @@ -1048,7 +982,6 @@ static const I18nPair kBuiltin_hu[] = { { "off", "ki" }, { "off = Enter adds a new line; tap Send to send", "ki = Az Enter új sort hoz létre; a küldéshez koppintson a Küldés gombra" }, { "on", "be" }, - { "peak --", "peak --" }, { "pick accented letters as you type; off = plain typing", "ékezetes betűk kiválasztása gépelés közben; kikapcsolva = sima gépelés" }, { "press Volume Down to unlock", "Nyomja meg a hangerő csökkentését a feloldáshoz" }, { "push past a screen edge to scroll content", "Görgetéshez húzza végig az ujját a képernyő szélén" }, @@ -1061,47 +994,31 @@ static const I18nPair kBuiltin_hu[] = { { "tap the language key (e.g. EN) on the keyboard to cycle the ones you enable", "koppintson a billentyűzeten a nyelvi billentyűre (pl. EN) az engedélyezettek közötti váltáshoz" }, { "tap to cancel", "koppintson a megszakításhoz" }, { "tap to exit full screen", "koppintson a teljes képernyős kilépéshez" }, - { "zoom", "zoom" }, - { "zoom %d", "zoom %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "~17 dB erősítővel csendes/távoli helyeken; zajos helyeken kapcsold ki." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_nl[] = { { " (device behind)", "(apparaat loopt achter)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d dekkingspunten · %lu opgeslagen op SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: wachten op GPS-fix…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d op kaart" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d dichtbij (%d rpt, %d comp)" }, { "%u types · hops %u · manual %s", "%u types · hops %u · handmatig %s" }, { "(RTC unset)", "(RTC niet ingesteld)" }, { "(device behind)", "(apparaat loopt achter)" }, { "(no default)", "(geen standaard)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 byte (verouderd)\n2 bytes\n3 bytes" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nGeen limiet" }, { "12-hour clock", "12-uursklok" }, { "32 hex characters", "32 hex-tekens" }, { "32-hex secret. Anyone with this can read the channel.", "32-hex geheim. Iedereen hiermee kan het kanaal lezen." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Vermeldingen" }, { "@ mention sound", "Geluid bij @-vermelding" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "AUTOMATISCHE ADVERTS" }, { "About", "Over" }, { "About the map", "Over de kaart" }, { "Accent popups", "Accent-popups" }, { "Accent popups: off", "Accent-popups: uit" }, { "Accent popups: on", "Accent-popups: aan" }, - { "Ack", "Ack" }, { "Active", "Actief" }, { "Add", "Toevoegen" }, { "Add channel", "Kanaal toevoegen" }, @@ -1110,14 +1027,11 @@ static const I18nPair kBuiltin_nl[] = { { "Added to contacts", "Toegevoegd aan contacten" }, { "Added to favorites", "Toegevoegd aan favorieten" }, { "Admin", "Beheer" }, - { "Advert", "Advert" }, { "Advert failed", "Advert mislukt" }, { "Advert location", "Advertlocatie" }, { "Advert policy saved", "Advertentiebeleid opgeslagen" }, { "Advert sent", "Advert verzonden" }, - { "All", "All" }, { "All marked read", "Alles gelezen" }, - { "Allow", "Allow" }, { "Already exists", "Bestaat al" }, { "Already exists or table full.", "Bestaat al of tabel vol." }, { "Already in contacts", "Al in contacten" }, @@ -1128,19 +1042,12 @@ static const I18nPair kBuiltin_nl[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Iedereen kan deelnemen. Sleutel komt van de hashtag (kleine letters)." }, { "App drawer as home", "App-lade als startscherm" }, { "App icon size", "Grootte app-pictogrammen" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Actief na herstart." }, { "Apply", "Toepassen" }, { "Apply auto-poll", "Auto-poll toepassen" }, { "Apply radio params", "Radioparameters toepassen" }, - { "Apps", "Apps" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Pijltjes + Enter werken altijd. Deze letters zijn extra — tik op een rij en druk dan op een toets." }, { "Auto advert", "Automatische advert" }, - { "Auto chat", "Auto chat" }, - { "Auto repeater", "Auto repeater" }, - { "Auto room", "Auto room" }, - { "Auto sensor", "Auto sensor" }, { "Auto-Join", "Auto-deelnemen" }, { "Auto-add", "Auto toevoegen" }, { "Auto-add contacts", "Contacten automatisch toevoegen" }, @@ -1158,14 +1065,12 @@ static const I18nPair kBuiltin_nl[] = { { "Available", "Beschikbaar" }, { "BLE off", "BLE uit" }, { "BLE on", "BLE aan" }, - { "BT", "BT" }, { "Back", "Terug" }, { "Backups", "Back-ups" }, { "Battery", "Batterij" }, { "Battery & power history", "Batterij- & energiegeschiedenis" }, { "Battery (V)", "Batterij (V)" }, { "Battery calibration reset to default", "Batterijkalibratie teruggezet" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Batterijwaarde te laag — laad eerst volledig op" }, { "Battery saver (experimental)", "Batterijbesparing (experimenteel)" }, { "Battery — last 24h", "Batterij — laatste 24u" }, @@ -1178,7 +1083,6 @@ static const I18nPair kBuiltin_nl[] = { { "Blocking unsupported", "Blokkeren niet ondersteund" }, { "Blue battery Last 6 min", "Blauw batterij Laatste 6 min" }, { "Blue battery Orange temp Cyan humidity", "Blauw batterij Oranje temp Cyaan vocht" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth al uit" }, { "Bluetooth already on", "Bluetooth al aan" }, { "Bluetooth deferred; retry from Settings", "Bluetooth uitgesteld; opnieuw proberen via Instellingen" }, @@ -1191,7 +1095,6 @@ static const I18nPair kBuiltin_nl[] = { { "Buffered receive (experimental)", "Gebufferde ontvangst (experimenteel)" }, { "Built-in", "Ingebouwd" }, { "Built-in (default)", "Ingebouwd (standaard)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Batterij kalibreren (vol = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Gekalibreerd: 100%% = %u.%02u V (lang indrukken om te resetten)" }, { "Can't block — not a contact", "Kan niet blokkeren — geen contact" }, @@ -1240,7 +1143,6 @@ static const I18nPair kBuiltin_nl[] = { { "Commands", "Opdrachten" }, { "Community Preset", "Community-preset" }, { "Community preset (meshcomod web)", "Community-preset (meshcomod web)" }, - { "Compact", "Compact" }, { "Compact messages", "Compacte berichten" }, { "Compact messages (IRC style)", "Compacte berichten (IRC-stijl)" }, { "Connect", "Verbinden" }, @@ -1298,7 +1200,6 @@ static const I18nPair kBuiltin_nl[] = { { "Cut", "Knippen" }, { "Cut - Paste in a folder", "Geknipt - plak in een map" }, { "DM sound", "DM-geluid" }, - { "DND", "DND" }, { "Danger zone", "Gevarenzone" }, { "Data -> SD card on reboot\n(card must be inserted)", "Gegevens -> SD-kaart bij herstart\n(kaart moet geplaatst zijn)" }, { "Data -> internal on reboot", "Gegevens -> intern bij herstart" }, @@ -1356,7 +1257,6 @@ static const I18nPair kBuiltin_nl[] = { { "Enter SSID first", "Voer eerst SSID in" }, { "Enter a name", "Voer een naam in" }, { "Enter a network name", "Voer een netwerknaam in" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Enter voegt een nieuwe regel toe" }, { "Enter exactly 32 hex characters.", "Voer precies 32 hex-tekens in." }, { "Enter key sends message", "Enter verstuurt bericht" }, @@ -1389,9 +1289,7 @@ static const I18nPair kBuiltin_nl[] = { { "Find", "Zoeken" }, { "Finish", "Voltooien" }, { "Firmware beta_%d\nCouldn't reach the update server", "Firmware beta_%d\nKon de updateserver niet bereiken" }, - { "Firmware:", "Firmware:" }, { "Flash on new message", "Knipperen bij nieuw bericht" }, - { "Flood", "Flood" }, { "Flood advert sent", "Flood-advert verzonden" }, { "Flood every", "Flood elke" }, { "Flood: relayed across the mesh (multi-hop).\nZero-hop: neighbours only (no relaying).", "Flood: doorgestuurd over het mesh (multi-hop).\nZero-hop: alleen buren (geen doorsturen)." }, @@ -1403,7 +1301,6 @@ static const I18nPair kBuiltin_nl[] = { { "Format failed (no card / SD error)", "Formatteren mislukt (geen kaart / SD-fout)" }, { "Frequency / bandwidth", "Frequentie / bandbreedte" }, { "Full", "Vol" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Zoemer %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Zoemer %s\n%s" }, { "GPS off", "GPS uit" }, @@ -1411,7 +1308,6 @@ static const I18nPair kBuiltin_nl[] = { { "GPS serial baud", "GPS seriële baud" }, { "GPS unset", "GPS niet ingesteld" }, { "GPS: acquiring...", "GPS: zoeken..." }, - { "GPS: fix", "GPS: fix" }, { "GPS: off", "GPS: uit" }, { "GPS: searching", "GPS: zoeken" }, { "Game over — score %d (tap to restart)", "Game over — score %d (tik om te herstarten)" }, @@ -1439,7 +1335,6 @@ static const I18nPair kBuiltin_nl[] = { { "Idle power-save", "Energiebesparing bij inactiviteit" }, { "Idle sleep disabled", "Slaap bij inactiviteit uit" }, { "Idle sleep enabled", "Slaap bij inactiviteit aan" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Afbeelding te groot (>4 MB)" }, { "Import", "Importeren" }, { "Import backup", "Back-up importeren" }, @@ -1449,7 +1344,6 @@ static const I18nPair kBuiltin_nl[] = { { "Import: storage unavailable", "Import: opslag niet beschikbaar" }, { "Importing settings…", "Instellingen importeren…" }, { "Inactive", "Inactief" }, - { "Info", "Info" }, { "Insert emoji / symbol", "Emoji / symbool invoegen" }, { "Install", "Installeren" }, { "Install a previous version", "Een vorige versie installeren" }, @@ -1471,7 +1365,6 @@ static const I18nPair kBuiltin_nl[] = { { "Join network", "Verbinden met netwerk" }, { "Join private channel", "Deelnemen aan privékanaal" }, { "Join the public channel", "Deelnemen aan het publieke kanaal" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Deelgenomen aan %.40s" }, { "Keep per chat (messages)", "Bewaren per chat (berichten)" }, { "Key already in use", "Sleutel al in gebruik" }, @@ -1484,7 +1377,6 @@ static const I18nPair kBuiltin_nl[] = { { "Keyboard nav: off", "Toetsenbordnav.: uit" }, { "Keyboard navigation", "Toetsenbordnavigatie" }, { "Keys", "Toetsen" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Zichtlijn → %s" }, { "Landscape (desktop)", "Liggend (desktop)" }, { "Landscape set - applies when remote mode starts.", "Liggend ingesteld - geldt zodra de externe modus start." }, @@ -1507,11 +1399,6 @@ static const I18nPair kBuiltin_nl[] = { { "Loading...", "Laden..." }, { "Local every", "Lokaal elke" }, { "Local sensors", "Lokale sensoren" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Vergrendelen" }, { "Lock screen", "Vergrendelscherm" }, { "Lock screen wallpaper", "Vergrendelscherm-achtergrond" }, @@ -1533,13 +1420,9 @@ static const I18nPair kBuiltin_nl[] = { { "Login failed", "Inloggen mislukt" }, { "Logs", "Logboeken" }, { "Longitude", "Lengtegraad" }, - { "Lua Store", "Lua Store" }, - { "MHz", "MHz" }, { "MQTT bridge", "MQTT-brug" }, { "Map", "Kaart" }, { "Map options", "Kaartopties" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Kaartopslagfout.\n\nSD-kaart gedetecteerd maar de\ntegelcache kon niet koppelen.\nHerstart om opnieuw te proberen." }, { "Map storage error.\nReflash the tiles partition.", "Kaartopslagfout.\nFlash de tiles-partitie opnieuw." }, { "Map tiles: microSD", "Kaarttegels: microSD" }, @@ -1551,8 +1434,6 @@ static const I18nPair kBuiltin_nl[] = { { "Mark as read", "Als gelezen markeren" }, { "Mark read", "Markeer als gelezen" }, { "Marked read", "Gemarkeerd als gelezen" }, - { "Max dots", "Max dots" }, - { "Max hops (0..64)", "Max hops (0..64)" }, { "Max zoom for this pack", "Max zoom voor dit pakket" }, { "Memory detail", "Geheugendetail" }, { "Mesh health: a flood advert is rebroadcast by every repeater in range, so frequent floods add airtime for the whole network. Keep them infrequent (a day or more). Your neighbours still see you from zero-hop adverts and your message replies, so flood mainly when distant nodes need to rediscover you. Leave both Off to advertise only when you tap the buttons above.", "Mesh-gezondheid: een flood-advert wordt door elke repeater in bereik opnieuw uitgezonden, dus frequente floods verhogen de airtime voor het hele netwerk. Houd ze zeldzaam (een dag of meer). Je buren zien je nog steeds via zero-hop adverts en je berichtantwoorden, dus flood vooral wanneer verre nodes je opnieuw moeten ontdekken. Laat beide uit om alleen te adverteren als je op de knoppen hierboven tikt." }, @@ -1567,8 +1448,6 @@ static const I18nPair kBuiltin_nl[] = { { "Messages", "Berichten" }, { "Min zoom for this pack", "Min zoom voor dit pakket" }, { "Mode: BLE starting / low memory", "Modus: BLE start / weinig geheugen" }, - { "Model:", "Model:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Multi-ACK's" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Multi-ack %s · Herhalen %s · RX-boost %s" }, { "Multi-byte routing (path hash)", "Multi-byte routing (pad-hash)" }, @@ -1585,7 +1464,6 @@ static const I18nPair kBuiltin_nl[] = { { "Nearby on map", "Dichtbij op kaart" }, { "Network name", "Netwerknaam" }, { "Network name (SSID)", "Netwerknaam (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Nieuw" }, { "New DM", "Nieuw DM" }, { "New channel msg", "Nieuw kanaalbericht" }, @@ -1604,7 +1482,6 @@ static const I18nPair kBuiltin_nl[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "Geen JPEG's gevonden in /lock/.\nVoeg afbeeldingen toe via de\nbestandsbeheerder of een SD-kaart." }, { "No SD card", "Geen SD-kaart" }, { "No SD card (or unreadable format)", "Geen SD-kaart (of onleesbaar formaat)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Nog geen back-ups. Tik hierboven op Nieuwe back-up om er een te maken." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Nog geen batterijgeschiedenis.\n\nElke 5 minuten gelogd." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Geen geblokkeerde gebruikers.\n\nHoud een bericht ingedrukt en tik\nop Blokkeren om er een toe te voegen." }, @@ -1622,10 +1499,8 @@ static const I18nPair kBuiltin_nl[] = { { "No onboard GPS", "Geen ingebouwde GPS" }, { "No other networks found", "Geen andere netwerken gevonden" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Nog geen positie. Een koude start heeft vrij zicht op de lucht nodig en kan enkele minuten duren." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Geen antwoord van %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Geen antwoord. Controleer wachtwoord, server,\nof apparaatklok (apparaat: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Hier geen opgeslagen kaarttegels.\n\nMaak verbinding met Wi-Fi (Instellingen → Wi-Fi)\nom dit gebied te downloaden.\nOpgeslagen tegels blijven offline beschikbaar." }, { "No system time yet", "Nog geen systeemtijd" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Geen telemetrie in dit venster.\nVraag er een aan, of verbreed het bereik hieronder." }, @@ -1637,7 +1512,6 @@ static const I18nPair kBuiltin_nl[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Niet genoeg vrij geheugen voor Bluetooth. Schakel eerst Wi-Fi uit." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Niet genoeg vrij geheugen voor Wi-Fi. Schakel eerst Bluetooth uit." }, { "Not enough free memory to fetch it. Reboot and try again.", "Onvoldoende vrij geheugen om het op te halen. Herstart en probeer opnieuw." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Niets geselecteerd" }, { "Notification sound set", "Meldingsgeluid ingesteld" }, { "Notify on new contact", "Melden bij nieuw contact" }, @@ -1645,7 +1519,6 @@ static const I18nPair kBuiltin_nl[] = { { "Off\n1\n2\n3\n5\n8", "Uit\n1\n2\n3\n5\n8" }, { "Off\n1 day\n2 days\n3 days\n7 days", "Uit\n1 dag\n2 dagen\n3 dagen\n7 dagen" }, { "Off\n60 min\n90 min\n2 hours\n3 hours\n4 hours", "Uit\n60 min\n90 min\n2 uur\n3 uur\n4 uur" }, - { "Offline", "Offline" }, { "Older messages in a chat are dropped past this. A very large or unlimited history makes the chat list slower.", "Oudere berichten vervallen hierboven. Een zeer grote of onbeperkte geschiedenis maakt de chatlijst trager." }, { "On - open the address above in a phone browser.", "Aan - open het bovenstaande adres in de browser van je telefoon." }, { "On boot", "Bij opstarten" }, @@ -1681,9 +1554,7 @@ static const I18nPair kBuiltin_nl[] = { { "Path reset failed", "Pad resetten mislukt" }, { "Paused — score %d", "Gepauzeerd — score %d" }, { "Per-transmit switching on", "Per-zending schakelen aan" }, - { "Perf:", "Perf:" }, { "Pick colour", "Kies kleur" }, - { "Ping", "Ping" }, { "Ping failed", "Ping mislukt" }, { "Pinged (direct) — waiting…", "Ping (direct) — wachten…" }, { "Pinged (flood) — waiting…", "Ping (flood) — wachten…" }, @@ -1694,11 +1565,9 @@ static const I18nPair kBuiltin_nl[] = { { "Port", "Poort" }, { "Portrait set - applies when remote mode starts.", "Staand ingesteld - geldt zodra de externe modus start." }, { "Position saved", "Positie opgeslagen" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Energie" }, { "Power off", "Uitschakelen" }, { "Powering off… click trackball to wake", "Uitschakelen… klik trackball om te wekken" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Druk op een toets…" }, { "Probe now", "Nu meten" }, { "Probing neighbours…", "Buren onderzoeken…" }, @@ -1713,11 +1582,9 @@ static const I18nPair kBuiltin_nl[] = { { "Purge all discovered nodes?", "Alle ontdekte nodes wissen?" }, { "Quick replies", "Snelle antwoorden" }, { "Quick reply", "Snel antwoord" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d items · Raw %d items" }, { "RX boosted gain", "RX versterkte gain" }, { "RX log", "RX-logboek" }, - { "Radio & Mesh", "Radio & Mesh" }, { "Radio + region set", "Radio + regio ingesteld" }, { "Radio applied", "Radio toegepast" }, { "Radio off", "Radio uit" }, @@ -1727,9 +1594,6 @@ static const I18nPair kBuiltin_nl[] = { { "RangeTest sent (direct)", "RangeTest verzonden (direct)" }, { "RangeTest sent (flood)", "RangeTest verzonden (flood)" }, { "Raw log", "Ruwe log" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Leest pakketten in een achtergrondtaak zodat een druk scherm ze niet laat vallen." }, { "Reboot", "Herstarten" }, { "Reboot device", "Apparaat herstarten" }, @@ -1737,10 +1601,8 @@ static const I18nPair kBuiltin_nl[] = { { "Rebooting…", "Opnieuw opstarten…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Ontvang niet-uitgebrachte testfirmware — nieuwere functies, maar minder getest. De updatecontrole en Update installeren volgen beide het bètakanaal." }, { "Recently heard", "Recent gehoord" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "SD herformatteren als MESHCOMOD (FAT32)?\nALLE data op de kaart wordt gewist." }, { "Region & scope", "Regio en bereik" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Regiobereik (#tag) voor dit kanaal.\nLeeg = standaardbereik gebruiken." }, { "Region scope (#tag), blank = default.", "Regiobereik (#tag), leeg = standaard." }, { "Region scope (#tag, blank = none)", "Regiobereik (#tag, leeg = geen)" }, @@ -1783,7 +1645,6 @@ static const I18nPair kBuiltin_nl[] = { { "SD card %s", "SD-kaart %s" }, { "SD card %s (hold: format)", "SD-kaart %s (vasthouden: formatteren)" }, { "SD card (tap to mount)", "SD-kaart (tik om te koppelen)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "SD-kaart geplaatst" }, { "SD card lost - reinsert to recover", "SD-kaart verloren - plaats opnieuw" }, { "SD card remounted", "SD-kaart opnieuw gekoppeld" }, @@ -1796,9 +1657,6 @@ static const I18nPair kBuiltin_nl[] = { { "SD is busy - close tools and retry", "SD is bezig - sluit tools en probeer opnieuw" }, { "SD removed - card-backed data cannot be saved", "SD verwijderd - kaartgegevens kunnen niet worden opgeslagen" }, { "SD stayed busy - format cancelled, retry", "SD bleef bezig - formatteren geannuleerd, opnieuw proberen" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB gebruikt" }, { "SSID set — enter password, then Save", "SSID ingesteld — voer wachtwoord in, dan Opslaan" }, { "SSID too long", "SSID te lang" }, @@ -1824,8 +1682,6 @@ static const I18nPair kBuiltin_nl[] = { { "Saved — rebooting", "Opgeslagen — opnieuw opstarten" }, { "Saved — reconnecting…", "Opgeslagen — opnieuw verbinden…" }, { "Saved: %s\nFlash it from the Launcher.", "Opgeslagen: %s\nFlash het vanuit de Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Opslaan naar SD… %d%%" }, { "Saving to SD… 0%", "Opslaan naar SD… 0%" }, { "Scan to open on phone", "Scan om op je telefoon te openen" }, @@ -1860,15 +1716,11 @@ static const I18nPair kBuiltin_nl[] = { { "Send advert now", "Nu advert verzenden" }, { "Send an advert now, or set how often you re-advertise.", "Verstuur nu een advert, of stel in hoe vaak je opnieuw adverteert." }, { "Send failed", "Verzenden mislukt" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Afzender geblokkeerd" }, { "Sensors", "Sensoren" }, { "Sensors tab: off (restart to apply)", "Sensortab: uit (herstart om toe te passen)" }, { "Sensors tab: on (restart to apply)", "Sensortab: aan (herstart om toe te passen)" }, { "Sent", "Verzonden" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Instellen" }, { "Set an SSID first", "Stel eerst een SSID in" }, { "Set as notification sound", "Instellen als meldingsgeluid" }, @@ -1879,8 +1731,6 @@ static const I18nPair kBuiltin_nl[] = { { "Share QR", "QR delen" }, { "Share channel", "Kanaal delen" }, { "Share location in advert", "Locatie delen in advert" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Geheim delen" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Deel het 32-teken geheim zodat anderen kunnen deelnemen. Leeg laten voor een willekeurig geheim." }, { "Share: %s", "Delen: %s" }, @@ -1899,8 +1749,6 @@ static const I18nPair kBuiltin_nl[] = { { "Slot %d cleared", "Slot %d gewist" }, { "Slot empty", "Slot leeg" }, { "Small\nMedium\nLarge", "Klein\nMiddel\nGroot" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, - { "Snake", "Snake" }, { "Snake — swipe or roll the trackball", "Snake — veeg of rol de trackball" }, { "Sort", "Sorteer" }, { "Sound", "Geluid" }, @@ -1908,15 +1756,11 @@ static const I18nPair kBuiltin_nl[] = { { "Sound on", "Geluid aan" }, { "Sound: %s", "Geluid: %s" }, { "Start time", "Starttijd" }, - { "Status", "Status" }, { "Step 1 of 3", "Stap 1 van 3" }, { "Step 2 of 3", "Stap 2 van 3" }, { "Step 3 of 3", "Stap 3 van 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Vorige pad wordt nog\ngeanalyseerd… probeer zo opnieuw." }, - { "Stop", "Stop" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Opslag" }, - { "Store", "Store" }, { "Store data on SD (reboot)", "Gegevens op SD opslaan (herstart)" }, { "Streams the device screen as a live picture you tap to control. Heavier; the panel shows a placeholder. Toggling reboots the device.", "Streamt het scherm als live beeld dat je aantikt om te bedienen. Zwaarder; het paneel toont een plaatshouder. Omschakelen herstart het apparaat." }, { "Switch", "Wisselen" }, @@ -1927,8 +1771,6 @@ static const I18nPair kBuiltin_nl[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nWS-clients %d GPS %s Zoemer %s" }, { "TCP off", "TCP uit" }, { "TCP on", "TCP aan" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Tab-sneltoetsen — tik een rij, druk dan een toets" }, { "Tap Use to switch - the device reboots to apply.", "Tik op Gebruik om te wisselen – het apparaat herstart om dit toe te passen." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Tik Gebruik om te wisselen - het apparaat herstart. Taalbestanden staan in /lang op de opslag; bewerk ze of voeg je eigen toe." }, @@ -1972,7 +1814,6 @@ static const I18nPair kBuiltin_nl[] = { { "Trace sent…", "Tracering verzonden…" }, { "Tracing route…", "Route traceren…" }, { "Trackball navigates UI", "Trackball navigeert UI" }, - { "Trackball: cursor", "Trackball: cursor" }, { "Trackball: navigate UI", "Trackball: navigeer UI" }, { "Turn Wi-Fi on first", "Zet eerst Wi-Fi aan" }, { "Turn Wi-Fi on, then tap refresh. Apps already installed still work.", "Zet Wi-Fi aan en ververs. Al geïnstalleerde apps blijven werken." }, @@ -2007,23 +1848,16 @@ static const I18nPair kBuiltin_nl[] = { { "Updated - rebooting…", "Bijgewerkt - herstarten…" }, { "Use", "Gebruik" }, { "Username (optional)", "Gebruikersnaam (optioneel)" }, - { "Volume", "Volume" }, { "W up · A left · D right · Z down · S select · Q back", "W omhoog · A links · D rechts · Z omlaag · S kies · Q terug" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Wachten op Wi-Fi..." }, { "Welcome to WADAMESH", "Welkom bij WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Zolang dit aan staat kan iedereen op je Wi-Fi dit apparaat bekijken en bedienen. Gebruikt gewoon HTTP (alleen lokaal netwerk)." }, - { "Wi-Fi", "Wi-Fi" }, - { "Wi-Fi & Bluetooth", "Wi-Fi & Bluetooth" }, { "Wi-Fi and Bluetooth unavailable; retry from Settings", "Wi-Fi en Bluetooth niet beschikbaar; opnieuw proberen via Instellingen" }, { "Wi-Fi is not enabled in this build.", "Wi-Fi is niet ingeschakeld in deze build." }, { "Wi-Fi isn't available on this build.", "Wi-Fi is niet beschikbaar in deze build." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Wifi nodig om het terreinprofiel\nvoor dit pad op te halen.\nVerbind in Instellingen → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi niet verbonden" }, { "Wi-Fi off", "Wi-Fi uit" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi aan" }, { "Wi-Fi on, scanning…", "Wi-Fi aan, scannen…" }, { "Wi-Fi paused; Bluetooth disconnect timed out", "Wi-Fi gepauzeerd; Bluetooth-verbinding verbreken mislukt door time-out" }, @@ -2037,10 +1871,8 @@ static const I18nPair kBuiltin_nl[] = { { "Your location is unknown.\nSet GPS / position in\nSettings → Profile first.", "Je locatie is onbekend.\nStel GPS / positie eerst in bij\nInstellingen → Profiel." }, { "Your name", "Je naam" }, { "Your own apps", "Je eigen apps" }, - { "Zero-hop", "Zero-hop" }, { "Zero-hop advert sent", "Zero-hop advert verzonden" }, { "Zoom: +/- buttons", "Zoom: +/- knoppen" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "client verbonden" }, { "command", "opdracht" }, { "contacts (%d):", "contacten (%d):" }, @@ -2054,7 +1886,6 @@ static const I18nPair kBuiltin_nl[] = { { "hold Backspace to unlock", "houd Backspace vast om te ontgrendelen" }, { "hold the d-pad to unlock", "houd de d-pad vast om te ontgrendelen" }, { "hold the trackball to unlock", "houd de trackball vast om te ontgrendelen" }, - { "kHz", "kHz" }, { "keep holding", "blijf vasthouden" }, { "last wake:", "laatste ontwaken:" }, { "last wake: ", "laatst wakker: " }, @@ -2065,7 +1896,6 @@ static const I18nPair kBuiltin_nl[] = { { "min (0=off)", "min (0=uit)" }, { "mkdir failed", "map maken mislukt" }, { "n/a in this build", "n.v.t. in deze build" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "nu op kanaal %s" }, { "now talking to %s", "praat nu met %s" }, { "off", "uit" }, @@ -2075,53 +1905,36 @@ static const I18nPair kBuiltin_nl[] = { { "pick accented letters as you type; off = plain typing", "kies letters met accenten tijdens het typen; uit = gewoon typen" }, { "press Volume Down to unlock", "druk Volume Omlaag om te ontgrendelen" }, { "push past a screen edge to scroll content", "duw voorbij een schermrand om te scrollen" }, - { "score %d", "score %d" }, { "search", "zoeken" }, { "tap for details", "tik voor details" }, { "tap the language key (e.g. EN) on the keyboard to cycle the ones you enable", "tik op de taaltoets (bijv. EN) op het toetsenbord om de ingeschakelde te doorlopen" }, { "tap to cancel", "tik om te annuleren" }, { "tap to exit full screen", "tik om volledig scherm te verlaten" }, - { "zoom", "zoom" }, - { "zoom %d", "zoom %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "~17 dB versterker voor stille/afgelegen gebieden; uit in drukke plekken." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_de[] = { { " (device behind)", " (Gerät geht nach)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d Abdeckungspunkte · %lu auf SD gespeichert#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: warte auf GPS-Fix…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d auf Karte" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d in der Nähe (%d Rpt, %d Comp)" }, { "%u types · hops %u · manual %s", "%u Typen · Hops %u · manuell %s" }, { "(RTC unset)", "(RTC nicht gesetzt)" }, { "(device behind)", "(Gerät hinterher)" }, { "(no default)", "(kein Standard)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 Byte (Legacy)\n2 Bytes\n3 Bytes" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nKein Limit" }, { "12-hour clock", "12-Stunden-Uhr" }, { "32 hex characters", "32 Hex-Zeichen" }, { "32-hex secret. Anyone with this can read the channel.", "32-Hex-Geheimnis. Wer es hat, kann den Kanal lesen." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Erwähnungen" }, { "@ mention sound", "Ton bei @-Erwähnung" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "AUTOMATISCHE ADVERTS" }, { "About", "Über" }, { "About the map", "Über die Karte" }, { "Accent popups", "Akzent-Popups" }, { "Accent popups: off", "Akzent-Popups: aus" }, { "Accent popups: on", "Akzent-Popups: ein" }, - { "Ack", "Ack" }, { "Active", "Aktiv" }, { "Add", "Hinzufügen" }, { "Add channel", "Kanal hinzufügen" }, @@ -2130,14 +1943,11 @@ static const I18nPair kBuiltin_de[] = { { "Added to contacts", "Zu Kontakten hinzugefügt" }, { "Added to favorites", "Zu Favoriten hinzugefügt" }, { "Admin", "Verwaltung" }, - { "Advert", "Advert" }, { "Advert failed", "Advert fehlgeschlagen" }, { "Advert location", "Advert-Standort" }, { "Advert policy saved", "Advert-Richtlinie gespeichert" }, { "Advert sent", "Advert gesendet" }, - { "All", "All" }, { "All marked read", "Alle als gelesen" }, - { "Allow", "Allow" }, { "Already exists", "Existiert bereits" }, { "Already exists or table full.", "Existiert bereits oder Tabelle voll." }, { "Already in contacts", "Bereits in Kontakten" }, @@ -2148,13 +1958,10 @@ static const I18nPair kBuiltin_de[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Jeder kann beitreten. Schlüssel aus dem Hashtag (Kleinbuchstaben)." }, { "App drawer as home", "App-Drawer als Startseite" }, { "App icon size", "App-Symbolgröße" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Gilt nach Neustart." }, { "Apply", "Anwenden" }, { "Apply auto-poll", "Auto-Poll übernehmen" }, { "Apply radio params", "Funkparameter anwenden" }, - { "Apps", "Apps" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Pfeile + Enter funktionieren immer. Diese Buchstaben sind extra — Zeile antippen, dann Taste drücken." }, { "Auto advert", "Automatischer Advert" }, { "Auto chat", "Auto-Chat" }, @@ -2178,14 +1985,11 @@ static const I18nPair kBuiltin_de[] = { { "Available", "Verfügbar" }, { "BLE off", "BLE aus" }, { "BLE on", "BLE ein" }, - { "BT", "BT" }, { "Back", "Zurück" }, - { "Backups", "Backups" }, { "Battery", "Akku" }, { "Battery & power history", "Akku- & Energieverlauf" }, { "Battery (V)", "Akku (V)" }, { "Battery calibration reset to default", "Batteriekalibrierung zurückgesetzt" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Batteriewert zu niedrig — zuerst voll laden" }, { "Battery saver (experimental)", "Energiesparmodus (experimentell)" }, { "Battery — last 24h", "Akku — letzte 24h" }, @@ -2198,7 +2002,6 @@ static const I18nPair kBuiltin_de[] = { { "Blocking unsupported", "Blockieren nicht unterstützt" }, { "Blue battery Last 6 min", "Blau Akku Letzte 6 Min" }, { "Blue battery Orange temp Cyan humidity", "Blau Akku Orange Temp. Cyan Feuchte" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth bereits aus" }, { "Bluetooth already on", "Bluetooth bereits ein" }, { "Bluetooth deferred; retry from Settings", "Bluetooth zurückgestellt; erneut über Einstellungen versuchen" }, @@ -2211,7 +2014,6 @@ static const I18nPair kBuiltin_de[] = { { "Buffered receive (experimental)", "Gepufferter Empfang (experimentell)" }, { "Built-in", "Integriert" }, { "Built-in (default)", "Integriert (Standard)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Batterie kalibrieren (voll = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Kalibriert: 100%% = %u.%02u V (lang drücken zum Zurücksetzen)" }, { "Can't block — not a contact", "Blockieren nicht möglich — kein Kontakt" }, @@ -2318,7 +2120,6 @@ static const I18nPair kBuiltin_de[] = { { "Cut", "Ausschneiden" }, { "Cut - Paste in a folder", "Ausgeschnitten - in einen Ordner einfügen" }, { "DM sound", "DM-Ton" }, - { "DND", "DND" }, { "Danger zone", "Gefahrenzone" }, { "Data -> SD card on reboot\n(card must be inserted)", "Daten -> SD-Karte bei Neustart\n(Karte muss eingelegt sein)" }, { "Data -> internal on reboot", "Daten -> intern bei Neustart" }, @@ -2376,7 +2177,6 @@ static const I18nPair kBuiltin_de[] = { { "Enter SSID first", "Zuerst SSID eingeben" }, { "Enter a name", "Namen eingeben" }, { "Enter a network name", "Netzwerknamen eingeben" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Enter fügt neue Zeile ein" }, { "Enter exactly 32 hex characters.", "Genau 32 Hex-Zeichen eingeben." }, { "Enter key sends message", "Enter-Taste sendet Nachricht" }, @@ -2409,9 +2209,7 @@ static const I18nPair kBuiltin_de[] = { { "Find", "Suchen" }, { "Finish", "Fertig" }, { "Firmware beta_%d\nCouldn't reach the update server", "Firmware beta_%d\nUpdate-Server nicht erreichbar" }, - { "Firmware:", "Firmware:" }, { "Flash on new message", "Blinken bei neuer Nachricht" }, - { "Flood", "Flood" }, { "Flood advert sent", "Flood-Advert gesendet" }, { "Flood every", "Flood alle" }, { "Flood: relayed across the mesh (multi-hop).\nZero-hop: neighbours only (no relaying).", "Flood: über das Mesh weitergeleitet (Multi-Hop).\nZero-Hop: nur Nachbarn (keine Weiterleitung)." }, @@ -2423,7 +2221,6 @@ static const I18nPair kBuiltin_de[] = { { "Format failed (no card / SD error)", "Formatieren fehlgeschlagen (keine Karte / SD-Fehler)" }, { "Frequency / bandwidth", "Frequenz / Bandbreite" }, { "Full", "Voll" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Summer %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Summer %s\n%s" }, { "GPS off", "GPS aus" }, @@ -2459,7 +2256,6 @@ static const I18nPair kBuiltin_de[] = { { "Idle power-save", "Energiesparen bei Inaktivität" }, { "Idle sleep disabled", "Ruheschlaf deaktiviert" }, { "Idle sleep enabled", "Ruheschlaf aktiviert" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Bild zu groß (>4 MB)" }, { "Import", "Importieren" }, { "Import backup", "Backup importieren" }, @@ -2469,7 +2265,6 @@ static const I18nPair kBuiltin_de[] = { { "Import: storage unavailable", "Import: Speicher nicht verfügbar" }, { "Importing settings…", "Einstellungen werden importiert…" }, { "Inactive", "Inaktiv" }, - { "Info", "Info" }, { "Insert emoji / symbol", "Emoji / Symbol einfügen" }, { "Install", "Installieren" }, { "Install a previous version", "Vorherige Version installieren" }, @@ -2491,7 +2286,6 @@ static const I18nPair kBuiltin_de[] = { { "Join network", "Netzwerk beitreten" }, { "Join private channel", "Privaten Kanal beitreten" }, { "Join the public channel", "Öffentlichem Kanal beitreten" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "%.40s beigetreten" }, { "Keep per chat (messages)", "Pro Chat behalten (Nachrichten)" }, { "Key already in use", "Schlüssel bereits vergeben" }, @@ -2504,7 +2298,6 @@ static const I18nPair kBuiltin_de[] = { { "Keyboard nav: off", "Tastaturnav.: aus" }, { "Keyboard navigation", "Tastaturnavigation" }, { "Keys", "Tasten" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Sichtlinie → %s" }, { "Landscape (desktop)", "Querformat (Desktop)" }, { "Landscape set - applies when remote mode starts.", "Querformat gesetzt - gilt beim Start des Fernmodus." }, @@ -2527,11 +2320,6 @@ static const I18nPair kBuiltin_de[] = { { "Loading...", "Lädt..." }, { "Local every", "Lokal alle" }, { "Local sensors", "Lokale Sensoren" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Sperren" }, { "Lock screen", "Sperrbildschirm" }, { "Lock screen wallpaper", "Sperrbildschirm-Hintergrund" }, @@ -2553,13 +2341,9 @@ static const I18nPair kBuiltin_de[] = { { "Login failed", "Anmeldung fehlgeschlagen" }, { "Logs", "Protokolle" }, { "Longitude", "Längengrad" }, - { "Lua Store", "Lua Store" }, - { "MHz", "MHz" }, { "MQTT bridge", "MQTT-Brücke" }, { "Map", "Karte" }, { "Map options", "Kartenoptionen" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Kartenspeicherfehler.\n\nSD-Karte erkannt, aber der\nKachel-Cache wurde nicht eingebunden.\nNeustart zum Wiederholen." }, { "Map storage error.\nReflash the tiles partition.", "Kartenspeicherfehler.\nTiles-Partition neu flashen." }, { "Map tiles: microSD", "Kartenkacheln: microSD" }, @@ -2571,7 +2355,6 @@ static const I18nPair kBuiltin_de[] = { { "Mark as read", "Als gelesen markieren" }, { "Mark read", "Als gelesen markieren" }, { "Marked read", "Als gelesen markiert" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Max. Hops (0..64)" }, { "Max zoom for this pack", "Max. Zoom für dieses Paket" }, { "Memory detail", "Speicherdetails" }, @@ -2588,7 +2371,6 @@ static const I18nPair kBuiltin_de[] = { { "Min zoom for this pack", "Min. Zoom für dieses Paket" }, { "Mode: BLE starting / low memory", "Modus: BLE startet / wenig Speicher" }, { "Model:", "Modell:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Multi-ACKs" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Multi-Ack %s · Wdh. %s · RX-Boost %s" }, { "Multi-byte routing (path hash)", "Multibyte-Routing (Pfad-Hash)" }, @@ -2596,7 +2378,6 @@ static const I18nPair kBuiltin_de[] = { { "Mute msgs", "Nachr. stumm" }, { "Mute notification sound", "Benachrichtigungston stumm" }, { "My position (no GPS fix)", "Meine Position (kein GPS-Fix)" }, - { "Name", "Name" }, { "Name can't be empty.", "Name darf nicht leer sein." }, { "Name fragment", "Namensfragment" }, { "Name saved", "Name gespeichert" }, @@ -2605,7 +2386,6 @@ static const I18nPair kBuiltin_de[] = { { "Nearby on map", "In der Nähe auf Karte" }, { "Network name", "Netzwerkname" }, { "Network name (SSID)", "Netzwerkname (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Neu" }, { "New DM", "Neue DN" }, { "New channel msg", "Neue Kanalnachricht" }, @@ -2624,7 +2404,6 @@ static const I18nPair kBuiltin_de[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "Keine JPEGs in /lock/ gefunden.\nBilder über den Dateimanager\noder eine SD-Karte hinzufügen." }, { "No SD card", "Keine SD-Karte" }, { "No SD card (or unreadable format)", "Keine SD-Karte (oder unlesbares Format)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Noch keine Backups. Tippe oben auf Neues Backup, um eines zu erstellen." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Noch kein Akkuverlauf.\n\nAlle 5 Minuten protokolliert." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Keine blockierten Benutzer.\n\nNachricht lange drücken und auf\nBlockieren tippen, um einen hinzuzufügen." }, @@ -2642,10 +2421,8 @@ static const I18nPair kBuiltin_de[] = { { "No onboard GPS", "Kein integriertes GPS" }, { "No other networks found", "Keine anderen Netzwerke gefunden" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Noch keine Position. Ein Kaltstart braucht freie Sicht zum Himmel und kann mehrere Minuten dauern." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Keine Antwort von %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Keine Antwort. Prüfe Passwort, Server\noder Geräteuhr (Gerät: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Hier keine gespeicherten Kacheln.\n\nMit Wi-Fi verbinden (Einstellungen → Wi-Fi),\num dieses Gebiet zu laden.\nGespeicherte Kacheln bleiben offline verfügbar." }, { "No system time yet", "Noch keine Systemzeit" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Keine Telemetrie in diesem Fenster.\nFordere welche an oder erweitere unten den Bereich." }, @@ -2657,7 +2434,6 @@ static const I18nPair kBuiltin_de[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Nicht genug freier Speicher für Bluetooth. Schalte zuerst Wi-Fi aus." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Nicht genug freier Speicher für Wi-Fi. Schalte zuerst Bluetooth aus." }, { "Not enough free memory to fetch it. Reboot and try again.", "Nicht genug freier Speicher zum Abrufen. Neu starten und erneut versuchen." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Nichts ausgewählt" }, { "Notification sound set", "Benachrichtigungston festgelegt" }, { "Notify on new contact", "Bei neuem Kontakt benachrichtigen" }, @@ -2665,7 +2441,6 @@ static const I18nPair kBuiltin_de[] = { { "Off\n1\n2\n3\n5\n8", "Aus\n1\n2\n3\n5\n8" }, { "Off\n1 day\n2 days\n3 days\n7 days", "Aus\n1 Tag\n2 Tage\n3 Tage\n7 Tage" }, { "Off\n60 min\n90 min\n2 hours\n3 hours\n4 hours", "Aus\n60 Min\n90 Min\n2 Std\n3 Std\n4 Std" }, - { "Offline", "Offline" }, { "Older messages in a chat are dropped past this. A very large or unlimited history makes the chat list slower.", "Ältere Nachrichten werden darüber hinaus verworfen. Ein sehr großer oder unbegrenzter Verlauf macht die Chatliste langsamer." }, { "On - open the address above in a phone browser.", "Ein - obige Adresse im Handy-Browser öffnen." }, { "On boot", "Beim Start" }, @@ -2701,9 +2476,7 @@ static const I18nPair kBuiltin_de[] = { { "Path reset failed", "Pfad-Reset fehlgeschlagen" }, { "Paused — score %d", "Pausiert — Punkte %d" }, { "Per-transmit switching on", "Pro-Sendung-Umschaltung ein" }, - { "Perf:", "Perf:" }, { "Pick colour", "Farbe wählen" }, - { "Ping", "Ping" }, { "Ping failed", "Ping fehlgeschlagen" }, { "Pinged (direct) — waiting…", "Ping (direkt) — warte…" }, { "Pinged (flood) — waiting…", "Ping (Flood) — warte…" }, @@ -2711,14 +2484,11 @@ static const I18nPair kBuiltin_de[] = { { "Poll (min)", "Abfrage (Min)" }, { "Poll every", "Abfrage alle" }, { "Poll every %d min", "Abfrage alle %d Min" }, - { "Port", "Port" }, { "Portrait set - applies when remote mode starts.", "Hochformat gesetzt - gilt beim Start des Fernmodus." }, { "Position saved", "Position gespeichert" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Ein/Aus" }, { "Power off", "Ausschalten" }, { "Powering off… click trackball to wake", "Schaltet aus… Trackball klicken zum Aufwecken" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Taste drücken…" }, { "Probe now", "Jetzt messen" }, { "Probing neighbours…", "Nachbarn werden geprüft…" }, @@ -2733,7 +2503,6 @@ static const I18nPair kBuiltin_de[] = { { "Purge all discovered nodes?", "Alle entdeckten Nodes löschen?" }, { "Quick replies", "Schnellantworten" }, { "Quick reply", "Schnellantwort" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d Einträge · Raw %d Einträge" }, { "RX boosted gain", "RX verstärkte Verstärkung" }, { "RX log", "RX-Protokoll" }, @@ -2747,9 +2516,6 @@ static const I18nPair kBuiltin_de[] = { { "RangeTest sent (direct)", "RangeTest gesendet (direkt)" }, { "RangeTest sent (flood)", "RangeTest gesendet (Flood)" }, { "Raw log", "Roh-Protokoll" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Liest Pakete in einer Hintergrundaufgabe, damit ein ausgelasteter Bildschirm sie nicht verliert." }, { "Reboot", "Neustart" }, { "Reboot device", "Gerät neu starten" }, @@ -2757,10 +2523,8 @@ static const I18nPair kBuiltin_de[] = { { "Rebooting…", "Neustart…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Nicht veröffentlichte Test-Firmware empfangen — neuere Funktionen, aber weniger getestet. Update-Prüfung und Update installieren folgen beide dem Beta-Kanal." }, { "Recently heard", "Kürzlich gehört" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "SD als MESHCOMOD (FAT32) neu formatieren?\nALLE Daten auf der Karte werden gelöscht." }, { "Region & scope", "Region & Reichweite" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Regionsbereich (#tag) für diesen Kanal.\nLeer = Standardbereich verwenden." }, { "Region scope (#tag), blank = default.", "Regionsbereich (#tag), leer = Standard." }, { "Region scope (#tag, blank = none)", "Regionsbereich (#tag, leer = keiner)" }, @@ -2803,7 +2567,6 @@ static const I18nPair kBuiltin_de[] = { { "SD card %s", "SD-Karte %s" }, { "SD card %s (hold: format)", "SD-Karte %s (halten: formatieren)" }, { "SD card (tap to mount)", "SD-Karte (zum Einbinden tippen)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "SD-Karte eingelegt" }, { "SD card lost - reinsert to recover", "SD-Karte verloren - neu einstecken" }, { "SD card remounted", "SD-Karte neu eingebunden" }, @@ -2816,9 +2579,6 @@ static const I18nPair kBuiltin_de[] = { { "SD is busy - close tools and retry", "SD ist belegt – Tools schließen und erneut versuchen" }, { "SD removed - card-backed data cannot be saved", "SD entfernt – Kartendaten können nicht gespeichert werden" }, { "SD stayed busy - format cancelled, retry", "SD blieb belegt – Formatierung abgebrochen, erneut versuchen" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB belegt" }, { "SSID set — enter password, then Save", "SSID gesetzt — Passwort eingeben, dann Speichern" }, { "SSID too long", "SSID zu lang" }, @@ -2844,8 +2604,6 @@ static const I18nPair kBuiltin_de[] = { { "Saved — rebooting", "Gespeichert — Neustart" }, { "Saved — reconnecting…", "Gespeichert — verbinde neu…" }, { "Saved: %s\nFlash it from the Launcher.", "Gespeichert: %s\nFlashe es über den Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Speichern auf SD… %d%%" }, { "Saving to SD… 0%", "Speichern auf SD… 0%" }, { "Scan to open on phone", "Scannen, um am Handy zu öffnen" }, @@ -2864,7 +2622,6 @@ static const I18nPair kBuiltin_de[] = { { "Screenshot: write failed", "Screenshot: Schreiben fehlgeschlagen" }, { "Scroll down", "Nach unten scrollen" }, { "Scroll up", "Nach oben scrollen" }, - { "Scrollball: normal", "Scrollball: normal" }, { "Scrollball: reversed", "Scrollball: umgekehrt" }, { "Search", "Suchen" }, { "Search contacts", "Kontakte suchen" }, @@ -2880,15 +2637,11 @@ static const I18nPair kBuiltin_de[] = { { "Send advert now", "Advert jetzt senden" }, { "Send an advert now, or set how often you re-advertise.", "Jetzt einen Advert senden oder festlegen, wie oft du neu advertisest." }, { "Send failed", "Senden fehlgeschlagen" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Absender blockiert" }, { "Sensors", "Sensoren" }, { "Sensors tab: off (restart to apply)", "Sensoren-Tab: aus (Neustart zum Anwenden)" }, { "Sensors tab: on (restart to apply)", "Sensoren-Tab: an (Neustart zum Anwenden)" }, { "Sent", "Gesendet" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Setzen" }, { "Set an SSID first", "Zuerst SSID festlegen" }, { "Set as notification sound", "Als Benachrichtigungston festlegen" }, @@ -2899,8 +2652,6 @@ static const I18nPair kBuiltin_de[] = { { "Share QR", "QR teilen" }, { "Share channel", "Kanal teilen" }, { "Share location in advert", "Standort im Advert teilen" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Geheimnis teilen" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Teilen Sie das 32-Zeichen-Geheimnis, damit andere beitreten. Leer lassen für ein zufälliges." }, { "Share: %s", "Teilen: %s" }, @@ -2919,8 +2670,6 @@ static const I18nPair kBuiltin_de[] = { { "Slot %d cleared", "Slot %d gelöscht" }, { "Slot empty", "Slot leer" }, { "Small\nMedium\nLarge", "Klein\nMittel\nGroß" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, - { "Snake", "Snake" }, { "Snake — swipe or roll the trackball", "Snake — wischen oder Trackball rollen" }, { "Sort", "Sortieren" }, { "Sound", "Ton" }, @@ -2928,27 +2677,21 @@ static const I18nPair kBuiltin_de[] = { { "Sound on", "Ton ein" }, { "Sound: %s", "Ton: %s" }, { "Start time", "Startzeit" }, - { "Status", "Status" }, { "Step 1 of 3", "Schritt 1 von 3" }, { "Step 2 of 3", "Schritt 2 von 3" }, { "Step 3 of 3", "Schritt 3 von 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Vorheriger Pfad wird noch\nanalysiert… gleich erneut versuchen." }, { "Stop", "Stopp" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Speicher" }, - { "Store", "Store" }, { "Store data on SD (reboot)", "Daten auf SD speichern (Neustart)" }, { "Streams the device screen as a live picture you tap to control. Heavier; the panel shows a placeholder. Toggling reboots the device.", "Überträgt den Bildschirm als Livebild, das per Tippen gesteuert wird. Schwerer; das Panel zeigt einen Platzhalter. Umschalten startet das Gerät neu." }, { "Switch", "Wechseln" }, { "Switch to the external antenna?\n\nMake sure an antenna is actually connected to the external antenna socket first. Transmitting with nothing attached can damage the radio.\n\nResets to the on-board antenna on every reboot.", "Auf die externe Antenne wechseln?\n\nErst sicherstellen, dass wirklich eine Antenne an der Buchse steckt. Senden ohne Antenne kann das Funkmodul beschädigen.\n\nFällt bei jedem Neustart auf die interne Antenne zurück." }, { "Sync clock from system", "Uhr synchronisieren" }, - { "System", "System" }, { "System info", "Systeminfo" }, { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nWS-Clients %d GPS %s Summer %s" }, { "TCP off", "TCP aus" }, { "TCP on", "TCP ein" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Tab-Tasten — Zeile tippen, dann Taste drücken" }, { "Tap Use to switch - the device reboots to apply.", "Zum Wechseln auf Nutzen tippen – das Gerät startet neu." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Zum Wechseln auf Nutzen tippen - das Gerät startet neu. Sprachdateien liegen in /lang auf dem Speicher; bearbeiten oder eigene hinzufügen." }, @@ -3017,7 +2760,6 @@ static const I18nPair kBuiltin_de[] = { { "Unread %d\nRAM %u%% · PSRAM %u%%", "Ungelesen %d\nRAM %u%% · PSRAM %u%%" }, { "Unsupported WAV (need 16-bit PCM)", "Nicht unterstütztes WAV (16-Bit PCM nötig)" }, { "Up", "Nach oben" }, - { "Update", "Update" }, { "Update bin saved to SD", "Update-Bin auf SD gespeichert" }, { "Update complete.\nRebooting...", "Update fertig.\nNeustart..." }, { "Update manually at flasher.wadamesh.com\n(Wi-Fi update is paused for now)", "Manuell aktualisieren auf flasher.wadamesh.com\n(WLAN-Update ist vorerst pausiert)" }, @@ -3029,13 +2771,9 @@ static const I18nPair kBuiltin_de[] = { { "Username (optional)", "Benutzername (optional)" }, { "Volume", "Lautstärke" }, { "W up · A left · D right · Z down · S select · Q back", "W hoch · A links · D rechts · Z runter · S wählen · Q zurück" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Warten auf Wi-Fi..." }, { "Welcome to WADAMESH", "Willkommen bei WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Solange dies aktiv ist, kann jeder im Wi-Fi dieses Gerät sehen und steuern. Nutzt einfaches HTTP (nur lokales Netz)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "WLAN & Bluetooth" }, { "Wi-Fi and Bluetooth unavailable; retry from Settings", "Wi-Fi und Bluetooth nicht verfügbar; in den Einstellungen erneut versuchen" }, { "Wi-Fi is not enabled in this build.", "WLAN ist in diesem Build nicht aktiviert." }, @@ -3043,7 +2781,6 @@ static const I18nPair kBuiltin_de[] = { { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "WLAN nötig, um das Geländeprofil\nfür diesen Pfad zu laden.\nVerbinden in Einstellungen → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi nicht verbunden" }, { "Wi-Fi off", "WLAN aus" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "WLAN ein" }, { "Wi-Fi on, scanning…", "Wi-Fi an, suche…" }, { "Wi-Fi paused; Bluetooth disconnect timed out", "Wi-Fi pausiert; Bluetooth-Trennung hat das Zeitlimit überschritten" }, @@ -3060,7 +2797,6 @@ static const I18nPair kBuiltin_de[] = { { "Zero-hop", "Ohne Hop" }, { "Zero-hop advert sent", "Zero-Hop-Advert gesendet" }, { "Zoom: +/- buttons", "Zoom: +/- Tasten" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "Client verbunden" }, { "command", "Befehl" }, { "contacts (%d):", "Kontakte (%d):" }, @@ -3074,7 +2810,6 @@ static const I18nPair kBuiltin_de[] = { { "hold Backspace to unlock", "Backspace halten zum Entsperren" }, { "hold the d-pad to unlock", "D-Pad halten zum Entsperren" }, { "hold the trackball to unlock", "Trackball halten zum Entsperren" }, - { "kHz", "kHz" }, { "keep holding", "weiter halten" }, { "last wake:", "Letztes Aufwachen:" }, { "last wake: ", "Letztes Wecken: " }, @@ -3085,7 +2820,6 @@ static const I18nPair kBuiltin_de[] = { { "min (0=off)", "Min (0=aus)" }, { "mkdir failed", "Ordner anlegen fehlgeschlagen" }, { "n/a in this build", "n. v. in diesem Build" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "jetzt auf Kanal %s" }, { "now talking to %s", "spricht jetzt mit %s" }, { "off", "aus" }, @@ -3104,37 +2838,23 @@ static const I18nPair kBuiltin_de[] = { { "zoom", "Zoom" }, { "zoom %d", "Zoom %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "~17 dB Verstärker für ruhige/abgelegene Gebiete; in lauten Zonen aus." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_fr[] = { { " (device behind)", " (appareil en retard)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive : %d points de couverture · %lu enregistrés sur SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive : attente du point GPS…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d sur la carte" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d à proximité (%d rpt, %d comp)" }, { "%u types · hops %u · manual %s", "%u types · sauts %u · manuel %s" }, { "(RTC unset)", "(RTC non réglée)" }, { "(device behind)", "(appareil en retard)" }, { "(no default)", "(aucun par défaut)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 octet (hérité)\n2 octets\n3 octets" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nSans limite" }, { "12-hour clock", "Horloge 12 h" }, { "32 hex characters", "32 caractères hex" }, { "32-hex secret. Anyone with this can read the channel.", "Secret 32 hex. Quiconque l'a peut lire le canal." }, - { ">_ Terminal", ">_ Terminal" }, - { "@ Mentions", "@ Mentions" }, { "@ mention sound", "Son des mentions @" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "ADVERTS AUTOMATIQUES" }, { "About", "À propos" }, { "About the map", "À propos de la carte" }, @@ -3149,15 +2869,12 @@ static const I18nPair kBuiltin_fr[] = { { "Added", "Ajouté" }, { "Added to contacts", "Ajouté aux contacts" }, { "Added to favorites", "Ajouté aux favoris" }, - { "Admin", "Admin" }, { "Advert", "Annonce" }, { "Advert failed", "Échec de l'annonce" }, { "Advert location", "Position de l'annonce" }, { "Advert policy saved", "Règle d'annonce enregistrée" }, { "Advert sent", "Annonce envoyée" }, - { "All", "All" }, { "All marked read", "Tout marqué comme lu" }, - { "Allow", "Allow" }, { "Already exists", "Existe déjà" }, { "Already exists or table full.", "Existe déjà ou table pleine." }, { "Already in contacts", "Déjà dans les contacts" }, @@ -3168,13 +2885,11 @@ static const I18nPair kBuiltin_fr[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Tout le monde peut rejoindre. Clé dérivée du hashtag (minuscules)." }, { "App drawer as home", "Tiroir d'apps comme accueil" }, { "App icon size", "Taille des icônes d'app" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Appliqué après redémarrage." }, { "Apply", "Appliquer" }, { "Apply auto-poll", "Appliquer l'auto-poll" }, { "Apply radio params", "Appliquer les paramètres radio" }, { "Apps", "Applis" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Flèches + Entrée fonctionnent toujours. Ces lettres sont en plus — touchez une ligne, puis une touche." }, { "Auto advert", "Annonce automatique" }, { "Auto chat", "Chat auto" }, @@ -3197,14 +2912,12 @@ static const I18nPair kBuiltin_fr[] = { { "Available", "Disponibles" }, { "BLE off", "BLE désactivé" }, { "BLE on", "BLE activé" }, - { "BT", "BT" }, { "Back", "Retour" }, { "Backups", "Sauvegardes" }, { "Battery", "Batterie" }, { "Battery & power history", "Historique batterie et alimentation" }, { "Battery (V)", "Batterie (V)" }, { "Battery calibration reset to default", "Étalonnage batterie réinitialisé" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Lecture batterie trop basse — chargez d'abord" }, { "Battery saver (experimental)", "Économie de batterie (expérimental)" }, { "Battery — last 24h", "Batterie — dernières 24h" }, @@ -3217,7 +2930,6 @@ static const I18nPair kBuiltin_fr[] = { { "Blocking unsupported", "Blocage non pris en charge" }, { "Blue battery Last 6 min", "Bleu batterie 6 dernières min" }, { "Blue battery Orange temp Cyan humidity", "Bleu batterie Orange temp. Cyan humidité" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth déjà désactivé" }, { "Bluetooth already on", "Bluetooth déjà activé" }, { "Bluetooth off", "Bluetooth désactivé" }, @@ -3227,7 +2939,6 @@ static const I18nPair kBuiltin_fr[] = { { "Buffered receive (experimental)", "Réception tamponnée (expérimental)" }, { "Built-in", "Intégré" }, { "Built-in (default)", "Intégré (par défaut)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Étalonner la batterie (plein = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Étalonné : 100%% = %u.%02u V (appui long pour réinitialiser)" }, { "Can't block — not a contact", "Blocage impossible — pas un contact" }, @@ -3292,7 +3003,6 @@ static const I18nPair kBuiltin_fr[] = { { "Contact deleted", "Contact supprimé" }, { "Contact gone", "Contact perdu" }, { "Contact missing", "Contact manquant" }, - { "Contacts", "Contacts" }, { "Contacts are on internal flash - the SD card did not mount at boot. Re-seat the card and reboot.", "Les contacts sont en mémoire interne - la carte SD ne s'est pas montée au démarrage. Réinsérez la carte et redémarrez." }, { "Contacts are on internal flash.", "Les contacts sont sur la mémoire interne." }, { "Contacts are saved to the SD card.", "Les contacts sont enregistrés sur la carte SD." }, @@ -3324,7 +3034,6 @@ static const I18nPair kBuiltin_fr[] = { { "Cut", "Couper" }, { "Cut - Paste in a folder", "Coupé - collez dans un dossier" }, { "DM sound", "Son des DM" }, - { "DND", "DND" }, { "Danger zone", "Zone de danger" }, { "Data -> SD card on reboot\n(card must be inserted)", "Données -> carte SD au redémarrage\n(carte requise)" }, { "Data -> internal on reboot", "Données -> interne au redémarrage" }, @@ -3347,7 +3056,6 @@ static const I18nPair kBuiltin_fr[] = { { "Device name hidden", "Nom de l'appareil masqué" }, { "Device name shown", "Nom de l'appareil affiché" }, { "Device time:", "Heure de l'appareil :" }, - { "Diagnostics", "Diagnostics" }, { "Diagnostics are on the About page.", "El diagnóstico está en la página Acerca de." }, { "Discovered", "Découverts" }, { "Discovered settings", "Réglages des nœuds découverts" }, @@ -3381,7 +3089,6 @@ static const I18nPair kBuiltin_fr[] = { { "Enter SSID first", "Saisissez d'abord le SSID" }, { "Enter a name", "Saisissez un nom" }, { "Enter a network name", "Saisir un nom de réseau" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Entrée ajoute une ligne" }, { "Enter exactly 32 hex characters.", "Saisissez exactement 32 caractères hex." }, { "Enter key sends message", "La touche Entrée envoie le message" }, @@ -3411,7 +3118,6 @@ static const I18nPair kBuiltin_fr[] = { { "Find", "Rechercher" }, { "Finish", "Terminer" }, { "Firmware beta_%d\nCouldn't reach the update server", "Firmware beta_%d\nServeur de mise à jour injoignable" }, - { "Firmware:", "Firmware:" }, { "Flash on new message", "Clignoter à nouveau message" }, { "Flood", "Diffusion" }, { "Flood advert sent", "Annonce flood envoyée" }, @@ -3425,9 +3131,6 @@ static const I18nPair kBuiltin_fr[] = { { "Format failed (no card / SD error)", "Échec du formatage (pas de carte / erreur SD)" }, { "Frequency / bandwidth", "Fréquence / bande passante" }, { "Full", "Plein" }, - { "GPS", "GPS" }, - { "GPS %s · Buzzer %s", "GPS %s · Buzzer %s" }, - { "GPS %s · Buzzer %s\n%s", "GPS %s · Buzzer %s\n%s" }, { "GPS off", "GPS désactivé" }, { "GPS on", "GPS activé" }, { "GPS serial baud", "Débit série GPS" }, @@ -3459,7 +3162,6 @@ static const I18nPair kBuiltin_fr[] = { { "Idle power-save", "Économie d'énergie au repos" }, { "Idle sleep disabled", "Veille au repos désactivée" }, { "Idle sleep enabled", "Veille au repos activée" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Image trop grande (>4 Mo)" }, { "Import", "Importer" }, { "Import backup", "Importer la sauvegarde" }, @@ -3491,7 +3193,6 @@ static const I18nPair kBuiltin_fr[] = { { "Join network", "Rejoindre le réseau" }, { "Join private channel", "Rejoindre un canal privé" }, { "Join the public channel", "Rejoindre le canal public" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Rejoint %.40s" }, { "Keep per chat (messages)", "À conserver par discussion (messages)" }, { "Key already in use", "Clé déjà utilisée" }, @@ -3503,7 +3204,6 @@ static const I18nPair kBuiltin_fr[] = { { "Keyboard nav: WASDZ on", "Nav. clavier : WASDZ activé" }, { "Keyboard nav: off", "Nav. clavier : désactivé" }, { "Keyboard navigation", "Navigation clavier" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Vue directe → %s" }, { "Landscape (desktop)", "Paysage (bureau)" }, { "Landscape set - applies when remote mode starts.", "Paysage défini - s'applique au démarrage du mode distant." }, @@ -3511,7 +3211,6 @@ static const I18nPair kBuiltin_fr[] = { { "Language catalog unavailable - check Wi-Fi, then reopen this tab.", "Catalogue de langues indisponible - vérifiez le Wi-Fi puis rouvrez cet onglet." }, { "Language updated - restarting to apply it…", "Langue mise à jour - redémarrage pour l'appliquer…" }, { "Languages", "Langues" }, - { "Latitude", "Latitude" }, { "Leave empty if not required", "Laisser vide si non requis" }, { "Leaving remote mode - rebooting...", "Sortie du mode distant - redémarrage..." }, { "Let's set up your device.\n\nYou'll pick a name and choose your LoRa region. Takes about a minute.", "Configurons votre appareil.\n\nVous choisirez un nom et votre région LoRa. Cela prend environ une minute." }, @@ -3524,11 +3223,6 @@ static const I18nPair kBuiltin_fr[] = { { "Loading...", "Chargement..." }, { "Local every", "Local toutes les" }, { "Local sensors", "Capteurs locaux" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Verrouiller" }, { "Lock screen", "Écran de verrouillage" }, { "Lock screen wallpaper", "Fond d'écran de verrouillage" }, @@ -3549,14 +3243,9 @@ static const I18nPair kBuiltin_fr[] = { { "Login OK (perms %u)", "Connexion OK (perms %u)" }, { "Login failed", "Échec de connexion" }, { "Logs", "Journaux" }, - { "Longitude", "Longitude" }, - { "Lua Store", "Lua Store" }, - { "MHz", "MHz" }, { "MQTT bridge", "Pont MQTT" }, { "Map", "Carte" }, { "Map options", "Options de carte" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Erreur de stockage carte.\n\nCarte SD détectée mais le\ncache de tuiles n'a pas monté.\nRedémarrez pour réessayer." }, { "Map storage error.\nReflash the tiles partition.", "Erreur de stockage carte.\nReflashez la partition des tuiles." }, { "Map tiles: microSD", "Tuiles : microSD" }, @@ -3568,12 +3257,10 @@ static const I18nPair kBuiltin_fr[] = { { "Mark as read", "Marquer comme lu" }, { "Mark read", "Marquer comme lu" }, { "Marked read", "Marqué comme lu" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Sauts max (0..64)" }, { "Max zoom for this pack", "Zoom max pour ce pack" }, { "Memory detail", "Détail mémoire" }, { "Mesh health: a flood advert is rebroadcast by every repeater in range, so frequent floods add airtime for the whole network. Keep them infrequent (a day or more). Your neighbours still see you from zero-hop adverts and your message replies, so flood mainly when distant nodes need to rediscover you. Leave both Off to advertise only when you tap the buttons above.", "Santé du mesh : un advert flood est réémis par chaque répéteur à portée, donc les floods fréquents ajoutent du temps d'antenne pour tout le réseau. Gardez-les rares (un jour ou plus). Vos voisins vous voient encore via les adverts zero-hop et vos réponses, alors floodez surtout quand des nœuds lointains doivent vous redécouvrir. Laissez les deux désactivés pour n'adverter qu'en touchant les boutons ci-dessus." }, - { "Message", "Message" }, { "Message LED", "LED de message" }, { "Message LED off", "LED de message éteint" }, { "Message LED on", "LED de message allumé" }, @@ -3584,7 +3271,6 @@ static const I18nPair kBuiltin_fr[] = { { "Min zoom for this pack", "Zoom min pour ce pack" }, { "Mode: BLE starting / low memory", "Mode : BLE démarre / mémoire faible" }, { "Model:", "Modèle :" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Multi-ACK" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Multi-ack %s · Répéter %s · RX boost %s" }, { "Multi-byte routing (path hash)", "Routage multi-octet (hash de chemin)" }, @@ -3601,7 +3287,6 @@ static const I18nPair kBuiltin_fr[] = { { "Nearby on map", "À proximité sur la carte" }, { "Network name", "Nom du réseau" }, { "Network name (SSID)", "Nom du réseau (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Nouveau" }, { "New DM", "Nouveau MP" }, { "New channel msg", "Nouveau msg de canal" }, @@ -3620,7 +3305,6 @@ static const I18nPair kBuiltin_fr[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "Aucun JPEG dans /lock/.\nAjoutez des images via le\ngestionnaire ou une carte SD." }, { "No SD card", "Pas de carte SD" }, { "No SD card (or unreadable format)", "Pas de carte SD (ou format illisible)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Aucune sauvegarde. Touchez Nouvelle sauvegarde ci-dessus pour en créer une." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Pas encore d'historique de batterie.\n\nEnregistré toutes les 5 minutes." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Aucun utilisateur bloqué.\n\nAppui long sur un message puis\ntouchez Bloquer pour en ajouter un." }, @@ -3638,10 +3322,8 @@ static const I18nPair kBuiltin_fr[] = { { "No onboard GPS", "Pas de GPS intégré" }, { "No other networks found", "Aucun autre réseau trouvé" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Pas encore de position. Un démarrage à froid demande un ciel dégagé et peut prendre plusieurs minutes." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Pas de réponse de %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Pas de réponse. Vérifiez mot de passe, serveur\nou horloge de l'appareil (appareil : %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Aucune tuile enregistrée ici.\n\nConnectez-vous au Wi-Fi (Réglages → Wi-Fi)\npour télécharger cette zone.\nLes tuiles enregistrées restent hors ligne." }, { "No system time yet", "Pas encore d'heure système" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Aucune télémétrie dans cette fenêtre.\nDemandez-en une ou élargissez la plage ci-dessous." }, @@ -3653,7 +3335,6 @@ static const I18nPair kBuiltin_fr[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Mémoire insuffisante pour le Bluetooth. Désactivez d'abord le Wi-Fi." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Mémoire insuffisante pour le Wi-Fi. Désactivez d'abord le Bluetooth." }, { "Not enough free memory to fetch it. Reboot and try again.", "Mémoire libre insuffisante pour le récupérer. Redémarrez et réessayez." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Rien de sélectionné" }, { "Notification sound set", "Son de notification défini" }, { "Notify on new contact", "Notifier pour un nouveau contact" }, @@ -3697,9 +3378,7 @@ static const I18nPair kBuiltin_fr[] = { { "Path reset failed", "Échec de réinit. du chemin" }, { "Paused — score %d", "En pause — score %d" }, { "Per-transmit switching on", "Bascule par émission activée" }, - { "Perf:", "Perf:" }, { "Pick colour", "Choisir la couleur" }, - { "Ping", "Ping" }, { "Ping failed", "Échec du ping" }, { "Pinged (direct) — waiting…", "Ping (direct) — attente…" }, { "Pinged (flood) — waiting…", "Ping (flood) — attente…" }, @@ -3707,14 +3386,11 @@ static const I18nPair kBuiltin_fr[] = { { "Poll (min)", "Interrogation (min)" }, { "Poll every", "Interroger toutes les" }, { "Poll every %d min", "Interroger toutes les %d min" }, - { "Port", "Port" }, { "Portrait set - applies when remote mode starts.", "Portrait défini - s'applique au démarrage du mode distant." }, { "Position saved", "Position enregistrée" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Alimentation" }, { "Power off", "Éteindre" }, { "Powering off… click trackball to wake", "Extinction… cliquez la boule pour réveiller" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Appuyez sur une touche…" }, { "Probe now", "Sonder maintenant" }, { "Probing neighbours…", "Sondage des voisins…" }, @@ -3729,7 +3405,6 @@ static const I18nPair kBuiltin_fr[] = { { "Purge all discovered nodes?", "Purger tous les nœuds découverts ?" }, { "Quick replies", "Réponses rapides" }, { "Quick reply", "Réponse rapide" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d entrées · Raw %d entrées" }, { "RX boosted gain", "Gain RX boosté" }, { "RX log", "Journal RX" }, @@ -3743,9 +3418,6 @@ static const I18nPair kBuiltin_fr[] = { { "RangeTest sent (direct)", "RangeTest envoyé (direct)" }, { "RangeTest sent (flood)", "RangeTest envoyé (flood)" }, { "Raw log", "Journal brut" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Lit les paquets en tâche de fond pour qu'un écran occupé ne les perde pas." }, { "Reboot", "Redémarrer" }, { "Reboot device", "Redémarrer l'appareil" }, @@ -3753,10 +3425,8 @@ static const I18nPair kBuiltin_fr[] = { { "Rebooting…", "Redémarrage…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Recevoir un firmware de test non publié — fonctions plus récentes, mais moins testées. La vérification et l'installation suivent le canal bêta." }, { "Recently heard", "Entendu récemment" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Reformater la SD en MESHCOMOD (FAT32) ?\nTOUTES les données de la carte seront effacées." }, { "Region & scope", "Région et portée" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Portée régionale (#tag) pour ce canal.\nVide = portée par défaut." }, { "Region scope (#tag), blank = default.", "Portée de région (#tag), vide = défaut." }, { "Region scope (#tag, blank = none)", "Portée régionale (#tag, vide = aucune)" }, @@ -3795,16 +3465,12 @@ static const I18nPair kBuiltin_fr[] = { { "SD card %s", "Carte SD %s" }, { "SD card %s (hold: format)", "Carte SD %s (maintenir : formater)" }, { "SD card (tap to mount)", "Carte SD (toucher pour monter)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "Carte SD insérée" }, { "SD card lost - reinsert to recover", "Carte SD perdue - réinsérez-la" }, { "SD card remounted", "Carte SD remontée" }, { "SD card removed", "Carte SD retirée" }, { "SD download failed: %s", "Échec du téléchargement SD : %s" }, { "SD formatted - %s (MESHCOMOD)", "SD formatée - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u Ko utilisés" }, { "SSID set — enter password, then Save", "SSID défini — saisissez le mot de passe, puis Enregistrer" }, { "SSID too long", "SSID trop long" }, @@ -3829,8 +3495,6 @@ static const I18nPair kBuiltin_fr[] = { { "Saved — rebooting", "Enregistré — redémarrage" }, { "Saved — reconnecting…", "Enregistré — reconnexion…" }, { "Saved: %s\nFlash it from the Launcher.", "Enregistré : %s\nFlashez-le depuis le Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Enregistrement sur SD… %d%%" }, { "Saving to SD… 0%", "Enregistrement sur SD… 0%" }, { "Scan to open on phone", "Scannez pour ouvrir sur le téléphone" }, @@ -3861,14 +3525,10 @@ static const I18nPair kBuiltin_fr[] = { { "Send advert now", "Envoyer l'annonce" }, { "Send an advert now, or set how often you re-advertise.", "Envoyer un advert maintenant, ou définir la fréquence de ré-advert." }, { "Send failed", "Échec de l'envoi" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Expéditeur bloqué" }, { "Sensors tab: off (restart to apply)", "Onglet capteurs : désactivé (redémarrez pour appliquer)" }, { "Sensors tab: on (restart to apply)", "Onglet capteurs : activé (redémarrez pour appliquer)" }, { "Sent", "Envoyé" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Définir" }, { "Set an SSID first", "Définissez d'abord un SSID" }, { "Set as notification sound", "Définir comme son de notification" }, @@ -3879,8 +3539,6 @@ static const I18nPair kBuiltin_fr[] = { { "Share QR", "Partager le QR" }, { "Share channel", "Partager le canal" }, { "Share location in advert", "Partager la position dans l'annonce" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Partager le secret" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Partagez le secret de 32 caractères pour que d'autres rejoignent. Laissez vide pour un aléatoire." }, { "Share: %s", "Partager : %s" }, @@ -3899,7 +3557,6 @@ static const I18nPair kBuiltin_fr[] = { { "Slot %d cleared", "Emplacement %d effacé" }, { "Slot empty", "Emplacement vide" }, { "Small\nMedium\nLarge", "Petit\nMoyen\nGrand" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — glissez ou roulez le trackball" }, { "Sort", "Trier" }, { "Sound", "Son" }, @@ -3913,7 +3570,6 @@ static const I18nPair kBuiltin_fr[] = { { "Step 3 of 3", "Étape 3 sur 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Analyse du chemin précédent\nen cours… réessayez bientôt." }, { "Stop", "Arrêter" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Stockage" }, { "Store", "Boutique" }, { "Store data on SD (reboot)", "Stocker les données sur SD (redémarrage)" }, @@ -3926,8 +3582,6 @@ static const I18nPair kBuiltin_fr[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nClients WS %d GPS %s Buzzer %s" }, { "TCP off", "TCP désactivé" }, { "TCP on", "TCP activé" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Raccourcis onglet — touchez une ligne, puis une touche" }, { "Tap Use to switch - the device reboots to apply.", "Touchez Utiliser pour changer – l'appareil redémarre pour appliquer." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Touchez Utiliser pour changer - l'appareil redémarre. Les fichiers de langue sont dans /lang sur le stockage ; modifiez-les ou ajoutez les vôtres." }, @@ -4005,22 +3659,16 @@ static const I18nPair kBuiltin_fr[] = { { "Updated - rebooting…", "Mis à jour - redémarrage…" }, { "Use", "Utiliser" }, { "Username (optional)", "Nom d'utilisateur (facultatif)" }, - { "Volume", "Volume" }, { "W up · A left · D right · Z down · S select · Q back", "W haut · A gauche · D droite · Z bas · S choisir · Q retour" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "En attente du Wi-Fi..." }, { "Welcome to WADAMESH", "Bienvenue sur WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Tant que c'est activé, quiconque sur votre Wi-Fi peut voir et contrôler cet appareil. Utilise du HTTP simple (réseau local uniquement)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi et Bluetooth" }, { "Wi-Fi is not enabled in this build.", "Le Wi-Fi n'est pas activé dans ce build." }, { "Wi-Fi isn't available on this build.", "Le Wi-Fi n'est pas disponible sur ce build." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Wi-Fi requis pour le profil\nde terrain de ce chemin.\nConnectez dans Paramètres → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi non connecté" }, { "Wi-Fi off", "Wi-Fi désactivé" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi activé" }, { "Wi-Fi on, scanning…", "Wi-Fi activé, recherche…" }, { "Wi-Fi saved (radio off)", "Wi-Fi enregistré (radio off)" }, @@ -4033,7 +3681,6 @@ static const I18nPair kBuiltin_fr[] = { { "Zero-hop", "Zéro saut" }, { "Zero-hop advert sent", "Annonce zero-hop envoyée" }, { "Zoom: +/- buttons", "Zoom : boutons +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "client connecté" }, { "command", "commande" }, { "contacts (%d):", "contacts (%d) :" }, @@ -4047,7 +3694,6 @@ static const I18nPair kBuiltin_fr[] = { { "hold Backspace to unlock", "maintenez Retour pour déverrouiller" }, { "hold the d-pad to unlock", "maintenez le d-pad pour déverrouiller" }, { "hold the trackball to unlock", "maintenez la boule pour déverrouiller" }, - { "kHz", "kHz" }, { "keep holding", "maintenez" }, { "last wake: ", "dernier réveil : " }, { "leave empty to generate", "laisser vide pour générer" }, @@ -4057,7 +3703,6 @@ static const I18nPair kBuiltin_fr[] = { { "min (0=off)", "min (0=désactivé)" }, { "mkdir failed", "Échec de création du dossier" }, { "n/a in this build", "n/d dans ce build" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "maintenant sur le canal %s" }, { "now talking to %s", "conversation avec %s" }, { "off", "désactivé" }, @@ -4067,53 +3712,36 @@ static const I18nPair kBuiltin_fr[] = { { "pick accented letters as you type; off = plain typing", "choisir les lettres accentuées en tapant ; désactivé = saisie simple" }, { "press Volume Down to unlock", "appuyez sur Volume Bas pour déverrouiller" }, { "push past a screen edge to scroll content", "poussez au-delà du bord pour faire défiler" }, - { "score %d", "score %d" }, { "search", "rechercher" }, { "tap for details", "touchez pour les détails" }, { "tap the language key (e.g. EN) on the keyboard to cycle the ones you enable", "touchez la touche de langue (ex. EN) du clavier pour parcourir les activées" }, { "tap to cancel", "toucher pour annuler" }, { "tap to exit full screen", "toucher pour quitter le plein écran" }, - { "zoom", "zoom" }, - { "zoom %d", "zoom %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "ampli ~17 dB pour zones calmes/isolées ; désactiver en zone bruyante." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_es[] = { { " (device behind)", " (dispositivo atrasado)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d puntos de cobertura · %lu guardados en SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: esperando fijación GPS…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d en el mapa" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d cerca (%d rpt, %d comp)" }, { "%u types · hops %u · manual %s", "%u tipos · saltos %u · manual %s" }, { "(RTC unset)", "(RTC sin ajustar)" }, { "(device behind)", "(dispositivo atrasado)" }, { "(no default)", "(sin predeterminado)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 byte (heredado)\n2 bytes\n3 bytes" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nSin límite" }, { "12-hour clock", "Reloj de 12 horas" }, { "32 hex characters", "32 caracteres hex" }, { "32-hex secret. Anyone with this can read the channel.", "Secreto de 32 hex. Cualquiera con esto puede leer el canal." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Menciones" }, { "@ mention sound", "Sonido de menciones @" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "ADVERTS AUTOMÁTICOS" }, { "About", "Acerca de" }, { "About the map", "Acerca del mapa" }, { "Accent popups", "Ventanas de acentos" }, { "Accent popups: off", "Ventanas de acentos: desactivado" }, { "Accent popups: on", "Ventanas de acentos: activado" }, - { "Ack", "Ack" }, { "Active", "Activo" }, { "Add", "Añadir" }, { "Add channel", "Añadir canal" }, @@ -4121,15 +3749,12 @@ static const I18nPair kBuiltin_es[] = { { "Added", "Añadido" }, { "Added to contacts", "Añadido a contactos" }, { "Added to favorites", "Añadido a favoritos" }, - { "Admin", "Admin" }, { "Advert", "Anuncio" }, { "Advert failed", "Error en el anuncio" }, { "Advert location", "Ubicación del anuncio" }, { "Advert policy saved", "Política de anuncio guardada" }, { "Advert sent", "Anuncio enviado" }, - { "All", "All" }, { "All marked read", "Todo marcado como leído" }, - { "Allow", "Allow" }, { "Already exists", "Ya existe" }, { "Already exists or table full.", "Ya existe o tabla llena." }, { "Already in contacts", "Ya está en contactos" }, @@ -4140,13 +3765,10 @@ static const I18nPair kBuiltin_es[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Cualquiera puede unirse. La clave deriva del hashtag (minúsculas)." }, { "App drawer as home", "Cajón de apps como inicio" }, { "App icon size", "Tamaño de iconos de app" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Se aplica tras reiniciar." }, { "Apply", "Aplicar" }, { "Apply auto-poll", "Aplicar auto-poll" }, { "Apply radio params", "Aplicar parámetros de radio" }, - { "Apps", "Apps" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Flechas + Enter siempre funcionan. Estas letras son extra: toca una fila y pulsa una tecla." }, { "Auto advert", "Anuncio automático" }, { "Auto chat", "Chat auto" }, @@ -4169,14 +3791,12 @@ static const I18nPair kBuiltin_es[] = { { "Available", "Disponibles" }, { "BLE off", "BLE apagado" }, { "BLE on", "BLE activado" }, - { "BT", "BT" }, { "Back", "Atrás" }, { "Backups", "Copias" }, { "Battery", "Batería" }, { "Battery & power history", "Historial de batería y energía" }, { "Battery (V)", "Batería (V)" }, { "Battery calibration reset to default", "Calibración de batería restablecida" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Lectura de batería muy baja — carga primero" }, { "Battery saver (experimental)", "Ahorro de batería (experimental)" }, { "Battery — last 24h", "Batería — últimas 24h" }, @@ -4189,7 +3809,6 @@ static const I18nPair kBuiltin_es[] = { { "Blocking unsupported", "Bloqueo no compatible" }, { "Blue battery Last 6 min", "Azul batería Últimos 6 min" }, { "Blue battery Orange temp Cyan humidity", "Azul batería Naranja temp. Cian humedad" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth ya apagado" }, { "Bluetooth already on", "Bluetooth ya activado" }, { "Bluetooth off", "Bluetooth apagado" }, @@ -4199,7 +3818,6 @@ static const I18nPair kBuiltin_es[] = { { "Buffered receive (experimental)", "Recepción con búfer (experimental)" }, { "Built-in", "Integrado" }, { "Built-in (default)", "Integrado (predeterminado)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Calibrar batería (lleno = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Calibrado: 100%% = %u.%02u V (mantén para restablecer)" }, { "Can't block — not a contact", "No se puede bloquear — no es un contacto" }, @@ -4270,7 +3888,6 @@ static const I18nPair kBuiltin_es[] = { { "Contacts are saved to the SD card.", "Los contactos se guardan en la tarjeta SD." }, { "Contacts full", "Contactos llenos" }, { "Contacts:", "Contactos:" }, - { "Control", "Control" }, { "Control this device from a browser", "Controla este dispositivo desde un navegador" }, { "Copied %s", "%s copiado" }, { "Copied - Paste in a folder", "Copiado - pega en una carpeta" }, @@ -4296,7 +3913,6 @@ static const I18nPair kBuiltin_es[] = { { "Cut", "Cortar" }, { "Cut - Paste in a folder", "Cortado - pega en una carpeta" }, { "DM sound", "Sonido de DM" }, - { "DND", "DND" }, { "Danger zone", "Zona de peligro" }, { "Data -> SD card on reboot\n(card must be inserted)", "Datos -> tarjeta SD al reiniciar\n(tarjeta requerida)" }, { "Data -> internal on reboot", "Datos -> interno al reiniciar" }, @@ -4353,7 +3969,6 @@ static const I18nPair kBuiltin_es[] = { { "Enter SSID first", "Introduce primero el SSID" }, { "Enter a name", "Introduce un nombre" }, { "Enter a network name", "Introduce un nombre de red" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Enter añade una línea" }, { "Enter exactly 32 hex characters.", "Introduce exactamente 32 caracteres hex." }, { "Enter key sends message", "La tecla Enter envía el mensaje" }, @@ -4365,7 +3980,6 @@ static const I18nPair kBuiltin_es[] = { { "Erasing everything…", "Borrando todo…" }, { "Every node you talk to must match. You can change this later in Settings.", "Cada nodo debe coincidir. Puedes cambiarlo luego en Ajustes." }, { "Expansion Kit", "Kit de expansión" }, - { "Experimental", "Experimental" }, { "Experimental - has known issues. Off = soft mouse cursor.", "Experimental - tiene problemas conocidos. Off = cursor de ratón suave." }, { "Experimental saved", "Experimental guardado" }, { "Export failed (can't open file)", "Error de exportación (no se abre el archivo)" }, @@ -4383,7 +3997,6 @@ static const I18nPair kBuiltin_es[] = { { "Find", "Buscar" }, { "Finish", "Finalizar" }, { "Firmware beta_%d\nCouldn't reach the update server", "Firmware beta_%d\nNo se pudo contactar el servidor" }, - { "Firmware:", "Firmware:" }, { "Flash on new message", "Parpadear con mensaje nuevo" }, { "Flood", "Difusión" }, { "Flood advert sent", "Anuncio flood enviado" }, @@ -4397,7 +4010,6 @@ static const I18nPair kBuiltin_es[] = { { "Format failed (no card / SD error)", "Error de formato (sin tarjeta / error SD)" }, { "Frequency / bandwidth", "Frecuencia / ancho de banda" }, { "Full", "Lleno" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Zumbador %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Zumbador %s\n%s" }, { "GPS off", "GPS apagado" }, @@ -4431,7 +4043,6 @@ static const I18nPair kBuiltin_es[] = { { "Idle power-save", "Ahorro de energía en reposo" }, { "Idle sleep disabled", "Suspensión en reposo desactivada" }, { "Idle sleep enabled", "Suspensión en reposo activada" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Imagen demasiado grande (>4 MB)" }, { "Import", "Importar" }, { "Import backup", "Importar copia de seguridad" }, @@ -4441,7 +4052,6 @@ static const I18nPair kBuiltin_es[] = { { "Import: storage unavailable", "Importar: almacenamiento no disponible" }, { "Importing settings…", "Importando ajustes…" }, { "Inactive", "Inactivo" }, - { "Info", "Info" }, { "Insert emoji / symbol", "Insertar emoji / símbolo" }, { "Install", "Instalar" }, { "Install a previous version", "Instalar una versión anterior" }, @@ -4463,7 +4073,6 @@ static const I18nPair kBuiltin_es[] = { { "Join network", "Unirse a la red" }, { "Join private channel", "Unirse a canal privado" }, { "Join the public channel", "Unirse al canal público" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Unido a %.40s" }, { "Keep per chat (messages)", "Conservar por chat (mensajes)" }, { "Key already in use", "Clave ya en uso" }, @@ -4475,7 +4084,6 @@ static const I18nPair kBuiltin_es[] = { { "Keyboard nav: WASDZ on", "Nav. teclado: WASDZ act." }, { "Keyboard nav: off", "Nav. teclado: desact." }, { "Keyboard navigation", "Navegación por teclado" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Línea de vista → %s" }, { "Landscape (desktop)", "Horizontal (escritorio)" }, { "Landscape set - applies when remote mode starts.", "Horizontal fijado - se aplica al iniciar el modo remoto." }, @@ -4496,11 +4104,6 @@ static const I18nPair kBuiltin_es[] = { { "Loading...", "Cargando..." }, { "Local every", "Local cada" }, { "Local sensors", "Sensores locales" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Bloquear" }, { "Lock screen", "Pantalla de bloqueo" }, { "Lock screen wallpaper", "Fondo de pantalla de bloqueo" }, @@ -4523,12 +4126,9 @@ static const I18nPair kBuiltin_es[] = { { "Logs", "Registros" }, { "Longitude", "Longitud" }, { "Lua Store", "Tienda Lua" }, - { "MHz", "MHz" }, { "MQTT bridge", "Puente MQTT" }, { "Map", "Mapa" }, { "Map options", "Opciones de mapa" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Error de almacenamiento del mapa.\n\nTarjeta SD detectada pero la\ncaché de teselas no se montó.\nReinicia para reintentar." }, { "Map storage error.\nReflash the tiles partition.", "Error de almacenamiento del mapa.\nReinstala la partición de teselas." }, { "Map tiles: microSD", "Teselas: microSD" }, @@ -4540,7 +4140,6 @@ static const I18nPair kBuiltin_es[] = { { "Mark as read", "Marcar como leído" }, { "Mark read", "Marcar como leído" }, { "Marked read", "Marcado como leído" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Saltos máx (0..64)" }, { "Max zoom for this pack", "Zoom máx para este paquete" }, { "Memory detail", "Detalle de memoria" }, @@ -4556,7 +4155,6 @@ static const I18nPair kBuiltin_es[] = { { "Min zoom for this pack", "Zoom mín para este paquete" }, { "Mode: BLE starting / low memory", "Modo: BLE iniciando / poca memoria" }, { "Model:", "Modelo:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Multi-ACK" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Multi-ack %s · Repetir %s · RX boost %s" }, { "Multi-byte routing (path hash)", "Enrutamiento multibyte (hash de ruta)" }, @@ -4573,7 +4171,6 @@ static const I18nPair kBuiltin_es[] = { { "Nearby on map", "Cerca en el mapa" }, { "Network name", "Nombre de red" }, { "Network name (SSID)", "Nombre de red (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Nuevo" }, { "New DM", "Nuevo MD" }, { "New channel msg", "Nuevo msj de canal" }, @@ -4592,7 +4189,6 @@ static const I18nPair kBuiltin_es[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "No hay JPEG en /lock/.\nAñade imágenes con el gestor\nde archivos o una tarjeta SD." }, { "No SD card", "Sin tarjeta SD" }, { "No SD card (or unreadable format)", "Sin tarjeta SD (o formato ilegible)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Sin copias aún. Toca Nueva copia arriba para crear una." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Aún no hay historial de batería.\n\nRegistrado cada 5 minutos." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Sin usuarios bloqueados.\n\nMantén pulsado un mensaje y toca\nBloquear para añadir uno." }, @@ -4610,10 +4206,8 @@ static const I18nPair kBuiltin_es[] = { { "No onboard GPS", "Sin GPS integrado" }, { "No other networks found", "No se encontraron otras redes" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Aún sin posición. Un arranque en frío necesita cielo despejado y puede tardar varios minutos." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Sin respuesta de %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Sin respuesta. Revisa contraseña, servidor\no reloj del dispositivo (dispositivo: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "No hay teselas guardadas aquí.\n\nConéctate a Wi-Fi (Ajustes → Wi-Fi)\npara descargar esta zona.\nLas teselas guardadas quedan disponibles sin conexión." }, { "No system time yet", "Aún no hay hora del sistema" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Sin telemetría en esta ventana.\nSolicita una o amplía el rango abajo." }, @@ -4625,7 +4219,6 @@ static const I18nPair kBuiltin_es[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "No hay memoria suficiente para Bluetooth. Desactiva primero el Wi-Fi." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "No hay memoria suficiente para Wi-Fi. Desactiva primero el Bluetooth." }, { "Not enough free memory to fetch it. Reboot and try again.", "No hay suficiente memoria libre para descargarlo. Reinicia e inténtalo de nuevo." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Nada seleccionado" }, { "Notification sound set", "Sonido de notificación establecido" }, { "Notify on new contact", "Avisar con nuevo contacto" }, @@ -4669,9 +4262,7 @@ static const I18nPair kBuiltin_es[] = { { "Path reset failed", "Error al restablecer ruta" }, { "Paused — score %d", "En pausa — puntuación %d" }, { "Per-transmit switching on", "Conmutación por transmisión activada" }, - { "Perf:", "Perf:" }, { "Pick colour", "Elegir color" }, - { "Ping", "Ping" }, { "Ping failed", "Error de ping" }, { "Pinged (direct) — waiting…", "Ping (directo) — esperando…" }, { "Pinged (flood) — waiting…", "Ping (flood) — esperando…" }, @@ -4682,11 +4273,9 @@ static const I18nPair kBuiltin_es[] = { { "Port", "Puerto" }, { "Portrait set - applies when remote mode starts.", "Vertical fijado - se aplica al iniciar el modo remoto." }, { "Position saved", "Posición guardada" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Energía" }, { "Power off", "Apagar" }, { "Powering off… click trackball to wake", "Apagando… pulsa el trackball para despertar" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Pulsa una tecla…" }, { "Probe now", "Sondear ahora" }, { "Probing neighbours…", "Sondeando vecinos…" }, @@ -4701,7 +4290,6 @@ static const I18nPair kBuiltin_es[] = { { "Purge all discovered nodes?", "¿Purgar todos los nodos descubiertos?" }, { "Quick replies", "Respuestas rápidas" }, { "Quick reply", "Respuesta rápida" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d entradas · Raw %d entradas" }, { "RX boosted gain", "Ganancia RX aumentada" }, { "RX log", "Registro RX" }, @@ -4715,9 +4303,6 @@ static const I18nPair kBuiltin_es[] = { { "RangeTest sent (direct)", "RangeTest enviado (directo)" }, { "RangeTest sent (flood)", "RangeTest enviado (flood)" }, { "Raw log", "Registro sin procesar" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Lee paquetes en una tarea en segundo plano para que una pantalla ocupada no los pierda." }, { "Reboot", "Reiniciar" }, { "Reboot device", "Reiniciar dispositivo" }, @@ -4725,10 +4310,8 @@ static const I18nPair kBuiltin_es[] = { { "Rebooting…", "Reiniciando…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Recibe firmware de prueba no publicado — funciones más nuevas, pero menos probadas. La comprobación y la instalación siguen el canal beta." }, { "Recently heard", "Escuchado hace poco" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "¿Reformatear la SD como MESHCOMOD (FAT32)?\nSe borrarán TODOS los datos de la tarjeta." }, { "Region & scope", "Región y alcance" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Alcance de región (#tag) para este canal.\nVacío = alcance predeterminado." }, { "Region scope (#tag), blank = default.", "Ámbito de región (#tag), vacío = predeterminado." }, { "Region scope (#tag, blank = none)", "Alcance de región (#tag, vacío = ninguno)" }, @@ -4767,16 +4350,12 @@ static const I18nPair kBuiltin_es[] = { { "SD card %s", "Tarjeta SD %s" }, { "SD card %s (hold: format)", "Tarjeta SD %s (mantener: formatear)" }, { "SD card (tap to mount)", "Tarjeta SD (toca para montar)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "Tarjeta SD insertada" }, { "SD card lost - reinsert to recover", "Tarjeta SD perdida - reinsértala" }, { "SD card remounted", "Tarjeta SD remontada" }, { "SD card removed", "Tarjeta SD retirada" }, { "SD download failed: %s", "Fallo al descargar en SD: %s" }, { "SD formatted - %s (MESHCOMOD)", "SD formateada - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB usados" }, { "SSID set — enter password, then Save", "SSID establecido — escribe la contraseña y Guardar" }, { "SSID too long", "SSID demasiado largo" }, @@ -4801,8 +4380,6 @@ static const I18nPair kBuiltin_es[] = { { "Saved — rebooting", "Guardado — reiniciando" }, { "Saved — reconnecting…", "Guardado — reconectando…" }, { "Saved: %s\nFlash it from the Launcher.", "Guardado: %s\nFlashéalo desde el Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Guardando en SD… %d%%" }, { "Saving to SD… 0%", "Guardando en SD… 0%" }, { "Scan to open on phone", "Escanea para abrir en el móvil" }, @@ -4833,14 +4410,10 @@ static const I18nPair kBuiltin_es[] = { { "Send advert now", "Enviar anuncio ahora" }, { "Send an advert now, or set how often you re-advertise.", "Envía un advert ahora, o define con qué frecuencia re-adviertes." }, { "Send failed", "Error al enviar" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Remitente bloqueado" }, { "Sensors tab: off (restart to apply)", "Pestaña sensores: desactivada (reinicia para aplicar)" }, { "Sensors tab: on (restart to apply)", "Pestaña sensores: activada (reinicia para aplicar)" }, { "Sent", "Enviado" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Fijar" }, { "Set an SSID first", "Establece primero un SSID" }, { "Set as notification sound", "Establecer como sonido de notificación" }, @@ -4851,8 +4424,6 @@ static const I18nPair kBuiltin_es[] = { { "Share QR", "Compartir QR" }, { "Share channel", "Compartir canal" }, { "Share location in advert", "Compartir ubicación en anuncio" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Compartir secreto" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Comparte el secreto de 32 caracteres para que otros se unan. Déjalo vacío para uno aleatorio." }, { "Share: %s", "Compartir: %s" }, @@ -4871,7 +4442,6 @@ static const I18nPair kBuiltin_es[] = { { "Slot %d cleared", "Ranura %d borrada" }, { "Slot empty", "Ranura vacía" }, { "Small\nMedium\nLarge", "Pequeño\nMediano\nGrande" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — desliza o gira el trackball" }, { "Sort", "Ordenar" }, { "Sound", "Sonido" }, @@ -4885,7 +4455,6 @@ static const I18nPair kBuiltin_es[] = { { "Step 3 of 3", "Paso 3 de 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Aún analizando la ruta\nanterior… reinténtalo en un momento." }, { "Stop", "Detener" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Almacenamiento" }, { "Store", "Tienda" }, { "Store data on SD (reboot)", "Guardar datos en SD (reinicio)" }, @@ -4898,8 +4467,6 @@ static const I18nPair kBuiltin_es[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nClientes WS %d GPS %s Zumbador %s" }, { "TCP off", "TCP apagado" }, { "TCP on", "TCP activado" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Atajos de pestaña — toca una fila, luego una tecla" }, { "Tap Use to switch - the device reboots to apply.", "Toca Usar para cambiar: el dispositivo se reinicia para aplicarlo." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Toca Usar para cambiar - el dispositivo se reinicia. Los archivos de idioma están en /lang del almacenamiento; edítalos o añade el tuyo." }, @@ -4943,7 +4510,6 @@ static const I18nPair kBuiltin_es[] = { { "Trace sent…", "Rastreo enviado…" }, { "Tracing route…", "Rastreando ruta…" }, { "Trackball navigates UI", "Trackball navega la UI" }, - { "Trackball: cursor", "Trackball: cursor" }, { "Trackball: navigate UI", "Trackball: navegar UI" }, { "Turn Wi-Fi on first", "Activa primero el Wi-Fi" }, { "Turn Wi-Fi on, then tap refresh. Apps already installed still work.", "Activa el Wi-Fi y actualiza. Las apps ya instaladas siguen funcionando." }, @@ -4979,20 +4545,15 @@ static const I18nPair kBuiltin_es[] = { { "Username (optional)", "Nombre de usuario (opcional)" }, { "Volume", "Volumen" }, { "W up · A left · D right · Z down · S select · Q back", "W arriba · A izq. · D der. · Z abajo · S elegir · Q atrás" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Esperando Wi-Fi..." }, { "Welcome to WADAMESH", "Bienvenido a WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Mientras esté activo, cualquiera en tu Wi-Fi puede ver y controlar este dispositivo. Usa HTTP plano (solo red local)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi y Bluetooth" }, { "Wi-Fi is not enabled in this build.", "Wi-Fi no está habilitado en este build." }, { "Wi-Fi isn't available on this build.", "Wi-Fi no está disponible en este build." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Wi-Fi necesario para el perfil\ndel terreno de esta ruta.\nConéctate en Ajustes → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi no conectado" }, { "Wi-Fi off", "Wi-Fi apagado" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi activado" }, { "Wi-Fi on, scanning…", "Wi-Fi activado, buscando…" }, { "Wi-Fi saved (radio off)", "Wi-Fi guardado (radio off)" }, @@ -5005,7 +4566,6 @@ static const I18nPair kBuiltin_es[] = { { "Zero-hop", "Cero saltos" }, { "Zero-hop advert sent", "Anuncio zero-hop enviado" }, { "Zoom: +/- buttons", "Zoom: botones +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "cliente conectado" }, { "command", "comando" }, { "contacts (%d):", "contactos (%d):" }, @@ -5019,7 +4579,6 @@ static const I18nPair kBuiltin_es[] = { { "hold Backspace to unlock", "mantén Retroceso para desbloquear" }, { "hold the d-pad to unlock", "mantén el d-pad para desbloquear" }, { "hold the trackball to unlock", "mantén el trackball para desbloquear" }, - { "kHz", "kHz" }, { "keep holding", "mantén pulsado" }, { "last wake: ", "último despertar: " }, { "leave empty to generate", "dejar vacío para generar" }, @@ -5029,7 +4588,6 @@ static const I18nPair kBuiltin_es[] = { { "min (0=off)", "min (0=apagado)" }, { "mkdir failed", "Error al crear carpeta" }, { "n/a in this build", "n/d en este build" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "ahora en el canal %s" }, { "now talking to %s", "ahora hablando con %s" }, { "off", "desactivado" }, @@ -5045,47 +4603,31 @@ static const I18nPair kBuiltin_es[] = { { "tap the language key (e.g. EN) on the keyboard to cycle the ones you enable", "toca la tecla de idioma (p. ej. EN) del teclado para recorrer las activadas" }, { "tap to cancel", "toca para cancelar" }, { "tap to exit full screen", "toca para salir de pantalla completa" }, - { "zoom", "zoom" }, - { "zoom %d", "zoom %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "amplificador ~17 dB para zonas tranquilas/remotas; apaga en zonas ruidosas." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_it[] = { { " (device behind)", " (dispositivo indietro)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d punti di copertura · %lu salvati su SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: attesa del fix GPS…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d sulla mappa" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d vicini (%d rpt, %d comp)" }, { "%u types · hops %u · manual %s", "%u tipi · salti %u · manuale %s" }, { "(RTC unset)", "(RTC non impostato)" }, { "(device behind)", "(dispositivo indietro)" }, { "(no default)", "(nessun predefinito)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 byte (legacy)\n2 byte\n3 byte" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nSenza limite" }, { "12-hour clock", "Orologio 12 ore" }, { "32 hex characters", "32 caratteri hex" }, { "32-hex secret. Anyone with this can read the channel.", "Segreto 32 hex. Chiunque lo abbia può leggere il canale." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Menzioni" }, { "@ mention sound", "Suono menzioni @" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "ADVERT AUTOMATICI" }, { "About", "Informazioni" }, { "About the map", "Informazioni sulla mappa" }, { "Accent popups", "Popup accenti" }, { "Accent popups: off", "Popup accenti: disattivi" }, { "Accent popups: on", "Popup accenti: attivi" }, - { "Ack", "Ack" }, { "Active", "Attivo" }, { "Add", "Aggiungi" }, { "Add channel", "Aggiungi canale" }, @@ -5093,15 +4635,11 @@ static const I18nPair kBuiltin_it[] = { { "Added", "Aggiunto" }, { "Added to contacts", "Aggiunto ai contatti" }, { "Added to favorites", "Aggiunto ai preferiti" }, - { "Admin", "Admin" }, - { "Advert", "Advert" }, { "Advert failed", "Advert non riuscito" }, { "Advert location", "Posizione advert" }, { "Advert policy saved", "Criterio advert salvato" }, { "Advert sent", "Advert inviato" }, - { "All", "All" }, { "All marked read", "Tutto segnato come letto" }, - { "Allow", "Allow" }, { "Already exists", "Esiste già" }, { "Already exists or table full.", "Esiste già o tabella piena." }, { "Already in contacts", "Già nei contatti" }, @@ -5112,13 +4650,11 @@ static const I18nPair kBuiltin_it[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Chiunque può unirsi. La chiave deriva dall'hashtag (minuscolo)." }, { "App drawer as home", "Drawer app come home" }, { "App icon size", "Dimensione icone app" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Attivo dopo il riavvio." }, { "Apply", "Applica" }, { "Apply auto-poll", "Applica auto-poll" }, { "Apply radio params", "Applica parametri radio" }, { "Apps", "App" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Frecce + Invio funzionano sempre. Queste lettere sono extra: tocca una riga, poi premi un tasto." }, { "Auto advert", "Annuncio automatico" }, { "Auto chat", "Chat auto" }, @@ -5141,14 +4677,12 @@ static const I18nPair kBuiltin_it[] = { { "Available", "Disponibili" }, { "BLE off", "BLE spento" }, { "BLE on", "BLE acceso" }, - { "BT", "BT" }, { "Back", "Indietro" }, { "Backups", "Backup" }, { "Battery", "Batteria" }, { "Battery & power history", "Cronologia batteria e alimentazione" }, { "Battery (V)", "Batteria (V)" }, { "Battery calibration reset to default", "Calibrazione batteria ripristinata" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Lettura batteria troppo bassa — carica prima" }, { "Battery saver (experimental)", "Risparmio batteria (sperimentale)" }, { "Battery — last 24h", "Batteria — ultime 24h" }, @@ -5161,7 +4695,6 @@ static const I18nPair kBuiltin_it[] = { { "Blocking unsupported", "Blocco non supportato" }, { "Blue battery Last 6 min", "Blu batteria Ultimi 6 min" }, { "Blue battery Orange temp Cyan humidity", "Blu batteria Arancio temp. Ciano umidità" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth già spento" }, { "Bluetooth already on", "Bluetooth già acceso" }, { "Bluetooth off", "Bluetooth spento" }, @@ -5171,7 +4704,6 @@ static const I18nPair kBuiltin_it[] = { { "Buffered receive (experimental)", "Ricezione bufferizzata (sperimentale)" }, { "Built-in", "Integrato" }, { "Built-in (default)", "Integrato (predefinito)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Calibra batteria (pieno = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Calibrato: 100%% = %u.%02u V (tieni premuto per ripristinare)" }, { "Can't block — not a contact", "Impossibile bloccare — non è un contatto" }, @@ -5268,7 +4800,6 @@ static const I18nPair kBuiltin_it[] = { { "Cut", "Taglia" }, { "Cut - Paste in a folder", "Tagliato - incolla in una cartella" }, { "DM sound", "Suono DM" }, - { "DND", "DND" }, { "Danger zone", "Zona pericolosa" }, { "Data -> SD card on reboot\n(card must be inserted)", "Dati -> scheda SD al riavvio\n(scheda richiesta)" }, { "Data -> internal on reboot", "Dati -> interno al riavvio" }, @@ -5325,7 +4856,6 @@ static const I18nPair kBuiltin_it[] = { { "Enter SSID first", "Inserisci prima l'SSID" }, { "Enter a name", "Inserisci un nome" }, { "Enter a network name", "Inserisci un nome di rete" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Invio aggiunge una riga" }, { "Enter exactly 32 hex characters.", "Inserisci esattamente 32 caratteri hex." }, { "Enter key sends message", "Il tasto Invio invia il messaggio" }, @@ -5355,9 +4885,7 @@ static const I18nPair kBuiltin_it[] = { { "Find", "Trova" }, { "Finish", "Fine" }, { "Firmware beta_%d\nCouldn't reach the update server", "Firmware beta_%d\nServer di aggiornamento irraggiungibile" }, - { "Firmware:", "Firmware:" }, { "Flash on new message", "Lampeggia a nuovo messaggio" }, - { "Flood", "Flood" }, { "Flood advert sent", "Advert flood inviato" }, { "Flood every", "Flood ogni" }, { "Flood: relayed across the mesh (multi-hop).\nZero-hop: neighbours only (no relaying).", "Flood: inoltrato sulla mesh (multi-hop).\nZero-hop: solo vicini (nessun inoltro)." }, @@ -5369,7 +4897,6 @@ static const I18nPair kBuiltin_it[] = { { "Format failed (no card / SD error)", "Formattazione non riuscita (nessuna scheda / errore SD)" }, { "Frequency / bandwidth", "Frequenza / larghezza di banda" }, { "Full", "Pieno" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Cicalino %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Cicalino %s\n%s" }, { "GPS off", "GPS spento" }, @@ -5377,7 +4904,6 @@ static const I18nPair kBuiltin_it[] = { { "GPS serial baud", "Baud seriale GPS" }, { "GPS unset", "GPS non impostato" }, { "GPS: acquiring...", "GPS: ricerca..." }, - { "GPS: fix", "GPS: fix" }, { "GPS: off", "GPS: spento" }, { "GPS: searching", "GPS: ricerca" }, { "Game over — score %d (tap to restart)", "Game over — punteggio %d (tocca per ricominciare)" }, @@ -5403,7 +4929,6 @@ static const I18nPair kBuiltin_it[] = { { "Idle power-save", "Risparmio energetico in inattività" }, { "Idle sleep disabled", "Sospensione in inattività disatt." }, { "Idle sleep enabled", "Sospensione in inattività attiva" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Immagine troppo grande (>4 MB)" }, { "Import", "Importa" }, { "Import backup", "Importa backup" }, @@ -5413,7 +4938,6 @@ static const I18nPair kBuiltin_it[] = { { "Import: storage unavailable", "Importa: archiviazione non disponibile" }, { "Importing settings…", "Importazione impostazioni…" }, { "Inactive", "Inattivo" }, - { "Info", "Info" }, { "Insert emoji / symbol", "Inserisci emoji / simbolo" }, { "Install", "Installa" }, { "Install a previous version", "Installa una versione precedente" }, @@ -5435,7 +4959,6 @@ static const I18nPair kBuiltin_it[] = { { "Join network", "Unisciti alla rete" }, { "Join private channel", "Unisciti a canale privato" }, { "Join the public channel", "Unisciti al canale pubblico" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Unito a %.40s" }, { "Keep per chat (messages)", "Da conservare per chat (messaggi)" }, { "Key already in use", "Chiave già in uso" }, @@ -5447,7 +4970,6 @@ static const I18nPair kBuiltin_it[] = { { "Keyboard nav: WASDZ on", "Nav. tastiera: WASDZ on" }, { "Keyboard nav: off", "Nav. tastiera: off" }, { "Keyboard navigation", "Navigazione da tastiera" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Vista diretta → %s" }, { "Landscape (desktop)", "Orizzontale (desktop)" }, { "Landscape set - applies when remote mode starts.", "Orizzontale impostato - vale all'avvio della modalità remota." }, @@ -5468,11 +4990,6 @@ static const I18nPair kBuiltin_it[] = { { "Loading...", "Caricamento..." }, { "Local every", "Locale ogni" }, { "Local sensors", "Sensori locali" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Blocca" }, { "Lock screen", "Schermata di blocco" }, { "Lock screen wallpaper", "Sfondo schermata di blocco" }, @@ -5494,13 +5011,9 @@ static const I18nPair kBuiltin_it[] = { { "Login failed", "Accesso non riuscito" }, { "Logs", "Log" }, { "Longitude", "Longitudine" }, - { "Lua Store", "Lua Store" }, - { "MHz", "MHz" }, { "MQTT bridge", "Ponte MQTT" }, { "Map", "Mappa" }, { "Map options", "Opzioni mappa" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Errore archiviazione mappa.\n\nScheda SD rilevata ma la\ncache riquadri non si è montata.\nRiavvia per riprovare." }, { "Map storage error.\nReflash the tiles partition.", "Errore archiviazione mappa.\nRiflasha la partizione tiles." }, { "Map tiles: microSD", "Riquadri: microSD" }, @@ -5512,7 +5025,6 @@ static const I18nPair kBuiltin_it[] = { { "Mark as read", "Segna come letto" }, { "Mark read", "Segna come letto" }, { "Marked read", "Segnato come letto" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Hop max (0..64)" }, { "Max zoom for this pack", "Zoom max per questo pacchetto" }, { "Memory detail", "Dettaglio memoria" }, @@ -5528,7 +5040,6 @@ static const I18nPair kBuiltin_it[] = { { "Min zoom for this pack", "Zoom min per questo pacchetto" }, { "Mode: BLE starting / low memory", "Modalità: BLE avvio / memoria scarsa" }, { "Model:", "Modello:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Multi-ACK" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Multi-ack %s · Ripeti %s · RX boost %s" }, { "Multi-byte routing (path hash)", "Routing multi-byte (hash percorso)" }, @@ -5545,7 +5056,6 @@ static const I18nPair kBuiltin_it[] = { { "Nearby on map", "Vicino sulla mappa" }, { "Network name", "Nome rete" }, { "Network name (SSID)", "Nome rete (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Nuovo" }, { "New DM", "Nuovo MD" }, { "New channel msg", "Nuovo msg canale" }, @@ -5564,7 +5074,6 @@ static const I18nPair kBuiltin_it[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "Nessun JPEG in /lock/.\nAggiungi immagini dal gestore\nfile o da una scheda SD." }, { "No SD card", "Nessuna scheda SD" }, { "No SD card (or unreadable format)", "Nessuna scheda SD (o formato illeggibile)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Nessun backup. Tocca Nuovo backup sopra per crearne uno." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Ancora nessuno storico batteria.\n\nRegistrato ogni 5 minuti." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Nessun utente bloccato.\n\nTieni premuto un messaggio e tocca\nBlocca per aggiungerne uno." }, @@ -5582,10 +5091,8 @@ static const I18nPair kBuiltin_it[] = { { "No onboard GPS", "Nessun GPS integrato" }, { "No other networks found", "Nessun'altra rete trovata" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Ancora nessuna posizione. Un avvio a freddo richiede cielo libero e può durare diversi minuti." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Nessuna risposta da %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Nessuna risposta. Controlla password, server\no orologio del dispositivo (dispositivo: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Nessuna tessera salvata qui.\n\nConnettiti al Wi-Fi (Impostazioni → Wi-Fi)\nper scaricare quest'area.\nLe tessere salvate restano disponibili offline." }, { "No system time yet", "Ora di sistema non ancora disponibile" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Nessuna telemetria in questa finestra.\nRichiedine una o amplia l'intervallo sotto." }, @@ -5597,7 +5104,6 @@ static const I18nPair kBuiltin_it[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Memoria insufficiente per il Bluetooth. Disattiva prima il Wi-Fi." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Memoria insufficiente per il Wi-Fi. Disattiva prima il Bluetooth." }, { "Not enough free memory to fetch it. Reboot and try again.", "Memoria libera insufficiente per scaricarlo. Riavvia e riprova." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Niente selezionato" }, { "Notification sound set", "Suono di notifica impostato" }, { "Notify on new contact", "Avvisa a nuovo contatto" }, @@ -5605,7 +5111,6 @@ static const I18nPair kBuiltin_it[] = { { "Off\n1\n2\n3\n5\n8", "Spento\n1\n2\n3\n5\n8" }, { "Off\n1 day\n2 days\n3 days\n7 days", "Spento\n1 giorno\n2 giorni\n3 giorni\n7 giorni" }, { "Off\n60 min\n90 min\n2 hours\n3 hours\n4 hours", "Spento\n60 min\n90 min\n2 ore\n3 ore\n4 ore" }, - { "Offline", "Offline" }, { "Older messages in a chat are dropped past this. A very large or unlimited history makes the chat list slower.", "Oltre questo limite i messaggi più vecchi vengono scartati. Una cronologia molto grande o illimitata rallenta l'elenco chat." }, { "On - open the address above in a phone browser.", "Attivo - apri l'indirizzo qui sopra nel browser del telefono." }, { "On boot", "All'avvio" }, @@ -5641,9 +5146,7 @@ static const I18nPair kBuiltin_it[] = { { "Path reset failed", "Reset percorso non riuscito" }, { "Paused — score %d", "In pausa — punteggio %d" }, { "Per-transmit switching on", "Commutazione per trasmissione attiva" }, - { "Perf:", "Perf:" }, { "Pick colour", "Scegli colore" }, - { "Ping", "Ping" }, { "Ping failed", "Ping non riuscito" }, { "Pinged (direct) — waiting…", "Ping (diretto) — attesa…" }, { "Pinged (flood) — waiting…", "Ping (flood) — attesa…" }, @@ -5654,11 +5157,9 @@ static const I18nPair kBuiltin_it[] = { { "Port", "Porta" }, { "Portrait set - applies when remote mode starts.", "Verticale impostato - vale all'avvio della modalità remota." }, { "Position saved", "Posizione salvata" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Alimentazione" }, { "Power off", "Spegni" }, { "Powering off… click trackball to wake", "Spegnimento… clicca la trackball per riattivare" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Premi un tasto…" }, { "Probe now", "Sonda ora" }, { "Probing neighbours…", "Ricerca vicini…" }, @@ -5673,7 +5174,6 @@ static const I18nPair kBuiltin_it[] = { { "Purge all discovered nodes?", "Eliminare tutti i nodi scoperti?" }, { "Quick replies", "Risposte rapide" }, { "Quick reply", "Risposta rapida" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d voci · Raw %d voci" }, { "RX boosted gain", "Guadagno RX potenziato" }, { "RX log", "Log RX" }, @@ -5687,9 +5187,6 @@ static const I18nPair kBuiltin_it[] = { { "RangeTest sent (direct)", "RangeTest inviato (diretto)" }, { "RangeTest sent (flood)", "RangeTest inviato (flood)" }, { "Raw log", "Log grezzo" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Legge i pacchetti in un task in background così uno schermo occupato non li perde." }, { "Reboot", "Riavvia" }, { "Reboot device", "Riavvia dispositivo" }, @@ -5697,10 +5194,8 @@ static const I18nPair kBuiltin_it[] = { { "Rebooting…", "Riavvio…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Ricevi firmware di prova non rilasciato — funzioni più recenti, ma meno testate. Il controllo e l'installazione seguono il canale beta." }, { "Recently heard", "Sentito di recente" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Riformattare la SD come MESHCOMOD (FAT32)?\nTUTTI i dati sulla scheda saranno cancellati." }, { "Region & scope", "Regione e ambito" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Ambito regione (#tag) per questo canale.\nVuoto = ambito predefinito." }, { "Region scope (#tag), blank = default.", "Ambito regione (#tag), vuoto = predefinito." }, { "Region scope (#tag, blank = none)", "Ambito regione (#tag, vuoto = nessuno)" }, @@ -5739,16 +5234,12 @@ static const I18nPair kBuiltin_it[] = { { "SD card %s", "Scheda SD %s" }, { "SD card %s (hold: format)", "Scheda SD %s (tieni: formatta)" }, { "SD card (tap to mount)", "Scheda SD (tocca per montare)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "Scheda SD inserita" }, { "SD card lost - reinsert to recover", "Scheda SD persa - reinserirla" }, { "SD card remounted", "Scheda SD rimontata" }, { "SD card removed", "Scheda SD rimossa" }, { "SD download failed: %s", "Download su SD non riuscito: %s" }, { "SD formatted - %s (MESHCOMOD)", "SD formattata - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB usati" }, { "SSID set — enter password, then Save", "SSID impostato — inserisci la password, poi Salva" }, { "SSID too long", "SSID troppo lungo" }, @@ -5773,8 +5264,6 @@ static const I18nPair kBuiltin_it[] = { { "Saved — rebooting", "Salvato — riavvio" }, { "Saved — reconnecting…", "Salvato — riconnessione…" }, { "Saved: %s\nFlash it from the Launcher.", "Salvato: %s\nFlashalo dal Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Salvataggio su SD… %d%%" }, { "Saving to SD… 0%", "Salvataggio su SD… 0%" }, { "Scan to open on phone", "Scansiona per aprire sul telefono" }, @@ -5805,14 +5294,10 @@ static const I18nPair kBuiltin_it[] = { { "Send advert now", "Invia advert ora" }, { "Send an advert now, or set how often you re-advertise.", "Invia un advert ora, o imposta ogni quanto ripubblicare l'advert." }, { "Send failed", "Invio non riuscito" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Mittente bloccato" }, { "Sensors tab: off (restart to apply)", "Scheda sensori: off (riavvia per applicare)" }, { "Sensors tab: on (restart to apply)", "Scheda sensori: on (riavvia per applicare)" }, { "Sent", "Inviato" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Imposta" }, { "Set an SSID first", "Imposta prima un SSID" }, { "Set as notification sound", "Imposta come suono di notifica" }, @@ -5823,8 +5308,6 @@ static const I18nPair kBuiltin_it[] = { { "Share QR", "Condividi QR" }, { "Share channel", "Condividi canale" }, { "Share location in advert", "Condividi posizione in advert" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Condividi segreto" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Condividi il segreto di 32 caratteri per far unire altri. Lascia vuoto per uno casuale." }, { "Share: %s", "Condividi: %s" }, @@ -5843,7 +5326,6 @@ static const I18nPair kBuiltin_it[] = { { "Slot %d cleared", "Slot %d cancellato" }, { "Slot empty", "Slot vuoto" }, { "Small\nMedium\nLarge", "Piccolo\nMedio\nGrande" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — scorri o gira la trackball" }, { "Sort", "Ordina" }, { "Sound", "Suono" }, @@ -5857,9 +5339,7 @@ static const I18nPair kBuiltin_it[] = { { "Step 3 of 3", "Passo 3 di 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Analisi del percorso precedente\nin corso… riprova tra poco." }, { "Stop", "Ferma" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Archiviazione" }, - { "Store", "Store" }, { "Store data on SD (reboot)", "Salva dati su SD (riavvio)" }, { "Streams the device screen as a live picture you tap to control. Heavier; the panel shows a placeholder. Toggling reboots the device.", "Trasmette lo schermo come immagine dal vivo da toccare per controllare. Più pesante; il pannello mostra un segnaposto. Il cambio riavvia il dispositivo." }, { "Switch", "Cambia" }, @@ -5870,8 +5350,6 @@ static const I18nPair kBuiltin_it[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nClient WS %d GPS %s Cicalino %s" }, { "TCP off", "TCP spento" }, { "TCP on", "TCP acceso" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Tasti scheda — tocca una riga, poi premi un tasto" }, { "Tap Use to switch - the device reboots to apply.", "Tocca Usa per cambiare – il dispositivo si riavvia per applicare." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Tocca Usa per cambiare - il dispositivo si riavvia. I file lingua sono in /lang sulla memoria; modificali o aggiungi i tuoi." }, @@ -5949,22 +5427,16 @@ static const I18nPair kBuiltin_it[] = { { "Updated - rebooting…", "Aggiornato - riavvio…" }, { "Use", "Usa" }, { "Username (optional)", "Nome utente (facoltativo)" }, - { "Volume", "Volume" }, { "W up · A left · D right · Z down · S select · Q back", "W su · A sinistra · D destra · Z giù · S scegli · Q indietro" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "In attesa del Wi-Fi..." }, { "Welcome to WADAMESH", "Benvenuto in WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Finché è attivo, chiunque sulla tua Wi-Fi può vedere e controllare questo dispositivo. Usa HTTP semplice (solo rete locale)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi e Bluetooth" }, { "Wi-Fi is not enabled in this build.", "Il Wi-Fi non è abilitato in questo build." }, { "Wi-Fi isn't available on this build.", "Il Wi-Fi non è disponibile su questo build." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Wi-Fi necessario per il profilo\ndel terreno di questo percorso.\nConnetti in Impostazioni → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi non connesso" }, { "Wi-Fi off", "Wi-Fi spento" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi acceso" }, { "Wi-Fi on, scanning…", "Wi-Fi attivo, scansione…" }, { "Wi-Fi saved (radio off)", "Wi-Fi salvato (radio off)" }, @@ -5977,7 +5449,6 @@ static const I18nPair kBuiltin_it[] = { { "Zero-hop", "Zero hop" }, { "Zero-hop advert sent", "Advert zero-hop inviato" }, { "Zoom: +/- buttons", "Zoom: pulsanti +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "client connesso" }, { "command", "comando" }, { "contacts (%d):", "contatti (%d):" }, @@ -5991,7 +5462,6 @@ static const I18nPair kBuiltin_it[] = { { "hold Backspace to unlock", "tieni premuto Backspace per sbloccare" }, { "hold the d-pad to unlock", "tieni premuto il d-pad per sbloccare" }, { "hold the trackball to unlock", "tieni premuta la trackball per sbloccare" }, - { "kHz", "kHz" }, { "keep holding", "tieni premuto" }, { "last wake: ", "ultimo risveglio: " }, { "leave empty to generate", "lascia vuoto per generare" }, @@ -6001,7 +5471,6 @@ static const I18nPair kBuiltin_it[] = { { "min (0=off)", "min (0=spento)" }, { "mkdir failed", "Creazione cartella non riuscita" }, { "n/a in this build", "n/d in questo build" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "ora sul canale %s" }, { "now talking to %s", "ora in chat con %s" }, { "off", "disattivo" }, @@ -6017,40 +5486,26 @@ static const I18nPair kBuiltin_it[] = { { "tap the language key (e.g. EN) on the keyboard to cycle the ones you enable", "tocca il tasto lingua (es. EN) sulla tastiera per scorrere quelle attive" }, { "tap to cancel", "tocca per annullare" }, { "tap to exit full screen", "tocca per uscire da schermo intero" }, - { "zoom", "zoom" }, - { "zoom %d", "zoom %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "ampli ~17 dB per zone tranquille/remote; spegni in zone rumorose." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_ru[] = { { " (device behind)", " (устройство отстаёт)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d точек покрытия · %lu записано на SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: ожидание GPS…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, { "%.3f MHz · SF%u · TX %+ddBm", "%.3f МГц · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d на карте" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d рядом (%d ретр, %d комп)" }, { "%u types · hops %u · manual %s", "%u типов · хопы %u · вручную %s" }, { "(RTC unset)", "(RTC не задан)" }, { "(device behind)", "(устройство отстаёт)" }, { "(no default)", "(нет по умолчанию)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 байт (устар.)\n2 байта\n3 байта" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nБез лимита" }, { "12-hour clock", "12-часовой формат" }, { "32 hex characters", "32 hex-символа" }, { "32-hex secret. Anyone with this can read the channel.", "Секрет 32 hex. Любой с ним может читать канал." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Упоминания" }, { "@ mention sound", "Звук @-упоминаний" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "АВТОМАТИЧЕСКИЕ АДВЕРТЫ" }, { "About", "О программе" }, { "About the map", "О карте" }, @@ -6066,14 +5521,11 @@ static const I18nPair kBuiltin_ru[] = { { "Added to contacts", "Добавлено в контакты" }, { "Added to favorites", "Добавлено в избранное" }, { "Admin", "Админ" }, - { "Advert", "Advert" }, { "Advert failed", "Сбой advert" }, { "Advert location", "Местоположение advert" }, { "Advert policy saved", "Политика advert сохранена" }, { "Advert sent", "Advert отправлен" }, - { "All", "All" }, { "All marked read", "Всё прочитано" }, - { "Allow", "Allow" }, { "Already exists", "Уже существует" }, { "Already exists or table full.", "Уже существует или таблица заполнена." }, { "Already in contacts", "Уже в контактах" }, @@ -6084,13 +5536,11 @@ static const I18nPair kBuiltin_ru[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Любой может присоединиться. Ключ из хэштега (нижний регистр)." }, { "App drawer as home", "Меню приложений как главный экран" }, { "App icon size", "Размер значков приложений" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Применяется после перезапуска." }, { "Apply", "Применить" }, { "Apply auto-poll", "Применить автоопрос" }, { "Apply radio params", "Применить параметры радио" }, { "Apps", "Приложения" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Стрелки + Enter работают всегда. Эти буквы — дополнительно: коснитесь строки, затем нажмите клавишу." }, { "Auto advert", "Автообъявление" }, { "Auto chat", "Авто чат" }, @@ -6113,14 +5563,12 @@ static const I18nPair kBuiltin_ru[] = { { "Available", "Доступно" }, { "BLE off", "BLE выкл" }, { "BLE on", "BLE вкл" }, - { "BT", "BT" }, { "Back", "Назад" }, { "Backups", "Резервные копии" }, { "Battery", "Батарея" }, { "Battery & power history", "История батареи и питания" }, { "Battery (V)", "Батарея (В)" }, { "Battery calibration reset to default", "Калибровка батареи сброшена" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Заряд слишком низкий — сначала зарядите" }, { "Battery saver (experimental)", "Экономия заряда (экспериментально)" }, { "Battery — last 24h", "Батарея — последние 24 ч" }, @@ -6133,7 +5581,6 @@ static const I18nPair kBuiltin_ru[] = { { "Blocking unsupported", "Блокировка не поддерживается" }, { "Blue battery Last 6 min", "Синий — батарея Последние 6 мин" }, { "Blue battery Orange temp Cyan humidity", "Синий — батарея Оранжевый — темп. Голубой — влажность" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth уже выкл" }, { "Bluetooth already on", "Bluetooth уже вкл" }, { "Bluetooth off", "Bluetooth выкл" }, @@ -6143,7 +5590,6 @@ static const I18nPair kBuiltin_ru[] = { { "Buffered receive (experimental)", "Буферизованный приём (экспериментально)" }, { "Built-in", "Встроенный" }, { "Built-in (default)", "Встроенный (по умолчанию)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Калибровать батарею (полная = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Калибровано: 100%% = %u.%02u В (долгое нажатие — сброс)" }, { "Can't block — not a contact", "Нельзя заблокировать — не контакт" }, @@ -6240,7 +5686,6 @@ static const I18nPair kBuiltin_ru[] = { { "Cut", "Вырезать" }, { "Cut - Paste in a folder", "Вырезано - вставьте в папку" }, { "DM sound", "Звук DM" }, - { "DND", "DND" }, { "Danger zone", "Опасная зона" }, { "Data -> SD card on reboot\n(card must be inserted)", "Данные -> SD-карта при перезагрузке\n(нужна карта)" }, { "Data -> internal on reboot", "Данные -> внутр. при перезагрузке" }, @@ -6297,7 +5742,6 @@ static const I18nPair kBuiltin_ru[] = { { "Enter SSID first", "Сначала введите SSID" }, { "Enter a name", "Введите имя" }, { "Enter a network name", "Введите имя сети" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Enter добавляет строку" }, { "Enter exactly 32 hex characters.", "Введите ровно 32 hex-символа." }, { "Enter key sends message", "Клавиша Enter отправляет сообщение" }, @@ -6341,7 +5785,6 @@ static const I18nPair kBuiltin_ru[] = { { "Format failed (no card / SD error)", "Сбой форматирования (нет карты / ошибка SD)" }, { "Frequency / bandwidth", "Частота / полоса" }, { "Full", "Заполнено" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Зуммер %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Зуммер %s\n%s" }, { "GPS off", "GPS выкл" }, @@ -6375,7 +5818,6 @@ static const I18nPair kBuiltin_ru[] = { { "Idle power-save", "Энергосбережение при простое" }, { "Idle sleep disabled", "Сон при простое отключён" }, { "Idle sleep enabled", "Сон при простое включён" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Изображение слишком большое (>4 МБ)" }, { "Import", "Импорт" }, { "Import backup", "Импорт резервной копии" }, @@ -6407,7 +5849,6 @@ static const I18nPair kBuiltin_ru[] = { { "Join network", "Подключиться к сети" }, { "Join private channel", "Войти в приватный канал" }, { "Join the public channel", "Присоединиться к публичному каналу" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Вы вошли в %.40s" }, { "Keep per chat (messages)", "Хранить на чат (сообщений)" }, { "Key already in use", "Ключ уже используется" }, @@ -6419,7 +5860,6 @@ static const I18nPair kBuiltin_ru[] = { { "Keyboard nav: WASDZ on", "Навигация клавиатурой: WASDZ вкл." }, { "Keyboard nav: off", "Навигация клавиатурой: выкл." }, { "Keyboard navigation", "Навигация клавиатурой" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Прямая видимость → %s" }, { "Landscape (desktop)", "Альбомная (десктоп)" }, { "Landscape set - applies when remote mode starts.", "Альбомная выбрана - применится при запуске удалённого режима." }, @@ -6440,11 +5880,6 @@ static const I18nPair kBuiltin_ru[] = { { "Loading...", "Загрузка..." }, { "Local every", "Локально каждые" }, { "Local sensors", "Локальные датчики" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Блокировка" }, { "Lock screen", "Экран блокировки" }, { "Lock screen wallpaper", "Обои экрана блокировки" }, @@ -6467,12 +5902,9 @@ static const I18nPair kBuiltin_ru[] = { { "Logs", "Журналы" }, { "Longitude", "Долгота" }, { "Lua Store", "Магазин Lua" }, - { "MHz", "MHz" }, { "MQTT bridge", "Мост MQTT" }, { "Map", "Карта" }, { "Map options", "Параметры карты" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Ошибка хранилища карты.\n\nSD-карта найдена, но кэш\nтайлов не смонтирован.\nПерезагрузите для повтора." }, { "Map storage error.\nReflash the tiles partition.", "Ошибка хранилища карты.\nПерепрошейте раздел tiles." }, { "Map tiles: microSD", "Тайлы карты: microSD" }, @@ -6484,7 +5916,6 @@ static const I18nPair kBuiltin_ru[] = { { "Mark as read", "Отметить прочитанным" }, { "Mark read", "Отметить прочитанным" }, { "Marked read", "Отмечено прочитанным" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Макс. хопов (0..64)" }, { "Max zoom for this pack", "Макс. зум для этого пакета" }, { "Memory detail", "Сведения о памяти" }, @@ -6500,7 +5931,6 @@ static const I18nPair kBuiltin_ru[] = { { "Min zoom for this pack", "Мин. зум для этого пакета" }, { "Mode: BLE starting / low memory", "Режим: BLE запускается / мало памяти" }, { "Model:", "Модель:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Множественные ACK" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Мульти-ack %s · Повтор %s · RX boost %s" }, { "Multi-byte routing (path hash)", "Многобайтовая маршрутизация (хеш пути)" }, @@ -6517,7 +5947,6 @@ static const I18nPair kBuiltin_ru[] = { { "Nearby on map", "Рядом на карте" }, { "Network name", "Имя сети" }, { "Network name (SSID)", "Имя сети (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Новое" }, { "New DM", "Новое ЛС" }, { "New channel msg", "Новое сообщ. канала" }, @@ -6536,7 +5965,6 @@ static const I18nPair kBuiltin_ru[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "В /lock/ нет JPEG.\nДобавьте изображения через\nфайловый менеджер или SD-карту." }, { "No SD card", "Нет SD-карты" }, { "No SD card (or unreadable format)", "Нет SD-карты (или нечитаемый формат)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Копий пока нет. Нажмите «Новая копия» выше, чтобы создать." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Истории батареи пока нет.\n\nЗапись каждые 5 минут." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Нет заблокированных.\n\nДолго нажмите сообщение и нажмите\nБлокировать, чтобы добавить." }, @@ -6554,10 +5982,8 @@ static const I18nPair kBuiltin_ru[] = { { "No onboard GPS", "Нет встроенного GPS" }, { "No other networks found", "Другие сети не найдены" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Позиции пока нет. Холодный старт требует открытого неба и может занять несколько минут." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Нет ответа от %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Нет ответа. Проверьте пароль, сервер\nили часы устройства (устройство: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Здесь нет сохранённых тайлов.\n\nПодключитесь к Wi-Fi (Настройки → Wi-Fi),\nчтобы загрузить этот район.\nСохранённые тайлы остаются доступны офлайн." }, { "No system time yet", "Системное время ещё не задано" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Нет телеметрии в этом окне.\nЗапросите её или расширьте диапазон ниже." }, @@ -6569,7 +5995,6 @@ static const I18nPair kBuiltin_ru[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Недостаточно памяти для Bluetooth. Сначала выключите Wi-Fi." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Недостаточно памяти для Wi-Fi. Сначала выключите Bluetooth." }, { "Not enough free memory to fetch it. Reboot and try again.", "Недостаточно свободной памяти для загрузки. Перезагрузите и повторите попытку." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Ничего не выбрано" }, { "Notification sound set", "Звук уведомления задан" }, { "Notify on new contact", "Уведомлять о новом контакте" }, @@ -6613,7 +6038,6 @@ static const I18nPair kBuiltin_ru[] = { { "Path reset failed", "Не удалось сбросить путь" }, { "Paused — score %d", "Пауза — счёт %d" }, { "Per-transmit switching on", "Переключение на каждую передачу вкл." }, - { "Perf:", "Perf:" }, { "Pick colour", "Выбрать цвет" }, { "Ping", "Пинг" }, { "Ping failed", "Сбой ping" }, @@ -6626,11 +6050,9 @@ static const I18nPair kBuiltin_ru[] = { { "Port", "Порт" }, { "Portrait set - applies when remote mode starts.", "Портретная выбрана - применится при запуске удалённого режима." }, { "Position saved", "Позиция сохранена" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Питание" }, { "Power off", "Выключить" }, { "Powering off… click trackball to wake", "Выключение… нажмите трекбол для пробуждения" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Нажмите клавишу…" }, { "Probe now", "Измерить сейчас" }, { "Probing neighbours…", "Опрос соседей…" }, @@ -6645,7 +6067,6 @@ static const I18nPair kBuiltin_ru[] = { { "Purge all discovered nodes?", "Очистить все обнаруженные узлы?" }, { "Quick replies", "Быстрые ответы" }, { "Quick reply", "Быстрый ответ" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d записей · Raw %d записей" }, { "RX boosted gain", "Усиленное RX" }, { "RX log", "Журнал RX" }, @@ -6659,9 +6080,6 @@ static const I18nPair kBuiltin_ru[] = { { "RangeTest sent (direct)", "RangeTest отправлен (прямой)" }, { "RangeTest sent (flood)", "RangeTest отправлен (flood)" }, { "Raw log", "Сырой журнал" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Читает пакеты в фоновой задаче, чтобы занятый экран их не терял." }, { "Reboot", "Перезагрузка" }, { "Reboot device", "Перезагрузить устройство" }, @@ -6669,10 +6087,8 @@ static const I18nPair kBuiltin_ru[] = { { "Rebooting…", "Перезагрузка…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Получать невыпущенную тестовую прошивку — новее функции, но меньше проверены. Проверка и установка обновлений идут по бета-каналу." }, { "Recently heard", "Недавно слышно" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Отформатировать SD как MESHCOMOD (FAT32)?\nВСЕ данные на карте будут стёрты." }, { "Region & scope", "Регион и охват" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Регион (#tag) для этого канала.\nПусто = область по умолчанию." }, { "Region scope (#tag), blank = default.", "Область региона (#tag), пусто = по умолчанию." }, { "Region scope (#tag, blank = none)", "Регион (#tag, пусто = нет)" }, @@ -6711,16 +6127,12 @@ static const I18nPair kBuiltin_ru[] = { { "SD card %s", "SD-карта %s" }, { "SD card %s (hold: format)", "SD-карта %s (удерж.: формат.)" }, { "SD card (tap to mount)", "SD-карта (нажмите для монтирования)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "SD-карта вставлена" }, { "SD card lost - reinsert to recover", "SD-карта потеряна - переставьте её" }, { "SD card remounted", "SD-карта перемонтирована" }, { "SD card removed", "SD-карта извлечена" }, { "SD download failed: %s", "Не удалось загрузить на SD: %s" }, { "SD formatted - %s (MESHCOMOD)", "SD отформатирована - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u КБ занято" }, { "SSID set — enter password, then Save", "SSID задан — введите пароль, затем Сохранить" }, { "SSID too long", "SSID слишком длинный" }, @@ -6745,8 +6157,6 @@ static const I18nPair kBuiltin_ru[] = { { "Saved — rebooting", "Сохранено — перезагрузка" }, { "Saved — reconnecting…", "Сохранено — переподключение…" }, { "Saved: %s\nFlash it from the Launcher.", "Сохранено: %s\nПрошейте из Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Сохранение на SD… %d%%" }, { "Saving to SD… 0%", "Сохранение на SD… 0%" }, { "Scan to open on phone", "Отсканируйте, чтобы открыть на телефоне" }, @@ -6777,14 +6187,10 @@ static const I18nPair kBuiltin_ru[] = { { "Send advert now", "Отправить advert" }, { "Send an advert now, or set how often you re-advertise.", "Отправить advert сейчас или задать частоту повторной отправки." }, { "Send failed", "Не удалось отправить" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Отправитель заблокирован" }, { "Sensors tab: off (restart to apply)", "Вкладка датчиков: выкл (перезагрузите для применения)" }, { "Sensors tab: on (restart to apply)", "Вкладка датчиков: вкл (перезагрузите для применения)" }, { "Sent", "Отправлено" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Задать" }, { "Set an SSID first", "Сначала задайте SSID" }, { "Set as notification sound", "Установить как звук уведомления" }, @@ -6795,8 +6201,6 @@ static const I18nPair kBuiltin_ru[] = { { "Share QR", "Поделиться QR" }, { "Share channel", "Поделиться каналом" }, { "Share location in advert", "Делиться местоположением в advert" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Поделиться ключом" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Поделитесь секретом из 32 символов, чтобы другие присоединились. Пусто = случайный." }, { "Share: %s", "Поделиться: %s" }, @@ -6815,7 +6219,6 @@ static const I18nPair kBuiltin_ru[] = { { "Slot %d cleared", "Слот %d очищен" }, { "Slot empty", "Слот пуст" }, { "Small\nMedium\nLarge", "Малый\nСредний\nБольшой" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — проведите или крутите трекбол" }, { "Sort", "Сортировка" }, { "Sound", "Звук" }, @@ -6829,7 +6232,6 @@ static const I18nPair kBuiltin_ru[] = { { "Step 3 of 3", "Шаг 3 из 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Ещё анализируется предыдущий\nпуть… повторите чуть позже." }, { "Stop", "Стоп" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Хранилище" }, { "Store", "Магазин" }, { "Store data on SD (reboot)", "Хранить данные на SD (перезагрузка)" }, @@ -6842,8 +6244,6 @@ static const I18nPair kBuiltin_ru[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nWS-клиенты %d GPS %s Зуммер %s" }, { "TCP off", "TCP выкл" }, { "TCP on", "TCP вкл" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Горячие клавиши вкладки — коснитесь строки, затем нажмите клавишу" }, { "Tap Use to switch - the device reboots to apply.", "Нажмите «Выбрать», чтобы переключиться — устройство перезагрузится." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Нажмите «Выбрать» для смены - устройство перезагрузится. Файлы языков лежат в /lang в хранилище; правьте их или добавляйте свои." }, @@ -6923,20 +6323,15 @@ static const I18nPair kBuiltin_ru[] = { { "Username (optional)", "Имя пользователя (необязательно)" }, { "Volume", "Громкость" }, { "W up · A left · D right · Z down · S select · Q back", "W вверх · A влево · D вправо · Z вниз · S выбор · Q назад" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Ожидание Wi-Fi..." }, { "Welcome to WADAMESH", "Добро пожаловать в WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Пока это включено, любой в вашей сети Wi-Fi может видеть устройство и управлять им. Обычный HTTP (только локальная сеть)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi и Bluetooth" }, { "Wi-Fi is not enabled in this build.", "Wi-Fi не включён в этой сборке." }, { "Wi-Fi isn't available on this build.", "Wi-Fi недоступен в этой сборке." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Нужен Wi-Fi для профиля\nрельефа этого пути.\nПодключите в Настройки → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi не подключён" }, { "Wi-Fi off", "Wi-Fi выкл" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi вкл" }, { "Wi-Fi on, scanning…", "Wi-Fi вкл, поиск…" }, { "Wi-Fi saved (radio off)", "Wi-Fi сохранён (радио выкл)" }, @@ -6949,7 +6344,6 @@ static const I18nPair kBuiltin_ru[] = { { "Zero-hop", "Без ретрансляции" }, { "Zero-hop advert sent", "Zero-hop advert отправлен" }, { "Zoom: +/- buttons", "Масштаб: кнопки +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "клиент подключён" }, { "command", "команда" }, { "contacts (%d):", "контакты (%d):" }, @@ -6963,7 +6357,6 @@ static const I18nPair kBuiltin_ru[] = { { "hold Backspace to unlock", "удерживайте Backspace для разблокировки" }, { "hold the d-pad to unlock", "удерживайте d-pad для разблокировки" }, { "hold the trackball to unlock", "удерживайте трекбол для разблокировки" }, - { "kHz", "kHz" }, { "keep holding", "удерживайте" }, { "last wake: ", "последнее пробуждение: " }, { "leave empty to generate", "оставьте пустым для генерации" }, @@ -6973,7 +6366,6 @@ static const I18nPair kBuiltin_ru[] = { { "min (0=off)", "мин (0=выкл)" }, { "mkdir failed", "Не удалось создать папку" }, { "n/a in this build", "н/д в этой сборке" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "теперь в канале %s" }, { "now talking to %s", "теперь общаетесь с %s" }, { "off", "выкл" }, @@ -6992,37 +6384,25 @@ static const I18nPair kBuiltin_ru[] = { { "zoom", "масштаб" }, { "zoom %d", "масштаб %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "усилитель ~17 дБ для тихих/удалённых мест; выключайте в шумных." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_uk[] = { { " (device behind)", " (пристрій відстає)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d точок покриття · %lu записано на SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: очікування GPS…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, { "%.3f MHz · SF%u · TX %+ddBm", "%.3f МГц · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d на карті" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d поруч (%d ретр, %d комп)" }, { "%u types · hops %u · manual %s", "%u типів · хопи %u · вручну %s" }, { "(RTC unset)", "(RTC не задано)" }, { "(device behind)", "(пристрій відстає)" }, { "(no default)", "(немає типового)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 байт (застар.)\n2 байти\n3 байти" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nБез ліміту" }, { "12-hour clock", "12-годинний формат" }, { "32 hex characters", "32 hex-символи" }, { "32-hex secret. Anyone with this can read the channel.", "Секрет 32 hex. Будь-хто з ним може читати канал." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Згадки" }, { "@ mention sound", "Звук @-згадок" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "АВТОМАТИЧНІ АДВЕРТИ" }, { "About", "Про програму" }, { "About the map", "Про карту" }, @@ -7038,14 +6418,11 @@ static const I18nPair kBuiltin_uk[] = { { "Added to contacts", "Додано до контактів" }, { "Added to favorites", "Додано до обраного" }, { "Admin", "Адмін" }, - { "Advert", "Advert" }, { "Advert failed", "Помилка advert" }, { "Advert location", "Місцезнаходження advert" }, { "Advert policy saved", "Політику advert збережено" }, { "Advert sent", "Advert надіслано" }, - { "All", "All" }, { "All marked read", "Усе прочитано" }, - { "Allow", "Allow" }, { "Already exists", "Вже існує" }, { "Already exists or table full.", "Вже існує або таблиця заповнена." }, { "Already in contacts", "Вже в контактах" }, @@ -7056,13 +6433,11 @@ static const I18nPair kBuiltin_uk[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Будь-хто може приєднатися. Ключ із хештегу (нижній регістр)." }, { "App drawer as home", "Меню додатків як головний екран" }, { "App icon size", "Розмір значків додатків" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Діє після перезапуску." }, { "Apply", "Застосувати" }, { "Apply auto-poll", "Застосувати автоопитування" }, { "Apply radio params", "Застосувати параметри радіо" }, { "Apps", "Застосунки" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Стрілки + Enter працюють завжди. Ці літери — додатково: торкніться рядка, потім натисніть клавішу." }, { "Auto advert", "Автооголошення" }, { "Auto chat", "Авто чат" }, @@ -7085,14 +6460,12 @@ static const I18nPair kBuiltin_uk[] = { { "Available", "Доступно" }, { "BLE off", "BLE вимк" }, { "BLE on", "BLE увімк" }, - { "BT", "BT" }, { "Back", "Назад" }, { "Backups", "Резервні копії" }, { "Battery", "Батарея" }, { "Battery & power history", "Історія батареї та живлення" }, { "Battery (V)", "Батарея (В)" }, { "Battery calibration reset to default", "Калібрування батареї скинуто" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Заряд надто низький — спершу зарядіть" }, { "Battery saver (experimental)", "Економія заряду (експериментально)" }, { "Battery — last 24h", "Батарея — останні 24 год" }, @@ -7105,7 +6478,6 @@ static const I18nPair kBuiltin_uk[] = { { "Blocking unsupported", "Блокування не підтримується" }, { "Blue battery Last 6 min", "Синій — батарея Останні 6 хв" }, { "Blue battery Orange temp Cyan humidity", "Синій — батарея Помаранчевий — темп. Блакитний — вологість" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth вже вимк" }, { "Bluetooth already on", "Bluetooth вже увімк" }, { "Bluetooth off", "Bluetooth вимк" }, @@ -7115,7 +6487,6 @@ static const I18nPair kBuiltin_uk[] = { { "Buffered receive (experimental)", "Буферизований прийом (експериментально)" }, { "Built-in", "Вбудований" }, { "Built-in (default)", "Вбудований (типовий)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Калібрувати батарею (повна = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Калібровано: 100%% = %u.%02u В (довге натискання — скидання)" }, { "Can't block — not a contact", "Не можна заблокувати — не контакт" }, @@ -7212,7 +6583,6 @@ static const I18nPair kBuiltin_uk[] = { { "Cut", "Вирізати" }, { "Cut - Paste in a folder", "Вирізано - вставте в теку" }, { "DM sound", "Звук DM" }, - { "DND", "DND" }, { "Danger zone", "Небезпечна зона" }, { "Data -> SD card on reboot\n(card must be inserted)", "Дані -> SD-картка при перезавантаженні\n(потрібна картка)" }, { "Data -> internal on reboot", "Дані -> внутр. при перезавантаженні" }, @@ -7269,7 +6639,6 @@ static const I18nPair kBuiltin_uk[] = { { "Enter SSID first", "Спочатку введіть SSID" }, { "Enter a name", "Введіть ім'я" }, { "Enter a network name", "Введіть назву мережі" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Enter додає новий рядок" }, { "Enter exactly 32 hex characters.", "Введіть рівно 32 hex-символи." }, { "Enter key sends message", "Клавіша Enter надсилає повідомлення" }, @@ -7313,7 +6682,6 @@ static const I18nPair kBuiltin_uk[] = { { "Format failed (no card / SD error)", "Помилка форматування (немає картки / помилка SD)" }, { "Frequency / bandwidth", "Частота / смуга" }, { "Full", "Заповнено" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Зумер %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Зумер %s\n%s" }, { "GPS off", "GPS вимк" }, @@ -7347,7 +6715,6 @@ static const I18nPair kBuiltin_uk[] = { { "Idle power-save", "Енергозбереження при простої" }, { "Idle sleep disabled", "Сон при простої вимкнено" }, { "Idle sleep enabled", "Сон при простої увімкнено" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Зображення завелике (>4 МБ)" }, { "Import", "Імпорт" }, { "Import backup", "Імпорт резервної копії" }, @@ -7379,7 +6746,6 @@ static const I18nPair kBuiltin_uk[] = { { "Join network", "Приєднатися до мережі" }, { "Join private channel", "Приєднатися до приватного каналу" }, { "Join the public channel", "Приєднатися до публічного каналу" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Приєднано до %.40s" }, { "Keep per chat (messages)", "Зберігати на чат (повідомлень)" }, { "Key already in use", "Ключ уже використовується" }, @@ -7391,7 +6757,6 @@ static const I18nPair kBuiltin_uk[] = { { "Keyboard nav: WASDZ on", "Навігація клавіатурою: WASDZ увімк." }, { "Keyboard nav: off", "Навігація клавіатурою: вимк." }, { "Keyboard navigation", "Навігація клавіатурою" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Пряма видимість → %s" }, { "Landscape (desktop)", "Альбомна (десктоп)" }, { "Landscape set - applies when remote mode starts.", "Альбомну вибрано - застосується під час запуску віддаленого режиму." }, @@ -7412,11 +6777,6 @@ static const I18nPair kBuiltin_uk[] = { { "Loading...", "Завантаження..." }, { "Local every", "Локально кожні" }, { "Local sensors", "Локальні датчики" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Блокування" }, { "Lock screen", "Екран блокування" }, { "Lock screen wallpaper", "Шпалери екрана блокування" }, @@ -7439,12 +6799,9 @@ static const I18nPair kBuiltin_uk[] = { { "Logs", "Журнали" }, { "Longitude", "Довгота" }, { "Lua Store", "Магазин Lua" }, - { "MHz", "MHz" }, { "MQTT bridge", "Міст MQTT" }, { "Map", "Карта" }, { "Map options", "Параметри карти" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Помилка сховища карти.\n\nSD-картку знайдено, але кеш\nплиток не змонтовано.\nПерезавантажте для повтору." }, { "Map storage error.\nReflash the tiles partition.", "Помилка сховища карти.\nПерепрошийте розділ tiles." }, { "Map tiles: microSD", "Плитки карти: microSD" }, @@ -7456,7 +6813,6 @@ static const I18nPair kBuiltin_uk[] = { { "Mark as read", "Позначити прочитаним" }, { "Mark read", "Позначити прочитаним" }, { "Marked read", "Позначено прочитаним" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Макс. хопів (0..64)" }, { "Max zoom for this pack", "Макс. зум для цього пакета" }, { "Memory detail", "Деталі пам'яті" }, @@ -7472,7 +6828,6 @@ static const I18nPair kBuiltin_uk[] = { { "Min zoom for this pack", "Мін. зум для цього пакета" }, { "Mode: BLE starting / low memory", "Режим: BLE запускається / мало пам'яті" }, { "Model:", "Модель:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Множинні ACK" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Мульти-ack %s · Повтор %s · RX boost %s" }, { "Multi-byte routing (path hash)", "Багатобайтова маршрутизація (хеш шляху)" }, @@ -7489,7 +6844,6 @@ static const I18nPair kBuiltin_uk[] = { { "Nearby on map", "Поблизу на карті" }, { "Network name", "Назва мережі" }, { "Network name (SSID)", "Назва мережі (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Нове" }, { "New DM", "Нове ПП" }, { "New channel msg", "Нове повід. каналу" }, @@ -7508,7 +6862,6 @@ static const I18nPair kBuiltin_uk[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "У /lock/ немає JPEG.\nДодайте зображення через\nфайловий менеджер або SD-картку." }, { "No SD card", "Немає SD-карти" }, { "No SD card (or unreadable format)", "Немає SD-карти (або нечитабельний формат)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Копій ще немає. Натисніть «Нова копія» вгорі, щоб створити." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Історії батареї ще немає.\n\nЗапис кожні 5 хвилин." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Немає заблокованих.\n\nЗатисніть повідомлення й натисніть\nБлокувати, щоб додати." }, @@ -7526,10 +6879,8 @@ static const I18nPair kBuiltin_uk[] = { { "No onboard GPS", "Немає вбудованого GPS" }, { "No other networks found", "Інших мереж не знайдено" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Позиції ще немає. Холодний старт потребує відкритого неба і може тривати кілька хвилин." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Немає відповіді від %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Немає відповіді. Перевірте пароль, сервер\nабо годинник пристрою (пристрій: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Тут немає збережених плиток.\n\nПідключіться до Wi-Fi (Налаштування → Wi-Fi),\nщоб завантажити цю ділянку.\nЗбережені плитки лишаються доступні офлайн." }, { "No system time yet", "Системний час ще не задано" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Немає телеметрії в цьому вікні.\nЗапросіть її або розширте діапазон нижче." }, @@ -7541,7 +6892,6 @@ static const I18nPair kBuiltin_uk[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Недостатньо пам'яті для Bluetooth. Спершу вимкніть Wi-Fi." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Недостатньо пам'яті для Wi-Fi. Спершу вимкніть Bluetooth." }, { "Not enough free memory to fetch it. Reboot and try again.", "Недостатньо вільної пам'яті для завантаження. Перезавантажте та спробуйте ще раз." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Нічого не вибрано" }, { "Notification sound set", "Звук сповіщення встановлено" }, { "Notify on new contact", "Сповіщати про новий контакт" }, @@ -7585,7 +6935,6 @@ static const I18nPair kBuiltin_uk[] = { { "Path reset failed", "Не вдалося скинути шлях" }, { "Paused — score %d", "Пауза — рахунок %d" }, { "Per-transmit switching on", "Перемикання на кожну передачу увімк." }, - { "Perf:", "Perf:" }, { "Pick colour", "Вибрати колір" }, { "Ping", "Пінг" }, { "Ping failed", "Помилка ping" }, @@ -7598,11 +6947,9 @@ static const I18nPair kBuiltin_uk[] = { { "Port", "Порт" }, { "Portrait set - applies when remote mode starts.", "Портретну вибрано - застосується під час запуску віддаленого режиму." }, { "Position saved", "Позицію збережено" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Живлення" }, { "Power off", "Вимкнути" }, { "Powering off… click trackball to wake", "Вимкнення… натисніть трекбол для пробудження" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Натисніть клавішу…" }, { "Probe now", "Виміряти зараз" }, { "Probing neighbours…", "Опитування сусідів…" }, @@ -7617,7 +6964,6 @@ static const I18nPair kBuiltin_uk[] = { { "Purge all discovered nodes?", "Очистити всі виявлені вузли?" }, { "Quick replies", "Швидкі відповіді" }, { "Quick reply", "Швидка відповідь" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d записів · Raw %d записів" }, { "RX boosted gain", "Підсилений RX" }, { "RX log", "Журнал RX" }, @@ -7631,9 +6977,6 @@ static const I18nPair kBuiltin_uk[] = { { "RangeTest sent (direct)", "RangeTest надіслано (прямий)" }, { "RangeTest sent (flood)", "RangeTest надіслано (flood)" }, { "Raw log", "Сирий журнал" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Читає пакети у фоновому завданні, щоб зайнятий екран їх не втрачав." }, { "Reboot", "Перезавантажити" }, { "Reboot device", "Перезавантажити пристрій" }, @@ -7641,10 +6984,8 @@ static const I18nPair kBuiltin_uk[] = { { "Rebooting…", "Перезавантаження…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Отримувати невипущену тестову прошивку — новіші функції, але менш перевірені. Перевірка та встановлення оновлень йдуть бета-каналом." }, { "Recently heard", "Нещодавно чуто" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Переформатувати SD як MESHCOMOD (FAT32)?\nУСІ дані на картці будуть стерті." }, { "Region & scope", "Регіон і охоплення" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Регіон (#tag) для цього каналу.\nПорожньо = область за умовчанням." }, { "Region scope (#tag), blank = default.", "Область регіону (#tag), порожньо = за замовчуванням." }, { "Region scope (#tag, blank = none)", "Регіон (#tag, порожньо = немає)" }, @@ -7683,16 +7024,12 @@ static const I18nPair kBuiltin_uk[] = { { "SD card %s", "SD-картка %s" }, { "SD card %s (hold: format)", "SD-картка %s (утрим.: формат.)" }, { "SD card (tap to mount)", "SD-картка (торкніться для монтування)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "SD-картку вставлено" }, { "SD card lost - reinsert to recover", "SD-картку втрачено - вставте знову" }, { "SD card remounted", "SD-картку перемонтовано" }, { "SD card removed", "SD-картку вилучено" }, { "SD download failed: %s", "Не вдалося завантажити на SD: %s" }, { "SD formatted - %s (MESHCOMOD)", "SD відформатовано - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u КБ використано" }, { "SSID set — enter password, then Save", "SSID задано — введіть пароль, потім Зберегти" }, { "SSID too long", "SSID задовгий" }, @@ -7717,8 +7054,6 @@ static const I18nPair kBuiltin_uk[] = { { "Saved — rebooting", "Збережено — перезавантаження" }, { "Saved — reconnecting…", "Збережено — перепідключення…" }, { "Saved: %s\nFlash it from the Launcher.", "Збережено: %s\nПрошийте з Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Збереження на SD… %d%%" }, { "Saving to SD… 0%", "Збереження на SD… 0%" }, { "Scan to open on phone", "Відскануйте, щоб відкрити на телефоні" }, @@ -7749,14 +7084,10 @@ static const I18nPair kBuiltin_uk[] = { { "Send advert now", "Надіслати advert" }, { "Send an advert now, or set how often you re-advertise.", "Надіслати advert зараз або задати частоту повторної відправки." }, { "Send failed", "Не вдалося надіслати" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Відправника заблоковано" }, { "Sensors tab: off (restart to apply)", "Вкладка датчиків: вимк (перезавантажте для застосування)" }, { "Sensors tab: on (restart to apply)", "Вкладка датчиків: увімк (перезавантажте для застосування)" }, { "Sent", "Надіслано" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Задати" }, { "Set an SSID first", "Спочатку задайте SSID" }, { "Set as notification sound", "Встановити як звук сповіщення" }, @@ -7767,8 +7098,6 @@ static const I18nPair kBuiltin_uk[] = { { "Share QR", "Поділитися QR" }, { "Share channel", "Поділитися каналом" }, { "Share location in advert", "Ділитися місцезнаходженням в advert" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Поділитися ключем" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Поділіться секретом із 32 символів, щоб інші приєдналися. Порожньо = випадковий." }, { "Share: %s", "Поділитися: %s" }, @@ -7787,7 +7116,6 @@ static const I18nPair kBuiltin_uk[] = { { "Slot %d cleared", "Слот %d очищено" }, { "Slot empty", "Слот порожній" }, { "Small\nMedium\nLarge", "Малий\nСередній\nВеликий" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — проведіть або крутіть трекбол" }, { "Sort", "Сортувати" }, { "Sound", "Звук" }, @@ -7801,7 +7129,6 @@ static const I18nPair kBuiltin_uk[] = { { "Step 3 of 3", "Крок 3 з 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Ще аналізується попередній\nшлях… спробуйте за мить." }, { "Stop", "Стоп" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Сховище" }, { "Store", "Магазин" }, { "Store data on SD (reboot)", "Зберігати дані на SD (перезавантаження)" }, @@ -7814,8 +7141,6 @@ static const I18nPair kBuiltin_uk[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nWS-клієнти %d GPS %s Зумер %s" }, { "TCP off", "TCP вимк" }, { "TCP on", "TCP увімк" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Гарячі клавіші вкладки — торкніться рядка, потім натисніть клавішу" }, { "Tap Use to switch - the device reboots to apply.", "Натисніть «Обрати», щоб перемкнути — пристрій перезавантажиться." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Натисніть «Обрати» для зміни - пристрій перезавантажиться. Файли мов лежать у /lang у сховищі; редагуйте їх або додавайте власні." }, @@ -7895,20 +7220,15 @@ static const I18nPair kBuiltin_uk[] = { { "Username (optional)", "Ім'я користувача (необов'язково)" }, { "Volume", "Гучність" }, { "W up · A left · D right · Z down · S select · Q back", "W вгору · A вліво · D вправо · Z вниз · S вибір · Q назад" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Очікування Wi-Fi..." }, { "Welcome to WADAMESH", "Ласкаво просимо до WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Поки це увімкнено, будь-хто у вашій мережі Wi-Fi може бачити пристрій і керувати ним. Звичайний HTTP (лише локальна мережа)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi і Bluetooth" }, { "Wi-Fi is not enabled in this build.", "Wi-Fi не увімкнено в цій збірці." }, { "Wi-Fi isn't available on this build.", "Wi-Fi недоступний у цій збірці." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Потрібен Wi-Fi для профілю\nрельєфу цього шляху.\nПідключіть у Налаштування → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi не під'єднано" }, { "Wi-Fi off", "Wi-Fi вимк" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi увімк" }, { "Wi-Fi on, scanning…", "Wi-Fi увімк, пошук…" }, { "Wi-Fi saved (radio off)", "Wi-Fi збережено (радіо вимк)" }, @@ -7921,7 +7241,6 @@ static const I18nPair kBuiltin_uk[] = { { "Zero-hop", "Без ретрансляції" }, { "Zero-hop advert sent", "Zero-hop advert надіслано" }, { "Zoom: +/- buttons", "Масштаб: кнопки +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "клієнт під'єднано" }, { "command", "команда" }, { "contacts (%d):", "контакти (%d):" }, @@ -7935,7 +7254,6 @@ static const I18nPair kBuiltin_uk[] = { { "hold Backspace to unlock", "утримуйте Backspace для розблокування" }, { "hold the d-pad to unlock", "утримуйте d-pad для розблокування" }, { "hold the trackball to unlock", "утримуйте трекбол для розблокування" }, - { "kHz", "kHz" }, { "keep holding", "утримуйте" }, { "last wake: ", "останнє пробудження: " }, { "leave empty to generate", "залиште порожнім для генерації" }, @@ -7945,7 +7263,6 @@ static const I18nPair kBuiltin_uk[] = { { "min (0=off)", "хв (0=вимк)" }, { "mkdir failed", "Не вдалося створити теку" }, { "n/a in this build", "н/д у цій збірці" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "тепер у каналі %s" }, { "now talking to %s", "тепер спілкуєтесь з %s" }, { "off", "вимк" }, @@ -7964,44 +7281,30 @@ static const I18nPair kBuiltin_uk[] = { { "zoom", "масштаб" }, { "zoom %d", "масштаб %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "підсилювач ~17 дБ для тихих/віддалених місць; вимикайте в галасливих." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_bg[] = { { " (device behind)", " (устройството изостава)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d точки покритие · %lu записани на SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: изчакване на GPS…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d на картата" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d наблизо (%d повт, %d комп)" }, { "%u types · hops %u · manual %s", "%u типа · хопове %u · ръчно %s" }, { "(RTC unset)", "(RTC не е зададен)" }, { "(device behind)", "(устройството изостава)" }, { "(no default)", "(няма по подразбиране)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 байт (стар)\n2 байта\n3 байта" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nБез лимит" }, { "12-hour clock", "12-часов формат" }, { "32 hex characters", "32 hex знака" }, { "32-hex secret. Anyone with this can read the channel.", "32-hex тайна. Всеки с нея може да чете канала." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Споменавания" }, { "@ mention sound", "Звук при @ споменаване" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "АВТОМАТИЧНИ АДВЕРТИ" }, { "About", "Относно" }, { "About the map", "Относно картата" }, { "Accent popups", "Изскачащи акценти" }, { "Accent popups: off", "Изскачащи акценти: изкл" }, { "Accent popups: on", "Изскачащи акценти: вкл" }, - { "Ack", "Ack" }, { "Active", "Активно" }, { "Add", "Добави" }, { "Add channel", "Добави канал" }, @@ -8010,14 +7313,11 @@ static const I18nPair kBuiltin_bg[] = { { "Added to contacts", "Добавено в контактите" }, { "Added to favorites", "Добавено в любими" }, { "Admin", "Админ" }, - { "Advert", "Advert" }, { "Advert failed", "Advert неуспешен" }, { "Advert location", "Местоположение на advert" }, { "Advert policy saved", "Правилото за advert е запазено" }, { "Advert sent", "Advert изпратен" }, - { "All", "All" }, { "All marked read", "Всичко прочетено" }, - { "Allow", "Allow" }, { "Already exists", "Вече съществува" }, { "Already exists or table full.", "Вече съществува или таблицата е пълна." }, { "Already in contacts", "Вече в контактите" }, @@ -8028,13 +7328,11 @@ static const I18nPair kBuiltin_bg[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Всеки може да се присъедини. Ключът е от хаштага (малки букви)." }, { "App drawer as home", "Меню с приложения като начален екран" }, { "App icon size", "Размер на иконите на приложенията" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Прилага се след рестарт." }, { "Apply", "Приложи" }, { "Apply auto-poll", "Приложи авто-запитване" }, { "Apply radio params", "Приложи радио параметри" }, { "Apps", "Приложения" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Стрелки + Enter винаги работят. Тези букви са допълнение — докосни ред, после натисни клавиш." }, { "Auto advert", "Автоматична обява" }, { "Auto chat", "Авто чат" }, @@ -8057,14 +7355,12 @@ static const I18nPair kBuiltin_bg[] = { { "Available", "Налични" }, { "BLE off", "BLE изкл" }, { "BLE on", "BLE вкл" }, - { "BT", "BT" }, { "Back", "Назад" }, { "Backups", "Резервни копия" }, { "Battery", "Батерия" }, { "Battery & power history", "История на батерията и захранването" }, { "Battery (V)", "Батерия (V)" }, { "Battery calibration reset to default", "Калибрирането на батерията е нулирано" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Отчитането е твърде ниско — заредете първо" }, { "Battery saver (experimental)", "Пестене на батерия (експериментално)" }, { "Battery — last 24h", "Батерия — последни 24 ч" }, @@ -8077,7 +7373,6 @@ static const I18nPair kBuiltin_bg[] = { { "Blocking unsupported", "Блокирането не се поддържа" }, { "Blue battery Last 6 min", "Синьо — батерия Последни 6 мин" }, { "Blue battery Orange temp Cyan humidity", "Синьо — батерия Оранжево — темп. Циан — влажност" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth вече е изкл" }, { "Bluetooth already on", "Bluetooth вече е вкл" }, { "Bluetooth off", "Bluetooth изкл" }, @@ -8087,7 +7382,6 @@ static const I18nPair kBuiltin_bg[] = { { "Buffered receive (experimental)", "Буфериран прием (експериментално)" }, { "Built-in", "Вграден" }, { "Built-in (default)", "Вграден (по подразбиране)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Калибрирай батерията (пълна = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Калибрирано: 100%% = %u.%02u V (задръжте за нулиране)" }, { "Can't block — not a contact", "Не може да се блокира — не е контакт" }, @@ -8184,7 +7478,6 @@ static const I18nPair kBuiltin_bg[] = { { "Cut", "Изрежи" }, { "Cut - Paste in a folder", "Изрязано - поставете в папка" }, { "DM sound", "Звук за DM" }, - { "DND", "DND" }, { "Danger zone", "Опасна зона" }, { "Data -> SD card on reboot\n(card must be inserted)", "Данни -> SD карта при рестарт\n(нужна е карта)" }, { "Data -> internal on reboot", "Данни -> вътрешна при рестарт" }, @@ -8241,7 +7534,6 @@ static const I18nPair kBuiltin_bg[] = { { "Enter SSID first", "Първо въведете SSID" }, { "Enter a name", "Въведете име" }, { "Enter a network name", "Въведете име на мрежа" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Enter добавя нов ред" }, { "Enter exactly 32 hex characters.", "Въведете точно 32 hex знака." }, { "Enter key sends message", "Клавишът Enter изпраща съобщението" }, @@ -8285,7 +7577,6 @@ static const I18nPair kBuiltin_bg[] = { { "Format failed (no card / SD error)", "Форматирането неуспешно (няма карта / SD грешка)" }, { "Frequency / bandwidth", "Честота / лента" }, { "Full", "Пълно" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Зумер %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Зумер %s\n%s" }, { "GPS off", "GPS изкл" }, @@ -8319,7 +7610,6 @@ static const I18nPair kBuiltin_bg[] = { { "Idle power-save", "Пестене на енергия в покой" }, { "Idle sleep disabled", "Заспиване в покой изключено" }, { "Idle sleep enabled", "Заспиване в покой включено" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Изображението е твърде голямо (>4 MB)" }, { "Import", "Импортирай" }, { "Import backup", "Импортиране на резервно копие" }, @@ -8351,7 +7641,6 @@ static const I18nPair kBuiltin_bg[] = { { "Join network", "Присъединяване към мрежа" }, { "Join private channel", "Присъедини се към частен канал" }, { "Join the public channel", "Присъедини се към публичния канал" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Присъединено към %.40s" }, { "Keep per chat (messages)", "Пазене на чат (съобщения)" }, { "Key already in use", "Ключът вече се използва" }, @@ -8363,7 +7652,6 @@ static const I18nPair kBuiltin_bg[] = { { "Keyboard nav: WASDZ on", "Клавиатурна навиг.: WASDZ вкл." }, { "Keyboard nav: off", "Клавиатурна навиг.: изкл." }, { "Keyboard navigation", "Навигация с клавиатура" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Пряка видимост → %s" }, { "Landscape (desktop)", "Пейзаж (десктоп)" }, { "Landscape set - applies when remote mode starts.", "Пейзажът е зададен - прилага се при стартиране на отдалечения режим." }, @@ -8384,11 +7672,6 @@ static const I18nPair kBuiltin_bg[] = { { "Loading...", "Зареждане..." }, { "Local every", "Локално на всеки" }, { "Local sensors", "Локални сензори" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Заключи" }, { "Lock screen", "Заключен екран" }, { "Lock screen wallpaper", "Тапет на заключен екран" }, @@ -8411,12 +7694,9 @@ static const I18nPair kBuiltin_bg[] = { { "Logs", "Логове" }, { "Longitude", "Географска дължина" }, { "Lua Store", "Lua магазин" }, - { "MHz", "MHz" }, { "MQTT bridge", "MQTT мост" }, { "Map", "Карта" }, { "Map options", "Опции на картата" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Грешка в хранилището.\n\nSD картата е открита, но кешът\nна плочките не се монтира.\nРестартирайте за нов опит." }, { "Map storage error.\nReflash the tiles partition.", "Грешка в хранилището на картата.\nПрефлашнете дяла tiles." }, { "Map tiles: microSD", "Плочки: microSD" }, @@ -8428,7 +7708,6 @@ static const I18nPair kBuiltin_bg[] = { { "Mark as read", "Отбележи като прочетено" }, { "Mark read", "Маркирай прочетено" }, { "Marked read", "Отбелязано като прочетено" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Макс. скокове (0..64)" }, { "Max zoom for this pack", "Макс. мащаб за този пакет" }, { "Memory detail", "Подробности за паметта" }, @@ -8444,7 +7723,6 @@ static const I18nPair kBuiltin_bg[] = { { "Min zoom for this pack", "Мин. мащаб за този пакет" }, { "Mode: BLE starting / low memory", "Режим: BLE стартира / малко памет" }, { "Model:", "Модел:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Множествени ACK" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Мулти-ack %s · Повтор %s · RX boost %s" }, { "Multi-byte routing (path hash)", "Многобайтово маршрутиране (хеш на пътя)" }, @@ -8461,7 +7739,6 @@ static const I18nPair kBuiltin_bg[] = { { "Nearby on map", "Наблизо на картата" }, { "Network name", "Име на мрежата" }, { "Network name (SSID)", "Име на мрежата (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Ново" }, { "New DM", "Ново ЛС" }, { "New channel msg", "Ново съобщ. в канал" }, @@ -8480,7 +7757,6 @@ static const I18nPair kBuiltin_bg[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "Няма JPEG в /lock/.\nДобавете изображения чрез\nфайловия мениджър или SD карта." }, { "No SD card", "Няма SD карта" }, { "No SD card (or unreadable format)", "Няма SD карта (или нечетим формат)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Все още няма копия. Натиснете «Ново копие» горе, за да създадете." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Все още няма история на батерията.\n\nЗапис на всеки 5 минути." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Няма блокирани потребители.\n\nЗадръжте съобщение и докоснете\nБлокирай, за да добавите." }, @@ -8498,10 +7774,8 @@ static const I18nPair kBuiltin_bg[] = { { "No onboard GPS", "Няма вграден GPS" }, { "No other networks found", "Не са открити други мрежи" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Още няма позиция. Студен старт изисква чисто небе и може да отнеме няколко минути." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Няма отговор от %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Няма отговор. Проверете паролата, сървъра\nили часовника на устройството (устройство: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Тук няма запазени плочки.\n\nСвържете се с Wi-Fi (Настройки → Wi-Fi),\nза да изтеглите този район.\nЗапазените плочки остават достъпни офлайн." }, { "No system time yet", "Все още няма системно време" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Няма телеметрия в този прозорец.\nПоискайте или разширете обхвата по-долу." }, @@ -8513,7 +7787,6 @@ static const I18nPair kBuiltin_bg[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Недостатъчно памет за Bluetooth. Първо изключете Wi-Fi." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Недостатъчно памет за Wi-Fi. Първо изключете Bluetooth." }, { "Not enough free memory to fetch it. Reboot and try again.", "Недостатъчно свободна памет за изтегляне. Рестартирайте и опитайте отново." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Нищо не е избрано" }, { "Notification sound set", "Звукът за известие е зададен" }, { "Notify on new contact", "Известяване при нов контакт" }, @@ -8557,7 +7830,6 @@ static const I18nPair kBuiltin_bg[] = { { "Path reset failed", "Нулирането на пътя неуспешно" }, { "Paused — score %d", "На пауза — резултат %d" }, { "Per-transmit switching on", "Превключване при всяко предаване вкл." }, - { "Perf:", "Perf:" }, { "Pick colour", "Избери цвят" }, { "Ping", "Пинг" }, { "Ping failed", "Ping неуспешен" }, @@ -8570,11 +7842,9 @@ static const I18nPair kBuiltin_bg[] = { { "Port", "Порт" }, { "Portrait set - applies when remote mode starts.", "Портретът е зададен - прилага се при стартиране на отдалечения режим." }, { "Position saved", "Позицията е запазена" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Захранване" }, { "Power off", "Изключване" }, { "Powering off… click trackball to wake", "Изключване… щракнете топчето за събуждане" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Натиснете клавиш…" }, { "Probe now", "Измери сега" }, { "Probing neighbours…", "Проверка на съседи…" }, @@ -8589,7 +7859,6 @@ static const I18nPair kBuiltin_bg[] = { { "Purge all discovered nodes?", "Изчистване на всички открити възли?" }, { "Quick replies", "Бързи отговори" }, { "Quick reply", "Бърз отговор" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d записа · Raw %d записа" }, { "RX boosted gain", "Усилено RX" }, { "RX log", "RX дневник" }, @@ -8603,9 +7872,6 @@ static const I18nPair kBuiltin_bg[] = { { "RangeTest sent (direct)", "RangeTest изпратен (директен)" }, { "RangeTest sent (flood)", "RangeTest изпратен (flood)" }, { "Raw log", "Суров дневник" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Чете пакети във фонова задача, за да не ги изпуска зает екран." }, { "Reboot", "Рестартирай" }, { "Reboot device", "Рестартирай устройството" }, @@ -8613,10 +7879,8 @@ static const I18nPair kBuiltin_bg[] = { { "Rebooting…", "Рестартиране…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Получаване на неиздаден тестов firmware — по-нови функции, но по-малко тествани. Проверката и инсталирането следват бета канала." }, { "Recently heard", "Наскоро чути" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Форматиране на SD като MESHCOMOD (FAT32)?\nВСИЧКИ данни на картата ще бъдат изтрити." }, { "Region & scope", "Регион и обхват" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Регионален обхват (#tag) за този канал.\nПразно = обхват по подразбиране." }, { "Region scope (#tag), blank = default.", "Обхват на регион (#tag), празно = по подразбиране." }, { "Region scope (#tag, blank = none)", "Регионален обхват (#tag, празно = няма)" }, @@ -8655,16 +7919,12 @@ static const I18nPair kBuiltin_bg[] = { { "SD card %s", "SD карта %s" }, { "SD card %s (hold: format)", "SD карта %s (задръж: формат)" }, { "SD card (tap to mount)", "SD карта (докоснете за монтиране)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "SD картата е поставена" }, { "SD card lost - reinsert to recover", "SD картата е изгубена - поставете я отново" }, { "SD card remounted", "SD картата е монтирана отново" }, { "SD card removed", "SD картата е извадена" }, { "SD download failed: %s", "Изтеглянето на SD е неуспешно: %s" }, { "SD formatted - %s (MESHCOMOD)", "SD форматирана - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB използвани" }, { "SSID set — enter password, then Save", "SSID зададен — въведете парола, после Запази" }, { "SSID too long", "SSID е твърде дълъг" }, @@ -8689,8 +7949,6 @@ static const I18nPair kBuiltin_bg[] = { { "Saved — rebooting", "Запазено — рестарт" }, { "Saved — reconnecting…", "Запазено — повторно свързване…" }, { "Saved: %s\nFlash it from the Launcher.", "Запазено: %s\nФлашнете го от Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Запис на SD… %d%%" }, { "Saving to SD… 0%", "Запис на SD… 0%" }, { "Scan to open on phone", "Сканирай, за да отвориш на телефона" }, @@ -8721,14 +7979,10 @@ static const I18nPair kBuiltin_bg[] = { { "Send advert now", "Изпрати advert" }, { "Send an advert now, or set how often you re-advertise.", "Изпратете advert сега или задайте колко често го повтаряте." }, { "Send failed", "Изпращането неуспешно" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Подателят е блокиран" }, { "Sensors tab: off (restart to apply)", "Раздел сензори: изключен (рестарт за прилагане)" }, { "Sensors tab: on (restart to apply)", "Раздел сензори: включен (рестарт за прилагане)" }, { "Sent", "Изпратено" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Задай" }, { "Set an SSID first", "Първо задайте SSID" }, { "Set as notification sound", "Задай като звук за известие" }, @@ -8739,8 +7993,6 @@ static const I18nPair kBuiltin_bg[] = { { "Share QR", "Сподели QR" }, { "Share channel", "Сподели канала" }, { "Share location in advert", "Споделяй местоположението в advert" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Сподели ключа" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Споделете 32-символната тайна, за да се присъединят други. Празно = случайна." }, { "Share: %s", "Споделяне: %s" }, @@ -8759,7 +8011,6 @@ static const I18nPair kBuiltin_bg[] = { { "Slot %d cleared", "Слот %d изчистен" }, { "Slot empty", "Слотът е празен" }, { "Small\nMedium\nLarge", "Малък\nСреден\nГолям" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — плъзни или завърти трекбола" }, { "Sort", "Сортирай" }, { "Sound", "Звук" }, @@ -8773,7 +8024,6 @@ static const I18nPair kBuiltin_bg[] = { { "Step 3 of 3", "Стъпка 3 от 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Все още се анализира предишният\nпът… опитайте пак след малко." }, { "Stop", "Спри" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Хранилище" }, { "Store", "Магазин" }, { "Store data on SD (reboot)", "Съхранявай данните на SD (рестарт)" }, @@ -8786,8 +8036,6 @@ static const I18nPair kBuiltin_bg[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nWS клиенти %d GPS %s Зумер %s" }, { "TCP off", "TCP изкл" }, { "TCP on", "TCP вкл" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Клавиши за раздела — докосни ред, после натисни клавиш" }, { "Tap Use to switch - the device reboots to apply.", "Натиснете „Избери“, за да превключите — устройството ще се рестартира." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Докосни «Избери» за смяна - устройството се рестартира. Езиковите файлове са в /lang в паметта; редактирай ги или добави свои." }, @@ -8867,20 +8115,15 @@ static const I18nPair kBuiltin_bg[] = { { "Username (optional)", "Потребителско име (по избор)" }, { "Volume", "Сила на звука" }, { "W up · A left · D right · Z down · S select · Q back", "W нагоре · A ляво · D дясно · Z надолу · S избор · Q назад" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Изчакване на Wi-Fi..." }, { "Welcome to WADAMESH", "Добре дошли в WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Докато е включено, всеки в твоята Wi-Fi мрежа може да гледа и управлява устройството. Използва обикновен HTTP (само локална мрежа)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi и Bluetooth" }, { "Wi-Fi is not enabled in this build.", "Wi-Fi не е разрешен в тази компилация." }, { "Wi-Fi isn't available on this build.", "Wi-Fi не е наличен в тази компилация." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Нужен е Wi-Fi за профила на\nтерена за този път.\nСвържете в Настройки → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi не е свързан" }, { "Wi-Fi off", "Wi-Fi изкл" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi вкл" }, { "Wi-Fi on, scanning…", "Wi-Fi вкл, сканиране…" }, { "Wi-Fi saved (radio off)", "Wi-Fi запазен (радио изкл)" }, @@ -8893,7 +8136,6 @@ static const I18nPair kBuiltin_bg[] = { { "Zero-hop", "Без препредаване" }, { "Zero-hop advert sent", "Zero-hop advert изпратен" }, { "Zoom: +/- buttons", "Мащаб: бутони +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "клиент свързан" }, { "command", "команда" }, { "contacts (%d):", "контакти (%d):" }, @@ -8907,7 +8149,6 @@ static const I18nPair kBuiltin_bg[] = { { "hold Backspace to unlock", "задръж Backspace за отключване" }, { "hold the d-pad to unlock", "задръж d-pad за отключване" }, { "hold the trackball to unlock", "задръжте топчето за отключване" }, - { "kHz", "kHz" }, { "keep holding", "задръжте" }, { "last wake: ", "последно събуждане: " }, { "leave empty to generate", "оставете празно за генериране" }, @@ -8917,7 +8158,6 @@ static const I18nPair kBuiltin_bg[] = { { "min (0=off)", "мин (0=изкл)" }, { "mkdir failed", "Създаването на папка неуспешно" }, { "n/a in this build", "н/п в тази компилация" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "сега в канал %s" }, { "now talking to %s", "сега говорите с %s" }, { "off", "изключен" }, @@ -8936,44 +8176,30 @@ static const I18nPair kBuiltin_bg[] = { { "zoom", "мащаб" }, { "zoom %d", "мащаб %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "усилвател ~17 dB за тихи/отдалечени места; изключи в шумни." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_sr[] = { { " (device behind)", " (уређај касни)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d тачака покривености · %lu уписано на SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: чекање GPS-а…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d на мапи" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d у близини (%d рпт, %d комп)" }, { "%u types · hops %u · manual %s", "%u типова · хопови %u · ручно %s" }, { "(RTC unset)", "(RTC није постављен)" }, { "(device behind)", "(уређај заостаје)" }, { "(no default)", "(нема подразумеваног)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 бајт (старо)\n2 бајта\n3 бајта" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nБез ограничења" }, { "12-hour clock", "12-часовни формат" }, { "32 hex characters", "32 hex знака" }, { "32-hex secret. Anyone with this can read the channel.", "32-hex тајна. Свако с њом може читати канал." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Помињања" }, { "@ mention sound", "Звук за @ помињање" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "АУТОМАТСКИ АДВЕРТИ" }, { "About", "О програму" }, { "About the map", "О мапи" }, { "Accent popups", "Искачући акценти" }, { "Accent popups: off", "Искачући акценти: искљ" }, { "Accent popups: on", "Искачући акценти: укљ" }, - { "Ack", "Ack" }, { "Active", "Активно" }, { "Add", "Додај" }, { "Add channel", "Додај канал" }, @@ -8982,14 +8208,11 @@ static const I18nPair kBuiltin_sr[] = { { "Added to contacts", "Додато у контакте" }, { "Added to favorites", "Додато у омиљене" }, { "Admin", "Админ" }, - { "Advert", "Advert" }, { "Advert failed", "Advert није успео" }, { "Advert location", "Локација advert-а" }, { "Advert policy saved", "Правило за advert сачувано" }, { "Advert sent", "Advert послат" }, - { "All", "All" }, { "All marked read", "Све означено" }, - { "Allow", "Allow" }, { "Already exists", "Већ постоји" }, { "Already exists or table full.", "Већ постоји или је табела пуна." }, { "Already in contacts", "Већ у контактима" }, @@ -9000,13 +8223,11 @@ static const I18nPair kBuiltin_sr[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Свако може да се придружи. Кључ из хаштага (мала слова)." }, { "App drawer as home", "Фиока апликација као почетни екран" }, { "App icon size", "Величина икона апликација" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Важи након рестарта." }, { "Apply", "Примени" }, { "Apply auto-poll", "Примени ауто-упит" }, { "Apply radio params", "Примени радио параметре" }, { "Apps", "Апликације" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Стрелице + Enter увек раде. Ова слова су додатак — додирни ред, па притисни тастер." }, { "Auto advert", "Аутоматски оглас" }, { "Auto chat", "Ауто ћаскање" }, @@ -9029,14 +8250,12 @@ static const I18nPair kBuiltin_sr[] = { { "Available", "Доступне" }, { "BLE off", "BLE искљ" }, { "BLE on", "BLE укљ" }, - { "BT", "BT" }, { "Back", "Назад" }, { "Backups", "Резервне копије" }, { "Battery", "Батерија" }, { "Battery & power history", "Историја батерије и напајања" }, { "Battery (V)", "Батерија (V)" }, { "Battery calibration reset to default", "Калибрација батерије ресетована" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Очитавање прениско — прво напуните" }, { "Battery saver (experimental)", "Уштеда батерије (експериментално)" }, { "Battery — last 24h", "Батерија — последња 24 ч" }, @@ -9049,7 +8268,6 @@ static const I18nPair kBuiltin_sr[] = { { "Blocking unsupported", "Блокирање није подржано" }, { "Blue battery Last 6 min", "Плаво — батерија Последњих 6 мин" }, { "Blue battery Orange temp Cyan humidity", "Плаво — батерија Наранџасто — темп. Цијан — влажност" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth већ искључен" }, { "Bluetooth already on", "Bluetooth већ укључен" }, { "Bluetooth off", "Bluetooth искљ" }, @@ -9059,7 +8277,6 @@ static const I18nPair kBuiltin_sr[] = { { "Buffered receive (experimental)", "Баферовани пријем (експериментално)" }, { "Built-in", "Уграђен" }, { "Built-in (default)", "Уграђен (подразумевано)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Калибриши батерију (пуна = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Калибрисано: 100%% = %u.%02u V (дуго за ресет)" }, { "Can't block — not a contact", "Не могу да блокирам — није контакт" }, @@ -9156,7 +8373,6 @@ static const I18nPair kBuiltin_sr[] = { { "Cut", "Исеци" }, { "Cut - Paste in a folder", "Исечено - налепи у фасциклу" }, { "DM sound", "Звук за DM" }, - { "DND", "DND" }, { "Danger zone", "Опасна зона" }, { "Data -> SD card on reboot\n(card must be inserted)", "Подаци -> SD картица при рестарту\n(потребна картица)" }, { "Data -> internal on reboot", "Подаци -> интерно при рестарту" }, @@ -9213,7 +8429,6 @@ static const I18nPair kBuiltin_sr[] = { { "Enter SSID first", "Прво унесите SSID" }, { "Enter a name", "Унесите име" }, { "Enter a network name", "Унесите име мреже" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Enter додаје нови ред" }, { "Enter exactly 32 hex characters.", "Унесите тачно 32 hex знака." }, { "Enter key sends message", "Тастер Enter шаље поруку" }, @@ -9257,7 +8472,6 @@ static const I18nPair kBuiltin_sr[] = { { "Format failed (no card / SD error)", "Форматирање није успело (нема картице / SD грешка)" }, { "Frequency / bandwidth", "Фреквенција / опсег" }, { "Full", "Пуно" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Зујалица %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Зујалица %s\n%s" }, { "GPS off", "GPS искљ" }, @@ -9291,7 +8505,6 @@ static const I18nPair kBuiltin_sr[] = { { "Idle power-save", "Уштеда енергије у мировању" }, { "Idle sleep disabled", "Спавање у мировању искључено" }, { "Idle sleep enabled", "Спавање у мировању укључено" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Слика превелика (>4 MB)" }, { "Import", "Увези" }, { "Import backup", "Увези резервну копију" }, @@ -9323,7 +8536,6 @@ static const I18nPair kBuiltin_sr[] = { { "Join network", "Придружи се мрежи" }, { "Join private channel", "Придружи се приватном каналу" }, { "Join the public channel", "Придружи се јавном каналу" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Придружено %.40s" }, { "Keep per chat (messages)", "Чувај по ћаскању (порука)" }, { "Key already in use", "Кључ је већ у употреби" }, @@ -9335,7 +8547,6 @@ static const I18nPair kBuiltin_sr[] = { { "Keyboard nav: WASDZ on", "Навиг. тастатуром: WASDZ укљ." }, { "Keyboard nav: off", "Навиг. тастатуром: искљ." }, { "Keyboard navigation", "Навигација тастатуром" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Оптичка видљивост → %s" }, { "Landscape (desktop)", "Положено (десктоп)" }, { "Landscape set - applies when remote mode starts.", "Положено подешено - важи кад крене даљински режим." }, @@ -9356,11 +8567,6 @@ static const I18nPair kBuiltin_sr[] = { { "Loading...", "Учитавање..." }, { "Local every", "Локално сваких" }, { "Local sensors", "Локални сензори" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Закључај" }, { "Lock screen", "Закључани екран" }, { "Lock screen wallpaper", "Позадина закључаног екрана" }, @@ -9383,12 +8589,9 @@ static const I18nPair kBuiltin_sr[] = { { "Logs", "Дневници" }, { "Longitude", "Географска дужина" }, { "Lua Store", "Lua продавница" }, - { "MHz", "MHz" }, { "MQTT bridge", "MQTT мост" }, { "Map", "Мапа" }, { "Map options", "Опције мапе" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Грешка складишта мапе.\n\nSD картица откривена, али кеш\nплочица није монтиран.\nРестартујте за поновни покушај." }, { "Map storage error.\nReflash the tiles partition.", "Грешка складишта мапе.\nПоново флешујте tiles партицију." }, { "Map tiles: microSD", "Плочице: microSD" }, @@ -9400,7 +8603,6 @@ static const I18nPair kBuiltin_sr[] = { { "Mark as read", "Означи као прочитано" }, { "Mark read", "Означи прочитано" }, { "Marked read", "Означено прочитаним" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Макс. скокова (0..64)" }, { "Max zoom for this pack", "Макс. зум за овај пакет" }, { "Memory detail", "Детаљи меморије" }, @@ -9416,7 +8618,6 @@ static const I18nPair kBuiltin_sr[] = { { "Min zoom for this pack", "Мин. зум за овај пакет" }, { "Mode: BLE starting / low memory", "Режим: BLE стартује / мало меморије" }, { "Model:", "Модел:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Више ACK" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Мулти-ack %s · Понови %s · RX boost %s" }, { "Multi-byte routing (path hash)", "Вишебајтно рутирање (хеш путање)" }, @@ -9433,7 +8634,6 @@ static const I18nPair kBuiltin_sr[] = { { "Nearby on map", "У близини на мапи" }, { "Network name", "Назив мреже" }, { "Network name (SSID)", "Назив мреже (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Ново" }, { "New DM", "Нова ДП" }, { "New channel msg", "Нова порука канала" }, @@ -9452,7 +8652,6 @@ static const I18nPair kBuiltin_sr[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "Нема JPEG у /lock/.\nДодајте слике преко менаџера\nдатотека или SD картице." }, { "No SD card", "Нема SD картице" }, { "No SD card (or unreadable format)", "Нема SD картице (или нечитљив формат)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Још нема копија. Додирните «Нова копија» изнад да направите." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Још нема историје батерије.\n\nБележи се сваких 5 минута." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Нема блокираних корисника.\n\nДуго притисните поруку и додирните\nБлокирај да додате једног." }, @@ -9470,10 +8669,8 @@ static const I18nPair kBuiltin_sr[] = { { "No onboard GPS", "Нема уграђеног GPS" }, { "No other networks found", "Нема других мрежа" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Још нема позиције. Хладан старт тражи чист поглед на небо и може да потраје неколико минута." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Нема одговора од %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Нема одговора. Проверите лозинку, сервер\nили сат уређаја (уређај: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Овде нема сачуваних плочица.\n\nПовежите се на Wi-Fi (Подешавања → Wi-Fi)\nда преузмете ову област.\nСачуване плочице остају доступне ван мреже." }, { "No system time yet", "Још нема системског времена" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Нема телеметрије у овом прозору.\nЗатражите је или проширите опсег испод." }, @@ -9485,7 +8682,6 @@ static const I18nPair kBuiltin_sr[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Нема довољно меморије за Bluetooth. Прво искључите Wi-Fi." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Нема довољно меморије за Wi-Fi. Прво искључите Bluetooth." }, { "Not enough free memory to fetch it. Reboot and try again.", "Нема довољно слободне меморије за преузимање. Поново покрените и покушајте опет." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Ништа није изабрано" }, { "Notification sound set", "Звук обавештења постављен" }, { "Notify on new contact", "Обавести о новом контакту" }, @@ -9529,7 +8725,6 @@ static const I18nPair kBuiltin_sr[] = { { "Path reset failed", "Ресет путање није успео" }, { "Paused — score %d", "Паузирано — резултат %d" }, { "Per-transmit switching on", "Пребацивање по предаји укљ." }, - { "Perf:", "Perf:" }, { "Pick colour", "Изабери боју" }, { "Ping", "Пинг" }, { "Ping failed", "Ping није успео" }, @@ -9542,11 +8737,9 @@ static const I18nPair kBuiltin_sr[] = { { "Port", "Порт" }, { "Portrait set - applies when remote mode starts.", "Усправно подешено - важи кад крене даљински режим." }, { "Position saved", "Позиција сачувана" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Напајање" }, { "Power off", "Искључи" }, { "Powering off… click trackball to wake", "Гашење… кликните куглицу за буђење" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Притисните тастер…" }, { "Probe now", "Измери сада" }, { "Probing neighbours…", "Испитивање суседа…" }, @@ -9561,7 +8754,6 @@ static const I18nPair kBuiltin_sr[] = { { "Purge all discovered nodes?", "Обрисати све откривене чворове?" }, { "Quick replies", "Брзи одговори" }, { "Quick reply", "Брз одговор" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d уноса · Raw %d уноса" }, { "RX boosted gain", "Појачан RX" }, { "RX log", "RX дневник" }, @@ -9575,9 +8767,6 @@ static const I18nPair kBuiltin_sr[] = { { "RangeTest sent (direct)", "RangeTest послат (директно)" }, { "RangeTest sent (flood)", "RangeTest послат (flood)" }, { "Raw log", "Сирови дневник" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Чита пакете у позадинском задатку да их заузет екран не изгуби." }, { "Reboot", "Рестартуј" }, { "Reboot device", "Рестартуј уређај" }, @@ -9585,10 +8774,8 @@ static const I18nPair kBuiltin_sr[] = { { "Rebooting…", "Рестартовање…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Прими необјављени тест firmware — новије функције, али мање тестиране. Провера и инсталација прате бета канал." }, { "Recently heard", "Недавно чути" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Форматирати SD као MESHCOMOD (FAT32)?\nСВИ подаци на картици биће обрисани." }, { "Region & scope", "Регион и опсег" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Опсег региона (#tag) за овај канал.\nПразно = подразумевани опсег." }, { "Region scope (#tag), blank = default.", "Опсег региона (#tag), празно = подразумевано." }, { "Region scope (#tag, blank = none)", "Опсег региона (#tag, празно = ниједан)" }, @@ -9627,16 +8814,12 @@ static const I18nPair kBuiltin_sr[] = { { "SD card %s", "SD картица %s" }, { "SD card %s (hold: format)", "SD картица %s (држи: формат)" }, { "SD card (tap to mount)", "SD картица (додирни за монтирање)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "SD картица убачена" }, { "SD card lost - reinsert to recover", "SD картица изгубљена - убаците поново" }, { "SD card remounted", "SD картица поново монтирана" }, { "SD card removed", "SD картица уклоњена" }, { "SD download failed: %s", "Преузимање на SD није успело: %s" }, { "SD formatted - %s (MESHCOMOD)", "SD форматирана - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB заузето" }, { "SSID set — enter password, then Save", "SSID постављен — унесите лозинку, па Сачувај" }, { "SSID too long", "SSID предуг" }, @@ -9661,8 +8844,6 @@ static const I18nPair kBuiltin_sr[] = { { "Saved — rebooting", "Сачувано — рестарт" }, { "Saved — reconnecting…", "Сачувано — поновно повезивање…" }, { "Saved: %s\nFlash it from the Launcher.", "Сачувано: %s\nФлешујте га из Launcher-а." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Чување на SD… %d%%" }, { "Saving to SD… 0%", "Чување на SD… 0%" }, { "Scan to open on phone", "Скенирај да отвориш на телефону" }, @@ -9693,14 +8874,10 @@ static const I18nPair kBuiltin_sr[] = { { "Send advert now", "Пошаљи advert" }, { "Send an advert now, or set how often you re-advertise.", "Пошаљите advert сада или подесите колико често га понављате." }, { "Send failed", "Слање није успело" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Пошиљалац блокиран" }, { "Sensors tab: off (restart to apply)", "Картица сензора: искључено (рестарт за примену)" }, { "Sensors tab: on (restart to apply)", "Картица сензора: укључено (рестарт за примену)" }, { "Sent", "Послато" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Постави" }, { "Set an SSID first", "Прво поставите SSID" }, { "Set as notification sound", "Постави као звук обавештења" }, @@ -9711,8 +8888,6 @@ static const I18nPair kBuiltin_sr[] = { { "Share QR", "Подели QR" }, { "Share channel", "Подели канал" }, { "Share location in advert", "Дели локацију у advert-у" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Подели тајну" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Поделите тајну од 32 знака да се други придруже. Празно = насумична." }, { "Share: %s", "Подели: %s" }, @@ -9731,7 +8906,6 @@ static const I18nPair kBuiltin_sr[] = { { "Slot %d cleared", "Слот %d обрисан" }, { "Slot empty", "Слот празан" }, { "Small\nMedium\nLarge", "Мали\nСредњи\nВелики" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — превуци или заврти трекбол" }, { "Sort", "Сортирај" }, { "Sound", "Звук" }, @@ -9745,7 +8919,6 @@ static const I18nPair kBuiltin_sr[] = { { "Step 3 of 3", "Корак 3 од 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Још се анализира претходна\nпутања… покушајте ускоро." }, { "Stop", "Заустави" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Складиште" }, { "Store", "Продавница" }, { "Store data on SD (reboot)", "Чувај податке на SD (рестарт)" }, @@ -9758,8 +8931,6 @@ static const I18nPair kBuiltin_sr[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nWS клијенти %d GPS %s Зујалица %s" }, { "TCP off", "TCP искљ" }, { "TCP on", "TCP укљ" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Пречице картице — додирни ред, па притисни тастер" }, { "Tap Use to switch - the device reboots to apply.", "Додирните „Користи“ да промените — уређај ће се поново покренути." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Додирни «Користи» за промену - уређај се поново покреће. Датотеке језика су у /lang на меморији; уреди их или додај своје." }, @@ -9839,20 +9010,15 @@ static const I18nPair kBuiltin_sr[] = { { "Username (optional)", "Корисничко име (опционо)" }, { "Volume", "Јачина звука" }, { "W up · A left · D right · Z down · S select · Q back", "W горе · A лево · D десно · Z доле · S избор · Q назад" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Чекање Wi-Fi..." }, { "Welcome to WADAMESH", "Добро дошли у WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Док је ово укључено, свако на твом Wi-Fi-ју може да види и контролише уређај. Користи обичан HTTP (само локална мрежа)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi и Bluetooth" }, { "Wi-Fi is not enabled in this build.", "Wi-Fi није омогућен у овом билду." }, { "Wi-Fi isn't available on this build.", "Wi-Fi није доступан на овом билду." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Потребан Wi-Fi за профил\nтерена ове путање.\nПовежите у Подешавања → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi није повезан" }, { "Wi-Fi off", "Wi-Fi искљ" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi укљ" }, { "Wi-Fi on, scanning…", "Wi-Fi укључен, тражим…" }, { "Wi-Fi saved (radio off)", "Wi-Fi сачуван (радио искљ)" }, @@ -9865,7 +9031,6 @@ static const I18nPair kBuiltin_sr[] = { { "Zero-hop", "Без скока" }, { "Zero-hop advert sent", "Zero-hop advert послат" }, { "Zoom: +/- buttons", "Зум: тастери +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "клијент повезан" }, { "command", "команда" }, { "contacts (%d):", "контакти (%d):" }, @@ -9879,7 +9044,6 @@ static const I18nPair kBuiltin_sr[] = { { "hold Backspace to unlock", "држи Backspace за откључавање" }, { "hold the d-pad to unlock", "држи d-pad за откључавање" }, { "hold the trackball to unlock", "држите куглицу да откључате" }, - { "kHz", "kHz" }, { "keep holding", "држите" }, { "last wake: ", "последње буђење: " }, { "leave empty to generate", "оставите празно за генерисање" }, @@ -9889,7 +9053,6 @@ static const I18nPair kBuiltin_sr[] = { { "min (0=off)", "мин (0=искљ)" }, { "mkdir failed", "Прављење фасцикле није успело" }, { "n/a in this build", "н/д у овом билду" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "сада на каналу %s" }, { "now talking to %s", "сада причате са %s" }, { "off", "искључен" }, @@ -9908,44 +9071,30 @@ static const I18nPair kBuiltin_sr[] = { { "zoom", "зум" }, { "zoom %d", "зум %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "појачало ~17 dB за тиха/удаљена места; искључи у бучним." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_el[] = { { " (device behind)", " (συσκευή πίσω)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d σημεία κάλυψης · %lu στην SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: αναμονή στίγματος GPS…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d στον χάρτη" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d κοντά (%d rpt, %d comp)" }, { "%u types · hops %u · manual %s", "%u τύποι · άλματα %u · χειροκίνητα %s" }, { "(RTC unset)", "(RTC μη ορισμένο)" }, { "(device behind)", "(συσκευή πίσω)" }, { "(no default)", "(χωρίς προεπιλογή)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 byte (παλαιό)\n2 bytes\n3 bytes" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nΧωρίς όριο" }, { "12-hour clock", "Ρολόι 12 ωρών" }, { "32 hex characters", "32 hex χαρακτήρες" }, { "32-hex secret. Anyone with this can read the channel.", "Μυστικό 32 hex. Όποιος το έχει διαβάζει το κανάλι." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Αναφορές" }, { "@ mention sound", "Ήχος αναφορών @" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "ΑΥΤΟΜΑΤΑ ADVERTS" }, { "About", "Σχετικά" }, { "About the map", "Σχετικά με τον χάρτη" }, { "Accent popups", "Αναδυόμενα τόνων" }, { "Accent popups: off", "Αναδυόμενα τόνων: όχι" }, { "Accent popups: on", "Αναδυόμενα τόνων: ναι" }, - { "Ack", "Ack" }, { "Active", "Ενεργό" }, { "Add", "Προσθήκη" }, { "Add channel", "Προσθήκη καναλιού" }, @@ -9954,14 +9103,11 @@ static const I18nPair kBuiltin_el[] = { { "Added to contacts", "Προστέθηκε στις επαφές" }, { "Added to favorites", "Προστέθηκε στα αγαπημένα" }, { "Admin", "Διαχείριση" }, - { "Advert", "Advert" }, { "Advert failed", "Αποτυχία advert" }, { "Advert location", "Τοποθεσία advert" }, { "Advert policy saved", "Η πολιτική advert αποθηκεύτηκε" }, { "Advert sent", "Στάλθηκε advert" }, - { "All", "All" }, { "All marked read", "Όλα ως αναγνωσμένα" }, - { "Allow", "Allow" }, { "Already exists", "Υπάρχει ήδη" }, { "Already exists or table full.", "Υπάρχει ήδη ή ο πίνακας είναι πλήρης." }, { "Already in contacts", "Ήδη στις επαφές" }, @@ -9972,13 +9118,11 @@ static const I18nPair kBuiltin_el[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Όλοι μπορούν να συμμετάσχουν. Κλειδί από το hashtag (πεζά)." }, { "App drawer as home", "Συρτάρι εφαρμογών ως αρχική" }, { "App icon size", "Μέγεθος εικονιδίων εφαρμογών" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Ισχύει μετά την επανεκκίνηση." }, { "Apply", "Εφαρμογή" }, { "Apply auto-poll", "Εφαρμογή auto-poll" }, { "Apply radio params", "Εφαρμογή παραμέτρων ράδιο" }, { "Apps", "Εφαρμογές" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Βέλη + Enter λειτουργούν πάντα. Τα γράμματα είναι έξτρα — αγγίξτε μια γραμμή και πατήστε ένα πλήκτρο." }, { "Auto advert", "Αυτόματη ανακοίνωση" }, { "Auto chat", "Αυτόματη συνομιλία" }, @@ -10001,14 +9145,12 @@ static const I18nPair kBuiltin_el[] = { { "Available", "Διαθέσιμες" }, { "BLE off", "BLE όχι" }, { "BLE on", "BLE ναι" }, - { "BT", "BT" }, { "Back", "Πίσω" }, { "Backups", "Αντίγραφα" }, { "Battery", "Μπαταρία" }, { "Battery & power history", "Ιστορικό μπαταρίας & τροφοδοσίας" }, { "Battery (V)", "Μπαταρία (V)" }, { "Battery calibration reset to default", "Επαναφορά βαθμονόμησης μπαταρίας" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Πολύ χαμηλή μέτρηση — φορτίστε πρώτα" }, { "Battery saver (experimental)", "Εξοικονόμηση μπαταρίας (πειραματικό)" }, { "Battery — last 24h", "Μπαταρία — τελευταίο 24ωρο" }, @@ -10021,7 +9163,6 @@ static const I18nPair kBuiltin_el[] = { { "Blocking unsupported", "Ο αποκλεισμός δεν υποστηρίζεται" }, { "Blue battery Last 6 min", "Μπλε μπαταρία Τελευταία 6 λεπ." }, { "Blue battery Orange temp Cyan humidity", "Μπλε μπαταρία Πορτοκαλί θερμ. Κυανό υγρασία" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Το Bluetooth είναι ήδη ανενεργό" }, { "Bluetooth already on", "Το Bluetooth είναι ήδη ενεργό" }, { "Bluetooth off", "Bluetooth όχι" }, @@ -10031,7 +9172,6 @@ static const I18nPair kBuiltin_el[] = { { "Buffered receive (experimental)", "Λήψη με buffer (πειραματικό)" }, { "Built-in", "Ενσωματωμένο" }, { "Built-in (default)", "Ενσωματωμένο (προεπιλογή)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Βαθμονόμηση μπαταρίας (πλήρης = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Βαθμονομήθηκε: 100%% = %u.%02u V (παρατεταμένο για επαναφορά)" }, { "Can't block — not a contact", "Αδυναμία αποκλεισμού — δεν είναι επαφή" }, @@ -10128,7 +9268,6 @@ static const I18nPair kBuiltin_el[] = { { "Cut", "Αποκοπή" }, { "Cut - Paste in a folder", "Αποκόπηκε - επικολλήστε σε φάκελο" }, { "DM sound", "Ήχος DM" }, - { "DND", "DND" }, { "Danger zone", "Ζώνη κινδύνου" }, { "Data -> SD card on reboot\n(card must be inserted)", "Δεδομένα -> κάρτα SD στην επανεκκίνηση\n(απαιτείται κάρτα)" }, { "Data -> internal on reboot", "Δεδομένα -> εσωτερικά στην επανεκκίνηση" }, @@ -10185,7 +9324,6 @@ static const I18nPair kBuiltin_el[] = { { "Enter SSID first", "Εισαγάγετε πρώτα το SSID" }, { "Enter a name", "Εισαγάγετε όνομα" }, { "Enter a network name", "Εισαγάγετε όνομα δικτύου" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Το Enter προσθέτει γραμμή" }, { "Enter exactly 32 hex characters.", "Εισαγάγετε ακριβώς 32 hex χαρακτήρες." }, { "Enter key sends message", "Το πλήκτρο Enter στέλνει το μήνυμα" }, @@ -10215,9 +9353,7 @@ static const I18nPair kBuiltin_el[] = { { "Find", "Εύρεση" }, { "Finish", "Τέλος" }, { "Firmware beta_%d\nCouldn't reach the update server", "Firmware beta_%d\nΑδυναμία πρόσβασης στον διακομιστή" }, - { "Firmware:", "Firmware:" }, { "Flash on new message", "Αναβόσβημα σε νέο μήνυμα" }, - { "Flood", "Flood" }, { "Flood advert sent", "Στάλθηκε flood advert" }, { "Flood every", "Flood κάθε" }, { "Flood: relayed across the mesh (multi-hop).\nZero-hop: neighbours only (no relaying).", "Flood: αναμετάδοση στο mesh (πολλαπλά άλματα).\nZero-hop: μόνο γείτονες (χωρίς αναμετάδοση)." }, @@ -10229,7 +9365,6 @@ static const I18nPair kBuiltin_el[] = { { "Format failed (no card / SD error)", "Αποτυχία διαμόρφωσης (χωρίς κάρτα / σφάλμα SD)" }, { "Frequency / bandwidth", "Συχνότητα / εύρος ζώνης" }, { "Full", "Πλήρες" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Βομβητής %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Βομβητής %s\n%s" }, { "GPS off", "GPS όχι" }, @@ -10263,7 +9398,6 @@ static const I18nPair kBuiltin_el[] = { { "Idle power-save", "Εξοικονόμηση σε αδράνεια" }, { "Idle sleep disabled", "Αναστολή σε αδράνεια απενεργ." }, { "Idle sleep enabled", "Αναστολή σε αδράνεια ενεργή" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Πολύ μεγάλη εικόνα (>4 MB)" }, { "Import", "Εισαγωγή" }, { "Import backup", "Εισαγωγή αντιγράφου" }, @@ -10295,7 +9429,6 @@ static const I18nPair kBuiltin_el[] = { { "Join network", "Σύνδεση σε δίκτυο" }, { "Join private channel", "Συμμετοχή σε ιδιωτικό κανάλι" }, { "Join the public channel", "Είσοδος στο δημόσιο κανάλι" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Συμμετοχή σε %.40s" }, { "Keep per chat (messages)", "Διατήρηση ανά συνομιλία (μηνύματα)" }, { "Key already in use", "Το κλειδί χρησιμοποιείται ήδη" }, @@ -10307,7 +9440,6 @@ static const I18nPair kBuiltin_el[] = { { "Keyboard nav: WASDZ on", "Πλοήγηση πληκτρ.: WASDZ ενεργό" }, { "Keyboard nav: off", "Πλοήγηση πληκτρ.: κλειστό" }, { "Keyboard navigation", "Πλοήγηση με πληκτρολόγιο" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Οπτική επαφή → %s" }, { "Landscape (desktop)", "Οριζόντια (desktop)" }, { "Landscape set - applies when remote mode starts.", "Ορίστηκε οριζόντια - ισχύει όταν ξεκινήσει η απομακρυσμένη λειτουργία." }, @@ -10328,11 +9460,6 @@ static const I18nPair kBuiltin_el[] = { { "Loading...", "Φόρτωση..." }, { "Local every", "Τοπικά κάθε" }, { "Local sensors", "Τοπικοί αισθητήρες" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Κλείδωμα" }, { "Lock screen", "Οθόνη κλειδώματος" }, { "Lock screen wallpaper", "Ταπετσαρία οθόνης κλειδώματος" }, @@ -10355,12 +9482,9 @@ static const I18nPair kBuiltin_el[] = { { "Logs", "Αρχεία καταγραφής" }, { "Longitude", "Γεωγραφικό μήκος" }, { "Lua Store", "Κατάστημα Lua" }, - { "MHz", "MHz" }, { "MQTT bridge", "Γέφυρα MQTT" }, { "Map", "Χάρτης" }, { "Map options", "Επιλογές χάρτη" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Σφάλμα αποθήκευσης χάρτη.\n\nΕντοπίστηκε κάρτα SD αλλά η\nμνήμη πλακιδίων δεν προσαρτήθηκε.\nΕπανεκκίνηση για νέα προσπάθεια." }, { "Map storage error.\nReflash the tiles partition.", "Σφάλμα αποθήκευσης χάρτη.\nΞαναφλασάρετε το tiles partition." }, { "Map tiles: microSD", "Πλακίδια: microSD" }, @@ -10372,7 +9496,6 @@ static const I18nPair kBuiltin_el[] = { { "Mark as read", "Σήμανση ως αναγνωσμένο" }, { "Mark read", "Σήμανση ως αναγνωσμένο" }, { "Marked read", "Σημειώθηκε ως αναγνωσμένο" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Μέγ. άλματα (0..64)" }, { "Max zoom for this pack", "Μέγ. ζουμ για αυτό το πακέτο" }, { "Memory detail", "Λεπτομέρειες μνήμης" }, @@ -10388,7 +9511,6 @@ static const I18nPair kBuiltin_el[] = { { "Min zoom for this pack", "Ελάχ. ζουμ για αυτό το πακέτο" }, { "Mode: BLE starting / low memory", "Λειτουργία: BLE εκκινεί / λίγη μνήμη" }, { "Model:", "Μοντέλο:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "Πολλαπλά ACK" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Multi-ack %s · Επανάλ. %s · RX boost %s" }, { "Multi-byte routing (path hash)", "Δρομολόγηση πολλών byte (hash διαδρομής)" }, @@ -10405,7 +9527,6 @@ static const I18nPair kBuiltin_el[] = { { "Nearby on map", "Κοντά στον χάρτη" }, { "Network name", "Όνομα δικτύου" }, { "Network name (SSID)", "Όνομα δικτύου (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Νέο" }, { "New DM", "Νέο ΠΜ" }, { "New channel msg", "Νέο μήνυμα καναλιού" }, @@ -10424,7 +9545,6 @@ static const I18nPair kBuiltin_el[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "Δεν βρέθηκαν JPEG στο /lock/.\nΠροσθέστε εικόνες μέσω του\nδιαχειριστή αρχείων ή κάρτας SD." }, { "No SD card", "Χωρίς κάρτα SD" }, { "No SD card (or unreadable format)", "Χωρίς κάρτα SD (ή μη αναγνώσιμη μορφή)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Δεν υπάρχουν αντίγραφα. Πατήστε «Νέο αντίγραφο» πάνω για δημιουργία." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Δεν υπάρχει ιστορικό μπαταρίας.\n\nΚαταγραφή κάθε 5 λεπτά." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Κανένας αποκλεισμένος χρήστης.\n\nΠατήστε παρατεταμένα ένα μήνυμα και\nΑποκλεισμός για προσθήκη." }, @@ -10442,10 +9562,8 @@ static const I18nPair kBuiltin_el[] = { { "No onboard GPS", "Χωρίς ενσωματωμένο GPS" }, { "No other networks found", "Δεν βρέθηκαν άλλα δίκτυα" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Δεν υπάρχει ακόμη θέση. Η ψυχρή εκκίνηση θέλει ανοιχτό ουρανό και μπορεί να πάρει λεπτά." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Καμία απάντηση από %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Καμία απάντηση. Ελέγξτε κωδικό, διακομιστή\nή ρολόι συσκευής (συσκευή: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Δεν υπάρχουν αποθηκευμένα πλακίδια εδώ.\n\nΣυνδεθείτε στο Wi-Fi (Ρυθμίσεις → Wi-Fi)\nγια λήψη αυτής της περιοχής.\nΤα αποθηκευμένα πλακίδια μένουν διαθέσιμα εκτός σύνδεσης." }, { "No system time yet", "Δεν υπάρχει ακόμη ώρα συστήματος" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Δεν υπάρχει τηλεμετρία σε αυτό το παράθυρο.\nΖητήστε μία ή διευρύνετε το εύρος παρακάτω." }, @@ -10457,7 +9575,6 @@ static const I18nPair kBuiltin_el[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Ανεπαρκής μνήμη για Bluetooth. Απενεργοποιήστε πρώτα το Wi-Fi." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Ανεπαρκής μνήμη για Wi-Fi. Απενεργοποιήστε πρώτα το Bluetooth." }, { "Not enough free memory to fetch it. Reboot and try again.", "Δεν υπάρχει αρκετή ελεύθερη μνήμη για τη λήψη. Επανεκκινήστε και δοκιμάστε ξανά." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Τίποτα δεν επιλέχθηκε" }, { "Notification sound set", "Ήχος ειδοποίησης ορίστηκε" }, { "Notify on new contact", "Ειδοποίηση για νέα επαφή" }, @@ -10501,9 +9618,7 @@ static const I18nPair kBuiltin_el[] = { { "Path reset failed", "Αποτυχία επαναφοράς διαδρομής" }, { "Paused — score %d", "Σε παύση — σκορ %d" }, { "Per-transmit switching on", "Εναλλαγή ανά εκπομπή ενεργή" }, - { "Perf:", "Perf:" }, { "Pick colour", "Επιλογή χρώματος" }, - { "Ping", "Ping" }, { "Ping failed", "Αποτυχία ping" }, { "Pinged (direct) — waiting…", "Ping (άμεσο) — αναμονή…" }, { "Pinged (flood) — waiting…", "Ping (flood) — αναμονή…" }, @@ -10514,11 +9629,9 @@ static const I18nPair kBuiltin_el[] = { { "Port", "Θύρα" }, { "Portrait set - applies when remote mode starts.", "Ορίστηκε κατακόρυφη - ισχύει όταν ξεκινήσει η απομακρυσμένη λειτουργία." }, { "Position saved", "Η θέση αποθηκεύτηκε" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Ενέργεια" }, { "Power off", "Απενεργοποίηση" }, { "Powering off… click trackball to wake", "Απενεργοποίηση… κλικ στο trackball για αφύπνιση" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Πατήστε ένα πλήκτρο…" }, { "Probe now", "Μέτρηση τώρα" }, { "Probing neighbours…", "Έλεγχος γειτόνων…" }, @@ -10533,7 +9646,6 @@ static const I18nPair kBuiltin_el[] = { { "Purge all discovered nodes?", "Εκκαθάριση όλων των κόμβων που βρέθηκαν;" }, { "Quick replies", "Γρήγορες απαντήσεις" }, { "Quick reply", "Γρήγορη απάντηση" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d καταχωρήσεις · Raw %d καταχωρήσεις" }, { "RX boosted gain", "Ενισχυμένο κέρδος RX" }, { "RX log", "Αρχείο RX" }, @@ -10547,9 +9659,6 @@ static const I18nPair kBuiltin_el[] = { { "RangeTest sent (direct)", "Στάλθηκε RangeTest (άμεσο)" }, { "RangeTest sent (flood)", "Στάλθηκε RangeTest (flood)" }, { "Raw log", "Ακατέργαστο αρχείο" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Διαβάζει πακέτα σε εργασία παρασκηνίου ώστε μια απασχολημένη οθόνη να μην τα χάνει." }, { "Reboot", "Επανεκκίνηση" }, { "Reboot device", "Επανεκκίνηση συσκευής" }, @@ -10557,10 +9666,8 @@ static const I18nPair kBuiltin_el[] = { { "Rebooting…", "Επανεκκίνηση…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Λήψη μη κυκλοφορημένου δοκιμαστικού firmware — νεότερες λειτουργίες, αλλά λιγότερο δοκιμασμένες. Ο έλεγχος και η εγκατάσταση ακολουθούν το κανάλι beta." }, { "Recently heard", "Ακούστηκε πρόσφατα" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Επαναδιαμόρφωση SD ως MESHCOMOD (FAT32);\nΟΛΑ τα δεδομένα στην κάρτα θα διαγραφούν." }, { "Region & scope", "Περιοχή & εμβέλεια" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Εύρος περιοχής (#tag) για αυτό το κανάλι.\nΚενό = προεπιλεγμένο εύρος." }, { "Region scope (#tag), blank = default.", "Εύρος περιοχής (#tag), κενό = προεπιλογή." }, { "Region scope (#tag, blank = none)", "Εύρος περιοχής (#tag, κενό = κανένα)" }, @@ -10599,16 +9706,12 @@ static const I18nPair kBuiltin_el[] = { { "SD card %s", "Κάρτα SD %s" }, { "SD card %s (hold: format)", "Κάρτα SD %s (κράτημα: διαμόρφωση)" }, { "SD card (tap to mount)", "Κάρτα SD (πατήστε για προσάρτηση)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "Η κάρτα SD εισήχθη" }, { "SD card lost - reinsert to recover", "Η κάρτα SD χάθηκε - επανατοποθετήστε" }, { "SD card remounted", "Η κάρτα SD επανασυνδέθηκε" }, { "SD card removed", "Η κάρτα SD αφαιρέθηκε" }, { "SD download failed: %s", "Η λήψη στην SD απέτυχε: %s" }, { "SD formatted - %s (MESHCOMOD)", "SD διαμορφώθηκε - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB σε χρήση" }, { "SSID set — enter password, then Save", "Ορίστηκε SSID — εισαγάγετε κωδικό, μετά Αποθήκευση" }, { "SSID too long", "Το SSID είναι πολύ μακρύ" }, @@ -10633,8 +9736,6 @@ static const I18nPair kBuiltin_el[] = { { "Saved — rebooting", "Αποθηκεύτηκε — επανεκκίνηση" }, { "Saved — reconnecting…", "Αποθηκεύτηκε — επανασύνδεση…" }, { "Saved: %s\nFlash it from the Launcher.", "Αποθηκεύτηκε: %s\nΕγκαταστήστε το από τον Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Αποθήκευση στην SD… %d%%" }, { "Saving to SD… 0%", "Αποθήκευση στην SD… 0%" }, { "Scan to open on phone", "Σαρώστε για άνοιγμα στο κινητό" }, @@ -10665,14 +9766,10 @@ static const I18nPair kBuiltin_el[] = { { "Send advert now", "Αποστολή advert" }, { "Send an advert now, or set how often you re-advertise.", "Στείλτε ένα advert τώρα ή ορίστε πόσο συχνά επαναλαμβάνετε." }, { "Send failed", "Αποτυχία αποστολής" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Ο αποστολέας αποκλείστηκε" }, { "Sensors tab: off (restart to apply)", "Καρτέλα αισθητήρων: κλειστή (επανεκκίνηση για εφαρμογή)" }, { "Sensors tab: on (restart to apply)", "Καρτέλα αισθητήρων: ανοιχτή (επανεκκίνηση για εφαρμογή)" }, { "Sent", "Στάλθηκε" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Ορισμός" }, { "Set an SSID first", "Ορίστε πρώτα ένα SSID" }, { "Set as notification sound", "Ορισμός ως ήχος ειδοποίησης" }, @@ -10683,8 +9780,6 @@ static const I18nPair kBuiltin_el[] = { { "Share QR", "Κοινοποίηση QR" }, { "Share channel", "Κοινή χρήση καναλιού" }, { "Share location in advert", "Κοινή χρήση θέσης στο advert" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Κοινοποίηση μυστικού" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Μοιραστείτε το μυστικό 32 χαρακτήρων για να συμμετάσχουν άλλοι. Κενό = τυχαίο." }, { "Share: %s", "Κοινή χρήση: %s" }, @@ -10703,7 +9798,6 @@ static const I18nPair kBuiltin_el[] = { { "Slot %d cleared", "Η θέση %d εκκαθαρίστηκε" }, { "Slot empty", "Κενή θέση" }, { "Small\nMedium\nLarge", "Μικρό\nΜεσαίο\nΜεγάλο" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — σύρετε ή κυλήστε το trackball" }, { "Sort", "Ταξινόμηση" }, { "Sound", "Ήχος" }, @@ -10717,7 +9811,6 @@ static const I18nPair kBuiltin_el[] = { { "Step 3 of 3", "Βήμα 3 από 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Ακόμη αναλύεται η προηγούμενη\nδιαδρομή… δοκιμάστε σε λίγο." }, { "Stop", "Διακοπή" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Αποθηκευτικός χώρος" }, { "Store", "Κατάστημα" }, { "Store data on SD (reboot)", "Αποθήκευση δεδομένων σε SD (επανεκκίνηση)" }, @@ -10730,8 +9823,6 @@ static const I18nPair kBuiltin_el[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nΠελάτες WS %d GPS %s Βομβητής %s" }, { "TCP off", "TCP όχι" }, { "TCP on", "TCP ναι" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Πλήκτρα καρτέλας — πατήστε μια σειρά, μετά ένα πλήκτρο" }, { "Tap Use to switch - the device reboots to apply.", "Πατήστε Χρήση για αλλαγή — η συσκευή επανεκκινεί για να εφαρμοστεί." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Πατήστε Χρήση για αλλαγή - η συσκευή επανεκκινεί. Τα αρχεία γλώσσας βρίσκονται στο /lang· επεξεργαστείτε τα ή προσθέστε δικά σας." }, @@ -10811,20 +9902,14 @@ static const I18nPair kBuiltin_el[] = { { "Username (optional)", "Όνομα χρήστη (προαιρετικό)" }, { "Volume", "Ένταση" }, { "W up · A left · D right · Z down · S select · Q back", "W πάνω · A αριστερά · D δεξιά · Z κάτω · S επιλογή · Q πίσω" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Αναμονή για Wi-Fi..." }, { "Welcome to WADAMESH", "Καλώς ήρθατε στο WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Όσο είναι ενεργό, οποιοσδήποτε στο Wi-Fi σας μπορεί να βλέπει και να ελέγχει τη συσκευή. Απλό HTTP (μόνο τοπικό δίκτυο)." }, - { "Wi-Fi", "Wi-Fi" }, - { "Wi-Fi & Bluetooth", "Wi-Fi & Bluetooth" }, { "Wi-Fi is not enabled in this build.", "Το Wi-Fi δεν είναι ενεργό σε αυτή την έκδοση." }, { "Wi-Fi isn't available on this build.", "Το Wi-Fi δεν είναι διαθέσιμο σε αυτή την έκδοση." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "Απαιτείται Wi-Fi για το προφίλ\nεδάφους αυτής της διαδρομής.\nΣυνδεθείτε στις Ρυθμίσεις → Wi-Fi." }, { "Wi-Fi not connected", "Το Wi-Fi δεν συνδέθηκε" }, { "Wi-Fi off", "Wi-Fi όχι" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi ναι" }, { "Wi-Fi on, scanning…", "Wi-Fi ενεργό, σάρωση…" }, { "Wi-Fi saved (radio off)", "Το Wi-Fi αποθηκεύτηκε (ράδιο off)" }, @@ -10837,7 +9922,6 @@ static const I18nPair kBuiltin_el[] = { { "Zero-hop", "Χωρίς άλμα" }, { "Zero-hop advert sent", "Στάλθηκε zero-hop advert" }, { "Zoom: +/- buttons", "Ζουμ: κουμπιά +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "ο πελάτης συνδέθηκε" }, { "command", "εντολή" }, { "contacts (%d):", "επαφές (%d):" }, @@ -10851,7 +9935,6 @@ static const I18nPair kBuiltin_el[] = { { "hold Backspace to unlock", "κρατήστε Backspace για ξεκλείδωμα" }, { "hold the d-pad to unlock", "κρατήστε το d-pad για ξεκλείδωμα" }, { "hold the trackball to unlock", "κρατήστε το trackball για ξεκλείδωμα" }, - { "kHz", "kHz" }, { "keep holding", "κρατήστε πατημένο" }, { "last wake: ", "τελευταία αφύπνιση: " }, { "leave empty to generate", "κενό για δημιουργία" }, @@ -10861,7 +9944,6 @@ static const I18nPair kBuiltin_el[] = { { "min (0=off)", "λεπτά (0=ανενεργό)" }, { "mkdir failed", "Αποτυχία δημιουργίας φακέλου" }, { "n/a in this build", "μ/δ σε αυτή την έκδοση" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "τώρα στο κανάλι %s" }, { "now talking to %s", "τώρα μιλάτε με %s" }, { "off", "ανενεργός" }, @@ -10880,44 +9962,30 @@ static const I18nPair kBuiltin_el[] = { { "zoom", "ζουμ" }, { "zoom %d", "ζουμ %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "ενισχυτής ~17 dB για ήσυχες/απομακρυσμένες περιοχές· κλείστε σε θορυβώδεις." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_pt_br[] = { { " (device behind)", " (dispositivo atrasado)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d pontos de cobertura · %lu salvos no SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: aguardando fixação de GPS…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d no mapa" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d por perto (%d rpt, %d comp)" }, { "%u types · hops %u · manual %s", "%u tipos · saltos %u · manual %s" }, { "(RTC unset)", "(RTC não definido)" }, { "(device behind)", "(aparelho atrasado)" }, { "(no default)", "(sem padrão)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 byte (legado)\n2 bytes\n3 bytes" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nSem limite" }, { "12-hour clock", "Relógio de 12 horas" }, { "32 hex characters", "32 caracteres hex" }, { "32-hex secret. Anyone with this can read the channel.", "Segredo de 32 hex. Qualquer um com isto lê o canal." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Menções" }, { "@ mention sound", "Som de menções @" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "ADVERTS AUTOMÁTICOS" }, { "About", "Sobre" }, { "About the map", "Sobre o mapa" }, { "Accent popups", "Pop-ups de acento" }, { "Accent popups: off", "Pop-ups de acento: desligados" }, { "Accent popups: on", "Pop-ups de acento: ligados" }, - { "Ack", "Ack" }, { "Active", "Ativo" }, { "Add", "Adicionar" }, { "Add channel", "Adicionar canal" }, @@ -10925,15 +9993,11 @@ static const I18nPair kBuiltin_pt_br[] = { { "Added", "Adicionado" }, { "Added to contacts", "Adicionado aos contatos" }, { "Added to favorites", "Adicionado aos favoritos" }, - { "Admin", "Admin" }, - { "Advert", "Advert" }, { "Advert failed", "Falha no advert" }, { "Advert location", "Local do advert" }, { "Advert policy saved", "Política de advert salva" }, { "Advert sent", "Advert enviado" }, - { "All", "All" }, { "All marked read", "Tudo marcado como lido" }, - { "Allow", "Allow" }, { "Already exists", "Já existe" }, { "Already exists or table full.", "Já existe ou tabela cheia." }, { "Already in contacts", "Já está nos contatos" }, @@ -10944,19 +10008,14 @@ static const I18nPair kBuiltin_pt_br[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Qualquer um pode entrar. A chave vem da hashtag (minúsculas)." }, { "App drawer as home", "Gaveta de apps como tela inicial" }, { "App icon size", "Tamanho dos ícones de apps" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Aplica-se após reiniciar." }, { "Apply", "Aplicar" }, { "Apply auto-poll", "Aplicar auto-poll" }, { "Apply radio params", "Aplicar parâmetros de rádio" }, - { "Apps", "Apps" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Setas + Enter sempre funcionam. Estas letras são extras — toque numa linha e pressione uma tecla." }, { "Auto advert", "Anúncio automático" }, - { "Auto chat", "Auto chat" }, { "Auto repeater", "Auto repetidor" }, { "Auto room", "Auto sala" }, - { "Auto sensor", "Auto sensor" }, { "Auto-Join", "Entrada automática" }, { "Auto-add contacts", "Auto-adicionar contatos" }, { "Auto-add saved", "Auto-adição salva" }, @@ -10973,14 +10032,11 @@ static const I18nPair kBuiltin_pt_br[] = { { "Available", "Disponíveis" }, { "BLE off", "BLE desligado" }, { "BLE on", "BLE ligado" }, - { "BT", "BT" }, { "Back", "Voltar" }, - { "Backups", "Backups" }, { "Battery", "Bateria" }, { "Battery & power history", "Histórico de bateria e energia" }, { "Battery (V)", "Bateria (V)" }, { "Battery calibration reset to default", "Calibração da bateria redefinida" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Leitura da bateria muito baixa — carregue até o fim primeiro" }, { "Battery saver (experimental)", "Economia de bateria (experimental)" }, { "Battery — last 24h", "Bateria — últimas 24h" }, @@ -10993,7 +10049,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Blocking unsupported", "Bloqueio não suportado" }, { "Blue battery Last 6 min", "Azul bateria Últimos 6 min" }, { "Blue battery Orange temp Cyan humidity", "Azul bateria Laranja temp. Ciano umidade" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth já desligado" }, { "Bluetooth already on", "Bluetooth já ligado" }, { "Bluetooth off", "Bluetooth desligado" }, @@ -11003,7 +10058,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Buffered receive (experimental)", "Recepção com buffer (experimental)" }, { "Built-in", "Integrado" }, { "Built-in (default)", "Integrado (padrão)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Calibrar bateria (cheia = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Calibrado: 100%% = %u.%02u V (segure para redefinir)" }, { "Can't block — not a contact", "Não dá para bloquear — não é contato" }, @@ -11100,7 +10154,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Cut", "Recortar" }, { "Cut - Paste in a folder", "Recortado - cole numa pasta" }, { "DM sound", "Som de DM" }, - { "DND", "DND" }, { "Danger zone", "Zona de perigo" }, { "Data -> SD card on reboot\n(card must be inserted)", "Dados -> cartão SD ao reiniciar\n(cartão deve estar inserido)" }, { "Data -> internal on reboot", "Dados -> interno ao reiniciar" }, @@ -11157,7 +10210,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Enter SSID first", "Digite o SSID primeiro" }, { "Enter a name", "Digite um nome" }, { "Enter a network name", "Digite um nome de rede" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Enter adiciona uma linha" }, { "Enter exactly 32 hex characters.", "Digite exatamente 32 caracteres hex." }, { "Enter key sends message", "A tecla Enter envia a mensagem" }, @@ -11169,7 +10221,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Erasing everything…", "Apagando tudo…" }, { "Every node you talk to must match. You can change this later in Settings.", "Todo nó com quem você fala deve coincidir. Você pode mudar isto depois em Ajustes." }, { "Expansion Kit", "Kit de expansão" }, - { "Experimental", "Experimental" }, { "Experimental - has known issues. Off = soft mouse cursor.", "Experimental - tem problemas conhecidos. Desligado = cursor de mouse suave." }, { "Experimental saved", "Experimental salvo" }, { "Export failed (can't open file)", "Falha ao exportar (não abre o arquivo)" }, @@ -11187,7 +10238,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Find", "Buscar" }, { "Finish", "Concluir" }, { "Firmware beta_%d\nCouldn't reach the update server", "Firmware beta_%d\nNão foi possível acessar o servidor de atualização" }, - { "Firmware:", "Firmware:" }, { "Flash on new message", "Piscar em nova mensagem" }, { "Flood", "Difusão" }, { "Flood advert sent", "Flood advert enviado" }, @@ -11201,7 +10251,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Format failed (no card / SD error)", "Falha ao formatar (sem cartão / erro SD)" }, { "Frequency / bandwidth", "Frequência / largura de banda" }, { "Full", "Cheio" }, - { "GPS", "GPS" }, { "GPS %s · Buzzer %s", "GPS %s · Campainha %s" }, { "GPS %s · Buzzer %s\n%s", "GPS %s · Campainha %s\n%s" }, { "GPS off", "GPS desligado" }, @@ -11235,7 +10284,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Idle power-save", "Economia de energia ocioso" }, { "Idle sleep disabled", "Suspensão ociosa desativada" }, { "Idle sleep enabled", "Suspensão ociosa ativada" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Imagem grande demais (>4 MB)" }, { "Import", "Importar" }, { "Import backup", "Importar backup" }, @@ -11245,7 +10293,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Import: storage unavailable", "Importar: armazenamento indisponível" }, { "Importing settings…", "Importando ajustes…" }, { "Inactive", "Inativo" }, - { "Info", "Info" }, { "Insert emoji / symbol", "Inserir emoji / símbolo" }, { "Install", "Instalar" }, { "Install a previous version", "Instalar uma versão anterior" }, @@ -11267,7 +10314,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Join network", "Entrar na rede" }, { "Join private channel", "Entrar em canal privado" }, { "Join the public channel", "Entrar no canal público" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Entrou em %.40s" }, { "Keep per chat (messages)", "Manter por conversa (mensagens)" }, { "Key already in use", "Chave já em uso" }, @@ -11279,7 +10325,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Keyboard nav: WASDZ on", "Nav. teclado: WASDZ ligado" }, { "Keyboard nav: off", "Nav. teclado: desligado" }, { "Keyboard navigation", "Navegação por teclado" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Linha de visada → %s" }, { "Landscape (desktop)", "Paisagem (desktop)" }, { "Landscape set - applies when remote mode starts.", "Paisagem definida - vale quando o modo remoto iniciar." }, @@ -11287,7 +10332,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Language catalog unavailable - check Wi-Fi, then reopen this tab.", "Catálogo de idiomas indisponível - verifique o Wi-Fi e reabra esta aba." }, { "Language updated - restarting to apply it…", "Idioma atualizado - reiniciando para aplicar…" }, { "Languages", "Idiomas" }, - { "Latitude", "Latitude" }, { "Leave empty if not required", "Deixe vazio se não for necessário" }, { "Leaving remote mode - rebooting...", "Saindo do modo remoto - reiniciando..." }, { "Let's set up your device.\n\nYou'll pick a name and choose your LoRa region. Takes about a minute.", "Vamos configurar seu dispositivo.\n\nVocê escolherá um nome e sua região LoRa. Leva cerca de um minuto." }, @@ -11300,11 +10344,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Loading...", "Carregando..." }, { "Local every", "Local a cada" }, { "Local sensors", "Sensores locais" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Bloquear" }, { "Lock screen", "Tela de bloqueio" }, { "Lock screen wallpaper", "Papel de parede do bloqueio" }, @@ -11322,17 +10361,12 @@ static const I18nPair kBuiltin_pt_br[] = { { "Log in again", "Entrar novamente" }, { "Logging in again...", "Entrando novamente..." }, { "Logging in…", "Entrando…" }, - { "Login OK (perms %u)", "Login OK (perms %u)" }, { "Login failed", "Falha no login" }, { "Logs", "Registros" }, - { "Longitude", "Longitude" }, { "Lua Store", "Loja Lua" }, - { "MHz", "MHz" }, { "MQTT bridge", "Ponte MQTT" }, { "Map", "Mapa" }, { "Map options", "Opções do mapa" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Erro de armazenamento do mapa.\n\nCartão SD detectado mas o\ncache de tiles não montou.\nReinicie para tentar de novo." }, { "Map storage error.\nReflash the tiles partition.", "Erro de armazenamento do mapa.\nRegrave a partição de tiles." }, { "Map tiles: microSD", "Tiles do mapa: microSD" }, @@ -11344,7 +10378,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Mark as read", "Marcar como lido" }, { "Mark read", "Marcar como lido" }, { "Marked read", "Marcado como lido" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Máx. saltos (0..64)" }, { "Max zoom for this pack", "Zoom máx. para este pacote" }, { "Memory detail", "Detalhe de memória" }, @@ -11360,8 +10393,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Min zoom for this pack", "Zoom mín. para este pacote" }, { "Mode: BLE starting / low memory", "Modo: BLE iniciando / pouca memória" }, { "Model:", "Modelo:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, - { "Multi ACKs", "Multi ACKs" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Multi-ack %s · Repetir %s · RX boost %s" }, { "Multi-byte routing (path hash)", "Roteamento multibyte (hash de rota)" }, { "Mute @", "Silenciar @" }, @@ -11377,7 +10408,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Nearby on map", "Por perto no mapa" }, { "Network name", "Nome da rede" }, { "Network name (SSID)", "Nome da rede (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Novo" }, { "New DM", "Nova DM" }, { "New channel msg", "Nova msg de canal" }, @@ -11396,7 +10426,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "Nenhum JPEG em /lock/.\nAdicione imagens pelo gerenciador\nde arquivos ou um cartão SD." }, { "No SD card", "Sem cartão SD" }, { "No SD card (or unreadable format)", "Sem cartão SD (ou formato ilegível)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Ainda sem backups. Toque em Exportar novo backup acima para criar um." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Ainda sem histórico da bateria.\n\nRegistrado a cada 5 minutos." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Nenhum usuário bloqueado.\n\nSegure uma mensagem e toque\nBloquear para adicionar." }, @@ -11414,10 +10443,8 @@ static const I18nPair kBuiltin_pt_br[] = { { "No onboard GPS", "Sem GPS integrado" }, { "No other networks found", "Nenhuma outra rede encontrada" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Ainda sem posição. Uma partida a frio precisa de céu aberto e pode levar vários minutos." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Sem resposta de %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Sem resposta. Verifique senha, servidor\nou relógio do dispositivo (dispositivo: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Sem blocos salvos aqui.\n\nConecte-se ao Wi-Fi (Ajustes → Wi-Fi)\npara baixar esta área.\nOs blocos salvos ficam disponíveis offline." }, { "No system time yet", "Ainda sem hora do sistema" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Sem telemetria nesta janela.\nSolicite uma ou amplie o intervalo abaixo." }, @@ -11429,7 +10456,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Memória insuficiente para Bluetooth. Desligue o Wi-Fi primeiro." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Memória insuficiente para Wi-Fi. Desligue o Bluetooth primeiro." }, { "Not enough free memory to fetch it. Reboot and try again.", "Memória livre insuficiente para baixar. Reinicie e tente novamente." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Nada selecionado" }, { "Notification sound set", "Som de notificação definido" }, { "Notify on new contact", "Notificar novo contato" }, @@ -11473,9 +10499,7 @@ static const I18nPair kBuiltin_pt_br[] = { { "Path reset failed", "Falha ao redefinir rota" }, { "Paused — score %d", "Pausado — pontuação %d" }, { "Per-transmit switching on", "Comutação por transmissão ligada" }, - { "Perf:", "Perf:" }, { "Pick colour", "Escolher cor" }, - { "Ping", "Ping" }, { "Ping failed", "Falha no ping" }, { "Pinged (direct) — waiting…", "Ping (direto) — aguardando…" }, { "Pinged (flood) — waiting…", "Ping (flood) — aguardando…" }, @@ -11486,11 +10510,9 @@ static const I18nPair kBuiltin_pt_br[] = { { "Port", "Porta" }, { "Portrait set - applies when remote mode starts.", "Retrato definido - vale quando o modo remoto iniciar." }, { "Position saved", "Posição salva" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Energia" }, { "Power off", "Desligar" }, { "Powering off… click trackball to wake", "Desligando… clique o trackball para acordar" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Pressione uma tecla…" }, { "Probe now", "Sondar agora" }, { "Probing neighbours…", "Sondando vizinhos…" }, @@ -11505,7 +10527,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Purge all discovered nodes?", "Limpar todos os nós descobertos?" }, { "Quick replies", "Respostas rápidas" }, { "Quick reply", "Resposta rápida" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d entradas · Raw %d entradas" }, { "RX boosted gain", "Ganho RX reforçado" }, { "RX log", "Log RX" }, @@ -11519,9 +10540,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "RangeTest sent (direct)", "RangeTest enviado (direto)" }, { "RangeTest sent (flood)", "RangeTest enviado (flood)" }, { "Raw log", "Log bruto" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Lê pacotes em uma tarefa em segundo plano para que uma tela ocupada não os perca." }, { "Reboot", "Reiniciar" }, { "Reboot device", "Reiniciar aparelho" }, @@ -11529,10 +10547,8 @@ static const I18nPair kBuiltin_pt_br[] = { { "Rebooting…", "Reiniciando…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Receber firmware de teste não lançado — recursos mais novos, mas menos testados. A verificação e a instalação seguem o canal beta." }, { "Recently heard", "Ouvido recentemente" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Reformatar o SD como MESHCOMOD (FAT32)?\nTODOS os dados do cartão serão apagados." }, { "Region & scope", "Região e alcance" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Escopo de região (#tag) para este canal.\nVazio = usar o escopo padrão." }, { "Region scope (#tag), blank = default.", "Escopo da região (#tag), vazio = padrão." }, { "Region scope (#tag, blank = none)", "Escopo de região (#tag, vazio = nenhum)" }, @@ -11571,16 +10587,12 @@ static const I18nPair kBuiltin_pt_br[] = { { "SD card %s", "Cartão SD %s" }, { "SD card %s (hold: format)", "Cartão SD %s (segure: formatar)" }, { "SD card (tap to mount)", "Cartão SD (toque para montar)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "Cartão SD inserido" }, { "SD card lost - reinsert to recover", "Cartão SD perdido - reinsira-o" }, { "SD card remounted", "Cartão SD remontado" }, { "SD card removed", "Cartão SD removido" }, { "SD download failed: %s", "Falha ao baixar no SD: %s" }, { "SD formatted - %s (MESHCOMOD)", "SD formatado - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB usados" }, { "SSID set — enter password, then Save", "SSID definido — digite a senha e Salvar" }, { "SSID too long", "SSID muito longo" }, @@ -11605,8 +10617,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Saved — rebooting", "Salvo — reiniciando" }, { "Saved — reconnecting…", "Salvo — reconectando…" }, { "Saved: %s\nFlash it from the Launcher.", "Salvo: %s\nInstale pelo Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Salvando no SD… %d%%" }, { "Saving to SD… 0%", "Salvando no SD… 0%" }, { "Scan to open on phone", "Escaneie para abrir no celular" }, @@ -11622,7 +10632,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Screenshot: low memory", "Captura: pouca memória" }, { "Screenshot: no SD card", "Captura: sem cartão SD" }, { "Screenshot: write failed", "Captura: falha na gravação" }, - { "Scrollball: normal", "Scrollball: normal" }, { "Scrollball: reversed", "Scrollball: invertido" }, { "Search", "Buscar" }, { "Search contacts", "Buscar contatos" }, @@ -11637,14 +10646,10 @@ static const I18nPair kBuiltin_pt_br[] = { { "Send advert now", "Enviar advert agora" }, { "Send an advert now, or set how often you re-advertise.", "Envie um advert agora, ou defina com que frequência re-anuncia." }, { "Send failed", "Falha ao enviar" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Remetente bloqueado" }, { "Sensors tab: off (restart to apply)", "Aba de sensores: desligada (reinicie para aplicar)" }, { "Sensors tab: on (restart to apply)", "Aba de sensores: ligada (reinicie para aplicar)" }, { "Sent", "Enviado" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Definir" }, { "Set an SSID first", "Defina um SSID primeiro" }, { "Set as notification sound", "Definir como som de notificação" }, @@ -11655,8 +10660,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Share QR", "Compartilhar QR" }, { "Share channel", "Compartilhar canal" }, { "Share location in advert", "Compartilhar local no advert" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Compartilhar segredo" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Compartilhe o segredo de 32 caracteres para outros entrarem. Deixe vazio para gerar um aleatório." }, { "Share: %s", "Compartilhar: %s" }, @@ -11675,7 +10678,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Slot %d cleared", "Slot %d limpo" }, { "Slot empty", "Slot vazio" }, { "Small\nMedium\nLarge", "Pequeno\nMédio\nGrande" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — deslize ou gire o trackball" }, { "Sort", "Ordenar" }, { "Sound", "Som" }, @@ -11683,13 +10685,11 @@ static const I18nPair kBuiltin_pt_br[] = { { "Sound on", "Som ligado" }, { "Sound: %s", "Som: %s" }, { "Start time", "Hora de início" }, - { "Status", "Status" }, { "Step 1 of 3", "Passo 1 de 3" }, { "Step 2 of 3", "Passo 2 de 3" }, { "Step 3 of 3", "Passo 3 de 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Ainda analisando a rota\nanterior… tente de novo em instantes." }, { "Stop", "Parar" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Armazenamento" }, { "Store", "Loja" }, { "Store data on SD (reboot)", "Salvar dados no SD (reinicia)" }, @@ -11702,8 +10702,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nClientes WS %d GPS %s Buzzer %s" }, { "TCP off", "TCP desligado" }, { "TCP on", "TCP ligado" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Atalhos da aba — toque numa linha, depois numa tecla" }, { "Tap Use to switch - the device reboots to apply.", "Toque em Usar para trocar — o aparelho reinicia para aplicar." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Toque em Usar para trocar - o aparelho reinicia. Os arquivos de idioma ficam em /lang no armazenamento; edite-os ou adicione o seu." }, @@ -11747,7 +10745,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Trace sent…", "Rastreamento enviado…" }, { "Tracing route…", "Rastreando rota…" }, { "Trackball navigates UI", "Trackball navega a UI" }, - { "Trackball: cursor", "Trackball: cursor" }, { "Trackball: navigate UI", "Trackball: navegar UI" }, { "Turn Wi-Fi on first", "Ligue o Wi-Fi primeiro" }, { "Turn Wi-Fi on, then tap refresh. Apps already installed still work.", "Ligue o Wi-Fi e atualize. Apps já instalados continuam funcionando." }, @@ -11781,22 +10778,16 @@ static const I18nPair kBuiltin_pt_br[] = { { "Updated - rebooting…", "Atualizado - reiniciando…" }, { "Use", "Usar" }, { "Username (optional)", "Nome de usuário (opcional)" }, - { "Volume", "Volume" }, { "W up · A left · D right · Z down · S select · Q back", "W cima · A esq. · D dir. · Z baixo · S selecionar · Q voltar" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Aguardando Wi-Fi..." }, { "Welcome to WADAMESH", "Bem-vindo ao WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Enquanto estiver ligado, qualquer pessoa no seu Wi-Fi pode ver e controlar este aparelho. Usa HTTP simples (apenas rede local)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi e Bluetooth" }, { "Wi-Fi is not enabled in this build.", "O Wi-Fi não está ativado neste build." }, { "Wi-Fi isn't available on this build.", "O Wi-Fi não está disponível neste build." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "É preciso Wi-Fi para obter o perfil\ndo terreno desta rota.\nConecte em Ajustes → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi não conectado" }, { "Wi-Fi off", "Wi-Fi desligado" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi ligado" }, { "Wi-Fi on, scanning…", "Wi-Fi ligado, buscando…" }, { "Wi-Fi saved (radio off)", "Wi-Fi salvo (rádio desligado)" }, @@ -11809,7 +10800,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "Zero-hop", "Sem salto" }, { "Zero-hop advert sent", "Zero-hop advert enviado" }, { "Zoom: +/- buttons", "Zoom: botões +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "cliente conectado" }, { "command", "comando" }, { "contacts (%d):", "contatos (%d):" }, @@ -11823,7 +10813,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "hold Backspace to unlock", "segure Backspace para desbloquear" }, { "hold the d-pad to unlock", "segure o d-pad para desbloquear" }, { "hold the trackball to unlock", "segure o trackball para desbloquear" }, - { "kHz", "kHz" }, { "keep holding", "continue segurando" }, { "last wake: ", "último despertar: " }, { "leave empty to generate", "deixe vazio para gerar" }, @@ -11833,7 +10822,6 @@ static const I18nPair kBuiltin_pt_br[] = { { "min (0=off)", "min (0=desligado)" }, { "mkdir failed", "falha no mkdir" }, { "n/a in this build", "n/d neste build" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "agora no canal %s" }, { "now talking to %s", "agora falando com %s" }, { "off", "desligado" }, @@ -11849,47 +10837,31 @@ static const I18nPair kBuiltin_pt_br[] = { { "tap the language key (e.g. EN) on the keyboard to cycle the ones you enable", "toque na tecla de idioma (ex. EN) no teclado para percorrer os que você ativar" }, { "tap to cancel", "toque para cancelar" }, { "tap to exit full screen", "toque para sair da tela cheia" }, - { "zoom", "zoom" }, - { "zoom %d", "zoom %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "amplificador ~17 dB para áreas silenciosas/remotas; desligue em locais ruidosos." }, - { "© OpenStreetMap", "© OpenStreetMap" }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair kBuiltin_ro[] = { { " (device behind)", " (dispozitiv în urmă)" }, - { "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send PRIVATE messages as you.\n\nIt could write to any of your contacts, or post to a room, and the message will look exactly like one you typed.\n\nOnly allow this for an app you trust." }, - { "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust.", "\"%s\" wants to send messages on the mesh.\n\nThey will be sent as %s and cannot be told apart from messages you typed.\n\nOnly allow this for an app you trust." }, { "#7A7F87 Wardrive: %d coverage pts · %lu logged to SD#", "#7A7F87 Wardrive: %d puncte de acoperire · %lu salvate pe SD#" }, { "#7A7F87 Wardrive: waiting for GPS fix…#", "#7A7F87 Wardrive: se aşteaptă fix GPS…#" }, - { "#7A7F87 Wardrive: …#", "#7A7F87 Wardrive: …#" }, - { "#region", "#region" }, - { "%.3f MHz · SF%u · TX %+ddBm", "%.3f MHz · SF%u · TX %+ddBm" }, - { "%d of %d on map", "%d of %d on map" }, { "%d on map", "%d pe hartă" }, { "%s · %d nearby (%d rpt, %d comp)", "%s · %d în apropiere (%d rpt, %d comp)" }, { "%u types · hops %u · manual %s", "%u tipuri · salturi %u · manual %s" }, { "(RTC unset)", "(RTC nesetat)" }, { "(device behind)", "(dispozitiv în urmă)" }, { "(no default)", "(fără implicit)" }, - { "0123456789abcdef…", "0123456789abcdef…" }, { "1 byte (legacy)\n2 bytes\n3 bytes", "1 octet (vechi)\n2 octeţi\n3 octeţi" }, - { "1-character messages will be ignored", "1-character messages will be ignored" }, - { "1-character messages will be shown", "1-character messages will be shown" }, { "100\n250\n500\n1000\n2000\nNo limit", "100\n250\n500\n1000\n2000\nFără limită" }, { "12-hour clock", "Ceas de 12 ore" }, { "32 hex characters", "32 caractere hex" }, { "32-hex secret. Anyone with this can read the channel.", "Secret de 32 hex. Oricine îl are poate citi canalul." }, - { ">_ Terminal", ">_ Terminal" }, { "@ Mentions", "@ Menţiuni" }, { "@ mention sound", "Sunet menţiune @" }, - { "AF", "AF" }, { "AUTOMATIC ADVERTS", "ADVERTURI AUTOMATE" }, { "About", "Despre" }, { "About the map", "Despre hartă" }, { "Accent popups", "Popupuri cu accente" }, { "Accent popups: off", "Popupuri accente: oprite" }, { "Accent popups: on", "Popupuri accente: pornite" }, - { "Ack", "Ack" }, { "Active", "Activ" }, { "Add", "Adaugă" }, { "Add channel", "Adaugă canal" }, @@ -11897,15 +10869,11 @@ static const I18nPair kBuiltin_ro[] = { { "Added", "Adăugat" }, { "Added to contacts", "Adăugat la contacte" }, { "Added to favorites", "Adăugat la favorite" }, - { "Admin", "Admin" }, - { "Advert", "Advert" }, { "Advert failed", "Advert eşuat" }, { "Advert location", "Locaţie advert" }, { "Advert policy saved", "Politică advert salvată" }, { "Advert sent", "Advert trimis" }, - { "All", "All" }, { "All marked read", "Toate marcate ca citite" }, - { "Allow", "Allow" }, { "Already exists", "Există deja" }, { "Already exists or table full.", "Există deja sau tabela e plină." }, { "Already in contacts", "Deja în contacte" }, @@ -11916,13 +10884,11 @@ static const I18nPair kBuiltin_ro[] = { { "Anyone can join. Key is derived from the hashtag (lowercase).", "Oricine poate intra. Cheia derivă din hashtag (litere mici)." }, { "App drawer as home", "Sertarul de aplicaţii ca ecran principal" }, { "App icon size", "Dimensiune pictograme aplicaţii" }, - { "App permissions", "App permissions" }, { "Applies after restart.", "Se aplică după repornire." }, { "Apply", "Aplică" }, { "Apply auto-poll", "Aplică auto-interogarea" }, { "Apply radio params", "Aplică parametrii radio" }, { "Apps", "Aplicaţii" }, - { "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back.", "Apps that may send messages on the mesh. Anything they send goes out under your node name and cannot be told apart from a message you typed. Turn one off to take the permission back." }, { "Arrows + Enter always work. These letters are extra — tap a row, then press a key.", "Săgeţile + Enter merg mereu. Aceste litere sunt în plus — atinge un rând, apoi apasă o tastă." }, { "Auto advert", "Anunţ automat" }, { "Auto chat", "Chat auto" }, @@ -11945,14 +10911,12 @@ static const I18nPair kBuiltin_ro[] = { { "Available", "Disponibile" }, { "BLE off", "BLE oprit" }, { "BLE on", "BLE pornit" }, - { "BT", "BT" }, { "Back", "Înapoi" }, { "Backups", "Backupuri" }, { "Battery", "Baterie" }, { "Battery & power history", "Istoric baterie şi alimentare" }, { "Battery (V)", "Baterie (V)" }, { "Battery calibration reset to default", "Calibrare baterie resetată la implicit" }, - { "Battery life: gathering data…", "Battery life: gathering data…" }, { "Battery read too low — charge fully first", "Citire baterie prea mică — încarcă complet mai întâi" }, { "Battery saver (experimental)", "Economisire baterie (experimental)" }, { "Battery — last 24h", "Baterie — ultimele 24h" }, @@ -11965,7 +10929,6 @@ static const I18nPair kBuiltin_ro[] = { { "Blocking unsupported", "Blocarea nu este acceptată" }, { "Blue battery Last 6 min", "Albastru baterie Ultimele 6 min" }, { "Blue battery Orange temp Cyan humidity", "Albastru baterie Portocaliu temp Cyan umiditate" }, - { "Bluetooth", "Bluetooth" }, { "Bluetooth already off", "Bluetooth deja oprit" }, { "Bluetooth already on", "Bluetooth deja pornit" }, { "Bluetooth off", "Bluetooth oprit" }, @@ -11975,7 +10938,6 @@ static const I18nPair kBuiltin_ro[] = { { "Buffered receive (experimental)", "Recepţie cu buffer (experimental)" }, { "Built-in", "Încorporat" }, { "Built-in (default)", "Încorporat (implicit)" }, - { "CR", "CR" }, { "Calibrate battery (full = 100%)", "Calibrează bateria (plină = 100%)" }, { "Calibrated: 100%% = %u.%02u V (long-press to reset)", "Calibrat: 100%% = %u.%02u V (apasă lung pentru resetare)" }, { "Can't block — not a contact", "Nu se poate bloca — nu e contact" }, @@ -12046,7 +11008,6 @@ static const I18nPair kBuiltin_ro[] = { { "Contacts are saved to the SD card.", "Contactele se salvează pe cardul SD." }, { "Contacts full", "Contacte pline" }, { "Contacts:", "Contacte:" }, - { "Control", "Control" }, { "Control this device from a browser", "Controlează dispozitivul din browser" }, { "Copied %s", "Copiat %s" }, { "Copied - Paste in a folder", "Copiat - lipeşte într-un folder" }, @@ -12072,7 +11033,6 @@ static const I18nPair kBuiltin_ro[] = { { "Cut", "Decupează" }, { "Cut - Paste in a folder", "Decupat - lipeşte într-un folder" }, { "DM sound", "Sunet DM" }, - { "DND", "DND" }, { "Danger zone", "Zonă periculoasă" }, { "Data -> SD card on reboot\n(card must be inserted)", "Date -> card SD la repornire\n(cardul trebuie introdus)" }, { "Data -> internal on reboot", "Date -> stocare internă la repornire" }, @@ -12129,7 +11089,6 @@ static const I18nPair kBuiltin_ro[] = { { "Enter SSID first", "Introdu mai întâi SSID-ul" }, { "Enter a name", "Introdu un nume" }, { "Enter a network name", "Introdu un nume de reţea" }, - { "Enter a region name", "Enter a region name" }, { "Enter adds a new line", "Enter adaugă un rând nou" }, { "Enter exactly 32 hex characters.", "Introdu exact 32 caractere hex." }, { "Enter key sends message", "Tasta Enter trimite mesajul" }, @@ -12141,7 +11100,6 @@ static const I18nPair kBuiltin_ro[] = { { "Erasing everything…", "Se şterge tot…" }, { "Every node you talk to must match. You can change this later in Settings.", "Fiecare nod cu care vorbeşti trebuie să corespundă. Poţi schimba asta mai târziu în Setări." }, { "Expansion Kit", "Kit de extensie" }, - { "Experimental", "Experimental" }, { "Experimental - has known issues. Off = soft mouse cursor.", "Experimental - are probleme cunoscute. Oprit = cursor de mouse virtual." }, { "Experimental saved", "Experimentale salvate" }, { "Export failed (can't open file)", "Export eşuat (fişierul nu se poate deschide)" }, @@ -12159,7 +11117,6 @@ static const I18nPair kBuiltin_ro[] = { { "Find", "Caută" }, { "Finish", "Finalizează" }, { "Firmware beta_%d\nCouldn't reach the update server", "Firmware beta_%d\nServerul de actualizare nu a putut fi contactat" }, - { "Firmware:", "Firmware:" }, { "Flash on new message", "Iluminează la mesaj nou" }, { "Flood", "Difuzare" }, { "Flood advert sent", "Advert flood trimis" }, @@ -12173,15 +11130,11 @@ static const I18nPair kBuiltin_ro[] = { { "Format failed (no card / SD error)", "Formatare eşuată (fără card / eroare SD)" }, { "Frequency / bandwidth", "Frecvenţă / lăţime de bandă" }, { "Full", "Plin" }, - { "GPS", "GPS" }, - { "GPS %s · Buzzer %s", "GPS %s · Buzzer %s" }, - { "GPS %s · Buzzer %s\n%s", "GPS %s · Buzzer %s\n%s" }, { "GPS off", "GPS oprit" }, { "GPS on", "GPS pornit" }, { "GPS serial baud", "Baud serial GPS" }, { "GPS unset", "GPS nesetat" }, { "GPS: acquiring...", "GPS: căutare semnal..." }, - { "GPS: fix", "GPS: fix" }, { "GPS: off", "GPS: oprit" }, { "GPS: searching", "GPS: căutare" }, { "Game over — score %d (tap to restart)", "Joc terminat — scor %d (atinge pentru restart)" }, @@ -12207,7 +11160,6 @@ static const I18nPair kBuiltin_ro[] = { { "Idle power-save", "Economie de energie în repaus" }, { "Idle sleep disabled", "Somn în repaus dezactivat" }, { "Idle sleep enabled", "Somn în repaus activat" }, - { "Ignore 1-character messages", "Ignore 1-character messages" }, { "Image too large (>4 MB)", "Imagine prea mare (>4 MB)" }, { "Import", "Importă" }, { "Import backup", "Importă backup" }, @@ -12217,7 +11169,6 @@ static const I18nPair kBuiltin_ro[] = { { "Import: storage unavailable", "Import: stocare indisponibilă" }, { "Importing settings…", "Se importă setările…" }, { "Inactive", "Inactiv" }, - { "Info", "Info" }, { "Insert emoji / symbol", "Inserează emoji / simbol" }, { "Install", "Instalează" }, { "Install a previous version", "Instalează o versiune anterioară" }, @@ -12239,7 +11190,6 @@ static const I18nPair kBuiltin_ro[] = { { "Join network", "Intră în reţea" }, { "Join private channel", "Intră într-un canal privat" }, { "Join the public channel", "Intră în canalul public" }, - { "Join w/ password", "Join w/ password" }, { "Joined %.40s", "Intrat în %.40s" }, { "Keep per chat (messages)", "Păstrează per conversaţie (mesaje)" }, { "Key already in use", "Tasta e deja folosită" }, @@ -12251,7 +11201,6 @@ static const I18nPair kBuiltin_ro[] = { { "Keyboard nav: WASDZ on", "Navigare tastatură: WASDZ pornit" }, { "Keyboard nav: off", "Navigare tastatură: oprită" }, { "Keyboard navigation", "Navigare cu tastatura" }, - { "Known regions", "Known regions" }, { "LOS → %s", "Linie vizuală → %s" }, { "Landscape (desktop)", "Peisaj (desktop)" }, { "Landscape set - applies when remote mode starts.", "Peisaj setat - se aplică la pornirea modului la distanţă." }, @@ -12272,11 +11221,6 @@ static const I18nPair kBuiltin_ro[] = { { "Loading...", "Se încarcă..." }, { "Local every", "Local la fiecare" }, { "Local sensors", "Senzori locali" }, - { "Location no longer shared", "Location no longer shared" }, - { "Location shared with anyone who asks", "Location shared with anyone who asks" }, - { "Location shared with chosen contacts only", "Location shared with chosen contacts only" }, - { "Location shared with this contact", "Location shared with this contact" }, - { "Location sharing off", "Location sharing off" }, { "Lock", "Blochează" }, { "Lock screen", "Ecran de blocare" }, { "Lock screen wallpaper", "Fundal ecran de blocare" }, @@ -12299,12 +11243,9 @@ static const I18nPair kBuiltin_ro[] = { { "Logs", "Jurnale" }, { "Longitude", "Longitudine" }, { "Lua Store", "Magazin Lua" }, - { "MHz", "MHz" }, { "MQTT bridge", "Punte MQTT" }, { "Map", "Hartă" }, { "Map options", "Opţiuni hartă" }, - { "Map pan off", "Map pan off" }, - { "Map pan: arrows pan, Back exits", "Map pan: arrows pan, Back exits" }, { "Map storage error.\n\nSD card detected but the\ntile cache didn't mount.\nReboot to retry.", "Eroare stocare hartă.\n\nCard SD detectat, dar\ncache-ul de dale nu s-a montat.\nReporneşte pentru reîncercare." }, { "Map storage error.\nReflash the tiles partition.", "Eroare stocare hartă.\nRescrie partiţia de dale." }, { "Map tiles: microSD", "Dale hartă: microSD" }, @@ -12316,7 +11257,6 @@ static const I18nPair kBuiltin_ro[] = { { "Mark as read", "Marchează ca citit" }, { "Mark read", "Marchează citit" }, { "Marked read", "Marcat ca citit" }, - { "Max dots", "Max dots" }, { "Max hops (0..64)", "Salturi max (0..64)" }, { "Max zoom for this pack", "Zoom maxim pentru acest pachet" }, { "Memory detail", "Detalii memorie" }, @@ -12331,8 +11271,6 @@ static const I18nPair kBuiltin_ro[] = { { "Message sound", "Sunet mesaj" }, { "Min zoom for this pack", "Zoom minim pentru acest pachet" }, { "Mode: BLE starting / low memory", "Mod: BLE porneşte / memorie redusă" }, - { "Model:", "Model:" }, - { "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound.", "Most mesh spam is a single character, because it is the cheapest message to send. Dropped silently: no chat entry, no notification, no sound." }, { "Multi ACKs", "ACK-uri multiple" }, { "Multi-ack %s · Repeat %s · RX boost %s", "Multi-ack %s · Repetare %s · Boost RX %s" }, { "Multi-byte routing (path hash)", "Rutare multi-octet (hash de cale)" }, @@ -12349,7 +11287,6 @@ static const I18nPair kBuiltin_ro[] = { { "Nearby on map", "În apropiere pe hartă" }, { "Network name", "Nume reţea" }, { "Network name (SSID)", "Nume reţea (SSID)" }, - { "Never\nChosen contacts only\nAnyone who asks", "Never\nChosen contacts only\nAnyone who asks" }, { "New", "Nou" }, { "New DM", "DM nou" }, { "New channel msg", "Mesaj nou pe canal" }, @@ -12368,7 +11305,6 @@ static const I18nPair kBuiltin_ro[] = { { "No JPEGs found in /lock/.\nAdd images via the file\nmanager or an SD card.", "Niciun JPEG găsit în /lock/.\nAdaugă imagini prin managerul\nde fişiere sau un card SD." }, { "No SD card", "Fără card SD" }, { "No SD card (or unreadable format)", "Fără card SD (sau format ilizibil)" }, - { "No apps installed.", "No apps installed." }, { "No backups yet. Tap Export new backup above to create one.", "Niciun backup încă. Atinge Exportă backup nou mai sus pentru a crea unul." }, { "No battery history yet.\n\nLogged every 5 minutes.", "Niciun istoric al bateriei încă.\n\nSe înregistrează la 5 minute." }, { "No blocked users.\n\nLong-press a message and tap\nBlock to add one.", "Niciun utilizator blocat.\n\nApasă lung pe un mesaj şi atinge\nBlochează pentru a adăuga unul." }, @@ -12386,10 +11322,8 @@ static const I18nPair kBuiltin_ro[] = { { "No onboard GPS", "Fără GPS integrat" }, { "No other networks found", "Nicio altă reţea găsită" }, { "No position yet. A cold start needs a clear view of the sky and can take several minutes.", "Încă nicio poziţie. O pornire la rece are nevoie de cer liber şi poate dura câteva minute." }, - { "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details.", "No regions yet.\n\nAdd a #region to have messages\nscoped to it named in message details." }, { "No reply from %s", "Niciun răspuns de la %s" }, { "No reply. Check password, server,\nor device clock (device: %s)", "Niciun răspuns. Verifică parola, serverul\nsau ceasul dispozitivului (dispozitiv: %s)" }, - { "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)", "No reply. Path hash is %u bytes;\nolder repeaters drop those.\nTry 1 byte (Settings > Radio & Mesh)" }, { "No saved map tiles here.\n\nConnect to Wi-Fi (Settings → Wi-Fi)\nto download this area.\nSaved tiles stay available offline.", "Fără dale salvate aici.\n\nConectează Wi-Fi (Setări → Wi-Fi)\npentru a descărca zona.\nDalele salvate rămân offline." }, { "No system time yet", "Încă nu există oră de sistem" }, { "No telemetry in this window.\nRequest one, or widen the range below.", "Fără telemetrie în acest interval.\nCere una sau lărgeşte intervalul de mai jos." }, @@ -12401,7 +11335,6 @@ static const I18nPair kBuiltin_ro[] = { { "Not enough free memory for Bluetooth. Turn Wi-Fi off first.", "Memorie liberă insuficientă pentru Bluetooth. Opreşte mai întâi Wi-Fi." }, { "Not enough free memory for Wi-Fi. Turn Bluetooth off first.", "Memorie liberă insuficientă pentru Wi-Fi. Opreşte mai întâi Bluetooth." }, { "Not enough free memory to fetch it. Reboot and try again.", "Memorie liberă insuficientă pentru descărcare. Reporniți și încercați din nou." }, - { "Not supported on this board", "Not supported on this board" }, { "Nothing selected", "Nimic selectat" }, { "Notification sound set", "Sunet de notificare setat" }, { "Notify on new contact", "Notifică la contact nou" }, @@ -12409,7 +11342,6 @@ static const I18nPair kBuiltin_ro[] = { { "Off\n1\n2\n3\n5\n8", "Oprit\n1\n2\n3\n5\n8" }, { "Off\n1 day\n2 days\n3 days\n7 days", "Oprit\n1 zi\n2 zile\n3 zile\n7 zile" }, { "Off\n60 min\n90 min\n2 hours\n3 hours\n4 hours", "Oprit\n60 min\n90 min\n2 ore\n3 ore\n4 ore" }, - { "Offline", "Offline" }, { "Older messages in a chat are dropped past this. A very large or unlimited history makes the chat list slower.", "Mesajele mai vechi peste această limită se şterg. Un istoric foarte mare sau nelimitat încetineşte lista de conversaţii." }, { "On - open the address above in a phone browser.", "Pornit - deschide adresa de mai sus în browserul telefonului." }, { "On boot", "La pornire" }, @@ -12445,9 +11377,7 @@ static const I18nPair kBuiltin_ro[] = { { "Path reset failed", "Resetarea căii a eşuat" }, { "Paused — score %d", "Pauză — scor %d" }, { "Per-transmit switching on", "Comutare per transmisie pornită" }, - { "Perf:", "Perf:" }, { "Pick colour", "Alege culoarea" }, - { "Ping", "Ping" }, { "Ping failed", "Ping eşuat" }, { "Pinged (direct) — waiting…", "Ping trimis (direct) — se aşteaptă…" }, { "Pinged (flood) — waiting…", "Ping trimis (flood) — se aşteaptă…" }, @@ -12455,14 +11385,11 @@ static const I18nPair kBuiltin_ro[] = { { "Poll (min)", "Interogare (min)" }, { "Poll every", "Interogare la fiecare" }, { "Poll every %d min", "Interogare la %d min" }, - { "Port", "Port" }, { "Portrait set - applies when remote mode starts.", "Portret setat - se aplică la pornirea modului la distanţă." }, { "Position saved", "Poziţie salvată" }, - { "Post to channels as me", "Post to channels as me" }, { "Power", "Alimentare" }, { "Power off", "Opreşte" }, { "Powering off… click trackball to wake", "Se opreşte… apasă trackball-ul pentru trezire" }, - { "Powering off… press BOOT to wake", "Powering off… press BOOT to wake" }, { "Press a key…", "Apasă o tastă…" }, { "Probe now", "Măsoară acum" }, { "Probing neighbours…", "Se sondează vecinii…" }, @@ -12477,7 +11404,6 @@ static const I18nPair kBuiltin_ro[] = { { "Purge all discovered nodes?", "Elimini toate nodurile descoperite?" }, { "Quick replies", "Răspunsuri rapide" }, { "Quick reply", "Răspuns rapid" }, - { "RAM %u%% · PSRAM %u%%", "RAM %u%% · PSRAM %u%%" }, { "RX %d entries · Raw %d entries", "RX %d intrări · Brut %d intrări" }, { "RX boosted gain", "Amplificare RX crescută" }, { "RX log", "Jurnal RX" }, @@ -12491,9 +11417,6 @@ static const I18nPair kBuiltin_ro[] = { { "RangeTest sent (direct)", "RangeTest trimis (direct)" }, { "RangeTest sent (flood)", "RangeTest trimis (flood)" }, { "Raw log", "Jurnal brut" }, - { "Read channel messages", "Read channel messages" }, - { "Read incoming messages", "Read incoming messages" }, - { "Read private messages", "Read private messages" }, { "Reads packets on a background task so a busy screen can't drop them.", "Citeşte pachetele pe o sarcină de fundal, ca un ecran ocupat să nu le piardă." }, { "Reboot", "Reporneşte" }, { "Reboot device", "Reporneşte dispozitivul" }, @@ -12501,10 +11424,8 @@ static const I18nPair kBuiltin_ro[] = { { "Rebooting…", "Se reporneşte…" }, { "Receive unreleased test firmware — newer features, but less tested. The update check and Install update both follow the beta channel.", "Primeşti firmware de test nepublicat — funcţii mai noi, dar mai puţin testate. Verificarea de actualizare şi Instalează actualizarea urmează ambele canalul beta." }, { "Recently heard", "Auzite recent" }, - { "Reconnected to %.40s", "Reconnected to %.40s" }, { "Reformat SD as MESHCOMOD (FAT32)?\nALL data on the card will be erased.", "Reformatezi SD ca MESHCOMOD (FAT32)?\nTOATE datele de pe card vor fi şterse." }, { "Region & scope", "Regiune şi acoperire" }, - { "Region list is full", "Region list is full" }, { "Region scope (#tag) for this channel.\nBlank = use the default scope.", "Domeniu regional (#tag) pentru acest canal.\nGol = domeniul implicit." }, { "Region scope (#tag), blank = default.", "Domeniu regional (#tag), gol = implicit." }, { "Region scope (#tag, blank = none)", "Domeniu regional (#tag, gol = niciunul)" }, @@ -12543,16 +11464,12 @@ static const I18nPair kBuiltin_ro[] = { { "SD card %s", "Card SD %s" }, { "SD card %s (hold: format)", "Card SD %s (ţine: formatare)" }, { "SD card (tap to mount)", "Card SD (atinge pentru montare)" }, - { "SD card (unreadable - tap to retry)", "SD card (unreadable - tap to retry)" }, { "SD card inserted", "Card SD introdus" }, { "SD card lost - reinsert to recover", "Card SD pierdut - reintrodu-l pentru recuperare" }, { "SD card remounted", "Card SD remontat" }, { "SD card removed", "Card SD scos" }, { "SD download failed: %s", "Descărcare SD eşuată: %s" }, { "SD formatted - %s (MESHCOMOD)", "SD formatat - %s (MESHCOMOD)" }, - { "SD unreadable - format it as FAT32 on a computer", "SD unreadable - format it as FAT32 on a computer" }, - { "SF", "SF" }, - { "SF / CR / TX / AF", "SF / CR / TX / AF" }, { "SPIFFS %u/%u KB used", "SPIFFS %u/%u KB folosiţi" }, { "SSID set — enter password, then Save", "SSID setat — introdu parola, apoi Salvează" }, { "SSID too long", "SSID prea lung" }, @@ -12577,8 +11494,6 @@ static const I18nPair kBuiltin_ro[] = { { "Saved — rebooting", "Salvat — se reporneşte" }, { "Saved — reconnecting…", "Salvat — se reconectează…" }, { "Saved: %s\nFlash it from the Launcher.", "Salvat: %s\nInstalează-l din Launcher." }, - { "Saved: %s\nReady for offline flashing.", "Saved: %s\nReady for offline flashing." }, - { "Saves the latest firmware of the selected channel to the SD card (BINS folder).", "Saves the latest firmware of the selected channel to the SD card (BINS folder)." }, { "Saving to SD… %d%%", "Se salvează pe SD… %d%%" }, { "Saving to SD… 0%", "Se salvează pe SD… 0%" }, { "Scan to open on phone", "Scanează pentru a deschide pe telefon" }, @@ -12594,7 +11509,6 @@ static const I18nPair kBuiltin_ro[] = { { "Screenshot: low memory", "Captură: memorie redusă" }, { "Screenshot: no SD card", "Captură: fără card SD" }, { "Screenshot: write failed", "Captură: scriere eşuată" }, - { "Scrollball: normal", "Scrollball: normal" }, { "Scrollball: reversed", "Scrollball: inversat" }, { "Search", "Căutare" }, { "Search contacts", "Caută contacte" }, @@ -12609,14 +11523,10 @@ static const I18nPair kBuiltin_ro[] = { { "Send advert now", "Trimite advert acum" }, { "Send an advert now, or set how often you re-advertise.", "Trimite un advert acum sau setează cât de des te re-anunţi." }, { "Send failed", "Trimitere eşuată" }, - { "Send messages as me", "Send messages as me" }, - { "Send private messages as me", "Send private messages as me" }, { "Sender blocked", "Expeditor blocat" }, { "Sensors tab: off (restart to apply)", "Fila Senzori: oprită (repornire pentru aplicare)" }, { "Sensors tab: on (restart to apply)", "Fila Senzori: pornită (repornire pentru aplicare)" }, { "Sent", "Trimis" }, - { "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu.", "Sent only when that contact asks, encrypted to them. Nothing is broadcast. Needs \"Answer telemetry requests\" on. Pick contacts in a contact's menu." }, - { "Server has forgotten you.\nJoin with the room password.", "Server has forgotten you.\nJoin with the room password." }, { "Set", "Setează" }, { "Set an SSID first", "Setează mai întâi un SSID" }, { "Set as notification sound", "Setează ca sunet de notificare" }, @@ -12627,8 +11537,6 @@ static const I18nPair kBuiltin_ro[] = { { "Share QR", "Partajează QR" }, { "Share channel", "Partajează canalul" }, { "Share location in advert", "Partajează locaţia în advert" }, - { "Share my loc", "Share my loc" }, - { "Share my location when asked", "Share my location when asked" }, { "Share secret", "Partajează secretul" }, { "Share the 32-char secret so others can join. Leave the secret empty to generate a random one.", "Partajează secretul de 32 caractere ca să poată intra şi alţii. Lasă secretul gol pentru a genera unul aleatoriu." }, { "Share: %s", "Partajare: %s" }, @@ -12647,7 +11555,6 @@ static const I18nPair kBuiltin_ro[] = { { "Slot %d cleared", "Slot %d golit" }, { "Slot empty", "Slot gol" }, { "Small\nMedium\nLarge", "Mic\nMediu\nMare" }, - { "Small\nMedium\nLarge\nJumbo", "Small\nMedium\nLarge\nJumbo" }, { "Snake — swipe or roll the trackball", "Snake — glisează sau roteşte trackball-ul" }, { "Sort", "Sortează" }, { "Sound", "Sunet" }, @@ -12661,7 +11568,6 @@ static const I18nPair kBuiltin_ro[] = { { "Step 3 of 3", "Pasul 3 din 3" }, { "Still analyzing the previous\npath… try again in a moment.", "Încă se analizează calea\nanterioară… reîncearcă imediat." }, { "Stop", "Opreşte" }, - { "Stop sharing loc", "Stop sharing loc" }, { "Storage", "Stocare" }, { "Store", "Magazin" }, { "Store data on SD (reboot)", "Stochează datele pe SD (repornire)" }, @@ -12674,8 +11580,6 @@ static const I18nPair kBuiltin_ro[] = { { "TCP %s BLE %s\nWS clients %d GPS %s Buzzer %s", "TCP %s BLE %s\nClienţi WS %d GPS %s Buzzer %s" }, { "TCP off", "TCP oprit" }, { "TCP on", "TCP pornit" }, - { "TOUCH BETA", "TOUCH BETA" }, - { "TX", "TX" }, { "Tab hotkeys — tap a row, then press a key", "Taste rapide pentru file — atinge un rând, apoi apasă o tastă" }, { "Tap Use to switch - the device reboots to apply.", "Atinge Foloseşte pentru a schimba – dispozitivul repornește pentru aplicare." }, { "Tap Use to switch - the device reboots to apply. Language files live in /lang on the storage; edit them or add your own.", "Atinge Foloseşte pentru a schimba - dispozitivul reporneşte. Fişierele de limbă stau în /lang pe stocare; editează-le sau adaugă-le pe ale tale." }, @@ -12719,7 +11623,6 @@ static const I18nPair kBuiltin_ro[] = { { "Trace sent…", "Trasare trimisă…" }, { "Tracing route…", "Se trasează ruta…" }, { "Trackball navigates UI", "Trackball-ul navighează UI-ul" }, - { "Trackball: cursor", "Trackball: cursor" }, { "Trackball: navigate UI", "Trackball: navigare UI" }, { "Turn Wi-Fi on first", "Porneşte mai întâi Wi-Fi" }, { "Turn Wi-Fi on, then tap refresh. Apps already installed still work.", "Porneşte Wi-Fi, apoi reîmprospătează. Aplicaţiile instalate funcţionează în continuare." }, @@ -12755,20 +11658,15 @@ static const I18nPair kBuiltin_ro[] = { { "Username (optional)", "Utilizator (opţional)" }, { "Volume", "Volum" }, { "W up · A left · D right · Z down · S select · Q back", "W sus · A stânga · D dreapta · Z jos · S selectare · Q înapoi" }, - { "WADA#15B6A6 MESH#", "WADA#15B6A6 MESH#" }, - { "WADAMESH", "WADAMESH" }, { "Waiting for Wi-Fi...", "Se aşteaptă Wi-Fi..." }, { "Welcome to WADAMESH", "Bun venit la WADAMESH" }, - { "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back.", "What each installed app is allowed to do. Anything an app sends goes out under your node name and cannot be told apart from a message you typed. Private covers direct messages and room posts, and is kept separate from channels on purpose. Turn one off to take it back." }, { "While this is on, anyone on your Wi-Fi can view and control this device. Uses plain HTTP (local network only).", "Cât timp e pornit, oricine din reţeaua ta Wi-Fi poate vedea şi controla dispozitivul. Foloseşte HTTP simplu (doar reţea locală)." }, - { "Wi-Fi", "Wi-Fi" }, { "Wi-Fi & Bluetooth", "Wi-Fi şi Bluetooth" }, { "Wi-Fi is not enabled in this build.", "Wi-Fi nu este activat în acest build." }, { "Wi-Fi isn't available on this build.", "Wi-Fi nu este disponibil în acest build." }, { "Wi-Fi needed to fetch the\nterrain profile for this path.\nConnect in Settings → Wi-Fi.", "E nevoie de Wi-Fi pentru profilul\nde teren al acestei căi.\nConectează-te în Setări → Wi-Fi." }, { "Wi-Fi not connected", "Wi-Fi neconectat" }, { "Wi-Fi off", "Wi-Fi oprit" }, - { "Wi-Fi off, new map areas can't download", "Wi-Fi off, new map areas can't download" }, { "Wi-Fi on", "Wi-Fi pornit" }, { "Wi-Fi on, scanning…", "Wi-Fi pornit, se scanează…" }, { "Wi-Fi saved (radio off)", "Wi-Fi salvat (radio oprit)" }, @@ -12781,7 +11679,6 @@ static const I18nPair kBuiltin_ro[] = { { "Zero-hop", "Fără salt" }, { "Zero-hop advert sent", "Advert zero-hop trimis" }, { "Zoom: +/- buttons", "Zoom: butoane +/-" }, - { "ambiguous (several regions matched)", "ambiguous (several regions matched)" }, { "client connected", "client conectat" }, { "command", "comandă" }, { "contacts (%d):", "contacte (%d):" }, @@ -12795,7 +11692,6 @@ static const I18nPair kBuiltin_ro[] = { { "hold Backspace to unlock", "ţine Backspace pentru deblocare" }, { "hold the d-pad to unlock", "ţine d-pad pentru deblocare" }, { "hold the trackball to unlock", "ţine trackball-ul apăsat pentru deblocare" }, - { "kHz", "kHz" }, { "keep holding", "ţine apăsat" }, { "last wake: ", "ultima trezire: " }, { "leave empty to generate", "lasă gol pentru generare" }, @@ -12805,7 +11701,6 @@ static const I18nPair kBuiltin_ro[] = { { "min (0=off)", "min (0=oprit)" }, { "mkdir failed", "mkdir eşuat" }, { "n/a in this build", "indisponibil în acest build" }, - { "not asked yet", "not asked yet" }, { "now on channel %s", "acum pe canalul %s" }, { "now talking to %s", "acum vorbeşti cu %s" }, { "off", "oprit" }, @@ -12821,10 +11716,7 @@ static const I18nPair kBuiltin_ro[] = { { "tap the language key (e.g. EN) on the keyboard to cycle the ones you enable", "atinge tasta de limbă (ex. EN) de pe tastatură pentru a comuta între cele activate" }, { "tap to cancel", "atinge pentru anulare" }, { "tap to exit full screen", "atinge pentru a ieşi din ecran complet" }, - { "zoom", "zoom" }, - { "zoom %d", "zoom %d" }, { "~17 dB amp for quiet/remote areas; turn off in noisy spots.", "amplificator ~17 dB pentru zone liniştite/izolate; opreşte-l în locuri zgomotoase." }, - { "© OpenTopoMap", "© OpenTopoMap" }, }; static const I18nPair* const kBuiltinLang[LANG_COUNT] = { diff --git a/src/ui-touch/lua_builtin.h b/src/ui-touch/lua_builtin.h index e27651ca..ecbcc827 100644 --- a/src/ui-touch/lua_builtin.h +++ b/src/ui-touch/lua_builtin.h @@ -1,5 +1,5 @@ // Generated by scripts/build/gen-lua-builtin.py — DO NOT EDIT. -// Source: out/firmware/apps/ (the same .lua the Lua Store serves). +// Source: deploy/apps/ (the same .lua the Lua Store serves). // Seeded built-ins: a downloaded /apps/.lua always wins. #pragma once @@ -113,6 +113,9 @@ return app static const char kLuaSrc_airtime[] = R"WADALUA(-- Airtime (Lua) — channel utilization over time: live + average bars with a % -- axis, rx/tx air split, duty ceiling, tx budget and packet counters. local ui, sys, mesh, timer = wada.ui, wada.sys, wada.mesh, wada.timer +-- Translate through the device's language table (wada.sys.tr, added for #257). +-- Older firmware has no sys.tr, so fall back to the English string rather than error. +local tr = sys.tr or function(x) return x end local C = ui.colors local app = {} @@ -129,9 +132,9 @@ local function restart_window() peak_pct = 0 chart:fill(1, 0) chart:fill(2, 0) - head:set("sampling...") + head:set(tr("sampling...")) head:color(C.accent) - sys.toast("window restarted", 900) + sys.toast(tr("window restarted"), 900) end local function refresh() @@ -154,9 +157,9 @@ local function refresh() chart:push(1, math.floor(live)) chart:push(2, math.floor(avg)) - head:set(string.format("channel busy %.1f%%", live)) + head:set(string.format(tr("channel busy %.1f%%"), live)) head:color(live > 50 and C.bad or live > 20 and 0xE8A33D or C.good) - sub:set(string.format("avg %.1f%% peak %.1f%% over %ds", avg, peak_pct, math.floor(wall))) + sub:set(string.format(tr("avg %.1f%% peak %.1f%% over %ds"), avg, peak_pct, math.floor(wall))) if narrow then detail:set(string.format("air rx %ds / tx %ds\nduty %d%% budget %dms\ntx %d rx %d err %d", rx_air, tx_air, st.duty_pct, st.tx_budget_ms, st.tx_pkts, st.rx_pkts, st.rx_err)) @@ -171,8 +174,8 @@ function app.on_open(w, h) local LH12, LH16 = ui.text_h(12), ui.text_h(16) local y = 2 - head = ui.label("sampling...", 4, y, 16, C.accent); head:width(w - 86) - ui.button("Reset", w - 76, y, 70, 30, function() restart_window() end) -- top-right + head = ui.label(tr("sampling..."), 4, y, 16, C.accent); head:width(w - 86) + ui.button(tr("Reset"), w - 76, y, 70, 30, function() restart_window() end) -- top-right y = y + LH16 + 4 sub = ui.label("", 4, y, 12, C.sub); sub:width(w - 10) y = y + LH12 + 5 @@ -188,7 +191,7 @@ function app.on_open(w, h) chart:axis(3, AX) y = y + ch_h + 4 - legend = ui.label("teal = now blue = average", 4, y, 12, C.sub); legend:width(w - 10) + legend = ui.label(tr("teal = now blue = average"), 4, y, 12, C.sub); legend:width(w - 10) y = y + LH12 + 2 detail = ui.label("", 4, y, 12, C.text); detail:width(w - 10) @@ -323,12 +326,1458 @@ function app.on_close() -- frees every widget and the canvas with the app) end +return app +)WADALUA"; +static const char kLuaSrc_sdktest[] = R"WADALUA(-- SDK self-test. Exercises the extended SDK so the results can be read off the +-- screen instead of inferred from a build log. Published to the store as a +-- developer/bench tool. +-- +-- 1.2 adds wada.crypto (checked against published RFC vectors, so a PASS here is +-- real evidence and not just "it returned something"), wada.mesh.channels, and +-- wada.mesh.send_dm. +-- 1.3 adds the discovery surface (wada.mesh.discover / discovered), packet +-- identity in rx_log, exact micro-degree coordinates, wada.ui.input and the +-- windowed wada.fs.read. +-- 1.6 adds wada.sd.list: capability reporting, traversal rejection, root +-- metadata, and a nested directory listing when the card contains one. +-- 1.5 uses wada.ui.text_lines() to measure instead of estimating, where the +-- firmware has it. That call was added because of the 1.3 bug below: an app +-- could ask how tall a line is but not how wide, so laying out rows meant +-- guessing whether text would wrap. Falls back to the 1.4 estimate on older +-- firmware, so it still lays out correctly there. +-- 1.4 fixes rows drawing on top of one another. label:width() turns wrapping +-- on, so any line wider than the screen became two lines while the caller still +-- advanced by one, and the next row landed on top. Reported with a photo of the +-- channels line sitting across the contacts line. row() now owns the cursor and +-- advances by the height the text actually needs. +local ui, sys, store, timer = wada.ui, wada.sys, wada.store, wada.timer +local C = ui.colors + +local app = {} +local rows, keyline, sendline, dmline, msgline = {}, nil, nil, nil, nil +local discline, inputline = nil, nil +local W = 300 + +-- row() owns the vertical cursor. Every caller used to pass a y and then add a +-- hand-picked constant, which is only correct while the text fits on one line. +-- An app cannot measure rendered text, so the wrapped line count is estimated +-- from a deliberately pessimistic character width: over-estimating costs a +-- little whitespace, under-estimating overlaps the next row. +local LH, GAP = 14, 3 +local cy = 4 +local function row(text, color, extra_gap) + local l = ui.label(text, 6, cy, 12, color or C.text) + l:width(W - 12) + rows[#rows + 1] = l + local n + if ui.text_lines then + n = ui.text_lines(tostring(text), W - 12, 12) -- measured: exact + else + local cpl = math.max(16, (W - 12) // 7) -- older firmware: estimate + n = 0 + for seg in (tostring(text) .. "\n"):gmatch("(.-)\n") do + n = n + math.max(1, math.ceil(#seg / cpl)) + end + end + cy = cy + math.max(1, n or 1) * LH + GAP + (extra_gap or 0) + return l +end +local function yn(v) return v and "yes" or "NO" end + +function app.on_open(w, h) + W = w or 300 + ui.scroll(true) + cy = 4 + local y + + local c = sys.caps() + row("caps: sdk_ext=" .. yn(c.sdk_ext) .. " kbd=" .. yn(c.keyboard) .. + " touch=" .. yn(c.touch) .. " sd=" .. yn(c.sd), C.accent) + row("caps: sd_list=" .. yn(c.sd_list) .. " discover=" .. yn(c.discover) .. + " input=" .. yn(c.input) .. + " rx_identity=" .. yn(c.rx_identity), C.accent) + row("layout: " .. (ui.text_lines and "measured (ui.text_lines)" or "estimated (older firmware)"), + ui.text_lines and C.good or C.sub) + -- crypto: published test vectors, so this is checkable rather than merely alive + if wada.crypto then + local hex = wada.crypto.hex + local k20 = string.rep(string.char(0x0b), 20) + local checks = { + { "sha256('abc')", hex(wada.crypto.sha256("abc")), + "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad" }, + { "sha1('abc')", hex(wada.crypto.sha1("abc")), + "a9993e364706816aba3e25717850c26c9cd0d89d" }, + { "hmac_sha1 RFC2202#1", hex(wada.crypto.hmac_sha1(k20, "Hi There")), + "b617318655057264e28bc0b6fb378c8ef146be00" }, + { "hmac_sha256 RFC4231#1", hex(wada.crypto.hmac_sha256(k20, "Hi There")), + "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7" }, + } + local allok = true + for _, t in ipairs(checks) do + local ok = (t[2] == t[3]) + if not ok then allok = false end + row("crypto " .. t[1] .. ": " .. (ok and "PASS" or ("FAIL got " .. tostring(t[2]):sub(1, 16))), + ok and C.good or C.bad) + end + -- The point of having it in C: this loop would blow the instruction budget in Lua. + local t0 = sys.millis() + for _ = 1, 200 do wada.crypto.hmac_sha1(k20, "Hi There") end + row(string.format("crypto: 200 x hmac_sha1 in %d ms%s", sys.millis() - t0, + allok and "" or " (VECTORS FAILED)"), allok and C.good or C.bad) + else + row("wada.crypto: MISSING", C.bad) + end + + -- channel discovery + local chans = wada.mesh.channels and wada.mesh.channels() or nil + if chans then + local names = table.concat(chans, ", ") + row("channels(): " .. #chans .. " " .. names:sub(1, 60), C.text) + else + row("wada.mesh.channels: MISSING", C.bad) + end + + if not c.sdk_ext then + row("extended SDK is OFF on this board - stopping here.", C.sub) + return + end + + -- contacts, so send_dm has a target to name. 1.3 also checks the pubkey field. + local cts = wada.mesh.contacts() + local first = cts[1] and cts[1].name or nil + row("contacts: " .. #cts .. (first and (" first=" .. first) or ""), C.text) + if cts[1] then + local pk = cts[1].pubkey + row("contacts[1].pubkey: " .. tostring(pk) .. + (type(pk) == "string" and #pk == 8 and " PASS" or " FAIL"), + (type(pk) == "string" and #pk == 8) and C.good or C.bad) + end + + local me = wada.mesh.self() + row("self: " .. tostring(me.name) .. " pubkey=" .. tostring(me.pubkey), C.text) + -- Exact coordinates. Lua's floats here are 32-bit, so an app that logs a track + -- must use the _e6 integers; this proves they are present and consistent. + local fix = sys.gps() + if fix then + local drift = math.abs(fix.lat_e6 / 1e6 - fix.lat) + row(string.format("gps: %d,%d e6 alt %dm %d sats drift %.6f %s", + fix.lat_e6, fix.lon_e6, fix.alt_m or 0, fix.sats, drift, + drift < 0.001 and "PASS" or "FAIL"), drift < 0.001 and C.good or C.bad) + else + row("gps: no fix (normal indoors)", C.sub) + end + + -- rx_log identity: adverts carry a real public key, addressed frames carry + -- one-byte hashes, everything else carries nothing. All three are correct. + local log = wada.mesh.rx_log() + local withpk, withsrc = 0, 0 + for _, r in ipairs(log) do + if r.pubkey then withpk = withpk + 1 end + if r.src then withsrc = withsrc + 1 end + end + row(string.format("rx_log: %d frames, %d with a pubkey (adverts), %d with src/dst", + #log, withpk, withsrc), #log > 0 and C.text or C.sub) + -- fs: windowed read. Writes once (the 1/sec limit means one write per open). + if wada.fs then + local probe = "0123456789abcdef" + wada.fs.write("sdktest.bin", probe) + local part, total = wada.fs.read("sdktest.bin", 4, 4) + local ok = (part == "4567" and total == #probe) + row("fs.read(name,4,4): " .. tostring(part) .. " total=" .. tostring(total) .. + (ok and " PASS" or " FAIL"), ok and C.good or C.bad) + end + + -- Physical SD listing is read-only and independently feature-detected. A + -- supported board with no inserted card is a normal bench state, not a test + -- failure; API shape and path rejection can still be checked separately. + if c.sd_list then + if not wada.sd or not wada.sd.list then + row("wada.sd.list: MISSING despite caps", C.bad) + else + local guard_ok, guard_failure = true, nil + local bad_paths = { "/..", "/.", "/a/../b", "/a//b", "/a/", "relative", "/a\\b" } + for _, path in ipairs(bad_paths) do + local rejected, baderr = wada.sd.list(path) + if rejected ~= nil or baderr ~= "bad path" then + guard_ok = false + guard_failure = path .. " -> " .. tostring(baderr) + break + end + end + row("sd traversal guard: " .. (guard_ok and "PASS" or ("FAIL " .. guard_failure)), + guard_ok and C.good or C.bad) + + local entries, err = wada.sd.list("/") + if not entries then + local note = err == "busy" and " (retry later)" or " (no readable card)" + row("sd.list('/'): " .. tostring(err) .. note, C.sub) + else + local metadata_ok, first_dir = true, nil + for _, entry in ipairs(entries) do + if type(entry.name) ~= "string" or + (entry.type ~= "file" and entry.type ~= "dir") or + type(entry.size) ~= "number" or type(entry.mtime) ~= "number" then + metadata_ok = false + end + if not first_dir and entry.type == "dir" then first_dir = entry.name end + end + row("sd.list('/'): " .. #entries .. " entries, metadata " .. + (metadata_ok and "PASS" or "FAIL") .. + (entries.truncated and " (truncated)" or ""), + metadata_ok and C.good or C.bad) + if first_dir then + local nested, nested_err = wada.sd.list("/" .. first_dir) + row("sd.list('/" .. first_dir .. "'): " .. + (nested and (#nested .. " entries PASS") or ("FAIL " .. tostring(nested_err))), + nested and C.good or C.bad) + else + row("sd nested listing: no directory on card to test", C.sub) + end + end + end + else + row("wada.sd.list: unavailable on this board", C.sub) + end + + sendline = row("mesh.send: not tried yet", C.sub) + dmline = row("mesh.send_dm: not tried yet", C.sub) + msgline = row("on_message: waiting (needs the read permissions)", C.sub) + y = cy + 4 + ui.button("Send to Public", 6, y, 120, 30, function() + local ok, err = wada.mesh.send("Public", "wadamesh SDK self-test") + sendline:set("mesh.send: " .. tostring(ok) .. " " .. tostring(err)) + sendline:color(ok and C.good or C.bad) + end) + ui.button("DM first contact", 132, y, 130, 30, function() + if not first then dmline:set("mesh.send_dm: no contacts to target"); dmline:color(C.bad); return end + local ok, err = wada.mesh.send_dm(first, "wadamesh SDK self-test (DM)") + dmline:set("mesh.send_dm -> " .. first .. ": " .. tostring(ok) .. " " .. tostring(err)) + dmline:color(ok and C.good or C.bad) + end) + cy = y + 38 + discline = row("mesh.discover: not tried yet", C.sub) + inputline = row("ui.input: not tried yet", C.sub) + -- Probing TRANSMITS and makes every neighbour reply, so it is a button, not + -- something this app does on open. + y = cy + 4 + ui.button("Probe", 6, y, 90, 30, function() + local tag, err = wada.mesh.discover() + if not tag then + discline:set("mesh.discover: " .. tostring(err)); discline:color(C.bad); return + end + discline:set("mesh.discover: sent, waiting for replies..."); discline:color(C.text) + end) + ui.button("Results", 102, y, 90, 30, function() + local hits = wada.mesh.discovered() + if #hits == 0 then + discline:set("discovered(): nothing yet - probe, then wait a few seconds") + discline:color(C.sub); return + end + local h = hits[1] + discline:set(string.format("discovered(): %d first %s snr %.1f/%.1f %s", + #hits, h.name or h.pubkey, h.snr, h.their_snr, h.direct and "direct" or (h.hops .. "h"))) + discline:color(C.good) + end) + y = y + 34 + ui.button("Beep", 6, y, 70, 30, function() sys.beep() end) + ui.button("Input", 82, y, 90, 30, function() + ui.input("Type anything", "hello", function(text) + inputline:set("ui.input -> " .. (text and ("'" .. text .. "'") or "cancelled")) + inputline:color(text and C.good or C.sub) + end) + end) +end + +function app.on_input(ev) + if ev.type == "key" and keyline then + keyline:set("keys: got '" .. tostring(ev.key) .. "'") + keyline:color(C.good) + end +end + +-- Proves the kind field and that DMs/rooms reach an app at all, not just channels. +function app.on_message(m) + if not msgline then return end + msgline:set("on_message: kind=" .. tostring(m.kind) .. " from=" .. tostring(m.sender) .. + " ch=" .. tostring(m.channel) .. " text=" .. tostring(m.text):sub(1, 20)) + msgline:color(C.good) +end + +return app +)WADALUA"; +static const char kLuaSrc_2048[] = R"WADALUA(-- 2048 — wada.* reference app +-- Swipe (or trackball mapped swipe) to move tiles. +-- Tap after win or game over to restart. + +local ui, sys, store, timer = wada.ui, wada.sys, wada.store, wada.timer +local C = ui.colors + +local app = {} + +local cv, score_lbl + +local CELL = 38 + +local grid = {} + +local history = { + grids = {}, + maxsize = 5 +} + +local px_w, px_h +local score = 0 +local hiscore = 0 + +local over = false +local won = false + + +-------------------------------------------------- +-- History +-------------------------------------------------- + +function history:save() + + local old = { + grid = {}, + score = score, + over = over, + won = won + } + + for x = 1, 4 do + + old.grid[x] = {} + + for y = 1, 4 do + old.grid[x][y] = grid[x][y] + end + + end + + table.insert(self.grids, old) + + if #self.grids > self.maxsize then + table.remove(self.grids, 1) + end + +end + + +function history:revert() + + if #self.grids > 0 then + + local old = table.remove(self.grids) + + grid = old.grid + score = old.score + over = old.over + won = old.won + + end + +end + + +-------------------------------------------------- +-- Game logic +-------------------------------------------------- + +local function clear_grid() + + grid = {} + + for x = 1, 4 do + + grid[x] = {} + + for y = 1, 4 do + grid[x][y] = 0 + end + + end + +end + + +-------------------------------------------------- +-- Add random tile +-------------------------------------------------- + +local function add_random_tile() + + local free = {} + + for x = 1, 4 do + + for y = 1, 4 do + + if grid[x][y] == 0 then + + table.insert( + free, + { + x = x, + y = y + } + ) + + end + + end + + end + + + -- Board is full. + if #free == 0 then + return false + end + + + local p + + + -- If there is only one empty cell, + -- use it directly. + if #free == 1 then + + p = free[1] + + else + + local index = sys.random(1, #free) + + if index == nil then + return false + end + + p = free[index] + + if p == nil then + return false + end + + end + + + -- 10% chance for 4, + -- 90% chance for 2. + if sys.random(0, 9) == 0 then + grid[p.x][p.y] = 4 + else + grid[p.x][p.y] = 2 + end + + return true + +end + + +-------------------------------------------------- +-- Reset +-------------------------------------------------- + +local function reset() + + clear_grid() + + score = 0 + over = false + won = false + + history.grids = {} + + add_random_tile() + add_random_tile() + +end + + +-------------------------------------------------- +-- Compress line +-------------------------------------------------- + +local function compress(line) + + local r = {} + + for i = 1, 4 do + + if line[i] ~= 0 then + table.insert(r, line[i]) + end + + end + + while #r < 4 do + table.insert(r, 0) + end + + return r + +end + + +-------------------------------------------------- +-- Merge line +-------------------------------------------------- + +local function merge(line) + + local r = {} + local i = 1 + + while i <= 4 do + + if i < 4 + and line[i] ~= 0 + and line[i] == line[i + 1] + then + + local v = line[i] * 2 + + table.insert(r, v) + + score = score + v + + + -- Permanent high score. + if score > hiscore then + + hiscore = score + + store.set( + "2048_best", + hiscore + ) + + end + + + -- Reaching 2048 means victory. + if v >= 2048 then + won = true + end + + + i = i + 2 + + else + + table.insert(r, line[i]) + + i = i + 1 + + end + + end + + + while #r < 4 do + table.insert(r, 0) + end + + return r + +end + + +-------------------------------------------------- +-- Move left +-------------------------------------------------- + +local function move_left() + + local changed = false + + for y = 1, 4 do + + local old = {} + local line = {} + + for x = 1, 4 do + + old[x] = grid[x][y] + line[x] = grid[x][y] + + end + + + line = compress(line) + line = merge(line) + + + for x = 1, 4 do + + grid[x][y] = line[x] + + if old[x] ~= line[x] then + changed = true + end + + end + + end + + return changed + +end + + +-------------------------------------------------- +-- Rotate +-------------------------------------------------- + +local function rotate() + + local n = {} + + for x = 1, 4 do + n[x] = {} + end + + + for x = 1, 4 do + + for y = 1, 4 do + + n[y][5 - x] = grid[x][y] + + end + + end + + + grid = n + +end + + +-------------------------------------------------- +-- Game over +-------------------------------------------------- + +local function game_over() + + -- Any empty cell means the game can continue. + for x = 1, 4 do + + for y = 1, 4 do + + if grid[x][y] == 0 then + return false + end + + end + + end + + + -- Check horizontal and vertical merges. + for x = 1, 4 do + + for y = 1, 4 do + + if x < 4 + and grid[x][y] == grid[x + 1][y] + then + return false + end + + + if y < 4 + and grid[x][y] == grid[x][y + 1] + then + return false + end + + end + + end + + + -- Board is full and no merge is possible. + return true + +end + + +-------------------------------------------------- +-- Move +-------------------------------------------------- + +local function move(dir) + + -- Do nothing after victory or defeat. + if over or won then + return + end + + + history:save() + + local changed = false + + + if dir == "left" then + + changed = move_left() + + + elseif dir == "right" then + + rotate() + rotate() + + changed = move_left() + + rotate() + rotate() + + + elseif dir == "up" then + + rotate() + + changed = move_left() + + rotate() + rotate() + rotate() + + + elseif dir == "down" then + + rotate() + rotate() + rotate() + + changed = move_left() + + rotate() + + end + + + -------------------------------------------------- + -- Nothing moved. + -------------------------------------------------- + + if not changed then + + history:revert() + + return + + end + + + -------------------------------------------------- + -- Successful move. + -- Exactly one new tile must be created. + -------------------------------------------------- + + local added = add_random_tile() + + + -------------------------------------------------- + -- This should only happen if the board was already + -- completely full. Normally a successful move on a + -- full board creates space, so added should be true. + -------------------------------------------------- + + if not added then + + over = true + + return + + end + + + -------------------------------------------------- + -- Victory. + -- + -- merge() sets won when a 2048 tile is created. + -------------------------------------------------- + + if won then + return + end + + + -------------------------------------------------- + -- IMPORTANT: + -- + -- Game-over is checked AFTER the new random tile + -- has been inserted. + -------------------------------------------------- + + if game_over() then + over = true + end + +end + + +-------------------------------------------------- +-- Tile colors +-------------------------------------------------- + +local function tile_color(v) + + if v == 0 then + return 0xCDC1B4 + + elseif v == 2 then + return 0xEEE4DA + + elseif v == 4 then + return 0xEDE0C8 + + elseif v == 8 then + return 0xF2B179 + + elseif v == 16 then + return 0xF59563 + + elseif v == 32 then + return 0xF67C5F + + elseif v == 64 then + return 0xF65E3B + + elseif v == 128 then + return 0xEDCF72 + + elseif v == 256 then + return 0xEDCC61 + + elseif v == 512 then + return 0xEDC850 + + elseif v == 1024 then + return 0xEDC53F + + elseif v == 2048 then + return 0xEDC22E + + end + + -- Values above 2048. + return 0x3C3A32 + +end + + +-------------------------------------------------- +-- Text colors +-------------------------------------------------- + +local function text_color(v) + + if v <= 4 then + return 0x776E65 + else + return 0xFFFFFF + end + +end + + +-------------------------------------------------- +-- Text size +-------------------------------------------------- + +local function text_size(v) + + if v < 100 then + return 16 + + elseif v < 1000 then + return 14 + + elseif v < 10000 then + return 11 + + else + return 9 + end + +end + + +-------------------------------------------------- +-- Text positioning +-------------------------------------------------- + +local function text_x(px, v, size) + + local width + + if v < 100 then + width = size * 1.1 + + elseif v < 1000 then + width = size * 1.7 + + elseif v < 10000 then + width = size * 2.3 + + else + width = size * 2.9 + end + + + return px + math.floor( + (CELL - width) / 2 + ) + +end + + +local function text_y(py, size) + + return py + math.floor( + (CELL - size) / 2 + ) + +end + + +-------------------------------------------------- +-- Score line +-------------------------------------------------- + +local function scoreline() + + local status = "" + + if won then + + status = " - tap retry" + + elseif over then + + status = " - tap retry" + + end + + + score_lbl:set( + string.format( + "Score %d Best %d%s", + score, + hiscore, + status + ) + ) + +end + + +-------------------------------------------------- +-- Draw +-------------------------------------------------- + +local function draw() + + cv:fill(0x101418) + + + for x = 1, 4 do + + for y = 1, 4 do + + local px = (x - 1) * CELL + local py = (y - 1) * CELL + + local v = grid[x][y] + + + cv:rect( + px + 2, + py + 2, + CELL - 4, + CELL - 4, + tile_color(v), + true, + 4 + ) + + + if v > 0 then + + local size = text_size(v) + + cv:text( + text_x(px, v, size), + text_y(py, size), + tostring(v), + text_color(v), + size + ) + + end + + end + + end + + + -------------------------------------------------- + -- End messages + -------------------------------------------------- + + if won then + + cv:text( + 30, + px_h / 2, + "YOU WIN!", + C.good, + 18 + ) + + elseif over then + + cv:text( + 30, + px_h / 2, + "GAME OVER", + C.bad, + 18 + ) + + end + +end + + +-------------------------------------------------- +-- WADAMESH API +-------------------------------------------------- + +function app.on_open(w, h) + + hiscore = store.get( + "2048_best", + 0 + ) + + + px_w = CELL * 4 + px_h = CELL * 4 + + + score_lbl = ui.label( + "", + 4, + 4, + 14, + C.text + ) + + + cv = ui.canvas( + px_w, + px_h + ) + + + cv:pos( + math.floor( + (w - px_w) / 2 + ), + 28 + ) + + + reset() + + scoreline() + draw() + + + timer.every(100) + +end + + +function app.on_input(ev) + + if ev.type == "swipe" then + + move(ev.dir) + + scoreline() + draw() + + + elseif ev.type == "down" + and (over or won) + then + + reset() + + scoreline() + draw() + + end + +end + + +function app.on_tick(dt) + +end + + +function app.on_close() + +end + + +return app +)WADALUA"; +static const char kLuaSrc_wardrive[] = R"WADALUA(-- Wardrive (Lua) — a LoRa coverage survey that logs to a CSV you can pull off +-- the device afterwards. +-- +-- Reference app for the discovery half of the SDK. It works the way a survey +-- has to work: it PROBES rather than listens. A probe is a zero-hop request +-- that every node in earshot answers, so a reply proves the link works from +-- exactly where you are standing. Listening only ever tells you what happened +-- to transmit while you were there, which is a different and much weaker claim. +-- +-- Each reply carries both directions of the link: how well we heard them, and +-- how well they heard us. They are rarely equal, and the asymmetry is the point +-- -- "I can hear the repeater but it cannot hear me" is not the same fact as +-- "no coverage", and only a probe reveals it. +local ui, sys, mesh, fs, timer = wada.ui, wada.sys, wada.mesh, wada.fs, wada.timer +local C = ui.colors +local app = {} + +local SWEEP_MS = 20000 -- above the 15 s floor the firmware enforces on probes +local HARVEST_MS = 4000 -- replies land over the few seconds after a probe +local TYPE = { [1]="chat", [2]="repeater", [3]="room", [4]="sensor" } + +local run, running, samples, sweeps, last_err = "run", false, 0, 0, nil +local node_count = 0 +local phase, phase_at = "idle", 0 +local hdr, gps_lbl, stat_lbl, rows = nil, nil, nil, {} +local nodes = {} -- pubkey -> { name, type, best, worst, seen } +local pending = {} -- lines waiting on the 1 write/sec limit + +local function logname() return run .. ".csv" end + +-- Lua here is built with 32-bit floats, so fix.lat is good to about a metre and +-- no better. fix.lat_e6 is the same reading as an exact integer in +-- micro-degrees, which is what belongs in a log: a survey you plot months later +-- should not carry rounding the device never had. +local HEADER = "epoch,lat_e6,lon_e6,alt_m,pubkey,name,type,rssi,snr,their_snr,hops" +local wrote_header = false + +-- The filesystem allows one write a second. Sweeps produce a burst of rows, so +-- they queue here and drain a chunk per tick instead of being dropped. +local function flush() + if #pending == 0 then return end + local chunk = table.concat(pending, "\n") .. "\n" + if not wrote_header then chunk = HEADER .. "\n" .. chunk end + local ok = fs.append(logname(), chunk) + if ok then pending, wrote_header = {}, true end +end + +local function record(fix, hit) + local key = hit.pubkey + local n = nodes[key] + if not n then + n = { name = hit.name or key, type = hit.type, best = hit.snr, worst = hit.snr, seen = 0 } + nodes[key] = n + node_count = node_count + 1 + end + if hit.snr > n.best then n.best = hit.snr end + if hit.snr < n.worst then n.worst = hit.snr end + n.seen = n.seen + 1 + if hit.name then n.name = hit.name end + + samples = samples + 1 + pending[#pending + 1] = string.format("%d,%d,%d,%d,%s,%s,%d,%d,%.2f,%.2f,%d", + fix.time or sys.epoch(), fix.lat_e6, fix.lon_e6, fix.alt_m or 0, + key, (hit.name or ""):gsub(",", " "), hit.type, + hit.rssi, hit.snr, hit.their_snr, hit.hops) +end + +local function sweep() + local tag, err = mesh.discover() -- every node type + if not tag then last_err = err; return false end + last_err = nil + sweeps = sweeps + 1 + return true +end + +local function harvest() + local fix = sys.gps() + if not fix then + -- No fix means the sample cannot be placed, so it is discarded rather than + -- logged at 0,0. A survey file with phantom points at Null Island is worse + -- than a shorter one. + mesh.discover_clear() + return + end + for _, hit in ipairs(mesh.discovered()) do record(fix, hit) end + mesh.discover_clear() -- next sample must not inherit this one +end + +local function redraw() + local fix = sys.gps() + if fix then + gps_lbl:set(string.format("%.5f, %.5f %dm %d sats", fix.lat, fix.lon, fix.alt_m or 0, fix.sats)) + gps_lbl:color(C.good) + else + gps_lbl:set("waiting for a GPS fix - samples are discarded until then") + gps_lbl:color(C.bad) + end + + local state = running and (phase == "probe" and "listening..." or "sweeping") or "stopped" + stat_lbl:set(string.format("%s | %s | %d sweeps, %d samples, %d nodes%s", + run, state, sweeps, samples, node_count, + last_err and (" [" .. last_err .. "]") or "")) + stat_lbl:color(last_err and C.bad or C.accent) + + local list = {} + for key, n in pairs(nodes) do list[#list + 1] = { key = key, n = n } end + table.sort(list, function(a, b) return a.n.best > b.n.best end) + for i = 1, #rows do + local e = list[i] + if e then + rows[i]:set(string.format("%-14s %-8s best %5.1f worst %5.1f x%d", + e.n.name:sub(1, 14), TYPE[e.n.type] or "?", e.n.best, e.n.worst, e.n.seen)) + rows[i]:color(e.n.best > 0 and C.good or C.text) + else + rows[i]:set(i == 1 and "nothing has answered a probe yet" or "") + rows[i]:color(C.sub) + end + end +end + +function app.on_open(w, h) + if not sys.caps().discover then + ui.label("This board does not carry the extended SDK,", 6, 8, 12, C.bad) + ui.label("so it cannot send discovery probes.", 6, 26, 12, C.bad) + return + end + ui.scroll(true) + local LH = ui.text_h(12) + local y = 4 + + hdr = ui.label("LoRa coverage survey", 4, y, 12, C.accent); hdr:width(w - 10); y = y + LH + 3 + gps_lbl = ui.label("", 4, y, 12, C.sub); gps_lbl:width(w - 10); y = y + LH + 3 + stat_lbl = ui.label("", 4, y, 12, C.text); stat_lbl:width(w - 10); y = y + LH * 2 + 5 + + local bw = math.min(96, (w - 20) // 3) + ui.button("Start", 4, y, bw, 32, function() + running = not running + if running then phase, phase_at = "idle", 0 end + sys.toast(running and "Survey running" or "Survey stopped", 1200) + end) + ui.button("Name", 8 + bw, y, bw, 32, function() + ui.input("Name this run", run, function(text) + if text then + run = text:gsub("[^%w%-_]", "_") + wrote_header = false -- a new file needs its own header row + sys.toast("Logging to " .. logname(), 1500) + end + end) + end) + ui.button("Reset", 12 + bw * 2, y, bw, 32, function() + nodes, samples, sweeps, pending, node_count = {}, 0, 0, {}, 0 + mesh.discover_clear() + fs.remove(logname()) + wrote_header = false + sys.toast("Cleared " .. logname(), 1200) + end) + y = y + 38 + + ui.label("strongest first", 4, y, 12, C.sub); y = y + LH + 2 + for i = 1, 12 do + rows[i] = ui.label("", 4, y, 12, C.text); rows[i]:width(w - 10); y = y + LH + 2 + end + + redraw() + timer.every(1000) +end + +function app.on_tick() + if running then + local now = sys.millis() + if phase == "idle" or (phase == "wait" and now - phase_at >= SWEEP_MS) then + -- A refused or rate-limited probe backs off a full sweep interval. Retrying + -- every tick would re-enter the permission path once a second for nothing. + phase, phase_at = sweep() and "probe" or "wait", now + elseif phase == "probe" and now - phase_at >= HARVEST_MS then + harvest() + phase = "wait" -- phase_at stays at the probe time, so sweeps stay on cadence + end + end + flush() + redraw() +end + +function app.on_close() + flush() -- one last drain; anything queued would otherwise be lost +end + +return app +)WADALUA"; +static const char kLuaSrc_nearby[] = R"WADALUA(-- Nearby (Lua) — contacts on a real map, with distance and bearing, and a live +-- packet counter. +-- +-- Reference app for the four things the SDK gained alongside it: wada.map (the +-- firmware's own tiles inside an app page), wada.ui.list (scrollable selectable +-- rows), app.on_packet (each frame delivered once instead of polled), and +-- wada.geo (great-circle maths in C rather than in your instruction budget). +local ui, sys, mesh, geo, timer = wada.ui, wada.sys, wada.mesh, wada.geo, wada.timer +local C = ui.colors +local app = {} + +local map, list, hdr, detail = nil, nil, nil, nil +local pts, sel = {}, 0 +local pkt_count, pkt_adverts = 0, 0 +local W, H + +local function here() + local fix = sys.gps() + if fix then return fix.lat, fix.lon, true end + local me = mesh.self() + -- self() is the last known position, which may be old. Say which one is in + -- use rather than presenting a stale fix as a live one. + if me.lat ~= 0 or me.lon ~= 0 then return me.lat, me.lon, false end + return nil +end + +local function fmt_dist(m) + if m < 1000 then return string.format("%.0f m", m) end + return string.format("%.1f km", m / 1000) +end + +local function rebuild() + local lat, lon, live = here() + pts, sel = {}, 0 + for _, c in ipairs(mesh.contacts()) do + if c.lat ~= 0 or c.lon ~= 0 then + local e = { name = c.name, lat = c.lat, lon = c.lon, type = c.type, pubkey = c.pubkey } + if lat then + e.dist = geo.distance(lat, lon, c.lat, c.lon) + e.brg = geo.bearing(lat, lon, c.lat, c.lon) + end + pts[#pts + 1] = e + end + end + if lat then table.sort(pts, function(a, b) return (a.dist or 1e9) < (b.dist or 1e9) end) end + + list:clear() + for i, e in ipairs(pts) do + local label = e.dist + and string.format("%-12s %8s %-2s", e.name:sub(1, 12), fmt_dist(e.dist), geo.cardinal(e.brg)) + or e.name + list:add(label, function() app.pick(i) end) + end + if #pts == 0 then list:add("no contacts have a position yet") end + + hdr:set(string.format("%d placed | %s | %d frames (%d adverts)", + #pts, lat and (live and "GPS fix" or "last known position") or "no position", pkt_count, pkt_adverts)) + hdr:color(lat and C.accent or C.bad) + + if lat then app.draw(lat, lon) end +end + +function app.draw(lat, lon) + if not map then return end + map:center(lat, lon) + map:clear() + if map:tiles() == 0 then + -- An empty rectangle looks like open water. Say what it actually is. + detail:set("no map tiles cached here at zoom " .. map:zoom()) + detail:color(C.sub) + end + for i, e in ipairs(pts) do + map:line(lat, lon, e.lat, e.lon, i == sel and C.good or 0x2A3340, i == sel and 2 or 1) + end + for i, e in ipairs(pts) do + map:marker(e.lat, e.lon, i == sel and C.good or C.accent, i == sel and 12 or 8) + end + map:marker(lat, lon, 0xE8A33D, 10) -- us, last so it sits on top +end + +function app.pick(i) + sel = i + list:select(i) + local e = pts[i] + if not e then return end + local lat, lon = here() + if e.dist then + detail:set(string.format("%s %s %.0f deg (%s) %s", + e.name, fmt_dist(e.dist), e.brg, geo.cardinal(e.brg), e.pubkey)) + else + detail:set(e.name .. " " .. e.pubkey) + end + detail:color(C.text) + if lat then app.draw(lat, lon) end +end + +function app.on_open(w, h) + W, H = w, h + local LH = ui.text_h(12) + hdr = ui.label("", 4, 4, 12, C.accent); hdr:width(w - 10) + + -- hdr and detail below are width-limited, which turns wrapping on, and both + -- carry variable-length text (node names, a status phrase). Reserve two lines + -- for each: a wrapped line would otherwise be drawn over by whatever follows. + local map_h = math.floor(h * 0.45) + local y = 4 + LH * 2 + 4 + if sys.caps().map then + map = wada.map.view(4, y, w - 8, map_h) + else + ui.label("this board has no map support", 6, y + 10, 12, C.sub) + end + y = y + map_h + 4 + + detail = ui.label("pick a contact", 4, y, 12, C.sub); detail:width(w - 10) + y = y + LH * 2 + 4 + + list = ui.list(4, y, w - 8, h - y - 4) + + rebuild() + -- Two cadences, which is what wada.timer.after/every made possible: a slow + -- rebuild (contacts and GPS move slowly) and no fast tick at all, because + -- packets now arrive by callback instead of being polled for. + timer.every(5000, rebuild) +end + +-- One call per frame the radio received, in arrival order. Counting was simply +-- not possible against a polled 16-entry ring. +function app.on_packet(p) + pkt_count = pkt_count + 1 + if p.pubkey then pkt_adverts = pkt_adverts + 1 end +end + +function app.on_close() + if map then map:close() end +end + return app )WADALUA"; static const LuaBuiltinApp kLuaBuiltin[] = { { "monitor", "RF Monitor", "1.3", kLuaSrc_monitor }, - { "airtime", "Airtime", "1.3", kLuaSrc_airtime }, + { "airtime", "Airtime", "1.4", kLuaSrc_airtime }, { "snake", "Snake", "1.0", kLuaSrc_snake }, + { "sdktest", "SDK Test", "1.6", kLuaSrc_sdktest }, + { "2048", "2048", "1.2", kLuaSrc_2048 }, + { "wardrive", "Wardrive", "1.0", kLuaSrc_wardrive }, + { "nearby", "Nearby", "1.0", kLuaSrc_nearby }, }; static const int kLuaBuiltinCount = (int)(sizeof(kLuaBuiltin)/sizeof(kLuaBuiltin[0])); diff --git a/tanmatsu/build.sh b/tanmatsu/build.sh index f30d4958..7b594165 100755 --- a/tanmatsu/build.sh +++ b/tanmatsu/build.sh @@ -6,10 +6,10 @@ # ./build.sh menuconfig set -e -# Keep the baked-in translation table in step with deploy/apps/lang/*.lang. -# The PlatformIO envs get this from a pre: hook; the IDF builds need it here -# or a .lang edit ships stale translations on the P4 boards. -python3 "$(cd "$(dirname "$0")/.." && pwd)/scripts/build/pre_gen_lang.py" +# Keep the baked-in translation + Lua app tables in step with deploy/apps/. +# Same for the seeded Lua apps. The PlatformIO envs get this from a pre: hook; +# the IDF builds need it here or the P4 boards ship stale copies. +python3 "$(cd "$(dirname "$0")/.." && pwd)/scripts/build/pre_gen_baked.py" cd "$(dirname "$0")" export IDF_TOOLS_PATH="$PWD/esp-idf-tools" # shellcheck disable=SC1091 diff --git a/tdisplay_p4/build.sh b/tdisplay_p4/build.sh index 5c11e39a..f609b254 100755 --- a/tdisplay_p4/build.sh +++ b/tdisplay_p4/build.sh @@ -8,10 +8,10 @@ # ./build.sh menuconfig set -e -# Keep the baked-in translation table in step with deploy/apps/lang/*.lang. -# The PlatformIO envs get this from a pre: hook; the IDF builds need it here -# or a .lang edit ships stale translations on the P4 boards. -python3 "$(cd "$(dirname "$0")/.." && pwd)/scripts/build/pre_gen_lang.py" +# Keep the baked-in translation + Lua app tables in step with deploy/apps/. +# Same for the seeded Lua apps. The PlatformIO envs get this from a pre: hook; +# the IDF builds need it here or the P4 boards ship stale copies. +python3 "$(cd "$(dirname "$0")/.." && pwd)/scripts/build/pre_gen_baked.py" cd "$(dirname "$0")" export IDF_TOOLS_PATH="$PWD/esp-idf-tools" # shellcheck disable=SC1091