Compare commits
16 Commits
dev
..
dev-offline
| Author | SHA1 | Date | |
|---|---|---|---|
| ba4fd3eff5 | |||
| beb3e1996d | |||
| 3f4e6f4e13 | |||
| e1cc285c8a | |||
| f4b32e8a8a | |||
| 01bf95c98e | |||
| fa044dd204 | |||
| 72fea3fc32 | |||
| f0bd61144c | |||
| 61c897630c | |||
| a270e2e6d1 | |||
| 247db6a36d | |||
| 78d08afb47 | |||
| c77264cc81 | |||
| d6ed8c5f13 | |||
| 209fee48ca |
@@ -1,3 +0,0 @@
|
|||||||
github: [zjs81]
|
|
||||||
custom:
|
|
||||||
- "https://paypal.me/zjs82"
|
|
||||||
@@ -91,6 +91,3 @@ keystore.properties
|
|||||||
|
|
||||||
# Cloudflare Wrangler
|
# Cloudflare Wrangler
|
||||||
.wrangler
|
.wrangler
|
||||||
|
|
||||||
# Claude Code local working dir (worktrees, jobs, settings)
|
|
||||||
.claude/
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ lib/
|
|||||||
├── models/ # Plain data classes (Contact, Channel, Message, Community, …)
|
├── models/ # Plain data classes (Contact, Channel, Message, Community, …)
|
||||||
├── services/ # ChangeNotifier services + IO services (retry, translation, ML, …)
|
├── services/ # ChangeNotifier services + IO services (retry, translation, ML, …)
|
||||||
├── storage/ # SharedPreferences-backed stores, scoped per device key
|
├── storage/ # SharedPreferences-backed stores, scoped per device key
|
||||||
├── helpers/ # Pure utilities (Smaz compression, GIF parsing, scroll helpers, path hop resolution)
|
├── helpers/ # Pure utilities (Smaz compression, GIF parsing, scroll helpers)
|
||||||
├── utils/ # Platform / IO / UX utilities (logger, GPX export, dialogs)
|
├── utils/ # Platform / IO / UX utilities (logger, GPX export, dialogs)
|
||||||
├── theme/ # MeshPalette (defined, not yet wired in main.dart)
|
├── theme/ # MeshPalette (defined, not yet wired in main.dart)
|
||||||
├── l10n/ # ARB localization for 18 locales
|
├── l10n/ # ARB localization for 18 locales
|
||||||
@@ -194,14 +194,14 @@ enum MeshCoreConnectionState {
|
|||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
App version: `9.5.0+13` — Dart SDK constraint: `^3.9.2`
|
App version: `8.0.0+11` — Dart SDK constraint: `^3.9.2`
|
||||||
|
|
||||||
**Connectivity**
|
**Connectivity**
|
||||||
|
|
||||||
| Package | Version | Purpose |
|
| Package | Version | Purpose |
|
||||||
|---------|---------|---------|
|
|---------|---------|---------|
|
||||||
| flutter_blue_plus | ^2.1.0 | BLE scanning, connecting, and UART data transfer |
|
| flutter_blue_plus | ^2.1.0 | BLE scanning, connecting, and UART data transfer |
|
||||||
| flutter_blue_plus_platform_interface | ^9.0.2 | Platform-interface layer required by flutter_blue_plus |
|
| flutter_blue_plus_platform_interface | ^8.2.1 | Platform-interface layer required by flutter_blue_plus |
|
||||||
| flserial | git (MeshEnvy fork) | USB serial transport for wired device connections (TODO: upstream pending) |
|
| flserial | git (MeshEnvy fork) | USB serial transport for wired device connections (TODO: upstream pending) |
|
||||||
|
|
||||||
**State / Storage**
|
**State / Storage**
|
||||||
@@ -232,7 +232,7 @@ App version: `9.5.0+13` — Dart SDK constraint: `^3.9.2`
|
|||||||
|
|
||||||
| Package | Version | Purpose |
|
| Package | Version | Purpose |
|
||||||
|---------|---------|---------|
|
|---------|---------|---------|
|
||||||
| material_symbols_icons | ^4.2928.1 | Extended Material Symbols icon set (line-of-sight, etc.) |
|
| material_symbols_icons | ^4.2906.0 | Extended Material Symbols icon set (line-of-sight, etc.) |
|
||||||
| flutter_svg | ^2.0.10+1 | Renders SVG assets (custom icons such as LoS indicator) |
|
| flutter_svg | ^2.0.10+1 | Renders SVG assets (custom icons such as LoS indicator) |
|
||||||
| cached_network_image | ^3.4.1 | Caches map tile images downloaded over the network |
|
| cached_network_image | ^3.4.1 | Caches map tile images downloaded over the network |
|
||||||
| flutter_cache_manager | ^3.4.1 | Underlying cache manager used by cached_network_image |
|
| flutter_cache_manager | ^3.4.1 | Underlying cache manager used by cached_network_image |
|
||||||
@@ -246,7 +246,7 @@ App version: `9.5.0+13` — Dart SDK constraint: `^3.9.2`
|
|||||||
|
|
||||||
| Package | Version | Purpose |
|
| Package | Version | Purpose |
|
||||||
|---------|---------|---------|
|
|---------|---------|---------|
|
||||||
| flutter_local_notifications | ^22.0.0 | Shows local push notifications for incoming messages |
|
| flutter_local_notifications | ^20.1.0 | Shows local push notifications for incoming messages |
|
||||||
| flutter_foreground_task | ^9.2.0 | Keeps the app alive in background to maintain BLE/USB connection |
|
| flutter_foreground_task | ^9.2.0 | Keeps the app alive in background to maintain BLE/USB connection |
|
||||||
|
|
||||||
**ML / AI**
|
**ML / AI**
|
||||||
@@ -255,8 +255,7 @@ App version: `9.5.0+13` — Dart SDK constraint: `^3.9.2`
|
|||||||
|---------|---------|---------|
|
|---------|---------|---------|
|
||||||
| ml_algo | ^16.0.0 | OLS regression used in `timeout_prediction_service.dart` to predict message ACK timeouts |
|
| ml_algo | ^16.0.0 | OLS regression used in `timeout_prediction_service.dart` to predict message ACK timeouts |
|
||||||
| ml_dataframe | ^1.0.0 | DataFrame input format required by ml_algo |
|
| ml_dataframe | ^1.0.0 | DataFrame input format required by ml_algo |
|
||||||
| llamadart | ^0.8.0 | On-device LLM inference used in `translation_service.dart` for message translation |
|
| llamadart | >=0.6.8 <0.7.0 | On-device LLM inference used in `translation_service.dart` for message translation |
|
||||||
| flutter_langdetect | ^0.0.1 | Detects a message's source language in `translation_service.dart` before translating |
|
|
||||||
|
|
||||||
**Misc**
|
**Misc**
|
||||||
|
|
||||||
@@ -264,8 +263,8 @@ App version: `9.5.0+13` — Dart SDK constraint: `^3.9.2`
|
|||||||
|---------|---------|---------|
|
|---------|---------|---------|
|
||||||
| http | ^1.2.0 | Fetches tile URLs and any remote API calls |
|
| http | ^1.2.0 | Fetches tile URLs and any remote API calls |
|
||||||
| url_launcher | ^6.3.0 | Opens URLs in the system browser from linkified chat text |
|
| url_launcher | ^6.3.0 | Opens URLs in the system browser from linkified chat text |
|
||||||
| share_plus | ^13.1.0 | Shares files (e.g. exported GPX tracks) via the system share sheet |
|
| share_plus | ^12.0.1 | Shares files (e.g. exported GPX tracks) via the system share sheet |
|
||||||
| package_info_plus | ^10.1.0 | Reads app version/build number displayed in settings |
|
| package_info_plus | ^9.0.0 | Reads app version/build number displayed in settings |
|
||||||
| web | ^1.1.1 | Web-platform APIs for USB serial and browser detection on Flutter Web |
|
| web | ^1.1.1 | Web-platform APIs for USB serial and browser detection on Flutter Web |
|
||||||
| intl | any | Internationalization and locale formatting (required by flutter_localizations) |
|
| intl | any | Internationalization and locale formatting (required by flutter_localizations) |
|
||||||
| build_pipe | ^0.3.1 | CI/CD build pipeline configuration (web release builds with versioned assets) |
|
| build_pipe | ^0.3.1 | CI/CD build pipeline configuration (web release builds with versioned assets) |
|
||||||
@@ -334,4 +333,4 @@ PWA scaffold present but boilerplate (`manifest.json` and `index.html` are unmod
|
|||||||
| `lib/services/translation_service.dart` | On-device LLM translation (llamadart) |
|
| `lib/services/translation_service.dart` | On-device LLM translation (llamadart) |
|
||||||
| `lib/storage/prefs_manager.dart` | SharedPreferences singleton initialized in `main()` |
|
| `lib/storage/prefs_manager.dart` | SharedPreferences singleton initialized in `main()` |
|
||||||
| `lib/screens/scanner_screen.dart` | Home screen — BLE scan and connect |
|
| `lib/screens/scanner_screen.dart` | Home screen — BLE scan and connect |
|
||||||
| `pubspec.yaml` | Dependencies and project metadata (current version `9.5.0+13`) |
|
| `pubspec.yaml` | Dependencies and project metadata (current version `8.0.0+11`) |
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ MeshCore Open is a cross-platform mobile application for communicating with Mesh
|
|||||||
- **Live Map View**: Real-time visualization of mesh network nodes on an interactive map
|
- **Live Map View**: Real-time visualization of mesh network nodes on an interactive map
|
||||||
- **Node Filtering**: Filter by node type (chat, repeater, sensor) and time range
|
- **Node Filtering**: Filter by node type (chat, repeater, sensor) and time range
|
||||||
- **Location Sharing**: Share GPS coordinates and custom markers with contacts
|
- **Location Sharing**: Share GPS coordinates and custom markers with contacts
|
||||||
- **Offline Maps**: Download map tiles for offline use in remote areas (with [StadiaMaps](https://stadiamaps.com/pricing/) Free Subscription API-Key)
|
- **Offline Maps**: Download map tiles for offline use in remote areas
|
||||||
- **MGRS Coordinates**: Support for Military Grid Reference System coordinate format
|
- **MGRS Coordinates**: Support for Military Grid Reference System coordinate format
|
||||||
|
|
||||||
### Device Management
|
### Device Management
|
||||||
@@ -94,12 +94,12 @@ MeshCore Open is a cross-platform mobile application for communicating with Mesh
|
|||||||
|---------|---------|
|
|---------|---------|
|
||||||
| flutter_blue_plus | Bluetooth Low Energy communication |
|
| flutter_blue_plus | Bluetooth Low Energy communication |
|
||||||
| provider | State management |
|
| provider | State management |
|
||||||
| shared_preferences | Local key-value storage (scoped per device) |
|
| sqflite | Local database storage |
|
||||||
| flutter_map | Interactive map display |
|
| flutter_map | Interactive map display |
|
||||||
| latlong2 | Geographic coordinate handling |
|
| latlong2 | Geographic coordinate handling |
|
||||||
| flutter_local_notifications | Background notification support |
|
| flutter_local_notifications | Background notification support |
|
||||||
|
| smaz | Message compression |
|
||||||
| pointycastle | Cryptographic operations |
|
| pointycastle | Cryptographic operations |
|
||||||
| llamadart | On-device LLM message translation |
|
|
||||||
| intl | Internationalization and date formatting |
|
| intl | Internationalization and date formatting |
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
@@ -224,10 +224,6 @@ Messages are transmitted as binary frames using a custom protocol optimized for
|
|||||||
|
|
||||||
This is an open-source project. Contributions are welcome!
|
This is an open-source project. Contributions are welcome!
|
||||||
|
|
||||||
## SWHID and Archive badge
|
|
||||||
[](https://archive.softwareheritage.org/browse/origin/?origin_url=https://github.com/zjs81/meshcore-open)
|
|
||||||
[](https://archive.softwareheritage.org/swh:1:dir:d37a80b06359730864150ad2aeadd46cce9abd55;origin=https://github.com/zjs81/meshcore-open;visit=swh:1:snp:47656c4b55ab40a689ff8d2f045196725f05096b;anchor=swh:1:rev:0fe250230905fdd05dbedc0f546736990beacf53)
|
|
||||||
|
|
||||||
### Development Guidelines
|
### Development Guidelines
|
||||||
|
|
||||||
- Follow the Flutter style guide
|
- Follow the Flutter style guide
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
<uses-feature android:name="android.hardware.usb.host" android:required="false"/>
|
<uses-feature android:name="android.hardware.usb.host" android:required="false"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:label="MeshCore Open"
|
android:label="meshcore_open"
|
||||||
android:name="${applicationName}"
|
android:name="${applicationName}"
|
||||||
android:icon="@mipmap/ic_launcher">
|
android:icon="@mipmap/ic_launcher">
|
||||||
<service
|
<service
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 108 KiB |
|
Before Width: | Height: | Size: 183 KiB |
@@ -1,9 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
|
||||||
<background android:drawable="@color/ic_launcher_background"/>
|
|
||||||
<foreground>
|
|
||||||
<inset
|
|
||||||
android:drawable="@drawable/ic_launcher_foreground"
|
|
||||||
android:inset="16%" />
|
|
||||||
</foreground>
|
|
||||||
</adaptive-icon>
|
|
||||||
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 17 KiB |
@@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<resources>
|
|
||||||
<color name="ic_launcher_background">#9F9D95</color>
|
|
||||||
</resources>
|
|
||||||
@@ -1,7 +1,3 @@
|
|||||||
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
|
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
|
||||||
android.useAndroidX=true
|
android.useAndroidX=true
|
||||||
android.enableJetifier=true
|
android.enableJetifier=true
|
||||||
# This builtInKotlin flag was added automatically by Flutter migrator
|
|
||||||
android.builtInKotlin=false
|
|
||||||
# This newDsl flag was added automatically by Flutter migrator
|
|
||||||
android.newDsl=false
|
|
||||||
|
|||||||
@@ -1,93 +0,0 @@
|
|||||||
Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter)
|
|
||||||
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
||||||
This license is copied below, and is also available with a FAQ at:
|
|
||||||
https://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
||||||
-----------------------------------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
||||||
development of collaborative font projects, to support the font creation
|
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
|
||||||
open framework in which fonts may be shared and improved in partnership
|
|
||||||
with others.
|
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
|
||||||
redistributed and/or sold with any software provided that any reserved
|
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
|
||||||
however, cannot be released under any other type of license. The
|
|
||||||
requirement for fonts to remain under this license does not apply
|
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
|
||||||
copyright statement(s).
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
|
||||||
new environment.
|
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
|
||||||
redistributed and/or sold with any software, provided that each copy
|
|
||||||
contains the above copyright notice and this license. These can be
|
|
||||||
included either as stand-alone text files, human-readable headers or
|
|
||||||
in the appropriate machine-readable metadata fields within text or
|
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
|
||||||
presented to the users.
|
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
||||||
Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
|
||||||
must be distributed entirely under this license, and must not be
|
|
||||||
distributed under any other license. The requirement for fonts to
|
|
||||||
remain under this license does not apply to any document created
|
|
||||||
using the Font Software.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This license becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
|
|
||||||
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
||||||
|
|
||||||
This license is copied below, and is also available with a FAQ at: https://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
||||||
-----------------------------------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
||||||
development of collaborative font projects, to support the font creation
|
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
|
||||||
open framework in which fonts may be shared and improved in partnership
|
|
||||||
with others.
|
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
|
||||||
redistributed and/or sold with any software provided that any reserved
|
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
|
||||||
however, cannot be released under any other type of license. The
|
|
||||||
requirement for fonts to remain under this license does not apply
|
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
|
||||||
copyright statement(s).
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
|
||||||
new environment.
|
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
|
||||||
redistributed and/or sold with any software, provided that each copy
|
|
||||||
contains the above copyright notice and this license. These can be
|
|
||||||
included either as stand-alone text files, human-readable headers or
|
|
||||||
in the appropriate machine-readable metadata fields within text or
|
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
|
||||||
presented to the users.
|
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
||||||
Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
|
||||||
must be distributed entirely under this license, and must not be
|
|
||||||
distributed under any other license. The requirement for fonts to
|
|
||||||
remain under this license does not apply to any document created
|
|
||||||
using the Font Software.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This license becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
||||||
|
Before Width: | Height: | Size: 669 KiB |
@@ -14,8 +14,7 @@ MeshCore Open is an open-source Flutter client for MeshCore LoRa mesh networking
|
|||||||
8. [Notifications](notifications.md) - System notifications, unread badges, and notification preferences
|
8. [Notifications](notifications.md) - System notifications, unread badges, and notification preferences
|
||||||
9. [Repeater Management](repeater-management.md) - Repeater hub, status, CLI, telemetry, and neighbors
|
9. [Repeater Management](repeater-management.md) - Repeater hub, status, CLI, telemetry, and neighbors
|
||||||
10. [Additional Features](additional-features.md) - GIF picker, localization, debug logs, SMAZ compression, and more
|
10. [Additional Features](additional-features.md) - GIF picker, localization, debug logs, SMAZ compression, and more
|
||||||
11. [Routing Paths](routing-paths.md) - Path encoding, validation, device capability detection, and storage
|
11. [BLE Protocol & Data Layer](ble-protocol.md) - Technical reference for the communication protocol and data architecture
|
||||||
12. [BLE Protocol & Data Layer](ble-protocol.md) - Technical reference for the communication protocol and data architecture
|
|
||||||
|
|
||||||
## App Overview
|
## App Overview
|
||||||
|
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ An ML-based service that predicts expected delivery timeouts:
|
|||||||
- Applies a **1.5x safety margin** to raw predictions (the actual timeout issued is 1.5× the model's predicted delivery time)
|
- Applies a **1.5x safety margin** to raw predictions (the actual timeout issued is 1.5× the model's predicted delivery time)
|
||||||
- Features with zero variance are automatically excluded from training
|
- Features with zero variance are automatically excluded from training
|
||||||
- Blends per-contact statistics with ML predictions
|
- Blends per-contact statistics with ML predictions
|
||||||
- Falls back to `3000 + 3000 × pathLength` ms when insufficient data. Note: `pathLength` here refers to the stored hop count in the app's model/storage (number of hops), not the on-air encoded byte length.
|
- Falls back to `3000 + 3000 × pathLength` ms when insufficient data
|
||||||
- Observations are persisted to storage via a 2-second debounced timer (observations within 2s of app termination may be lost)
|
- Observations are persisted to storage via a 2-second debounced timer (observations within 2s of app termination may be lost)
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -198,7 +198,6 @@ Tap the translate button on any received message. On first use, the GGUF model f
|
|||||||
|
|
||||||
### How It Works
|
### How It Works
|
||||||
- Model files are managed by `TranslationFileStore`; download progress is shown in-place
|
- Model files are managed by `TranslationFileStore`; download progress is shown in-place
|
||||||
- Before translating, the source language is automatically detected using the `flutter_langdetect` package. If the detected language already matches the target language, translation is skipped
|
|
||||||
- Translation runs via `TranslationService` using the llamadart CPU backend (arm64 and x64 on Android)
|
- Translation runs via `TranslationService` using the llamadart CPU backend (arm64 and x64 on Android)
|
||||||
- Translated text is shown in `TranslatedMessageContent` as an inline overlay on the original message bubble
|
- Translated text is shown in `TranslatedMessageContent` as an inline overlay on the original message bubble
|
||||||
- Each translation is cached; re-tapping shows the cached result without re-running inference
|
- Each translation is cached; re-tapping shows the cached result without re-running inference
|
||||||
|
|||||||
@@ -56,7 +56,6 @@ enum MeshCoreConnectionState {
|
|||||||
- `Lilygo`
|
- `Lilygo`
|
||||||
- `HT-`
|
- `HT-`
|
||||||
- `LowMesh_MC_`
|
- `LowMesh_MC_`
|
||||||
- `NRF52`
|
|
||||||
2. **Connect** with 15-second timeout (6 seconds on Linux)
|
2. **Connect** with 15-second timeout (6 seconds on Linux)
|
||||||
3. **Request MTU** 185 bytes (non-web only)
|
3. **Request MTU** 185 bytes (non-web only)
|
||||||
4. **Discover services** and locate NUS
|
4. **Discover services** and locate NUS
|
||||||
@@ -116,17 +115,13 @@ On unexpected disconnection, auto-reconnect with exponential backoff:
|
|||||||
| 32 | CMD_SET_CHANNEL | Set channel name and PSK |
|
| 32 | CMD_SET_CHANNEL | Set channel name and PSK |
|
||||||
| 36 | CMD_SEND_TRACE_PATH | Request path trace |
|
| 36 | CMD_SEND_TRACE_PATH | Request path trace |
|
||||||
| 38 | CMD_SET_OTHER_PARAMS | Set misc parameters |
|
| 38 | CMD_SET_OTHER_PARAMS | Set misc parameters |
|
||||||
| 39 | CMD_SEND_TELEMETRY_REQ | Request sensor telemetry |
|
| 39 | CMD_GET_TELEMETRY_REQ | Request sensor telemetry |
|
||||||
| 40 | CMD_GET_CUSTOM_VAR | Get custom variables |
|
| 40 | CMD_GET_CUSTOM_VAR | Get custom variables |
|
||||||
| 41 | CMD_SET_CUSTOM_VAR | Set a custom variable |
|
| 41 | CMD_SET_CUSTOM_VAR | Set a custom variable |
|
||||||
| 50 | CMD_SEND_BINARY_REQ | Send binary request |
|
| 50 | CMD_SEND_BINARY_REQ | Send binary request |
|
||||||
| 54 | CMD_SET_FLOOD_SCOPE | Set flood routing scope (v8+) |
|
|
||||||
| 55 | CMD_SEND_CONTROL_DATA | Send control data (e.g. zero-hop discovery, v8+) |
|
|
||||||
| 56 | CMD_GET_STATS | Request companion radio stats |
|
|
||||||
| 57 | CMD_SEND_ANON_REQ | Send anonymous request |
|
| 57 | CMD_SEND_ANON_REQ | Send anonymous request |
|
||||||
| 58 | CMD_SET_AUTO_ADD_CONFIG | Set auto-add configuration |
|
| 58 | CMD_SET_AUTO_ADD_CONFIG | Set auto-add configuration |
|
||||||
| 59 | CMD_GET_AUTO_ADD_CONFIG | Get auto-add configuration |
|
| 59 | CMD_GET_AUTO_ADD_CONFIG | Get auto-add configuration |
|
||||||
| 61 | CMD_SET_PATH_HASH_MODE | Set path hash width (bytes per hop) |
|
|
||||||
|
|
||||||
## Response / Push Codes (Device → App)
|
## Response / Push Codes (Device → App)
|
||||||
|
|
||||||
@@ -150,7 +145,6 @@ On unexpected disconnection, auto-reconnect with exponential backoff:
|
|||||||
| 17 | RESP_CODE_CHANNEL_MSG_RECV_V3 | Incoming channel message (v3) |
|
| 17 | RESP_CODE_CHANNEL_MSG_RECV_V3 | Incoming channel message (v3) |
|
||||||
| 18 | RESP_CODE_CHANNEL_INFO | Channel definition |
|
| 18 | RESP_CODE_CHANNEL_INFO | Channel definition |
|
||||||
| 21 | RESP_CODE_CUSTOM_VARS | Custom variables |
|
| 21 | RESP_CODE_CUSTOM_VARS | Custom variables |
|
||||||
| 24 | RESP_CODE_STATS | Companion radio stats |
|
|
||||||
| 25 | RESP_CODE_AUTO_ADD_CONFIG | Auto-add flags |
|
| 25 | RESP_CODE_AUTO_ADD_CONFIG | Auto-add flags |
|
||||||
| 0x80 | PUSH_CODE_ADVERT | Known contact re-seen |
|
| 0x80 | PUSH_CODE_ADVERT | Known contact re-seen |
|
||||||
| 0x81 | PUSH_CODE_PATH_UPDATED | Better path found; carries the 32-byte public key of the updated contact |
|
| 0x81 | PUSH_CODE_PATH_UPDATED | Better path found; carries the 32-byte public key of the updated contact |
|
||||||
@@ -164,7 +158,6 @@ On unexpected disconnection, auto-reconnect with exponential backoff:
|
|||||||
| 0x8A | PUSH_CODE_NEW_ADVERT | New node discovered |
|
| 0x8A | PUSH_CODE_NEW_ADVERT | New node discovered |
|
||||||
| 0x8B | PUSH_CODE_TELEMETRY_RESPONSE | Sensor telemetry data |
|
| 0x8B | PUSH_CODE_TELEMETRY_RESPONSE | Sensor telemetry data |
|
||||||
| 0x8C | PUSH_CODE_BINARY_RESPONSE | Binary data response |
|
| 0x8C | PUSH_CODE_BINARY_RESPONSE | Binary data response |
|
||||||
| 0x8E | PUSH_CODE_CONTROL_DATA | Control data push (e.g. zero-hop discovery response) |
|
|
||||||
|
|
||||||
## Data Models
|
## Data Models
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Channels are broadcast group-chat spaces secured by a 16-byte pre-shared key (PSK). Any device with the same channel index and PSK will receive and decrypt channel messages. Unlike direct messages, channel messages are broadcast to the entire mesh.
|
Channels are broadcast group-chat spaces secured by a 16-byte pre-shared key (PSK). Any device with the same channel index and PSK will receive and decrypt channel messages. Unlike direct messages, channel messages are broadcast to the entire mesh.
|
||||||
|
|
||||||
The number of active channels is determined by the firmware (default 40); the device reports its actual limit at login.
|
Up to 8 channels (indices 0–7) can be active simultaneously on one device.
|
||||||
|
|
||||||
## How to Access
|
## How to Access
|
||||||
|
|
||||||
@@ -17,7 +17,7 @@ QuickSwitchBar tab 1 (middle) from any main screen.
|
|||||||
| Public | Globe | Green | Fixed well-known PSK; any device can join |
|
| Public | Globe | Green | Fixed well-known PSK; any device can join |
|
||||||
| Hashtag | Hash tag | Blue | PSK derived from the hashtag name via SHA-256; discoverable by convention |
|
| Hashtag | Hash tag | Blue | PSK derived from the hashtag name via SHA-256; discoverable by convention |
|
||||||
| Private | Lock | Blue | Random PSK; requires out-of-band sharing of the 32-hex key |
|
| Private | Lock | Blue | Random PSK; requires out-of-band sharing of the 32-hex key |
|
||||||
| Community | Groups/Tag | Magenta | PSK derived via HMAC-SHA256 from a community's shared secret |
|
| Community | Groups/Tag | Purple | PSK derived via HMAC-SHA256 from a community's shared secret |
|
||||||
|
|
||||||
## Channels List Screen
|
## Channels List Screen
|
||||||
|
|
||||||
@@ -26,12 +26,12 @@ QuickSwitchBar tab 1 (middle) from any main screen.
|
|||||||
- **Search bar** with live text filtering (300ms debounce)
|
- **Search bar** with live text filtering (300ms debounce)
|
||||||
- **Sort/filter button**
|
- **Sort/filter button**
|
||||||
- **Scrollable list of channel cards**, each showing:
|
- **Scrollable list of channel cards**, each showing:
|
||||||
- Type icon with color coding (magenta badge overlay for community channels)
|
- Type icon with color coding (purple badge overlay for community channels)
|
||||||
- Channel name (or "Channel N" if unnamed)
|
- Channel name (or "Channel N" if unnamed)
|
||||||
- Unread badge (if messages are unread)
|
- Unread badge (if messages are unread)
|
||||||
- Drag handle (when manual sort is active)
|
- Drag handle (when manual sort is active)
|
||||||
- **"+" FAB** to add a new channel
|
- **"+" FAB** to add a new channel
|
||||||
- **Overflow menu**: Disconnect, Manage Communities, Settings
|
- **Overflow menu**: Disconnect, Manage Communities (only shown when at least one community exists), Settings
|
||||||
|
|
||||||
If no channels exist, an empty state with an "Add Public Channel" shortcut is shown. If a search produces no results, a separate "no results" empty state with a search-off icon is shown.
|
If no channels exist, an empty state with an "Add Public Channel" shortcut is shown. If a search produces no results, a separate "no results" empty state with a search-off icon is shown.
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ Tap the "+" FAB to open a dialog with six options:
|
|||||||
|
|
||||||
| Action | Description |
|
| Action | Description |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Edit | Change name, PSK (with a dice icon to generate a random PSK), SMAZ compression toggle (compresses outgoing messages to allow longer text within the byte limit), or Cyr2Lat encoding toggle (transliterates Cyrillic to Latin for compatibility) |
|
| Edit | Change name, PSK (with a dice icon to generate a random PSK), or SMAZ compression toggle (compresses outgoing messages to allow longer text within the byte limit) |
|
||||||
| Mute / Unmute | Toggle push notification suppression for this channel |
|
| Mute / Unmute | Toggle push notification suppression for this channel |
|
||||||
| Delete | Remove the channel from the device (confirmation required) |
|
| Delete | Remove the channel from the device (confirmation required) |
|
||||||
|
|
||||||
@@ -100,7 +100,8 @@ Tap a channel card to open the channel chat screen.
|
|||||||
|
|
||||||
### Message Path Viewing
|
### Message Path Viewing
|
||||||
|
|
||||||
- **All platforms**: Long-press (or right-click on desktop) a message bubble → "Path"
|
- **Mobile**: Tap a message bubble to view its routing path
|
||||||
|
- **Desktop**: Long-press/right-click → "Path" (tapping the bubble does nothing on desktop)
|
||||||
- Opens the Channel Message Path Screen (see [Additional Features](additional-features.md))
|
- Opens the Channel Message Path Screen (see [Additional Features](additional-features.md))
|
||||||
|
|
||||||
### Context Actions (Long-Press / Right-Click)
|
### Context Actions (Long-Press / Right-Click)
|
||||||
@@ -108,7 +109,7 @@ Tap a channel card to open the channel chat screen.
|
|||||||
| Action | Availability | Description |
|
| Action | Availability | Description |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Reply | All messages | Triggers reply mode |
|
| Reply | All messages | Triggers reply mode |
|
||||||
| Path | All messages | Opens message path view |
|
| Path | Desktop only | Opens message path view |
|
||||||
| Add Reaction | Incoming messages only | Opens emoji picker (cannot react to your own messages) |
|
| Add Reaction | Incoming messages only | Opens emoji picker (cannot react to your own messages) |
|
||||||
| Copy | All messages | Copies text to clipboard |
|
| Copy | All messages | Copies text to clipboard |
|
||||||
| Mark as Unread | Incoming messages only | Marks this message and all subsequent incoming messages as unread |
|
| Mark as Unread | Incoming messages only | Marks this message and all subsequent incoming messages as unread |
|
||||||
@@ -141,7 +142,7 @@ From the channels screen overflow menu → "Manage Communities". Opens a draggab
|
|||||||
- **Tap a community** to directly show its QR code for sharing
|
- **Tap a community** to directly show its QR code for sharing
|
||||||
- **Popup menu** per community:
|
- **Popup menu** per community:
|
||||||
- **Show QR** — displays the QR code for sharing with new members
|
- **Show QR** — displays the QR code for sharing with new members
|
||||||
- **Leave Community** — removes the community locally and deletes all associated device channels (confirmation dialog warns how many channels will be removed)
|
- **Delete** — removes the community locally and deletes all associated device channels (confirmation dialog warns how many channels will be removed)
|
||||||
|
|
||||||
## How Channels Differ from Direct Messages
|
## How Channels Differ from Direct Messages
|
||||||
|
|
||||||
|
|||||||
@@ -18,15 +18,17 @@ From the Contacts screen, tap any Chat-type contact to open the ChatScreen.
|
|||||||
|
|
||||||
- **Title**: Contact name
|
- **Title**: Contact name
|
||||||
- **Subtitle**: Current routing path label (e.g., "2 hops", "flood (auto)", "direct (forced)") and unread count. Tapping the subtitle shows the full path details.
|
- **Subtitle**: Current routing path label (e.g., "2 hops", "flood (auto)", "direct (forced)") and unread count. Tapping the subtitle shows the full path details.
|
||||||
- **Action button**:
|
- **Action buttons**:
|
||||||
- **Overflow menu** (⋮ icon): Contains Routing, Info, Telemetry, Settings, and Clear Chat. Routing opens the routing sheet where you can switch between Auto, Direct, and Flood routing and manage recent paths (hop count, round-trip time, age, success count, color-coded by repeater). Info shows a dialog with contact type, path, GPS coordinates, and public key.
|
- **Routing mode** (waves icon): Switch between Auto, Direct, and Flood routing
|
||||||
|
- **Path management** (timeline icon): View recent paths with hop count, round-trip time, age, and success count. Paths are color-coded by direct repeater (green/yellow/red/blue for ranked repeaters, grey for unknown). Tap a path to activate it (the device verifies and confirms via snackbar), long-press to view full path details, set custom paths, or force flood mode. A warning banner appears when history reaches 100 entries.
|
||||||
|
- **Info** (info icon): Contact info dialog showing type, path, GPS coordinates, public key, and SMAZ compression toggle
|
||||||
|
|
||||||
### Message List
|
### Message List
|
||||||
|
|
||||||
- Scrollable list with newest messages at the bottom
|
- Scrollable list with newest messages at the bottom
|
||||||
- **Outgoing messages**: Right-aligned, primary color background. **Failed messages** change to a red-toned error container background
|
- **Outgoing messages**: Right-aligned, primary color background. **Failed messages** change to a red-toned error container background
|
||||||
- **Incoming messages**: Left-aligned, grey background with a colored avatar (initial letter or first emoji of sender name; color is deterministic from a hash of the sender name)
|
- **Incoming messages**: Left-aligned, grey background with a colored avatar (initial letter or first emoji of sender name; color is deterministic from a hash of the sender name)
|
||||||
- Bubble width capped at 72% of screen width
|
- Bubble width capped at 65% of screen width
|
||||||
- Hyperlinks rendered as tappable green underlined text
|
- Hyperlinks rendered as tappable green underlined text
|
||||||
- **Pinch-to-zoom**: Two-finger zoom (0.8x–1.8x) and double-tap to reset
|
- **Pinch-to-zoom**: Two-finger zoom (0.8x–1.8x) and double-tap to reset
|
||||||
- **Jump to bottom**: Floating button appears when scrolled away from the bottom
|
- **Jump to bottom**: Floating button appears when scrolled away from the bottom
|
||||||
@@ -85,7 +87,7 @@ When a direct message is sent:
|
|||||||
|
|
||||||
1. The app computes an expected ACK hash: `SHA256([timestamp][attempt][text][selfPubKey])[0:4]` — matching the firmware's hash calculation. If SMAZ compression is enabled, the compressed text (not the original) is hashed
|
1. The app computes an expected ACK hash: `SHA256([timestamp][attempt][text][selfPubKey])[0:4]` — matching the firmware's hash calculation. If SMAZ compression is enabled, the compressed text (not the original) is hashed
|
||||||
2. On device acknowledgment (`RESP_CODE_SENT`), the message transitions to "sent" and a timeout timer starts
|
2. On device acknowledgment (`RESP_CODE_SENT`), the message transitions to "sent" and a timeout timer starts
|
||||||
3. **Timeout duration**: Preferably from the ML timeout prediction service; otherwise from the device's own `est_timeout` in `RESP_CODE_SENT` (clamped to the physics range); otherwise calculated from LoRa airtime physics: `500 + (airtime × 6 + 250) × (pathLength + 1)` ms for direct paths, `500 + 16 × airtime` ms for flood (airtime is estimated from the radio's current spreading factor, bandwidth, and coding rate). The result is capped at 45 seconds.
|
3. **Timeout duration**: Preferably from the ML timeout prediction service; otherwise calculated from LoRa airtime physics: `500 + (airtime × 6 + 250) × (pathLength + 1)` ms for direct paths, `500 + 16 × airtime` ms for flood (airtime is estimated from the radio's current spreading factor, bandwidth, and coding rate)
|
||||||
4. On timeout, the message is retried with **exponential backoff**: `1000 × 2^retryCount` ms (1s, 2s, 4s, 8s, 16s...)
|
4. On timeout, the message is retried with **exponential backoff**: `1000 × 2^retryCount` ms (1s, 2s, 4s, 8s, 16s...)
|
||||||
5. **Max retries**: Configurable (default 5, range 2–10)
|
5. **Max retries**: Configurable (default 5, range 2–10)
|
||||||
6. After max retries, the message is marked "failed" — but a **30-second grace window** remains during which a late ACK can still resolve the message to "delivered"
|
6. After max retries, the message is marked "failed" — but a **30-second grace window** remains during which a late ACK can still resolve the message to "delivered"
|
||||||
@@ -112,9 +114,8 @@ Add emoji reactions to incoming messages (not your own):
|
|||||||
| Action | Availability | Description |
|
| Action | Availability | Description |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Add reaction | Incoming messages only | Opens emoji picker |
|
| Add reaction | Incoming messages only | Opens emoji picker |
|
||||||
| View path | All platforms: long-press/right-click menu | Shows message routing path |
|
| View path | Mobile: tap bubble directly; Desktop: long-press/right-click menu | Shows message routing path |
|
||||||
| Copy | All messages | Copies text to clipboard |
|
| Copy | All messages | Copies text to clipboard |
|
||||||
| Translate | Incoming messages only (when translation is enabled and not yet translated) | Translates the message on-demand using the on-device model |
|
|
||||||
| Mark as Unread | Incoming messages only | Marks this message and all subsequent incoming messages as unread |
|
| Mark as Unread | Incoming messages only | Marks this message and all subsequent incoming messages as unread |
|
||||||
| Delete | All messages | Removes locally (not from mesh) |
|
| Delete | All messages | Removes locally (not from mesh) |
|
||||||
| Retry | Failed outgoing messages | Re-sends the message |
|
| Retry | Failed outgoing messages | Re-sends the message |
|
||||||
|
|||||||
@@ -6,17 +6,18 @@ The Contacts screen is the primary hub for managing mesh nodes your radio has a
|
|||||||
|
|
||||||
## How to Access
|
## How to Access
|
||||||
|
|
||||||
- QuickSwitchBar tab 0 (leftmost) from Channels or Map screens (Channels is shown first after connecting)
|
- Automatically shown after connecting to a device
|
||||||
|
- QuickSwitchBar tab 0 (leftmost) from Channels or Map screens
|
||||||
- Back navigation from Chat or Settings screens
|
- Back navigation from Chat or Settings screens
|
||||||
|
|
||||||
## Contact Types
|
## Contact Types
|
||||||
|
|
||||||
| Type | Avatar Color | Icon | Description |
|
| Type | Avatar Color | Icon | Description |
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| Chat | Blue | Initials / emoji | Another user's mesh radio |
|
| Chat | Blue | Chat bubble | Another user's mesh radio |
|
||||||
| Repeater | Amber | Cell tower | A mesh repeater/relay node |
|
| Repeater | Orange | Cell tower | A mesh repeater/relay node |
|
||||||
| Room | Magenta | Meeting room | A room server for group chat |
|
| Room | Purple | Group | A room server for group chat |
|
||||||
| Sensor | Teal | Sensors | A sensor device |
|
| Sensor | Green | Sensors | A sensor device |
|
||||||
|
|
||||||
## Contact List
|
## Contact List
|
||||||
|
|
||||||
@@ -72,31 +73,31 @@ Groups are stored per radio identity (scoped by public key).
|
|||||||
|
|
||||||
| Action | Availability | Description |
|
| Action | Availability | Description |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Ping | Repeaters only | Opens PathTraceMapScreen targeting the repeater |
|
| Ping | Repeaters (always) | Opens PathTraceMapScreen targeting the repeater |
|
||||||
| Path Trace | Rooms (always); Chat/Sensor only if `pathLength > 0` | Opens PathTraceMapScreen. For rooms, label shows "Ping" when no path bytes are known, "Path Trace" when path bytes are available |
|
| Path Trace | Rooms (always); Chat/Sensor if `pathLength > 0` | Opens PathTraceMapScreen. For rooms, label shows "Ping" when no path bytes are known, "Path Trace" when path bytes are available |
|
||||||
| Manage Repeater | Repeaters only | Login dialog → RepeaterHubScreen |
|
| Manage Repeater | Repeaters only | Login dialog → RepeaterHubScreen |
|
||||||
| Room Login | Rooms only | Login dialog → ChatScreen |
|
| Room Login | Rooms only | Login dialog → ChatScreen |
|
||||||
| Room Management | Rooms only | Login dialog → RepeaterHubScreen (management mode) |
|
| Room Management | Rooms only | Login dialog → RepeaterHubScreen (management mode) |
|
||||||
|
| Open Chat | Chat/Sensor | Same as single tap |
|
||||||
| Add/Remove Favorite | All types | Toggles the favorite flag |
|
| Add/Remove Favorite | All types | Toggles the favorite flag |
|
||||||
| Share Contact | All types | Requests advert from device → copies `meshcore://<hex>` URI to clipboard |
|
| Share Contact | All types | Copies `meshcore://<hex>` URI to clipboard |
|
||||||
| Share Contact Zero-Hop | All types | Broadcasts the contact's advertisement one hop |
|
| Share Contact Zero-Hop | All types | Broadcasts the contact's advertisement one hop |
|
||||||
| Delete Contact | All types | Confirmation dialog → removes from device and clears messages |
|
| Delete Contact | All types | Confirmation dialog → removes from device and clears messages |
|
||||||
|
|
||||||
## App Bar Menus
|
## App Bar Menus
|
||||||
|
|
||||||
The Contacts screen has a single **three-dot overflow menu** (`⋮`) in the app bar:
|
The Contacts screen has **two separate popup menus** in the app bar:
|
||||||
|
|
||||||
- Discovered Contacts — opens the DiscoveryScreen
|
**Antenna icon menu** (contact sharing):
|
||||||
- Add Contact from Clipboard — reads a `meshcore://<hex>` URI from clipboard and imports it
|
|
||||||
- *(divider)*
|
|
||||||
- Zero-Hop Advert — broadcasts your advertisement to immediately adjacent nodes
|
- Zero-Hop Advert — broadcasts your advertisement to immediately adjacent nodes
|
||||||
- Flood Advert — broadcasts across the full mesh network
|
- Flood Advert — broadcasts across the full mesh network
|
||||||
- Copy Advert to Clipboard — copies your `meshcore://<hex>` URI for sharing externally
|
- Copy Advert to Clipboard — copies your `meshcore://<hex>` URI for sharing externally
|
||||||
- *(divider)*
|
- Add Contact from Clipboard — reads a `meshcore://<hex>` URI from clipboard and imports it
|
||||||
- Disconnect — disconnects from the device
|
|
||||||
- Settings — opens the Settings screen
|
|
||||||
|
|
||||||
A **floating action button** (person-add icon) provides a shortcut sheet to "Add Contact from Clipboard" or "Discovered Contacts".
|
**Three-dot overflow menu**:
|
||||||
|
- Disconnect — disconnects from the device
|
||||||
|
- Discovered Contacts — opens the DiscoveryScreen
|
||||||
|
- Settings — opens the Settings screen
|
||||||
|
|
||||||
## Adding Contacts
|
## Adding Contacts
|
||||||
|
|
||||||
@@ -104,10 +105,10 @@ A **floating action button** (person-add icon) provides a shortcut sheet to "Add
|
|||||||
When the radio hears an advertisement, the contact appears automatically if auto-add is enabled for that type (configurable in Settings → Contact Settings).
|
When the radio hears an advertisement, the contact appears automatically if auto-add is enabled for that type (configurable in Settings → Contact Settings).
|
||||||
|
|
||||||
### Import from Clipboard
|
### Import from Clipboard
|
||||||
Overflow menu (or the FAB shortcut) → "Add Contact from Clipboard". Reads a `meshcore://<hex>` URI from clipboard and imports it to the device.
|
Antenna menu → "Add Contact from Clipboard". Reads a `meshcore://<hex>` URI from clipboard and imports it to the device.
|
||||||
|
|
||||||
### Import from Discovered Contacts
|
### Import from Discovered Contacts
|
||||||
Overflow menu → "Discovered Contacts". Shows nodes heard passively that haven't been added yet. Tap to immediately import (no confirmation dialog), or long-press for more options (Copy URI, Delete). The Discovery screen has its own search bar, type filters (Users, Repeaters, Rooms), and sort options (Last Seen, A-Z). An overflow "Delete All" option clears all discovered contacts.
|
Overflow menu → "Discovered Contacts". Shows nodes heard passively that haven't been added yet. Tap to immediately import (no confirmation dialog), or long-press for more options (Add, Copy URI, Delete). The Discovery screen has its own search bar, type filters (Users, Repeaters, Rooms, Favorites), and sort options (Last Seen, A-Z). An overflow "Delete All" option clears all discovered contacts.
|
||||||
|
|
||||||
## Contact Sharing Format
|
## Contact Sharing Format
|
||||||
|
|
||||||
|
|||||||
@@ -35,9 +35,9 @@ Location pins shared in chat messages are displayed as flags:
|
|||||||
|
|
||||||
Tap a pin to see its info. Options to "Hide" (session only) or "Remove" (persistent).
|
Tap a pin to see its info. Options to "Hide" (session only) or "Remove" (persistent).
|
||||||
|
|
||||||
### Predicted / Guessed Locations
|
### Predicted / Guessed Locations (Semi-Transparent)
|
||||||
|
|
||||||
Many contacts on the mesh don't have GPS hardware, so the map has no explicit coordinates for them. Instead of leaving these contacts invisible, the app **infers an approximate position** by analyzing the repeater path the contact's messages travel through. These inferred positions are displayed as markers with a `not_listed_location` icon and a muted grey or colored border, visually distinct from confirmed-location markers.
|
Many contacts on the mesh don't have GPS hardware, so the map has no explicit coordinates for them. Instead of leaving these contacts invisible, the app **infers an approximate position** by analyzing the repeater path the contact's messages travel through. These inferred positions are displayed as semi-transparent markers with a `not_listed_location` icon, visually distinct from confirmed-location markers.
|
||||||
|
|
||||||
#### Why guessed locations exist
|
#### Why guessed locations exist
|
||||||
|
|
||||||
@@ -55,19 +55,19 @@ In a mesh network, every message hops through one or more repeaters on its way t
|
|||||||
|
|
||||||
5. **Compute the estimated position**:
|
5. **Compute the estimated position**:
|
||||||
- **Single anchor**: The contact is placed on a small circle (330m radius) around the repeater. The angle on the circle is deterministic — derived from an FNV-1a hash of the contact's public key — so the same contact always appears at the same offset, preventing markers from stacking on top of each other.
|
- **Single anchor**: The contact is placed on a small circle (330m radius) around the repeater. The angle on the circle is deterministic — derived from an FNV-1a hash of the contact's public key — so the same contact always appears at the same offset, preventing markers from stacking on top of each other.
|
||||||
- **Two or more anchors**: The position is a weighted average of all anchor coordinates (each subsequent anchor weighted at half the previous one, biasing toward the first), with a smaller offset radius (120m for 2 anchors, 80m for 3+) applied for visual separation.
|
- **Two or more anchors**: The position is the average (centroid) of all anchor coordinates, with a smaller offset radius (80–120m) applied for visual separation.
|
||||||
|
|
||||||
6. **Assign confidence level**:
|
6. **Assign confidence level**:
|
||||||
- **High confidence** (2+ anchors): The marker border uses the node's type color (brighter border).
|
- **High confidence** (2+ anchors): Displayed at 55% opacity.
|
||||||
- **Low confidence** (1 anchor): The marker border is rendered in a muted grey.
|
- **Low confidence** (1 anchor): Displayed at 30% opacity.
|
||||||
|
|
||||||
7. **Cache the result**: The computation is cached using a key derived from the contact's paths, anchor positions, path-history version, and radio parameters. The cache is only invalidated when any of these inputs change, avoiding recomputation on every UI rebuild.
|
7. **Cache the result**: The computation is cached using a key derived from the contact's paths, anchor positions, path-history version, and radio parameters. The cache is only invalidated when any of these inputs change, avoiding recomputation on every UI rebuild.
|
||||||
|
|
||||||
#### How to read guessed locations on the map
|
#### How to read guessed locations on the map
|
||||||
|
|
||||||
- **Marker with `not_listed_location` icon**: This is a guessed position, not a confirmed GPS fix.
|
- **Semi-transparent marker** with a `not_listed_location` icon: This is a guessed position, not a confirmed GPS fix.
|
||||||
- **Colored border** (type color): Higher confidence — the contact was seen through 2 or more repeaters with known positions.
|
- **More opaque** (55%): Higher confidence — the contact was seen through 2 or more repeaters with known positions.
|
||||||
- **Grey border**: Lower confidence — based on a single repeater anchor only.
|
- **More transparent** (30%): Lower confidence — based on a single repeater anchor only.
|
||||||
- Coordinates shown in the marker info dialog are prefixed with `~` to indicate they are estimated.
|
- Coordinates shown in the marker info dialog are prefixed with `~` to indicate they are estimated.
|
||||||
- Guessed locations can be toggled on/off in the map filter dialog (FAB → "Guessed locations" toggle).
|
- Guessed locations can be toggled on/off in the map filter dialog (FAB → "Guessed locations" toggle).
|
||||||
|
|
||||||
@@ -110,16 +110,9 @@ A map with a polyline showing the route from your node through repeater hops to
|
|||||||
- **Green circles**: Hops with known GPS coordinates
|
- **Green circles**: Hops with known GPS coordinates
|
||||||
- **Orange circles** (`~HH`): Inferred positions (no GPS but deducible from contacts)
|
- **Orange circles** (`~HH`): Inferred positions (no GPS but deducible from contacts)
|
||||||
- **Red endpoint**: Target contact with known GPS
|
- **Red endpoint**: Target contact with known GPS
|
||||||
- **Magenta endpoint**: Target with guessed position
|
- **Purple semi-transparent endpoint**: Target with guessed position
|
||||||
|
|
||||||
A bottom panel shows each hop pair with SNR quality icons and total path distance. When multiple observed paths are available, a **Single / Combined** toggle appears at the top of the map. In Combined view, all paths are overlaid; shared segments are highlighted with a white halo and a path count badge appears on shared nodes.
|
A legend card at the bottom lists each hop pair with SNR quality icons and total path distance.
|
||||||
|
|
||||||
The bottom panel also provides **packet animation controls**:
|
|
||||||
- **Animation toggle** (on/off)
|
|
||||||
- **Step back / Play / Step forward / Replay** buttons
|
|
||||||
- **Follow packet lock** — keeps the map camera centered on the moving packet dot
|
|
||||||
- **Speed selector** (0.5×, 1×, 2×, 4×)
|
|
||||||
- A live **"Hop x of y · from → to"** label that tracks the active segment
|
|
||||||
|
|
||||||
### How It Works
|
### How It Works
|
||||||
Sends a trace request frame over the mesh. The repeater network traces the path hop-by-hop and returns per-hop SNR data. For hops without GPS, positions are inferred by averaging GPS coordinates of contacts sharing that last-hop byte.
|
Sends a trace request frame over the mesh. The repeater network traces the path hop-by-hop and returns per-hop SNR data. For hops without GPS, positions are inferred by averaging GPS coordinates of contacts sharing that last-hop byte.
|
||||||
@@ -132,17 +125,17 @@ Sends a trace request frame over the mesh. The repeater network traces the path
|
|||||||
From the main map, tap the terrain/antenna icon.
|
From the main map, tap the terrain/antenna icon.
|
||||||
|
|
||||||
### What the User Sees
|
### What the User Sees
|
||||||
A full-screen map with a draggable bottom sheet containing:
|
A full-screen map with a collapsible control panel containing:
|
||||||
- **Elevation profile chart**: Terrain fill (green), LOS beam line (white), radio horizon line (yellow); obstruction points are marked as clickable dots on the chart
|
- **Elevation profile chart**: Terrain fill (green), LOS beam line (white), radio horizon line (yellow)
|
||||||
- **Status summary**: Clear (green), Marginal (amber, within 5 m of obstruction), or Blocked (red) with distance and clearance/obstruction amount
|
- **Status**: Clear (green) or blocked (red) with distance and minimum clearance
|
||||||
- **Options section** (collapsible): Node toggles, endpoint dropdowns, antenna height sliders (0–400 ft), Run LOS button
|
- **Options panel**: Node toggles, endpoint dropdowns, antenna height sliders (0–400 ft), Run LOS button
|
||||||
|
|
||||||
### Key Interactions
|
### Key Interactions
|
||||||
- **Long-press the map** to add custom endpoints (pushpin markers, renameable/deleteable)
|
- **Long-press the map** to add custom endpoints (orange pushpin markers, renameable/deleteable)
|
||||||
- **Tap a marker** to select it as Point A or B; LOS runs automatically when both are set
|
- **Tap a marker** to select it as Point A or B; LOS runs automatically when both are set
|
||||||
- **Antenna heights** are adjustable for both endpoints
|
- **Antenna heights** are adjustable for both endpoints
|
||||||
- **Map line** between endpoints is colored green (clear), amber (marginal), or red (blocked)
|
- **Map line** between endpoints is colored green (clear) or red (blocked)
|
||||||
- Terrain elevation is fetched from the Open-Meteo API (21, 41, or 81 sample points depending on link distance, cached 24 hours)
|
- Terrain elevation is fetched from the Open-Meteo API (21–81 sample points, cached 24 hours)
|
||||||
- K-factor is adjusted per radio frequency from a baseline of 4/3 at 915 MHz
|
- K-factor is adjusted per radio frequency from a baseline of 4/3 at 915 MHz
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -156,7 +149,7 @@ Settings → App Settings → Map Display → Offline Map Cache
|
|||||||
- Map with a blue polygon overlay showing previously selected cache bounds
|
- Map with a blue polygon overlay showing previously selected cache bounds
|
||||||
- Bounding box coordinates card
|
- Bounding box coordinates card
|
||||||
- **Cache Area** controls: "Use Current View" and Clear buttons
|
- **Cache Area** controls: "Use Current View" and Clear buttons
|
||||||
- **Zoom Range** range slider (3–18, dual-handle for min and max) with estimated tile count
|
- **Zoom Range** slider (3–18) with estimated tile count
|
||||||
- **Download progress** bar (when downloading)
|
- **Download progress** bar (when downloading)
|
||||||
- **Download Tiles** and **Clear Cache** buttons
|
- **Download Tiles** and **Clear Cache** buttons
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
The app follows this general flow:
|
The app follows this general flow:
|
||||||
|
|
||||||
```
|
```
|
||||||
Launch → Scanner Screen → [Connect via BLE/USB/TCP] → Channels Screen
|
Launch → Scanner Screen → [Connect via BLE/USB/TCP] → Contacts Screen
|
||||||
```
|
```
|
||||||
|
|
||||||
After connecting, the three main screens (Contacts, Channels, Map) are accessible via a persistent bottom navigation bar called the **QuickSwitchBar**.
|
After connecting, the three main screens (Contacts, Channels, Map) are accessible via a persistent bottom navigation bar called the **QuickSwitchBar**.
|
||||||
@@ -24,7 +24,7 @@ Tapping a tab replaces the current screen with a subtle fade + slight horizontal
|
|||||||
|
|
||||||
## Disconnection
|
## Disconnection
|
||||||
|
|
||||||
- The disconnect button (available in the overflow menu of each main screen) shows a confirmation dialog before disconnecting
|
- The disconnect button (available in the Settings screen and other main screens) shows a confirmation dialog before disconnecting
|
||||||
- If the device disconnects unexpectedly, the app automatically navigates back to the Scanner screen (fires after the current frame completes via a post-frame callback)
|
- If the device disconnects unexpectedly, the app automatically navigates back to the Scanner screen (fires after the current frame completes via a post-frame callback)
|
||||||
- This auto-navigation behavior (`DisconnectNavigationMixin`) is shared across all main screens
|
- This auto-navigation behavior (`DisconnectNavigationMixin`) is shared across all main screens
|
||||||
|
|
||||||
@@ -38,11 +38,11 @@ Tapping a tab replaces the current screen with a subtle fade + slight horizontal
|
|||||||
|
|
||||||
```
|
```
|
||||||
ScannerScreen (root, always on stack)
|
ScannerScreen (root, always on stack)
|
||||||
├─ [BLE connect] → push → ChannelsScreen
|
├─ [BLE connect] → push → ContactsScreen
|
||||||
├─ [TCP icon button] → push → TcpScreen
|
├─ [TCP FAB] → push → TcpScreen
|
||||||
│ └─ [TCP connected] → pushReplacement → ChannelsScreen
|
│ └─ [TCP connected] → pushReplacement → ContactsScreen
|
||||||
└─ [USB icon button] → push → UsbScreen
|
└─ [USB FAB] → push → UsbScreen
|
||||||
└─ [USB connected] → pushReplacement → ChannelsScreen
|
└─ [USB connected] → pushReplacement → ContactsScreen
|
||||||
|
|
||||||
ContactsScreen (selected=0)
|
ContactsScreen (selected=0)
|
||||||
├─ [quick-switch 1] → pushReplacement → ChannelsScreen
|
├─ [quick-switch 1] → pushReplacement → ChannelsScreen
|
||||||
@@ -60,9 +60,9 @@ ChannelsScreen (selected=1)
|
|||||||
MapScreen (selected=2)
|
MapScreen (selected=2)
|
||||||
├─ [quick-switch 0] → pushReplacement → ContactsScreen
|
├─ [quick-switch 0] → pushReplacement → ContactsScreen
|
||||||
├─ [quick-switch 1] → pushReplacement → ChannelsScreen
|
├─ [quick-switch 1] → pushReplacement → ChannelsScreen
|
||||||
├─ [radar menu item] → enters in-map path trace mode (push → PathTraceMapScreen after path is built)
|
├─ [radar button] → push → PathTraceMapScreen
|
||||||
├─ [terrain menu item] → push → LineOfSightMapScreen
|
├─ [terrain button] → push → LineOfSightMapScreen
|
||||||
└─ [long-press] → share marker sheet
|
└─ [long-press] → share marker / set location
|
||||||
|
|
||||||
Settings (push from any main screen)
|
Settings (push from any main screen)
|
||||||
└─ [App Settings] → push → AppSettingsScreen
|
└─ [App Settings] → push → AppSettingsScreen
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ MeshCore Open provides both **system notifications** (push-style OS alerts) and
|
|||||||
|
|
||||||
### 3. Advertisement Notifications
|
### 3. Advertisement Notifications
|
||||||
- **Triggered when**: A new node is discovered on the mesh for the first time
|
- **Triggered when**: A new node is discovered on the mesh for the first time
|
||||||
- **Title**: "New [type] discovered" (e.g., "New Chat discovered")
|
- **Title**: "New [type] discovered" (e.g., "New chat node discovered")
|
||||||
- **Body**: Contact's name
|
- **Body**: Contact's name
|
||||||
- **Priority**: Default
|
- **Priority**: Default
|
||||||
- **Android channel**: `adverts`
|
- **Android channel**: `adverts`
|
||||||
@@ -43,7 +43,7 @@ Red numeric badges appear throughout the UI:
|
|||||||
- **Contacts list**: Each contact row shows a red pill badge (e.g., "3") for unread messages
|
- **Contacts list**: Each contact row shows a red pill badge (e.g., "3") for unread messages
|
||||||
- **Channels list**: Each channel row shows an unread badge
|
- **Channels list**: Each channel row shows an unread badge
|
||||||
- **Chat screen subtitle**: Shows unread count inline
|
- **Chat screen subtitle**: Shows unread count inline
|
||||||
- Badges cap at "9999+" for display
|
- Badges cap at "99+" for display
|
||||||
|
|
||||||
### How Unread Counts Work
|
### How Unread Counts Work
|
||||||
|
|
||||||
|
|||||||
@@ -34,8 +34,8 @@ The central management screen showing:
|
|||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Status | Repeater Status Screen | All users |
|
| Status | Repeater Status Screen | All users |
|
||||||
| Telemetry | Telemetry Screen | All users |
|
| Telemetry | Telemetry Screen | All users |
|
||||||
| Neighbors | Neighbors Screen | All users |
|
|
||||||
| CLI | Repeater CLI Screen | Admin only |
|
| CLI | Repeater CLI Screen | Admin only |
|
||||||
|
| Neighbors | Neighbors Screen | All users |
|
||||||
| Settings | Repeater Settings Screen | Admin only |
|
| Settings | Repeater Settings Screen | Admin only |
|
||||||
|
|
||||||
The battery chemistry selector and CLI/Settings cards are hidden from guest users.
|
The battery chemistry selector and CLI/Settings cards are hidden from guest users.
|
||||||
@@ -89,7 +89,7 @@ A terminal-style interface for sending commands directly to the repeater.
|
|||||||
- Type a command and press send (or Enter on desktop)
|
- Type a command and press send (or Enter on desktop)
|
||||||
- Up/down arrows navigate through command history
|
- Up/down arrows navigate through command history
|
||||||
- Quick-command buttons populate and send common commands
|
- Quick-command buttons populate and send common commands
|
||||||
- Overflow menu (three-dot icon): "Debug next command" option shows raw frame debug info for the next typed command (shows error snackbar if input field is empty)
|
- Bug report icon: Shows raw frame debug info for the next typed command (shows error snackbar if input field is empty)
|
||||||
- Help icon: Opens a scrollable reference of all known CLI commands. Tapping any command populates the input field immediately
|
- Help icon: Opens a scrollable reference of all known CLI commands. Tapping any command populates the input field immediately
|
||||||
- Clear icon: Wipes the command/response history
|
- Clear icon: Wipes the command/response history
|
||||||
- Failed/timed-out commands are automatically retried once
|
- Failed/timed-out commands are automatically retried once
|
||||||
@@ -112,9 +112,7 @@ The in-app help reference (help icon) documents all known commands. Categories:
|
|||||||
|
|
||||||
**Power Management**: `get pwrmgt.support`, `get pwrmgt.source`, `get pwrmgt.bootreason`, `get pwrmgt.bootmv`
|
**Power Management**: `get pwrmgt.support`, `get pwrmgt.source`, `get pwrmgt.bootreason`, `get pwrmgt.bootmv`
|
||||||
|
|
||||||
**Sensors**: `sensor get {key}`, `sensor set {key} {value}`, `sensor list [start]`
|
**Sensors**: `sensor get {key}`
|
||||||
|
|
||||||
**GPS Management**: `gps`, `gps {on|off}`, `gps sync`, `gps setloc`, `gps advert`, `gps advert {none|share|prefs}`
|
|
||||||
|
|
||||||
**Region Management**: `region`, `region load`, `region get`, `region put`, `region remove`, `region allowf`, `region denyf`, `region home`, `region save`, `region default`, `region list allowed`, `region list denied`
|
**Region Management**: `region`, `region load`, `region get`, `region put`, `region remove`, `region allowf`, `region denyf`, `region home`, `region save`, `region default`, `region list allowed`, `region list denied`
|
||||||
|
|
||||||
@@ -209,7 +207,7 @@ Nine configuration cards, each with its own per-field refresh button(s):
|
|||||||
|
|
||||||
**Danger Zone** (red-styled card)
|
**Danger Zone** (red-styled card)
|
||||||
- Reboot repeater (sends `reboot` with confirmation dialog)
|
- Reboot repeater (sends `reboot` with confirmation dialog)
|
||||||
- Erase filesystem (serial-only; shows a confirmation dialog, then an informational snackbar — no command is sent over the air)
|
- Erase filesystem (serial-only; shows informational snackbar only — no command is sent over the air)
|
||||||
|
|
||||||
### Key Interactions
|
### Key Interactions
|
||||||
- **Settings are NOT auto-fetched on open**. Name is pre-filled from cached contact data. Each section has its own refresh button to fetch live values from the repeater
|
- **Settings are NOT auto-fetched on open**. Name is pre-filled from cached contact data. Each section has its own refresh button to fetch live values from the repeater
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
# Routing Paths
|
|
||||||
|
|
||||||
This page covers how MeshCore Open represents, selects, validates, and stores routing paths in the UI and data layer.
|
|
||||||
|
|
||||||
## Path Routing
|
|
||||||
|
|
||||||
MeshCore supports variable-length multi-byte routing paths so the app can scale from small meshes to very large node sets.
|
|
||||||
|
|
||||||
### Hash Width and Multi-Byte Paths
|
|
||||||
|
|
||||||
The device capability determines the hash width (number of bytes per hop):
|
|
||||||
|
|
||||||
| Width | Max Unique Nodes | Typical Use |
|
|
||||||
|-------|-----------------|-------------|
|
|
||||||
| 1 byte | 256 | Single-byte node IDs |
|
|
||||||
| 2 bytes | 65,536 | Medium meshes |
|
|
||||||
| 3 bytes | 16.7M | Large networks |
|
|
||||||
| 4 bytes | 4.3G | Very large meshes / future-proofing |
|
|
||||||
|
|
||||||
### Device Capability Detection
|
|
||||||
|
|
||||||
On device connection, the app reads the firmware capability to set `pathHashByteWidth`:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
// Read from device info response (offset 81)
|
|
||||||
final modeRaw = firmwareBytes.length >= 82
|
|
||||||
? (firmwareBytes[81] & 0xFF)
|
|
||||||
: 0;
|
|
||||||
final mode = modeRaw.clamp(0, 3);
|
|
||||||
_pathHashByteWidth = mode + 1; // 1, 2, 3, or 4 bytes per hop
|
|
||||||
```
|
|
||||||
|
|
||||||
The connector reads a single-mode byte and clamps to `0..3`, so the supported hop width is `1..4` bytes. UI code also clamps widths when rendering (typically to `1..4`) so 4-byte hops are handled end-to-end in the current codebase.
|
|
||||||
|
|
||||||
### Path Data Structure
|
|
||||||
|
|
||||||
Paths in messages and storage consist of:
|
|
||||||
|
|
||||||
- **`pathLength` (model/storage)**: Hop count (number of hops). Negative values (e.g. `-1`) are used as a flood sentinel.
|
|
||||||
- **On-air `path_len` byte**: A packed byte that encodes hop count + hash width and is decoded into `pathLength` + `pathBytes` when parsing frames.
|
|
||||||
- **`pathBytes`**: Raw bytes of the path (concatenated hop prefixes), grouped by `pathHashByteWidth`.
|
|
||||||
- **`hopCount`**: Derived display value computed from bytes and width: `(byteCount + hashByteWidth - 1) ~/ hashByteWidth`.
|
|
||||||
- **Example**: With `pathHashByteWidth=2`, a 3-hop path has 6 bytes (`pathBytes.length = 6`) and `pathLength = 3`:
|
|
||||||
- `pathBytes = [0xA1, 0xA2, 0xB1, 0xB2, 0xC1, 0xC2]`
|
|
||||||
- Hops: `[0xA1A2]`, `[0xB1B2]`, `[0xC1C2]`
|
|
||||||
|
|
||||||
### Hop Count Calculation
|
|
||||||
|
|
||||||
Convert path byte length to hop count:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
int hopCount = (byteCount + hashByteWidth - 1) ~/ hashByteWidth;
|
|
||||||
```
|
|
||||||
|
|
||||||
Use this consistently when displaying hop counts in UI. Do not treat `pathLength` as a hop count when the path uses multi-byte hop hashes.
|
|
||||||
|
|
||||||
### Path Usage in Different Message Types
|
|
||||||
|
|
||||||
- **Direct messages**: Extract path from decrypted payload to trace sender route.
|
|
||||||
- **Channel messages**: Decrypt hop-by-hop routing chain from payload; the header carries the encoded byte length for the path blob, not the derived hop count.
|
|
||||||
- **Contact storage**: Path length in byte 32, raw path bytes in bytes 33-96, grouped by detected `pathHashByteWidth`.
|
|
||||||
|
|
||||||
### UI Hop Count Display
|
|
||||||
|
|
||||||
⚠️ **Important**: In screens like "Channel Message Path", prefer the actual decoded `pathBytes` hop count over `pathLength` metadata:
|
|
||||||
|
|
||||||
```dart
|
|
||||||
// Preferred: use actual observed path length
|
|
||||||
final effectiveHopCount = (pathBytes.length + width - 1) ~/ width;
|
|
||||||
|
|
||||||
// Avoid: using encoded byte length as if it were a hop count
|
|
||||||
// pathLength is bytes; converting it twice causes inflated counts
|
|
||||||
```
|
|
||||||
|
|
||||||
Example scenario:
|
|
||||||
- Radio header reports `pathLength: 32` bytes
|
|
||||||
- Decoded path bytes: `[0xAB, 0xCD]` (2 bytes = 1 hop with width=2)
|
|
||||||
- **Display**: "1 hop" (from `pathBytes`), not "32 hops" (which would double-count the encoded length)
|
|
||||||
|
|
||||||
@@ -28,11 +28,9 @@ The BLE Scanner is the app's home screen, displayed immediately on launch.
|
|||||||
|
|
||||||
**Device List**: When no devices are found, shows a large Bluetooth icon with a prompt. The prompt text is dynamic: "Searching for devices..." while actively scanning, or "Tap Scan to search" when idle. When devices are found, shows a scrollable list of `DeviceTile` widgets.
|
**Device List**: When no devices are found, shows a large Bluetooth icon with a prompt. The prompt text is dynamic: "Searching for devices..." while actively scanning, or "Tap Scan to search" when idle. When devices are found, shows a scrollable list of `DeviceTile` widgets.
|
||||||
|
|
||||||
**App Bar Actions**: Icon buttons in the top-right corner of the app bar:
|
**Bottom FAB Row**: Up to three floating action buttons:
|
||||||
- **USB** icon button - Opens USB connection screen (Android, Windows, Linux, macOS, Chrome web only)
|
- **USB** button - Opens USB connection screen (Android, Windows, Linux, macOS, Chrome web only)
|
||||||
- **TCP/IP** icon button - Opens TCP connection screen (all non-web platforms)
|
- **TCP/IP** button - Opens TCP connection screen (all non-web platforms)
|
||||||
|
|
||||||
**Bottom FAB**: A single floating action button:
|
|
||||||
- **BLE Scan** button - Toggles BLE scanning on/off; shows a spinner when scanning. **Disabled** (greyed out, not tappable) when Bluetooth is off
|
- **BLE Scan** button - Toggles BLE scanning on/off; shows a spinner when scanning. **Disabled** (greyed out, not tappable) when Bluetooth is off
|
||||||
|
|
||||||
### Device Tile
|
### Device Tile
|
||||||
@@ -53,7 +51,7 @@ Note: The weak (-80 to -90 dBm) and poor (< -90 dBm) tiers share the same icon s
|
|||||||
|
|
||||||
### How Scanning Works
|
### How Scanning Works
|
||||||
|
|
||||||
- Filters for devices advertising the Nordic UART Service UUID (so community forks with non-standard names are still found). Known name prefixes used by stock firmware builds for reference: `MeshCore-`, `Whisper-`, `WisCore-`, `Seeed`, `Lilygo`, `HT-`, `LowMesh_MC_`, `NRF52`
|
- Filters for devices with names starting with one of the known prefixes: `MeshCore-`, `Whisper-`, `WisCore-`, `Seeed`, `Lilygo`, `HT-`, `LowMesh_MC_`
|
||||||
- Uses low-latency scan mode on Android
|
- Uses low-latency scan mode on Android
|
||||||
- Scans for 10 seconds then auto-stops
|
- Scans for 10 seconds then auto-stops
|
||||||
- On iOS/macOS, waits for BLE adapter initialization before starting
|
- On iOS/macOS, waits for BLE adapter initialization before starting
|
||||||
@@ -67,7 +65,7 @@ Tap a device tile or its Connect button:
|
|||||||
3. Requests MTU 185 bytes for optimal throughput
|
3. Requests MTU 185 bytes for optimal throughput
|
||||||
4. Discovers BLE services and locates the Nordic UART Service
|
4. Discovers BLE services and locates the Nordic UART Service
|
||||||
5. Subscribes to TX notifications for receiving data
|
5. Subscribes to TX notifications for receiving data
|
||||||
6. On success, automatically navigates to the Channels screen
|
6. On success, automatically navigates to the Contacts screen
|
||||||
7. On failure, shows a red error snackbar
|
7. On failure, shows a red error snackbar
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -76,7 +74,7 @@ Tap a device tile or its Connect button:
|
|||||||
|
|
||||||
### How to Access
|
### How to Access
|
||||||
|
|
||||||
From the Scanner screen, tap the **USB** icon button in the app bar.
|
From the Scanner screen, tap the **USB** FAB button.
|
||||||
|
|
||||||
### What the User Sees
|
### What the User Sees
|
||||||
|
|
||||||
@@ -84,15 +82,15 @@ From the Scanner screen, tap the **USB** icon button in the app bar.
|
|||||||
- A list of detected USB serial ports, each showing:
|
- A list of detected USB serial ports, each showing:
|
||||||
- Friendly display name
|
- Friendly display name
|
||||||
- Raw port name (subtitle, only shown when it differs from the display name)
|
- Raw port name (subtitle, only shown when it differs from the display name)
|
||||||
- Chevron trailing icon (the entire tile is tappable to connect)
|
- "Connect" button
|
||||||
- Transport switcher buttons (outlined, not FABs) to switch to BLE or TCP (these use `pushReplacement`, so back navigation returns to Scanner, not between USB/TCP)
|
- FABs at the bottom to switch to BLE or TCP (these use `pushReplacement`, so back navigation returns to Scanner, not between USB/TCP)
|
||||||
|
|
||||||
### Key Interactions
|
### Key Interactions
|
||||||
|
|
||||||
- On desktop (Windows, Linux, macOS): ports are polled every 2 seconds for hot-plug detection (polling pauses while connecting/connected)
|
- On desktop (Windows, Linux, macOS): ports are polled every 2 seconds for hot-plug detection (polling pauses while connecting/connected)
|
||||||
- On mobile: tap the "Scan" FAB to manually refresh
|
- On mobile: tap the "Scan" FAB to manually refresh
|
||||||
- Tap a port tile to connect
|
- Tap a port or its Connect button to connect
|
||||||
- On successful connection, navigates to Channels screen
|
- On successful connection, navigates to Contacts screen
|
||||||
- On connection failure, the port list automatically refreshes
|
- On connection failure, the port list automatically refreshes
|
||||||
- Platform-specific error messages for common USB failures (permission denied, device missing, device detached, device busy, driver missing, port invalid, timeout, and more)
|
- Platform-specific error messages for common USB failures (permission denied, device missing, device detached, device busy, driver missing, port invalid, timeout, and more)
|
||||||
|
|
||||||
@@ -102,7 +100,7 @@ From the Scanner screen, tap the **USB** icon button in the app bar.
|
|||||||
|
|
||||||
### How to Access
|
### How to Access
|
||||||
|
|
||||||
From the Scanner screen, tap the **TCP/IP** icon button in the app bar.
|
From the Scanner screen, tap the **TCP/IP** FAB button.
|
||||||
|
|
||||||
### What the User Sees
|
### What the User Sees
|
||||||
|
|
||||||
@@ -110,7 +108,7 @@ From the Scanner screen, tap the **TCP/IP** icon button in the app bar.
|
|||||||
- **Host address** text field
|
- **Host address** text field
|
||||||
- **Port number** text field
|
- **Port number** text field
|
||||||
- **Connect** button
|
- **Connect** button
|
||||||
- Transport switcher buttons (outlined, not FABs) to switch to USB or BLE
|
- FABs at the bottom to switch to USB or BLE
|
||||||
|
|
||||||
### Key Interactions
|
### Key Interactions
|
||||||
|
|
||||||
@@ -121,6 +119,6 @@ From the Scanner screen, tap the **TCP/IP** icon button in the app bar.
|
|||||||
- Validation errors are shown as red snackbars
|
- Validation errors are shown as red snackbars
|
||||||
- The Connect button shows a spinner and "Connecting..." label while in progress
|
- The Connect button shows a spinner and "Connecting..." label while in progress
|
||||||
- The status bar shows the specific host:port being connected to (e.g., "Connecting to 192.168.1.1:5000")
|
- The status bar shows the specific host:port being connected to (e.g., "Connecting to 192.168.1.1:5000")
|
||||||
- On success, navigates to Channels screen and saves the host/port to settings
|
- On success, navigates to Contacts screen and saves the host/port to settings
|
||||||
- On connection, the status bar shows the active TCP endpoint (e.g., "Connected to 192.168.1.1:5000")
|
- On connection, the status bar shows the active TCP endpoint (e.g., "Connected to 192.168.1.1:5000")
|
||||||
- Error messages for timeout, unsupported platform, and connection failures
|
- Error messages for timeout, unsupported platform, and connection failures
|
||||||
|
|||||||
@@ -12,13 +12,12 @@ Settings are only accessible while a device is connected.
|
|||||||
The settings screen is a scrollable list of cards:
|
The settings screen is a scrollable list of cards:
|
||||||
|
|
||||||
1. [Device Info](#device-info)
|
1. [Device Info](#device-info)
|
||||||
2. [Node Settings](#node-settings)
|
2. [App Settings](#app-settings) (link to sub-screen)
|
||||||
3. [Location](#location)
|
3. [Node Settings](#node-settings)
|
||||||
4. [App Settings](#app-settings) (link to sub-screen)
|
4. [Actions](#actions)
|
||||||
5. [Actions](#actions)
|
5. [Debug](#debug)
|
||||||
6. [Export](#export)
|
6. [Export](#export)
|
||||||
7. [Debug](#debug)
|
7. [About](#about)
|
||||||
8. [About](#about)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -41,6 +40,56 @@ Battery shows an alert icon and orange text when at 15% or below. The toggle onl
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## App Settings
|
||||||
|
|
||||||
|
A dedicated sub-screen for app-level preferences (nothing here is sent to the device). All settings persist locally via SharedPreferences.
|
||||||
|
|
||||||
|
### Appearance
|
||||||
|
- **Theme**: System / Light / Dark
|
||||||
|
- **Language**: System default or one of 18 languages (English, French, Spanish, German, Polish, Slovenian, Portuguese, Italian, Chinese, Swedish, Dutch, Slovak, Bulgarian, Russian, Ukrainian, Hungarian, Japanese, Korean)
|
||||||
|
- **Enable Message Tracing**: Shows path trace overlays and extra metadata on messages
|
||||||
|
|
||||||
|
### Notifications
|
||||||
|
- **Master enable/disable**: Requests OS permission when enabling
|
||||||
|
- **Message notifications**: New direct message alerts
|
||||||
|
- **Channel message notifications**: New channel message alerts
|
||||||
|
- **Advertisement notifications**: New node discovery alerts
|
||||||
|
|
||||||
|
### Messaging
|
||||||
|
- **Clear Path on Max Retry**: Erases the stored routing path after all retries fail
|
||||||
|
- **Jump to Oldest Unread**: When opening a chat, scrolls to the oldest unread message instead of the newest
|
||||||
|
- **Auto Route Rotation**: Enables weighted routing algorithm. When enabled, expands to show five slider sub-settings (hidden when off):
|
||||||
|
- Max Route Weight (1–10, default 5, integer steps)
|
||||||
|
- Initial Route Weight (0.5–5.0, default 3.0)
|
||||||
|
- Success Increment (0.1–2.0, default 0.5, 0.1 steps)
|
||||||
|
- Failure Decrement (0.1–2.0, default 0.2, 0.1 steps)
|
||||||
|
- Max Message Retries (2–10, default 5)
|
||||||
|
|
||||||
|
### Battery
|
||||||
|
- **Battery Chemistry**: NMC / LiFePO4 / LiPo (per device, used to calibrate percentage from voltage)
|
||||||
|
|
||||||
|
### Translation
|
||||||
|
Not shown on web. Controls on-device message translation powered by a locally-downloaded ML model:
|
||||||
|
- **Enable Translation**: Translates incoming messages into the selected target language
|
||||||
|
- **Translate Composer**: Translates outgoing messages from the target language back before sending
|
||||||
|
- **Target Language**: Language to translate into (searchable list; defaults to the app language)
|
||||||
|
- **Downloaded Model**: Dropdown to select among already-downloaded translation models
|
||||||
|
- **Preset Model**: Download a curated preset model with one tap
|
||||||
|
- **Custom Model URL**: Enter a URL to download a custom GGUF-format model; shows download progress and a cancel button
|
||||||
|
|
||||||
|
### Map Display
|
||||||
|
- **Show Repeaters**: Toggle repeater markers on map
|
||||||
|
- **Show Chat Nodes**: Toggle chat node markers
|
||||||
|
- **Show Other Nodes**: Toggle room/sensor markers
|
||||||
|
- **Time Filter**: All time / Last 1h / Last 6h / Last 24h / Last week
|
||||||
|
- **Units**: Metric / Imperial
|
||||||
|
- **Offline Map Cache**: Navigate to tile download screen
|
||||||
|
|
||||||
|
### Debug
|
||||||
|
- **App Debug Logging**: Enable the in-app debug log
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Node Settings
|
## Node Settings
|
||||||
|
|
||||||
These settings are sent directly to the connected device firmware.
|
These settings are sent directly to the connected device firmware.
|
||||||
@@ -52,7 +101,7 @@ These settings are sent directly to the connected device firmware.
|
|||||||
|
|
||||||
### Radio Settings
|
### Radio Settings
|
||||||
Opens a dialog pre-populated with the device's current radio settings. Contains:
|
Opens a dialog pre-populated with the device's current radio settings. Contains:
|
||||||
- **Preset dropdown**: Regional presets — selecting a preset immediately fills all fields below. Includes presets for Australia, Australia (Narrow), Australia (Mid), Australia SA WA QLD, Czech Republic, EU 433MHz, EU/UK (Long Range), EU/UK (Medium Range), EU/UK (Narrow), New Zealand, New Zealand (Narrow), Portugal 433, Portugal 869, numerous Russia city presets, Switzerland, USA Arizona, USA/Canada, and Vietnam
|
- **Preset dropdown**: 19 regional presets — selecting a preset immediately fills all fields below. Full list: Australia, Australia (Narrow), Australia SA, WA, QLD, Czech Republic, EU 433MHz, EU/UK (Long Range), EU/UK (Medium Range), EU/UK (Narrow), New Zealand, New Zealand (Narrow), Portugal 433, Portugal 869, Switzerland, USA Arizona, USA/Canada, Vietnam, Off-Grid 433, Off-Grid 869, Off-Grid 918
|
||||||
- **Frequency** (MHz): Free text, validated 300–2500 MHz
|
- **Frequency** (MHz): Free text, validated 300–2500 MHz
|
||||||
- **Bandwidth**: Dropdown (7.8 / 10.4 / 15.6 / 20.8 / 31.25 / 41.7 / 62.5 / 125 / 250 / 500 kHz)
|
- **Bandwidth**: Dropdown (7.8 / 10.4 / 15.6 / 20.8 / 31.25 / 41.7 / 62.5 / 125 / 250 / 500 kHz)
|
||||||
- **Spreading Factor**: SF5–SF12
|
- **Spreading Factor**: SF5–SF12
|
||||||
@@ -60,13 +109,6 @@ Opens a dialog pre-populated with the device's current radio settings. Contains:
|
|||||||
- **TX Power** (dBm): Validated 0 to device max (typically 22 dBm)
|
- **TX Power** (dBm): Validated 0 to device max (typically 22 dBm)
|
||||||
- **Client Repeat** toggle: Only shown on firmware v9+; requires frequency to be exactly 433.000, 869.000, or 918.000 MHz (the Off-Grid presets). Save is blocked with a warning if enabled on other frequencies
|
- **Client Repeat** toggle: Only shown on firmware v9+; requires frequency to be exactly 433.000, 869.000, or 918.000 MHz (the Off-Grid presets). Save is blocked with a warning if enabled on other frequencies
|
||||||
|
|
||||||
### Companion Radio Stats
|
|
||||||
Opens the RF statistics screen (RSSI, SNR, packet counts) for the paired radio. Only enabled when connected to a device that supports companion radio stats.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Location
|
|
||||||
|
|
||||||
### Location
|
### Location
|
||||||
Opens a dialog pre-populated with the device's current coordinates (if known):
|
Opens a dialog pre-populated with the device's current coordinates (if known):
|
||||||
- Latitude and longitude fields (decimal, 6 decimal places). If only one field is provided, the other uses the device's current value
|
- Latitude and longitude fields (decimal, 6 decimal places). If only one field is provided, the other uses the device's current value
|
||||||
@@ -83,72 +125,8 @@ Five toggles controlling which node types are auto-added when heard:
|
|||||||
- Auto-add Sensors
|
- Auto-add Sensors
|
||||||
- Overwrite Oldest (when contact list is full)
|
- Overwrite Oldest (when contact list is full)
|
||||||
|
|
||||||
### Privacy
|
### Privacy Mode
|
||||||
Opens a dialog with controls for how the node shares telemetry and location data:
|
Opens a confirmation dialog with three buttons: Cancel, Enable, and Disable. Both states can be set from the same dialog regardless of current state. A snackbar confirms which state was applied. When on, the node stops broadcasting its location in advertisements.
|
||||||
- **Advert Location**: Toggle whether the node broadcasts its location in advertisements
|
|
||||||
- **Multi-Ack**: Toggle multi-ack delivery confirmations
|
|
||||||
- **Telemetry Base Mode**: Deny All / Allow by Contact / Allow All
|
|
||||||
- **Telemetry Location Mode**: Deny All / Allow by Contact / Allow All
|
|
||||||
- **Telemetry Environment Mode**: Deny All / Allow by Contact / Allow All
|
|
||||||
|
|
||||||
Settings take effect when saved. A snackbar confirms the update.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## App Settings
|
|
||||||
|
|
||||||
A dedicated sub-screen for app-level preferences (nothing here is sent to the device). All settings persist locally via SharedPreferences.
|
|
||||||
|
|
||||||
### Appearance
|
|
||||||
- **Theme**: System / Light / Dark
|
|
||||||
- **Language**: System default or one of 18 languages (English, French, Spanish, German, Polish, Slovenian, Portuguese, Italian, Chinese, Swedish, Dutch, Slovak, Bulgarian, Russian, Ukrainian, Hungarian, Japanese, Korean)
|
|
||||||
|
|
||||||
### Notifications
|
|
||||||
- **Master enable/disable**: Requests OS permission when enabling
|
|
||||||
- **Message notifications**: New direct message alerts
|
|
||||||
- **Channel message notifications**: New channel message alerts
|
|
||||||
- **Advertisement notifications**: New node discovery alerts
|
|
||||||
|
|
||||||
### Messaging
|
|
||||||
- **Clear Path on Max Retry**: Erases the stored routing path after all retries fail
|
|
||||||
- **Jump to Oldest Unread**: When opening a chat, scrolls to the oldest unread message instead of the newest
|
|
||||||
- **Auto Route Rotation**: Enables weighted routing algorithm. When enabled, expands to show five slider sub-settings (hidden when off):
|
|
||||||
- Max Route Weight (1–10, default 5, integer steps)
|
|
||||||
- Initial Route Weight (0.5–5.0, default 3.0)
|
|
||||||
- Success Increment (0.1–2.0, default 0.5, 0.1 steps)
|
|
||||||
- Failure Decrement (0.1–2.0, default 0.2, 0.1 steps)
|
|
||||||
- Max Message Retries (2–10, default 5)
|
|
||||||
- **Enable Message Tracing**: Shows path trace overlays and extra metadata on messages
|
|
||||||
|
|
||||||
### Battery
|
|
||||||
- **Battery Chemistry**: NMC / LiFePO4 / LiPo (per device, used to calibrate percentage from voltage)
|
|
||||||
|
|
||||||
### Map Display
|
|
||||||
- **Show Repeaters**: Toggle repeater markers on map
|
|
||||||
- **Show Chat Nodes**: Toggle chat node markers
|
|
||||||
- **Show Other Nodes**: Toggle room/sensor markers
|
|
||||||
- **Time Filter**: All time / Last 1h / Last 6h / Last 24h / Last week
|
|
||||||
- **Units**: Metric / Imperial
|
|
||||||
- **Raster Tile Source**: Sets the MAP theme and with that from where to get the map tile data:
|
|
||||||
- OpenStreetMap (Auto/Standard/Dark) is provided by the free OpenStreetMap tile server. (Can only be used for live view or already cached.)
|
|
||||||
- Stamen Terrain / AlidadeSmooth Dark / Outdoors / OSM Bright are [StadiaMaps.com raster tile maps](https://stadiamaps.com/products/maps/interactive-basemaps/) for which you can choose an Hosted Endpoint (Worldwide / Europe hosted) and have to provide the API key to your subscription. (You can cache these maps for offline Map usage.)
|
|
||||||
There will be no account provided by meshcore-open. You will have to get you own subscription. StadiaMaps offers a [free](https://stadiamaps.com/pricing/) subscription to download up to 200'000 Standart Raster Basemap tiles.
|
|
||||||
- **Offline Map Cache**: Navigate to tile download screen
|
|
||||||
|
|
||||||
### Translation
|
|
||||||
Not shown on web. Controls on-device message translation powered by a locally-downloaded ML model:
|
|
||||||
- **Enable Translation**: Translates incoming messages into the selected target language
|
|
||||||
- **Translate Composer**: Translates outgoing messages from the target language back before sending
|
|
||||||
- **Target Language**: Language to translate into (searchable list; defaults to the app language)
|
|
||||||
- **Downloaded Model**: Dropdown to select among already-downloaded translation models
|
|
||||||
- **Preset Model**: Download a curated preset model with one tap
|
|
||||||
- **Custom Model URL**: Enter a URL to download a custom GGUF-format model; shows download progress and a cancel button
|
|
||||||
|
|
||||||
### Cyrillic-to-Latin (Cyr2Lat)
|
|
||||||
Controls character substitution profiles used to render Cyrillic text in Latin characters. A dropdown selects the active profile; Add, Edit, and Delete buttons manage the profile list (the last remaining profile cannot be deleted). Each profile stores a JSON character map.
|
|
||||||
|
|
||||||
### Debug
|
|
||||||
- **App Debug Logging**: Enable the in-app debug log
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -158,24 +136,10 @@ One-tap device operations:
|
|||||||
|
|
||||||
| Action | Description |
|
| Action | Description |
|
||||||
|---|---|
|
|---|---|
|
||||||
|
| Send Advertisement | Floods the mesh with your node's advertisement |
|
||||||
| Sync Time | Sends current Unix timestamp to the device |
|
| Sync Time | Sends current Unix timestamp to the device |
|
||||||
| Refresh Contacts | Re-requests the full contact list |
|
| Refresh Contacts | Re-requests the full contact list |
|
||||||
| Reboot Device | Confirmation dialog → reboots the device (shown in warning color) |
|
| Reboot Device | Confirmation dialog → reboots the device (shown in orange) |
|
||||||
| Delete All Paths | Confirmation dialog → clears all stored routing paths (shown in alert color) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Export
|
|
||||||
|
|
||||||
Three GPX export options (not available on web):
|
|
||||||
|
|
||||||
| Option | Exports |
|
|
||||||
|---|---|
|
|
||||||
| Export Repeaters | Repeaters and Rooms with GPS coordinates |
|
|
||||||
| Export Contacts | Chat contacts with GPS coordinates |
|
|
||||||
| Export All | All contacts with GPS coordinates |
|
|
||||||
|
|
||||||
Each creates a `.gpx` file and opens the OS share sheet. Feedback via snackbar for four outcomes: success, no contacts with coordinates, feature not available (web), or error.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -196,6 +160,20 @@ Structured log entries (Info / Warning / Error), with tag, message, and timestam
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Export
|
||||||
|
|
||||||
|
Three GPX export options (not available on web):
|
||||||
|
|
||||||
|
| Option | Exports |
|
||||||
|
|---|---|
|
||||||
|
| Export Repeaters | Repeaters and Rooms with GPS coordinates |
|
||||||
|
| Export Contacts | Chat contacts with GPS coordinates |
|
||||||
|
| Export All | All contacts with GPS coordinates |
|
||||||
|
|
||||||
|
Each creates a `.gpx` file and opens the OS share sheet. Feedback via snackbar for four outcomes: success, no contacts with coordinates, feature not available (web), or error.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
Shows the standard Flutter about dialog with app name, version, and legal notice.
|
Shows the standard Flutter about dialog with app name, version, and legal notice.
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>method</key>
|
|
||||||
<string>app-store-connect</string>
|
|
||||||
<key>teamID</key>
|
|
||||||
<string>X74VJ4UAST</string>
|
|
||||||
<key>signingStyle</key>
|
|
||||||
<string>automatic</string>
|
|
||||||
<key>uploadSymbols</key>
|
|
||||||
<true/>
|
|
||||||
<key>destination</key>
|
|
||||||
<string>export</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
||||||
@@ -1,21 +1,73 @@
|
|||||||
PODS:
|
PODS:
|
||||||
- Flutter (1.0.0)
|
- Flutter (1.0.0)
|
||||||
|
- flutter_blue_plus_darwin (0.0.2):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
- flutter_foreground_task (0.0.1):
|
- flutter_foreground_task (0.0.1):
|
||||||
- Flutter
|
- Flutter
|
||||||
|
- flutter_local_notifications (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- mobile_scanner (7.0.0):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- package_info_plus (0.4.5):
|
||||||
|
- Flutter
|
||||||
|
- share_plus (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- shared_preferences_foundation (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- sqflite_darwin (0.0.4):
|
||||||
|
- Flutter
|
||||||
|
- FlutterMacOS
|
||||||
|
- url_launcher_ios (0.0.1):
|
||||||
|
- Flutter
|
||||||
|
|
||||||
DEPENDENCIES:
|
DEPENDENCIES:
|
||||||
- Flutter (from `Flutter`)
|
- Flutter (from `Flutter`)
|
||||||
|
- flutter_blue_plus_darwin (from `.symlinks/plugins/flutter_blue_plus_darwin/darwin`)
|
||||||
- flutter_foreground_task (from `.symlinks/plugins/flutter_foreground_task/ios`)
|
- flutter_foreground_task (from `.symlinks/plugins/flutter_foreground_task/ios`)
|
||||||
|
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
|
||||||
|
- mobile_scanner (from `.symlinks/plugins/mobile_scanner/darwin`)
|
||||||
|
- package_info_plus (from `.symlinks/plugins/package_info_plus/ios`)
|
||||||
|
- share_plus (from `.symlinks/plugins/share_plus/ios`)
|
||||||
|
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
|
||||||
|
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
|
||||||
|
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
|
||||||
|
|
||||||
EXTERNAL SOURCES:
|
EXTERNAL SOURCES:
|
||||||
Flutter:
|
Flutter:
|
||||||
:path: Flutter
|
:path: Flutter
|
||||||
|
flutter_blue_plus_darwin:
|
||||||
|
:path: ".symlinks/plugins/flutter_blue_plus_darwin/darwin"
|
||||||
flutter_foreground_task:
|
flutter_foreground_task:
|
||||||
:path: ".symlinks/plugins/flutter_foreground_task/ios"
|
:path: ".symlinks/plugins/flutter_foreground_task/ios"
|
||||||
|
flutter_local_notifications:
|
||||||
|
:path: ".symlinks/plugins/flutter_local_notifications/ios"
|
||||||
|
mobile_scanner:
|
||||||
|
:path: ".symlinks/plugins/mobile_scanner/darwin"
|
||||||
|
package_info_plus:
|
||||||
|
:path: ".symlinks/plugins/package_info_plus/ios"
|
||||||
|
share_plus:
|
||||||
|
:path: ".symlinks/plugins/share_plus/ios"
|
||||||
|
shared_preferences_foundation:
|
||||||
|
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
|
||||||
|
sqflite_darwin:
|
||||||
|
:path: ".symlinks/plugins/sqflite_darwin/darwin"
|
||||||
|
url_launcher_ios:
|
||||||
|
:path: ".symlinks/plugins/url_launcher_ios/ios"
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467
|
||||||
|
flutter_blue_plus_darwin: 20a08bfeaa0f7804d524858d3d8744bcc1b6dbc3
|
||||||
flutter_foreground_task: a159d2c2173b33699ddb3e6c2a067045d7cebb89
|
flutter_foreground_task: a159d2c2173b33699ddb3e6c2a067045d7cebb89
|
||||||
|
flutter_local_notifications: a5a732f069baa862e728d839dd2ebb904737effb
|
||||||
|
mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93
|
||||||
|
package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499
|
||||||
|
share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a
|
||||||
|
shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb
|
||||||
|
sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0
|
||||||
|
url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b
|
||||||
|
|
||||||
PODFILE CHECKSUM: e42b502c78c33aa1ed9d42eaea8960ce2139504b
|
PODFILE CHECKSUM: e42b502c78c33aa1ed9d42eaea8960ce2139504b
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
|
||||||
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
|
||||||
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
|
||||||
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */ = {isa = PBXBuildFile; productRef = 78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */; };
|
|
||||||
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
|
||||||
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
|
||||||
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
|
||||||
@@ -53,7 +52,6 @@
|
|||||||
718BC7DCCFC5C370705C12E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
718BC7DCCFC5C370705C12E5 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||||
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||||
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = FlutterGeneratedPluginSwiftPackage; path = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage; sourceTree = "<group>"; };
|
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
|
||||||
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
|
||||||
@@ -69,7 +67,6 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
78A318202AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage in Frameworks */,
|
|
||||||
9A698254711B63C3940A64CB /* libPods-Runner.a in Frameworks */,
|
9A698254711B63C3940A64CB /* libPods-Runner.a in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -88,7 +85,6 @@
|
|||||||
9740EEB11CF90186004384FC /* Flutter */ = {
|
9740EEB11CF90186004384FC /* Flutter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
78E0A7A72DC9AD7400C4905E /* FlutterGeneratedPluginSwiftPackage */,
|
|
||||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
|
||||||
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
9740EEB21CF90195004384FC /* Debug.xcconfig */,
|
||||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
|
||||||
@@ -184,15 +180,13 @@
|
|||||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||||
F0D7F2413C6E4B7A9B1C2D3E /* Fix Native Asset Minimum OS */,
|
F0D7F2413C6E4B7A9B1C2D3E /* Fix Native Asset Minimum OS */,
|
||||||
|
B788CEDB957A87EE8AC593BB /* [CP] Copy Pods Resources */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
);
|
);
|
||||||
name = Runner;
|
name = Runner;
|
||||||
packageProductDependencies = (
|
|
||||||
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */,
|
|
||||||
);
|
|
||||||
productName = Runner;
|
productName = Runner;
|
||||||
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
@@ -226,9 +220,6 @@
|
|||||||
Base,
|
Base,
|
||||||
);
|
);
|
||||||
mainGroup = 97C146E51CF9000F007C117D;
|
mainGroup = 97C146E51CF9000F007C117D;
|
||||||
packageReferences = (
|
|
||||||
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */,
|
|
||||||
);
|
|
||||||
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
@@ -292,6 +283,39 @@
|
|||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
|
||||||
};
|
};
|
||||||
|
B788CEDB957A87EE8AC593BB /* [CP] Copy Pods Resources */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Copy Pods Resources";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
F0D7F2413C6E4B7A9B1C2D3E /* Fix Native Asset Minimum OS */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
alwaysOutOfDate = 1;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}",
|
||||||
|
);
|
||||||
|
name = "Fix Native Asset Minimum OS";
|
||||||
|
outputPaths = (
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "set -e\nFRAMEWORKS_DIR=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nMIN_OS=\"${IPHONEOS_DEPLOYMENT_TARGET}\"\nif [ ! -d \"$FRAMEWORKS_DIR\" ] || [ -z \"$MIN_OS\" ]; then\n exit 0\nfi\nfind \"$FRAMEWORKS_DIR\" -maxdepth 2 -name Info.plist | while read -r plist; do\n bundle_id=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' \"$plist\" 2>/dev/null || true)\n case \"$bundle_id\" in\n io.flutter.flutter.native-assets.*)\n /usr/libexec/PlistBuddy -c \"Set :MinimumOSVersion $MIN_OS\" \"$plist\" 2>/dev/null || \\\n /usr/libexec/PlistBuddy -c \"Add :MinimumOSVersion string $MIN_OS\" \"$plist\"\n ;;\n esac\ndone\n";
|
||||||
|
};
|
||||||
DE3B2E091393835C0B38492E /* [CP] Check Pods Manifest.lock */ = {
|
DE3B2E091393835C0B38492E /* [CP] Check Pods Manifest.lock */ = {
|
||||||
isa = PBXShellScriptBuildPhase;
|
isa = PBXShellScriptBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
@@ -314,22 +338,6 @@
|
|||||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
showEnvVarsInLog = 0;
|
showEnvVarsInLog = 0;
|
||||||
};
|
};
|
||||||
F0D7F2413C6E4B7A9B1C2D3E /* Fix Native Asset Minimum OS */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
alwaysOutOfDate = 1;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}",
|
|
||||||
);
|
|
||||||
name = "Fix Native Asset Minimum OS";
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "set -e\nFRAMEWORKS_DIR=\"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}\"\nMIN_OS=\"${IPHONEOS_DEPLOYMENT_TARGET}\"\nif [ ! -d \"$FRAMEWORKS_DIR\" ] || [ -z \"$MIN_OS\" ]; then\n exit 0\nfi\nfind \"$FRAMEWORKS_DIR\" -maxdepth 2 -name Info.plist | while read -r plist; do\n bundle_id=$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' \"$plist\" 2>/dev/null || true)\n case \"$bundle_id\" in\n io.flutter.flutter.native-assets.*)\n /usr/libexec/PlistBuddy -c \"Set :MinimumOSVersion $MIN_OS\" \"$plist\" 2>/dev/null || \\\n /usr/libexec/PlistBuddy -c \"Add :MinimumOSVersion string $MIN_OS\" \"$plist\"\n ;;\n esac\ndone\n";
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
@@ -438,9 +446,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
DEVELOPMENT_TEAM = X74VJ4UAST;
|
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -619,9 +625,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
DEVELOPMENT_TEAM = X74VJ4UAST;
|
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -643,9 +647,7 @@
|
|||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
|
||||||
DEVELOPMENT_TEAM = X74VJ4UAST;
|
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
INFOPLIST_FILE = Runner/Info.plist;
|
INFOPLIST_FILE = Runner/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
@@ -694,20 +696,6 @@
|
|||||||
defaultConfigurationName = Release;
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
|
|
||||||
/* Begin XCLocalSwiftPackageReference section */
|
|
||||||
781AD8BC2B33823900A9FFBB /* XCLocalSwiftPackageReference "FlutterGeneratedPluginSwiftPackage" */ = {
|
|
||||||
isa = XCLocalSwiftPackageReference;
|
|
||||||
relativePath = Flutter/ephemeral/Packages/FlutterGeneratedPluginSwiftPackage;
|
|
||||||
};
|
|
||||||
/* End XCLocalSwiftPackageReference section */
|
|
||||||
|
|
||||||
/* Begin XCSwiftPackageProductDependency section */
|
|
||||||
78A3181F2AECB46A00862997 /* FlutterGeneratedPluginSwiftPackage */ = {
|
|
||||||
isa = XCSwiftPackageProductDependency;
|
|
||||||
productName = FlutterGeneratedPluginSwiftPackage;
|
|
||||||
};
|
|
||||||
/* End XCSwiftPackageProductDependency section */
|
|
||||||
};
|
};
|
||||||
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
rootObject = 97C146E61CF9000F007C117D /* Project object */;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,24 +5,6 @@
|
|||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "YES"
|
parallelizeBuildables = "YES"
|
||||||
buildImplicitDependencies = "YES">
|
buildImplicitDependencies = "YES">
|
||||||
<PreActions>
|
|
||||||
<ExecutionAction
|
|
||||||
ActionType = "Xcode.IDEStandardExecutionActionsCore.ExecutionActionType.ShellScriptAction">
|
|
||||||
<ActionContent
|
|
||||||
title = "Run Prepare Flutter Framework Script"
|
|
||||||
scriptText = "/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" prepare ">
|
|
||||||
<EnvironmentBuildable>
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
|
|
||||||
BuildableName = "Runner.app"
|
|
||||||
BlueprintName = "Runner"
|
|
||||||
ReferencedContainer = "container:Runner.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</EnvironmentBuildable>
|
|
||||||
</ActionContent>
|
|
||||||
</ExecutionAction>
|
|
||||||
</PreActions>
|
|
||||||
<BuildActionEntries>
|
<BuildActionEntries>
|
||||||
<BuildActionEntry
|
<BuildActionEntry
|
||||||
buildForTesting = "YES"
|
buildForTesting = "YES"
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ class MeshCoreUsbManager {
|
|||||||
String? get activePortKey => _activePortKey;
|
String? get activePortKey => _activePortKey;
|
||||||
String? get activePortDisplayLabel => _activePortLabel ?? _activePortKey;
|
String? get activePortDisplayLabel => _activePortLabel ?? _activePortKey;
|
||||||
bool get isConnected => _service.isConnected;
|
bool get isConnected => _service.isConnected;
|
||||||
Object? get lastError => _service.lastError;
|
|
||||||
Stream<Uint8List> get frameStream => _service.frameStream;
|
Stream<Uint8List> get frameStream => _service.frameStream;
|
||||||
|
|
||||||
// --- Configuration ---
|
// --- Configuration ---
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:crypto/crypto.dart' as crypto;
|
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
// Buffer Reader - sequential binary data reader with pointer tracking
|
// Buffer Reader - sequential binary data reader with pointer tracking
|
||||||
@@ -207,8 +206,6 @@ const int cmdSendTelemetryReq = 39;
|
|||||||
const int cmdGetCustomVar = 40;
|
const int cmdGetCustomVar = 40;
|
||||||
const int cmdSetCustomVar = 41;
|
const int cmdSetCustomVar = 41;
|
||||||
const int cmdSendBinaryReq = 50;
|
const int cmdSendBinaryReq = 50;
|
||||||
const int cmdSetFloodScope = 54;
|
|
||||||
const int cmdSendControlData = 55;
|
|
||||||
const int cmdGetStats = 56;
|
const int cmdGetStats = 56;
|
||||||
const int cmdSendAnonReq = 57;
|
const int cmdSendAnonReq = 57;
|
||||||
const int cmdSetAutoAddConfig = 58;
|
const int cmdSetAutoAddConfig = 58;
|
||||||
@@ -227,18 +224,6 @@ const int reqTypeGetTelemetry = 0x03;
|
|||||||
const int reqTypeGetAccessList = 0x05;
|
const int reqTypeGetAccessList = 0x05;
|
||||||
const int reqTypeGetNeighbors = 0x06;
|
const int reqTypeGetNeighbors = 0x06;
|
||||||
|
|
||||||
Uint8List buildTelemetryBinaryPayload() {
|
|
||||||
// Room servers/repeaters read byte 1 as an inverse telemetry permission mask.
|
|
||||||
// Zero means "request every telemetry field allowed for this contact".
|
|
||||||
return Uint8List.fromList([reqTypeGetTelemetry, 0x00, 0x00, 0x00, 0x00]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const int anonReqTypeRegions = 0x01;
|
|
||||||
|
|
||||||
// Control data sub-types used by MeshCore discovery packets.
|
|
||||||
const int controlSubtypeDiscoverReq = 0x08;
|
|
||||||
const int controlSubtypeDiscoverResp = 0x09;
|
|
||||||
|
|
||||||
// Repeater response codes
|
// Repeater response codes
|
||||||
const int respServerLoginOk = 0;
|
const int respServerLoginOk = 0;
|
||||||
|
|
||||||
@@ -281,7 +266,6 @@ const int pushCodeTraceData = 0x89;
|
|||||||
const int pushCodeNewAdvert = 0x8A;
|
const int pushCodeNewAdvert = 0x8A;
|
||||||
const int pushCodeTelemetryResponse = 0x8B;
|
const int pushCodeTelemetryResponse = 0x8B;
|
||||||
const int pushCodeBinaryResponse = 0x8C;
|
const int pushCodeBinaryResponse = 0x8C;
|
||||||
const int pushCodeControlData = 0x8E;
|
|
||||||
|
|
||||||
// Contact/advertisement types
|
// Contact/advertisement types
|
||||||
const int advTypeChat = 1;
|
const int advTypeChat = 1;
|
||||||
@@ -467,13 +451,8 @@ String pubKeyToHex(Uint8List pubKey) {
|
|||||||
|
|
||||||
// Helper to convert hex string to public key
|
// Helper to convert hex string to public key
|
||||||
Uint8List hexToPubKey(String hex) {
|
Uint8List hexToPubKey(String hex) {
|
||||||
if (hex.length != pubKeySize * 2) {
|
|
||||||
throw FormatException(
|
|
||||||
'Public key hex must be ${pubKeySize * 2} chars, got ${hex.length}',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
final result = Uint8List(pubKeySize);
|
final result = Uint8List(pubKeySize);
|
||||||
for (int i = 0; i < pubKeySize; i++) {
|
for (int i = 0; i < pubKeySize && i * 2 + 1 < hex.length; i++) {
|
||||||
result[i] = int.parse(hex.substring(i * 2, i * 2 + 2), radix: 16);
|
result[i] = int.parse(hex.substring(i * 2, i * 2 + 2), radix: 16);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@@ -587,9 +566,9 @@ Uint8List buildGetStatsFrame(int statsType) {
|
|||||||
return Uint8List.fromList([cmdGetStats, statsType & 0xFF]);
|
return Uint8List.fromList([cmdGetStats, statsType & 0xFF]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Path hash width on air: [61][0][mode], mode 0..3 → (mode+1) bytes per hop hash.
|
/// Path hash width on air: [61][0][mode], mode 0..2 → (mode+1) bytes per hop hash.
|
||||||
Uint8List buildSetPathHashModeFrame(int mode) {
|
Uint8List buildSetPathHashModeFrame(int mode) {
|
||||||
final m = mode.clamp(0, 3).toInt();
|
final m = mode.clamp(0, 2);
|
||||||
return Uint8List.fromList([cmdSetPathHashMode, 0, m]);
|
return Uint8List.fromList([cmdSetPathHashMode, 0, m]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -876,67 +855,6 @@ Uint8List buildSendBinaryReq(Uint8List repeaterPubKey, {Uint8List? payload}) {
|
|||||||
return writer.toBytes();
|
return writer.toBytes();
|
||||||
}
|
}
|
||||||
|
|
||||||
Uint8List buildSendControlDataFrame(Uint8List payload) {
|
|
||||||
final writer = BufferWriter();
|
|
||||||
writer.writeByte(cmdSendControlData);
|
|
||||||
writer.writeBytes(payload);
|
|
||||||
return writer.toBytes();
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint8List buildDiscoveryRequestPayload(
|
|
||||||
int tag, {
|
|
||||||
bool prefixOnly = false,
|
|
||||||
int typeMask = 1 << advTypeRepeater,
|
|
||||||
}) {
|
|
||||||
final writer = BufferWriter();
|
|
||||||
// The high bit must be set for CMD_SEND_CONTROL_DATA; DISCOVER_REQ uses
|
|
||||||
// subtype 0x8, with the low bit selecting short/full public keys in replies.
|
|
||||||
writer.writeByte(
|
|
||||||
(controlSubtypeDiscoverReq << 4) | (prefixOnly ? 0x01 : 0x00),
|
|
||||||
);
|
|
||||||
writer.writeByte(typeMask);
|
|
||||||
writer.writeUInt32LE(tag);
|
|
||||||
writer.writeUInt32LE(0); // since=0 asks nearby nodes for any recent advert.
|
|
||||||
return writer.toBytes();
|
|
||||||
}
|
|
||||||
|
|
||||||
Uint8List _reversePathByHop(Uint8List path, int pathHashWidth) {
|
|
||||||
if (path.isEmpty) return Uint8List(0);
|
|
||||||
final width = pathHashWidth.clamp(1, 4).toInt();
|
|
||||||
if (path.length % width != 0) {
|
|
||||||
return Uint8List.fromList(path.reversed.toList());
|
|
||||||
}
|
|
||||||
|
|
||||||
final reversed = Uint8List(path.length);
|
|
||||||
final hops = path.length ~/ width;
|
|
||||||
for (var i = 0; i < hops; i++) {
|
|
||||||
final from = (hops - 1 - i) * width;
|
|
||||||
reversed.setRange(i * width, (i + 1) * width, path, from);
|
|
||||||
}
|
|
||||||
return reversed;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Build CMD_SEND_ANON_REQ frame.
|
|
||||||
// Payload format for regions: [anon_req_type][reply_path_len][reply_path...].
|
|
||||||
Uint8List buildSendAnonReqFrame(
|
|
||||||
Uint8List repeaterPubKey, {
|
|
||||||
required int requestType,
|
|
||||||
Uint8List? replyPath,
|
|
||||||
int replyHopCount = 0,
|
|
||||||
int pathHashWidth = pathHashSize,
|
|
||||||
}) {
|
|
||||||
final width = pathHashWidth.clamp(1, 4).toInt();
|
|
||||||
final path = replyPath ?? Uint8List(0);
|
|
||||||
final encodedPathLen = ((width - 1) << 6) | (replyHopCount & 0x3F);
|
|
||||||
final writer = BufferWriter();
|
|
||||||
writer.writeByte(cmdSendAnonReq);
|
|
||||||
writer.writeBytes(repeaterPubKey);
|
|
||||||
writer.writeByte(requestType);
|
|
||||||
writer.writeByte(encodedPathLen);
|
|
||||||
writer.writeBytes(_reversePathByHop(path, width));
|
|
||||||
return writer.toBytes();
|
|
||||||
}
|
|
||||||
|
|
||||||
//Build a trace request frame
|
//Build a trace request frame
|
||||||
//[cmd][tag x4][auth x4][flag][payload]
|
//[cmd][tag x4][auth x4][flag][payload]
|
||||||
Uint8List buildTraceReq(int tag, int auth, int flag, {Uint8List? payload}) {
|
Uint8List buildTraceReq(int tag, int auth, int flag, {Uint8List? payload}) {
|
||||||
@@ -1027,22 +945,7 @@ Uint8List buildSendTelemetryReq(Uint8List? pubKey) {
|
|||||||
writer.writeBytes(Uint8List(3)); // reserved bytes
|
writer.writeBytes(Uint8List(3)); // reserved bytes
|
||||||
writer.writeBytes(pubKey);
|
writer.writeBytes(pubKey);
|
||||||
} else {
|
} else {
|
||||||
writer.writeBytes(Uint8List(3)); // reserved bytes
|
writer.writeBytes(Uint8List(4)); // reserved bytes
|
||||||
}
|
}
|
||||||
return writer.toBytes();
|
return writer.toBytes();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Build CMD_SET_FLOOD_SCOPE
|
|
||||||
// Format: [cmd][scope]
|
|
||||||
Uint8List buildSetFloodScopeFrame(String region) {
|
|
||||||
if (region == '') {
|
|
||||||
// reset scope
|
|
||||||
return Uint8List.fromList([cmdSetFloodScope, 0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
final name = region.startsWith('#') ? region : '#$region';
|
|
||||||
final hash = crypto.sha256.convert(utf8.encode(name)).bytes;
|
|
||||||
final scope = Uint8List.fromList(hash.sublist(0, 16));
|
|
||||||
|
|
||||||
return Uint8List.fromList([cmdSetFloodScope, 0, ...scope]);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -3,10 +3,6 @@ class MeshCoreUuids {
|
|||||||
static const String rxCharacteristic = "6e400002-b5a3-f393-e0a9-e50e24dcca9e";
|
static const String rxCharacteristic = "6e400002-b5a3-f393-e0a9-e50e24dcca9e";
|
||||||
static const String txCharacteristic = "6e400003-b5a3-f393-e0a9-e50e24dcca9e";
|
static const String txCharacteristic = "6e400003-b5a3-f393-e0a9-e50e24dcca9e";
|
||||||
|
|
||||||
/// Known advertised-name prefixes used by stock MeshCore firmware builds.
|
|
||||||
/// Discovery no longer filters on these (it filters on the [service] UUID so
|
|
||||||
/// that community forks with custom names are still found); kept for
|
|
||||||
/// reference and possible future display heuristics.
|
|
||||||
static const List<String> deviceNamePrefixes = [
|
static const List<String> deviceNamePrefixes = [
|
||||||
"MeshCore-",
|
"MeshCore-",
|
||||||
"Whisper-",
|
"Whisper-",
|
||||||
|
|||||||
@@ -96,34 +96,6 @@ class CayenneLpp {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case lppDigitalInput:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readUInt8(),
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppDigitalOutput:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readUInt8(),
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppAnalogInput:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readInt16BE() / 100,
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppAnalogOutput:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readInt16BE() / 100,
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppGenericSensor:
|
case lppGenericSensor:
|
||||||
telemetry.add({
|
telemetry.add({
|
||||||
'channel': channel,
|
'channel': channel,
|
||||||
@@ -159,17 +131,6 @@ class CayenneLpp {
|
|||||||
'value': buffer.readUInt8() / 2,
|
'value': buffer.readUInt8() / 2,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case lppAccelerometer:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': {
|
|
||||||
'x': buffer.readInt16BE() / 1000,
|
|
||||||
'y': buffer.readInt16BE() / 1000,
|
|
||||||
'z': buffer.readInt16BE() / 1000,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppBarometricPressure:
|
case lppBarometricPressure:
|
||||||
telemetry.add({
|
telemetry.add({
|
||||||
'channel': channel,
|
'channel': channel,
|
||||||
@@ -177,13 +138,6 @@ class CayenneLpp {
|
|||||||
'value': buffer.readUInt16BE() / 10,
|
'value': buffer.readUInt16BE() / 10,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case lppAltitude:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readInt16BE(),
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppVoltage:
|
case lppVoltage:
|
||||||
telemetry.add({
|
telemetry.add({
|
||||||
'channel': channel,
|
'channel': channel,
|
||||||
@@ -198,13 +152,6 @@ class CayenneLpp {
|
|||||||
'value': buffer.readInt16BE() / 1000,
|
'value': buffer.readInt16BE() / 1000,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case lppFrequency:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readUInt32BE(),
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppPercentage:
|
case lppPercentage:
|
||||||
telemetry.add({
|
telemetry.add({
|
||||||
'channel': channel,
|
'channel': channel,
|
||||||
@@ -226,56 +173,6 @@ class CayenneLpp {
|
|||||||
'value': buffer.readUInt16BE(),
|
'value': buffer.readUInt16BE(),
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case lppDistance:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readUInt32BE() / 1000,
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppEnergy:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readUInt32BE() / 1000,
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppDirection:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readUInt16BE(),
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppUnixTime:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readUInt32BE(),
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppGyrometer:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': {
|
|
||||||
'x': buffer.readInt16BE() / 100,
|
|
||||||
'y': buffer.readInt16BE() / 100,
|
|
||||||
'z': buffer.readInt16BE() / 100,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppColour:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': {
|
|
||||||
'red': buffer.readUInt8(),
|
|
||||||
'green': buffer.readUInt8(),
|
|
||||||
'blue': buffer.readUInt8(),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppGps:
|
case lppGps:
|
||||||
telemetry.add({
|
telemetry.add({
|
||||||
'channel': channel,
|
'channel': channel,
|
||||||
@@ -287,24 +184,6 @@ class CayenneLpp {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
case lppSwitch:
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': buffer.readUInt8(),
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
case lppPolyline:
|
|
||||||
final size = buffer.readUInt8();
|
|
||||||
telemetry.add({
|
|
||||||
'channel': channel,
|
|
||||||
'type': type,
|
|
||||||
'value': {
|
|
||||||
'size': size,
|
|
||||||
'data': _bytesToHex(_readPolylinePayload(buffer, size)),
|
|
||||||
},
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
return telemetry;
|
return telemetry;
|
||||||
}
|
}
|
||||||
@@ -337,19 +216,6 @@ class CayenneLpp {
|
|||||||
);
|
);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case lppDigitalInput:
|
|
||||||
channelData['values']['digitalInput'] = buffer.readUInt8();
|
|
||||||
break;
|
|
||||||
case lppDigitalOutput:
|
|
||||||
channelData['values']['digitalOutput'] = buffer.readUInt8();
|
|
||||||
break;
|
|
||||||
case lppAnalogInput:
|
|
||||||
channelData['values']['analogInput'] = buffer.readInt16BE() / 100.0;
|
|
||||||
break;
|
|
||||||
case lppAnalogOutput:
|
|
||||||
channelData['values']['analogOutput'] =
|
|
||||||
buffer.readInt16BE() / 100.0;
|
|
||||||
break;
|
|
||||||
case lppGenericSensor:
|
case lppGenericSensor:
|
||||||
channelData['values']['generic'] = buffer.readUInt32BE();
|
channelData['values']['generic'] = buffer.readUInt32BE();
|
||||||
break;
|
break;
|
||||||
@@ -365,29 +231,15 @@ class CayenneLpp {
|
|||||||
case lppRelativeHumidity:
|
case lppRelativeHumidity:
|
||||||
channelData['values']['humidity'] = buffer.readUInt8() / 2.0;
|
channelData['values']['humidity'] = buffer.readUInt8() / 2.0;
|
||||||
break;
|
break;
|
||||||
case lppAccelerometer:
|
|
||||||
channelData['values']['accelerometer'] = {
|
|
||||||
'x': buffer.readInt16BE() / 1000.0,
|
|
||||||
'y': buffer.readInt16BE() / 1000.0,
|
|
||||||
'z': buffer.readInt16BE() / 1000.0,
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case lppBarometricPressure:
|
case lppBarometricPressure:
|
||||||
channelData['values']['pressure'] = buffer.readUInt16BE() / 10.0;
|
channelData['values']['pressure'] = buffer.readUInt16BE() / 10.0;
|
||||||
break;
|
break;
|
||||||
case lppAltitude:
|
|
||||||
// MeshCore encodes standalone barometric altitude as LPP type 121.
|
|
||||||
channelData['values']['altitude'] = buffer.readInt16BE();
|
|
||||||
break;
|
|
||||||
case lppVoltage:
|
case lppVoltage:
|
||||||
channelData['values']['voltage'] = buffer.readInt16BE() / 100.0;
|
channelData['values']['voltage'] = buffer.readInt16BE() / 100.0;
|
||||||
break;
|
break;
|
||||||
case lppCurrent:
|
case lppCurrent:
|
||||||
channelData['values']['current'] = buffer.readInt16BE() / 1000.0;
|
channelData['values']['current'] = buffer.readInt16BE() / 1000.0;
|
||||||
break;
|
break;
|
||||||
case lppFrequency:
|
|
||||||
channelData['values']['frequency'] = buffer.readUInt32BE();
|
|
||||||
break;
|
|
||||||
case lppPercentage:
|
case lppPercentage:
|
||||||
channelData['values']['percentage'] = buffer.readUInt8();
|
channelData['values']['percentage'] = buffer.readUInt8();
|
||||||
break;
|
break;
|
||||||
@@ -397,32 +249,6 @@ class CayenneLpp {
|
|||||||
case lppPower:
|
case lppPower:
|
||||||
channelData['values']['power'] = buffer.readUInt16BE();
|
channelData['values']['power'] = buffer.readUInt16BE();
|
||||||
break;
|
break;
|
||||||
case lppDistance:
|
|
||||||
channelData['values']['distance'] = buffer.readUInt32BE() / 1000.0;
|
|
||||||
break;
|
|
||||||
case lppEnergy:
|
|
||||||
channelData['values']['energy'] = buffer.readUInt32BE() / 1000.0;
|
|
||||||
break;
|
|
||||||
case lppDirection:
|
|
||||||
channelData['values']['direction'] = buffer.readUInt16BE();
|
|
||||||
break;
|
|
||||||
case lppUnixTime:
|
|
||||||
channelData['values']['time'] = buffer.readUInt32BE();
|
|
||||||
break;
|
|
||||||
case lppGyrometer:
|
|
||||||
channelData['values']['gyrometer'] = {
|
|
||||||
'x': buffer.readInt16BE() / 100.0,
|
|
||||||
'y': buffer.readInt16BE() / 100.0,
|
|
||||||
'z': buffer.readInt16BE() / 100.0,
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case lppColour:
|
|
||||||
channelData['values']['colour'] = {
|
|
||||||
'red': buffer.readUInt8(),
|
|
||||||
'green': buffer.readUInt8(),
|
|
||||||
'blue': buffer.readUInt8(),
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
case lppGps:
|
case lppGps:
|
||||||
channelData['values']['gps'] = {
|
channelData['values']['gps'] = {
|
||||||
'latitude': buffer.readInt24BE() / 10000.0,
|
'latitude': buffer.readInt24BE() / 10000.0,
|
||||||
@@ -430,48 +256,22 @@ class CayenneLpp {
|
|||||||
'altitude': buffer.readInt24BE() / 100.0,
|
'altitude': buffer.readInt24BE() / 100.0,
|
||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
case lppSwitch:
|
// Add more types as needed...
|
||||||
channelData['values']['switch'] = buffer.readUInt8() != 0;
|
|
||||||
break;
|
|
||||||
case lppPolyline:
|
|
||||||
final size = buffer.readUInt8();
|
|
||||||
channelData['values']['polyline'] = {
|
|
||||||
'size': size,
|
|
||||||
'data': _bytesToHex(_readPolylinePayload(buffer, size)),
|
|
||||||
};
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
// Stop parsing to avoid losing alignment on an unknown LPP type.
|
//Stopped parsing to avoid misalignment
|
||||||
return _sortedChannelValues(channels);
|
return channels.values.toList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return _sortedChannelValues(channels);
|
final List<Map<String, dynamic>> channelsOut = channels.values.toList();
|
||||||
|
channelsOut.sort((a, b) => a['channel'].compareTo(b['channel']));
|
||||||
|
return channelsOut;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
// Handle parsing errors, possibly due to malformed data
|
// Handle parsing errors, possibly due to malformed data
|
||||||
appLogger.error('Error parsing Cayenne LPP data: $e');
|
appLogger.error('Error parsing Cayenne LPP data: $e');
|
||||||
// Preserve any fields parsed before the malformed value.
|
return <
|
||||||
return _sortedChannelValues(channels);
|
Map<String, dynamic>
|
||||||
|
>[]; // Return an empty list on error to avoid crashing the app
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Uint8List _readPolylinePayload(BufferReader buffer, int size) {
|
|
||||||
final declaredPayloadSize = size > 0 ? size - 1 : 0;
|
|
||||||
final availablePayloadSize = declaredPayloadSize <= buffer.remaining
|
|
||||||
? declaredPayloadSize
|
|
||||||
: buffer.remaining;
|
|
||||||
return buffer.readBytes(availablePayloadSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
static List<Map<String, dynamic>> _sortedChannelValues(
|
|
||||||
Map<int, Map<String, dynamic>> channels,
|
|
||||||
) {
|
|
||||||
final channelsOut = channels.values.toList();
|
|
||||||
channelsOut.sort((a, b) => a['channel'].compareTo(b['channel']));
|
|
||||||
return channelsOut;
|
|
||||||
}
|
|
||||||
|
|
||||||
static String _bytesToHex(Uint8List bytes) {
|
|
||||||
return bytes.map((b) => b.toRadixString(16).padLeft(2, '0')).join();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,59 +0,0 @@
|
|||||||
import 'package:flutter/material.dart';
|
|
||||||
|
|
||||||
import '../connector/meshcore_protocol.dart';
|
|
||||||
import '../utils/emoji_utils.dart';
|
|
||||||
|
|
||||||
IconData contactTypeIcon(int type) {
|
|
||||||
switch (type) {
|
|
||||||
case advTypeChat:
|
|
||||||
return Icons.chat;
|
|
||||||
case advTypeRepeater:
|
|
||||||
return Icons.cell_tower;
|
|
||||||
case advTypeRoom:
|
|
||||||
return Icons.group;
|
|
||||||
case advTypeSensor:
|
|
||||||
return Icons.sensors;
|
|
||||||
default:
|
|
||||||
return Icons.device_unknown;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Color contactTypeColor(int type) {
|
|
||||||
switch (type) {
|
|
||||||
case advTypeChat:
|
|
||||||
return Colors.blue;
|
|
||||||
case advTypeRepeater:
|
|
||||||
return Colors.orange;
|
|
||||||
case advTypeRoom:
|
|
||||||
return Colors.purple;
|
|
||||||
case advTypeSensor:
|
|
||||||
return Colors.green;
|
|
||||||
default:
|
|
||||||
return Colors.grey;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Color colorForName(String name) {
|
|
||||||
const colors = [
|
|
||||||
Colors.blue,
|
|
||||||
Colors.green,
|
|
||||||
Colors.orange,
|
|
||||||
Colors.purple,
|
|
||||||
Colors.pink,
|
|
||||||
Colors.teal,
|
|
||||||
Colors.indigo,
|
|
||||||
Colors.cyan,
|
|
||||||
Colors.amber,
|
|
||||||
Colors.deepOrange,
|
|
||||||
];
|
|
||||||
return colors[name.hashCode.abs() % colors.length];
|
|
||||||
}
|
|
||||||
|
|
||||||
String firstCharacterOrEmoji(String name) {
|
|
||||||
if (name.isEmpty) return '?';
|
|
||||||
final emoji = firstEmoji(name);
|
|
||||||
if (emoji != null) return emoji;
|
|
||||||
final runes = name.runes.toList();
|
|
||||||
if (runes.isEmpty) return '?';
|
|
||||||
return String.fromCharCode(runes[0]).toUpperCase();
|
|
||||||
}
|
|
||||||
@@ -1,4 +1,3 @@
|
|||||||
import 'package:flutter/gestures.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_linkify/flutter_linkify.dart';
|
import 'package:flutter_linkify/flutter_linkify.dart';
|
||||||
import 'package:url_launcher/url_launcher.dart';
|
import 'package:url_launcher/url_launcher.dart';
|
||||||
@@ -21,7 +20,6 @@ class LinkHandler {
|
|||||||
required String text,
|
required String text,
|
||||||
required TextStyle style,
|
required TextStyle style,
|
||||||
TextStyle? linkStyle,
|
TextStyle? linkStyle,
|
||||||
VoidCallback? onSecondaryTap,
|
|
||||||
}) {
|
}) {
|
||||||
final effectiveLinkStyle = linkStyle ?? defaultLinkStyle(context, style);
|
final effectiveLinkStyle = linkStyle ?? defaultLinkStyle(context, style);
|
||||||
const options = LinkifyOptions(humanize: false, defaultToHttps: false);
|
const options = LinkifyOptions(humanize: false, defaultToHttps: false);
|
||||||
@@ -29,7 +27,7 @@ class LinkHandler {
|
|||||||
void onOpen(LinkableElement link) => handleLinkTap(context, link.url);
|
void onOpen(LinkableElement link) => handleLinkTap(context, link.url);
|
||||||
|
|
||||||
if (PlatformInfo.isDesktop) {
|
if (PlatformInfo.isDesktop) {
|
||||||
final linkify = SelectableLinkify(
|
return SelectableLinkify(
|
||||||
text: text,
|
text: text,
|
||||||
style: style,
|
style: style,
|
||||||
linkStyle: effectiveLinkStyle,
|
linkStyle: effectiveLinkStyle,
|
||||||
@@ -37,14 +35,6 @@ class LinkHandler {
|
|||||||
linkifiers: linkifiers,
|
linkifiers: linkifiers,
|
||||||
onOpen: onOpen,
|
onOpen: onOpen,
|
||||||
);
|
);
|
||||||
if (onSecondaryTap == null) return linkify;
|
|
||||||
return Listener(
|
|
||||||
onPointerDown: (event) {
|
|
||||||
if (event.buttons & kSecondaryMouseButton != 0) onSecondaryTap();
|
|
||||||
},
|
|
||||||
behavior: HitTestBehavior.translucent,
|
|
||||||
child: linkify,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
return Linkify(
|
return Linkify(
|
||||||
text: text,
|
text: text,
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
|
||||||
|
|
||||||
import '../connector/meshcore_protocol.dart';
|
|
||||||
import '../models/contact.dart';
|
import '../models/contact.dart';
|
||||||
|
import '../connector/meshcore_protocol.dart';
|
||||||
|
|
||||||
class PathHelper {
|
class PathHelper {
|
||||||
static String formatPathHex(List<int> pathBytes) {
|
static String formatPathHex(List<int> pathBytes) {
|
||||||
@@ -10,82 +8,24 @@ class PathHelper {
|
|||||||
.join(',');
|
.join(',');
|
||||||
}
|
}
|
||||||
|
|
||||||
static String hopHex(int byte) {
|
|
||||||
return byte.toRadixString(16).padLeft(2, '0').toUpperCase();
|
|
||||||
}
|
|
||||||
|
|
||||||
static String formatHopHex(List<int> hopBytes) {
|
|
||||||
return hopBytes
|
|
||||||
.map((b) => b.toRadixString(16).padLeft(2, '0').toUpperCase())
|
|
||||||
.join();
|
|
||||||
}
|
|
||||||
|
|
||||||
static String? hopName(int byte, List<Contact> allContacts) {
|
|
||||||
final matches = allContacts
|
|
||||||
.where(
|
|
||||||
(c) =>
|
|
||||||
c.publicKey.isNotEmpty &&
|
|
||||||
c.publicKey.first == byte &&
|
|
||||||
(c.type == advTypeRepeater || c.type == advTypeRoom),
|
|
||||||
)
|
|
||||||
.toList();
|
|
||||||
if (matches.isEmpty) return null;
|
|
||||||
if (matches.length == 1) return matches.first.name;
|
|
||||||
return matches.map((c) => c.name).join(' | ');
|
|
||||||
}
|
|
||||||
|
|
||||||
static List<Uint8List> splitPathBytes(
|
|
||||||
List<int> pathBytes,
|
|
||||||
int hashByteWidth,
|
|
||||||
) {
|
|
||||||
if (pathBytes.isEmpty) return const [];
|
|
||||||
|
|
||||||
final width = hashByteWidth.clamp(1, 4).toInt();
|
|
||||||
final hops = <Uint8List>[];
|
|
||||||
for (int i = 0; i < pathBytes.length; i += width) {
|
|
||||||
final endIdx = (i + width).clamp(0, pathBytes.length).toInt();
|
|
||||||
final hopBytes = pathBytes.sublist(i, endIdx);
|
|
||||||
if (hopBytes.isNotEmpty) {
|
|
||||||
hops.add(Uint8List.fromList(hopBytes));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return hops;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Resolves path bytes to contact names, supporting multi-byte hash widths.
|
|
||||||
///
|
|
||||||
/// Groups path bytes according to [hashByteWidth]:
|
|
||||||
/// - 1: Single byte per hop (256 unique nodes)
|
|
||||||
/// - 2: Two bytes per hop (65K unique nodes)
|
|
||||||
/// - 3: Three bytes per hop (16M unique nodes)
|
|
||||||
/// - 4: Four bytes per hop (4.3G unique nodes)
|
|
||||||
static String resolvePathNames(
|
static String resolvePathNames(
|
||||||
List<int> pathBytes,
|
List<int> pathBytes,
|
||||||
List<Contact> allContacts,
|
List<Contact> allContacts,
|
||||||
int hashByteWidth,
|
|
||||||
) {
|
) {
|
||||||
if (pathBytes.isEmpty) return '';
|
return pathBytes
|
||||||
|
.map((b) {
|
||||||
final parts = <String>[];
|
final hex = b.toRadixString(16).padLeft(2, '0').toUpperCase();
|
||||||
|
final matches = allContacts
|
||||||
for (final hopBytes in splitPathBytes(pathBytes, hashByteWidth)) {
|
.where(
|
||||||
final hex = formatHopHex(hopBytes);
|
(c) =>
|
||||||
|
c.publicKey.first == b &&
|
||||||
final matches = allContacts.where((c) {
|
(c.type == advTypeRepeater || c.type == advTypeRoom),
|
||||||
if (c.publicKey.length < hopBytes.length) return false;
|
)
|
||||||
if (c.type != advTypeRepeater && c.type != advTypeRoom) return false;
|
.toList();
|
||||||
return listEquals(c.publicKey.sublist(0, hopBytes.length), hopBytes);
|
if (matches.isEmpty) return hex;
|
||||||
}).toList();
|
if (matches.length == 1) return matches.first.name;
|
||||||
|
return matches.map((c) => c.name).join(' | ');
|
||||||
if (matches.isEmpty) {
|
})
|
||||||
parts.add(hex);
|
.join(' \u2192 ');
|
||||||
} else if (matches.length == 1) {
|
|
||||||
parts.add(matches.first.name);
|
|
||||||
} else {
|
|
||||||
parts.add(matches.map((c) => c.name).join(' | '));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return parts.join(' \u2192 ');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
import 'package:latlong2/latlong.dart';
|
|
||||||
|
|
||||||
import '../connector/meshcore_protocol.dart';
|
|
||||||
import 'path_helper.dart';
|
|
||||||
import '../models/contact.dart';
|
|
||||||
|
|
||||||
class PathHopResolver {
|
|
||||||
const PathHopResolver._();
|
|
||||||
|
|
||||||
static List<Contact?> resolve({
|
|
||||||
required List<int> pathBytes,
|
|
||||||
required List<Contact> contacts,
|
|
||||||
LatLng? endpoint,
|
|
||||||
bool resolveFromEnd = false,
|
|
||||||
int pathHashByteWidth = 1,
|
|
||||||
}) {
|
|
||||||
final width = pathHashByteWidth.clamp(1, 4).toInt();
|
|
||||||
final candidatesByPrefix = <String, List<Contact>>{};
|
|
||||||
for (final contact in contacts) {
|
|
||||||
if (contact.publicKey.length < width) continue;
|
|
||||||
if (contact.type != advTypeRepeater && contact.type != advTypeRoom) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
final prefix = PathHelper.formatHopHex(
|
|
||||||
contact.publicKey.sublist(0, width),
|
|
||||||
);
|
|
||||||
candidatesByPrefix.putIfAbsent(prefix, () => <Contact>[]).add(contact);
|
|
||||||
}
|
|
||||||
for (final candidates in candidatesByPrefix.values) {
|
|
||||||
candidates.sort((a, b) => b.lastSeen.compareTo(a.lastSeen));
|
|
||||||
}
|
|
||||||
|
|
||||||
final hops = PathHelper.splitPathBytes(pathBytes, width);
|
|
||||||
final resolved = List<Contact?>.filled(hops.length, null);
|
|
||||||
final indexes = resolveFromEnd
|
|
||||||
? List<int>.generate(hops.length, (i) => hops.length - 1 - i)
|
|
||||||
: List<int>.generate(hops.length, (i) => i);
|
|
||||||
final distance = Distance();
|
|
||||||
var previousPosition = endpoint;
|
|
||||||
|
|
||||||
for (final index in indexes) {
|
|
||||||
final candidates =
|
|
||||||
candidatesByPrefix[PathHelper.formatHopHex(hops[index])];
|
|
||||||
if (candidates == null || candidates.isEmpty) continue;
|
|
||||||
|
|
||||||
var bestIndex = 0;
|
|
||||||
if (previousPosition != null && candidates.length > 1) {
|
|
||||||
double? nearestDistance;
|
|
||||||
for (var i = 0; i < candidates.length; i++) {
|
|
||||||
final position = _positionOf(candidates[i]);
|
|
||||||
if (position == null) continue;
|
|
||||||
final candidateDistance = distance(previousPosition, position);
|
|
||||||
if (nearestDistance == null || candidateDistance < nearestDistance) {
|
|
||||||
nearestDistance = candidateDistance;
|
|
||||||
bestIndex = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final contact = candidates.removeAt(bestIndex);
|
|
||||||
resolved[index] = contact;
|
|
||||||
previousPosition = _positionOf(contact) ?? previousPosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
return resolved;
|
|
||||||
}
|
|
||||||
|
|
||||||
static LatLng? _positionOf(Contact contact) {
|
|
||||||
if (!contact.hasLocation ||
|
|
||||||
contact.latitude == null ||
|
|
||||||
contact.longitude == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return LatLng(contact.latitude!, contact.longitude!);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -25,19 +25,7 @@ void showDismissibleSnackBar(
|
|||||||
DismissDirection? dismissDirection,
|
DismissDirection? dismissDirection,
|
||||||
Clip? clipBehavior,
|
Clip? clipBehavior,
|
||||||
}) {
|
}) {
|
||||||
// Callers often reach here after an async gap; the context may already be
|
final messenger = ScaffoldMessenger.of(context);
|
||||||
// unmounted, or deactivated (popped but not yet disposed) — ancestor
|
|
||||||
// lookups on a deactivated element throw. Showing nothing is the right
|
|
||||||
// outcome in both cases.
|
|
||||||
if (!context.mounted) return;
|
|
||||||
var isActive = true;
|
|
||||||
assert(() {
|
|
||||||
isActive = (context as Element).debugIsActive;
|
|
||||||
return true;
|
|
||||||
}());
|
|
||||||
if (!isActive) return;
|
|
||||||
final messenger = ScaffoldMessenger.maybeOf(context);
|
|
||||||
if (messenger == null) return;
|
|
||||||
messenger.showSnackBar(
|
messenger.showSnackBar(
|
||||||
SnackBar(
|
SnackBar(
|
||||||
key: key,
|
key: key,
|
||||||
|
|||||||
@@ -28,12 +28,6 @@
|
|||||||
"common_remove": "Remove",
|
"common_remove": "Remove",
|
||||||
"common_enable": "Enable",
|
"common_enable": "Enable",
|
||||||
"common_disable": "Disable",
|
"common_disable": "Disable",
|
||||||
"common_undo": "Undo",
|
|
||||||
"messageStatus_sent": "Sent",
|
|
||||||
"messageStatus_delivered": "Delivered",
|
|
||||||
"messageStatus_pending": "Sending",
|
|
||||||
"messageStatus_failed": "Failed to send",
|
|
||||||
"messageStatus_repeated": "Heard repeated",
|
|
||||||
"common_reboot": "Reboot",
|
"common_reboot": "Reboot",
|
||||||
"common_loading": "Loading...",
|
"common_loading": "Loading...",
|
||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
@@ -53,8 +47,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"common_autoRefresh": "Autorefresh",
|
|
||||||
"common_interval": "Interval",
|
|
||||||
"scanner_title": "MeshCore Open",
|
"scanner_title": "MeshCore Open",
|
||||||
"connectionChoiceUsbLabel": "USB",
|
"connectionChoiceUsbLabel": "USB",
|
||||||
"connectionChoiceBluetoothLabel": "Bluetooth",
|
"connectionChoiceBluetoothLabel": "Bluetooth",
|
||||||
@@ -143,7 +135,6 @@
|
|||||||
"scanner_chromeRequired": "Chrome Browser Required",
|
"scanner_chromeRequired": "Chrome Browser Required",
|
||||||
"scanner_chromeRequiredMessage": "This web application requires Google Chrome or a Chromium-based browser for Bluetooth support.",
|
"scanner_chromeRequiredMessage": "This web application requires Google Chrome or a Chromium-based browser for Bluetooth support.",
|
||||||
"scanner_enableBluetooth": "Enable Bluetooth",
|
"scanner_enableBluetooth": "Enable Bluetooth",
|
||||||
"scanner_bluetoothWebUnsupported": "Bluetooth isn't available in the browser. Connect over USB instead.",
|
|
||||||
"device_quickSwitch": "Quick switch",
|
"device_quickSwitch": "Quick switch",
|
||||||
"device_meshcore": "MeshCore",
|
"device_meshcore": "MeshCore",
|
||||||
"settings_title": "Settings",
|
"settings_title": "Settings",
|
||||||
@@ -158,25 +149,6 @@
|
|||||||
"settings_radioSettings": "Radio Settings",
|
"settings_radioSettings": "Radio Settings",
|
||||||
"settings_radioSettingsSubtitle": "Frequency, power, spreading factor",
|
"settings_radioSettingsSubtitle": "Frequency, power, spreading factor",
|
||||||
"settings_radioSettingsUpdated": "Radio settings updated",
|
"settings_radioSettingsUpdated": "Radio settings updated",
|
||||||
"settings_regionSettings": "Regions",
|
|
||||||
"settings_regionSettingsSubtitle": "Manage stored regions",
|
|
||||||
"settings_regionManagement_screenTitle": "Region Management",
|
|
||||||
"settings_regionNameHint": "Enter region name",
|
|
||||||
"settings_regionAddRegion": "Add region",
|
|
||||||
"settings_regionFetchRegions": "Fetch regions from repeaters",
|
|
||||||
"settings_regionFetchRegionsFail": "No regions were found",
|
|
||||||
"settings_regionFetchRegionsAlreadyExists": "This region has already been added",
|
|
||||||
"settings_regionName": "Region Name",
|
|
||||||
"settings_regionDeleted": "Region deleted",
|
|
||||||
"settings_deleteRegion": "Delete Region",
|
|
||||||
"settings_deleteRegionConfirm": "Remove \"{region}\" from region list?",
|
|
||||||
"@settings_deleteRegionConfirm": {
|
|
||||||
"placeholders": {
|
|
||||||
"region": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"settings_location": "Location",
|
"settings_location": "Location",
|
||||||
"settings_locationSubtitle": "GPS coordinates",
|
"settings_locationSubtitle": "GPS coordinates",
|
||||||
"settings_locationUpdated": "Location and GPS settings updated",
|
"settings_locationUpdated": "Location and GPS settings updated",
|
||||||
@@ -206,8 +178,6 @@
|
|||||||
"settings_telemetryEnvironmentMode": "Telemetry Environment Mode",
|
"settings_telemetryEnvironmentMode": "Telemetry Environment Mode",
|
||||||
"settings_advertLocation": "Advert Location",
|
"settings_advertLocation": "Advert Location",
|
||||||
"settings_advertLocationSubtitle": "Include location in advert.",
|
"settings_advertLocationSubtitle": "Include location in advert.",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "Auto Zero-Hop Advert On GPS Update",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "When GPS location changes, send a zero-hop advert (requires Advert Location).",
|
|
||||||
"settings_multiAck": "Multi-ACKs",
|
"settings_multiAck": "Multi-ACKs",
|
||||||
"settings_telemetryModeUpdated": "Telemetry mode updated",
|
"settings_telemetryModeUpdated": "Telemetry mode updated",
|
||||||
"settings_actions": "Actions",
|
"settings_actions": "Actions",
|
||||||
@@ -292,10 +262,6 @@
|
|||||||
"appSettings_languageBg": "Български",
|
"appSettings_languageBg": "Български",
|
||||||
"appSettings_languageRu": "Русский",
|
"appSettings_languageRu": "Русский",
|
||||||
"appSettings_languageUk": "Українська",
|
"appSettings_languageUk": "Українська",
|
||||||
"repeater_pathHashModeOption0": "0 - 1 byte",
|
|
||||||
"repeater_pathHashModeOption1": "1 - 2 bytes",
|
|
||||||
"repeater_pathHashModeOption2": "2 - 3 bytes",
|
|
||||||
"repeater_pathHashModeOption3": "3 - 4 bytes",
|
|
||||||
"appSettings_enableMessageTracing": "Enable Message Tracing",
|
"appSettings_enableMessageTracing": "Enable Message Tracing",
|
||||||
"appSettings_enableMessageTracingSubtitle": "Show detailed routing and timing metadata for messages",
|
"appSettings_enableMessageTracingSubtitle": "Show detailed routing and timing metadata for messages",
|
||||||
"appSettings_notifications": "Notifications",
|
"appSettings_notifications": "Notifications",
|
||||||
@@ -329,6 +295,17 @@
|
|||||||
"appSettings_routeWeightFailureDecrementSubtitle": "Weight removed from a path after failed delivery",
|
"appSettings_routeWeightFailureDecrementSubtitle": "Weight removed from a path after failed delivery",
|
||||||
"appSettings_maxMessageRetries": "Max Message Retries",
|
"appSettings_maxMessageRetries": "Max Message Retries",
|
||||||
"appSettings_maxMessageRetriesSubtitle": "Number of retry attempts before marking a message as failed",
|
"appSettings_maxMessageRetriesSubtitle": "Number of retry attempts before marking a message as failed",
|
||||||
|
"path_routeWeight": "{weight}/{max}",
|
||||||
|
"@path_routeWeight": {
|
||||||
|
"placeholders": {
|
||||||
|
"weight": {
|
||||||
|
"type": "String"
|
||||||
|
},
|
||||||
|
"max": {
|
||||||
|
"type": "String"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"appSettings_battery": "Battery",
|
"appSettings_battery": "Battery",
|
||||||
"appSettings_batteryChemistry": "Battery Chemistry",
|
"appSettings_batteryChemistry": "Battery Chemistry",
|
||||||
"appSettings_batteryChemistryPerDevice": "Set per device ({deviceName})",
|
"appSettings_batteryChemistryPerDevice": "Set per device ({deviceName})",
|
||||||
@@ -367,19 +344,6 @@
|
|||||||
"appSettings_last6Hours": "Last 6 hours",
|
"appSettings_last6Hours": "Last 6 hours",
|
||||||
"appSettings_last24Hours": "Last 24 hours",
|
"appSettings_last24Hours": "Last 24 hours",
|
||||||
"appSettings_lastWeek": "Last week",
|
"appSettings_lastWeek": "Last week",
|
||||||
"appSettings_rasterTileSource": "Raster Tile Source",
|
|
||||||
"appSettings_stadiaEndpoint": "Stadia Endpoint",
|
|
||||||
"appSettings_stadiaApiKey": "Stadia API Key",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "Required for Stadia Maps usage",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "Configured: {maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "Enter your Stadia Maps API key. This app uses it for raster tile requests.",
|
|
||||||
"appSettings_offlineMapCache": "Offline Map Cache",
|
"appSettings_offlineMapCache": "Offline Map Cache",
|
||||||
"appSettings_unitsTitle": "Units",
|
"appSettings_unitsTitle": "Units",
|
||||||
"appSettings_unitsMetric": "Metric (m / km)",
|
"appSettings_unitsMetric": "Metric (m / km)",
|
||||||
@@ -487,9 +451,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"contacts_newGroup": "New Group",
|
"contacts_newGroup": "New Group",
|
||||||
"contacts_moreOptions": "More options",
|
|
||||||
"contacts_searchOpen": "Search contacts",
|
|
||||||
"contacts_searchClose": "Close search",
|
|
||||||
"contacts_groupName": "Group name",
|
"contacts_groupName": "Group name",
|
||||||
"contacts_groupNameRequired": "Group name is required",
|
"contacts_groupNameRequired": "Group name is required",
|
||||||
"contacts_groupNameReserved": "This group name is reserved",
|
"contacts_groupNameReserved": "This group name is reserved",
|
||||||
@@ -673,18 +634,6 @@
|
|||||||
"channels_scanQrCodeComingSoon": "Coming soon",
|
"channels_scanQrCodeComingSoon": "Coming soon",
|
||||||
"channels_enterHashtag": "Enter hashtag",
|
"channels_enterHashtag": "Enter hashtag",
|
||||||
"channels_hashtagHint": "e.g. #team",
|
"channels_hashtagHint": "e.g. #team",
|
||||||
"channels_regionSetTo": "Region: {region}",
|
|
||||||
"@channels_regionSetTo": {
|
|
||||||
"placeholders": {
|
|
||||||
"region": {
|
|
||||||
"type": "String",
|
|
||||||
"example": "de-mitte"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"channels_regionNotSet": "Region: none",
|
|
||||||
"channels_regionSelect_Title": "Select a region",
|
|
||||||
"channels_clearRegion": "Clear region",
|
|
||||||
"chat_noMessages": "No messages yet",
|
"chat_noMessages": "No messages yet",
|
||||||
"chat_sendMessage": "Send message",
|
"chat_sendMessage": "Send message",
|
||||||
"chat_sendMessageTo": "Send a message to {contactName}",
|
"chat_sendMessageTo": "Send a message to {contactName}",
|
||||||
@@ -738,7 +687,6 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"chat_sendGif": "Send GIF",
|
"chat_sendGif": "Send GIF",
|
||||||
"chat_receivedGif": "Received a GIF",
|
|
||||||
"chat_reply": "Reply",
|
"chat_reply": "Reply",
|
||||||
"chat_addReaction": "Add Reaction",
|
"chat_addReaction": "Add Reaction",
|
||||||
"chat_me": "Me",
|
"chat_me": "Me",
|
||||||
@@ -827,6 +775,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"debugFrame_hexDump": "Hex Dump:",
|
"debugFrame_hexDump": "Hex Dump:",
|
||||||
|
"chat_pathManagement": "Path Management",
|
||||||
|
"chat_ShowAllPaths": "Show all paths",
|
||||||
|
"chat_routingMode": "Routing mode",
|
||||||
|
"chat_autoUseSavedPath": "Auto (use saved path)",
|
||||||
|
"chat_forceFloodMode": "Force Flood Mode",
|
||||||
|
"chat_recentAckPaths": "Recent ACK Paths (tap to use):",
|
||||||
|
"chat_pathHistoryFull": "Path history is full. Remove entries to add new ones.",
|
||||||
|
"chat_hopSingular": "hop",
|
||||||
|
"chat_hopPlural": "hops",
|
||||||
"chat_hopsCount": "{count} {count, plural, =1{hop} other{hops}}",
|
"chat_hopsCount": "{count} {count, plural, =1{hop} other{hops}}",
|
||||||
"@chat_hopsCount": {
|
"@chat_hopsCount": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -835,80 +792,31 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"chat_successes": "successes",
|
||||||
|
"chat_score": "Score",
|
||||||
"chat_removePath": "Remove path",
|
"chat_removePath": "Remove path",
|
||||||
"chat_noPathHistoryYet": "No path history yet.\nSend a message to discover paths.",
|
"chat_noPathHistoryYet": "No path history yet.\nSend a message to discover paths.",
|
||||||
|
"chat_pathActions": "Path Actions:",
|
||||||
|
"chat_setCustomPath": "Set Custom Path",
|
||||||
|
"chat_setCustomPathSubtitle": "Manually specify routing path",
|
||||||
|
"chat_clearPath": "Clear Path",
|
||||||
|
"chat_clearPathSubtitle": "Force rediscovery on next send",
|
||||||
"chat_pathCleared": "Path cleared. Next message will rediscover route.",
|
"chat_pathCleared": "Path cleared. Next message will rediscover route.",
|
||||||
|
"chat_floodModeSubtitle": "Use routing toggle in app bar",
|
||||||
|
"chat_floodModeEnabled": "Flood mode enabled. Toggle back via routing icon in app bar.",
|
||||||
"chat_fullPath": "Full Path",
|
"chat_fullPath": "Full Path",
|
||||||
"routing_title": "Routing",
|
"chat_pathDetailsNotAvailable": "Path details not available yet. Try sending a message to refresh.",
|
||||||
"routing_modeAuto": "Auto",
|
"chat_pathSetHops": "Path set: {hopCount} {hopCount, plural, =1{hop} other{hops}} - {status}",
|
||||||
"routing_modeFlood": "Flood",
|
"@chat_pathSetHops": {
|
||||||
"routing_modeManual": "Manual",
|
|
||||||
"routing_modeAutoHint": "Picks the best known path automatically, flooding when none is known.",
|
|
||||||
"routing_modeFloodHint": "Broadcasts through every repeater. Most reliable, but uses more airtime.",
|
|
||||||
"routing_modeManualHint": "Always sends along the exact path you set.",
|
|
||||||
"routing_currentRoute": "Current route",
|
|
||||||
"routing_directNoHops": "Direct — no repeater hops",
|
|
||||||
"routing_noPathYet": "No path yet. The next message floods until a route is discovered.",
|
|
||||||
"routing_floodBroadcast": "Broadcast through every repeater",
|
|
||||||
"routing_editPath": "Edit path",
|
|
||||||
"routing_forgetPath": "Forget path",
|
|
||||||
"routing_knownPaths": "Known paths",
|
|
||||||
"routing_knownPathsHint": "Tap a path to switch to it.",
|
|
||||||
"routing_inUse": "In use",
|
|
||||||
"routing_qualityStrong": "Strong first hop",
|
|
||||||
"routing_qualityGood": "Good first hop",
|
|
||||||
"routing_qualityFair": "Fair first hop",
|
|
||||||
"routing_qualityWorked": "Has delivered",
|
|
||||||
"routing_qualityFlood": "Heard via flood",
|
|
||||||
"routing_qualityUntested": "Untested",
|
|
||||||
"routing_lastWorked": "worked {when}",
|
|
||||||
"@routing_lastWorked": {
|
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"when": {
|
"hopCount": {
|
||||||
|
"type": "int"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
"type": "String"
|
"type": "String"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"routing_neverWorked": "never confirmed",
|
|
||||||
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"routing_floodDelivery": "Flood delivery",
|
|
||||||
"pathEditor_title": "Build Path",
|
|
||||||
"pathEditor_hopCounter": "{count} of 64 hops",
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathEditor_noHops": "No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.",
|
|
||||||
"pathEditor_addHops": "Add hops in order",
|
|
||||||
"pathEditor_searchRepeaters": "Search repeaters",
|
|
||||||
"pathEditor_advancedHex": "Advanced: raw hex path",
|
|
||||||
"pathEditor_hexLabel": "Hex prefixes",
|
|
||||||
"pathEditor_hexHelper": "Two hex characters per hop, separated by commas",
|
|
||||||
"pathEditor_invalidTokens": "Invalid: {tokens}",
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathEditor_tooManyHops": "Maximum 64 hops",
|
|
||||||
"pathEditor_usePath": "Use this path",
|
|
||||||
"pathEditor_removeHop": "Remove hop",
|
|
||||||
"pathEditor_unknownHop": "Unknown repeater",
|
|
||||||
"chat_pathSavedLocally": "Saved locally. Connect to sync.",
|
"chat_pathSavedLocally": "Saved locally. Connect to sync.",
|
||||||
"chat_pathDeviceConfirmed": "Device confirmed.",
|
"chat_pathDeviceConfirmed": "Device confirmed.",
|
||||||
"chat_pathDeviceNotConfirmed": "Device not confirmed yet.",
|
"chat_pathDeviceNotConfirmed": "Device not confirmed yet.",
|
||||||
@@ -952,17 +860,6 @@
|
|||||||
},
|
},
|
||||||
"chat_invalidLink": "Invalid link format",
|
"chat_invalidLink": "Invalid link format",
|
||||||
"map_title": "Node Map",
|
"map_title": "Node Map",
|
||||||
"map_searchHint": "Search node name or ID",
|
|
||||||
"map_activity": "Activity",
|
|
||||||
"map_online": "Online",
|
|
||||||
"map_recent": "Recent",
|
|
||||||
"map_stale": "Stale",
|
|
||||||
"map_visible": "Visible",
|
|
||||||
"map_hidden": "Hidden",
|
|
||||||
"map_centerOnNode": "Center on node",
|
|
||||||
"map_details": "Details",
|
|
||||||
"map_noGps": "No GPS",
|
|
||||||
"map_noResults": "No matching nodes",
|
|
||||||
"map_lineOfSight": "Line of Sight",
|
"map_lineOfSight": "Line of Sight",
|
||||||
"map_losScreenTitle": "Line of Sight",
|
"map_losScreenTitle": "Line of Sight",
|
||||||
"map_noNodesWithLocation": "No nodes with location data",
|
"map_noNodesWithLocation": "No nodes with location data",
|
||||||
@@ -1111,56 +1008,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
||||||
"@mapCache_boundsLabel": {
|
"@mapCache_boundsLabel": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -1215,6 +1062,9 @@
|
|||||||
"time_allTime": "All Time",
|
"time_allTime": "All Time",
|
||||||
"dialog_disconnect": "Disconnect",
|
"dialog_disconnect": "Disconnect",
|
||||||
"dialog_disconnectConfirm": "Are you sure you want to disconnect from this device?",
|
"dialog_disconnectConfirm": "Are you sure you want to disconnect from this device?",
|
||||||
|
"dialog_disconnectedTitle": "Disconnected",
|
||||||
|
"dialog_disconnectedMessage": "You have been disconnected from your companion.",
|
||||||
|
"dialog_connectCompanion": "Connect to a companion to access repeater and room server features.",
|
||||||
"login_repeaterLogin": "Repeater Login",
|
"login_repeaterLogin": "Repeater Login",
|
||||||
"login_roomLogin": "Room Server Login",
|
"login_roomLogin": "Room Server Login",
|
||||||
"login_password": "Password",
|
"login_password": "Password",
|
||||||
@@ -1251,8 +1101,41 @@
|
|||||||
"login_failedMessage": "Login failed. Either the password is incorrect or the repeater is unreachable.",
|
"login_failedMessage": "Login failed. Either the password is incorrect or the repeater is unreachable.",
|
||||||
"common_reload": "Reload",
|
"common_reload": "Reload",
|
||||||
"common_clear": "Clear",
|
"common_clear": "Clear",
|
||||||
|
"path_currentPath": "Current path: {path}",
|
||||||
|
"@path_currentPath": {
|
||||||
|
"placeholders": {
|
||||||
|
"path": {
|
||||||
|
"type": "String"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"path_usingHopsPath": "Using {count} {count, plural, =1{hop} other{hops}} path",
|
||||||
|
"@path_usingHopsPath": {
|
||||||
|
"placeholders": {
|
||||||
|
"count": {
|
||||||
|
"type": "int"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"path_enterCustomPath": "Enter Custom Path",
|
||||||
"path_currentPathLabel": "Current path",
|
"path_currentPathLabel": "Current path",
|
||||||
|
"path_hexPrefixInstructions": "Enter 2-character hex prefixes for each hop, separated by commas.",
|
||||||
|
"path_hexPrefixExample": "Example: A1,F2,3C (each node uses first byte of its public key)",
|
||||||
|
"path_labelHexPrefixes": "Path (hex prefixes)",
|
||||||
|
"path_helperMaxHops": "Max 64 hops. Each prefix is 2 hex characters (1 byte)",
|
||||||
|
"path_selectFromContacts": "Or select from contacts:",
|
||||||
"path_noRepeatersFound": "No repeaters or room servers found.",
|
"path_noRepeatersFound": "No repeaters or room servers found.",
|
||||||
|
"path_customPathsRequire": "Custom paths require intermediate hops that can relay messages.",
|
||||||
|
"path_invalidHexPrefixes": "Invalid hex prefixes: {prefixes}",
|
||||||
|
"@path_invalidHexPrefixes": {
|
||||||
|
"placeholders": {
|
||||||
|
"prefixes": {
|
||||||
|
"type": "String"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"path_tooLong": "Path too long. Maximum 64 hops allowed.",
|
||||||
|
"path_setPath": "Set Path",
|
||||||
"repeater_management": "Repeater Management",
|
"repeater_management": "Repeater Management",
|
||||||
"room_management": "Room Server Management",
|
"room_management": "Room Server Management",
|
||||||
"repeater_guest": "Repeater Information",
|
"repeater_guest": "Repeater Information",
|
||||||
@@ -1279,6 +1162,9 @@
|
|||||||
},
|
},
|
||||||
"repeater_statusTitle": "Repeater Status",
|
"repeater_statusTitle": "Repeater Status",
|
||||||
"repeater_routingMode": "Routing mode",
|
"repeater_routingMode": "Routing mode",
|
||||||
|
"repeater_autoUseSavedPath": "Auto (use saved path)",
|
||||||
|
"repeater_forceFloodMode": "Force Flood Mode",
|
||||||
|
"repeater_pathManagement": "Path management",
|
||||||
"repeater_refresh": "Refresh",
|
"repeater_refresh": "Refresh",
|
||||||
"repeater_statusRequestTimeout": "Status request timed out.",
|
"repeater_statusRequestTimeout": "Status request timed out.",
|
||||||
"repeater_errorLoadingStatus": "Error loading status: {error}",
|
"repeater_errorLoadingStatus": "Error loading status: {error}",
|
||||||
@@ -1478,24 +1364,7 @@
|
|||||||
"repeater_advancedSettings": "Advanced",
|
"repeater_advancedSettings": "Advanced",
|
||||||
"repeater_advancedSettingsSubtitle": "Tuning knobs for experienced operators",
|
"repeater_advancedSettingsSubtitle": "Tuning knobs for experienced operators",
|
||||||
"repeater_pathHashMode": "Path hash mode",
|
"repeater_pathHashMode": "Path hash mode",
|
||||||
"repeater_pathHashModeHelper": "Bytes used to encode this repeater's ID in flood path/loop-detect tags. 0=1 byte (256 IDs, up to 64 hops), 1=2 bytes (65K IDs, up to 32 hops), 2=3 bytes (16M IDs, up to 21 hops). Firmware before v1.14 always used 1-byte paths; v1.14 and newer can be configured for 2- or 3-byte paths.",
|
"repeater_pathHashModeHelper": "Bytes used to encode this repeater's ID in flood path/loop-detect tags. 0=1 byte (256 IDs, up to 64 hops), 1=2 bytes (65K IDs, up to 32 hops), 2=3 bytes (16M IDs, up to 21 hops). v1.13 and older firmware drops multi-byte paths — only raise once your network is on v1.14+.",
|
||||||
"repeater_keySettings": "Change Identity Keys",
|
|
||||||
"repeater_keySettingsSubtitle": "Change the public/private keypair",
|
|
||||||
"repeater_prvKey": "Private key",
|
|
||||||
"repeater_prvKeyHelper": "A new private key for the repeater, a 128-character hex string.",
|
|
||||||
"repeater_generatePrvKey": "Generate a random keypair",
|
|
||||||
"repeater_stopGeneratingPrvKey": "Interrupt search for keypair",
|
|
||||||
"repeater_pubKey": "Public key",
|
|
||||||
"repeater_pubKeyHelper": "This is the public key that goes with the generated private key. You can't set this directly.",
|
|
||||||
"repeater_pubKeyPrefix": "Desired prefix",
|
|
||||||
"repeater_pubKeyPrefixHelper": "Find a public key that starts with these hex digits. Expected tries needed: {tries}.",
|
|
||||||
"@repeater_pubKeyPrefixHelper": {
|
|
||||||
"placeholders": {
|
|
||||||
"tries": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"repeater_txDelay": "Flood TX delay",
|
"repeater_txDelay": "Flood TX delay",
|
||||||
"repeater_txDelayHelper": "Retransmit spacing for flood traffic, as a multiplier of the packet's airtime (0-2, default 0.5). Higher = fewer collisions but slower delivery.",
|
"repeater_txDelayHelper": "Retransmit spacing for flood traffic, as a multiplier of the packet's airtime (0-2, default 0.5). Higher = fewer collisions but slower delivery.",
|
||||||
"repeater_directTxDelay": "Direct TX delay",
|
"repeater_directTxDelay": "Direct TX delay",
|
||||||
@@ -1676,7 +1545,7 @@
|
|||||||
"repeater_cliHelpPowersavingOnOff": "Enables or disables powersaving mode (where supported).",
|
"repeater_cliHelpPowersavingOnOff": "Enables or disables powersaving mode (where supported).",
|
||||||
"repeater_cliHelpErase": "(Serial only) Formats the device file system. Wipes all settings and contacts.",
|
"repeater_cliHelpErase": "(Serial only) Formats the device file system. Wipes all settings and contacts.",
|
||||||
"repeater_cliHelpSetDutyCycle": "Sets the maximum allowed transmit duty cycle as a percentage (1-100). Internally adjusts the airtime factor.",
|
"repeater_cliHelpSetDutyCycle": "Sets the maximum allowed transmit duty cycle as a percentage (1-100). Internally adjusts the airtime factor.",
|
||||||
"repeater_cliHelpSetPrvKey": "Replaces the device identity private key. Reboot required to apply. Generates a new public key.",
|
"repeater_cliHelpSetPrvKey": "(Serial only) Replaces the device identity private key. Reboot required to apply. Generates a new public key.",
|
||||||
"repeater_cliHelpSetRadioRxGain": "(SX126x only) Toggles boosted RX gain for improved sensitivity at higher current draw.",
|
"repeater_cliHelpSetRadioRxGain": "(SX126x only) Toggles boosted RX gain for improved sensitivity at higher current draw.",
|
||||||
"repeater_cliHelpSetOwnerInfo": "Sets the owner contact info string included in adverts. Use '|' for newlines.",
|
"repeater_cliHelpSetOwnerInfo": "Sets the owner contact info string included in adverts. Use '|' for newlines.",
|
||||||
"repeater_cliHelpSetPathHashMode": "Sets the path-hash mode. 0 = legacy, 1 = standard, 2 = strict. Affects how routing paths are matched.",
|
"repeater_cliHelpSetPathHashMode": "Sets the path-hash mode. 0 = legacy, 1 = standard, 2 = strict. Affects how routing paths are matched.",
|
||||||
@@ -1795,120 +1664,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"telemetry_digitalInputLabel": "Digital Input",
|
|
||||||
"telemetry_digitalOutputLabel": "Digital Output",
|
|
||||||
"telemetry_analogInputLabel": "Analog Input",
|
|
||||||
"telemetry_analogOutputLabel": "Analog Output",
|
|
||||||
"telemetry_genericLabel": "Generic Sensor",
|
|
||||||
"telemetry_luminosityLabel": "Luminosity",
|
|
||||||
"telemetry_presenceLabel": "Presence",
|
|
||||||
"telemetry_humidityLabel": "Humidity",
|
|
||||||
"telemetry_accelerometerLabel": "Accelerometer",
|
|
||||||
"telemetry_pressureLabel": "Pressure",
|
|
||||||
"telemetry_altitudeLabel": "Altitude",
|
|
||||||
"telemetry_frequencyLabel": "Frequency",
|
|
||||||
"telemetry_percentageLabel": "Percentage",
|
|
||||||
"telemetry_concentrationLabel": "Concentration",
|
|
||||||
"telemetry_powerLabel": "Power",
|
|
||||||
"telemetry_distanceLabel": "Distance",
|
|
||||||
"telemetry_energyLabel": "Energy",
|
|
||||||
"telemetry_directionLabel": "Direction",
|
|
||||||
"telemetry_timeLabel": "Time",
|
|
||||||
"telemetry_gyrometerLabel": "Gyrometer",
|
|
||||||
"telemetry_colourLabel": "Colour",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "Switch",
|
|
||||||
"telemetry_polylineLabel": "Polyline",
|
|
||||||
"telemetry_altitudeValue": "{meters} m",
|
|
||||||
"@telemetry_altitudeValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"meters": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_frequencyValue": "{hertz} Hz",
|
|
||||||
"@telemetry_frequencyValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"hertz": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_pressureValue": "{hpa} hPa",
|
|
||||||
"@telemetry_pressureValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"hpa": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_luminosityValue": "{lux} lx",
|
|
||||||
"@telemetry_luminosityValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"lux": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_powerValue": "{watts} W",
|
|
||||||
"@telemetry_powerValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"watts": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_distanceValue": "{meters} m",
|
|
||||||
"@telemetry_distanceValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"meters": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_energyValue": "{kilowattHours} kWh",
|
|
||||||
"@telemetry_energyValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"kilowattHours": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"@telemetry_directionValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"degrees": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"@telemetry_concentrationValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"ppm": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"@telemetry_percentageValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"percent": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"@telemetry_analogValue": {
|
|
||||||
"placeholders": {
|
|
||||||
"value": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"telemetry_autoFetchQuantity": "Requests quantity",
|
|
||||||
"telemetry_error": "Unable to retrieve data",
|
|
||||||
"neighbors_receivedData": "Received Neighbors Data",
|
"neighbors_receivedData": "Received Neighbors Data",
|
||||||
"neighbors_requestTimedOut": "Neighbors request timed out.",
|
"neighbors_requestTimedOut": "Neighbors request timed out.",
|
||||||
"neighbors_errorLoading": "Error loading neighbors: {error}",
|
"neighbors_errorLoading": "Error loading neighbors: {error}",
|
||||||
@@ -2536,9 +2291,6 @@
|
|||||||
"translation_enableSubtitle": "Translate incoming messages and allow pre-send translation.",
|
"translation_enableSubtitle": "Translate incoming messages and allow pre-send translation.",
|
||||||
"translation_composerTitle": "Translate before sending",
|
"translation_composerTitle": "Translate before sending",
|
||||||
"translation_composerSubtitle": "Controls the default state of the composer translation icon.",
|
"translation_composerSubtitle": "Controls the default state of the composer translation icon.",
|
||||||
"translation_autoIncomingTitle": "Auto-translate incoming messages",
|
|
||||||
"translation_autoIncomingSubtitle": "Translates Messages for notification and for chat or channel automatically.",
|
|
||||||
"translation_translateMessage": "Translate message",
|
|
||||||
"translation_targetLanguage": "Target language",
|
"translation_targetLanguage": "Target language",
|
||||||
"translation_useAppLanguage": "Use app language",
|
"translation_useAppLanguage": "Use app language",
|
||||||
"translation_downloadedModelLabel": "Downloaded model",
|
"translation_downloadedModelLabel": "Downloaded model",
|
||||||
@@ -2617,101 +2369,5 @@
|
|||||||
"contact_typeRepeater": "Repeater",
|
"contact_typeRepeater": "Repeater",
|
||||||
"contact_typeRoom": "Room",
|
"contact_typeRoom": "Room",
|
||||||
"contact_typeSensor": "Sensor",
|
"contact_typeSensor": "Sensor",
|
||||||
"contact_typeUnknown": "Unknown",
|
"contact_typeUnknown": "Unknown"
|
||||||
"map_zoomIn": "Zoom in",
|
|
||||||
"map_zoomOut": "Zoom out",
|
|
||||||
"map_centerMap": "Center map",
|
|
||||||
"chrome_bluetoothRequiresChromium": "Web Bluetooth requires a Chromium browser",
|
|
||||||
"channels_communityShortId": "ID: {id}...",
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathTrace_legendGpsConfirmed": "GPS confirmed",
|
|
||||||
"pathTrace_legendInferred": "Inferred position",
|
|
||||||
"pathMap_viewSingle": "Single",
|
|
||||||
"pathMap_viewCombined": "Combined",
|
|
||||||
"pathMap_play": "Play",
|
|
||||||
"pathMap_pause": "Pause",
|
|
||||||
"pathMap_replay": "Replay",
|
|
||||||
"pathMap_stepBack": "Previous hop",
|
|
||||||
"pathMap_stepForward": "Next hop",
|
|
||||||
"pathMap_animationOn": "Show packet animation",
|
|
||||||
"pathMap_animationOff": "Hide packet animation",
|
|
||||||
"pathMap_hopOf": "Hop {current} of {total}",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathMap_observedPaths": "Observed paths: {count}",
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathMap_primary": "Primary",
|
|
||||||
"pathMap_alternate": "Alt {index}",
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathMap_hopCount": "{count, plural, =1{1 hop} other{{count} hops}}",
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS",
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathMap_legendShared": "Shared segment",
|
|
||||||
"pathMap_legendEstimated": "Estimated segment",
|
|
||||||
"pathMap_sharedNodeCount": "Used by {count} paths",
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathMap_partialAnimation": "{count, plural, =1{1 hop has no location — the shown path is partial} other{{count} hops have no location — the shown path is partial}}",
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"pathMap_showAllPaths": "Show all",
|
|
||||||
"pathMap_hidePath": "Hide path",
|
|
||||||
"pathMap_showPath": "Show path",
|
|
||||||
"pathMap_collapsePanel": "Collapse panel",
|
|
||||||
"pathMap_expandPanel": "Expand panel",
|
|
||||||
"pathMap_noLocation": "No location",
|
|
||||||
"pathMap_followPacket": "Lock view to packet",
|
|
||||||
"pathMap_unfollowPacket": "Unlock view from packet"
|
|
||||||
}
|
}
|
||||||
@@ -92,24 +92,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => 'Disable';
|
String get common_disable => 'Disable';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => 'Undo';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => 'Sent';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => 'Delivered';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => 'Sending';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed => 'Failed to send';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => 'Heard repeated';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => 'Reboot';
|
String get common_reboot => 'Reboot';
|
||||||
|
|
||||||
@@ -129,12 +111,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
return '$percent%';
|
return '$percent%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => 'Autorefresh';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => 'Interval';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => 'MeshCore Open';
|
String get scanner_title => 'MeshCore Open';
|
||||||
|
|
||||||
@@ -315,10 +291,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => 'Enable Bluetooth';
|
String get scanner_enableBluetooth => 'Enable Bluetooth';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported =>
|
|
||||||
'Bluetooth isn\'t available in the browser. Connect over USB instead.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => 'Quick switch';
|
String get device_quickSwitch => 'Quick switch';
|
||||||
|
|
||||||
@@ -363,45 +335,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_radioSettingsUpdated => 'Radio settings updated';
|
String get settings_radioSettingsUpdated => 'Radio settings updated';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => 'Location';
|
String get settings_location => 'Location';
|
||||||
|
|
||||||
@@ -496,14 +429,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_advertLocationSubtitle => 'Include location in advert.';
|
String get settings_advertLocationSubtitle => 'Include location in advert.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate =>
|
|
||||||
'Auto Zero-Hop Advert On GPS Update';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'When GPS location changes, send a zero-hop advert (requires Advert Location).';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => 'Multi-ACKs';
|
String get settings_multiAck => 'Multi-ACKs';
|
||||||
|
|
||||||
@@ -726,18 +651,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => 'Українська';
|
String get appSettings_languageUk => 'Українська';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing => 'Enable Message Tracing';
|
String get appSettings_enableMessageTracing => 'Enable Message Tracing';
|
||||||
|
|
||||||
@@ -858,6 +771,11 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
String get appSettings_maxMessageRetriesSubtitle =>
|
String get appSettings_maxMessageRetriesSubtitle =>
|
||||||
'Number of retry attempts before marking a message as failed';
|
'Number of retry attempts before marking a message as failed';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => 'Battery';
|
String get appSettings_battery => 'Battery';
|
||||||
|
|
||||||
@@ -939,28 +857,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => 'Last week';
|
String get appSettings_lastWeek => 'Last week';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => 'Raster Tile Source';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Stadia Endpoint';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Stadia API Key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired =>
|
|
||||||
'Required for Stadia Maps usage';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return 'Configured: $maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'Enter your Stadia Maps API key. This app uses it for raster tile requests.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => 'Offline Map Cache';
|
String get appSettings_offlineMapCache => 'Offline Map Cache';
|
||||||
|
|
||||||
@@ -1079,15 +975,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => 'New Group';
|
String get contacts_newGroup => 'New Group';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => 'More options';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => 'Search contacts';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => 'Close search';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => 'Group name';
|
String get contacts_groupName => 'Group name';
|
||||||
|
|
||||||
@@ -1381,20 +1268,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => 'e.g. #team';
|
String get channels_hashtagHint => 'e.g. #team';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => 'No messages yet';
|
String get chat_noMessages => 'No messages yet';
|
||||||
|
|
||||||
@@ -1450,9 +1323,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => 'Send GIF';
|
String get chat_sendGif => 'Send GIF';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => 'Reply';
|
String get chat_reply => 'Reply';
|
||||||
|
|
||||||
@@ -1576,6 +1446,34 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => 'Hex Dump:';
|
String get debugFrame_hexDump => 'Hex Dump:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => 'Path Management';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => 'Show all paths';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => 'Routing mode';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => 'Auto (use saved path)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode => 'Force Flood Mode';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths => 'Recent ACK Paths (tap to use):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull =>
|
||||||
|
'Path history is full. Remove entries to add new ones.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => 'hop';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => 'hops';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@@ -1587,6 +1485,12 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
return '$count $_temp0';
|
return '$count $_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => 'successes';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Score';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => 'Remove path';
|
String get chat_removePath => 'Remove path';
|
||||||
|
|
||||||
@@ -1594,144 +1498,50 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
String get chat_noPathHistoryYet =>
|
String get chat_noPathHistoryYet =>
|
||||||
'No path history yet.\nSend a message to discover paths.';
|
'No path history yet.\nSend a message to discover paths.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => 'Path Actions:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => 'Set Custom Path';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle => 'Manually specify routing path';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => 'Clear Path';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle => 'Force rediscovery on next send';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared =>
|
String get chat_pathCleared =>
|
||||||
'Path cleared. Next message will rediscover route.';
|
'Path cleared. Next message will rediscover route.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle => 'Use routing toggle in app bar';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled =>
|
||||||
|
'Flood mode enabled. Toggle back via routing icon in app bar.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => 'Full Path';
|
String get chat_fullPath => 'Full Path';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => 'Routing';
|
String get chat_pathDetailsNotAvailable =>
|
||||||
|
'Path details not available yet. Try sending a message to refresh.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => 'Auto';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@override
|
hopCount,
|
||||||
String get routing_modeFlood => 'Flood';
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
@override
|
one: 'hop',
|
||||||
String get routing_modeManual => 'Manual';
|
);
|
||||||
|
return 'Path set: $hopCount $_temp0 - $status';
|
||||||
@override
|
|
||||||
String get routing_modeAutoHint =>
|
|
||||||
'Picks the best known path automatically, flooding when none is known.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint =>
|
|
||||||
'Broadcasts through every repeater. Most reliable, but uses more airtime.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint =>
|
|
||||||
'Always sends along the exact path you set.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => 'Current route';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops => 'Direct — no repeater hops';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet =>
|
|
||||||
'No path yet. The next message floods until a route is discovered.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast => 'Broadcast through every repeater';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => 'Edit path';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => 'Forget path';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => 'Known paths';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint => 'Tap a path to switch to it.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => 'In use';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => 'Strong first hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => 'Good first hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => 'Fair first hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => 'Has delivered';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood => 'Heard via flood';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => 'Untested';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return 'worked $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => 'never confirmed';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes delivered, $failures failed';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery => 'Flood delivery';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => 'Build Path';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count of 64 hops';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'No hops yet. Tap repeaters below to add them in order, or save with no hops to send direct.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops => 'Add hops in order';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => 'Search repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex => 'Advanced: raw hex path';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel => 'Hex prefixes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper =>
|
|
||||||
'Two hex characters per hop, separated by commas';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return 'Invalid: $tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops => 'Maximum 64 hops';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => 'Use this path';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => 'Remove hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop => 'Unknown repeater';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally => 'Saved locally. Connect to sync.';
|
String get chat_pathSavedLocally => 'Saved locally. Connect to sync.';
|
||||||
|
|
||||||
@@ -1805,39 +1615,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => 'Node Map';
|
String get map_title => 'Node Map';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => 'Search node name or ID';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => 'Activity';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => 'Online';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => 'Recent';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => 'Stale';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => 'Visible';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => 'Hidden';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => 'Center on node';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => 'Details';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => 'No GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => 'No matching nodes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => 'Line of Sight';
|
String get map_lineOfSight => 'Line of Sight';
|
||||||
|
|
||||||
@@ -2096,42 +1873,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
return 'Failed downloads: $count';
|
return 'Failed downloads: $count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2197,6 +1938,17 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
String get dialog_disconnectConfirm =>
|
String get dialog_disconnectConfirm =>
|
||||||
'Are you sure you want to disconnect from this device?';
|
'Are you sure you want to disconnect from this device?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => 'Disconnected';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage =>
|
||||||
|
'You have been disconnected from your companion.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion =>
|
||||||
|
'Connect to a companion to access repeater and room server features.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => 'Repeater Login';
|
String get login_repeaterLogin => 'Repeater Login';
|
||||||
|
|
||||||
@@ -2262,12 +2014,64 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => 'Clear';
|
String get common_clear => 'Clear';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return 'Current path: $path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
|
one: 'hop',
|
||||||
|
);
|
||||||
|
return 'Using $count $_temp0 path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => 'Enter Custom Path';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => 'Current path';
|
String get path_currentPathLabel => 'Current path';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions =>
|
||||||
|
'Enter 2-character hex prefixes for each hop, separated by commas.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample =>
|
||||||
|
'Example: A1,F2,3C (each node uses first byte of its public key)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => 'Path (hex prefixes)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops =>
|
||||||
|
'Max 64 hops. Each prefix is 2 hex characters (1 byte)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => 'Or select from contacts:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound => 'No repeaters or room servers found.';
|
String get path_noRepeatersFound => 'No repeaters or room servers found.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire =>
|
||||||
|
'Custom paths require intermediate hops that can relay messages.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return 'Invalid hex prefixes: $prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong => 'Path too long. Maximum 64 hops allowed.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => 'Set Path';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => 'Repeater Management';
|
String get repeater_management => 'Repeater Management';
|
||||||
|
|
||||||
@@ -2331,6 +2135,15 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => 'Routing mode';
|
String get repeater_routingMode => 'Routing mode';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath => 'Auto (use saved path)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode => 'Force Flood Mode';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => 'Path management';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => 'Refresh';
|
String get repeater_refresh => 'Refresh';
|
||||||
|
|
||||||
@@ -2668,42 +2481,7 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'Bytes used to encode this repeater\'s ID in flood path/loop-detect tags. 0=1 byte (256 IDs, up to 64 hops), 1=2 bytes (65K IDs, up to 32 hops), 2=3 bytes (16M IDs, up to 21 hops). Firmware before v1.14 always used 1-byte paths; v1.14 and newer can be configured for 2- or 3-byte paths.';
|
'Bytes used to encode this repeater\'s ID in flood path/loop-detect tags. 0=1 byte (256 IDs, up to 64 hops), 1=2 bytes (65K IDs, up to 32 hops), 2=3 bytes (16M IDs, up to 21 hops). v1.13 and older firmware drops multi-byte paths — only raise once your network is on v1.14+.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => 'Flood TX delay';
|
String get repeater_txDelay => 'Flood TX delay';
|
||||||
@@ -3175,7 +2953,7 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_cliHelpSetPrvKey =>
|
String get repeater_cliHelpSetPrvKey =>
|
||||||
'Replaces the device identity private key. Reboot required to apply. Generates a new public key.';
|
'(Serial only) Replaces the device identity private key. Reboot required to apply. Generates a new public key.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_cliHelpSetRadioRxGain =>
|
String get repeater_cliHelpSetRadioRxGain =>
|
||||||
@@ -3446,139 +3224,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => 'Digital Input';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => 'Digital Output';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => 'Analog Input';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => 'Analog Output';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => 'Generic Sensor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => 'Luminosity';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => 'Presence';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => 'Humidity';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => 'Accelerometer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => 'Pressure';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => 'Altitude';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => 'Frequency';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => 'Percentage';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => 'Concentration';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => 'Power';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => 'Distance';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => 'Energy';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => 'Direction';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => 'Time';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => 'Gyrometer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => 'Colour';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => 'Switch';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => 'Polyline';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Hz';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa hPa';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux lx';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts W';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours kWh';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => 'Requests quantity';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => 'Unable to retrieve data';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => 'Received Neighbors Data';
|
String get neighbors_receivedData => 'Received Neighbors Data';
|
||||||
|
|
||||||
@@ -4451,17 +4096,6 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
String get translation_composerSubtitle =>
|
String get translation_composerSubtitle =>
|
||||||
'Controls the default state of the composer translation icon.';
|
'Controls the default state of the composer translation icon.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle =>
|
|
||||||
'Auto-translate incoming messages';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle =>
|
|
||||||
'Translates Messages for notification and for chat or channel automatically.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => 'Translate message';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => 'Target language';
|
String get translation_targetLanguage => 'Target language';
|
||||||
|
|
||||||
@@ -4587,135 +4221,4 @@ class AppLocalizationsEn extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Unknown';
|
String get contact_typeUnknown => 'Unknown';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => 'Zoom in';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => 'Zoom out';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => 'Center map';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'Web Bluetooth requires a Chromium browser';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'ID: $id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => 'GPS confirmed';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => 'Inferred position';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => 'Single';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => 'Combined';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => 'Play';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => 'Pause';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => 'Replay';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => 'Previous hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => 'Next hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => 'Show packet animation';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => 'Hide packet animation';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return 'Hop $current of $total';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return 'Observed paths: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => 'Primary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return 'Alt $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count hops',
|
|
||||||
one: '1 hop',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => 'Shared segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => 'Estimated segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return 'Used by $count paths';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count hops have no location — the shown path is partial',
|
|
||||||
one: '1 hop has no location — the shown path is partial',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => 'Show all';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => 'Hide path';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => 'Show path';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => 'Collapse panel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => 'Expand panel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => 'No location';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => 'Lock view to packet';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => 'Unlock view from packet';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,24 +92,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => 'Uitschakelen';
|
String get common_disable => 'Uitschakelen';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => 'Achterhalen/Annuleren';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => 'Verzonden';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => 'Leverd';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => 'Verzenden';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed => 'Niet verzonden';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => 'Hearsay, herhaald';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => 'Herstarten';
|
String get common_reboot => 'Herstarten';
|
||||||
|
|
||||||
@@ -129,12 +111,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
return '$percent%';
|
return '$percent%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => 'Automatisch vernieuwen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => 'Tijdsinterval';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => 'MeshCore Open';
|
String get scanner_title => 'MeshCore Open';
|
||||||
|
|
||||||
@@ -317,10 +293,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => 'Activeer Bluetooth';
|
String get scanner_enableBluetooth => 'Activeer Bluetooth';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported =>
|
|
||||||
'Bluetooth is niet beschikbaar in de browser. Verbind dan via USB.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => 'Snelle overschakeling';
|
String get device_quickSwitch => 'Snelle overschakeling';
|
||||||
|
|
||||||
@@ -365,45 +337,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_radioSettingsUpdated => 'Radio instellingen bijgewerkt';
|
String get settings_radioSettingsUpdated => 'Radio instellingen bijgewerkt';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => 'Locatie';
|
String get settings_location => 'Locatie';
|
||||||
|
|
||||||
@@ -501,14 +434,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
String get settings_advertLocationSubtitle =>
|
String get settings_advertLocationSubtitle =>
|
||||||
'Locatie opnemen in advertentie';
|
'Locatie opnemen in advertentie';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate =>
|
|
||||||
'Automatische zero-hop-advertentie bij GPS-update';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'Wanneer de GPS-locatie verandert, een zero-hop-advertentie verzenden (vereist locatie in advertentie).';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => 'Meerdere bevestigingen';
|
String get settings_multiAck => 'Meerdere bevestigingen';
|
||||||
|
|
||||||
@@ -733,18 +658,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => 'Oekraïens';
|
String get appSettings_languageUk => 'Oekraïens';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing => 'Berichttracking inschakelen';
|
String get appSettings_enableMessageTracing => 'Berichttracking inschakelen';
|
||||||
|
|
||||||
@@ -867,6 +780,11 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
String get appSettings_maxMessageRetriesSubtitle =>
|
String get appSettings_maxMessageRetriesSubtitle =>
|
||||||
'Aantal pogingen om een bericht opnieuw te versturen voordat het als mislukt wordt gemarkeerd';
|
'Aantal pogingen om een bericht opnieuw te versturen voordat het als mislukt wordt gemarkeerd';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => 'Batterij';
|
String get appSettings_battery => 'Batterij';
|
||||||
|
|
||||||
@@ -948,28 +866,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => 'Afgelopen week';
|
String get appSettings_lastWeek => 'Afgelopen week';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => 'Rastertegelbron';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Stadia-eindpunt';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Stadia API-sleutel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired =>
|
|
||||||
'Vereist voor gebruik van Stadia Maps';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return 'Geconfigureerd: $maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'Voer je Stadia Maps API-sleutel in. De app gebruikt die voor rastertegelverzoeken.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => 'Offline Kaartcache';
|
String get appSettings_offlineMapCache => 'Offline Kaartcache';
|
||||||
|
|
||||||
@@ -1089,15 +985,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => 'Nieuwe Groep';
|
String get contacts_newGroup => 'Nieuwe Groep';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => 'Meer opties';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => 'Zoek contactpersonen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => 'Zoeken';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => 'Groepnaam';
|
String get contacts_groupName => 'Groepnaam';
|
||||||
|
|
||||||
@@ -1397,20 +1284,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => 'bijv. #team';
|
String get channels_hashtagHint => 'bijv. #team';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => 'Nog geen berichten.';
|
String get chat_noMessages => 'Nog geen berichten.';
|
||||||
|
|
||||||
@@ -1466,9 +1339,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => 'GIF verzenden';
|
String get chat_sendGif => 'GIF verzenden';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => 'Reageren';
|
String get chat_reply => 'Reageren';
|
||||||
|
|
||||||
@@ -1592,6 +1462,34 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => 'Hex-dump:';
|
String get debugFrame_hexDump => 'Hex-dump:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => 'Beheer van Paden';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => 'Toon alle paden';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => 'Routeerwijze';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => 'Automatisch (gebruik opgeslagen pad)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode => 'Dwing Floodsmodus';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths => 'Recente ACK Paden (tik om te gebruiken):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull =>
|
||||||
|
'De voorgeschiedenis is vol. Verwijder vermeldingen om er nieuwe aan toe te voegen.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => 'Hop';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => 'hoppen';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@@ -1603,6 +1501,12 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
return '$count $_temp0';
|
return '$count $_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => 'Succesvol';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Score';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => 'Pad verwijderen';
|
String get chat_removePath => 'Pad verwijderen';
|
||||||
|
|
||||||
@@ -1610,144 +1514,52 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
String get chat_noPathHistoryYet =>
|
String get chat_noPathHistoryYet =>
|
||||||
'Geen geschiedenis van paden nog beschikbaar.\nVerzend een bericht om paden te ontdekken.';
|
'Geen geschiedenis van paden nog beschikbaar.\nVerzend een bericht om paden te ontdekken.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => 'Padacties:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => 'Stel aangepaste pad in';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle => 'Handmatig routepad specificeren';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => 'Duidelijke Pad';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle =>
|
||||||
|
'Dwing herontdekking bij volgende verzending';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared =>
|
String get chat_pathCleared =>
|
||||||
'Pad is vrijgegeven. Volgende bericht herontdekt route.';
|
'Pad is vrijgegeven. Volgende bericht herontdekt route.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle =>
|
||||||
|
'Gebruik de route-schakelaar in de app-balk';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled =>
|
||||||
|
'Floodmodus is ingeschakeld. Schakel dit uit via het route-icoon in de app-balk.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => 'Volledige Pad';
|
String get chat_fullPath => 'Volledige Pad';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => 'Routeplanning';
|
String get chat_pathDetailsNotAvailable =>
|
||||||
|
'De paddetails zijn nog niet beschikbaar. Probeer een bericht te sturen om te vernieuwen.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => 'Auto';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@override
|
hopCount,
|
||||||
String get routing_modeFlood => 'Overstroming';
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
@override
|
one: 'hop',
|
||||||
String get routing_modeManual => 'Handleiding';
|
);
|
||||||
|
return 'Pad ingesteld: $hopCount $_temp0 - $status';
|
||||||
@override
|
|
||||||
String get routing_modeAutoHint =>
|
|
||||||
'Selecteert automatisch het bekendste pad, en gebruikt een flood-algoritme als er geen bekend pad is.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint =>
|
|
||||||
'Uitzendingen via elke zender. De meest betrouwbare methode, maar vereist meer uitzendtijd.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint =>
|
|
||||||
'Stuurt altijd de exacte route die u heeft aangegeven.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => 'Huidige route';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops => 'Direct – zonder tussenliggende schakels';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet =>
|
|
||||||
'Er is nog geen route gevonden. De berichten blijven binnenkomen totdat een route is ontdekt.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast => 'Uitgestoten via elke zender.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => 'Pad bewerken';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => 'Vergeet het pad';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => 'Bekende routes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint => 'Maak een route om er naartoe te gaan.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => 'In gebruik';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => 'Sterke eerste sprong';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => 'Een goede eerste stap';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => 'Een goede eerste hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => 'Is geleverd';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood => 'Hears via een overstroming';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => 'Niet getest';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return 'worked $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => 'nooit bevestigd';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes zijn behaald, $failures zijn mislukt';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery => 'Levering bij overstroming';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => 'Pad creëren';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count van 64 hopgranen';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'Er zijn nog geen hop toegevoegd. Klik op de onderstaande knoppen om ze in de juiste volgorde toe te voegen, of sla de bestelling op zonder hop om deze direct te versturen.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops => 'Voeg hop toe in de juiste volgorde.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => 'Zoek naar herhaaldelijke zenders';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex => 'Geavanceerd: ruwe hex-pad';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel => 'Hex-voorkanten';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper =>
|
|
||||||
'Twee hex-tekens per stap, gescheiden door komma\'s';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return 'Ongeldig: $tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops => 'Maximaal 64 hopken';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => 'Gebruik deze route.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => 'Verwijder de hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop => 'Onbekend type zender';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally =>
|
String get chat_pathSavedLocally =>
|
||||||
'Opgeslagen lokaal. Verbinden om te synchroniseren.';
|
'Opgeslagen lokaal. Verbinden om te synchroniseren.';
|
||||||
@@ -1823,39 +1635,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => 'Kaart van de knopen';
|
String get map_title => 'Kaart van de knopen';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => 'Zoek op naam of ID van de knoop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => 'Activiteit';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => 'Online';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => 'Recent';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => 'Verouderd';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => 'Zichtbaar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => 'Verborgen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => 'Centreer op node';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => 'Details';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => 'Geen GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => 'Geen overeenkomende nodes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => 'Zichtlijn';
|
String get map_lineOfSight => 'Zichtlijn';
|
||||||
|
|
||||||
@@ -2119,42 +1898,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
return 'Mislukte downloads: $count';
|
return 'Mislukte downloads: $count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2220,6 +1963,17 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
String get dialog_disconnectConfirm =>
|
String get dialog_disconnectConfirm =>
|
||||||
'Ben je er zeker van dat je verbinding met dit apparaat wilt verbreken?';
|
'Ben je er zeker van dat je verbinding met dit apparaat wilt verbreken?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => 'Verbroken';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage =>
|
||||||
|
'Je bent losgekoppeld van je companion.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion =>
|
||||||
|
'Maak verbinding met een companion om repeater- en kamerserverfuncties te gebruiken.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => 'Inloggen Repeater';
|
String get login_repeaterLogin => 'Inloggen Repeater';
|
||||||
|
|
||||||
@@ -2285,12 +2039,65 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => 'Schoonmaken';
|
String get common_clear => 'Schoonmaken';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return 'Huidige pad: $path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
|
one: 'hop',
|
||||||
|
);
|
||||||
|
return 'Gebruik $count $_temp0 pad';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => 'Voer aangepaste pad in';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => 'Huidige pad';
|
String get path_currentPathLabel => 'Huidige pad';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions =>
|
||||||
|
'Voer 2-letter hex-voorgiffen voor elke hop in, gescheiden door komma\'s.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample =>
|
||||||
|
'Voorbeeld: A1,F2,3C (elke node gebruikt het eerste byte van zijn openbare sleutel)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => 'Pad (hex-voorkeursletters)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops =>
|
||||||
|
'Maximaal 64 sprongen. Elke prefix is 2 hexadecimale tekens (1 byte)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => 'Of select contacten:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound => 'Geen repeaters of roomservers gevonden.';
|
String get path_noRepeatersFound => 'Geen repeaters of roomservers gevonden.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire =>
|
||||||
|
'Aangepaste paden vereisen tussentse overstappen die berichten kunnen doorgeven.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return 'Ongeldige hex-voorkeursletters: $prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong =>
|
||||||
|
'Pad is te lang. Maximaal 64 sprongen zijn toegestaan.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => 'Stel Pad in';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => 'Beheer Repeaters';
|
String get repeater_management => 'Beheer Repeaters';
|
||||||
|
|
||||||
@@ -2355,6 +2162,16 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => 'Routeerwijze';
|
String get repeater_routingMode => 'Routeerwijze';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath =>
|
||||||
|
'Automatisch (gebruik opgeslagen pad)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode => 'Dwing Floodmodus Af';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => 'Beheer van paden';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => 'Vernieuwen';
|
String get repeater_refresh => 'Vernieuwen';
|
||||||
|
|
||||||
@@ -2696,42 +2513,7 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'Bytes die gebruikt worden om de ID van deze repeater te coderen in flood-pad/lusdetectietags. 0=1 byte (256 ID\'s, tot 64 hops), 1=2 bytes (65.000 ID\'s, tot 32 hops), 2=3 bytes (16 miljoen ID\'s, tot 21 hops). Firmware vóór v1.14 gebruikte altijd 1-byte paden; v1.14 en nieuwer kunnen worden ingesteld op 2- of 3-byte paden.';
|
'Bytes die gebruikt worden om de ID van deze repeater te coderen in flood-pad/lusdetectietags. 0=1 byte (256 ID\'s, tot 64 hops), 1=2 bytes (65.000 ID\'s, tot 32 hops), 2=3 bytes (16 miljoen ID\'s, tot 21 hops). Versies 1.13 en ouder gebruiken multi-byte paden – alleen na het activeren van het netwerk.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => 'Vertraging bij Flood TX';
|
String get repeater_txDelay => 'Vertraging bij Flood TX';
|
||||||
@@ -3485,139 +3267,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => 'Digitale ingang';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => 'Digitale uitgang';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => 'Analoge ingang';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => 'Analoge uitgang';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => 'Algemene sensor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => 'Lichtsterkte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => 'Aanwezigheid';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => 'Luchtvochtigheid';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => 'Versnellingsmeter';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => 'Druk';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => 'Hoogte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => 'Frequentie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => 'Percentage';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => 'Concentratie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => 'Vermogen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => 'Afstand';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => 'Energie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => 'Richting';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => 'Tijd';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => 'Gyrometer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => 'Kleur';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => 'Schakelaar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => 'Polylijn';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Hz';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa hPa';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux lx';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts W';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours kWh';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => 'Aantal aanvragen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => 'Kan gegevens niet ophalen';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => 'Ontvangen Buurdata';
|
String get neighbors_receivedData => 'Ontvangen Buurdata';
|
||||||
|
|
||||||
@@ -4508,16 +4157,6 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
String get translation_composerSubtitle =>
|
String get translation_composerSubtitle =>
|
||||||
'Stelt de standaardstatus van het pictogram voor de vertaling van de componist in.';
|
'Stelt de standaardstatus van het pictogram voor de vertaling van de componist in.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle => 'Berichten automatisch vertalen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle =>
|
|
||||||
'Vertaalt berichten automatisch voor meldingen en voor chats of kanalen.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => 'Bericht vertalen';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => 'Doeltaal';
|
String get translation_targetLanguage => 'Doeltaal';
|
||||||
|
|
||||||
@@ -4645,136 +4284,4 @@ class AppLocalizationsNl extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Unknown';
|
String get contact_typeUnknown => 'Unknown';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => 'Inzoomen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => 'Inzoomen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => 'Centraal overzicht';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'Web Bluetooth vereist een Chromium-browser.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'ID: $id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => 'GPS-locatie bevestigd';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => 'Afgeleide positie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => 'Enkel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => 'Gezamenlijk';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => 'Afspelen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => 'Pauze';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => 'Herhalen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => 'Vorige hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => 'Volgende hop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => 'Pakketanimatie tonen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => 'Pakketanimatie verbergen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return 'Hop $current van $total';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return 'Waargenomen paden: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => 'Primair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return 'Alternatief $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count hops',
|
|
||||||
one: '1 hop',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => 'Gedeeld segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => 'Geschat segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return 'Gebruikt door $count paden';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other:
|
|
||||||
'$count hops hebben geen locatie — het weergegeven pad is onvolledig',
|
|
||||||
one: '1 hop heeft geen locatie — het weergegeven pad is onvolledig',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => 'Toon alles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => 'Verberg pad';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => 'Toon pad';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => 'Paneel inklappen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => 'Paneel uitklappen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => 'Geen locatie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => 'Weergave vergrendelen op pakket';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => 'Weergave ontgrendelen van pakket';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,24 +92,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => 'Wyłącz';
|
String get common_disable => 'Wyłącz';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => 'Wycofaj';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => 'Wysłane';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => 'Dostarczone';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => 'Wysyłanie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed => 'Nie udało się wysłać';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => 'Usłyszałem to wielokrotnie';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => 'Uruchom ponownie';
|
String get common_reboot => 'Uruchom ponownie';
|
||||||
|
|
||||||
@@ -129,12 +111,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
return '$percent%';
|
return '$percent%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => 'Automatyczne odświeżanie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => 'Interwał';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => 'MeshCore – wersja open source';
|
String get scanner_title => 'MeshCore – wersja open source';
|
||||||
|
|
||||||
@@ -322,10 +298,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => 'Włącz Bluetooth';
|
String get scanner_enableBluetooth => 'Włącz Bluetooth';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported =>
|
|
||||||
'Bluetooth nie jest dostępny w przeglądarce. Połącz się przez USB.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => 'Szybka zmiana';
|
String get device_quickSwitch => 'Szybka zmiana';
|
||||||
|
|
||||||
@@ -371,45 +343,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
String get settings_radioSettingsUpdated =>
|
String get settings_radioSettingsUpdated =>
|
||||||
'Ustawienia radia zostały zaktualizowane';
|
'Ustawienia radia zostały zaktualizowane';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => 'Lokalizacja';
|
String get settings_location => 'Lokalizacja';
|
||||||
|
|
||||||
@@ -508,14 +441,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
String get settings_advertLocationSubtitle =>
|
String get settings_advertLocationSubtitle =>
|
||||||
'Uwzględnij lokalizację w ogłoszeniu';
|
'Uwzględnij lokalizację w ogłoszeniu';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate =>
|
|
||||||
'Automatyczne ogłoszenie zero-hop przy aktualizacji GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'Gdy lokalizacja GPS się zmieni, wyślij ogłoszenie zero-hop (wymaga lokalizacji w ogłoszeniu).';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => 'Wielokrotne potwierdzenia odbioru';
|
String get settings_multiAck => 'Wielokrotne potwierdzenia odbioru';
|
||||||
|
|
||||||
@@ -742,18 +667,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => 'Ukraińska';
|
String get appSettings_languageUk => 'Ukraińska';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing => 'Włącz śledzenie wiadomości';
|
String get appSettings_enableMessageTracing => 'Włącz śledzenie wiadomości';
|
||||||
|
|
||||||
@@ -877,6 +790,11 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
String get appSettings_maxMessageRetriesSubtitle =>
|
String get appSettings_maxMessageRetriesSubtitle =>
|
||||||
'Liczba prób ponownego wysłania wiadomości przed oznaczaniem jej jako nieudanej';
|
'Liczba prób ponownego wysłania wiadomości przed oznaczaniem jej jako nieudanej';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => 'Bateria';
|
String get appSettings_battery => 'Bateria';
|
||||||
|
|
||||||
@@ -957,28 +875,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => 'Ostatni tydzień';
|
String get appSettings_lastWeek => 'Ostatni tydzień';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => 'Źródło kafelków rastrowych';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Punkt końcowy Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Klucz API Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired =>
|
|
||||||
'Wymagane do korzystania ze Stadia Maps';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return 'Skonfigurowano: $maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'Wprowadź swój klucz API Stadia Maps. Aplikacja używa go do żądań kafelków rastrowych.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => 'Pamięć podręczna map offline';
|
String get appSettings_offlineMapCache => 'Pamięć podręczna map offline';
|
||||||
|
|
||||||
@@ -1107,15 +1003,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => 'Nowa Grupa';
|
String get contacts_newGroup => 'Nowa Grupa';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => 'Więcej opcji';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => 'Wyszukaj kontakty';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => 'Zaawansowane wyszukiwanie';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => 'Nazwa grupy';
|
String get contacts_groupName => 'Nazwa grupy';
|
||||||
|
|
||||||
@@ -1419,20 +1306,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => 'np. #zespół';
|
String get channels_hashtagHint => 'np. #zespół';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => 'Brak jeszcze wiadomości';
|
String get chat_noMessages => 'Brak jeszcze wiadomości';
|
||||||
|
|
||||||
@@ -1489,9 +1362,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => 'Wyślij GIF';
|
String get chat_sendGif => 'Wyślij GIF';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => 'Odpowiedz';
|
String get chat_reply => 'Odpowiedz';
|
||||||
|
|
||||||
@@ -1615,6 +1485,35 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => 'Zrzut hex:';
|
String get debugFrame_hexDump => 'Zrzut hex:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => 'Zarządzanie ścieżkami';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => 'Pokaż wszystkie ścieżki';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => 'Tryb routingu';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => 'Automatyczne (użyj zapisanej ścieżki)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode => 'Wymuś tryb zalewowy';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths =>
|
||||||
|
'Ostatnie ścieżki ACK (naciśnij, aby użyć):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull =>
|
||||||
|
'Historia ścieżek jest pełna. Usuń wpisy, aby dodać nowe.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => 'skok';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => 'skoki';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@@ -1628,6 +1527,12 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
return '$count $_temp0';
|
return '$count $_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => 'Sukcesy';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Score';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => 'Usuń ścieżkę';
|
String get chat_removePath => 'Usuń ścieżkę';
|
||||||
|
|
||||||
@@ -1635,148 +1540,52 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
String get chat_noPathHistoryYet =>
|
String get chat_noPathHistoryYet =>
|
||||||
'Brak historii ścieżek.\nWyślij wiadomość, aby odkryć ścieżki.';
|
'Brak historii ścieżek.\nWyślij wiadomość, aby odkryć ścieżki.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => 'Działania ścieżki:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => 'Ustaw ścieżkę niestandardową';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle => 'Ręcznie określ trasę.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => 'Wyczyść Ścieżkę';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle =>
|
||||||
|
'Wymuś ponowne wyznaczenie trasy przy następnym wysłaniu';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared =>
|
String get chat_pathCleared =>
|
||||||
'Ścieżka wyczyszczona. Następna wiadomość odnajdzie trasę.';
|
'Ścieżka wyczyszczona. Następna wiadomość odnajdzie trasę.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle =>
|
||||||
|
'Użyj przełącznika routingu w pasku narzędzi.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled =>
|
||||||
|
'Tryb zalewowy włączony. Przełącz z powrotem ikoną routingu w pasku aplikacji.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => 'Pełna ścieżka';
|
String get chat_fullPath => 'Pełna ścieżka';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => 'Planowanie tras';
|
String get chat_pathDetailsNotAvailable =>
|
||||||
|
'Szczegóły ścieżki jeszcze niedostępne. Spróbuj wysłać wiadomość, aby odświeżyć.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => 'Samochód';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@override
|
hopCount,
|
||||||
String get routing_modeFlood => 'Powódź';
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
@override
|
one: 'hop',
|
||||||
String get routing_modeManual => 'Instrukcja obsługi';
|
);
|
||||||
|
return 'Ścieżka ustawiona: $hopCount $_temp0 - $status';
|
||||||
@override
|
|
||||||
String get routing_modeAutoHint =>
|
|
||||||
'Automatycznie wybiera najpopularniejszą ścieżkę, a w przypadku braku znanej, przechodzi do trybu \"przepływu\".';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint =>
|
|
||||||
'Transmisje za pośrednictwem każdego repeatera. Najbardziej niezawodna metoda, ale zużywa więcej czasu transmisji.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint =>
|
|
||||||
'Zawsze prowadzi dokładnie po trasie, którą określiłeś.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => 'Obecna trasa';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops =>
|
|
||||||
'Bezpośrednio – bez pośrednictwa repeaterów';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet =>
|
|
||||||
'Na razie nie ma żadnej ścieżki. Komunikacja trwa do momentu, gdy zostanie odkryta trasa.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast =>
|
|
||||||
'Transmisja za pośrednictwem każdego urządzenia powielającego';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => 'Edytuj ścieżkę';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => 'Zapomnij o ścieżce';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => 'Znane trasy';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint =>
|
|
||||||
'Wybierz ścieżkę, aby przełączyć się na nią.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => 'W użyciu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => 'Silny pierwszy skok';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => 'Świetny początek';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => 'Świetny pierwszy krzak';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => 'Zostało dostarczone';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood => 'Usłyszano dzięki doniesieniom';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => 'Nieużywany';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return 'pracował $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => 'nigdy nie zostało potwierdzone';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes delivered, $failures failed';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery => 'Dostawa w przypadku powodzi';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => 'Stworzenie ścieżki';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count z 64 rodzajów chmielu';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'Na razie nie dodano żadnych chmielu. Aby dodać je w odpowiedniej kolejności, kliknij w odpowiednie przyciski poniżej, lub zapisz przepis bez chmielu, aby wysłać go bezpośrednio.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops => 'Dodawaj chmiel zgodnie z kolejnością.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => 'Funkcje powtarzania';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex =>
|
|
||||||
'Zaawansowane: ścieżka w formacie szesnastkowym';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel => 'Prefiksy heksadecymalne';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper =>
|
|
||||||
'Dwa znaki szesnastkowe na każdym kroku, oddzielone przecinkami';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return 'Nieprawidłowe: $tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops => 'Maksymalnie 64 hopów';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => 'Użyj tej ścieżki.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => 'Usuń dziką psiankę';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop => 'Nieznany repeater';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally =>
|
String get chat_pathSavedLocally =>
|
||||||
'Zapisano lokalnie. Połącz się, aby zsynchronizować.';
|
'Zapisano lokalnie. Połącz się, aby zsynchronizować.';
|
||||||
@@ -1852,39 +1661,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => 'Mapa węzłów';
|
String get map_title => 'Mapa węzłów';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => 'Wyszukaj nazwę lub identyfikator węzła';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => 'Aktywność';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => 'Online';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => 'Ostatnie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => 'Nieaktualne';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => 'Widoczny';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => 'Ukryty';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => 'Wyśrodkuj na węźle';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => 'Szczegóły';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => 'Brak GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => 'Brak pasujących węzłów';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => 'Linia wzroku';
|
String get map_lineOfSight => 'Linia wzroku';
|
||||||
|
|
||||||
@@ -2149,42 +1925,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
return 'Nieudane pobrania: $count';
|
return 'Nieudane pobrania: $count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2250,6 +1990,17 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
String get dialog_disconnectConfirm =>
|
String get dialog_disconnectConfirm =>
|
||||||
'Czy na pewno chcesz się odłączyć od tego urządzenia?';
|
'Czy na pewno chcesz się odłączyć od tego urządzenia?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => 'Rozłączono';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage =>
|
||||||
|
'Zostałeś rozłączony ze swoim towarzyszem.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion =>
|
||||||
|
'Połącz się z towarzyszem, aby uzyskać dostęp do funkcji powtarzacza i serwera pokoi.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => 'Logowanie do przekaźnika';
|
String get login_repeaterLogin => 'Logowanie do przekaźnika';
|
||||||
|
|
||||||
@@ -2315,13 +2066,68 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => 'Wyczyść';
|
String get common_clear => 'Wyczyść';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return 'Aktualna ścieżka: $path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: 'skoków',
|
||||||
|
many: 'skoków',
|
||||||
|
few: 'skoki',
|
||||||
|
one: 'skok',
|
||||||
|
);
|
||||||
|
return 'Użyj ścieżki $count $_temp0.';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => 'Wprowadź własną ścieżkę';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => 'Aktualna ścieżka';
|
String get path_currentPathLabel => 'Aktualna ścieżka';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions =>
|
||||||
|
'Wprowadź 2-znakowe prefiksy szesnastkowe dla każdego skoku, oddzielone przecinkami.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample =>
|
||||||
|
'A1,F2,3C (każdy węzeł używa pierwszego bajtu swojego klucza publicznego)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => 'Ścieżka (prefiksy hex)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops =>
|
||||||
|
'Maksymalnie 64 skoki. Każdy prefiks ma 2 znaki szesnastkowe (1 bajt).';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => 'Albo wybierz z kontaktów:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound =>
|
String get path_noRepeatersFound =>
|
||||||
'Nie znaleziono przekaźników ani serwerów pokoi.';
|
'Nie znaleziono przekaźników ani serwerów pokoi.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire =>
|
||||||
|
'Dostosowane ścieżki wymagają pośrednich skoków, które mogą przekazywać wiadomości.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return 'Nieprawidłowe prefiksy szesnastkowe: $prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong =>
|
||||||
|
'Ścieżka jest zbyt długa. Dozwolonych skoków wynosi 64.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => 'Ustaw Ścieżkę';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => 'Zarządzanie przekaźnikami';
|
String get repeater_management => 'Zarządzanie przekaźnikami';
|
||||||
|
|
||||||
@@ -2386,6 +2192,16 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => 'Tryb routingu';
|
String get repeater_routingMode => 'Tryb routingu';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath =>
|
||||||
|
'Automatycznie (użyj zapisanej ścieżki)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode => 'Wymuś tryb zalewowy';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => 'Zarządzanie ścieżkami';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => 'Odśwież';
|
String get repeater_refresh => 'Odśwież';
|
||||||
|
|
||||||
@@ -2729,42 +2545,7 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'Bajty używane do kodowania identyfikatora tego repeatera w tagach ścieżki flood/wykrywania pętli. 0=1 bajt (256 identyfikatorów, do 64 skoków), 1=2 bajty (65 000 identyfikatorów, do 32 skoków), 2=3 bajty (16 milionów identyfikatorów, do 21 skoków). Firmware sprzed v1.14 zawsze używał ścieżek 1-bajtowych; v1.14 i nowsze można skonfigurować na ścieżki 2- lub 3-bajtowe.';
|
'Bity wykorzystywane do kodowania identyfikatora tego urządzenia w tagach ścieżek/detekcji pętli. 0=1 bity (256 identyfikatorów, do 64 skoków), 1=2 bity (65 000 identyfikatorów, do 32 skoków), 2=3 bity (1 600 000 identyfikatorów, do 21 skoków). Wersje 1.13 i wcześniejsze nie obsługują ścieżek wielobitowych – wykrywają tylko jedną, gdy sieć jest w wersji 1.14 lub nowszej.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => 'Opóźnienie w Flood, TX';
|
String get repeater_txDelay => 'Opóźnienie w Flood, TX';
|
||||||
@@ -3518,139 +3299,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => 'Wejście cyfrowe';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => 'Wyjście cyfrowe';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => 'Wejście analogowe';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => 'Wyjście analogowe';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => 'Czujnik ogólny';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => 'Jasność';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => 'Obecność';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => 'Wilgotność';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => 'Akcelerometr';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => 'Ciśnienie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => 'Wysokość';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => 'Częstotliwość';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => 'Procent';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => 'Stężenie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => 'Moc';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => 'Odległość';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => 'Energia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => 'Kierunek';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => 'Czas';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => 'Żyrometr';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => 'Kolor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => 'Przełącznik';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => 'Polilinia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Hz';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa hPa';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux lx';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts W';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours kWh';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => 'Liczba żądań';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => 'Nie udało się pobrać danych';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => 'Otrzymano dane sąsiedztwa';
|
String get neighbors_receivedData => 'Otrzymano dane sąsiedztwa';
|
||||||
|
|
||||||
@@ -4547,17 +4195,6 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
String get translation_composerSubtitle =>
|
String get translation_composerSubtitle =>
|
||||||
'Kontroluje domyślny stan ikony tłumaczenia w edytorze.';
|
'Kontroluje domyślny stan ikony tłumaczenia w edytorze.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle =>
|
|
||||||
'Automatycznie tłumacz wiadomości';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle =>
|
|
||||||
'Automatycznie tłumaczy wiadomości do powiadomień oraz do czatów lub kanałów.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => 'Przetłumacz wiadomość';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => 'Język docelowy';
|
String get translation_targetLanguage => 'Język docelowy';
|
||||||
|
|
||||||
@@ -4683,142 +4320,4 @@ class AppLocalizationsPl extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Unknown';
|
String get contact_typeUnknown => 'Unknown';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => 'Przybliż';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => 'Przybliż z powrotem';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => 'Mapa centrum';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'Web Bluetooth wymaga przeglądarki Chromium.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'ID: $id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => 'GPS potwierdzone';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => 'Wywnioskowana pozycja';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => 'Pojedyncza';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => 'Połączone';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => 'Odtwórz';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => 'Wstrzymaj';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => 'Odtwórz ponownie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => 'Poprzedni skok';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => 'Następny skok';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => 'Pokaż animację pakietu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => 'Ukryj animację pakietu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return 'Skok $current z $total';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return 'Obserwowane trasy: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => 'Główna';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return 'Alt. $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count skoku',
|
|
||||||
many: '$count skoków',
|
|
||||||
few: '$count skoki',
|
|
||||||
one: '1 skok',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => 'Wspólny segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => 'Szacunkowy segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return 'Wykorzystywane przez $count ścieżek';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other:
|
|
||||||
'$count skoku nie ma lokalizacji — pokazana ścieżka jest niekompletna',
|
|
||||||
many:
|
|
||||||
'$count skoków nie ma lokalizacji — pokazana ścieżka jest niekompletna',
|
|
||||||
few:
|
|
||||||
'$count skoki nie mają lokalizacji — pokazana ścieżka jest niekompletna',
|
|
||||||
one: '1 skok nie ma lokalizacji — pokazana ścieżka jest niekompletna',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => 'Pokaż wszystkie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => 'Ukryj ścieżkę';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => 'Wyświetl trasę';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => 'Zwiń panel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => 'Rozwiń panel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => 'Brak lokalizacji';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => 'Śledź pakiet';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => 'Przestań śledzić pakiet';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,24 +92,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => 'Desativar';
|
String get common_disable => 'Desativar';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => 'Desfazer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => 'Enviado';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => 'Entregue';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => 'Enviar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed => 'Falhou ao enviar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => 'Ouvi repetidamente';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => 'Reiniciar';
|
String get common_reboot => 'Reiniciar';
|
||||||
|
|
||||||
@@ -129,12 +111,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
return '$percent%';
|
return '$percent%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => 'Atualização automática';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => 'Intervalo';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => 'MeshCore: Versão aberta';
|
String get scanner_title => 'MeshCore: Versão aberta';
|
||||||
|
|
||||||
@@ -320,10 +296,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => 'Ative o Bluetooth';
|
String get scanner_enableBluetooth => 'Ative o Bluetooth';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported =>
|
|
||||||
'A funcionalidade Bluetooth não está disponível no navegador. Conecte-se via USB em vez disso.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => 'Mudar rapidamente';
|
String get device_quickSwitch => 'Mudar rapidamente';
|
||||||
|
|
||||||
@@ -369,45 +341,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
String get settings_radioSettingsUpdated =>
|
String get settings_radioSettingsUpdated =>
|
||||||
'Configurações de rádio atualizadas';
|
'Configurações de rádio atualizadas';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => 'Localização';
|
String get settings_location => 'Localização';
|
||||||
|
|
||||||
@@ -505,14 +438,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
String get settings_advertLocationSubtitle =>
|
String get settings_advertLocationSubtitle =>
|
||||||
'Incluir localização no anúncio';
|
'Incluir localização no anúncio';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate =>
|
|
||||||
'Anúncio zero-hop automático na atualização do GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'Quando a localização GPS mudar, enviar um anúncio zero-hop (requer localização no anúncio).';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => 'Multi-ACKs';
|
String get settings_multiAck => 'Multi-ACKs';
|
||||||
|
|
||||||
@@ -739,18 +664,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => 'Ucraniano';
|
String get appSettings_languageUk => 'Ucraniano';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing =>
|
String get appSettings_enableMessageTracing =>
|
||||||
'Ativar rastreamento de mensagens';
|
'Ativar rastreamento de mensagens';
|
||||||
@@ -874,6 +787,11 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
String get appSettings_maxMessageRetriesSubtitle =>
|
String get appSettings_maxMessageRetriesSubtitle =>
|
||||||
'Número de tentativas de reenvio antes de classificar uma mensagem como falha.';
|
'Número de tentativas de reenvio antes de classificar uma mensagem como falha.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => 'Bateria';
|
String get appSettings_battery => 'Bateria';
|
||||||
|
|
||||||
@@ -954,28 +872,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => 'Da última semana';
|
String get appSettings_lastWeek => 'Da última semana';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => 'Fonte de blocos raster';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Endpoint da Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Chave da API Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired =>
|
|
||||||
'Obrigatório para usar o Stadia Maps';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return 'Configurado: $maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'Insira sua chave da API Stadia Maps. O aplicativo a usa para solicitações de blocos raster.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => 'Cache de Mapa Offline';
|
String get appSettings_offlineMapCache => 'Cache de Mapa Offline';
|
||||||
|
|
||||||
@@ -1097,15 +993,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => 'Novo Grupo';
|
String get contacts_newGroup => 'Novo Grupo';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => 'Mais opções';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => 'Pesquisar contatos';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => 'Pesquisa avançada';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => 'Nome do grupo';
|
String get contacts_groupName => 'Nome do grupo';
|
||||||
|
|
||||||
@@ -1407,20 +1294,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => 'ex. #equipe';
|
String get channels_hashtagHint => 'ex. #equipe';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => 'Ainda não existem mensagens.';
|
String get chat_noMessages => 'Ainda não existem mensagens.';
|
||||||
|
|
||||||
@@ -1476,9 +1349,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => 'Enviar GIF';
|
String get chat_sendGif => 'Enviar GIF';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => 'Responder';
|
String get chat_reply => 'Responder';
|
||||||
|
|
||||||
@@ -1602,6 +1472,34 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => 'Espaço Hexadecimal:';
|
String get debugFrame_hexDump => 'Espaço Hexadecimal:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => 'Gerenciamento de Caminhos';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => 'Mostrar todos os caminhos';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => 'Modo de roteamento';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => 'Auto (usar caminho salvo)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode => 'Modo de Inundação Forçado';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths => 'Rotas de ACK Recentes (toque para usar):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull =>
|
||||||
|
'O histórico está cheio. Remova entradas para adicionar novas.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => 'pule';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => 'salta';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@@ -1613,6 +1511,12 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
return '$count $_temp0';
|
return '$count $_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => 'Sucessos';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Score';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => 'Remover caminho';
|
String get chat_removePath => 'Remover caminho';
|
||||||
|
|
||||||
@@ -1620,148 +1524,53 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
String get chat_noPathHistoryYet =>
|
String get chat_noPathHistoryYet =>
|
||||||
'Ainda não há histórico de caminhos.\nEnvie uma mensagem para descobrir caminhos.';
|
'Ainda não há histórico de caminhos.\nEnvie uma mensagem para descobrir caminhos.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => 'Ações do Caminho:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => 'Definir Caminho Personalizado';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle =>
|
||||||
|
'Especifique manualmente o caminho de roteamento';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => 'Limpar Caminho';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle =>
|
||||||
|
'Forçar a descoberta na próxima transmissão';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared =>
|
String get chat_pathCleared =>
|
||||||
'Caminho limpo. A próxima mensagem redescobrirá a rota.';
|
'Caminho limpo. A próxima mensagem redescobrirá a rota.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle =>
|
||||||
|
'Use a chave de roteamento na barra de ferramentas';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled =>
|
||||||
|
'Modo de inundação ativado. Desative-o novamente através do ícone de roteamento na barra de ferramentas.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => 'Caminho Completo';
|
String get chat_fullPath => 'Caminho Completo';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => 'Rotas';
|
String get chat_pathDetailsNotAvailable =>
|
||||||
|
'Os detalhes do caminho ainda não estão disponíveis. Tente enviar uma mensagem para atualizar.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => 'Carro';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@override
|
hopCount,
|
||||||
String get routing_modeFlood => 'Inundação';
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
@override
|
one: 'hop',
|
||||||
String get routing_modeManual => 'Manual';
|
);
|
||||||
|
return 'Caminho definido: $hopCount $_temp0 - $status';
|
||||||
@override
|
|
||||||
String get routing_modeAutoHint =>
|
|
||||||
'Seleciona automaticamente o caminho mais conhecido, e, se nenhum caminho conhecido for encontrado, utiliza a estratégia de \"inundação\".';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint =>
|
|
||||||
'Transmissão através de todos os repetidores. É a opção mais confiável, mas utiliza mais tempo de transmissão.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint =>
|
|
||||||
'Sempre segue exatamente o caminho que você define.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => 'Rota atual';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops => 'Direto – sem saltos de repetidor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet =>
|
|
||||||
'Ainda não há um caminho definido. A mensagem continua a ser enviada até que uma rota seja encontrada.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast =>
|
|
||||||
'Transmissão através de todos os repetidores';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => 'Editar caminho';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => 'Esqueça o caminho';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => 'Rotas conhecidas';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint =>
|
|
||||||
'Toque em um caminho para alternar para ele.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => 'Em uso';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => 'Primeiro salto notável';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => 'Primeiro salto bem-sucedido';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => 'Primeira etapa bem-sucedida';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => 'Foi entregue';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood =>
|
|
||||||
'Informação obtida através de relatos generalizados.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => 'Não testado';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return 'worked $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => 'nunca confirmado';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes delivered, $failures failed';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery =>
|
|
||||||
'Entrega em áreas afetadas por inundações';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => 'Criar Caminho';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count de 64 gramas de lúpulo';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'Ainda não há lúpulos adicionados. Clique nos repetidores abaixo para adicioná-los na ordem desejada, ou salve sem adicionar lúpulos para enviar diretamente.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops => 'Adicione os lúpulos na seguinte ordem.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => 'Encontrar repetidores';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex => 'Avançado: caminho hexadecimal bruto';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel => 'Prefixos hexadecimais';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper =>
|
|
||||||
'Dois caracteres hexadecimais por salto, separados por vírgulas.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return 'Inválido: $tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops => 'Máximo de 64 saltos';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => 'Utilize este caminho.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => 'Remova o lúpulo';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop => 'Repetidor desconhecido';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally =>
|
String get chat_pathSavedLocally =>
|
||||||
'Salvo localmente. Conectar para sincronizar.';
|
'Salvo localmente. Conectar para sincronizar.';
|
||||||
@@ -1836,39 +1645,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => 'Mapa de Nós';
|
String get map_title => 'Mapa de Nós';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => 'Pesquisar por nome ou ID do nó';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => 'Atividade';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => 'Online';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => 'Recente';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => 'Vencido';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => 'Visível';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => 'Escondido';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => 'Centralizar no nó';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => 'Detalhes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => 'Sem GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => 'Nenhum nó encontrado';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => 'Linha de visão';
|
String get map_lineOfSight => 'Linha de visão';
|
||||||
|
|
||||||
@@ -2132,42 +1908,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
return 'Downloads falhas: $count';
|
return 'Downloads falhas: $count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2233,6 +1973,17 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
String get dialog_disconnectConfirm =>
|
String get dialog_disconnectConfirm =>
|
||||||
'Tem certeza de que deseja desconectar deste dispositivo?';
|
'Tem certeza de que deseja desconectar deste dispositivo?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => 'Desconectado';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage =>
|
||||||
|
'Você foi desconectado do seu companheiro.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion =>
|
||||||
|
'Conecte-se a um dispositivo companion para acessar as funcionalidades de repetidor e servidor de salas.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => 'Login ao Repetidor';
|
String get login_repeaterLogin => 'Login ao Repetidor';
|
||||||
|
|
||||||
@@ -2298,13 +2049,66 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => 'Limpar';
|
String get common_clear => 'Limpar';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return 'Caminho atual: $path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
|
one: 'hop',
|
||||||
|
);
|
||||||
|
return 'Usando $count $_temp0 caminho';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => 'Insira Caminho Personalizado';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => 'Caminho atual';
|
String get path_currentPathLabel => 'Caminho atual';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions =>
|
||||||
|
'Insira os prefixos hexadecimais de 2 caracteres para cada salto, separados por vírgulas.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample =>
|
||||||
|
'A1,F2,3C (cada nó usa o primeiro byte de sua chave pública)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => 'Prefixo Hexadecimal';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops =>
|
||||||
|
'Máximo de 64 saltos. Cada prefixo tem 2 caracteres hexadecimais (1 byte)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => 'Ou selecione de contatos:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound =>
|
String get path_noRepeatersFound =>
|
||||||
'Não foram encontrados repetidores ou servidores de sala.';
|
'Não foram encontrados repetidores ou servidores de sala.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire =>
|
||||||
|
'Caminhos personalizados exigem saltos intermediários que podem transmitir mensagens.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return 'Prefixos hexadecimais inválidos: $prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong =>
|
||||||
|
'Caminho muito longo. Máximo de 64 saltos permitidos.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => 'Definir Caminho';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => 'Gerenciamento de Repetidor';
|
String get repeater_management => 'Gerenciamento de Repetidor';
|
||||||
|
|
||||||
@@ -2369,6 +2173,15 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => 'Modo de roteamento';
|
String get repeater_routingMode => 'Modo de roteamento';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath => 'Auto (usar caminho salvo)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode => 'Modo de Inundação Forçado';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => 'Gerenciamento de caminhos';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => 'Atualizar';
|
String get repeater_refresh => 'Atualizar';
|
||||||
|
|
||||||
@@ -2714,42 +2527,7 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'Bytes usados para codificar o ID deste repetidor nas tags de caminho flood/detecção de loop. 0=1 byte (256 IDs, até 64 saltos), 1=2 bytes (65.000 IDs, até 32 saltos), 2=3 bytes (16 milhões de IDs, até 21 saltos). O firmware anterior à v1.14 sempre usava caminhos de 1 byte; v1.14 e versões mais recentes podem ser configuradas para caminhos de 2 ou 3 bytes.';
|
'Bytes utilizados para codificar o ID deste repetidor nas tags de caminho/detecção de loop. 0=1 byte (256 IDs, até 64 saltos), 1=2 bytes (65.000 IDs, até 32 saltos), 2=3 bytes (16 milhões de IDs, até 21 saltos). As versões 1.13 e anteriores do firmware não suportam caminhos multi-byte — apenas funcionam uma vez após a ativação da rede (a partir da versão 1.14+).';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => 'Atraso na entrega em Flood, TX';
|
String get repeater_txDelay => 'Atraso na entrega em Flood, TX';
|
||||||
@@ -3502,139 +3280,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => 'Entrada digital';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => 'Saída digital';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => 'Entrada analógica';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => 'Saída analógica';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => 'Sensor genérico';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => 'Luminosidade';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => 'Presença';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => 'Humidade';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => 'Acelerómetro';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => 'Pressão';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => 'Altitude';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => 'Frequência';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => 'Percentagem';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => 'Concentração';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => 'Potência';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => 'Distância';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => 'Energia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => 'Direção';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => 'Hora';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => 'Girómetro';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => 'Cor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => 'Interruptor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => 'Polilinha';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Hz';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa hPa';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux lx';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts W';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours kWh';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => 'Número de solicitações';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => 'Não foi possível obter os dados';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => 'Dados dos Vizinhos Recebidos';
|
String get neighbors_receivedData => 'Dados dos Vizinhos Recebidos';
|
||||||
|
|
||||||
@@ -4525,17 +4170,6 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
String get translation_composerSubtitle =>
|
String get translation_composerSubtitle =>
|
||||||
'Controla o estado padrão do ícone de tradução do compositor.';
|
'Controla o estado padrão do ícone de tradução do compositor.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle =>
|
|
||||||
'Traduzir mensagens automaticamente';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle =>
|
|
||||||
'Traduz automaticamente mensagens para notificações e para chats ou canais.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => 'Traduzir mensagem';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => 'Língua-alvo';
|
String get translation_targetLanguage => 'Língua-alvo';
|
||||||
|
|
||||||
@@ -4662,135 +4296,4 @@ class AppLocalizationsPt extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Unknown';
|
String get contact_typeUnknown => 'Unknown';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => 'Ampliar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => 'Ampliar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => 'Mapa do centro';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'O Web Bluetooth requer um navegador Chromium.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'ID: $id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => 'GPS confirmado';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => 'Posição inferida';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => 'Único';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => 'Combinado';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => 'Reproduzir';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => 'Pausa';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => 'Repetir';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => 'Salto anterior';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => 'Próximo salto';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => 'Exibir animação do pacote';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => 'Ocultar a animação do pacote';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return 'Salto $current de $total';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return 'Caminhos observados: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => 'Primário';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return 'Alt $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count saltos',
|
|
||||||
one: '1 salto',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => 'Segmento compartilhado';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => 'Segmento estimado';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return 'Utilizado em $count caminhos';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count saltos não têm localização — o caminho mostrado é parcial',
|
|
||||||
one: '1 salto não tem localização — o caminho mostrado é parcial',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => 'Mostrar tudo';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => 'Esconder caminho';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => 'Mostrar o caminho';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => 'Recolher painel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => 'Expandir painel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => 'Sem localização';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => 'Fixar vista no pacote';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => 'Liberar vista do pacote';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,24 +92,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => 'Выключить';
|
String get common_disable => 'Выключить';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => 'Отменить';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => 'Отправлено';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => 'Доставлено';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => 'Отправка';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed => 'Не удалось отправить';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => 'Услышал несколько раз';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => 'Перезагрузить';
|
String get common_reboot => 'Перезагрузить';
|
||||||
|
|
||||||
@@ -129,12 +111,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
return '$percent%';
|
return '$percent%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => 'Автообновление';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => 'Интервал';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => 'MeshCore Open';
|
String get scanner_title => 'MeshCore Open';
|
||||||
|
|
||||||
@@ -320,10 +296,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => 'Включите Bluetooth';
|
String get scanner_enableBluetooth => 'Включите Bluetooth';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported =>
|
|
||||||
'Bluetooth недоступен в браузере. Подключитесь через USB.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => 'Быстрое переключение';
|
String get device_quickSwitch => 'Быстрое переключение';
|
||||||
|
|
||||||
@@ -368,45 +340,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_radioSettingsUpdated => 'Настройки радио обновлены';
|
String get settings_radioSettingsUpdated => 'Настройки радио обновлены';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => 'Позиция';
|
String get settings_location => 'Позиция';
|
||||||
|
|
||||||
@@ -505,14 +438,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
String get settings_advertLocationSubtitle =>
|
String get settings_advertLocationSubtitle =>
|
||||||
'Включить местоположение в объявление';
|
'Включить местоположение в объявление';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate =>
|
|
||||||
'Авто-объявление без хопов при обновлении GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'Когда GPS-местоположение меняется, отправлять объявление без хопов (требуется геопозиция в объявлении).';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => 'Несколько подтверждений';
|
String get settings_multiAck => 'Несколько подтверждений';
|
||||||
|
|
||||||
@@ -739,18 +664,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => 'Українська';
|
String get appSettings_languageUk => 'Українська';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing =>
|
String get appSettings_enableMessageTracing =>
|
||||||
'Включить трассировку сообщений';
|
'Включить трассировку сообщений';
|
||||||
@@ -876,6 +789,11 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
String get appSettings_maxMessageRetriesSubtitle =>
|
String get appSettings_maxMessageRetriesSubtitle =>
|
||||||
'Количество попыток повторной отправки сообщения перед тем, как пометить его как неудачное.';
|
'Количество попыток повторной отправки сообщения перед тем, как пометить его как неудачное.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => 'Батарея';
|
String get appSettings_battery => 'Батарея';
|
||||||
|
|
||||||
@@ -957,28 +875,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => 'Последнюю неделю';
|
String get appSettings_lastWeek => 'Последнюю неделю';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => 'Источник растровых тайлов';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Конечная точка Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Ключ API Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired =>
|
|
||||||
'Требуется для использования Stadia Maps';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return 'Настроено: $maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'Введите свой ключ API Stadia Maps. Приложение использует его для запросов растровых тайлов.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => 'Кэш офлайн-карты';
|
String get appSettings_offlineMapCache => 'Кэш офлайн-карты';
|
||||||
|
|
||||||
@@ -1098,15 +994,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => 'Новая группа';
|
String get contacts_newGroup => 'Новая группа';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => 'Больше вариантов';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => 'Найти контакты';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => 'Закрыть поиск';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => 'Имя группы';
|
String get contacts_groupName => 'Имя группы';
|
||||||
|
|
||||||
@@ -1408,20 +1295,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => 'например, #команда';
|
String get channels_hashtagHint => 'например, #команда';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => 'Сообщений пока нет';
|
String get chat_noMessages => 'Сообщений пока нет';
|
||||||
|
|
||||||
@@ -1477,9 +1350,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => 'Отправить GIF';
|
String get chat_sendGif => 'Отправить GIF';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => 'Ответить';
|
String get chat_reply => 'Ответить';
|
||||||
|
|
||||||
@@ -1603,6 +1473,35 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => 'Шестнадцатеричный дамп:';
|
String get debugFrame_hexDump => 'Шестнадцатеричный дамп:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => 'Управление маршрутами';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => 'Показать все пути';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => 'Режим маршрутизации';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => 'Авто (использовать сохранённый маршрут)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode => 'Принудительный режим рассылки';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths =>
|
||||||
|
'Недавние подтверждённые маршруты (нажмите, чтобы использовать):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull =>
|
||||||
|
'История маршрутов заполнена. Удалите записи, чтобы добавить новые.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => 'хоп';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => 'хопов';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@@ -1616,6 +1515,12 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
return '$count $_temp0';
|
return '$count $_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => 'успешно';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Оценка';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => 'Удалить маршрут';
|
String get chat_removePath => 'Удалить маршрут';
|
||||||
|
|
||||||
@@ -1623,150 +1528,54 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
String get chat_noPathHistoryYet =>
|
String get chat_noPathHistoryYet =>
|
||||||
'История маршрутов пока пуста.\nОтправьте сообщение, чтобы обнаружить маршруты.';
|
'История маршрутов пока пуста.\nОтправьте сообщение, чтобы обнаружить маршруты.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => 'Действия с маршрутом:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => 'Указать маршрут вручную';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle => 'Вручную задать маршрут передачи';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => 'Очистить маршрут';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle =>
|
||||||
|
'Принудительно обновить маршрут при следующей отправке';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared =>
|
String get chat_pathCleared =>
|
||||||
'Маршрут очищен. Следующее сообщение обновит маршрут.';
|
'Маршрут очищен. Следующее сообщение обновит маршрут.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle =>
|
||||||
|
'Используйте переключатель маршрутизации в панели приложения';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled =>
|
||||||
|
'Режим рассылки включён. Отключите через значок маршрутизации в панели приложения.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => 'Полный маршрут';
|
String get chat_fullPath => 'Полный маршрут';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => 'Маршрутизация';
|
String get chat_pathDetailsNotAvailable =>
|
||||||
|
'Детали маршрута ещё недоступны. Попробуйте отправить сообщение для обновления.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => 'Авто';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@override
|
hopCount,
|
||||||
String get routing_modeFlood => 'Наводнение';
|
locale: localeName,
|
||||||
|
other: 'хопов',
|
||||||
@override
|
many: 'хопов',
|
||||||
String get routing_modeManual => 'Инструкция';
|
few: 'хопа',
|
||||||
|
one: 'хоп',
|
||||||
@override
|
);
|
||||||
String get routing_modeAutoHint =>
|
return 'Маршрут установлен: $hopCount $_temp0 — $status';
|
||||||
'Автоматически выбирает наиболее известный путь, и если такой путь неизвестен, использует алгоритм поиска пути.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint =>
|
|
||||||
'Передача сигнала через все ретрансляторы. Самый надежный способ, но требует больше времени на передачу.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint =>
|
|
||||||
'Всегда следует точно по указанному вами маршруту.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => 'Текущий маршрут';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops =>
|
|
||||||
'Прямое соединение – без использования ретрансляторов';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet =>
|
|
||||||
'Пока нет пути. Следующее сообщение будет отправлено до тех пор, пока не будет обнаружен маршрут.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast => 'Транслируется через все ретрансляторы';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => 'Изменить путь';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => 'Забудьте о маршруте';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => 'Известные маршруты';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint =>
|
|
||||||
'Создайте маршрут для переключения на этот пункт.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => 'В эксплуатации';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => 'Сильный первый скачок';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => 'Хорошее начало';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => 'Первый хороший урожай';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => 'Осуществлено';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood =>
|
|
||||||
'Узнал из новостей, распространяющихся в интернете.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => 'Непроверенный';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return 'worked $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => 'никогда не было подтверждено';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes delivered, $failures failed';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery => 'Доставка при затоплении';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => 'Создать маршрут';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count из 64 хмеля';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'На данный момент хмель еще не добавлен. Чтобы добавить его, нажмите на соответствующие кнопки ниже в нужном порядке, или сохраните рецепт без хмеля, чтобы отправить его напрямую.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops =>
|
|
||||||
'Добавляйте хмель в соответствии с указанным порядком.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => 'Поиск повторителей';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex =>
|
|
||||||
'Продвинутый уровень: прямой путь в шестнадцатеричном формате';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel => 'Префиксы шестнадцатеричной системы';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper =>
|
|
||||||
'Два шестнадцатеричных символа на каждом шаге, разделенные запятыми.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return 'Неверно: $tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops =>
|
|
||||||
'Максимальное количество ингредиентов – 64';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => 'Используйте этот путь';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => 'Удалить хмель';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop => 'Неизвестный ретранслятор';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally =>
|
String get chat_pathSavedLocally =>
|
||||||
'Сохранено локально. Подключитесь для синхронизации.';
|
'Сохранено локально. Подключитесь для синхронизации.';
|
||||||
@@ -1841,39 +1650,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => 'Карта нод';
|
String get map_title => 'Карта нод';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => 'Поиск по имени или ID узла';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => 'Активность';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => 'Онлайн';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => 'Недавно';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => 'Устаревший';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => 'Видимый';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => 'Скрытый';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => 'Центрировать на узле';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => 'Детали';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => 'Без GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => 'Не найдено соответствующих узлов';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => 'Линия видимости';
|
String get map_lineOfSight => 'Линия видимости';
|
||||||
|
|
||||||
@@ -2136,42 +1912,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
return 'Неудачных загрузок: $count';
|
return 'Неудачных загрузок: $count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2237,6 +1977,17 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
String get dialog_disconnectConfirm =>
|
String get dialog_disconnectConfirm =>
|
||||||
'Вы уверены, что хотите отключиться от этого устройства?';
|
'Вы уверены, что хотите отключиться от этого устройства?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => 'Отключено';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage =>
|
||||||
|
'Вы были отключены от вашего компаньона.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion =>
|
||||||
|
'Подключитесь к компаньону, чтобы получить доступ к функциям ретранслятора и сервера комнат.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => 'Вход в репитер';
|
String get login_repeaterLogin => 'Вход в репитер';
|
||||||
|
|
||||||
@@ -2303,12 +2054,66 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => 'Очистить';
|
String get common_clear => 'Очистить';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return 'Текущий маршрут: $path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: 'хопов',
|
||||||
|
many: 'хопов',
|
||||||
|
few: 'хопа',
|
||||||
|
one: 'хоп',
|
||||||
|
);
|
||||||
|
return 'Используется маршрут из $count $_temp0';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => 'Введите маршрут вручную';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => 'Текущий маршрут';
|
String get path_currentPathLabel => 'Текущий маршрут';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions =>
|
||||||
|
'Введите 2-символьные шестнадцатеричные префиксы для каждого хопа, разделённые запятыми.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample =>
|
||||||
|
'Пример: A1,F2,3C (каждый узел использует первый байт своего публичного ключа)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => 'Маршрут (шестнадцатеричные префиксы)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops =>
|
||||||
|
'Максимум 64 хопа. Каждый префикс — 2 шестнадцатеричных символа (1 байт)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => 'Или выберите из контактов:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound => 'Репитеры или серверы комнат не найдены.';
|
String get path_noRepeatersFound => 'Репитеры или серверы комнат не найдены.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire =>
|
||||||
|
'Пользовательские маршруты требуют промежуточных узлов, способных ретранслировать сообщения.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return 'Недопустимые шестнадцатеричные префиксы: $prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong => 'Маршрут слишком длинный. Максимум 64 хопа.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => 'Установить маршрут';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => 'Управление репитером';
|
String get repeater_management => 'Управление репитером';
|
||||||
|
|
||||||
@@ -2373,6 +2178,16 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => 'Режим маршрутизации';
|
String get repeater_routingMode => 'Режим маршрутизации';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath =>
|
||||||
|
'Авто (использовать сохранённый маршрут)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode => 'Принудительный режим рассылки';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => 'Управление маршрутами';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => 'Обновить';
|
String get repeater_refresh => 'Обновить';
|
||||||
|
|
||||||
@@ -2719,42 +2534,7 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'Байты, используемые для кодирования идентификатора этого ретранслятора в тегах flood-маршрута/обнаружения циклов. 0 = 1 байт (256 идентификаторов, до 64 переходов), 1 = 2 байта (65 000 идентификаторов, до 32 переходов), 2 = 3 байта (16 миллионов идентификаторов, до 21 перехода). Прошивки до v1.14 всегда использовали 1-байтовые маршруты; v1.14 и новее можно настроить на 2- или 3-байтовые маршруты.';
|
'Байты, используемые для кодирования идентификатора этого ретранслятора в тегах для обнаружения потоков/циклов. 0 = 1 байт (256 идентификаторов, до 64 переходов), 1 = 2 байта (65 000 идентификаторов, до 32 переходов), 2 = 3 байта (1 600 000 идентификаторов, до 21 перехода). Версии прошивки v1.13 и более ранние версии не поддерживают многобайтовые пути — они поднимаются только после того, как ваша сеть будет обновлена до версии v1.14 и выше.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => 'Задержка в работе системы Flood TX';
|
String get repeater_txDelay => 'Задержка в работе системы Flood TX';
|
||||||
@@ -3508,139 +3288,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => 'Цифровой вход';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => 'Цифровой выход';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => 'Аналоговый вход';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => 'Аналоговый выход';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => 'Общий датчик';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => 'Освещённость';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => 'Присутствие';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => 'Влажность';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => 'Акселерометр';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => 'Давление';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => 'Высота';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => 'Частота';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => 'Процент';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => 'Концентрация';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => 'Мощность';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => 'Расстояние';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => 'Энергия';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => 'Направление';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => 'Время';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => 'Гирометр';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => 'Цвет';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => 'Переключатель';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => 'Полилиния';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters м';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Гц';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa гПа';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux лк';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts Вт';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters м';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours кВт⋅ч';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => 'Количество запросов';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => 'Не удалось получить данные';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => 'Полученные данные о соседях';
|
String get neighbors_receivedData => 'Полученные данные о соседях';
|
||||||
|
|
||||||
@@ -4541,17 +4188,6 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
String get translation_composerSubtitle =>
|
String get translation_composerSubtitle =>
|
||||||
'Управляет исходным состоянием значка перевода, предоставляемого редактором.';
|
'Управляет исходным состоянием значка перевода, предоставляемого редактором.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle =>
|
|
||||||
'Автоматически переводить сообщения';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle =>
|
|
||||||
'Автоматически переводит сообщения для уведомлений, а также для чатов и каналов.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => 'Перевести сообщение';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => 'Целевой язык';
|
String get translation_targetLanguage => 'Целевой язык';
|
||||||
|
|
||||||
@@ -4678,139 +4314,4 @@ class AppLocalizationsRu extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Неизвестно';
|
String get contact_typeUnknown => 'Неизвестно';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => 'Увеличить масштаб';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => 'Увеличить масштаб';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => 'Карта центра';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'Для работы Web Bluetooth требуется браузер на основе Chromium.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'Идентификатор: $id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => 'GPS подтверждено';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => 'Выведенная позиция';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => 'Одиночный';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => 'Объединённые';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => 'Воспроизвести';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => 'Пауза';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => 'Повтор';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => 'Предыдущий хоп';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => 'Следующий хоп';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => 'Показать анимацию пакета';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => 'Скрыть анимацию пакета';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return 'Хоп $current из $total';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return 'Наблюдаемые маршруты: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => 'Основной';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return 'Альт $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count хопов',
|
|
||||||
many: '$count хопов',
|
|
||||||
few: '$count хопа',
|
|
||||||
one: '$count хоп',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => 'Общий сегмент';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => 'Расчётный сегмент';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return 'Используется в $count маршрутах';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count хопов не имеют координат — показанный путь неполный',
|
|
||||||
many: '$count хопов не имеют координат — показанный путь неполный',
|
|
||||||
few: '$count хопа не имеют координат — показанный путь неполный',
|
|
||||||
one: '$count хоп не имеет координат — показанный путь неполный',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => 'Показать всё';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => 'Скрыть путь';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => 'Показать маршрут';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => 'Скрыть панель';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => 'Расширить панель';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => 'Нет координат';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => 'Следить за пакетом';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => 'Не следить за пакетом';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,24 +92,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => 'Zakázať';
|
String get common_disable => 'Zakázať';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => 'Zrušiť';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => 'Odoslané';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => 'Doručené';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => 'Odoslanie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed => 'Neúspešné odeslanie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => 'Slyšal som to opakovane';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => 'Restartovať';
|
String get common_reboot => 'Restartovať';
|
||||||
|
|
||||||
@@ -129,12 +111,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
return '$percent%';
|
return '$percent%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => 'Automatické obnovenie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => 'Časový interval';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => 'MeshCore – Verzia pre verejnosť';
|
String get scanner_title => 'MeshCore – Verzia pre verejnosť';
|
||||||
|
|
||||||
@@ -319,10 +295,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => 'Povolte Bluetooth';
|
String get scanner_enableBluetooth => 'Povolte Bluetooth';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported =>
|
|
||||||
'Funkcia Bluetooth nie je dostupná v prehliadači. Prepojte sa pomocou USB.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => 'Rýchle prepínač';
|
String get device_quickSwitch => 'Rýchle prepínač';
|
||||||
|
|
||||||
@@ -367,45 +339,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_radioSettingsUpdated => 'Nastavenia rádia aktualizované';
|
String get settings_radioSettingsUpdated => 'Nastavenia rádia aktualizované';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => 'Lokalita';
|
String get settings_location => 'Lokalita';
|
||||||
|
|
||||||
@@ -499,14 +432,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_advertLocationSubtitle => 'Zahrnúť polohu do inzerátu';
|
String get settings_advertLocationSubtitle => 'Zahrnúť polohu do inzerátu';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate =>
|
|
||||||
'Automatický zero-hop inzerát pri aktualizácii GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'Keď sa GPS poloha zmení, odoslať zero-hop inzerát (vyžaduje polohu v inzeráte).';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => 'Viaceré ACK';
|
String get settings_multiAck => 'Viaceré ACK';
|
||||||
|
|
||||||
@@ -733,18 +658,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => 'Ukrajinská';
|
String get appSettings_languageUk => 'Ukrajinská';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing => 'Povoliť sledovanie správ';
|
String get appSettings_enableMessageTracing => 'Povoliť sledovanie správ';
|
||||||
|
|
||||||
@@ -863,6 +776,11 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
String get appSettings_maxMessageRetriesSubtitle =>
|
String get appSettings_maxMessageRetriesSubtitle =>
|
||||||
'Počet pokusov o odošleť pred označením správy ako neúspešnej';
|
'Počet pokusov o odošleť pred označením správy ako neúspešnej';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => 'Batéria';
|
String get appSettings_battery => 'Batéria';
|
||||||
|
|
||||||
@@ -944,28 +862,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => 'Minul týždeň';
|
String get appSettings_lastWeek => 'Minul týždeň';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => 'Zdroj rastrových dlaždíc';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Koncový bod Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Kľúč API Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired =>
|
|
||||||
'Vyžaduje sa na používanie Stadia Maps';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return 'Nakonfigurované: $maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'Zadajte svoj kľúč API pre Stadia Maps. Aplikácia ho používa na požiadavky na rastrové dlaždice.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => 'Offline Mapa Pamäť';
|
String get appSettings_offlineMapCache => 'Offline Mapa Pamäť';
|
||||||
|
|
||||||
@@ -1086,15 +982,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => 'Nová skupina';
|
String get contacts_newGroup => 'Nová skupina';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => 'Ďalšie možnosti';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => 'Vyhľadajte kontakty';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => 'Zavrieť vyhľadávanie';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => 'Názov skupiny';
|
String get contacts_groupName => 'Názov skupiny';
|
||||||
|
|
||||||
@@ -1397,20 +1284,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => 'napr. #tím';
|
String get channels_hashtagHint => 'napr. #tím';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => 'Zatiaľ žiadne správy.';
|
String get chat_noMessages => 'Zatiaľ žiadne správy.';
|
||||||
|
|
||||||
@@ -1466,9 +1339,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => 'Odoslať GIF';
|
String get chat_sendGif => 'Odoslať GIF';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => 'Odpovedať';
|
String get chat_reply => 'Odpovedať';
|
||||||
|
|
||||||
@@ -1593,6 +1463,35 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => 'Hexová analýza:';
|
String get debugFrame_hexDump => 'Hexová analýza:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => 'Správa ciest';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => 'Zobraziť všetky cesty';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => 'Režim trasy';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => 'Použiť uloženú cestu';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode =>
|
||||||
|
'Zavrieť režim núdzového povodňového režimu';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths => 'Nedávne cesty ACK (klepni na použitie):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull =>
|
||||||
|
'História ciest je plná. Odstráňte záznamy, aby ste mohli pridať nové.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => 'Skok';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => 'Skákať';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@@ -1604,6 +1503,12 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
return '$count $_temp0';
|
return '$count $_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => 'Úspechy';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Score';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => 'Odstrániť cestu';
|
String get chat_removePath => 'Odstrániť cestu';
|
||||||
|
|
||||||
@@ -1611,148 +1516,52 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
String get chat_noPathHistoryYet =>
|
String get chat_noPathHistoryYet =>
|
||||||
'Zatiaľ žiadna história trás.\nPošlite správu a objavte trasy.';
|
'Zatiaľ žiadna história trás.\nPošlite správu a objavte trasy.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => 'Cesty:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => 'Nastaviť vlastnú cestu';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle => 'Ručne zadajte trasu.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => 'Vyčistiš cestu';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle =>
|
||||||
|
'Znovu nájsť vynútene pri nasledujúcej pošlite';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared =>
|
String get chat_pathCleared =>
|
||||||
'Cesta vyčistená. Nasledujúce prepočetné získa trasu znova.';
|
'Cesta vyčistená. Nasledujúce prepočetné získa trasu znova.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle =>
|
||||||
|
'Použite prepínanie trasy v navigačnom paneli.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled =>
|
||||||
|
'Odosporňovacia prevádzka je zapnutá. Vypnite ju znova cez ikonu routovania v navigačnom páse.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => 'Celá cesta';
|
String get chat_fullPath => 'Celá cesta';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => 'Navigácia';
|
String get chat_pathDetailsNotAvailable =>
|
||||||
|
'Podrobnosti o ceste zatiaľ dostupné nie sú. Skúste poslať správu na obnovenie.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => 'Auto';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@override
|
hopCount,
|
||||||
String get routing_modeFlood => 'Povodňová vlna';
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
@override
|
one: 'hop',
|
||||||
String get routing_modeManual => 'Ručná príručka';
|
);
|
||||||
|
return 'Cesta nastavená: $hopCount $_temp0 - $status';
|
||||||
@override
|
|
||||||
String get routing_modeAutoHint =>
|
|
||||||
'Automaticky vyberá najznámejší trasa, a ak žiadna nie je známa, použije náhodnú trasu.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint =>
|
|
||||||
'Prenos prostredníctvom všetkých opakovačov. Najspoľahlivejší spôsob, ale vyžaduje viac času vysielania.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint =>
|
|
||||||
'Vždy dodáva presne podľa zadaného trasy.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => 'Aktuálna trasa';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops => 'Priamo – bez prechodných trás';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet =>
|
|
||||||
'Zatiaľ neexistuje žiadna cesta. Nasledujúce správy budú pokračovať, kým sa nenájde trasa.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast =>
|
|
||||||
'Prenos prostredníctvom každého opakovača';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => 'Upraviť trasu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => 'Zabudnite na trasu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => 'Známe cesty';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint =>
|
|
||||||
'Kliknite na cestu, aby ste sa k nej presunuli.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => 'V prevádzke';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => 'Silný prvý krok';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => 'Úspešný prvý krok';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => 'Prvá, spravodlivá fáza';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => 'Dosiahnutý úspech';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood =>
|
|
||||||
'Zistil som to z informácií, ktoré som získal v dôsledku povodňovej situácie.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => 'Neotestované';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return 'worked $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => 'nikedy nebolo potvrdené';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes delivered, $failures failed';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery => 'Doručenie v prípade povodní';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => 'Vytvorenie cesty';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count z 64 chmelových zŕš';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'Zatiaľ žiadne chmel. Kliknite na opakované, aby ste ich pridali postupne, alebo uložte bez chmelu, aby ste ho mohli poslať priamo.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops => 'Pridávajte chmel podľa zadaného poriadku.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => 'Hľadať opakované';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex => 'Pokročilé: pôvodná hexová cesta';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel => 'Prefiksy pre hexadecimálne čísla';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper =>
|
|
||||||
'Dve hexové čísla na každý krok, oddelené čiarkami';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return 'Neplatné: $tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops => 'Maximálne 64 krokov';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => 'Použite túto cestu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => 'Odstráňte chmel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop =>
|
|
||||||
'Neznáme zariadenie na opakované vysielanie';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally =>
|
String get chat_pathSavedLocally =>
|
||||||
'Uložené lokálne. Spojte sa na synchronizáciu.';
|
'Uložené lokálne. Spojte sa na synchronizáciu.';
|
||||||
@@ -1828,39 +1637,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => 'Mapa uzlov';
|
String get map_title => 'Mapa uzlov';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => 'Vyhľadajte podľa názvu alebo ID uzla';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => 'Aktivita';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => 'Online';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => 'Nedávne';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => 'Neaktuálne';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => 'Viditeľný';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => 'Skrytý';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => 'Nacentrovať na uzol';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => 'Podrobnosti';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => 'Bez GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => 'Nenašli sa žiadne zodpovedajúce uzly.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => 'Úroveň výhľadu';
|
String get map_lineOfSight => 'Úroveň výhľadu';
|
||||||
|
|
||||||
@@ -2122,42 +1898,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
return 'Neúspešné stiahnutia: $count';
|
return 'Neúspešné stiahnutia: $count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2223,6 +1963,17 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
String get dialog_disconnectConfirm =>
|
String get dialog_disconnectConfirm =>
|
||||||
'Ste si istý/á, že chcete odpojiť od tohto zariadenia?';
|
'Ste si istý/á, že chcete odpojiť od tohto zariadenia?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => 'Odpojené';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage =>
|
||||||
|
'Od vášho spoločníka ste boli odpojený.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion =>
|
||||||
|
'Pripojte sa k sprievodcovi a získajte prístup k funkciám opakovača a serveru miestností.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => 'Opätovné prihlásenie';
|
String get login_repeaterLogin => 'Opätovné prihlásenie';
|
||||||
|
|
||||||
@@ -2289,13 +2040,66 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => 'Zmazať';
|
String get common_clear => 'Zmazať';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return 'Aktívna cesta: $path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
|
one: 'hop',
|
||||||
|
);
|
||||||
|
return 'Používa $count $_temp0 cestu';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => 'Zadajte vlastný priebeh';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => 'Aktuálny priebeh';
|
String get path_currentPathLabel => 'Aktuálny priebeh';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions =>
|
||||||
|
'Zadajte 2-miestne hexové predpony pre každú fázu, oddelené čiarkami.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample =>
|
||||||
|
'A1,F2,3C (každý uzel používa prvý bajt svojho verejného kľúča)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => 'Cesty (hexové predpony)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops =>
|
||||||
|
'Max 64 skokov. Každý prefix je 2 hexadecimálne znaky (1 bajt).';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => 'Vyberte sa z kontaktov:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound =>
|
String get path_noRepeatersFound =>
|
||||||
'Nenašli sa žiadne opakovače ani serverové miestnosti.';
|
'Nenašli sa žiadne opakovače ani serverové miestnosti.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire =>
|
||||||
|
'Vlastné cesty vyžadujú medziletoch, ktoré môžu prenášať správky.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return 'Neplatné hexové predpony: $prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong =>
|
||||||
|
'Cesta je príliš dlhá. Umožnené je maximum 64 skokov.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => 'Nastaviť cestu';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => 'Správa opakérov';
|
String get repeater_management => 'Správa opakérov';
|
||||||
|
|
||||||
@@ -2360,6 +2164,16 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => 'Režim trasy';
|
String get repeater_routingMode => 'Režim trasy';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath => 'Použiť uloženú cestu';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode =>
|
||||||
|
'Zavrieť režim núdzového povodňového režimu';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => 'Správa trás';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => 'Obnoviť';
|
String get repeater_refresh => 'Obnoviť';
|
||||||
|
|
||||||
@@ -2700,42 +2514,7 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'Bajty použité na zakódovanie ID tohto opakovača v tagoch flood trasy/detekcie slučky. 0=1 bajt (256 ID, až 64 skokov), 1=2 bajty (65 000 ID, až 32 skokov), 2=3 bajty (16 miliónov ID, až 21 skokov). Firmvér pred v1.14 vždy používal 1-bajtové trasy; v1.14 a novšie možno nakonfigurovať na 2- alebo 3-bajtové trasy.';
|
'Byty použité na zakódovanie ID tohto opakovača v tagoch pre trasu/detekciu slučky. 0 = 1 bytu (256 ID, až 64 skokov), 1 = 2 byty (65 000 ID, až 32 skokov), 2 = 3 byty (16 miliónov ID, až 21 skokov). Verzie 1.13 a staršie nepodporujú viacbytové trasy – fungujú len, keď je sieť aktivovaná.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => 'Zpoždanie v Flood, TX';
|
String get repeater_txDelay => 'Zpoždanie v Flood, TX';
|
||||||
@@ -3487,139 +3266,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => 'Digitálny vstup';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => 'Digitálny výstup';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => 'Analógový vstup';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => 'Analógový výstup';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => 'Všeobecný senzor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => 'Osvetlenie';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => 'Prítomnosť';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => 'Vlhkosť';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => 'Akcelerometer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => 'Tlak';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => 'Nadmorská výška';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => 'Frekvencia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => 'Percento';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => 'Koncentrácia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => 'Výkon';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => 'Vzdialenosť';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => 'Energia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => 'Smer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => 'Čas';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => 'Gyrometer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => 'Farba';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => 'Prepínač';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => 'Lomená čiara';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Hz';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa hPa';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux lx';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts W';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours kWh';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => 'Počet požiadaviek';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => 'Nepodarilo sa získať údaje';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => 'Obdielo dáta suseda';
|
String get neighbors_receivedData => 'Obdielo dáta suseda';
|
||||||
|
|
||||||
@@ -4506,16 +4152,6 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
String get translation_composerSubtitle =>
|
String get translation_composerSubtitle =>
|
||||||
'Riadi výchoce stav ikony pre preklad, ktorú používa program.';
|
'Riadi výchoce stav ikony pre preklad, ktorú používa program.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle => 'Automaticky prekladať správy';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle =>
|
|
||||||
'Automaticky prekladá správy pre upozornenia aj pre čet alebo kanál.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => 'Preložiť správu';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => 'Cieľový jazyk';
|
String get translation_targetLanguage => 'Cieľový jazyk';
|
||||||
|
|
||||||
@@ -4644,137 +4280,4 @@ class AppLocalizationsSk extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Unknown';
|
String get contact_typeUnknown => 'Unknown';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => 'Zväčšiť';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => 'Zmenť zamer zblízka';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => 'Mapa centra';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'Web Bluetooth vyžaduje prehliadač Chromium.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'ID: $id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => 'GPS potvrdilo';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => 'Odvodená poloha';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => 'Jednotlivý';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => 'Spojené';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => 'Prehrať';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => 'Pozastaviť';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => 'Prehrať znova';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => 'Predchádzajúci skok';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => 'Nasledujúci skok';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => 'Zobraziť animáciu paketu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => 'Skryť animáciu paketu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return 'Skok $current z $total';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return 'Pozorované cesty: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => 'Primárna';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return 'Alternatívny $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count skokov',
|
|
||||||
few: '$count skoky',
|
|
||||||
one: '1 skok',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => 'Spoločný segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => 'Odhadovaný segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return 'Používané $count cestami';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count skokov nemá polohu — zobrazená trasa je neúplná',
|
|
||||||
few: '$count skoky nemajú polohu — zobrazená trasa je neúplná',
|
|
||||||
one: '1 skok nemá polohu — zobrazená trasa je neúplná',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => 'Zobraziť všetky';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => 'Skryť cestu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => 'Zobraziť trasu';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => 'Zatvoriť panel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => 'Rozbaliť panel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => 'Bez polohy';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => 'Uzamknúť pohľad na paket';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => 'Odomknúť pohľad od paketu';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,25 +92,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => 'Izklopiti';
|
String get common_disable => 'Izklopiti';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => 'Preobrn';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => 'Pošljeno';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => 'Dostavljeno';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => 'Pošiljanje';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed =>
|
|
||||||
'Uspešno ni bilo mogo, da se sporočilo pošlje';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => 'Slišal sem večkrat';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => 'Ponoviti';
|
String get common_reboot => 'Ponoviti';
|
||||||
|
|
||||||
@@ -130,12 +111,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
return '$percent %';
|
return '$percent %';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => 'Samodejno osveževanje';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => 'Časovni interval';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => 'MeshCore – Odprto';
|
String get scanner_title => 'MeshCore – Odprto';
|
||||||
|
|
||||||
@@ -318,10 +293,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => 'Omogočite Bluetooth';
|
String get scanner_enableBluetooth => 'Omogočite Bluetooth';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported =>
|
|
||||||
'Funkcija Bluetooth v brskalniku ni na voljo. Povežite se preko USB-ja namesto tega.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => 'Hitro preklop';
|
String get device_quickSwitch => 'Hitro preklop';
|
||||||
|
|
||||||
@@ -366,45 +337,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_radioSettingsUpdated => 'Radio nastavitve posodobljene';
|
String get settings_radioSettingsUpdated => 'Radio nastavitve posodobljene';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => 'Lokacija';
|
String get settings_location => 'Lokacija';
|
||||||
|
|
||||||
@@ -500,14 +432,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_advertLocationSubtitle => 'Vključi lokacijo v oglas.';
|
String get settings_advertLocationSubtitle => 'Vključi lokacijo v oglas.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate =>
|
|
||||||
'Samodejni zero-hop oglas ob posodobitvi GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'Ko se GPS lokacija spremeni, pošlji zero-hop oglas (zahteva lokacijo v oglasu).';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => 'Več potrdil';
|
String get settings_multiAck => 'Več potrdil';
|
||||||
|
|
||||||
@@ -731,18 +655,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => 'Ukrajinsko';
|
String get appSettings_languageUk => 'Ukrajinsko';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing => 'Omogoči sledenje sporočilom';
|
String get appSettings_enableMessageTracing => 'Omogoči sledenje sporočilom';
|
||||||
|
|
||||||
@@ -865,6 +777,11 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
String get appSettings_maxMessageRetriesSubtitle =>
|
String get appSettings_maxMessageRetriesSubtitle =>
|
||||||
'Število poskusov ponovnega poslanja, preden se sporočilo označuje kot neuspešno';
|
'Število poskusov ponovnega poslanja, preden se sporočilo označuje kot neuspešno';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => 'Baterija';
|
String get appSettings_battery => 'Baterija';
|
||||||
|
|
||||||
@@ -945,28 +862,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => 'Prejšnji teden';
|
String get appSettings_lastWeek => 'Prejšnji teden';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => 'Vir rastrskih ploščic';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Končna točka Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Ključ API Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired =>
|
|
||||||
'Obvezno za uporabo Stadia Maps';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return 'Nastavljeno: $maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'Vnesite svoj ključ API za Stadia Maps. Aplikacija ga uporablja za zahteve rastrskih ploščic.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => 'Shramba zemljevidov brez povezave';
|
String get appSettings_offlineMapCache => 'Shramba zemljevidov brez povezave';
|
||||||
|
|
||||||
@@ -1086,15 +981,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => 'Nova skupina';
|
String get contacts_newGroup => 'Nova skupina';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => 'Več možnosti';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => 'Iskanje kontaktov';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => 'Izklopi iskanje';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => 'Ime skupine';
|
String get contacts_groupName => 'Ime skupine';
|
||||||
|
|
||||||
@@ -1395,20 +1281,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => 'npr. #ekipa';
|
String get channels_hashtagHint => 'npr. #ekipa';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => 'Še ni sporočil.';
|
String get chat_noMessages => 'Še ni sporočil.';
|
||||||
|
|
||||||
@@ -1465,9 +1337,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => 'Pošlji GIF';
|
String get chat_sendGif => 'Pošlji GIF';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => 'Odgovori';
|
String get chat_reply => 'Odgovori';
|
||||||
|
|
||||||
@@ -1591,6 +1460,34 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => 'Izpis heksadecimalnih vrednosti:';
|
String get debugFrame_hexDump => 'Izpis heksadecimalnih vrednosti:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => 'Upravljanje poti';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => 'Prikaži vse poti';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => 'Navodilo za usmerjevalni način';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => 'Avto (uporabi shranjeno pot)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode => 'Nasilje obvezati v način';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths => 'Nedavni poti ACK (tap za uporabo):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull =>
|
||||||
|
'Zapiske o poti so popolni. Izbriši vnose, da dodaš nove.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => 'skok';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => 'skokov';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@@ -1602,6 +1499,12 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
return '$count $_temp0';
|
return '$count $_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => 'Uspešni';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Score';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => 'Izbriši pot';
|
String get chat_removePath => 'Izbriši pot';
|
||||||
|
|
||||||
@@ -1609,144 +1512,51 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
String get chat_noPathHistoryYet =>
|
String get chat_noPathHistoryYet =>
|
||||||
'Ni shranjenih poti.\nPošlji sporočilo za odkrivanje poti.';
|
'Ni shranjenih poti.\nPošlji sporočilo za odkrivanje poti.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => 'Potni ukazi:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => 'Nastavi Prilozeno Pot';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle => 'Ročno določite potniško pot.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => 'Počisti pot';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle => 'Ob naslednji pošiljanju znova zbrati.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared =>
|
String get chat_pathCleared =>
|
||||||
'Pot je očiščena. Naslednje sporočilo bo ponovno odkril pot.';
|
'Pot je očiščena. Naslednje sporočilo bo ponovno odkril pot.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle =>
|
||||||
|
'Uporabi tipko usmerjevanja v meniju aplikacije.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled =>
|
||||||
|
'Narejena je bila omrežna modaliteta. Vklopi jo znova preko ikone v meniju aplikacije.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => 'Polna pot';
|
String get chat_fullPath => 'Polna pot';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => 'Navigacija';
|
String get chat_pathDetailsNotAvailable =>
|
||||||
|
'Podrobnosti poti zaenkrat niso na voljo. Poskusite poslati sporočilo za osvežitev.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => 'Avto';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@override
|
hopCount,
|
||||||
String get routing_modeFlood => 'Poplavo';
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
@override
|
one: 'hop',
|
||||||
String get routing_modeManual => 'Navodilo';
|
);
|
||||||
|
return 'Pot nastavljen: $hopCount $_temp0 - $status';
|
||||||
@override
|
|
||||||
String get routing_modeAutoHint =>
|
|
||||||
'Samodejno izbere najbolj poznano pot, in sicer, ko ni na voljo nobena.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint =>
|
|
||||||
'Prenosi preko vseh repetitorjev. Najzanesljivejši način, vendar zahteva več časa.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint =>
|
|
||||||
'Vedno sledi natančni poti, ki jo ste določili.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => 'Trenutna pot';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops => 'Neposredno – brez prehodov';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet =>
|
|
||||||
'Žep trenutno ni mogoče najti. Naslednje sporočilo bo posredovano, dokler ne bo ugotovljeno, kje je pot.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast => 'Prenos preko vseh repetitiv';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => 'Uredi pot';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => 'Pozabi na pot';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => 'Poznati poti';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint => 'Kliknite na pot, da jo izberete.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => 'V uporabi';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => 'Močan prvi korak';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => 'Prva uspešna faza';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => 'Prva, uspešna faza';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => 'Izpolnil';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood => 'Slišano preko poplave';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => 'Ne preizkušen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return 'delal/a $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => 'nikoli ni bilo potrjeno';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes delivered, $failures failed';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery => 'Dostava zaradi poplave';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => 'Izgradnja poti';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count od 64 različnih sort hropa';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'Še niso dodani hmelji. Za dodajanje hmelja v vrstnem redu kliknite na povezavo spodaj, ali pa shranite brez dodanega hmelja, da ga lahko posredujete neposredno.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops => 'Dodajte suho travo v skladu s postopkom.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => 'Iskanje ponovitev';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex => 'Napredno: surovi šestnajstni pot';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel => 'Predfiks za heksadecimalno šifro';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper =>
|
|
||||||
'Dva šestbitna znaka na vsak skok, ločena z vejico';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return 'Neveljaven: $tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops => 'Največ 64 hopov';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => 'Uporabite to poto';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => 'Odstranite hmelj';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop => 'Neznani ponovitelj';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally =>
|
String get chat_pathSavedLocally =>
|
||||||
'Shrano lokalno. Povežite se za sinhronizacijo.';
|
'Shrano lokalno. Povežite se za sinhronizacijo.';
|
||||||
@@ -1821,39 +1631,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => 'Mapa omrežja';
|
String get map_title => 'Mapa omrežja';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => 'Iščite ime ali ID vozlišča';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => 'Dejavnost';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => 'V omrežju';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => 'Nedavni';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => 'Zastarelo';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => 'Vidno';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => 'Skrit';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => 'Centriraj na vozlišče';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => 'Podrobnosti';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => 'Brez GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => 'Ni ujemajočih se vozlišč';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => 'Linija vida';
|
String get map_lineOfSight => 'Linija vida';
|
||||||
|
|
||||||
@@ -2119,42 +1896,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
return 'Poslovniški izniki: $count';
|
return 'Poslovniški izniki: $count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2220,6 +1961,17 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
String get dialog_disconnectConfirm =>
|
String get dialog_disconnectConfirm =>
|
||||||
'Ste prepričani, da želite se odklopiti s tega naprave?';
|
'Ste prepričani, da želite se odklopiti s tega naprave?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => 'Prekinjeno';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage =>
|
||||||
|
'Prekinjena povezava s vašim spre伴ovalcem.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion =>
|
||||||
|
'Povežite se s spremljevalnikom za dostop do funkcij ponavljalnika in strežnika sob.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => 'Ponovni vnos';
|
String get login_repeaterLogin => 'Ponovni vnos';
|
||||||
|
|
||||||
@@ -2285,13 +2037,65 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => 'Ponoviti';
|
String get common_clear => 'Ponoviti';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return 'Trenutna pot: $path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
|
one: 'hop',
|
||||||
|
);
|
||||||
|
return 'Uporablja $count $_temp0 pot';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => 'Vnesite prilagojeno pot';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => 'Trenutna pot';
|
String get path_currentPathLabel => 'Trenutna pot';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions =>
|
||||||
|
'Vnesite 2-karakterne heksadecimalne prefixe za vsako skopo, ločeno z zvezekami.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample =>
|
||||||
|
'Primer: A1,F2,3C (vsak notranji element uporablja prvi bajt svojega javnega ključa)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => 'Pot (heksafixne skrajšave)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops =>
|
||||||
|
'Maksimalno 64 skokov. Vsak prefiks je 2 heksadecimalna znamenja (1 bajt).';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => 'Izberi iz kontaktov:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound =>
|
String get path_noRepeatersFound =>
|
||||||
'Ne najdenih ponoviteljev ali strežnikov sob.';
|
'Ne najdenih ponoviteljev ali strežnikov sob.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire =>
|
||||||
|
'Prilojene poti zahtevajo medhodne prenose, ki lahko prenašajo sporočila.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return 'Neveljačni šesteročlenski prefiksi: $prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong => 'Pot je prevelika. Dovoljeno največ 64 skokov.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => 'Nastavi Pot';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => 'Upravljanje ponovitve';
|
String get repeater_management => 'Upravljanje ponovitve';
|
||||||
|
|
||||||
@@ -2357,6 +2161,15 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => 'Navodilo za usmerjevalni način';
|
String get repeater_routingMode => 'Navodilo za usmerjevalni način';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath => 'Avto (uporabi shranjeno pot)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode => 'Nasilje obvezati v način';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => 'Upravljanje poti';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => 'Ponovno obnavljati';
|
String get repeater_refresh => 'Ponovno obnavljati';
|
||||||
|
|
||||||
@@ -2696,42 +2509,7 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'Bajti, uporabljeni za kodiranje ID-ja tega repetitorja v oznakah flood poti/zaznavanja zank. 0=1 bajt (256 ID-jev, do 64 skokov), 1=2 bajta (65.000 ID-jev, do 32 skokov), 2=3 bajti (16 milijonov ID-jev, do 21 skokov). Vdelana programska oprema pred v1.14 je vedno uporabljala 1-bajtne poti; v1.14 in novejše je mogoče nastaviti na 2- ali 3-bajtne poti.';
|
'Biti, ki so bila uporabljena za kodiranje ID-ja tega releja v oznakah za zaznavanje pot/kroga, imajo naslednje velikosti: 0=1 bit (256 ID-jev, do 64 skokov), 1=2 biti (65.000 ID-jev, do 32 skokov), 2=3 biti (16 milijonov ID-jev, do 21 skokov). V različicah 1.13 in starejših se ustvarjajo večbitne poti – vendar se to zgodi šele, ko je omrežje vklopljeno v različicah 1.14 in kasnejših.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => 'Zatemnitevanje zaradi poplav v Texasu';
|
String get repeater_txDelay => 'Zatemnitevanje zaradi poplav v Texasu';
|
||||||
@@ -3483,139 +3261,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => 'Digitalni vhod';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => 'Digitalni izhod';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => 'Analogni vhod';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => 'Analogni izhod';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => 'Splošni senzor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => 'Osvetljenost';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => 'Prisotnost';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => 'Vlažnost';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => 'Merilnik pospeška';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => 'Tlak';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => 'Nadmorska višina';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => 'Frekvenca';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => 'Odstotek';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => 'Koncentracija';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => 'Moč';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => 'Razdalja';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => 'Energija';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => 'Smer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => 'Čas';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => 'Žiroskop';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => 'Barva';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => 'Stikalo';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => 'Polilinija';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Hz';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa hPa';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux lx';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts W';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours kWh';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => 'Število zahtev';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => 'Podatkov ni bilo mogoče pridobiti';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => 'Prejeto podatke o sosedih';
|
String get neighbors_receivedData => 'Prejeto podatke o sosedih';
|
||||||
|
|
||||||
@@ -4505,16 +4150,6 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
String get translation_composerSubtitle =>
|
String get translation_composerSubtitle =>
|
||||||
'Ureja privzeto stanje ikone za prevod, ki jo uporablja avtor.';
|
'Ureja privzeto stanje ikone za prevod, ki jo uporablja avtor.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle => 'Samodejno prevajaj sporočila';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle =>
|
|
||||||
'Samodejno prevaja sporočila za obvestila ter za klepete ali kanale.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => 'Prevedi sporočilo';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => 'Ciljna jezika';
|
String get translation_targetLanguage => 'Ciljna jezika';
|
||||||
|
|
||||||
@@ -4643,139 +4278,4 @@ class AppLocalizationsSl extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Unknown';
|
String get contact_typeUnknown => 'Unknown';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => 'Povečaj';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => 'Povečajte pogled';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => 'Krajšarska karta';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'Web Bluetooth zahteva brskalnik Chromium.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'ID: $id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => 'GPS potrdilo';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => 'Izpeljana lokacija';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => 'Posamično';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => 'Skupno';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => 'Predvajaj';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => 'Premor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => 'Ponovitev';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => 'Prejšnji skok';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => 'Naslednji skok';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => 'Prikaži animacijo paketa';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => 'Skrij animacijo paketa';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return 'Skok $current od $total';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return 'Opazovane poti: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => 'Primarna';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return 'Alternativa $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count skokov',
|
|
||||||
few: '$count skoki',
|
|
||||||
two: '2 skoka',
|
|
||||||
one: '1 skok',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => 'Deljen segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => 'Ocenjen segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return 'Uporablja $count poti';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count skokov nima lokacije — prikazana pot je delna',
|
|
||||||
few: '$count skoki nimajo lokacije — prikazana pot je delna',
|
|
||||||
two: '2 skoka nimata lokacije — prikazana pot je delna',
|
|
||||||
one: '1 skok nima lokacije — prikazana pot je delna',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => 'Pokaži vse';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => 'Skrij pot';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => 'Pokaži pot';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => 'Strni ploščo';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => 'Razširi ploščo';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => 'Brez lokacije';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => 'Zakleni pogled na paket';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => 'Odkleni pogled od paketa';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,24 +92,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => 'Inaktivera';
|
String get common_disable => 'Inaktivera';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => 'Ångra';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => 'Sen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => 'Levererad';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => 'Skicka';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed => 'Misslyckades med att skicka';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => 'Hördes upprepade gånger';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => 'Start om';
|
String get common_reboot => 'Start om';
|
||||||
|
|
||||||
@@ -129,12 +111,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
return '$percent%';
|
return '$percent%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => 'Automatisk uppdatering';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => 'Intervall';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => 'MeshCore – Öppen version';
|
String get scanner_title => 'MeshCore – Öppen version';
|
||||||
|
|
||||||
@@ -316,10 +292,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => 'Aktivera Bluetooth';
|
String get scanner_enableBluetooth => 'Aktivera Bluetooth';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported =>
|
|
||||||
'Bluetooth är inte tillgängligt i webbläsaren. Anslut istället via USB.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => 'Snabb växling';
|
String get device_quickSwitch => 'Snabb växling';
|
||||||
|
|
||||||
@@ -365,45 +337,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
String get settings_radioSettingsUpdated =>
|
String get settings_radioSettingsUpdated =>
|
||||||
'Radioinställningarna har uppdaterats';
|
'Radioinställningarna har uppdaterats';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => 'Plats';
|
String get settings_location => 'Plats';
|
||||||
|
|
||||||
@@ -497,14 +430,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_advertLocationSubtitle => 'Inkludera plats i annonsen';
|
String get settings_advertLocationSubtitle => 'Inkludera plats i annonsen';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate =>
|
|
||||||
'Automatisk zero-hop-annons vid GPS-uppdatering';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'När GPS-positionen ändras, skicka en zero-hop-annons (kräver plats i annonsen).';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => 'Flera bekräftelser';
|
String get settings_multiAck => 'Flera bekräftelser';
|
||||||
|
|
||||||
@@ -728,18 +653,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => 'Ukrainska';
|
String get appSettings_languageUk => 'Ukrainska';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing => 'Aktivera meddelandespårning';
|
String get appSettings_enableMessageTracing => 'Aktivera meddelandespårning';
|
||||||
|
|
||||||
@@ -858,6 +771,11 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
String get appSettings_maxMessageRetriesSubtitle =>
|
String get appSettings_maxMessageRetriesSubtitle =>
|
||||||
'Antal försök att skicka om ett meddelande innan det markeras som misslyckat.';
|
'Antal försök att skicka om ett meddelande innan det markeras som misslyckat.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => 'Batteri';
|
String get appSettings_battery => 'Batteri';
|
||||||
|
|
||||||
@@ -938,28 +856,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => 'Förra veckan';
|
String get appSettings_lastWeek => 'Förra veckan';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => 'Källa för rasterplattor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Stadia-slutpunkt';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Stadia API-nyckel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired =>
|
|
||||||
'Krävs för att använda Stadia Maps';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return 'Konfigurerad: $maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'Ange din Stadia Maps API-nyckel. Appen använder den för förfrågningar om rasterplattor.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => 'Offline Kartcache';
|
String get appSettings_offlineMapCache => 'Offline Kartcache';
|
||||||
|
|
||||||
@@ -1080,15 +976,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => 'Ny grupp';
|
String get contacts_newGroup => 'Ny grupp';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => 'Fler alternativ';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => 'Sök efter kontakter';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => 'Avancerad sökning';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => 'Gruppnamn';
|
String get contacts_groupName => 'Gruppnamn';
|
||||||
|
|
||||||
@@ -1387,20 +1274,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => 't.ex. #team';
|
String get channels_hashtagHint => 't.ex. #team';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => 'Inga meddelanden ännu';
|
String get chat_noMessages => 'Inga meddelanden ännu';
|
||||||
|
|
||||||
@@ -1458,9 +1331,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => 'Skicka GIF';
|
String get chat_sendGif => 'Skicka GIF';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => 'Svara';
|
String get chat_reply => 'Svara';
|
||||||
|
|
||||||
@@ -1584,6 +1454,35 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => 'Hexdump:';
|
String get debugFrame_hexDump => 'Hexdump:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => 'Stigarhantering';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => 'Visa alla vägar';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => 'Ruttläge';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => 'Automatisk (använd sparad sökväg)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode => 'Tvinga Översvämningsläge';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths =>
|
||||||
|
'Nyligen Ack-vägar (tryck för att använda):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull =>
|
||||||
|
'Historisk sökväg är full. Ta bort poster för att lägga till nya.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => 'hoppa';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => 'hoppar';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@@ -1595,6 +1494,12 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
return '$count $_temp0';
|
return '$count $_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => 'framgångar';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Score';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => 'Ta bort sökväg';
|
String get chat_removePath => 'Ta bort sökväg';
|
||||||
|
|
||||||
@@ -1602,144 +1507,50 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
String get chat_noPathHistoryYet =>
|
String get chat_noPathHistoryYet =>
|
||||||
'Ingen historik ännu.\nSkicka ett meddelande för att upptäcka spår.';
|
'Ingen historik ännu.\nSkicka ett meddelande för att upptäcka spår.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => 'Stigar:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => 'Ange anpassad sökväg';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle => 'Ange ruttväg manuellt';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => 'Rensa Vägen';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle => 'Tvinga fram omstart vid nästa sändning';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared =>
|
String get chat_pathCleared =>
|
||||||
'Routen är nu fri. Nästa meddelande kommer att upptäcka rutten igen.';
|
'Routen är nu fri. Nästa meddelande kommer att upptäcka rutten igen.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle => 'Använd routningsomkopplaren i appraden';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled =>
|
||||||
|
'Översvämningsläge aktiverat. Stäng av via ruttikonen i appraden.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => 'Fullständig sökväg';
|
String get chat_fullPath => 'Fullständig sökväg';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => 'Ruttplanering';
|
String get chat_pathDetailsNotAvailable =>
|
||||||
|
'Stigaruppgifterna är ännu inte tillgängliga. Försök att skicka ett meddelande för att uppdatera.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => 'Bil';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@override
|
hopCount,
|
||||||
String get routing_modeFlood => 'Översvämning';
|
locale: localeName,
|
||||||
|
other: 'hoppar',
|
||||||
@override
|
one: 'hopp',
|
||||||
String get routing_modeManual => 'Instruktioner';
|
);
|
||||||
|
return 'Sökväg inställd: $hopCount $_temp0 - $status';
|
||||||
@override
|
|
||||||
String get routing_modeAutoHint =>
|
|
||||||
'Väljer automatiskt den bästa kända vägen, och använder en \"flooding\"-strategi om ingen väg är känd.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint =>
|
|
||||||
'Sändningar via alla repetrar. Det mest pålitliga alternativet, men kräver mer sändtid.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint =>
|
|
||||||
'Skickar alltid den exakta väg du har angivit.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => 'Nuvarande rutt';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops => 'Direkt – utan mellanliggande routrar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet =>
|
|
||||||
'Ingen väg hittad ännu. Nästa meddelande skickas tills en rutt har upptäckts.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast => 'Sändas via alla repetrar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => 'Redigera sökväg';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => 'Glöm vägen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => 'Kända vägar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint => 'Välj en väg för att byta till den.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => 'I användning';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => 'En stark start';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => 'Bra första steg';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => 'Bra första hopp';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => 'Har levererat';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood => 'Fått information via nyhetsflöde';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => 'Ej testat';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return 'arbetade $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => 'aldrig bekräftat';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes delivered, $failures failed';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery => 'Leverans vid översvämningsområde';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => 'Skapa väg';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count av 64 humlor';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'Inga humle än. Använd knapparna nedan för att lägga till dem i rätt ordning, eller spara utan humle för att skicka direkt.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops => 'Tillsätt humlen i rätt ordning.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => 'Sök efter återupptagna samtal';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex => 'Avancerat: rå hex-sökväg';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel => 'Hex-prefikser';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper =>
|
|
||||||
'Två hex-tecken per steg, separerade med kommatecken.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return 'Ogiltigt: $tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops => 'Maximalt 64 humlörter';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => 'Använd denna väg';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => 'Ta bort humlen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop => 'Okänd förstärkare';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally =>
|
String get chat_pathSavedLocally =>
|
||||||
'Sparat lokalt. Anslut för att synkronisera.';
|
'Sparat lokalt. Anslut för att synkronisera.';
|
||||||
@@ -1814,39 +1625,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => 'Nodkarta';
|
String get map_title => 'Nodkarta';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => 'Sök efter nodens namn eller ID';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => 'Aktivitet';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => 'Online';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => 'Nyligen';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => 'Inaktuell';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => 'Synlig';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => 'Dold';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => 'Centrera på nod';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => 'Detaljer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => 'Ingen GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => 'Inga matchande noder';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => 'Synlinje';
|
String get map_lineOfSight => 'Synlinje';
|
||||||
|
|
||||||
@@ -2107,42 +1885,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
return 'Misslyckade nedladdningar: $count';
|
return 'Misslyckade nedladdningar: $count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2208,6 +1950,17 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
String get dialog_disconnectConfirm =>
|
String get dialog_disconnectConfirm =>
|
||||||
'Är du säker på att du vill koppla från enheten?';
|
'Är du säker på att du vill koppla från enheten?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => 'Ansluten ej';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage =>
|
||||||
|
'Du har kopplats från din companion.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion =>
|
||||||
|
'Anslut till en sällskapstjänst för att komma åt upprepning och rumsserverfunktioner.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => 'Återuppta Inloggning';
|
String get login_repeaterLogin => 'Återuppta Inloggning';
|
||||||
|
|
||||||
@@ -2273,13 +2026,65 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => 'Rensa';
|
String get common_clear => 'Rensa';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return 'Nuvarande sökväg: $path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: 'hops',
|
||||||
|
one: 'hop',
|
||||||
|
);
|
||||||
|
return 'Använda $count $_temp0 sökväg';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => 'Ange anpassad sökväg';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => 'Nuvarande sökväg';
|
String get path_currentPathLabel => 'Nuvarande sökväg';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions =>
|
||||||
|
'Ange 2-tecknets hex-prefett för varje hopp, åtskilda med komma.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample =>
|
||||||
|
'Exempel: A1,F2,3C (varje nod använder det första bytet av sitt publika nyckel)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => 'Hexprefixer';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops =>
|
||||||
|
'Max 64 hopp. Varje prefix är 2 hex-tecken (1 byte)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => 'Välj istället från kontakter:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound =>
|
String get path_noRepeatersFound =>
|
||||||
'Inga återuppspelare eller rumsservrar hittades.';
|
'Inga återuppspelare eller rumsservrar hittades.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire =>
|
||||||
|
'Anpassade sökvägar kräver mellansteg som kan vidarebefordra meddelanden.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return 'Ogiltiga hex-prefikser: $prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong => 'Sökvägen är för lång. Max 64 hopp tillåtna.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => 'Ange Sökväg';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => 'Återuppspelarens Hantering';
|
String get repeater_management => 'Återuppspelarens Hantering';
|
||||||
|
|
||||||
@@ -2344,6 +2149,15 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => 'Ruttläge';
|
String get repeater_routingMode => 'Ruttläge';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath => 'Automatisk (använd sparad sökväg)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode => 'Tvinga Översvämningsläge';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => 'Stigarhantering';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => 'Uppdatera';
|
String get repeater_refresh => 'Uppdatera';
|
||||||
|
|
||||||
@@ -2684,42 +2498,7 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'Byte som används för att koda denna repeaters ID i taggar för flood-väg/loopdetektering. 0=1 byte (256 ID:n, upp till 64 hopp), 1=2 byte (65 000 ID:n, upp till 32 hopp), 2=3 byte (16 miljoner ID:n, upp till 21 hopp). Firmware före v1.14 använde alltid 1-byte-vägar; v1.14 och nyare kan konfigureras för 2- eller 3-byte-vägar.';
|
'Byte används för att koda denna repeaters ID i taggar för att upptäcka loopar/flödesvägar. 0=1 byte (256 ID:n, upp till 64 hopp), 1=2 byte (65 000 ID:n, upp till 32 hopp), 2=3 byte (16 miljoner ID:n, upp till 21 hopp). Versioner 1.13 och äldre har stöd för multi-byte-vägar – endast en gång när nätverket är aktiverat (från och med version 1.14).';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => 'Försening i Flood TX';
|
String get repeater_txDelay => 'Försening i Flood TX';
|
||||||
@@ -3463,139 +3242,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => 'Digital ingång';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => 'Digital utgång';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => 'Analog ingång';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => 'Analog utgång';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => 'Allmän sensor';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => 'Ljusstyrka';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => 'Närvaro';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => 'Luftfuktighet';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => 'Accelerometer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => 'Tryck';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => 'Höjd';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => 'Frekvens';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => 'Procent';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => 'Koncentration';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => 'Effekt';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => 'Avstånd';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => 'Energi';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => 'Riktning';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => 'Tid';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => 'Gyrometer';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => 'Färg';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => 'Brytare';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => 'Polylinje';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Hz';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa hPa';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux lx';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts W';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours kWh';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => 'Antal förfrågningar';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => 'Det gick inte att hämta data';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => 'Mottagna grannars data';
|
String get neighbors_receivedData => 'Mottagna grannars data';
|
||||||
|
|
||||||
@@ -4478,17 +4124,6 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
String get translation_composerSubtitle =>
|
String get translation_composerSubtitle =>
|
||||||
'Styr standardtillståndet för kompositorns översättningsikon.';
|
'Styr standardtillståndet för kompositorns översättningsikon.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle =>
|
|
||||||
'Översätt meddelanden automatiskt';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle =>
|
|
||||||
'Översätter meddelanden automatiskt för aviseringar och för chattar eller kanaler.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => 'Översätt meddelande';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => 'Målmedvetet språk';
|
String get translation_targetLanguage => 'Målmedvetet språk';
|
||||||
|
|
||||||
@@ -4617,135 +4252,4 @@ class AppLocalizationsSv extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Unknown';
|
String get contact_typeUnknown => 'Unknown';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => 'Zooma in';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => 'Zooma ut';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => 'Kartöversikt';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'Web Bluetooth kräver en Chromium-baserad webbläsare.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'ID: $id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => 'GPS-verifierat';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => 'Antagen position';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => 'Enkel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => 'Kombinerat';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => 'Spela';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => 'Pausa';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => 'Återspela';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => 'Föregående hopp';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => 'Nästa hopp';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => 'Visa paketanimering';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => 'Dölj paketanimering';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return 'Hopp $current av $total';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return 'Observerade vägar: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => 'Primär';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return 'Alternativ $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count hopp',
|
|
||||||
one: '1 hopp',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => 'Delat segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => 'Uppskattat segment';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return 'Används av $count vägar';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count hopp saknar position — den visade vägen är ofullständig',
|
|
||||||
one: '1 hopp saknar position — den visade vägen är ofullständig',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => 'Visa allt';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => 'Dölj väg';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => 'Visa väg';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => 'Fäll ihop panel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => 'Expandera panel';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => 'Ingen position';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => 'Lås vy till paket';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => 'Lås upp vy från paket';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,24 +92,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => 'Вимкнути';
|
String get common_disable => 'Вимкнути';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => 'Скасувати';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => 'Надіслано';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => 'Доставлено';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => 'Надсилання';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed => 'Не вдалося надіслати';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => 'Почув неодноразово';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => 'Перезавантажити';
|
String get common_reboot => 'Перезавантажити';
|
||||||
|
|
||||||
@@ -129,12 +111,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
return '$percent%';
|
return '$percent%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => 'Автооновлення';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => 'Інтервал';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => 'MeshCore: Відкритий доступ';
|
String get scanner_title => 'MeshCore: Відкритий доступ';
|
||||||
|
|
||||||
@@ -319,10 +295,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => 'Увімкніть Bluetooth';
|
String get scanner_enableBluetooth => 'Увімкніть Bluetooth';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported =>
|
|
||||||
'Bluetooth недоступний у браузері. Підключіться через USB.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => 'Швидке перемикання';
|
String get device_quickSwitch => 'Швидке перемикання';
|
||||||
|
|
||||||
@@ -367,45 +339,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_radioSettingsUpdated => 'Налаштування радіо оновлено';
|
String get settings_radioSettingsUpdated => 'Налаштування радіо оновлено';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => 'Геопозиція';
|
String get settings_location => 'Геопозиція';
|
||||||
|
|
||||||
@@ -501,14 +434,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
String get settings_advertLocationSubtitle =>
|
String get settings_advertLocationSubtitle =>
|
||||||
'Включити геопозицію в оголошення';
|
'Включити геопозицію в оголошення';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate =>
|
|
||||||
'Автооголошення без хопів при оновленні GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'Коли GPS-локація змінюється, надсилати оголошення без хопів (потрібна геопозиція в оголошенні).';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => 'Багато підтверджень';
|
String get settings_multiAck => 'Багато підтверджень';
|
||||||
|
|
||||||
@@ -736,18 +661,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => 'Українська';
|
String get appSettings_languageUk => 'Українська';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing =>
|
String get appSettings_enableMessageTracing =>
|
||||||
'Увімкнути відстеження повідомлень';
|
'Увімкнути відстеження повідомлень';
|
||||||
@@ -870,6 +783,11 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
String get appSettings_maxMessageRetriesSubtitle =>
|
String get appSettings_maxMessageRetriesSubtitle =>
|
||||||
'Кількість спроб повторного відправлення повідомлення перед тим, як позначити його як невдале';
|
'Кількість спроб повторного відправлення повідомлення перед тим, як позначити його як невдале';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => 'Батарея';
|
String get appSettings_battery => 'Батарея';
|
||||||
|
|
||||||
@@ -951,28 +869,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => 'Минулий тиждень';
|
String get appSettings_lastWeek => 'Минулий тиждень';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => 'Джерело растрових тайлів';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Кінцева точка Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Ключ API Stadia';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired =>
|
|
||||||
'Потрібно для використання Stadia Maps';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return 'Налаштовано: $maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'Введіть свій ключ API Stadia Maps. Програма використовує його для запитів растрових тайлів.';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => 'Офлайн-кеш карти';
|
String get appSettings_offlineMapCache => 'Офлайн-кеш карти';
|
||||||
|
|
||||||
@@ -1093,15 +989,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => 'Нова група';
|
String get contacts_newGroup => 'Нова група';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => 'Більше можливостей';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => 'Пошук контактів';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => 'Закрити пошук';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => 'Назва групи';
|
String get contacts_groupName => 'Назва групи';
|
||||||
|
|
||||||
@@ -1401,20 +1288,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => 'напр. #команда';
|
String get channels_hashtagHint => 'напр. #команда';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => 'Поки немає повідомлень.';
|
String get chat_noMessages => 'Поки немає повідомлень.';
|
||||||
|
|
||||||
@@ -1471,9 +1344,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => 'Надіслати GIF';
|
String get chat_sendGif => 'Надіслати GIF';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => 'Відповісти';
|
String get chat_reply => 'Відповісти';
|
||||||
|
|
||||||
@@ -1598,6 +1468,35 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => 'Дамп Hex:';
|
String get debugFrame_hexDump => 'Дамп Hex:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => 'Керування шляхами';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => 'Показати всі шляхи';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => 'Режим маршрутизації';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => 'Авто (використовувати збережений шлях)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode => 'Примусово через всю мережу';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths =>
|
||||||
|
'Підтверджені шляхи (натисніть, щоб використати):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull =>
|
||||||
|
'Історія шляхів заповнена. Видаліть записи, щоб додати нові.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => 'Перехід';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => 'переходів';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@@ -1611,6 +1510,12 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
return '$count $_temp0';
|
return '$count $_temp0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => 'Успішно';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Оцінка';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => 'Видалити шлях';
|
String get chat_removePath => 'Видалити шлях';
|
||||||
|
|
||||||
@@ -1618,148 +1523,54 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
String get chat_noPathHistoryYet =>
|
String get chat_noPathHistoryYet =>
|
||||||
'Історія шляхів недоступна.\nНадішліть повідомлення, щоб виявити шляхи.';
|
'Історія шляхів недоступна.\nНадішліть повідомлення, щоб виявити шляхи.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => 'Дії зі шляхом:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => 'Встановити власний шлях';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle => 'Вказати шлях маршрутизації вручну';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => 'Очистити шлях';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle =>
|
||||||
|
'Примусово повторити пошук при наступному надсиланні';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared =>
|
String get chat_pathCleared =>
|
||||||
'Шлях очищено. Наступне повідомлення оновить маршрут.';
|
'Шлях очищено. Наступне повідомлення оновить маршрут.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle =>
|
||||||
|
'Використовувати перемикач маршрутизації в панелі застосунку';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled =>
|
||||||
|
'Увімкнено режим «через всю мережу». Перемикайте через іконку маршрутизації на панелі інструментів.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => 'Повний шлях';
|
String get chat_fullPath => 'Повний шлях';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => 'Маршрутизація';
|
String get chat_pathDetailsNotAvailable =>
|
||||||
|
'Деталі шляху ще недоступні. Спробуйте надіслати повідомлення для оновлення.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => 'Автомобіль';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
@override
|
hopCount,
|
||||||
String get routing_modeFlood => 'Повені';
|
locale: localeName,
|
||||||
|
other: 'переходів',
|
||||||
@override
|
many: 'переходів',
|
||||||
String get routing_modeManual => 'Інструкція';
|
few: 'переходи',
|
||||||
|
one: 'перехід',
|
||||||
@override
|
);
|
||||||
String get routing_modeAutoHint =>
|
return 'Шлях встановлено: $hopCount $_temp0 - $status';
|
||||||
'Автоматично обирає найкращий відомий шлях, та у разі відсутності відомого шляху, використовує алгоритм \"занурення\".';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint =>
|
|
||||||
'Передавання через усі ретранслятори. Найбільш надійний спосіб, але потребує більше часу.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint =>
|
|
||||||
'Завжди доставляє точно за вказаним вами маршрутом.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => 'Поточний маршрут';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops =>
|
|
||||||
'Пряме з\'єднання – без проміжних ретрансляторів';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet =>
|
|
||||||
'Поки що немає жодного шляху. Повідомлення продовжуються надходити, поки не буде знайдено маршрут.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast => 'Поширення через усі ретранслятори';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => 'Редагувати шлях';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => 'Забудь про шлях';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => 'Відомі маршрути';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint =>
|
|
||||||
'Виберіть опцію, щоб переключитися на неї.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => 'У робочому стані';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => 'Сильний перший стрибок';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => 'Чудова перша спроба';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => 'Перший, але вдалий, крок';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => 'Доставлено';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood => 'Дізнався через новини';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => 'Не протестовано';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return 'worked $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => 'ніколи не підтверджено';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes delivered, $failures failed';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery => 'Доставка під час повені';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => 'Створити маршрут';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count з 64 штук хмелю';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'Ще не додано хміль. Натисніть на відповідні кнопки, щоб додати його в потрібному порядку, або збережіть рецепт без хмілю, щоб відправити його безпосередньо.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops => 'Додавайте хміль у наступній послідовності.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => 'Пошук повторювачів';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex =>
|
|
||||||
'Просунутий рівень: пряма шлях у форматі шестнадцяткової системи.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel =>
|
|
||||||
'Префікси для шестнадцяткової системи числення';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper =>
|
|
||||||
'Два шестизначні символи на кожний крок, розділені комами';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return 'Неправильно: $tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops => 'Максимум 64 хмелеві колоди';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => 'Використовуйте цей шлях';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => 'Видалити хміль';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop => 'Невідомий ретранслятор';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally =>
|
String get chat_pathSavedLocally =>
|
||||||
'Збережено локально. Підключіться для синхронізації.';
|
'Збережено локально. Підключіться для синхронізації.';
|
||||||
@@ -1834,39 +1645,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => 'Карта вузлів';
|
String get map_title => 'Карта вузлів';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => 'Назва або ID вузла';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => 'Активність';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => 'Онлайн';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => 'Нещодавні';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => 'Застаріло';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => 'Видимий';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => 'Прихований';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => 'Центрувати на вузлі';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => 'Деталі';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => 'Без GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => 'Не знайдено відповідних вузлів';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => 'Пряма видимість';
|
String get map_lineOfSight => 'Пряма видимість';
|
||||||
|
|
||||||
@@ -2129,42 +1907,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
return 'Невдалі завантаження: $count';
|
return 'Невдалі завантаження: $count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2230,6 +1972,17 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
String get dialog_disconnectConfirm =>
|
String get dialog_disconnectConfirm =>
|
||||||
'Ви впевнені, що хочете відключитись від цього пристрою?';
|
'Ви впевнені, що хочете відключитись від цього пристрою?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => 'Від’єднано';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage =>
|
||||||
|
'Вас від’єднано від вашого супутника.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion =>
|
||||||
|
'Підключіться до супутнього пристрою, щоб отримати доступ до функцій ретранслятора та сервера кімнат.';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => 'Вхід у ретранслятор';
|
String get login_repeaterLogin => 'Вхід у ретранслятор';
|
||||||
|
|
||||||
@@ -2295,13 +2048,67 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => 'Очистити';
|
String get common_clear => 'Очистити';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return 'Поточний шлях: $path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
String _temp0 = intl.Intl.pluralLogic(
|
||||||
|
count,
|
||||||
|
locale: localeName,
|
||||||
|
other: 'переходами',
|
||||||
|
many: 'переходами',
|
||||||
|
few: 'переходами',
|
||||||
|
one: 'переходом',
|
||||||
|
);
|
||||||
|
return 'Використання шляху з $count $_temp0';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => 'Ввести власний шлях';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => 'Поточний шлях';
|
String get path_currentPathLabel => 'Поточний шлях';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions =>
|
||||||
|
'Введіть 2-символьні hex-префікси для кожного переходу, розділені комами.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample =>
|
||||||
|
'Приклад: A1,F2,3C (кожен вузол використовує перший байт свого відкритого ключа).';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => 'Hex-префікси';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops =>
|
||||||
|
'Макс. 64 переходи. Кожен префікс — 2 шістнадцяткові символи (1 байт)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => 'Вибрати з контактів:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound =>
|
String get path_noRepeatersFound =>
|
||||||
'Ретрансляторів або серверів кімнат не знайдено.';
|
'Ретрансляторів або серверів кімнат не знайдено.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire =>
|
||||||
|
'Власні шляхи вимагають проміжних вузлів, які можуть передавати повідомлення.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return 'Некоректні hex-префікси: $prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong => 'Шлях занадто довгий. Максимум 64 переходи.';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => 'Встановити шлях';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => 'Керування ретранслятором';
|
String get repeater_management => 'Керування ретранслятором';
|
||||||
|
|
||||||
@@ -2366,6 +2173,16 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => 'Режим маршрутизації';
|
String get repeater_routingMode => 'Режим маршрутизації';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath =>
|
||||||
|
'Авто (використовувати збережений шлях)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode => 'Примусово через всю мережу';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => 'Керування шляхами';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => 'Оновити';
|
String get repeater_refresh => 'Оновити';
|
||||||
|
|
||||||
@@ -2716,42 +2533,7 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'Байти, що використовуються для кодування ідентифікатора цього ретранслятора в тегах flood-шляху/виявлення петель. 0=1 байт (256 ідентифікаторів, до 64 переходів), 1=2 байти (65 000 ідентифікаторів, до 32 переходів), 2=3 байти (16 мільйонів ідентифікаторів, до 21 переходу). Прошивки до v1.14 завжди використовували 1-байтові шляхи; v1.14 і новіші можна налаштувати на 2- або 3-байтові шляхи.';
|
'Байти, що використовуються для кодування ідентифікатора цього ретранслятора в тегах для виявлення потоків/петлі. 0=1 байт (256 ідентифікаторів, до 64 перехідів), 1=2 байти (65 000 ідентифікаторів, до 32 перехідів), 2=3 байти (16 мільйонів ідентифікаторів, до 21 переходу). Версії 1.13 та старіші не підтримують багатобайтні шляхи — вони активуються лише після того, як мережа буде оновлена до версії 1.14+.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => 'Затримка у Flood, штат Техас';
|
String get repeater_txDelay => 'Затримка у Flood, штат Техас';
|
||||||
@@ -3503,139 +3285,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => 'Цифровий вхід';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => 'Цифровий вихід';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => 'Аналоговий вхід';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => 'Аналоговий вихід';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => 'Загальний датчик';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => 'Освітленість';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => 'Присутність';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => 'Вологість';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => 'Акселерометр';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => 'Тиск';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => 'Висота';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => 'Частота';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => 'Відсоток';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => 'Концентрація';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => 'Потужність';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => 'Відстань';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => 'Енергія';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => 'Напрямок';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => 'Час';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => 'Гірометр';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => 'Колір';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => 'Перемикач';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => 'Полілінія';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters м';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Гц';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa гПа';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux лк';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts Вт';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters м';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours кВт⋅год';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => 'Кількість запитів';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => 'Не вдалося отримати дані';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => 'Дані сусідів отримано';
|
String get neighbors_receivedData => 'Дані сусідів отримано';
|
||||||
|
|
||||||
@@ -4538,17 +4187,6 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
String get translation_composerSubtitle =>
|
String get translation_composerSubtitle =>
|
||||||
'Контролює стан ікон перекладу, який використовується за замовчуванням.';
|
'Контролює стан ікон перекладу, який використовується за замовчуванням.';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle =>
|
|
||||||
'Автоматично перекладати повідомлення';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle =>
|
|
||||||
'Автоматично перекладає повідомлення для сповіщень, а також для чатів і каналів.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => 'Перекласти повідомлення';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => 'Цільова мова';
|
String get translation_targetLanguage => 'Цільова мова';
|
||||||
|
|
||||||
@@ -4677,140 +4315,4 @@ class AppLocalizationsUk extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Невідомо';
|
String get contact_typeUnknown => 'Невідомо';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => 'Увійти в режим збільшення';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => 'Видалити зум';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => 'Карта центру';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'Web Bluetooth вимагає браузера на основі Chromium';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'ID: $id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => 'GPS підтверджено';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => 'Висновок щодо положення';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => 'Один';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => 'Об\'єднаний';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => 'Відтворити';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => 'Призупинити';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => 'Повтор';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => 'Попередній перехід';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => 'Наступний перехід';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => 'Відобразити анімацію пакета';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => 'Приховати анімацію пакета';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return 'Перехід $current з $total';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return 'Зафіксовані маршрути: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => 'Основний';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return 'Альт. $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count переходів',
|
|
||||||
many: '$count переходів',
|
|
||||||
few: '$count переходи',
|
|
||||||
one: '1 перехід',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => 'Об\'єднаний сегмент';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => 'Орієнтовний сегмент';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return 'Використовується $count шляхами';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other:
|
|
||||||
'$count переходів не мають геопозиції — показаний шлях є частковим',
|
|
||||||
many: '$count переходів не мають геопозиції — показаний шлях є частковим',
|
|
||||||
few: '$count переходи не мають геопозиції — показаний шлях є частковим',
|
|
||||||
one: '1 перехід не має геопозиції — показаний шлях є частковим',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => 'Показати все';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => 'Приховати шлях';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => 'Показати шлях';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => 'Згорнути панель';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => 'Розгорнути панель';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => 'Без геопозиції';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => 'Прив\'язати вигляд до пакету';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => 'Відв\'язати вигляд від пакету';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -92,24 +92,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_disable => '禁用';
|
String get common_disable => '禁用';
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_undo => '撤销';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_sent => '发送';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_delivered => '已送达';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_pending => '发送';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_failed => '发送失败';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get messageStatus_repeated => '多次听到';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get common_reboot => '重启';
|
String get common_reboot => '重启';
|
||||||
|
|
||||||
@@ -129,12 +111,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
return '$percent%';
|
return '$percent%';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_autoRefresh => '自动刷新';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get common_interval => '间隔';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get scanner_title => '连接设备';
|
String get scanner_title => '连接设备';
|
||||||
|
|
||||||
@@ -305,9 +281,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get scanner_enableBluetooth => '启用蓝牙';
|
String get scanner_enableBluetooth => '启用蓝牙';
|
||||||
|
|
||||||
@override
|
|
||||||
String get scanner_bluetoothWebUnsupported => '浏览器不支持蓝牙,请改用 USB 连接。';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get device_quickSwitch => '快速切换';
|
String get device_quickSwitch => '快速切换';
|
||||||
|
|
||||||
@@ -350,45 +323,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_radioSettingsUpdated => '无线电设置已更新';
|
String get settings_radioSettingsUpdated => '无线电设置已更新';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettings => 'Regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionSettingsSubtitle => 'Manage stored regions';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionManagement_screenTitle => 'Region Management';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionNameHint => 'Enter region name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionAddRegion => 'Add region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegions => 'Fetch regions from repeaters';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsFail => 'No regions were found';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionFetchRegionsAlreadyExists =>
|
|
||||||
'This region has already been added';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionName => 'Region Name';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_regionDeleted => 'Region deleted';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_deleteRegion => 'Delete Region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String settings_deleteRegionConfirm(String region) {
|
|
||||||
return 'Remove \"$region\" from region list?';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_location => '位置';
|
String get settings_location => '位置';
|
||||||
|
|
||||||
@@ -476,13 +410,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get settings_advertLocationSubtitle => '在广告中包含位置';
|
String get settings_advertLocationSubtitle => '在广告中包含位置';
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdate => 'GPS 更新时自动发送零跳广告';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
|
|
||||||
'当 GPS 位置变化时,发送零跳广告(需要在广告中包含位置)。';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get settings_multiAck => '多重ACK';
|
String get settings_multiAck => '多重ACK';
|
||||||
|
|
||||||
@@ -701,18 +628,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_languageUk => '乌克兰语';
|
String get appSettings_languageUk => '乌克兰语';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption0 => '0 - 1 byte';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption1 => '1 - 2 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption2 => '2 - 3 bytes';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pathHashModeOption3 => '3 - 4 bytes';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_enableMessageTracing => '启用消息追踪';
|
String get appSettings_enableMessageTracing => '启用消息追踪';
|
||||||
|
|
||||||
@@ -814,6 +729,11 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_maxMessageRetriesSubtitle => '在将消息标记为失败之前,允许尝试的次数';
|
String get appSettings_maxMessageRetriesSubtitle => '在将消息标记为失败之前,允许尝试的次数';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_routeWeight(String weight, String max) {
|
||||||
|
return '$weight/$max';
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_battery => '电池';
|
String get appSettings_battery => '电池';
|
||||||
|
|
||||||
@@ -890,27 +810,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get appSettings_lastWeek => '上周';
|
String get appSettings_lastWeek => '上周';
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_rasterTileSource => '栅格瓦片源';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaEndpoint => 'Stadia 端点';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKey => 'Stadia API 密钥';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyRequired => '使用 Stadia Maps 时必需';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String appSettings_stadiaApiKeyConfigured(String maskedKey) {
|
|
||||||
return '已配置:$maskedKey';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get appSettings_stadiaApiKeyDialogDescription =>
|
|
||||||
'请输入你的 Stadia Maps API 密钥。该应用会使用它来请求栅格瓦片。';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get appSettings_offlineMapCache => '离线地图缓存';
|
String get appSettings_offlineMapCache => '离线地图缓存';
|
||||||
|
|
||||||
@@ -1026,15 +925,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get contacts_newGroup => '新建群聊';
|
String get contacts_newGroup => '新建群聊';
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_moreOptions => '更多选择';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchOpen => '搜索联系人';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get contacts_searchClose => '高级搜索';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get contacts_groupName => '群聊名称';
|
String get contacts_groupName => '群聊名称';
|
||||||
|
|
||||||
@@ -1324,20 +1214,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get channels_hashtagHint => '例如:#团队';
|
String get channels_hashtagHint => '例如:#团队';
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_regionSetTo(String region) {
|
|
||||||
return 'Region: $region';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionNotSet => 'Region: none';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_regionSelect_Title => 'Select a region';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get channels_clearRegion => 'Clear region';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noMessages => '暂无消息';
|
String get chat_noMessages => '暂无消息';
|
||||||
|
|
||||||
@@ -1393,9 +1269,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get chat_sendGif => '发送 GIF';
|
String get chat_sendGif => '发送 GIF';
|
||||||
|
|
||||||
@override
|
|
||||||
String get chat_receivedGif => 'Received a GIF';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_reply => '回复';
|
String get chat_reply => '回复';
|
||||||
|
|
||||||
@@ -1518,149 +1391,85 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get debugFrame_hexDump => '十六进制数据:';
|
String get debugFrame_hexDump => '十六进制数据:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathManagement => '路径管理';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_ShowAllPaths => '显示所有路径';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_routingMode => '路由模式';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_autoUseSavedPath => '自动(使用保存的路径)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_forceFloodMode => '强制泛洪模式';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_recentAckPaths => '最近使用的 ACK 路径(点击使用):';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathHistoryFull => '路径历史已满,请删除后再添加。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopSingular => '跳';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_hopPlural => '跳';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String chat_hopsCount(int count) {
|
String chat_hopsCount(int count) {
|
||||||
return '$count 跳';
|
return '$count 跳';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_successes => '成功';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_score => 'Score';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_removePath => '移除路径';
|
String get chat_removePath => '移除路径';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_noPathHistoryYet => '暂无路径历史。\n发送消息以探索路径。';
|
String get chat_noPathHistoryYet => '暂无路径历史。\n发送消息以探索路径。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_pathActions => '路径操作:';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPath => '设置自定义路径';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_setCustomPathSubtitle => '手动指定路由路径';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPath => '清除路径';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_clearPathSubtitle => '清除当前路径,下次发送将重新尝试。';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathCleared => '路径已清除。下一条消息将重新路由。';
|
String get chat_pathCleared => '路径已清除。下一条消息将重新路由。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeSubtitle => '在应用栏中切换路由模式。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get chat_floodModeEnabled => '泛洪模式已启用。可通过应用栏的路由图标切换。';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_fullPath => '完整路径';
|
String get chat_fullPath => '完整路径';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_title => '路由';
|
String get chat_pathDetailsNotAvailable => '路径信息暂不可用,请尝试发送消息刷新。';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get routing_modeAuto => '汽车';
|
String chat_pathSetHops(int hopCount, String status) {
|
||||||
|
return '路径设置:$hopCount 跳 - $status';
|
||||||
@override
|
|
||||||
String get routing_modeFlood => '洪水';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManual => '手册';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeAutoHint => '自动选择已知最佳路径,当没有已知路径时,则进行“洪水”搜索。';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeFloodHint => '通过所有中继站进行广播。 这种方式最可靠,但占用更多的时间。';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_modeManualHint => '总是按照您设置的路径进行导航。';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_currentRoute => '当前路线';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_directNoHops => '直接连接— 无中继跳';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_noPathYet => '目前还没有找到路径。直到找到路径,才会收到后续消息。';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodBroadcast => '通过所有中继器进行广播';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_editPath => '编辑路径';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_forgetPath => '忘记原路';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPaths => '已知的路径';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_knownPathsHint => '点击该路径以切换到它。';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_inUse => '使用中';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityStrong => '强劲的初始阶段';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityGood => '不错的开端';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFair => '第一次尝试,结果良好';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityWorked => '已完成';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityFlood => '通过新闻报道';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_qualityUntested => '未经测试';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_lastWorked(String when) {
|
|
||||||
return '工作于 $when';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_neverWorked => '从未得到证实';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String routing_deliveryCounts(int successes, int failures) {
|
|
||||||
return '$successes delivered, $failures failed';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get routing_floodDelivery => '洪水配送';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_title => '构建路径';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_hopCounter(int count) {
|
|
||||||
return '$count of 64 hops';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_noHops =>
|
|
||||||
'目前还没有添加任何啤酒花。点击下面的“添加”按钮,按顺序添加,或者直接保存,不添加任何啤酒花。';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_addHops => '按照顺序添加啤酒花';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_searchRepeaters => '重复搜索';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_advancedHex => '高级:原始十六进制路径';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexLabel => '十六进制前缀';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_hexHelper => '每次跳跃,使用两个十六进制字符,用逗号分隔。';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathEditor_invalidTokens(String tokens) {
|
|
||||||
return '无效:$tokens';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_tooManyHops => '最多 64 个跳跃';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_usePath => '请使用此路径';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_removeHop => '去除啤酒花';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathEditor_unknownHop => '未知的重复器';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get chat_pathSavedLocally => '已本地保存,连接设备后可同步。';
|
String get chat_pathSavedLocally => '已本地保存,连接设备后可同步。';
|
||||||
|
|
||||||
@@ -1733,39 +1542,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get map_title => '节点地图';
|
String get map_title => '节点地图';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_searchHint => '搜索节点名称或ID';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_activity => '活动';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_online => '在线';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_recent => '最近';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_stale => '过时';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_visible => '可见';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_hidden => '已隐藏';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerOnNode => '以节点为中心';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_details => '详细信息';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noGps => '无 GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_noResults => '未找到匹配的节点';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get map_lineOfSight => '视线';
|
String get map_lineOfSight => '视线';
|
||||||
|
|
||||||
@@ -2021,42 +1797,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
return '下载失败:$count';
|
return '下载失败:$count';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTilesLabel => 'Cached tiles';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledForSource(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_bulkDownloadDisabledInConfig(String source) {
|
|
||||||
return 'Offline bulk downloads are disabled for $source in this app configuration.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summarySource(String source) {
|
|
||||||
return 'Source: $source';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedTilesForSource(int count) {
|
|
||||||
return 'Cached tiles for source: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryCachedInSelection(int count) {
|
|
||||||
return 'Cached in selected area/zoom: $count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String mapCache_summaryApproxCacheSize(String size) {
|
|
||||||
return 'Approx cache size: $size';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String mapCache_boundsLabel(
|
String mapCache_boundsLabel(
|
||||||
String north,
|
String north,
|
||||||
@@ -2121,6 +1861,15 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get dialog_disconnectConfirm => '确定要断开与此设备的连接吗?';
|
String get dialog_disconnectConfirm => '确定要断开与此设备的连接吗?';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedTitle => '已断开连接';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_disconnectedMessage => '你已与你的伙伴断开连接。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get dialog_connectCompanion => '连接伴机以访问中继器和房间服务器功能。';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get login_repeaterLogin => '转发节点登录';
|
String get login_repeaterLogin => '转发节点登录';
|
||||||
|
|
||||||
@@ -2182,12 +1931,54 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get common_clear => '清除';
|
String get common_clear => '清除';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_currentPath(String path) {
|
||||||
|
return '当前路径:$path';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_usingHopsPath(int count) {
|
||||||
|
return '使用 $count 跳路径';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_enterCustomPath => '输入自定义路径';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_currentPathLabel => '当前路径';
|
String get path_currentPathLabel => '当前路径';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixInstructions => '请输入每个中继节点的2字符十六进制前缀,用逗号分隔。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_hexPrefixExample => '例如:A1, F2, 3C(每个节点使用其公钥的第一字节)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_labelHexPrefixes => '路径(十六进制前缀)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_helperMaxHops => '最多 64 跳。每个前缀由 2 个十六进制字符(1 字节)组成。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_selectFromContacts => '或从联系人列表中选择:';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get path_noRepeatersFound => '未找到任何转发节点或房间服务器。';
|
String get path_noRepeatersFound => '未找到任何转发节点或房间服务器。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_customPathsRequire => '自定义路径需要中间节点转发消息。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String path_invalidHexPrefixes(String prefixes) {
|
||||||
|
return '无效的十六进制前缀:$prefixes';
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_tooLong => '路径过长,最多允许 64 跳。';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get path_setPath => '设置路径';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_management => '转发节点管理';
|
String get repeater_management => '转发节点管理';
|
||||||
|
|
||||||
@@ -2248,6 +2039,15 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get repeater_routingMode => '路由模式';
|
String get repeater_routingMode => '路由模式';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_autoUseSavedPath => '自动(使用保存的路径)';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_forceFloodMode => '强制泛洪模式';
|
||||||
|
|
||||||
|
@override
|
||||||
|
String get repeater_pathManagement => '路径管理';
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_refresh => '刷新';
|
String get repeater_refresh => '刷新';
|
||||||
|
|
||||||
@@ -2571,42 +2371,7 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_pathHashModeHelper =>
|
String get repeater_pathHashModeHelper =>
|
||||||
'用于在洪泛路径/环路检测标签中编码此中继器 ID 的字节数。0=1 字节(256 个 ID,最多 64 跳),1=2 字节(65K 个 ID,最多 32 跳),2=3 字节(16M 个 ID,最多 21 跳)。v1.14 之前的固件始终使用 1 字节路径;v1.14 及更新版本可配置为 2 或 3 字节路径。';
|
'用于编码此复用器的 ID 的字节数,在“洪流路径/环检测”标签中使用。 0=1 字节(256 个 ID,最多 64 个跳跃),1=2 字节(65K 个 ID,最多 32 个跳跃),2=3 字节(16M 个 ID,最多 21 个跳跃)。 v1.13 及更早版本的固件会使用多字节路径——只有在您的网络升级到 v1.14 或更高版本后才会生效。';
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettings => 'Change Identity Keys';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_keySettingsSubtitle =>
|
|
||||||
'Change the public/private keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKey => 'Private key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_prvKeyHelper =>
|
|
||||||
'A new private key for the repeater, a 128-character hex string.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_generatePrvKey => 'Generate a random keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_stopGeneratingPrvKey => 'Interrupt search for keypair';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKey => 'Public key';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyHelper =>
|
|
||||||
'This is the public key that goes with the generated private key. You can\'t set this directly.';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get repeater_pubKeyPrefix => 'Desired prefix';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String repeater_pubKeyPrefixHelper(int tries) {
|
|
||||||
return 'Find a public key that starts with these hex digits. Expected tries needed: $tries.';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get repeater_txDelay => '洪水(德克萨斯州)延误';
|
String get repeater_txDelay => '洪水(德克萨斯州)延误';
|
||||||
@@ -3243,139 +3008,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
return '$celsius°C / $fahrenheit°F';
|
return '$celsius°C / $fahrenheit°F';
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalInputLabel => '数字输入';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_digitalOutputLabel => '数字输出';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogInputLabel => '模拟输入';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_analogOutputLabel => '模拟输出';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_genericLabel => '通用传感器';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_luminosityLabel => '照度';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_presenceLabel => '存在检测';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_humidityLabel => '湿度';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_accelerometerLabel => '加速度计';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_pressureLabel => '气压';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_altitudeLabel => '高度';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_frequencyLabel => '频率';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_percentageLabel => '百分比';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_concentrationLabel => '浓度';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_powerLabel => '功率';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_distanceLabel => '距离';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_energyLabel => '能量';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_directionLabel => '方向';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_timeLabel => '时间';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gyrometerLabel => '陀螺仪';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_colourLabel => '颜色';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_gpsLabel => 'GPS';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_switchLabel => '开关';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_polylineLabel => '折线';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_altitudeValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_frequencyValue(String hertz) {
|
|
||||||
return '$hertz Hz';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_pressureValue(String hpa) {
|
|
||||||
return '$hpa hPa';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_luminosityValue(String lux) {
|
|
||||||
return '$lux lx';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_powerValue(String watts) {
|
|
||||||
return '$watts W';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_distanceValue(String meters) {
|
|
||||||
return '$meters m';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_energyValue(String kilowattHours) {
|
|
||||||
return '$kilowattHours kWh';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_directionValue(String degrees) {
|
|
||||||
return '$degrees°';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_concentrationValue(String ppm) {
|
|
||||||
return '$ppm ppm';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_percentageValue(String percent) {
|
|
||||||
return '$percent%';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String telemetry_analogValue(String value) {
|
|
||||||
return '$value';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_autoFetchQuantity => '请求次数';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get telemetry_error => '无法获取数据';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get neighbors_receivedData => '已接收邻居信息';
|
String get neighbors_receivedData => '已接收邻居信息';
|
||||||
|
|
||||||
@@ -4193,15 +3825,6 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
@override
|
@override
|
||||||
String get translation_composerSubtitle => '控制作曲家翻译图标的默认状态。';
|
String get translation_composerSubtitle => '控制作曲家翻译图标的默认状态。';
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingTitle => '自动翻译消息';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_autoIncomingSubtitle => '自动为通知以及聊天或频道翻译消息。';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get translation_translateMessage => '翻译消息';
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String get translation_targetLanguage => '目标语言';
|
String get translation_targetLanguage => '目标语言';
|
||||||
|
|
||||||
@@ -4324,135 +3947,4 @@ class AppLocalizationsZh extends AppLocalizations {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
String get contact_typeUnknown => 'Unknown';
|
String get contact_typeUnknown => 'Unknown';
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomIn => '放大';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_zoomOut => '放大';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get map_centerMap => '中心地图';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get chrome_bluetoothRequiresChromium =>
|
|
||||||
'Web Bluetooth 需要 Chromium 浏览器';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String channels_communityShortId(String id) {
|
|
||||||
return 'ID:$id...';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendGpsConfirmed => '通过GPS确认';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathTrace_legendInferred => '推测的位置';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewSingle => '单条';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_viewCombined => '综合';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_play => '播放';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_pause => '暂停';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_replay => '重播';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepBack => '上一跳';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_stepForward => '下一跳';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOn => '显示数据包动画';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_animationOff => '隐藏数据包动画';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopOf(int current, int total) {
|
|
||||||
return '第 $current 跳,共 $total 跳';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_observedPaths(int count) {
|
|
||||||
return '观测到的路径:$count';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_primary => '主路径';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_alternate(int index) {
|
|
||||||
return '备用 $index';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_hopCount(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count 跳',
|
|
||||||
one: '1 跳',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_gpsCount(int confirmed, int total) {
|
|
||||||
return '$confirmed/$total GPS';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendShared => '共享路段';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_legendEstimated => '估算路段';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_sharedNodeCount(int count) {
|
|
||||||
return '已被 $count 条路径使用';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String pathMap_partialAnimation(int count) {
|
|
||||||
String _temp0 = intl.Intl.pluralLogic(
|
|
||||||
count,
|
|
||||||
locale: localeName,
|
|
||||||
other: '$count 跳无位置信息 — 显示的路径不完整',
|
|
||||||
one: '1 跳无位置信息 — 显示的路径不完整',
|
|
||||||
);
|
|
||||||
return '$_temp0';
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showAllPaths => '显示全部';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_hidePath => '隐藏路径';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_showPath => '显示路径';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_collapsePanel => '收起面板';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_expandPanel => '展开面板';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_noLocation => '无位置';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_followPacket => '锁定视图跟随数据包';
|
|
||||||
|
|
||||||
@override
|
|
||||||
String get pathMap_unfollowPacket => '解锁视图跟随';
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,6 @@
|
|||||||
"common_remove": "Verwijderen",
|
"common_remove": "Verwijderen",
|
||||||
"common_enable": "Activeren",
|
"common_enable": "Activeren",
|
||||||
"common_disable": "Uitschakelen",
|
"common_disable": "Uitschakelen",
|
||||||
"common_autoRefresh": "Automatisch vernieuwen",
|
|
||||||
"common_interval": "Tijdsinterval",
|
|
||||||
"common_reboot": "Herstarten",
|
"common_reboot": "Herstarten",
|
||||||
"common_loading": "Laden...",
|
"common_loading": "Laden...",
|
||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
@@ -100,8 +98,6 @@
|
|||||||
"settings_locationInvalid": "Ongeldige breedtegraad of lengtegraad.",
|
"settings_locationInvalid": "Ongeldige breedtegraad of lengtegraad.",
|
||||||
"settings_latitude": "Breedtegraad",
|
"settings_latitude": "Breedtegraad",
|
||||||
"settings_longitude": "Lengtegraad",
|
"settings_longitude": "Lengtegraad",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "Automatische zero-hop-advertentie bij GPS-update",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "Wanneer de GPS-locatie verandert, een zero-hop-advertentie verzenden (vereist locatie in advertentie).",
|
|
||||||
"settings_privacyMode": "Privacy-modus",
|
"settings_privacyMode": "Privacy-modus",
|
||||||
"settings_privacyModeSubtitle": "Naam/locatie verbergen in advertenties",
|
"settings_privacyModeSubtitle": "Naam/locatie verbergen in advertenties",
|
||||||
"settings_privacyModeToggle": "Schakel privacy modus in om je naam en locatie in advertenties te verbergen.",
|
"settings_privacyModeToggle": "Schakel privacy modus in om je naam en locatie in advertenties te verbergen.",
|
||||||
@@ -242,19 +238,6 @@
|
|||||||
"appSettings_last6Hours": "Afgelopen 6 uur",
|
"appSettings_last6Hours": "Afgelopen 6 uur",
|
||||||
"appSettings_last24Hours": "Afgelopen 24 uur",
|
"appSettings_last24Hours": "Afgelopen 24 uur",
|
||||||
"appSettings_lastWeek": "Afgelopen week",
|
"appSettings_lastWeek": "Afgelopen week",
|
||||||
"appSettings_rasterTileSource": "Rastertegelbron",
|
|
||||||
"appSettings_stadiaEndpoint": "Stadia-eindpunt",
|
|
||||||
"appSettings_stadiaApiKey": "Stadia API-sleutel",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "Vereist voor gebruik van Stadia Maps",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "Geconfigureerd: {maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "Voer je Stadia Maps API-sleutel in. De app gebruikt die voor rastertegelverzoeken.",
|
|
||||||
"appSettings_offlineMapCache": "Offline Kaartcache",
|
"appSettings_offlineMapCache": "Offline Kaartcache",
|
||||||
"appSettings_noAreaSelected": "Geen gebied geselecteerd",
|
"appSettings_noAreaSelected": "Geen gebied geselecteerd",
|
||||||
"appSettings_areaSelectedZoom": "Geselecteerd gebied (zoom {minZoom}-{maxZoom})",
|
"appSettings_areaSelectedZoom": "Geselecteerd gebied (zoom {minZoom}-{maxZoom})",
|
||||||
@@ -784,56 +767,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
||||||
"@mapCache_boundsLabel": {
|
"@mapCache_boundsLabel": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -1172,7 +1105,7 @@
|
|||||||
"repeater_advancedSettings": "Geavanceerd",
|
"repeater_advancedSettings": "Geavanceerd",
|
||||||
"repeater_advancedSettingsSubtitle": "Regelhendels voor ervaren gebruikers",
|
"repeater_advancedSettingsSubtitle": "Regelhendels voor ervaren gebruikers",
|
||||||
"repeater_pathHashMode": "Hash-modus voor paden",
|
"repeater_pathHashMode": "Hash-modus voor paden",
|
||||||
"repeater_pathHashModeHelper": "Bytes die gebruikt worden om de ID van deze repeater te coderen in flood-pad/lusdetectietags. 0=1 byte (256 ID's, tot 64 hops), 1=2 bytes (65.000 ID's, tot 32 hops), 2=3 bytes (16 miljoen ID's, tot 21 hops). Firmware vóór v1.14 gebruikte altijd 1-byte paden; v1.14 en nieuwer kunnen worden ingesteld op 2- of 3-byte paden.",
|
"repeater_pathHashModeHelper": "Bytes die gebruikt worden om de ID van deze repeater te coderen in flood-pad/lusdetectietags. 0=1 byte (256 ID's, tot 64 hops), 1=2 bytes (65.000 ID's, tot 32 hops), 2=3 bytes (16 miljoen ID's, tot 21 hops). Versies 1.13 en ouder gebruiken multi-byte paden – alleen na het activeren van het netwerk.",
|
||||||
"repeater_txDelay": "Vertraging bij Flood TX",
|
"repeater_txDelay": "Vertraging bij Flood TX",
|
||||||
"repeater_txDelayHelper": "Herzendinterval voor verkeer tijdens overstromingen, als een veelvoud van de tijd die het pakket nodig heeft (0-2, standaard 0.5). Een hoger getal betekent minder botsingen, maar ook een langere leveringstijd.",
|
"repeater_txDelayHelper": "Herzendinterval voor verkeer tijdens overstromingen, als een veelvoud van de tijd die het pakket nodig heeft (0-2, standaard 0.5). Een hoger getal betekent minder botsingen, maar ook een langere leveringstijd.",
|
||||||
"repeater_directTxDelay": "Directe vertraging",
|
"repeater_directTxDelay": "Directe vertraging",
|
||||||
@@ -1347,43 +1280,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"telemetry_digitalInputLabel": "Digitale ingang",
|
|
||||||
"telemetry_digitalOutputLabel": "Digitale uitgang",
|
|
||||||
"telemetry_analogInputLabel": "Analoge ingang",
|
|
||||||
"telemetry_analogOutputLabel": "Analoge uitgang",
|
|
||||||
"telemetry_genericLabel": "Algemene sensor",
|
|
||||||
"telemetry_luminosityLabel": "Lichtsterkte",
|
|
||||||
"telemetry_presenceLabel": "Aanwezigheid",
|
|
||||||
"telemetry_humidityLabel": "Luchtvochtigheid",
|
|
||||||
"telemetry_accelerometerLabel": "Versnellingsmeter",
|
|
||||||
"telemetry_pressureLabel": "Druk",
|
|
||||||
"telemetry_altitudeLabel": "Hoogte",
|
|
||||||
"telemetry_frequencyLabel": "Frequentie",
|
|
||||||
"telemetry_percentageLabel": "Percentage",
|
|
||||||
"telemetry_concentrationLabel": "Concentratie",
|
|
||||||
"telemetry_powerLabel": "Vermogen",
|
|
||||||
"telemetry_distanceLabel": "Afstand",
|
|
||||||
"telemetry_energyLabel": "Energie",
|
|
||||||
"telemetry_directionLabel": "Richting",
|
|
||||||
"telemetry_timeLabel": "Tijd",
|
|
||||||
"telemetry_gyrometerLabel": "Gyrometer",
|
|
||||||
"telemetry_colourLabel": "Kleur",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "Schakelaar",
|
|
||||||
"telemetry_polylineLabel": "Polylijn",
|
|
||||||
"telemetry_altitudeValue": "{meters} m",
|
|
||||||
"telemetry_frequencyValue": "{hertz} Hz",
|
|
||||||
"telemetry_pressureValue": "{hpa} hPa",
|
|
||||||
"telemetry_luminosityValue": "{lux} lx",
|
|
||||||
"telemetry_powerValue": "{watts} W",
|
|
||||||
"telemetry_distanceValue": "{meters} m",
|
|
||||||
"telemetry_energyValue": "{kilowattHours} kWh",
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"telemetry_autoFetchQuantity": "Aantal aanvragen",
|
|
||||||
"telemetry_error": "Kan gegevens niet ophalen",
|
|
||||||
"telemetry_noData": "Geen telemetriedata beschikbaar.",
|
"telemetry_noData": "Geen telemetriedata beschikbaar.",
|
||||||
"telemetry_channelTitle": "Kanaal {channel}",
|
"telemetry_channelTitle": "Kanaal {channel}",
|
||||||
"@telemetry_channelTitle": {
|
"@telemetry_channelTitle": {
|
||||||
@@ -2205,9 +2101,6 @@
|
|||||||
"translation_composerTitle": "Vertaal voor verzending",
|
"translation_composerTitle": "Vertaal voor verzending",
|
||||||
"translation_composerSubtitle": "Stelt de standaardstatus van het pictogram voor de vertaling van de componist in.",
|
"translation_composerSubtitle": "Stelt de standaardstatus van het pictogram voor de vertaling van de componist in.",
|
||||||
"translation_useAppLanguage": "Gebruik de taal van de app",
|
"translation_useAppLanguage": "Gebruik de taal van de app",
|
||||||
"translation_autoIncomingTitle": "Berichten automatisch vertalen",
|
|
||||||
"translation_autoIncomingSubtitle": "Vertaalt berichten automatisch voor meldingen en voor chats of kanalen.",
|
|
||||||
"translation_translateMessage": "Bericht vertalen",
|
|
||||||
"translation_targetLanguage": "Doeltaal",
|
"translation_targetLanguage": "Doeltaal",
|
||||||
"translation_downloadedModelLabel": "Gedownloade model",
|
"translation_downloadedModelLabel": "Gedownloade model",
|
||||||
"translation_presetModelLabel": "Voorgeprogrammeerd Hugging Face-model",
|
"translation_presetModelLabel": "Voorgeprogrammeerd Hugging Face-model",
|
||||||
@@ -2419,191 +2312,8 @@
|
|||||||
"chat_markAsUnread": "Markeer als ongelezen",
|
"chat_markAsUnread": "Markeer als ongelezen",
|
||||||
"settings_companionDebugLogSubtitle": "BLE/TCP/USB commando's, antwoorden en ruwe data",
|
"settings_companionDebugLogSubtitle": "BLE/TCP/USB commando's, antwoorden en ruwe data",
|
||||||
"repeater_chanUtil": "Gebruik van het kanaal",
|
"repeater_chanUtil": "Gebruik van het kanaal",
|
||||||
"@routing_lastWorked": {
|
"dialog_connectCompanion": "Maak verbinding met een companion om repeater- en kamerserverfuncties te gebruiken.",
|
||||||
"placeholders": {
|
"dialog_disconnectedTitle": "Verbroken",
|
||||||
"when": {
|
"dialog_disconnectedMessage": "Je bent losgekoppeld van je companion.",
|
||||||
"type": "String"
|
"contact_connectCompanion": "Maak verbinding met een companion om toegang te krijgen tot repeater- en roomserverfuncties."
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messageStatus_sent": "Verzonden",
|
|
||||||
"common_undo": "Achterhalen/Annuleren",
|
|
||||||
"messageStatus_delivered": "Leverd",
|
|
||||||
"messageStatus_pending": "Verzenden",
|
|
||||||
"messageStatus_failed": "Niet verzonden",
|
|
||||||
"messageStatus_repeated": "Hearsay, herhaald",
|
|
||||||
"contacts_moreOptions": "Meer opties",
|
|
||||||
"contacts_searchOpen": "Zoek contactpersonen",
|
|
||||||
"contacts_searchClose": "Zoeken",
|
|
||||||
"routing_title": "Routeplanning",
|
|
||||||
"routing_modeAuto": "Auto",
|
|
||||||
"routing_modeFlood": "Overstroming",
|
|
||||||
"routing_modeManual": "Handleiding",
|
|
||||||
"routing_modeAutoHint": "Selecteert automatisch het bekendste pad, en gebruikt een flood-algoritme als er geen bekend pad is.",
|
|
||||||
"routing_modeFloodHint": "Uitzendingen via elke zender. De meest betrouwbare methode, maar vereist meer uitzendtijd.",
|
|
||||||
"routing_modeManualHint": "Stuurt altijd de exacte route die u heeft aangegeven.",
|
|
||||||
"routing_currentRoute": "Huidige route",
|
|
||||||
"routing_directNoHops": "Direct – zonder tussenliggende schakels",
|
|
||||||
"routing_noPathYet": "Er is nog geen route gevonden. De berichten blijven binnenkomen totdat een route is ontdekt.",
|
|
||||||
"routing_floodBroadcast": "Uitgestoten via elke zender.",
|
|
||||||
"routing_editPath": "Pad bewerken",
|
|
||||||
"routing_forgetPath": "Vergeet het pad",
|
|
||||||
"routing_knownPaths": "Bekende routes",
|
|
||||||
"routing_knownPathsHint": "Maak een route om er naartoe te gaan.",
|
|
||||||
"routing_inUse": "In gebruik",
|
|
||||||
"routing_qualityStrong": "Sterke eerste sprong",
|
|
||||||
"routing_qualityGood": "Een goede eerste stap",
|
|
||||||
"routing_qualityFair": "Een goede eerste hop",
|
|
||||||
"routing_qualityWorked": "Is geleverd",
|
|
||||||
"routing_qualityFlood": "Hears via een overstroming",
|
|
||||||
"routing_qualityUntested": "Niet getest",
|
|
||||||
"routing_neverWorked": "nooit bevestigd",
|
|
||||||
"routing_deliveryCounts": "{successes} zijn behaald, {failures} zijn mislukt",
|
|
||||||
"routing_floodDelivery": "Levering bij overstroming",
|
|
||||||
"pathEditor_title": "Pad creëren",
|
|
||||||
"pathEditor_hopCounter": "{count} van 64 hopgranen",
|
|
||||||
"pathEditor_noHops": "Er zijn nog geen hop toegevoegd. Klik op de onderstaande knoppen om ze in de juiste volgorde toe te voegen, of sla de bestelling op zonder hop om deze direct te versturen.",
|
|
||||||
"pathEditor_addHops": "Voeg hop toe in de juiste volgorde.",
|
|
||||||
"pathEditor_searchRepeaters": "Zoek naar herhaaldelijke zenders",
|
|
||||||
"pathEditor_advancedHex": "Geavanceerd: ruwe hex-pad",
|
|
||||||
"pathEditor_hexLabel": "Hex-voorkanten",
|
|
||||||
"pathEditor_hexHelper": "Twee hex-tekens per stap, gescheiden door komma's",
|
|
||||||
"pathEditor_invalidTokens": "Ongeldig: {tokens}",
|
|
||||||
"pathEditor_tooManyHops": "Maximaal 64 hopken",
|
|
||||||
"pathEditor_usePath": "Gebruik deze route.",
|
|
||||||
"pathEditor_removeHop": "Verwijder de hop",
|
|
||||||
"pathEditor_unknownHop": "Onbekend type zender",
|
|
||||||
"map_zoomIn": "Inzoomen",
|
|
||||||
"routing_lastWorked": "worked {when}",
|
|
||||||
"map_zoomOut": "Inzoomen",
|
|
||||||
"map_centerMap": "Centraal overzicht",
|
|
||||||
"chrome_bluetoothRequiresChromium": "Web Bluetooth vereist een Chromium-browser.",
|
|
||||||
"channels_communityShortId": "ID: {id}...",
|
|
||||||
"pathTrace_legendGpsConfirmed": "GPS-locatie bevestigd",
|
|
||||||
"pathTrace_legendInferred": "Afgeleide positie",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"map_activity": "Activiteit",
|
|
||||||
"map_searchHint": "Zoek op naam of ID van de knoop",
|
|
||||||
"scanner_bluetoothWebUnsupported": "Bluetooth is niet beschikbaar in de browser. Verbind dan via USB.",
|
|
||||||
"map_online": "Online",
|
|
||||||
"map_recent": "Recent",
|
|
||||||
"map_stale": "Verouderd",
|
|
||||||
"map_visible": "Zichtbaar",
|
|
||||||
"map_hidden": "Verborgen",
|
|
||||||
"map_centerOnNode": "Centreer op node",
|
|
||||||
"map_details": "Details",
|
|
||||||
"map_noGps": "Geen GPS",
|
|
||||||
"map_noResults": "Geen overeenkomende nodes",
|
|
||||||
"pathMap_viewSingle": "Enkel",
|
|
||||||
"pathMap_viewCombined": "Gezamenlijk",
|
|
||||||
"pathMap_play": "Afspelen",
|
|
||||||
"pathMap_pause": "Pauze",
|
|
||||||
"pathMap_replay": "Herhalen",
|
|
||||||
"pathMap_stepBack": "Vorige hop",
|
|
||||||
"pathMap_stepForward": "Volgende hop",
|
|
||||||
"pathMap_animationOn": "Pakketanimatie tonen",
|
|
||||||
"pathMap_animationOff": "Pakketanimatie verbergen",
|
|
||||||
"pathMap_hopOf": "Hop {current} van {total}",
|
|
||||||
"pathMap_observedPaths": "Waargenomen paden: {count}",
|
|
||||||
"pathMap_primary": "Primair",
|
|
||||||
"pathMap_alternate": "Alternatief {index}",
|
|
||||||
"pathMap_hopCount": "{count, plural, =1{1 hop} other{{count} hops}}",
|
|
||||||
"pathMap_legendShared": "Gedeeld segment",
|
|
||||||
"pathMap_legendEstimated": "Geschat segment",
|
|
||||||
"pathMap_sharedNodeCount": "Gebruikt door {count} paden",
|
|
||||||
"pathMap_partialAnimation": "{count, plural, =1{1 hop heeft geen locatie — het weergegeven pad is onvolledig} other{{count} hops hebben geen locatie — het weergegeven pad is onvolledig}}",
|
|
||||||
"pathMap_showAllPaths": "Toon alles",
|
|
||||||
"pathMap_hidePath": "Verberg pad",
|
|
||||||
"pathMap_showPath": "Toon pad",
|
|
||||||
"pathMap_collapsePanel": "Paneel inklappen",
|
|
||||||
"pathMap_expandPanel": "Paneel uitklappen",
|
|
||||||
"pathMap_noLocation": "Geen locatie",
|
|
||||||
"pathMap_followPacket": "Weergave vergrendelen op pakket",
|
|
||||||
"pathMap_unfollowPacket": "Weergave ontgrendelen van pakket",
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,6 @@
|
|||||||
"common_remove": "Usuń",
|
"common_remove": "Usuń",
|
||||||
"common_enable": "Włącz",
|
"common_enable": "Włącz",
|
||||||
"common_disable": "Wyłącz",
|
"common_disable": "Wyłącz",
|
||||||
"common_autoRefresh": "Automatyczne odświeżanie",
|
|
||||||
"common_interval": "Interwał",
|
|
||||||
"common_reboot": "Uruchom ponownie",
|
"common_reboot": "Uruchom ponownie",
|
||||||
"common_loading": "Ładowanie...",
|
"common_loading": "Ładowanie...",
|
||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
@@ -100,8 +98,6 @@
|
|||||||
"settings_locationInvalid": "Nieprawidłowa szerokość geograficzna lub długość geograficzna.",
|
"settings_locationInvalid": "Nieprawidłowa szerokość geograficzna lub długość geograficzna.",
|
||||||
"settings_latitude": "Szerokość",
|
"settings_latitude": "Szerokość",
|
||||||
"settings_longitude": "Długość",
|
"settings_longitude": "Długość",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "Automatyczne ogłoszenie zero-hop przy aktualizacji GPS",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "Gdy lokalizacja GPS się zmieni, wyślij ogłoszenie zero-hop (wymaga lokalizacji w ogłoszeniu).",
|
|
||||||
"settings_privacyMode": "Tryb prywatności",
|
"settings_privacyMode": "Tryb prywatności",
|
||||||
"settings_privacyModeSubtitle": "Ukryj imię/lokalizację w rozgłoszeniach",
|
"settings_privacyModeSubtitle": "Ukryj imię/lokalizację w rozgłoszeniach",
|
||||||
"settings_privacyModeToggle": "Włącz tryb prywatności, aby ukryć swoje imię i lokalizację w rozgłoszeniach.",
|
"settings_privacyModeToggle": "Włącz tryb prywatności, aby ukryć swoje imię i lokalizację w rozgłoszeniach.",
|
||||||
@@ -242,19 +238,6 @@
|
|||||||
"appSettings_last6Hours": "Ostatnie 6 godzin",
|
"appSettings_last6Hours": "Ostatnie 6 godzin",
|
||||||
"appSettings_last24Hours": "Ostatnie 24 godziny",
|
"appSettings_last24Hours": "Ostatnie 24 godziny",
|
||||||
"appSettings_lastWeek": "Ostatni tydzień",
|
"appSettings_lastWeek": "Ostatni tydzień",
|
||||||
"appSettings_rasterTileSource": "Źródło kafelków rastrowych",
|
|
||||||
"appSettings_stadiaEndpoint": "Punkt końcowy Stadia",
|
|
||||||
"appSettings_stadiaApiKey": "Klucz API Stadia",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "Wymagane do korzystania ze Stadia Maps",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "Skonfigurowano: {maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "Wprowadź swój klucz API Stadia Maps. Aplikacja używa go do żądań kafelków rastrowych.",
|
|
||||||
"appSettings_offlineMapCache": "Pamięć podręczna map offline",
|
"appSettings_offlineMapCache": "Pamięć podręczna map offline",
|
||||||
"appSettings_noAreaSelected": "Nie wybrano żadnego obszaru.",
|
"appSettings_noAreaSelected": "Nie wybrano żadnego obszaru.",
|
||||||
"appSettings_areaSelectedZoom": "Wybrany obszar (skala {minZoom}-{maxZoom})",
|
"appSettings_areaSelectedZoom": "Wybrany obszar (skala {minZoom}-{maxZoom})",
|
||||||
@@ -794,56 +777,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
||||||
"@mapCache_boundsLabel": {
|
"@mapCache_boundsLabel": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -1182,7 +1115,7 @@
|
|||||||
"repeater_advancedSettings": "Zaawansowany",
|
"repeater_advancedSettings": "Zaawansowany",
|
||||||
"repeater_advancedSettingsSubtitle": "Regulowane pokrętła dla doświadczonych operatorów",
|
"repeater_advancedSettingsSubtitle": "Regulowane pokrętła dla doświadczonych operatorów",
|
||||||
"repeater_pathHashMode": "Tryb haszujący ścieżkę",
|
"repeater_pathHashMode": "Tryb haszujący ścieżkę",
|
||||||
"repeater_pathHashModeHelper": "Bajty używane do kodowania identyfikatora tego repeatera w tagach ścieżki flood/wykrywania pętli. 0=1 bajt (256 identyfikatorów, do 64 skoków), 1=2 bajty (65 000 identyfikatorów, do 32 skoków), 2=3 bajty (16 milionów identyfikatorów, do 21 skoków). Firmware sprzed v1.14 zawsze używał ścieżek 1-bajtowych; v1.14 i nowsze można skonfigurować na ścieżki 2- lub 3-bajtowe.",
|
"repeater_pathHashModeHelper": "Bity wykorzystywane do kodowania identyfikatora tego urządzenia w tagach ścieżek/detekcji pętli. 0=1 bity (256 identyfikatorów, do 64 skoków), 1=2 bity (65 000 identyfikatorów, do 32 skoków), 2=3 bity (1 600 000 identyfikatorów, do 21 skoków). Wersje 1.13 i wcześniejsze nie obsługują ścieżek wielobitowych – wykrywają tylko jedną, gdy sieć jest w wersji 1.14 lub nowszej.",
|
||||||
"repeater_txDelay": "Opóźnienie w Flood, TX",
|
"repeater_txDelay": "Opóźnienie w Flood, TX",
|
||||||
"repeater_txDelayHelper": "Ustawienie odstępu dla ruchu związanego z powodzią, jako mnożnik czasu przesyłania pakietu (0-2, domyślnie 0,5). Wyższe wartości oznaczają mniejszą liczbę kolizji, ale wolniejszą prędkość przesyłania.",
|
"repeater_txDelayHelper": "Ustawienie odstępu dla ruchu związanego z powodzią, jako mnożnik czasu przesyłania pakietu (0-2, domyślnie 0,5). Wyższe wartości oznaczają mniejszą liczbę kolizji, ale wolniejszą prędkość przesyłania.",
|
||||||
"repeater_directTxDelay": "Bezpośrednie opóźnienie sygnału TX",
|
"repeater_directTxDelay": "Bezpośrednie opóźnienie sygnału TX",
|
||||||
@@ -1357,43 +1290,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"telemetry_digitalInputLabel": "Wejście cyfrowe",
|
|
||||||
"telemetry_digitalOutputLabel": "Wyjście cyfrowe",
|
|
||||||
"telemetry_analogInputLabel": "Wejście analogowe",
|
|
||||||
"telemetry_analogOutputLabel": "Wyjście analogowe",
|
|
||||||
"telemetry_genericLabel": "Czujnik ogólny",
|
|
||||||
"telemetry_luminosityLabel": "Jasność",
|
|
||||||
"telemetry_presenceLabel": "Obecność",
|
|
||||||
"telemetry_humidityLabel": "Wilgotność",
|
|
||||||
"telemetry_accelerometerLabel": "Akcelerometr",
|
|
||||||
"telemetry_pressureLabel": "Ciśnienie",
|
|
||||||
"telemetry_altitudeLabel": "Wysokość",
|
|
||||||
"telemetry_frequencyLabel": "Częstotliwość",
|
|
||||||
"telemetry_percentageLabel": "Procent",
|
|
||||||
"telemetry_concentrationLabel": "Stężenie",
|
|
||||||
"telemetry_powerLabel": "Moc",
|
|
||||||
"telemetry_distanceLabel": "Odległość",
|
|
||||||
"telemetry_energyLabel": "Energia",
|
|
||||||
"telemetry_directionLabel": "Kierunek",
|
|
||||||
"telemetry_timeLabel": "Czas",
|
|
||||||
"telemetry_gyrometerLabel": "Żyrometr",
|
|
||||||
"telemetry_colourLabel": "Kolor",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "Przełącznik",
|
|
||||||
"telemetry_polylineLabel": "Polilinia",
|
|
||||||
"telemetry_altitudeValue": "{meters} m",
|
|
||||||
"telemetry_frequencyValue": "{hertz} Hz",
|
|
||||||
"telemetry_pressureValue": "{hpa} hPa",
|
|
||||||
"telemetry_luminosityValue": "{lux} lx",
|
|
||||||
"telemetry_powerValue": "{watts} W",
|
|
||||||
"telemetry_distanceValue": "{meters} m",
|
|
||||||
"telemetry_energyValue": "{kilowattHours} kWh",
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"telemetry_autoFetchQuantity": "Liczba żądań",
|
|
||||||
"telemetry_error": "Nie udało się pobrać danych",
|
|
||||||
"telemetry_noData": "Brak dostępnych danych telemetrycznych.",
|
"telemetry_noData": "Brak dostępnych danych telemetrycznych.",
|
||||||
"telemetry_channelTitle": "Kanał {channel}",
|
"telemetry_channelTitle": "Kanał {channel}",
|
||||||
"@telemetry_channelTitle": {
|
"@telemetry_channelTitle": {
|
||||||
@@ -2241,9 +2137,6 @@
|
|||||||
"translation_enableTitle": "Włącz tłumaczenie",
|
"translation_enableTitle": "Włącz tłumaczenie",
|
||||||
"translation_enableSubtitle": "Tłumaczenie otrzymywanych wiadomości oraz umożliwienie tłumaczenia przed wysłaniem.",
|
"translation_enableSubtitle": "Tłumaczenie otrzymywanych wiadomości oraz umożliwienie tłumaczenia przed wysłaniem.",
|
||||||
"translation_composerSubtitle": "Kontroluje domyślny stan ikony tłumaczenia w edytorze.",
|
"translation_composerSubtitle": "Kontroluje domyślny stan ikony tłumaczenia w edytorze.",
|
||||||
"translation_autoIncomingTitle": "Automatycznie tłumacz wiadomości",
|
|
||||||
"translation_autoIncomingSubtitle": "Automatycznie tłumaczy wiadomości do powiadomień oraz do czatów lub kanałów.",
|
|
||||||
"translation_translateMessage": "Przetłumacz wiadomość",
|
|
||||||
"translation_targetLanguage": "Język docelowy",
|
"translation_targetLanguage": "Język docelowy",
|
||||||
"translation_useAppLanguage": "Użyj języka aplikacji",
|
"translation_useAppLanguage": "Użyj języka aplikacji",
|
||||||
"translation_downloadedModelLabel": "Pobudowany model",
|
"translation_downloadedModelLabel": "Pobudowany model",
|
||||||
@@ -2457,191 +2350,8 @@
|
|||||||
"chat_markAsUnread": "Oznacz jako nieprzeczytane",
|
"chat_markAsUnread": "Oznacz jako nieprzeczytane",
|
||||||
"settings_companionDebugLog": "Log debugowania (dla pomocy w rozwiązywaniu problemów)",
|
"settings_companionDebugLog": "Log debugowania (dla pomocy w rozwiązywaniu problemów)",
|
||||||
"repeater_chanUtil": "Wykorzystanie kanału",
|
"repeater_chanUtil": "Wykorzystanie kanału",
|
||||||
"@routing_lastWorked": {
|
"dialog_connectCompanion": "Połącz się z towarzyszem, aby uzyskać dostęp do funkcji powtarzacza i serwera pokoi.",
|
||||||
"placeholders": {
|
"dialog_disconnectedTitle": "Rozłączono",
|
||||||
"when": {
|
"dialog_disconnectedMessage": "Zostałeś rozłączony ze swoim towarzyszem.",
|
||||||
"type": "String"
|
"contact_connectCompanion": "Połącz się z towarzyszem, aby uzyskać dostęp do funkcji repeatera i serwera pokojowego."
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messageStatus_sent": "Wysłane",
|
|
||||||
"messageStatus_delivered": "Dostarczone",
|
|
||||||
"messageStatus_pending": "Wysyłanie",
|
|
||||||
"common_undo": "Wycofaj",
|
|
||||||
"messageStatus_failed": "Nie udało się wysłać",
|
|
||||||
"messageStatus_repeated": "Usłyszałem to wielokrotnie",
|
|
||||||
"contacts_moreOptions": "Więcej opcji",
|
|
||||||
"contacts_searchOpen": "Wyszukaj kontakty",
|
|
||||||
"contacts_searchClose": "Zaawansowane wyszukiwanie",
|
|
||||||
"routing_title": "Planowanie tras",
|
|
||||||
"routing_modeAuto": "Samochód",
|
|
||||||
"routing_modeFlood": "Powódź",
|
|
||||||
"routing_modeManual": "Instrukcja obsługi",
|
|
||||||
"routing_modeAutoHint": "Automatycznie wybiera najpopularniejszą ścieżkę, a w przypadku braku znanej, przechodzi do trybu \"przepływu\".",
|
|
||||||
"routing_modeFloodHint": "Transmisje za pośrednictwem każdego repeatera. Najbardziej niezawodna metoda, ale zużywa więcej czasu transmisji.",
|
|
||||||
"routing_modeManualHint": "Zawsze prowadzi dokładnie po trasie, którą określiłeś.",
|
|
||||||
"routing_currentRoute": "Obecna trasa",
|
|
||||||
"routing_directNoHops": "Bezpośrednio – bez pośrednictwa repeaterów",
|
|
||||||
"routing_noPathYet": "Na razie nie ma żadnej ścieżki. Komunikacja trwa do momentu, gdy zostanie odkryta trasa.",
|
|
||||||
"routing_floodBroadcast": "Transmisja za pośrednictwem każdego urządzenia powielającego",
|
|
||||||
"routing_editPath": "Edytuj ścieżkę",
|
|
||||||
"routing_forgetPath": "Zapomnij o ścieżce",
|
|
||||||
"routing_knownPaths": "Znane trasy",
|
|
||||||
"routing_knownPathsHint": "Wybierz ścieżkę, aby przełączyć się na nią.",
|
|
||||||
"routing_inUse": "W użyciu",
|
|
||||||
"routing_qualityStrong": "Silny pierwszy skok",
|
|
||||||
"routing_qualityGood": "Świetny początek",
|
|
||||||
"routing_qualityFair": "Świetny pierwszy krzak",
|
|
||||||
"routing_qualityWorked": "Zostało dostarczone",
|
|
||||||
"routing_qualityFlood": "Usłyszano dzięki doniesieniom",
|
|
||||||
"routing_qualityUntested": "Nieużywany",
|
|
||||||
"routing_lastWorked": "pracował {when}",
|
|
||||||
"routing_neverWorked": "nigdy nie zostało potwierdzone",
|
|
||||||
"routing_floodDelivery": "Dostawa w przypadku powodzi",
|
|
||||||
"pathEditor_title": "Stworzenie ścieżki",
|
|
||||||
"pathEditor_hopCounter": "{count} z 64 rodzajów chmielu",
|
|
||||||
"pathEditor_noHops": "Na razie nie dodano żadnych chmielu. Aby dodać je w odpowiedniej kolejności, kliknij w odpowiednie przyciski poniżej, lub zapisz przepis bez chmielu, aby wysłać go bezpośrednio.",
|
|
||||||
"pathEditor_addHops": "Dodawaj chmiel zgodnie z kolejnością.",
|
|
||||||
"pathEditor_searchRepeaters": "Funkcje powtarzania",
|
|
||||||
"pathEditor_advancedHex": "Zaawansowane: ścieżka w formacie szesnastkowym",
|
|
||||||
"pathEditor_hexLabel": "Prefiksy heksadecymalne",
|
|
||||||
"pathEditor_hexHelper": "Dwa znaki szesnastkowe na każdym kroku, oddzielone przecinkami",
|
|
||||||
"pathEditor_invalidTokens": "Nieprawidłowe: {tokens}",
|
|
||||||
"pathEditor_tooManyHops": "Maksymalnie 64 hopów",
|
|
||||||
"pathEditor_usePath": "Użyj tej ścieżki.",
|
|
||||||
"pathEditor_removeHop": "Usuń dziką psiankę",
|
|
||||||
"pathEditor_unknownHop": "Nieznany repeater",
|
|
||||||
"map_zoomIn": "Przybliż",
|
|
||||||
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
||||||
"map_zoomOut": "Przybliż z powrotem",
|
|
||||||
"map_centerMap": "Mapa centrum",
|
|
||||||
"chrome_bluetoothRequiresChromium": "Web Bluetooth wymaga przeglądarki Chromium.",
|
|
||||||
"channels_communityShortId": "ID: {id}...",
|
|
||||||
"pathTrace_legendGpsConfirmed": "GPS potwierdzone",
|
|
||||||
"pathTrace_legendInferred": "Wywnioskowana pozycja",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"map_online": "Online",
|
|
||||||
"map_searchHint": "Wyszukaj nazwę lub identyfikator węzła",
|
|
||||||
"scanner_bluetoothWebUnsupported": "Bluetooth nie jest dostępny w przeglądarce. Połącz się przez USB.",
|
|
||||||
"map_activity": "Aktywność",
|
|
||||||
"map_recent": "Ostatnie",
|
|
||||||
"map_stale": "Nieaktualne",
|
|
||||||
"map_visible": "Widoczny",
|
|
||||||
"map_hidden": "Ukryty",
|
|
||||||
"map_centerOnNode": "Wyśrodkuj na węźle",
|
|
||||||
"map_details": "Szczegóły",
|
|
||||||
"map_noGps": "Brak GPS",
|
|
||||||
"map_noResults": "Brak pasujących węzłów",
|
|
||||||
"pathMap_viewSingle": "Pojedyncza",
|
|
||||||
"pathMap_viewCombined": "Połączone",
|
|
||||||
"pathMap_play": "Odtwórz",
|
|
||||||
"pathMap_pause": "Wstrzymaj",
|
|
||||||
"pathMap_replay": "Odtwórz ponownie",
|
|
||||||
"pathMap_stepBack": "Poprzedni skok",
|
|
||||||
"pathMap_stepForward": "Następny skok",
|
|
||||||
"pathMap_animationOn": "Pokaż animację pakietu",
|
|
||||||
"pathMap_animationOff": "Ukryj animację pakietu",
|
|
||||||
"pathMap_hopOf": "Skok {current} z {total}",
|
|
||||||
"pathMap_observedPaths": "Obserwowane trasy: {count}",
|
|
||||||
"pathMap_primary": "Główna",
|
|
||||||
"pathMap_alternate": "Alt. {index}",
|
|
||||||
"pathMap_hopCount": "{count, plural, =1{1 skok} few{{count} skoki} many{{count} skoków} other{{count} skoku}}",
|
|
||||||
"pathMap_legendShared": "Wspólny segment",
|
|
||||||
"pathMap_legendEstimated": "Szacunkowy segment",
|
|
||||||
"pathMap_sharedNodeCount": "Wykorzystywane przez {count} ścieżek",
|
|
||||||
"pathMap_partialAnimation": "{count, plural, =1{1 skok nie ma lokalizacji — pokazana ścieżka jest niekompletna} few{{count} skoki nie mają lokalizacji — pokazana ścieżka jest niekompletna} many{{count} skoków nie ma lokalizacji — pokazana ścieżka jest niekompletna} other{{count} skoku nie ma lokalizacji — pokazana ścieżka jest niekompletna}}",
|
|
||||||
"pathMap_showAllPaths": "Pokaż wszystkie",
|
|
||||||
"pathMap_hidePath": "Ukryj ścieżkę",
|
|
||||||
"pathMap_showPath": "Wyświetl trasę",
|
|
||||||
"pathMap_collapsePanel": "Zwiń panel",
|
|
||||||
"pathMap_expandPanel": "Rozwiń panel",
|
|
||||||
"pathMap_noLocation": "Brak lokalizacji",
|
|
||||||
"pathMap_followPacket": "Śledź pakiet",
|
|
||||||
"pathMap_unfollowPacket": "Przestań śledzić pakiet",
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,6 @@
|
|||||||
"common_remove": "Remover",
|
"common_remove": "Remover",
|
||||||
"common_enable": "Ativar",
|
"common_enable": "Ativar",
|
||||||
"common_disable": "Desativar",
|
"common_disable": "Desativar",
|
||||||
"common_autoRefresh": "Atualização automática",
|
|
||||||
"common_interval": "Intervalo",
|
|
||||||
"common_reboot": "Reiniciar",
|
"common_reboot": "Reiniciar",
|
||||||
"common_loading": "Carregando...",
|
"common_loading": "Carregando...",
|
||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
@@ -100,8 +98,6 @@
|
|||||||
"settings_locationInvalid": "Latitude ou longitude inválidos.",
|
"settings_locationInvalid": "Latitude ou longitude inválidos.",
|
||||||
"settings_latitude": "Latitude",
|
"settings_latitude": "Latitude",
|
||||||
"settings_longitude": "Longitude",
|
"settings_longitude": "Longitude",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "Anúncio zero-hop automático na atualização do GPS",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "Quando a localização GPS mudar, enviar um anúncio zero-hop (requer localização no anúncio).",
|
|
||||||
"settings_privacyMode": "Modo de Privacidade",
|
"settings_privacyMode": "Modo de Privacidade",
|
||||||
"settings_privacyModeSubtitle": "Esconder nome/localização em anúncios",
|
"settings_privacyModeSubtitle": "Esconder nome/localização em anúncios",
|
||||||
"settings_privacyModeToggle": "Ative o modo de privacidade para ocultar seu nome e localização em anúncios.",
|
"settings_privacyModeToggle": "Ative o modo de privacidade para ocultar seu nome e localização em anúncios.",
|
||||||
@@ -242,19 +238,6 @@
|
|||||||
"appSettings_last6Hours": "Últimos 6 horas",
|
"appSettings_last6Hours": "Últimos 6 horas",
|
||||||
"appSettings_last24Hours": "Últimas 24 horas",
|
"appSettings_last24Hours": "Últimas 24 horas",
|
||||||
"appSettings_lastWeek": "Da última semana",
|
"appSettings_lastWeek": "Da última semana",
|
||||||
"appSettings_rasterTileSource": "Fonte de blocos raster",
|
|
||||||
"appSettings_stadiaEndpoint": "Endpoint da Stadia",
|
|
||||||
"appSettings_stadiaApiKey": "Chave da API Stadia",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "Obrigatório para usar o Stadia Maps",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "Configurado: {maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "Insira sua chave da API Stadia Maps. O aplicativo a usa para solicitações de blocos raster.",
|
|
||||||
"appSettings_offlineMapCache": "Cache de Mapa Offline",
|
"appSettings_offlineMapCache": "Cache de Mapa Offline",
|
||||||
"appSettings_noAreaSelected": "Nenhuma área selecionada",
|
"appSettings_noAreaSelected": "Nenhuma área selecionada",
|
||||||
"appSettings_areaSelectedZoom": "Área selecionada (zoom {minZoom}-{maxZoom})",
|
"appSettings_areaSelectedZoom": "Área selecionada (zoom {minZoom}-{maxZoom})",
|
||||||
@@ -784,56 +767,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
||||||
"@mapCache_boundsLabel": {
|
"@mapCache_boundsLabel": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -1172,7 +1105,7 @@
|
|||||||
"repeater_advancedSettings": "Avançado",
|
"repeater_advancedSettings": "Avançado",
|
||||||
"repeater_advancedSettingsSubtitle": "Controles de ajuste para operadores experientes",
|
"repeater_advancedSettingsSubtitle": "Controles de ajuste para operadores experientes",
|
||||||
"repeater_pathHashMode": "Modo de hash de caminho",
|
"repeater_pathHashMode": "Modo de hash de caminho",
|
||||||
"repeater_pathHashModeHelper": "Bytes usados para codificar o ID deste repetidor nas tags de caminho flood/detecção de loop. 0=1 byte (256 IDs, até 64 saltos), 1=2 bytes (65.000 IDs, até 32 saltos), 2=3 bytes (16 milhões de IDs, até 21 saltos). O firmware anterior à v1.14 sempre usava caminhos de 1 byte; v1.14 e versões mais recentes podem ser configuradas para caminhos de 2 ou 3 bytes.",
|
"repeater_pathHashModeHelper": "Bytes utilizados para codificar o ID deste repetidor nas tags de caminho/detecção de loop. 0=1 byte (256 IDs, até 64 saltos), 1=2 bytes (65.000 IDs, até 32 saltos), 2=3 bytes (16 milhões de IDs, até 21 saltos). As versões 1.13 e anteriores do firmware não suportam caminhos multi-byte — apenas funcionam uma vez após a ativação da rede (a partir da versão 1.14+).",
|
||||||
"repeater_txDelay": "Atraso na entrega em Flood, TX",
|
"repeater_txDelay": "Atraso na entrega em Flood, TX",
|
||||||
"repeater_txDelayHelper": "Ajuste de espaçamento para tráfego de inundações, como um multiplicador do tempo de transmissão (0-2, padrão 0,5). Quanto maior, menos colisões, mas uma entrega mais lenta.",
|
"repeater_txDelayHelper": "Ajuste de espaçamento para tráfego de inundações, como um multiplicador do tempo de transmissão (0-2, padrão 0,5). Quanto maior, menos colisões, mas uma entrega mais lenta.",
|
||||||
"repeater_directTxDelay": "Atraso direto no sinal TX",
|
"repeater_directTxDelay": "Atraso direto no sinal TX",
|
||||||
@@ -1347,43 +1280,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"telemetry_digitalInputLabel": "Entrada digital",
|
|
||||||
"telemetry_digitalOutputLabel": "Saída digital",
|
|
||||||
"telemetry_analogInputLabel": "Entrada analógica",
|
|
||||||
"telemetry_analogOutputLabel": "Saída analógica",
|
|
||||||
"telemetry_genericLabel": "Sensor genérico",
|
|
||||||
"telemetry_luminosityLabel": "Luminosidade",
|
|
||||||
"telemetry_presenceLabel": "Presença",
|
|
||||||
"telemetry_humidityLabel": "Humidade",
|
|
||||||
"telemetry_accelerometerLabel": "Acelerómetro",
|
|
||||||
"telemetry_pressureLabel": "Pressão",
|
|
||||||
"telemetry_altitudeLabel": "Altitude",
|
|
||||||
"telemetry_frequencyLabel": "Frequência",
|
|
||||||
"telemetry_percentageLabel": "Percentagem",
|
|
||||||
"telemetry_concentrationLabel": "Concentração",
|
|
||||||
"telemetry_powerLabel": "Potência",
|
|
||||||
"telemetry_distanceLabel": "Distância",
|
|
||||||
"telemetry_energyLabel": "Energia",
|
|
||||||
"telemetry_directionLabel": "Direção",
|
|
||||||
"telemetry_timeLabel": "Hora",
|
|
||||||
"telemetry_gyrometerLabel": "Girómetro",
|
|
||||||
"telemetry_colourLabel": "Cor",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "Interruptor",
|
|
||||||
"telemetry_polylineLabel": "Polilinha",
|
|
||||||
"telemetry_altitudeValue": "{meters} m",
|
|
||||||
"telemetry_frequencyValue": "{hertz} Hz",
|
|
||||||
"telemetry_pressureValue": "{hpa} hPa",
|
|
||||||
"telemetry_luminosityValue": "{lux} lx",
|
|
||||||
"telemetry_powerValue": "{watts} W",
|
|
||||||
"telemetry_distanceValue": "{meters} m",
|
|
||||||
"telemetry_energyValue": "{kilowattHours} kWh",
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"telemetry_autoFetchQuantity": "Número de solicitações",
|
|
||||||
"telemetry_error": "Não foi possível obter os dados",
|
|
||||||
"telemetry_noData": "Não estão disponíveis dados de telemetria.",
|
"telemetry_noData": "Não estão disponíveis dados de telemetria.",
|
||||||
"telemetry_channelTitle": "Canal {channel}",
|
"telemetry_channelTitle": "Canal {channel}",
|
||||||
"@telemetry_channelTitle": {
|
"@telemetry_channelTitle": {
|
||||||
@@ -2204,9 +2100,6 @@
|
|||||||
"translation_enableTitle": "Ativar a tradução",
|
"translation_enableTitle": "Ativar a tradução",
|
||||||
"translation_title": "Tradução",
|
"translation_title": "Tradução",
|
||||||
"translation_composerSubtitle": "Controla o estado padrão do ícone de tradução do compositor.",
|
"translation_composerSubtitle": "Controla o estado padrão do ícone de tradução do compositor.",
|
||||||
"translation_autoIncomingTitle": "Traduzir mensagens automaticamente",
|
|
||||||
"translation_autoIncomingSubtitle": "Traduz automaticamente mensagens para notificações e para chats ou canais.",
|
|
||||||
"translation_translateMessage": "Traduzir mensagem",
|
|
||||||
"translation_targetLanguage": "Língua-alvo",
|
"translation_targetLanguage": "Língua-alvo",
|
||||||
"translation_useAppLanguage": "Utilize o idioma da aplicação",
|
"translation_useAppLanguage": "Utilize o idioma da aplicação",
|
||||||
"translation_downloadedModelLabel": "Modelo baixado",
|
"translation_downloadedModelLabel": "Modelo baixado",
|
||||||
@@ -2419,191 +2312,8 @@
|
|||||||
"chat_markAsUnread": "Marcar como não lido",
|
"chat_markAsUnread": "Marcar como não lido",
|
||||||
"chat_newMessages": "Novas mensagens",
|
"chat_newMessages": "Novas mensagens",
|
||||||
"repeater_chanUtil": "Utilização do canal",
|
"repeater_chanUtil": "Utilização do canal",
|
||||||
"@routing_lastWorked": {
|
"dialog_connectCompanion": "Conecte-se a um dispositivo companion para acessar as funcionalidades de repetidor e servidor de salas.",
|
||||||
"placeholders": {
|
"dialog_disconnectedTitle": "Desconectado",
|
||||||
"when": {
|
"dialog_disconnectedMessage": "Você foi desconectado do seu companheiro.",
|
||||||
"type": "String"
|
"contact_connectCompanion": "Conecte-se a um companheiro para acessar recursos de repetidor e servidor de sala."
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"common_undo": "Desfazer",
|
|
||||||
"messageStatus_sent": "Enviado",
|
|
||||||
"messageStatus_pending": "Enviar",
|
|
||||||
"messageStatus_delivered": "Entregue",
|
|
||||||
"messageStatus_failed": "Falhou ao enviar",
|
|
||||||
"messageStatus_repeated": "Ouvi repetidamente",
|
|
||||||
"contacts_moreOptions": "Mais opções",
|
|
||||||
"contacts_searchOpen": "Pesquisar contatos",
|
|
||||||
"contacts_searchClose": "Pesquisa avançada",
|
|
||||||
"routing_title": "Rotas",
|
|
||||||
"routing_modeAuto": "Carro",
|
|
||||||
"routing_modeFlood": "Inundação",
|
|
||||||
"routing_modeManual": "Manual",
|
|
||||||
"routing_modeAutoHint": "Seleciona automaticamente o caminho mais conhecido, e, se nenhum caminho conhecido for encontrado, utiliza a estratégia de \"inundação\".",
|
|
||||||
"routing_modeFloodHint": "Transmissão através de todos os repetidores. É a opção mais confiável, mas utiliza mais tempo de transmissão.",
|
|
||||||
"routing_modeManualHint": "Sempre segue exatamente o caminho que você define.",
|
|
||||||
"routing_currentRoute": "Rota atual",
|
|
||||||
"routing_directNoHops": "Direto – sem saltos de repetidor",
|
|
||||||
"routing_noPathYet": "Ainda não há um caminho definido. A mensagem continua a ser enviada até que uma rota seja encontrada.",
|
|
||||||
"routing_floodBroadcast": "Transmissão através de todos os repetidores",
|
|
||||||
"routing_editPath": "Editar caminho",
|
|
||||||
"routing_forgetPath": "Esqueça o caminho",
|
|
||||||
"routing_knownPaths": "Rotas conhecidas",
|
|
||||||
"routing_knownPathsHint": "Toque em um caminho para alternar para ele.",
|
|
||||||
"routing_inUse": "Em uso",
|
|
||||||
"routing_qualityStrong": "Primeiro salto notável",
|
|
||||||
"routing_qualityGood": "Primeiro salto bem-sucedido",
|
|
||||||
"routing_qualityFair": "Primeira etapa bem-sucedida",
|
|
||||||
"routing_qualityWorked": "Foi entregue",
|
|
||||||
"routing_qualityFlood": "Informação obtida através de relatos generalizados.",
|
|
||||||
"routing_qualityUntested": "Não testado",
|
|
||||||
"routing_neverWorked": "nunca confirmado",
|
|
||||||
"routing_floodDelivery": "Entrega em áreas afetadas por inundações",
|
|
||||||
"pathEditor_title": "Criar Caminho",
|
|
||||||
"pathEditor_hopCounter": "{count} de 64 gramas de lúpulo",
|
|
||||||
"pathEditor_noHops": "Ainda não há lúpulos adicionados. Clique nos repetidores abaixo para adicioná-los na ordem desejada, ou salve sem adicionar lúpulos para enviar diretamente.",
|
|
||||||
"pathEditor_addHops": "Adicione os lúpulos na seguinte ordem.",
|
|
||||||
"pathEditor_searchRepeaters": "Encontrar repetidores",
|
|
||||||
"pathEditor_advancedHex": "Avançado: caminho hexadecimal bruto",
|
|
||||||
"pathEditor_hexLabel": "Prefixos hexadecimais",
|
|
||||||
"pathEditor_hexHelper": "Dois caracteres hexadecimais por salto, separados por vírgulas.",
|
|
||||||
"pathEditor_invalidTokens": "Inválido: {tokens}",
|
|
||||||
"routing_lastWorked": "worked {when}",
|
|
||||||
"pathEditor_tooManyHops": "Máximo de 64 saltos",
|
|
||||||
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
||||||
"pathEditor_usePath": "Utilize este caminho.",
|
|
||||||
"pathEditor_removeHop": "Remova o lúpulo",
|
|
||||||
"pathEditor_unknownHop": "Repetidor desconhecido",
|
|
||||||
"map_zoomIn": "Ampliar",
|
|
||||||
"map_zoomOut": "Ampliar",
|
|
||||||
"map_centerMap": "Mapa do centro",
|
|
||||||
"chrome_bluetoothRequiresChromium": "O Web Bluetooth requer um navegador Chromium.",
|
|
||||||
"channels_communityShortId": "ID: {id}...",
|
|
||||||
"pathTrace_legendGpsConfirmed": "GPS confirmado",
|
|
||||||
"pathTrace_legendInferred": "Posição inferida",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"map_online": "Online",
|
|
||||||
"map_activity": "Atividade",
|
|
||||||
"scanner_bluetoothWebUnsupported": "A funcionalidade Bluetooth não está disponível no navegador. Conecte-se via USB em vez disso.",
|
|
||||||
"map_searchHint": "Pesquisar por nome ou ID do nó",
|
|
||||||
"map_recent": "Recente",
|
|
||||||
"map_stale": "Vencido",
|
|
||||||
"map_visible": "Visível",
|
|
||||||
"map_hidden": "Escondido",
|
|
||||||
"map_centerOnNode": "Centralizar no nó",
|
|
||||||
"map_details": "Detalhes",
|
|
||||||
"map_noGps": "Sem GPS",
|
|
||||||
"map_noResults": "Nenhum nó encontrado",
|
|
||||||
"pathMap_viewSingle": "Único",
|
|
||||||
"pathMap_viewCombined": "Combinado",
|
|
||||||
"pathMap_play": "Reproduzir",
|
|
||||||
"pathMap_pause": "Pausa",
|
|
||||||
"pathMap_stepBack": "Salto anterior",
|
|
||||||
"pathMap_replay": "Repetir",
|
|
||||||
"pathMap_stepForward": "Próximo salto",
|
|
||||||
"pathMap_animationOn": "Exibir animação do pacote",
|
|
||||||
"pathMap_animationOff": "Ocultar a animação do pacote",
|
|
||||||
"pathMap_hopOf": "Salto {current} de {total}",
|
|
||||||
"pathMap_observedPaths": "Caminhos observados: {count}",
|
|
||||||
"pathMap_primary": "Primário",
|
|
||||||
"pathMap_alternate": "Alt {index}",
|
|
||||||
"pathMap_hopCount": "{count, plural, =1{1 salto} other{{count} saltos}}",
|
|
||||||
"pathMap_legendShared": "Segmento compartilhado",
|
|
||||||
"pathMap_legendEstimated": "Segmento estimado",
|
|
||||||
"pathMap_sharedNodeCount": "Utilizado em {count} caminhos",
|
|
||||||
"pathMap_partialAnimation": "{count, plural, =1{1 salto não tem localização — o caminho mostrado é parcial} other{{count} saltos não têm localização — o caminho mostrado é parcial}}",
|
|
||||||
"pathMap_showAllPaths": "Mostrar tudo",
|
|
||||||
"pathMap_hidePath": "Esconder caminho",
|
|
||||||
"pathMap_showPath": "Mostrar o caminho",
|
|
||||||
"pathMap_collapsePanel": "Recolher painel",
|
|
||||||
"pathMap_expandPanel": "Expandir painel",
|
|
||||||
"pathMap_noLocation": "Sem localização",
|
|
||||||
"pathMap_followPacket": "Fixar vista no pacote",
|
|
||||||
"pathMap_unfollowPacket": "Liberar vista do pacote",
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,8 +39,6 @@
|
|||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
"common_voltageValue": "{volts} В",
|
"common_voltageValue": "{volts} В",
|
||||||
"common_percentValue": "{percent}%",
|
"common_percentValue": "{percent}%",
|
||||||
"common_autoRefresh": "Автообновление",
|
|
||||||
"common_interval": "Интервал",
|
|
||||||
"scanner_title": "MeshCore Open",
|
"scanner_title": "MeshCore Open",
|
||||||
"scanner_scanning": "Поиск устройств...",
|
"scanner_scanning": "Поиск устройств...",
|
||||||
"scanner_connecting": "Подключение...",
|
"scanner_connecting": "Подключение...",
|
||||||
@@ -77,8 +75,6 @@
|
|||||||
"settings_locationIntervalInvalid": "Интервал должен составлять не менее 60 секунд и не более 86400 секунд.",
|
"settings_locationIntervalInvalid": "Интервал должен составлять не менее 60 секунд и не более 86400 секунд.",
|
||||||
"settings_latitude": "Широта",
|
"settings_latitude": "Широта",
|
||||||
"settings_longitude": "Долгота",
|
"settings_longitude": "Долгота",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "Авто-объявление без хопов при обновлении GPS",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "Когда GPS-местоположение меняется, отправлять объявление без хопов (требуется геопозиция в объявлении).",
|
|
||||||
"settings_privacyMode": "Режим конфиденциальности",
|
"settings_privacyMode": "Режим конфиденциальности",
|
||||||
"settings_privacyModeSubtitle": "Скрыть имя/позицию в анонсировании",
|
"settings_privacyModeSubtitle": "Скрыть имя/позицию в анонсировании",
|
||||||
"settings_privacyModeToggle": "Включите режим конфиденциальности, чтобы скрыть свое имя и местоположение в анонсировании.",
|
"settings_privacyModeToggle": "Включите режим конфиденциальности, чтобы скрыть свое имя и местоположение в анонсировании.",
|
||||||
@@ -192,19 +188,6 @@
|
|||||||
"appSettings_last6Hours": "Последние 6 часов",
|
"appSettings_last6Hours": "Последние 6 часов",
|
||||||
"appSettings_last24Hours": "Последние 24 часа",
|
"appSettings_last24Hours": "Последние 24 часа",
|
||||||
"appSettings_lastWeek": "Последнюю неделю",
|
"appSettings_lastWeek": "Последнюю неделю",
|
||||||
"appSettings_rasterTileSource": "Источник растровых тайлов",
|
|
||||||
"appSettings_stadiaEndpoint": "Конечная точка Stadia",
|
|
||||||
"appSettings_stadiaApiKey": "Ключ API Stadia",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "Требуется для использования Stadia Maps",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "Настроено: {maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "Введите свой ключ API Stadia Maps. Приложение использует его для запросов растровых тайлов.",
|
|
||||||
"appSettings_offlineMapCache": "Кэш офлайн-карты",
|
"appSettings_offlineMapCache": "Кэш офлайн-карты",
|
||||||
"appSettings_noAreaSelected": "Область не выбрана",
|
"appSettings_noAreaSelected": "Область не выбрана",
|
||||||
"appSettings_areaSelectedZoom": "Область выбрана (масштаб {minZoom}–{maxZoom})",
|
"appSettings_areaSelectedZoom": "Область выбрана (масштаб {minZoom}–{maxZoom})",
|
||||||
@@ -453,56 +436,6 @@
|
|||||||
"mapCache_downloadTilesButton": "Загрузить плитки",
|
"mapCache_downloadTilesButton": "Загрузить плитки",
|
||||||
"mapCache_clearCacheButton": "Очистить кэш",
|
"mapCache_clearCacheButton": "Очистить кэш",
|
||||||
"mapCache_failedDownloads": "Неудачных загрузок: {count}",
|
"mapCache_failedDownloads": "Неудачных загрузок: {count}",
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "С {north}, Ю {south}, В {east}, З {west}",
|
"mapCache_boundsLabel": "С {north}, Ю {south}, В {east}, З {west}",
|
||||||
"time_justNow": "Только что",
|
"time_justNow": "Только что",
|
||||||
"time_minutesAgo": "{minutes} мин назад",
|
"time_minutesAgo": "{minutes} мин назад",
|
||||||
@@ -753,43 +686,6 @@
|
|||||||
"telemetry_voltageValue": "{volts}В",
|
"telemetry_voltageValue": "{volts}В",
|
||||||
"telemetry_currentValue": "{amps}А",
|
"telemetry_currentValue": "{amps}А",
|
||||||
"telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F",
|
"telemetry_temperatureValue": "{celsius}°C / {fahrenheit}°F",
|
||||||
"telemetry_digitalInputLabel": "Цифровой вход",
|
|
||||||
"telemetry_digitalOutputLabel": "Цифровой выход",
|
|
||||||
"telemetry_analogInputLabel": "Аналоговый вход",
|
|
||||||
"telemetry_analogOutputLabel": "Аналоговый выход",
|
|
||||||
"telemetry_genericLabel": "Общий датчик",
|
|
||||||
"telemetry_luminosityLabel": "Освещённость",
|
|
||||||
"telemetry_presenceLabel": "Присутствие",
|
|
||||||
"telemetry_humidityLabel": "Влажность",
|
|
||||||
"telemetry_accelerometerLabel": "Акселерометр",
|
|
||||||
"telemetry_pressureLabel": "Давление",
|
|
||||||
"telemetry_altitudeLabel": "Высота",
|
|
||||||
"telemetry_frequencyLabel": "Частота",
|
|
||||||
"telemetry_percentageLabel": "Процент",
|
|
||||||
"telemetry_concentrationLabel": "Концентрация",
|
|
||||||
"telemetry_powerLabel": "Мощность",
|
|
||||||
"telemetry_distanceLabel": "Расстояние",
|
|
||||||
"telemetry_energyLabel": "Энергия",
|
|
||||||
"telemetry_directionLabel": "Направление",
|
|
||||||
"telemetry_timeLabel": "Время",
|
|
||||||
"telemetry_gyrometerLabel": "Гирометр",
|
|
||||||
"telemetry_colourLabel": "Цвет",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "Переключатель",
|
|
||||||
"telemetry_polylineLabel": "Полилиния",
|
|
||||||
"telemetry_altitudeValue": "{meters} м",
|
|
||||||
"telemetry_frequencyValue": "{hertz} Гц",
|
|
||||||
"telemetry_pressureValue": "{hpa} гПа",
|
|
||||||
"telemetry_luminosityValue": "{lux} лк",
|
|
||||||
"telemetry_powerValue": "{watts} Вт",
|
|
||||||
"telemetry_distanceValue": "{meters} м",
|
|
||||||
"telemetry_energyValue": "{kilowattHours} кВт⋅ч",
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"telemetry_autoFetchQuantity": "Количество запросов",
|
|
||||||
"telemetry_error": "Не удалось получить данные",
|
|
||||||
"neighbors_receivedData": "Полученные данные о соседях",
|
"neighbors_receivedData": "Полученные данные о соседях",
|
||||||
"neighbors_requestTimedOut": "Время ожидания данных о соседях истекло.",
|
"neighbors_requestTimedOut": "Время ожидания данных о соседях истекло.",
|
||||||
"neighbors_errorLoading": "Ошибка загрузки соседей: {error}",
|
"neighbors_errorLoading": "Ошибка загрузки соседей: {error}",
|
||||||
@@ -1372,9 +1268,6 @@
|
|||||||
"translation_title": "Перевод",
|
"translation_title": "Перевод",
|
||||||
"translation_enableTitle": "Включить перевод",
|
"translation_enableTitle": "Включить перевод",
|
||||||
"translation_composerSubtitle": "Управляет исходным состоянием значка перевода, предоставляемого редактором.",
|
"translation_composerSubtitle": "Управляет исходным состоянием значка перевода, предоставляемого редактором.",
|
||||||
"translation_autoIncomingTitle": "Автоматически переводить сообщения",
|
|
||||||
"translation_autoIncomingSubtitle": "Автоматически переводит сообщения для уведомлений, а также для чатов и каналов.",
|
|
||||||
"translation_translateMessage": "Перевести сообщение",
|
|
||||||
"translation_targetLanguage": "Целевой язык",
|
"translation_targetLanguage": "Целевой язык",
|
||||||
"translation_useAppLanguage": "Используйте язык приложения",
|
"translation_useAppLanguage": "Используйте язык приложения",
|
||||||
"translation_downloadedModelLabel": "Загруженная модель",
|
"translation_downloadedModelLabel": "Загруженная модель",
|
||||||
@@ -1543,7 +1436,7 @@
|
|||||||
"repeater_advancedSettings": "Продвинутый",
|
"repeater_advancedSettings": "Продвинутый",
|
||||||
"repeater_advancedSettingsSubtitle": "Регуляторы для опытных операторов",
|
"repeater_advancedSettingsSubtitle": "Регуляторы для опытных операторов",
|
||||||
"repeater_pathHashMode": "Режим хеширования пути",
|
"repeater_pathHashMode": "Режим хеширования пути",
|
||||||
"repeater_pathHashModeHelper": "Байты, используемые для кодирования идентификатора этого ретранслятора в тегах flood-маршрута/обнаружения циклов. 0 = 1 байт (256 идентификаторов, до 64 переходов), 1 = 2 байта (65 000 идентификаторов, до 32 переходов), 2 = 3 байта (16 миллионов идентификаторов, до 21 перехода). Прошивки до v1.14 всегда использовали 1-байтовые маршруты; v1.14 и новее можно настроить на 2- или 3-байтовые маршруты.",
|
"repeater_pathHashModeHelper": "Байты, используемые для кодирования идентификатора этого ретранслятора в тегах для обнаружения потоков/циклов. 0 = 1 байт (256 идентификаторов, до 64 переходов), 1 = 2 байта (65 000 идентификаторов, до 32 переходов), 2 = 3 байта (1 600 000 идентификаторов, до 21 перехода). Версии прошивки v1.13 и более ранние версии не поддерживают многобайтовые пути — они поднимаются только после того, как ваша сеть будет обновлена до версии v1.14 и выше.",
|
||||||
"repeater_txDelay": "Задержка в работе системы Flood TX",
|
"repeater_txDelay": "Задержка в работе системы Flood TX",
|
||||||
"repeater_txDelayHelper": "Передача с увеличенным интервалом для трафика во время наводнения, в качестве коэффициента, умножающего время передачи пакета (от 0 до 2, по умолчанию 0,5). Более высокое значение означает меньшее количество столкновений, но более медленную передачу.",
|
"repeater_txDelayHelper": "Передача с увеличенным интервалом для трафика во время наводнения, в качестве коэффициента, умножающего время передачи пакета (от 0 до 2, по умолчанию 0,5). Более высокое значение означает меньшее количество столкновений, но более медленную передачу.",
|
||||||
"repeater_directTxDelay": "Прямая задержка сигнала TX",
|
"repeater_directTxDelay": "Прямая задержка сигнала TX",
|
||||||
@@ -1722,191 +1615,8 @@
|
|||||||
"settings_companionDebugLogSubtitle": "Команды, ответы и необработанные данные, используемые для протоколов BLE, TCP и USB.",
|
"settings_companionDebugLogSubtitle": "Команды, ответы и необработанные данные, используемые для протоколов BLE, TCP и USB.",
|
||||||
"repeater_chanUtil": "Использование канала",
|
"repeater_chanUtil": "Использование канала",
|
||||||
"settings_companionDebugLog": "Журнал отладки (для сопутствующего приложения)",
|
"settings_companionDebugLog": "Журнал отладки (для сопутствующего приложения)",
|
||||||
"@routing_lastWorked": {
|
"dialog_connectCompanion": "Подключитесь к компаньону, чтобы получить доступ к функциям ретранслятора и сервера комнат.",
|
||||||
"placeholders": {
|
"dialog_disconnectedTitle": "Отключено",
|
||||||
"when": {
|
"dialog_disconnectedMessage": "Вы были отключены от вашего компаньона.",
|
||||||
"type": "String"
|
"contact_connectCompanion": "Подключитесь к компаньону, чтобы получить доступ к функциям репитера и серверу комнаты."
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messageStatus_pending": "Отправка",
|
|
||||||
"common_undo": "Отменить",
|
|
||||||
"messageStatus_delivered": "Доставлено",
|
|
||||||
"messageStatus_sent": "Отправлено",
|
|
||||||
"messageStatus_failed": "Не удалось отправить",
|
|
||||||
"messageStatus_repeated": "Услышал несколько раз",
|
|
||||||
"contacts_moreOptions": "Больше вариантов",
|
|
||||||
"contacts_searchOpen": "Найти контакты",
|
|
||||||
"contacts_searchClose": "Закрыть поиск",
|
|
||||||
"routing_title": "Маршрутизация",
|
|
||||||
"routing_modeAuto": "Авто",
|
|
||||||
"routing_modeFlood": "Наводнение",
|
|
||||||
"routing_modeManual": "Инструкция",
|
|
||||||
"routing_modeAutoHint": "Автоматически выбирает наиболее известный путь, и если такой путь неизвестен, использует алгоритм поиска пути.",
|
|
||||||
"routing_modeFloodHint": "Передача сигнала через все ретрансляторы. Самый надежный способ, но требует больше времени на передачу.",
|
|
||||||
"routing_modeManualHint": "Всегда следует точно по указанному вами маршруту.",
|
|
||||||
"routing_currentRoute": "Текущий маршрут",
|
|
||||||
"routing_directNoHops": "Прямое соединение – без использования ретрансляторов",
|
|
||||||
"routing_noPathYet": "Пока нет пути. Следующее сообщение будет отправлено до тех пор, пока не будет обнаружен маршрут.",
|
|
||||||
"routing_floodBroadcast": "Транслируется через все ретрансляторы",
|
|
||||||
"routing_editPath": "Изменить путь",
|
|
||||||
"routing_forgetPath": "Забудьте о маршруте",
|
|
||||||
"routing_knownPaths": "Известные маршруты",
|
|
||||||
"routing_knownPathsHint": "Создайте маршрут для переключения на этот пункт.",
|
|
||||||
"routing_inUse": "В эксплуатации",
|
|
||||||
"routing_qualityStrong": "Сильный первый скачок",
|
|
||||||
"routing_qualityGood": "Хорошее начало",
|
|
||||||
"routing_qualityFair": "Первый хороший урожай",
|
|
||||||
"routing_qualityWorked": "Осуществлено",
|
|
||||||
"routing_qualityFlood": "Узнал из новостей, распространяющихся в интернете.",
|
|
||||||
"routing_qualityUntested": "Непроверенный",
|
|
||||||
"routing_neverWorked": "никогда не было подтверждено",
|
|
||||||
"routing_floodDelivery": "Доставка при затоплении",
|
|
||||||
"pathEditor_title": "Создать маршрут",
|
|
||||||
"pathEditor_hopCounter": "{count} из 64 хмеля",
|
|
||||||
"pathEditor_noHops": "На данный момент хмель еще не добавлен. Чтобы добавить его, нажмите на соответствующие кнопки ниже в нужном порядке, или сохраните рецепт без хмеля, чтобы отправить его напрямую.",
|
|
||||||
"pathEditor_addHops": "Добавляйте хмель в соответствии с указанным порядком.",
|
|
||||||
"pathEditor_searchRepeaters": "Поиск повторителей",
|
|
||||||
"pathEditor_advancedHex": "Продвинутый уровень: прямой путь в шестнадцатеричном формате",
|
|
||||||
"pathEditor_hexLabel": "Префиксы шестнадцатеричной системы",
|
|
||||||
"pathEditor_hexHelper": "Два шестнадцатеричных символа на каждом шаге, разделенные запятыми.",
|
|
||||||
"pathEditor_invalidTokens": "Неверно: {tokens}",
|
|
||||||
"routing_lastWorked": "worked {when}",
|
|
||||||
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
||||||
"pathEditor_tooManyHops": "Максимальное количество ингредиентов – 64",
|
|
||||||
"pathEditor_usePath": "Используйте этот путь",
|
|
||||||
"pathEditor_removeHop": "Удалить хмель",
|
|
||||||
"pathEditor_unknownHop": "Неизвестный ретранслятор",
|
|
||||||
"map_zoomIn": "Увеличить масштаб",
|
|
||||||
"map_zoomOut": "Увеличить масштаб",
|
|
||||||
"map_centerMap": "Карта центра",
|
|
||||||
"chrome_bluetoothRequiresChromium": "Для работы Web Bluetooth требуется браузер на основе Chromium.",
|
|
||||||
"channels_communityShortId": "Идентификатор: {id}...",
|
|
||||||
"pathTrace_legendGpsConfirmed": "GPS подтверждено",
|
|
||||||
"pathTrace_legendInferred": "Выведенная позиция",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"map_searchHint": "Поиск по имени или ID узла",
|
|
||||||
"map_online": "Онлайн",
|
|
||||||
"scanner_bluetoothWebUnsupported": "Bluetooth недоступен в браузере. Подключитесь через USB.",
|
|
||||||
"map_activity": "Активность",
|
|
||||||
"map_recent": "Недавно",
|
|
||||||
"map_stale": "Устаревший",
|
|
||||||
"map_visible": "Видимый",
|
|
||||||
"map_hidden": "Скрытый",
|
|
||||||
"map_centerOnNode": "Центрировать на узле",
|
|
||||||
"map_details": "Детали",
|
|
||||||
"map_noGps": "Без GPS",
|
|
||||||
"map_noResults": "Не найдено соответствующих узлов",
|
|
||||||
"pathMap_viewSingle": "Одиночный",
|
|
||||||
"pathMap_viewCombined": "Объединённые",
|
|
||||||
"pathMap_play": "Воспроизвести",
|
|
||||||
"pathMap_pause": "Пауза",
|
|
||||||
"pathMap_replay": "Повтор",
|
|
||||||
"pathMap_stepBack": "Предыдущий хоп",
|
|
||||||
"pathMap_stepForward": "Следующий хоп",
|
|
||||||
"pathMap_animationOn": "Показать анимацию пакета",
|
|
||||||
"pathMap_animationOff": "Скрыть анимацию пакета",
|
|
||||||
"pathMap_hopOf": "Хоп {current} из {total}",
|
|
||||||
"pathMap_observedPaths": "Наблюдаемые маршруты: {count}",
|
|
||||||
"pathMap_primary": "Основной",
|
|
||||||
"pathMap_alternate": "Альт {index}",
|
|
||||||
"pathMap_hopCount": "{count, plural, one{{count} хоп} few{{count} хопа} many{{count} хопов} other{{count} хопов}}",
|
|
||||||
"pathMap_legendShared": "Общий сегмент",
|
|
||||||
"pathMap_legendEstimated": "Расчётный сегмент",
|
|
||||||
"pathMap_sharedNodeCount": "Используется в {count} маршрутах",
|
|
||||||
"pathMap_partialAnimation": "{count, plural, one{{count} хоп не имеет координат — показанный путь неполный} few{{count} хопа не имеют координат — показанный путь неполный} many{{count} хопов не имеют координат — показанный путь неполный} other{{count} хопов не имеют координат — показанный путь неполный}}",
|
|
||||||
"pathMap_showAllPaths": "Показать всё",
|
|
||||||
"pathMap_hidePath": "Скрыть путь",
|
|
||||||
"pathMap_collapsePanel": "Скрыть панель",
|
|
||||||
"pathMap_showPath": "Показать маршрут",
|
|
||||||
"pathMap_expandPanel": "Расширить панель",
|
|
||||||
"pathMap_noLocation": "Нет координат",
|
|
||||||
"pathMap_followPacket": "Следить за пакетом",
|
|
||||||
"pathMap_unfollowPacket": "Не следить за пакетом",
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,6 @@
|
|||||||
"common_remove": "Odstrániť",
|
"common_remove": "Odstrániť",
|
||||||
"common_enable": "Povolit",
|
"common_enable": "Povolit",
|
||||||
"common_disable": "Zakázať",
|
"common_disable": "Zakázať",
|
||||||
"common_autoRefresh": "Automatické obnovenie",
|
|
||||||
"common_interval": "Časový interval",
|
|
||||||
"common_reboot": "Restartovať",
|
"common_reboot": "Restartovať",
|
||||||
"common_loading": "Načítavanie...",
|
"common_loading": "Načítavanie...",
|
||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
@@ -100,8 +98,6 @@
|
|||||||
"settings_locationInvalid": "Neplatná šírka alebo dĺžka.",
|
"settings_locationInvalid": "Neplatná šírka alebo dĺžka.",
|
||||||
"settings_latitude": "Súradnica",
|
"settings_latitude": "Súradnica",
|
||||||
"settings_longitude": "Dĺžka",
|
"settings_longitude": "Dĺžka",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "Automatický zero-hop inzerát pri aktualizácii GPS",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "Keď sa GPS poloha zmení, odoslať zero-hop inzerát (vyžaduje polohu v inzeráte).",
|
|
||||||
"settings_privacyMode": "Režim ochrany súkromia",
|
"settings_privacyMode": "Režim ochrany súkromia",
|
||||||
"settings_privacyModeSubtitle": "Skryť meno/poloha v reklamách",
|
"settings_privacyModeSubtitle": "Skryť meno/poloha v reklamách",
|
||||||
"settings_privacyModeToggle": "Prepínač súkromného režimu skryje vaše meno a polohu v reklamách.",
|
"settings_privacyModeToggle": "Prepínač súkromného režimu skryje vaše meno a polohu v reklamách.",
|
||||||
@@ -242,19 +238,6 @@
|
|||||||
"appSettings_last6Hours": "Posledné 6 hodín",
|
"appSettings_last6Hours": "Posledné 6 hodín",
|
||||||
"appSettings_last24Hours": "Posledných 24 hodín",
|
"appSettings_last24Hours": "Posledných 24 hodín",
|
||||||
"appSettings_lastWeek": "Minul týždeň",
|
"appSettings_lastWeek": "Minul týždeň",
|
||||||
"appSettings_rasterTileSource": "Zdroj rastrových dlaždíc",
|
|
||||||
"appSettings_stadiaEndpoint": "Koncový bod Stadia",
|
|
||||||
"appSettings_stadiaApiKey": "Kľúč API Stadia",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "Vyžaduje sa na používanie Stadia Maps",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "Nakonfigurované: {maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "Zadajte svoj kľúč API pre Stadia Maps. Aplikácia ho používa na požiadavky na rastrové dlaždice.",
|
|
||||||
"appSettings_offlineMapCache": "Offline Mapa Pamäť",
|
"appSettings_offlineMapCache": "Offline Mapa Pamäť",
|
||||||
"appSettings_noAreaSelected": "Neoznačila sa žiadna oblasť",
|
"appSettings_noAreaSelected": "Neoznačila sa žiadna oblasť",
|
||||||
"appSettings_areaSelectedZoom": "Vyberená oblasť (zoom {minZoom}-{maxZoom})",
|
"appSettings_areaSelectedZoom": "Vyberená oblasť (zoom {minZoom}-{maxZoom})",
|
||||||
@@ -784,56 +767,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
||||||
"@mapCache_boundsLabel": {
|
"@mapCache_boundsLabel": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -1172,7 +1105,7 @@
|
|||||||
"repeater_advancedSettings": "Pokročilé",
|
"repeater_advancedSettings": "Pokročilé",
|
||||||
"repeater_advancedSettingsSubtitle": "Ovládacie knopy pre skúsených operátorov",
|
"repeater_advancedSettingsSubtitle": "Ovládacie knopy pre skúsených operátorov",
|
||||||
"repeater_pathHashMode": "Režim hashovania cesty",
|
"repeater_pathHashMode": "Režim hashovania cesty",
|
||||||
"repeater_pathHashModeHelper": "Bajty použité na zakódovanie ID tohto opakovača v tagoch flood trasy/detekcie slučky. 0=1 bajt (256 ID, až 64 skokov), 1=2 bajty (65 000 ID, až 32 skokov), 2=3 bajty (16 miliónov ID, až 21 skokov). Firmvér pred v1.14 vždy používal 1-bajtové trasy; v1.14 a novšie možno nakonfigurovať na 2- alebo 3-bajtové trasy.",
|
"repeater_pathHashModeHelper": "Byty použité na zakódovanie ID tohto opakovača v tagoch pre trasu/detekciu slučky. 0 = 1 bytu (256 ID, až 64 skokov), 1 = 2 byty (65 000 ID, až 32 skokov), 2 = 3 byty (16 miliónov ID, až 21 skokov). Verzie 1.13 a staršie nepodporujú viacbytové trasy – fungujú len, keď je sieť aktivovaná.",
|
||||||
"repeater_txDelay": "Zpoždanie v Flood, TX",
|
"repeater_txDelay": "Zpoždanie v Flood, TX",
|
||||||
"repeater_txDelayHelper": "Nastavenie pre opakované vysielanie pre dopravu počas povodní, ako násobok času, ktorý paket využije (0-2, výchoce hodnota 0,5). Vyššia hodnota znamená menej kolízii, ale pomalšie doručovanie.",
|
"repeater_txDelayHelper": "Nastavenie pre opakované vysielanie pre dopravu počas povodní, ako násobok času, ktorý paket využije (0-2, výchoce hodnota 0,5). Vyššia hodnota znamená menej kolízii, ale pomalšie doručovanie.",
|
||||||
"repeater_directTxDelay": "Priame oneskorenie TX",
|
"repeater_directTxDelay": "Priame oneskorenie TX",
|
||||||
@@ -1347,43 +1280,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"telemetry_digitalInputLabel": "Digitálny vstup",
|
|
||||||
"telemetry_digitalOutputLabel": "Digitálny výstup",
|
|
||||||
"telemetry_analogInputLabel": "Analógový vstup",
|
|
||||||
"telemetry_analogOutputLabel": "Analógový výstup",
|
|
||||||
"telemetry_genericLabel": "Všeobecný senzor",
|
|
||||||
"telemetry_luminosityLabel": "Osvetlenie",
|
|
||||||
"telemetry_presenceLabel": "Prítomnosť",
|
|
||||||
"telemetry_humidityLabel": "Vlhkosť",
|
|
||||||
"telemetry_accelerometerLabel": "Akcelerometer",
|
|
||||||
"telemetry_pressureLabel": "Tlak",
|
|
||||||
"telemetry_altitudeLabel": "Nadmorská výška",
|
|
||||||
"telemetry_frequencyLabel": "Frekvencia",
|
|
||||||
"telemetry_percentageLabel": "Percento",
|
|
||||||
"telemetry_concentrationLabel": "Koncentrácia",
|
|
||||||
"telemetry_powerLabel": "Výkon",
|
|
||||||
"telemetry_distanceLabel": "Vzdialenosť",
|
|
||||||
"telemetry_energyLabel": "Energia",
|
|
||||||
"telemetry_directionLabel": "Smer",
|
|
||||||
"telemetry_timeLabel": "Čas",
|
|
||||||
"telemetry_gyrometerLabel": "Gyrometer",
|
|
||||||
"telemetry_colourLabel": "Farba",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "Prepínač",
|
|
||||||
"telemetry_polylineLabel": "Lomená čiara",
|
|
||||||
"telemetry_altitudeValue": "{meters} m",
|
|
||||||
"telemetry_frequencyValue": "{hertz} Hz",
|
|
||||||
"telemetry_pressureValue": "{hpa} hPa",
|
|
||||||
"telemetry_luminosityValue": "{lux} lx",
|
|
||||||
"telemetry_powerValue": "{watts} W",
|
|
||||||
"telemetry_distanceValue": "{meters} m",
|
|
||||||
"telemetry_energyValue": "{kilowattHours} kWh",
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"telemetry_autoFetchQuantity": "Počet požiadaviek",
|
|
||||||
"telemetry_error": "Nepodarilo sa získať údaje",
|
|
||||||
"telemetry_noData": "Nejsú dostupné žiadne údaje z telemetrie.",
|
"telemetry_noData": "Nejsú dostupné žiadne údaje z telemetrie.",
|
||||||
"telemetry_channelTitle": "Kanál {channel}",
|
"telemetry_channelTitle": "Kanál {channel}",
|
||||||
"@telemetry_channelTitle": {
|
"@telemetry_channelTitle": {
|
||||||
@@ -2204,9 +2100,6 @@
|
|||||||
"translation_composerTitle": "Preložte pred odeslaním",
|
"translation_composerTitle": "Preložte pred odeslaním",
|
||||||
"translation_title": "Preklad",
|
"translation_title": "Preklad",
|
||||||
"translation_composerSubtitle": "Riadi výchoce stav ikony pre preklad, ktorú používa program.",
|
"translation_composerSubtitle": "Riadi výchoce stav ikony pre preklad, ktorú používa program.",
|
||||||
"translation_autoIncomingTitle": "Automaticky prekladať správy",
|
|
||||||
"translation_autoIncomingSubtitle": "Automaticky prekladá správy pre upozornenia aj pre čet alebo kanál.",
|
|
||||||
"translation_translateMessage": "Preložiť správu",
|
|
||||||
"translation_targetLanguage": "Cieľový jazyk",
|
"translation_targetLanguage": "Cieľový jazyk",
|
||||||
"translation_useAppLanguage": "Použite jazyk aplikácie",
|
"translation_useAppLanguage": "Použite jazyk aplikácie",
|
||||||
"translation_downloadedModelLabel": "Stiahnutý model",
|
"translation_downloadedModelLabel": "Stiahnutý model",
|
||||||
@@ -2419,191 +2312,8 @@
|
|||||||
"settings_companionDebugLog": "Logovanie pre ladenie (sprievodný log)",
|
"settings_companionDebugLog": "Logovanie pre ladenie (sprievodný log)",
|
||||||
"chat_newMessages": "Nové správy",
|
"chat_newMessages": "Nové správy",
|
||||||
"repeater_chanUtil": "Využitie kanálu",
|
"repeater_chanUtil": "Využitie kanálu",
|
||||||
"@routing_lastWorked": {
|
"dialog_connectCompanion": "Pripojte sa k sprievodcovi a získajte prístup k funkciám opakovača a serveru miestností.",
|
||||||
"placeholders": {
|
"dialog_disconnectedTitle": "Odpojené",
|
||||||
"when": {
|
"dialog_disconnectedMessage": "Od vášho spoločníka ste boli odpojený.",
|
||||||
"type": "String"
|
"contact_connectCompanion": "Pripojte sa k spoločníkovi pre prístup k funkciám opakovača a miestneho servera."
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messageStatus_sent": "Odoslané",
|
|
||||||
"messageStatus_delivered": "Doručené",
|
|
||||||
"messageStatus_pending": "Odoslanie",
|
|
||||||
"common_undo": "Zrušiť",
|
|
||||||
"messageStatus_failed": "Neúspešné odeslanie",
|
|
||||||
"messageStatus_repeated": "Slyšal som to opakovane",
|
|
||||||
"contacts_moreOptions": "Ďalšie možnosti",
|
|
||||||
"contacts_searchOpen": "Vyhľadajte kontakty",
|
|
||||||
"contacts_searchClose": "Zavrieť vyhľadávanie",
|
|
||||||
"routing_title": "Navigácia",
|
|
||||||
"routing_modeAuto": "Auto",
|
|
||||||
"routing_modeFlood": "Povodňová vlna",
|
|
||||||
"routing_modeManual": "Ručná príručka",
|
|
||||||
"routing_modeAutoHint": "Automaticky vyberá najznámejší trasa, a ak žiadna nie je známa, použije náhodnú trasu.",
|
|
||||||
"routing_modeFloodHint": "Prenos prostredníctvom všetkých opakovačov. Najspoľahlivejší spôsob, ale vyžaduje viac času vysielania.",
|
|
||||||
"routing_modeManualHint": "Vždy dodáva presne podľa zadaného trasy.",
|
|
||||||
"routing_currentRoute": "Aktuálna trasa",
|
|
||||||
"routing_directNoHops": "Priamo – bez prechodných trás",
|
|
||||||
"routing_noPathYet": "Zatiaľ neexistuje žiadna cesta. Nasledujúce správy budú pokračovať, kým sa nenájde trasa.",
|
|
||||||
"routing_floodBroadcast": "Prenos prostredníctvom každého opakovača",
|
|
||||||
"routing_editPath": "Upraviť trasu",
|
|
||||||
"routing_forgetPath": "Zabudnite na trasu",
|
|
||||||
"routing_knownPaths": "Známe cesty",
|
|
||||||
"routing_knownPathsHint": "Kliknite na cestu, aby ste sa k nej presunuli.",
|
|
||||||
"routing_inUse": "V prevádzke",
|
|
||||||
"routing_qualityStrong": "Silný prvý krok",
|
|
||||||
"routing_qualityGood": "Úspešný prvý krok",
|
|
||||||
"routing_qualityFair": "Prvá, spravodlivá fáza",
|
|
||||||
"routing_qualityWorked": "Dosiahnutý úspech",
|
|
||||||
"routing_qualityFlood": "Zistil som to z informácií, ktoré som získal v dôsledku povodňovej situácie.",
|
|
||||||
"routing_qualityUntested": "Neotestované",
|
|
||||||
"routing_neverWorked": "nikedy nebolo potvrdené",
|
|
||||||
"routing_floodDelivery": "Doručenie v prípade povodní",
|
|
||||||
"pathEditor_title": "Vytvorenie cesty",
|
|
||||||
"pathEditor_hopCounter": "{count} z 64 chmelových zŕš",
|
|
||||||
"pathEditor_noHops": "Zatiaľ žiadne chmel. Kliknite na opakované, aby ste ich pridali postupne, alebo uložte bez chmelu, aby ste ho mohli poslať priamo.",
|
|
||||||
"pathEditor_addHops": "Pridávajte chmel podľa zadaného poriadku.",
|
|
||||||
"pathEditor_searchRepeaters": "Hľadať opakované",
|
|
||||||
"pathEditor_advancedHex": "Pokročilé: pôvodná hexová cesta",
|
|
||||||
"pathEditor_hexLabel": "Prefiksy pre hexadecimálne čísla",
|
|
||||||
"pathEditor_hexHelper": "Dve hexové čísla na každý krok, oddelené čiarkami",
|
|
||||||
"routing_lastWorked": "worked {when}",
|
|
||||||
"pathEditor_invalidTokens": "Neplatné: {tokens}",
|
|
||||||
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
||||||
"pathEditor_tooManyHops": "Maximálne 64 krokov",
|
|
||||||
"pathEditor_usePath": "Použite túto cestu",
|
|
||||||
"pathEditor_removeHop": "Odstráňte chmel",
|
|
||||||
"pathEditor_unknownHop": "Neznáme zariadenie na opakované vysielanie",
|
|
||||||
"map_zoomIn": "Zväčšiť",
|
|
||||||
"map_zoomOut": "Zmenť zamer zblízka",
|
|
||||||
"map_centerMap": "Mapa centra",
|
|
||||||
"chrome_bluetoothRequiresChromium": "Web Bluetooth vyžaduje prehliadač Chromium.",
|
|
||||||
"channels_communityShortId": "ID: {id}...",
|
|
||||||
"pathTrace_legendGpsConfirmed": "GPS potvrdilo",
|
|
||||||
"pathTrace_legendInferred": "Odvodená poloha",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"map_online": "Online",
|
|
||||||
"scanner_bluetoothWebUnsupported": "Funkcia Bluetooth nie je dostupná v prehliadači. Prepojte sa pomocou USB.",
|
|
||||||
"map_searchHint": "Vyhľadajte podľa názvu alebo ID uzla",
|
|
||||||
"map_activity": "Aktivita",
|
|
||||||
"map_recent": "Nedávne",
|
|
||||||
"map_stale": "Neaktuálne",
|
|
||||||
"map_hidden": "Skrytý",
|
|
||||||
"map_visible": "Viditeľný",
|
|
||||||
"map_centerOnNode": "Nacentrovať na uzol",
|
|
||||||
"map_details": "Podrobnosti",
|
|
||||||
"map_noGps": "Bez GPS",
|
|
||||||
"map_noResults": "Nenašli sa žiadne zodpovedajúce uzly.",
|
|
||||||
"pathMap_viewSingle": "Jednotlivý",
|
|
||||||
"pathMap_viewCombined": "Spojené",
|
|
||||||
"pathMap_play": "Prehrať",
|
|
||||||
"pathMap_pause": "Pozastaviť",
|
|
||||||
"pathMap_replay": "Prehrať znova",
|
|
||||||
"pathMap_stepBack": "Predchádzajúci skok",
|
|
||||||
"pathMap_stepForward": "Nasledujúci skok",
|
|
||||||
"pathMap_animationOn": "Zobraziť animáciu paketu",
|
|
||||||
"pathMap_animationOff": "Skryť animáciu paketu",
|
|
||||||
"pathMap_hopOf": "Skok {current} z {total}",
|
|
||||||
"pathMap_observedPaths": "Pozorované cesty: {count}",
|
|
||||||
"pathMap_primary": "Primárna",
|
|
||||||
"pathMap_alternate": "Alternatívny {index}",
|
|
||||||
"pathMap_hopCount": "{count, plural, =1{1 skok} few{{count} skoky} other{{count} skokov}}",
|
|
||||||
"pathMap_legendShared": "Spoločný segment",
|
|
||||||
"pathMap_legendEstimated": "Odhadovaný segment",
|
|
||||||
"pathMap_sharedNodeCount": "Používané {count} cestami",
|
|
||||||
"pathMap_partialAnimation": "{count, plural, =1{1 skok nemá polohu — zobrazená trasa je neúplná} few{{count} skoky nemajú polohu — zobrazená trasa je neúplná} other{{count} skokov nemá polohu — zobrazená trasa je neúplná}}",
|
|
||||||
"pathMap_showAllPaths": "Zobraziť všetky",
|
|
||||||
"pathMap_hidePath": "Skryť cestu",
|
|
||||||
"pathMap_showPath": "Zobraziť trasu",
|
|
||||||
"pathMap_collapsePanel": "Zatvoriť panel",
|
|
||||||
"pathMap_expandPanel": "Rozbaliť panel",
|
|
||||||
"pathMap_noLocation": "Bez polohy",
|
|
||||||
"pathMap_followPacket": "Uzamknúť pohľad na paket",
|
|
||||||
"pathMap_unfollowPacket": "Odomknúť pohľad od paketu",
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,6 @@
|
|||||||
"common_remove": "Izbrisati",
|
"common_remove": "Izbrisati",
|
||||||
"common_enable": "Omogoči",
|
"common_enable": "Omogoči",
|
||||||
"common_disable": "Izklopiti",
|
"common_disable": "Izklopiti",
|
||||||
"common_autoRefresh": "Samodejno osveževanje",
|
|
||||||
"common_interval": "Časovni interval",
|
|
||||||
"common_reboot": "Ponoviti",
|
"common_reboot": "Ponoviti",
|
||||||
"common_loading": "Naložanje...",
|
"common_loading": "Naložanje...",
|
||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
@@ -100,8 +98,6 @@
|
|||||||
"settings_locationInvalid": "Neveljavna zemeljska širina ali dolžina.",
|
"settings_locationInvalid": "Neveljavna zemeljska širina ali dolžina.",
|
||||||
"settings_latitude": "Širina",
|
"settings_latitude": "Širina",
|
||||||
"settings_longitude": "Dolžina",
|
"settings_longitude": "Dolžina",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "Samodejni zero-hop oglas ob posodobitvi GPS",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "Ko se GPS lokacija spremeni, pošlji zero-hop oglas (zahteva lokacijo v oglasu).",
|
|
||||||
"settings_privacyMode": "Zasebnost",
|
"settings_privacyMode": "Zasebnost",
|
||||||
"settings_privacyModeSubtitle": "Skrita imena/lokacije v oglasih",
|
"settings_privacyModeSubtitle": "Skrita imena/lokacije v oglasih",
|
||||||
"settings_privacyModeToggle": "Omogoči način zasebnosti, da skrijemo tvoje ime in lokacijo v oglasih.",
|
"settings_privacyModeToggle": "Omogoči način zasebnosti, da skrijemo tvoje ime in lokacijo v oglasih.",
|
||||||
@@ -242,19 +238,6 @@
|
|||||||
"appSettings_last6Hours": "Zadnjih 6 ur",
|
"appSettings_last6Hours": "Zadnjih 6 ur",
|
||||||
"appSettings_last24Hours": "Zadnjih 24 ur",
|
"appSettings_last24Hours": "Zadnjih 24 ur",
|
||||||
"appSettings_lastWeek": "Prejšnji teden",
|
"appSettings_lastWeek": "Prejšnji teden",
|
||||||
"appSettings_rasterTileSource": "Vir rastrskih ploščic",
|
|
||||||
"appSettings_stadiaEndpoint": "Končna točka Stadia",
|
|
||||||
"appSettings_stadiaApiKey": "Ključ API Stadia",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "Obvezno za uporabo Stadia Maps",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "Nastavljeno: {maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "Vnesite svoj ključ API za Stadia Maps. Aplikacija ga uporablja za zahteve rastrskih ploščic.",
|
|
||||||
"appSettings_offlineMapCache": "Shramba zemljevidov brez povezave",
|
"appSettings_offlineMapCache": "Shramba zemljevidov brez povezave",
|
||||||
"appSettings_noAreaSelected": "Območje ni izbrano",
|
"appSettings_noAreaSelected": "Območje ni izbrano",
|
||||||
"appSettings_areaSelectedZoom": "Izbrano območje (povečava {minZoom}-{maxZoom})",
|
"appSettings_areaSelectedZoom": "Izbrano območje (povečava {minZoom}-{maxZoom})",
|
||||||
@@ -784,56 +767,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
||||||
"@mapCache_boundsLabel": {
|
"@mapCache_boundsLabel": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -1172,7 +1105,7 @@
|
|||||||
"repeater_advancedSettings": "Napredno",
|
"repeater_advancedSettings": "Napredno",
|
||||||
"repeater_advancedSettingsSubtitle": "Gumbi za nastavljanje za izkušene uporabnike",
|
"repeater_advancedSettingsSubtitle": "Gumbi za nastavljanje za izkušene uporabnike",
|
||||||
"repeater_pathHashMode": "Način ustvarjanja hash-a poti",
|
"repeater_pathHashMode": "Način ustvarjanja hash-a poti",
|
||||||
"repeater_pathHashModeHelper": "Bajti, uporabljeni za kodiranje ID-ja tega repetitorja v oznakah flood poti/zaznavanja zank. 0=1 bajt (256 ID-jev, do 64 skokov), 1=2 bajta (65.000 ID-jev, do 32 skokov), 2=3 bajti (16 milijonov ID-jev, do 21 skokov). Vdelana programska oprema pred v1.14 je vedno uporabljala 1-bajtne poti; v1.14 in novejše je mogoče nastaviti na 2- ali 3-bajtne poti.",
|
"repeater_pathHashModeHelper": "Biti, ki so bila uporabljena za kodiranje ID-ja tega releja v oznakah za zaznavanje pot/kroga, imajo naslednje velikosti: 0=1 bit (256 ID-jev, do 64 skokov), 1=2 biti (65.000 ID-jev, do 32 skokov), 2=3 biti (16 milijonov ID-jev, do 21 skokov). V različicah 1.13 in starejših se ustvarjajo večbitne poti – vendar se to zgodi šele, ko je omrežje vklopljeno v različicah 1.14 in kasnejših.",
|
||||||
"repeater_txDelay": "Zatemnitevanje zaradi poplav v Texasu",
|
"repeater_txDelay": "Zatemnitevanje zaradi poplav v Texasu",
|
||||||
"repeater_txDelayHelper": "Uporaba intervalov za ponovno pošiljanje v primeru prometa zaradi poplav, kot pomnožnik časovne trajanje paketa (0-2, privzeto 0,5). Veje vrednost = manjše kolizije, vendar počasnejše dostavo.",
|
"repeater_txDelayHelper": "Uporaba intervalov za ponovno pošiljanje v primeru prometa zaradi poplav, kot pomnožnik časovne trajanje paketa (0-2, privzeto 0,5). Veje vrednost = manjše kolizije, vendar počasnejše dostavo.",
|
||||||
"repeater_directTxDelay": "Neposredni časovno odlašanje",
|
"repeater_directTxDelay": "Neposredni časovno odlašanje",
|
||||||
@@ -1347,43 +1280,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"telemetry_digitalInputLabel": "Digitalni vhod",
|
|
||||||
"telemetry_digitalOutputLabel": "Digitalni izhod",
|
|
||||||
"telemetry_analogInputLabel": "Analogni vhod",
|
|
||||||
"telemetry_analogOutputLabel": "Analogni izhod",
|
|
||||||
"telemetry_genericLabel": "Splošni senzor",
|
|
||||||
"telemetry_luminosityLabel": "Osvetljenost",
|
|
||||||
"telemetry_presenceLabel": "Prisotnost",
|
|
||||||
"telemetry_humidityLabel": "Vlažnost",
|
|
||||||
"telemetry_accelerometerLabel": "Merilnik pospeška",
|
|
||||||
"telemetry_pressureLabel": "Tlak",
|
|
||||||
"telemetry_altitudeLabel": "Nadmorska višina",
|
|
||||||
"telemetry_frequencyLabel": "Frekvenca",
|
|
||||||
"telemetry_percentageLabel": "Odstotek",
|
|
||||||
"telemetry_concentrationLabel": "Koncentracija",
|
|
||||||
"telemetry_powerLabel": "Moč",
|
|
||||||
"telemetry_distanceLabel": "Razdalja",
|
|
||||||
"telemetry_energyLabel": "Energija",
|
|
||||||
"telemetry_directionLabel": "Smer",
|
|
||||||
"telemetry_timeLabel": "Čas",
|
|
||||||
"telemetry_gyrometerLabel": "Žiroskop",
|
|
||||||
"telemetry_colourLabel": "Barva",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "Stikalo",
|
|
||||||
"telemetry_polylineLabel": "Polilinija",
|
|
||||||
"telemetry_altitudeValue": "{meters} m",
|
|
||||||
"telemetry_frequencyValue": "{hertz} Hz",
|
|
||||||
"telemetry_pressureValue": "{hpa} hPa",
|
|
||||||
"telemetry_luminosityValue": "{lux} lx",
|
|
||||||
"telemetry_powerValue": "{watts} W",
|
|
||||||
"telemetry_distanceValue": "{meters} m",
|
|
||||||
"telemetry_energyValue": "{kilowattHours} kWh",
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"telemetry_autoFetchQuantity": "Število zahtev",
|
|
||||||
"telemetry_error": "Podatkov ni bilo mogoče pridobiti",
|
|
||||||
"telemetry_noData": "Niso na voljo podatki o telemetriji.",
|
"telemetry_noData": "Niso na voljo podatki o telemetriji.",
|
||||||
"telemetry_channelTitle": "Kanal {channel}",
|
"telemetry_channelTitle": "Kanal {channel}",
|
||||||
"@telemetry_channelTitle": {
|
"@telemetry_channelTitle": {
|
||||||
@@ -2203,9 +2099,6 @@
|
|||||||
"translation_enableSubtitle": "Prevedite vstopne sporočila in omogočite predhodno prevajanje.",
|
"translation_enableSubtitle": "Prevedite vstopne sporočila in omogočite predhodno prevajanje.",
|
||||||
"translation_enableTitle": "Omogočite prevod",
|
"translation_enableTitle": "Omogočite prevod",
|
||||||
"translation_composerSubtitle": "Ureja privzeto stanje ikone za prevod, ki jo uporablja avtor.",
|
"translation_composerSubtitle": "Ureja privzeto stanje ikone za prevod, ki jo uporablja avtor.",
|
||||||
"translation_autoIncomingTitle": "Samodejno prevajaj sporočila",
|
|
||||||
"translation_autoIncomingSubtitle": "Samodejno prevaja sporočila za obvestila ter za klepete ali kanale.",
|
|
||||||
"translation_translateMessage": "Prevedi sporočilo",
|
|
||||||
"translation_targetLanguage": "Ciljna jezika",
|
"translation_targetLanguage": "Ciljna jezika",
|
||||||
"translation_useAppLanguage": "Uporabite jezik aplikacije",
|
"translation_useAppLanguage": "Uporabite jezik aplikacije",
|
||||||
"translation_downloadedModelLabel": "Naložen model",
|
"translation_downloadedModelLabel": "Naložen model",
|
||||||
@@ -2419,191 +2312,8 @@
|
|||||||
"chat_newMessages": "Nove novice",
|
"chat_newMessages": "Nove novice",
|
||||||
"settings_companionDebugLogSubtitle": "Navodila, odgovori in surova podatka za BLE/TCP/USB.",
|
"settings_companionDebugLogSubtitle": "Navodila, odgovori in surova podatka za BLE/TCP/USB.",
|
||||||
"repeater_chanUtil": "Uporaba kanala",
|
"repeater_chanUtil": "Uporaba kanala",
|
||||||
"@routing_lastWorked": {
|
"dialog_connectCompanion": "Povežite se s spremljevalnikom za dostop do funkcij ponavljalnika in strežnika sob.",
|
||||||
"placeholders": {
|
"dialog_disconnectedTitle": "Prekinjeno",
|
||||||
"when": {
|
"dialog_disconnectedMessage": "Prekinjena povezava s vašim spre伴ovalcem.",
|
||||||
"type": "String"
|
"contact_connectCompanion": "Povežite se s ponсоbnikom za dostop do funkcij pon 반복nika in strežnika prostorov."
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"common_undo": "Preobrn",
|
|
||||||
"messageStatus_delivered": "Dostavljeno",
|
|
||||||
"messageStatus_sent": "Pošljeno",
|
|
||||||
"messageStatus_pending": "Pošiljanje",
|
|
||||||
"messageStatus_failed": "Uspešno ni bilo mogo, da se sporočilo pošlje",
|
|
||||||
"messageStatus_repeated": "Slišal sem večkrat",
|
|
||||||
"contacts_moreOptions": "Več možnosti",
|
|
||||||
"contacts_searchOpen": "Iskanje kontaktov",
|
|
||||||
"contacts_searchClose": "Izklopi iskanje",
|
|
||||||
"routing_title": "Navigacija",
|
|
||||||
"routing_modeAuto": "Avto",
|
|
||||||
"routing_modeFlood": "Poplavo",
|
|
||||||
"routing_modeManual": "Navodilo",
|
|
||||||
"routing_modeAutoHint": "Samodejno izbere najbolj poznano pot, in sicer, ko ni na voljo nobena.",
|
|
||||||
"routing_modeFloodHint": "Prenosi preko vseh repetitorjev. Najzanesljivejši način, vendar zahteva več časa.",
|
|
||||||
"routing_modeManualHint": "Vedno sledi natančni poti, ki jo ste določili.",
|
|
||||||
"routing_currentRoute": "Trenutna pot",
|
|
||||||
"routing_directNoHops": "Neposredno – brez prehodov",
|
|
||||||
"routing_noPathYet": "Žep trenutno ni mogoče najti. Naslednje sporočilo bo posredovano, dokler ne bo ugotovljeno, kje je pot.",
|
|
||||||
"routing_floodBroadcast": "Prenos preko vseh repetitiv",
|
|
||||||
"routing_editPath": "Uredi pot",
|
|
||||||
"routing_forgetPath": "Pozabi na pot",
|
|
||||||
"routing_knownPaths": "Poznati poti",
|
|
||||||
"routing_knownPathsHint": "Kliknite na pot, da jo izberete.",
|
|
||||||
"routing_inUse": "V uporabi",
|
|
||||||
"routing_qualityStrong": "Močan prvi korak",
|
|
||||||
"routing_qualityGood": "Prva uspešna faza",
|
|
||||||
"routing_qualityFair": "Prva, uspešna faza",
|
|
||||||
"routing_qualityWorked": "Izpolnil",
|
|
||||||
"routing_qualityFlood": "Slišano preko poplave",
|
|
||||||
"routing_qualityUntested": "Ne preizkušen",
|
|
||||||
"routing_lastWorked": "delal/a {when}",
|
|
||||||
"routing_neverWorked": "nikoli ni bilo potrjeno",
|
|
||||||
"routing_floodDelivery": "Dostava zaradi poplave",
|
|
||||||
"pathEditor_title": "Izgradnja poti",
|
|
||||||
"pathEditor_hopCounter": "{count} od 64 različnih sort hropa",
|
|
||||||
"pathEditor_noHops": "Še niso dodani hmelji. Za dodajanje hmelja v vrstnem redu kliknite na povezavo spodaj, ali pa shranite brez dodanega hmelja, da ga lahko posredujete neposredno.",
|
|
||||||
"pathEditor_addHops": "Dodajte suho travo v skladu s postopkom.",
|
|
||||||
"pathEditor_searchRepeaters": "Iskanje ponovitev",
|
|
||||||
"pathEditor_advancedHex": "Napredno: surovi šestnajstni pot",
|
|
||||||
"pathEditor_hexLabel": "Predfiks za heksadecimalno šifro",
|
|
||||||
"pathEditor_hexHelper": "Dva šestbitna znaka na vsak skok, ločena z vejico",
|
|
||||||
"pathEditor_invalidTokens": "Neveljaven: {tokens}",
|
|
||||||
"pathEditor_tooManyHops": "Največ 64 hopov",
|
|
||||||
"pathEditor_usePath": "Uporabite to poto",
|
|
||||||
"pathEditor_removeHop": "Odstranite hmelj",
|
|
||||||
"pathEditor_unknownHop": "Neznani ponovitelj",
|
|
||||||
"map_zoomIn": "Povečaj",
|
|
||||||
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
||||||
"map_zoomOut": "Povečajte pogled",
|
|
||||||
"map_centerMap": "Krajšarska karta",
|
|
||||||
"chrome_bluetoothRequiresChromium": "Web Bluetooth zahteva brskalnik Chromium.",
|
|
||||||
"channels_communityShortId": "ID: {id}...",
|
|
||||||
"pathTrace_legendGpsConfirmed": "GPS potrdilo",
|
|
||||||
"pathTrace_legendInferred": "Izpeljana lokacija",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"scanner_bluetoothWebUnsupported": "Funkcija Bluetooth v brskalniku ni na voljo. Povežite se preko USB-ja namesto tega.",
|
|
||||||
"map_searchHint": "Iščite ime ali ID vozlišča",
|
|
||||||
"map_online": "V omrežju",
|
|
||||||
"map_activity": "Dejavnost",
|
|
||||||
"map_recent": "Nedavni",
|
|
||||||
"map_stale": "Zastarelo",
|
|
||||||
"map_visible": "Vidno",
|
|
||||||
"map_hidden": "Skrit",
|
|
||||||
"map_centerOnNode": "Centriraj na vozlišče",
|
|
||||||
"map_details": "Podrobnosti",
|
|
||||||
"map_noGps": "Brez GPS",
|
|
||||||
"map_noResults": "Ni ujemajočih se vozlišč",
|
|
||||||
"pathMap_viewSingle": "Posamično",
|
|
||||||
"pathMap_viewCombined": "Skupno",
|
|
||||||
"pathMap_play": "Predvajaj",
|
|
||||||
"pathMap_pause": "Premor",
|
|
||||||
"pathMap_replay": "Ponovitev",
|
|
||||||
"pathMap_stepBack": "Prejšnji skok",
|
|
||||||
"pathMap_stepForward": "Naslednji skok",
|
|
||||||
"pathMap_animationOn": "Prikaži animacijo paketa",
|
|
||||||
"pathMap_animationOff": "Skrij animacijo paketa",
|
|
||||||
"pathMap_hopOf": "Skok {current} od {total}",
|
|
||||||
"pathMap_observedPaths": "Opazovane poti: {count}",
|
|
||||||
"pathMap_primary": "Primarna",
|
|
||||||
"pathMap_alternate": "Alternativa {index}",
|
|
||||||
"pathMap_legendShared": "Deljen segment",
|
|
||||||
"pathMap_legendEstimated": "Ocenjen segment",
|
|
||||||
"pathMap_sharedNodeCount": "Uporablja {count} poti",
|
|
||||||
"pathMap_partialAnimation": "{count, plural, =1{1 skok nima lokacije — prikazana pot je delna} =2{2 skoka nimata lokacije — prikazana pot je delna} few{{count} skoki nimajo lokacije — prikazana pot je delna} other{{count} skokov nima lokacije — prikazana pot je delna}}",
|
|
||||||
"pathMap_hopCount": "{count, plural, =1{1 skok} =2{2 skoka} few{{count} skoki} other{{count} skokov}}",
|
|
||||||
"pathMap_showAllPaths": "Pokaži vse",
|
|
||||||
"pathMap_hidePath": "Skrij pot",
|
|
||||||
"pathMap_showPath": "Pokaži pot",
|
|
||||||
"pathMap_collapsePanel": "Strni ploščo",
|
|
||||||
"pathMap_expandPanel": "Razširi ploščo",
|
|
||||||
"pathMap_noLocation": "Brez lokacije",
|
|
||||||
"pathMap_followPacket": "Zakleni pogled na paket",
|
|
||||||
"pathMap_unfollowPacket": "Odkleni pogled od paketa",
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,8 +33,6 @@
|
|||||||
"common_remove": "Ta bort",
|
"common_remove": "Ta bort",
|
||||||
"common_enable": "Aktivera",
|
"common_enable": "Aktivera",
|
||||||
"common_disable": "Inaktivera",
|
"common_disable": "Inaktivera",
|
||||||
"common_autoRefresh": "Automatisk uppdatering",
|
|
||||||
"common_interval": "Intervall",
|
|
||||||
"common_reboot": "Start om",
|
"common_reboot": "Start om",
|
||||||
"common_loading": "Laddar...",
|
"common_loading": "Laddar...",
|
||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
@@ -100,8 +98,6 @@
|
|||||||
"settings_locationInvalid": "Ogiltig latitud eller longitud.",
|
"settings_locationInvalid": "Ogiltig latitud eller longitud.",
|
||||||
"settings_latitude": "Latitud",
|
"settings_latitude": "Latitud",
|
||||||
"settings_longitude": "Längdgrad",
|
"settings_longitude": "Längdgrad",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "Automatisk zero-hop-annons vid GPS-uppdatering",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "När GPS-positionen ändras, skicka en zero-hop-annons (kräver plats i annonsen).",
|
|
||||||
"settings_privacyMode": "Privatläge",
|
"settings_privacyMode": "Privatläge",
|
||||||
"settings_privacyModeSubtitle": "Dölj namn/plats i annonser",
|
"settings_privacyModeSubtitle": "Dölj namn/plats i annonser",
|
||||||
"settings_privacyModeToggle": "Aktivera privatläge för att dölja ditt namn och din plats i annonser.",
|
"settings_privacyModeToggle": "Aktivera privatläge för att dölja ditt namn och din plats i annonser.",
|
||||||
@@ -242,19 +238,6 @@
|
|||||||
"appSettings_last6Hours": "De senaste 6 timmarna",
|
"appSettings_last6Hours": "De senaste 6 timmarna",
|
||||||
"appSettings_last24Hours": "De senaste 24 timmarna",
|
"appSettings_last24Hours": "De senaste 24 timmarna",
|
||||||
"appSettings_lastWeek": "Förra veckan",
|
"appSettings_lastWeek": "Förra veckan",
|
||||||
"appSettings_rasterTileSource": "Källa för rasterplattor",
|
|
||||||
"appSettings_stadiaEndpoint": "Stadia-slutpunkt",
|
|
||||||
"appSettings_stadiaApiKey": "Stadia API-nyckel",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "Krävs för att använda Stadia Maps",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "Konfigurerad: {maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "Ange din Stadia Maps API-nyckel. Appen använder den för förfrågningar om rasterplattor.",
|
|
||||||
"appSettings_offlineMapCache": "Offline Kartcache",
|
"appSettings_offlineMapCache": "Offline Kartcache",
|
||||||
"appSettings_noAreaSelected": "Ingen area markerad",
|
"appSettings_noAreaSelected": "Ingen area markerad",
|
||||||
"appSettings_areaSelectedZoom": "Område markerat (zoom {minZoom}-{maxZoom})",
|
"appSettings_areaSelectedZoom": "Område markerat (zoom {minZoom}-{maxZoom})",
|
||||||
@@ -784,56 +767,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
"mapCache_boundsLabel": "N {north}, S {south}, E {east}, W {west}",
|
||||||
"@mapCache_boundsLabel": {
|
"@mapCache_boundsLabel": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -1172,7 +1105,7 @@
|
|||||||
"repeater_advancedSettings": "Avancerad",
|
"repeater_advancedSettings": "Avancerad",
|
||||||
"repeater_advancedSettingsSubtitle": "Ställjusteringsknappar för erfarna användare",
|
"repeater_advancedSettingsSubtitle": "Ställjusteringsknappar för erfarna användare",
|
||||||
"repeater_pathHashMode": "Hash-läge för sökväg",
|
"repeater_pathHashMode": "Hash-läge för sökväg",
|
||||||
"repeater_pathHashModeHelper": "Byte som används för att koda denna repeaters ID i taggar för flood-väg/loopdetektering. 0=1 byte (256 ID:n, upp till 64 hopp), 1=2 byte (65 000 ID:n, upp till 32 hopp), 2=3 byte (16 miljoner ID:n, upp till 21 hopp). Firmware före v1.14 använde alltid 1-byte-vägar; v1.14 och nyare kan konfigureras för 2- eller 3-byte-vägar.",
|
"repeater_pathHashModeHelper": "Byte används för att koda denna repeaters ID i taggar för att upptäcka loopar/flödesvägar. 0=1 byte (256 ID:n, upp till 64 hopp), 1=2 byte (65 000 ID:n, upp till 32 hopp), 2=3 byte (16 miljoner ID:n, upp till 21 hopp). Versioner 1.13 och äldre har stöd för multi-byte-vägar – endast en gång när nätverket är aktiverat (från och med version 1.14).",
|
||||||
"repeater_txDelay": "Försening i Flood TX",
|
"repeater_txDelay": "Försening i Flood TX",
|
||||||
"repeater_txDelayHelper": "Återöverföringsintervall för trafik under perioder med hög belastning, som en multiplikator av paketets överföringstid (0-2, standard 0,5). Högre värde = färre kollisioner, men långsammare leverans.",
|
"repeater_txDelayHelper": "Återöverföringsintervall för trafik under perioder med hög belastning, som en multiplikator av paketets överföringstid (0-2, standard 0,5). Högre värde = färre kollisioner, men långsammare leverans.",
|
||||||
"repeater_directTxDelay": "Direkt TX-fördröjning",
|
"repeater_directTxDelay": "Direkt TX-fördröjning",
|
||||||
@@ -1347,43 +1280,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"telemetry_digitalInputLabel": "Digital ingång",
|
|
||||||
"telemetry_digitalOutputLabel": "Digital utgång",
|
|
||||||
"telemetry_analogInputLabel": "Analog ingång",
|
|
||||||
"telemetry_analogOutputLabel": "Analog utgång",
|
|
||||||
"telemetry_genericLabel": "Allmän sensor",
|
|
||||||
"telemetry_luminosityLabel": "Ljusstyrka",
|
|
||||||
"telemetry_presenceLabel": "Närvaro",
|
|
||||||
"telemetry_humidityLabel": "Luftfuktighet",
|
|
||||||
"telemetry_accelerometerLabel": "Accelerometer",
|
|
||||||
"telemetry_pressureLabel": "Tryck",
|
|
||||||
"telemetry_altitudeLabel": "Höjd",
|
|
||||||
"telemetry_frequencyLabel": "Frekvens",
|
|
||||||
"telemetry_percentageLabel": "Procent",
|
|
||||||
"telemetry_concentrationLabel": "Koncentration",
|
|
||||||
"telemetry_powerLabel": "Effekt",
|
|
||||||
"telemetry_distanceLabel": "Avstånd",
|
|
||||||
"telemetry_energyLabel": "Energi",
|
|
||||||
"telemetry_directionLabel": "Riktning",
|
|
||||||
"telemetry_timeLabel": "Tid",
|
|
||||||
"telemetry_gyrometerLabel": "Gyrometer",
|
|
||||||
"telemetry_colourLabel": "Färg",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "Brytare",
|
|
||||||
"telemetry_polylineLabel": "Polylinje",
|
|
||||||
"telemetry_altitudeValue": "{meters} m",
|
|
||||||
"telemetry_frequencyValue": "{hertz} Hz",
|
|
||||||
"telemetry_pressureValue": "{hpa} hPa",
|
|
||||||
"telemetry_luminosityValue": "{lux} lx",
|
|
||||||
"telemetry_powerValue": "{watts} W",
|
|
||||||
"telemetry_distanceValue": "{meters} m",
|
|
||||||
"telemetry_energyValue": "{kilowattHours} kWh",
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"telemetry_autoFetchQuantity": "Antal förfrågningar",
|
|
||||||
"telemetry_error": "Det gick inte att hämta data",
|
|
||||||
"telemetry_noData": "Inga telemetridata tillgängliga.",
|
"telemetry_noData": "Inga telemetridata tillgängliga.",
|
||||||
"telemetry_channelTitle": "Kanal {channel}",
|
"telemetry_channelTitle": "Kanal {channel}",
|
||||||
"@telemetry_channelTitle": {
|
"@telemetry_channelTitle": {
|
||||||
@@ -2204,9 +2100,6 @@
|
|||||||
"translation_title": "Översättning",
|
"translation_title": "Översättning",
|
||||||
"translation_composerTitle": "Översätt innan du skickar",
|
"translation_composerTitle": "Översätt innan du skickar",
|
||||||
"translation_composerSubtitle": "Styr standardtillståndet för kompositorns översättningsikon.",
|
"translation_composerSubtitle": "Styr standardtillståndet för kompositorns översättningsikon.",
|
||||||
"translation_autoIncomingTitle": "Översätt meddelanden automatiskt",
|
|
||||||
"translation_autoIncomingSubtitle": "Översätter meddelanden automatiskt för aviseringar och för chattar eller kanaler.",
|
|
||||||
"translation_translateMessage": "Översätt meddelande",
|
|
||||||
"translation_targetLanguage": "Målmedvetet språk",
|
"translation_targetLanguage": "Målmedvetet språk",
|
||||||
"translation_useAppLanguage": "Använd appens språk",
|
"translation_useAppLanguage": "Använd appens språk",
|
||||||
"translation_downloadedModelLabel": "Nedladdad modell",
|
"translation_downloadedModelLabel": "Nedladdad modell",
|
||||||
@@ -2419,191 +2312,8 @@
|
|||||||
"chat_newMessages": "Nya meddelanden",
|
"chat_newMessages": "Nya meddelanden",
|
||||||
"settings_companionDebugLogSubtitle": "BLE/TCP/USB-kommandon, svar och rådata",
|
"settings_companionDebugLogSubtitle": "BLE/TCP/USB-kommandon, svar och rådata",
|
||||||
"repeater_chanUtil": "Användning av kanal",
|
"repeater_chanUtil": "Användning av kanal",
|
||||||
"@routing_lastWorked": {
|
"dialog_connectCompanion": "Anslut till en sällskapstjänst för att komma åt upprepning och rumsserverfunktioner.",
|
||||||
"placeholders": {
|
"dialog_disconnectedTitle": "Ansluten ej",
|
||||||
"when": {
|
"dialog_disconnectedMessage": "Du har kopplats från din companion.",
|
||||||
"type": "String"
|
"contact_connectCompanion": "Anslut till en companion för att få tillgång till repeater- och rumsserverfunktioner."
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messageStatus_sent": "Sen",
|
|
||||||
"messageStatus_delivered": "Levererad",
|
|
||||||
"common_undo": "Ångra",
|
|
||||||
"messageStatus_pending": "Skicka",
|
|
||||||
"messageStatus_failed": "Misslyckades med att skicka",
|
|
||||||
"messageStatus_repeated": "Hördes upprepade gånger",
|
|
||||||
"contacts_moreOptions": "Fler alternativ",
|
|
||||||
"contacts_searchOpen": "Sök efter kontakter",
|
|
||||||
"contacts_searchClose": "Avancerad sökning",
|
|
||||||
"routing_title": "Ruttplanering",
|
|
||||||
"routing_modeAuto": "Bil",
|
|
||||||
"routing_modeFlood": "Översvämning",
|
|
||||||
"routing_modeManual": "Instruktioner",
|
|
||||||
"routing_modeAutoHint": "Väljer automatiskt den bästa kända vägen, och använder en \"flooding\"-strategi om ingen väg är känd.",
|
|
||||||
"routing_modeFloodHint": "Sändningar via alla repetrar. Det mest pålitliga alternativet, men kräver mer sändtid.",
|
|
||||||
"routing_modeManualHint": "Skickar alltid den exakta väg du har angivit.",
|
|
||||||
"routing_currentRoute": "Nuvarande rutt",
|
|
||||||
"routing_directNoHops": "Direkt – utan mellanliggande routrar",
|
|
||||||
"routing_noPathYet": "Ingen väg hittad ännu. Nästa meddelande skickas tills en rutt har upptäckts.",
|
|
||||||
"routing_floodBroadcast": "Sändas via alla repetrar",
|
|
||||||
"routing_editPath": "Redigera sökväg",
|
|
||||||
"routing_forgetPath": "Glöm vägen",
|
|
||||||
"routing_knownPaths": "Kända vägar",
|
|
||||||
"routing_knownPathsHint": "Välj en väg för att byta till den.",
|
|
||||||
"routing_inUse": "I användning",
|
|
||||||
"routing_qualityStrong": "En stark start",
|
|
||||||
"routing_qualityGood": "Bra första steg",
|
|
||||||
"routing_qualityFair": "Bra första hopp",
|
|
||||||
"routing_qualityWorked": "Har levererat",
|
|
||||||
"routing_qualityFlood": "Fått information via nyhetsflöde",
|
|
||||||
"routing_qualityUntested": "Ej testat",
|
|
||||||
"routing_lastWorked": "arbetade {when}",
|
|
||||||
"routing_neverWorked": "aldrig bekräftat",
|
|
||||||
"routing_floodDelivery": "Leverans vid översvämningsområde",
|
|
||||||
"pathEditor_title": "Skapa väg",
|
|
||||||
"pathEditor_hopCounter": "{count} av 64 humlor",
|
|
||||||
"pathEditor_noHops": "Inga humle än. Använd knapparna nedan för att lägga till dem i rätt ordning, eller spara utan humle för att skicka direkt.",
|
|
||||||
"pathEditor_addHops": "Tillsätt humlen i rätt ordning.",
|
|
||||||
"pathEditor_searchRepeaters": "Sök efter återupptagna samtal",
|
|
||||||
"pathEditor_advancedHex": "Avancerat: rå hex-sökväg",
|
|
||||||
"pathEditor_hexLabel": "Hex-prefikser",
|
|
||||||
"pathEditor_hexHelper": "Två hex-tecken per steg, separerade med kommatecken.",
|
|
||||||
"pathEditor_invalidTokens": "Ogiltigt: {tokens}",
|
|
||||||
"pathEditor_tooManyHops": "Maximalt 64 humlörter",
|
|
||||||
"pathEditor_usePath": "Använd denna väg",
|
|
||||||
"pathEditor_removeHop": "Ta bort humlen",
|
|
||||||
"pathEditor_unknownHop": "Okänd förstärkare",
|
|
||||||
"map_zoomIn": "Zooma in",
|
|
||||||
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
||||||
"map_zoomOut": "Zooma ut",
|
|
||||||
"map_centerMap": "Kartöversikt",
|
|
||||||
"chrome_bluetoothRequiresChromium": "Web Bluetooth kräver en Chromium-baserad webbläsare.",
|
|
||||||
"channels_communityShortId": "ID: {id}...",
|
|
||||||
"pathTrace_legendGpsConfirmed": "GPS-verifierat",
|
|
||||||
"pathTrace_legendInferred": "Antagen position",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"map_online": "Online",
|
|
||||||
"scanner_bluetoothWebUnsupported": "Bluetooth är inte tillgängligt i webbläsaren. Anslut istället via USB.",
|
|
||||||
"map_activity": "Aktivitet",
|
|
||||||
"map_searchHint": "Sök efter nodens namn eller ID",
|
|
||||||
"map_recent": "Nyligen",
|
|
||||||
"map_stale": "Inaktuell",
|
|
||||||
"map_visible": "Synlig",
|
|
||||||
"map_hidden": "Dold",
|
|
||||||
"map_centerOnNode": "Centrera på nod",
|
|
||||||
"map_details": "Detaljer",
|
|
||||||
"map_noGps": "Ingen GPS",
|
|
||||||
"map_noResults": "Inga matchande noder",
|
|
||||||
"pathMap_viewSingle": "Enkel",
|
|
||||||
"pathMap_viewCombined": "Kombinerat",
|
|
||||||
"pathMap_play": "Spela",
|
|
||||||
"pathMap_pause": "Pausa",
|
|
||||||
"pathMap_replay": "Återspela",
|
|
||||||
"pathMap_stepBack": "Föregående hopp",
|
|
||||||
"pathMap_stepForward": "Nästa hopp",
|
|
||||||
"pathMap_animationOn": "Visa paketanimering",
|
|
||||||
"pathMap_animationOff": "Dölj paketanimering",
|
|
||||||
"pathMap_hopOf": "Hopp {current} av {total}",
|
|
||||||
"pathMap_observedPaths": "Observerade vägar: {count}",
|
|
||||||
"pathMap_primary": "Primär",
|
|
||||||
"pathMap_alternate": "Alternativ {index}",
|
|
||||||
"pathMap_hopCount": "{count, plural, =1{1 hopp} other{{count} hopp}}",
|
|
||||||
"pathMap_legendShared": "Delat segment",
|
|
||||||
"pathMap_legendEstimated": "Uppskattat segment",
|
|
||||||
"pathMap_sharedNodeCount": "Används av {count} vägar",
|
|
||||||
"pathMap_partialAnimation": "{count, plural, =1{1 hopp saknar position — den visade vägen är ofullständig} other{{count} hopp saknar position — den visade vägen är ofullständig}}",
|
|
||||||
"pathMap_showAllPaths": "Visa allt",
|
|
||||||
"pathMap_hidePath": "Dölj väg",
|
|
||||||
"pathMap_showPath": "Visa väg",
|
|
||||||
"pathMap_collapsePanel": "Fäll ihop panel",
|
|
||||||
"pathMap_expandPanel": "Expandera panel",
|
|
||||||
"pathMap_noLocation": "Ingen position",
|
|
||||||
"pathMap_unfollowPacket": "Lås upp vy från paket",
|
|
||||||
"pathMap_followPacket": "Lås vy till paket",
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,8 +34,6 @@
|
|||||||
"common_remove": "Прибрати",
|
"common_remove": "Прибрати",
|
||||||
"common_enable": "Увімкнути",
|
"common_enable": "Увімкнути",
|
||||||
"common_disable": "Вимкнути",
|
"common_disable": "Вимкнути",
|
||||||
"common_autoRefresh": "Автооновлення",
|
|
||||||
"common_interval": "Інтервал",
|
|
||||||
"common_reboot": "Перезавантажити",
|
"common_reboot": "Перезавантажити",
|
||||||
"common_loading": "Завантаження...",
|
"common_loading": "Завантаження...",
|
||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
@@ -101,8 +99,6 @@
|
|||||||
"settings_locationInvalid": "Некоректна широта або довгота.",
|
"settings_locationInvalid": "Некоректна широта або довгота.",
|
||||||
"settings_latitude": "Широта",
|
"settings_latitude": "Широта",
|
||||||
"settings_longitude": "Довгота",
|
"settings_longitude": "Довгота",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "Автооголошення без хопів при оновленні GPS",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "Коли GPS-локація змінюється, надсилати оголошення без хопів (потрібна геопозиція в оголошенні).",
|
|
||||||
"settings_privacyMode": "Режим приватності",
|
"settings_privacyMode": "Режим приватності",
|
||||||
"settings_privacyModeSubtitle": "Приховати ім'я/геопозицію в оголошеннях",
|
"settings_privacyModeSubtitle": "Приховати ім'я/геопозицію в оголошеннях",
|
||||||
"settings_privacyModeToggle": "Увімкніть режим приватності, щоб приховати своє ім'я та геопозицію в оголошеннях.",
|
"settings_privacyModeToggle": "Увімкніть режим приватності, щоб приховати своє ім'я та геопозицію в оголошеннях.",
|
||||||
@@ -244,19 +240,6 @@
|
|||||||
"appSettings_last6Hours": "Останні 6 годин",
|
"appSettings_last6Hours": "Останні 6 годин",
|
||||||
"appSettings_last24Hours": "Останні 24 години",
|
"appSettings_last24Hours": "Останні 24 години",
|
||||||
"appSettings_lastWeek": "Минулий тиждень",
|
"appSettings_lastWeek": "Минулий тиждень",
|
||||||
"appSettings_rasterTileSource": "Джерело растрових тайлів",
|
|
||||||
"appSettings_stadiaEndpoint": "Кінцева точка Stadia",
|
|
||||||
"appSettings_stadiaApiKey": "Ключ API Stadia",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "Потрібно для використання Stadia Maps",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "Налаштовано: {maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "Введіть свій ключ API Stadia Maps. Програма використовує його для запитів растрових тайлів.",
|
|
||||||
"appSettings_offlineMapCache": "Офлайн-кеш карти",
|
"appSettings_offlineMapCache": "Офлайн-кеш карти",
|
||||||
"appSettings_noAreaSelected": "Область не вибрано",
|
"appSettings_noAreaSelected": "Область не вибрано",
|
||||||
"appSettings_areaSelectedZoom": "Вибрана область (зум {minZoom}-{maxZoom})",
|
"appSettings_areaSelectedZoom": "Вибрана область (зум {minZoom}-{maxZoom})",
|
||||||
@@ -794,56 +777,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "Пн {north}, Пд {south}, Сх {east}, Зх {west}",
|
"mapCache_boundsLabel": "Пн {north}, Пд {south}, Сх {east}, Зх {west}",
|
||||||
"@mapCache_boundsLabel": {
|
"@mapCache_boundsLabel": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -1182,7 +1115,7 @@
|
|||||||
"repeater_advancedSettings": "Просунутий",
|
"repeater_advancedSettings": "Просунутий",
|
||||||
"repeater_advancedSettingsSubtitle": "Регулювальні ручки для досвідчених операторів",
|
"repeater_advancedSettingsSubtitle": "Регулювальні ручки для досвідчених операторів",
|
||||||
"repeater_pathHashMode": "Режим хешування шляху",
|
"repeater_pathHashMode": "Режим хешування шляху",
|
||||||
"repeater_pathHashModeHelper": "Байти, що використовуються для кодування ідентифікатора цього ретранслятора в тегах flood-шляху/виявлення петель. 0=1 байт (256 ідентифікаторів, до 64 переходів), 1=2 байти (65 000 ідентифікаторів, до 32 переходів), 2=3 байти (16 мільйонів ідентифікаторів, до 21 переходу). Прошивки до v1.14 завжди використовували 1-байтові шляхи; v1.14 і новіші можна налаштувати на 2- або 3-байтові шляхи.",
|
"repeater_pathHashModeHelper": "Байти, що використовуються для кодування ідентифікатора цього ретранслятора в тегах для виявлення потоків/петлі. 0=1 байт (256 ідентифікаторів, до 64 перехідів), 1=2 байти (65 000 ідентифікаторів, до 32 перехідів), 2=3 байти (16 мільйонів ідентифікаторів, до 21 переходу). Версії 1.13 та старіші не підтримують багатобайтні шляхи — вони активуються лише після того, як мережа буде оновлена до версії 1.14+.",
|
||||||
"repeater_txDelay": "Затримка у Flood, штат Техас",
|
"repeater_txDelay": "Затримка у Flood, штат Техас",
|
||||||
"repeater_txDelayHelper": "Повторне надсилання з урахуванням навантаження від потоків транспорту, як множник від часу передачі пакета (0-2, за замовчуванням 0,5). Чим вище значення, тим менше конфліктів, але повільніше передавання.",
|
"repeater_txDelayHelper": "Повторне надсилання з урахуванням навантаження від потоків транспорту, як множник від часу передачі пакета (0-2, за замовчуванням 0,5). Чим вище значення, тим менше конфліктів, але повільніше передавання.",
|
||||||
"repeater_directTxDelay": "Пряме затримка TX",
|
"repeater_directTxDelay": "Пряме затримка TX",
|
||||||
@@ -1358,43 +1291,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"telemetry_digitalInputLabel": "Цифровий вхід",
|
|
||||||
"telemetry_digitalOutputLabel": "Цифровий вихід",
|
|
||||||
"telemetry_analogInputLabel": "Аналоговий вхід",
|
|
||||||
"telemetry_analogOutputLabel": "Аналоговий вихід",
|
|
||||||
"telemetry_genericLabel": "Загальний датчик",
|
|
||||||
"telemetry_luminosityLabel": "Освітленість",
|
|
||||||
"telemetry_presenceLabel": "Присутність",
|
|
||||||
"telemetry_humidityLabel": "Вологість",
|
|
||||||
"telemetry_accelerometerLabel": "Акселерометр",
|
|
||||||
"telemetry_pressureLabel": "Тиск",
|
|
||||||
"telemetry_altitudeLabel": "Висота",
|
|
||||||
"telemetry_frequencyLabel": "Частота",
|
|
||||||
"telemetry_percentageLabel": "Відсоток",
|
|
||||||
"telemetry_concentrationLabel": "Концентрація",
|
|
||||||
"telemetry_powerLabel": "Потужність",
|
|
||||||
"telemetry_distanceLabel": "Відстань",
|
|
||||||
"telemetry_energyLabel": "Енергія",
|
|
||||||
"telemetry_directionLabel": "Напрямок",
|
|
||||||
"telemetry_timeLabel": "Час",
|
|
||||||
"telemetry_gyrometerLabel": "Гірометр",
|
|
||||||
"telemetry_colourLabel": "Колір",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "Перемикач",
|
|
||||||
"telemetry_polylineLabel": "Полілінія",
|
|
||||||
"telemetry_altitudeValue": "{meters} м",
|
|
||||||
"telemetry_frequencyValue": "{hertz} Гц",
|
|
||||||
"telemetry_pressureValue": "{hpa} гПа",
|
|
||||||
"telemetry_luminosityValue": "{lux} лк",
|
|
||||||
"telemetry_powerValue": "{watts} Вт",
|
|
||||||
"telemetry_distanceValue": "{meters} м",
|
|
||||||
"telemetry_energyValue": "{kilowattHours} кВт⋅год",
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"telemetry_autoFetchQuantity": "Кількість запитів",
|
|
||||||
"telemetry_error": "Не вдалося отримати дані",
|
|
||||||
"telemetry_noData": "Дані телеметрії недоступні.",
|
"telemetry_noData": "Дані телеметрії недоступні.",
|
||||||
"telemetry_channelTitle": "Канал {channel}",
|
"telemetry_channelTitle": "Канал {channel}",
|
||||||
"@telemetry_channelTitle": {
|
"@telemetry_channelTitle": {
|
||||||
@@ -2213,9 +2109,6 @@
|
|||||||
"translation_enableTitle": "Увімкнути переклад",
|
"translation_enableTitle": "Увімкнути переклад",
|
||||||
"translation_enableSubtitle": "Перекладати отримані повідомлення та дозволяти попередній переклад перед відправкою.",
|
"translation_enableSubtitle": "Перекладати отримані повідомлення та дозволяти попередній переклад перед відправкою.",
|
||||||
"translation_composerSubtitle": "Контролює стан ікон перекладу, який використовується за замовчуванням.",
|
"translation_composerSubtitle": "Контролює стан ікон перекладу, який використовується за замовчуванням.",
|
||||||
"translation_autoIncomingTitle": "Автоматично перекладати повідомлення",
|
|
||||||
"translation_autoIncomingSubtitle": "Автоматично перекладає повідомлення для сповіщень, а також для чатів і каналів.",
|
|
||||||
"translation_translateMessage": "Перекласти повідомлення",
|
|
||||||
"translation_targetLanguage": "Цільова мова",
|
"translation_targetLanguage": "Цільова мова",
|
||||||
"translation_useAppLanguage": "Використовувати мову застосунку",
|
"translation_useAppLanguage": "Використовувати мову застосунку",
|
||||||
"translation_downloadedModelLabel": "Завантажений шаблон",
|
"translation_downloadedModelLabel": "Завантажений шаблон",
|
||||||
@@ -2399,191 +2292,8 @@
|
|||||||
"chat_newMessages": "Нові повідомлення",
|
"chat_newMessages": "Нові повідомлення",
|
||||||
"chat_markAsUnread": "Позначити як непрочитане",
|
"chat_markAsUnread": "Позначити як непрочитане",
|
||||||
"repeater_chanUtil": "Використання каналу",
|
"repeater_chanUtil": "Використання каналу",
|
||||||
"@routing_lastWorked": {
|
"dialog_connectCompanion": "Підключіться до супутнього пристрою, щоб отримати доступ до функцій ретранслятора та сервера кімнат.",
|
||||||
"placeholders": {
|
"dialog_disconnectedTitle": "Від’єднано",
|
||||||
"when": {
|
"dialog_disconnectedMessage": "Вас від’єднано від вашого супутника.",
|
||||||
"type": "String"
|
"contact_connectCompanion": "Підключіться до супутника, щоб отримати доступ до функцій репітера та серверів кімнат."
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messageStatus_delivered": "Доставлено",
|
|
||||||
"messageStatus_sent": "Надіслано",
|
|
||||||
"common_undo": "Скасувати",
|
|
||||||
"messageStatus_pending": "Надсилання",
|
|
||||||
"messageStatus_failed": "Не вдалося надіслати",
|
|
||||||
"messageStatus_repeated": "Почув неодноразово",
|
|
||||||
"contacts_moreOptions": "Більше можливостей",
|
|
||||||
"contacts_searchOpen": "Пошук контактів",
|
|
||||||
"contacts_searchClose": "Закрити пошук",
|
|
||||||
"routing_title": "Маршрутизація",
|
|
||||||
"routing_modeAuto": "Автомобіль",
|
|
||||||
"routing_modeFlood": "Повені",
|
|
||||||
"routing_modeManual": "Інструкція",
|
|
||||||
"routing_modeAutoHint": "Автоматично обирає найкращий відомий шлях, та у разі відсутності відомого шляху, використовує алгоритм \"занурення\".",
|
|
||||||
"routing_modeFloodHint": "Передавання через усі ретранслятори. Найбільш надійний спосіб, але потребує більше часу.",
|
|
||||||
"routing_modeManualHint": "Завжди доставляє точно за вказаним вами маршрутом.",
|
|
||||||
"routing_currentRoute": "Поточний маршрут",
|
|
||||||
"routing_directNoHops": "Пряме з'єднання – без проміжних ретрансляторів",
|
|
||||||
"routing_noPathYet": "Поки що немає жодного шляху. Повідомлення продовжуються надходити, поки не буде знайдено маршрут.",
|
|
||||||
"routing_floodBroadcast": "Поширення через усі ретранслятори",
|
|
||||||
"routing_editPath": "Редагувати шлях",
|
|
||||||
"routing_forgetPath": "Забудь про шлях",
|
|
||||||
"routing_knownPaths": "Відомі маршрути",
|
|
||||||
"routing_knownPathsHint": "Виберіть опцію, щоб переключитися на неї.",
|
|
||||||
"routing_inUse": "У робочому стані",
|
|
||||||
"routing_qualityStrong": "Сильний перший стрибок",
|
|
||||||
"routing_qualityGood": "Чудова перша спроба",
|
|
||||||
"routing_qualityFair": "Перший, але вдалий, крок",
|
|
||||||
"routing_qualityWorked": "Доставлено",
|
|
||||||
"routing_qualityFlood": "Дізнався через новини",
|
|
||||||
"routing_qualityUntested": "Не протестовано",
|
|
||||||
"routing_neverWorked": "ніколи не підтверджено",
|
|
||||||
"routing_floodDelivery": "Доставка під час повені",
|
|
||||||
"pathEditor_title": "Створити маршрут",
|
|
||||||
"pathEditor_hopCounter": "{count} з 64 штук хмелю",
|
|
||||||
"pathEditor_noHops": "Ще не додано хміль. Натисніть на відповідні кнопки, щоб додати його в потрібному порядку, або збережіть рецепт без хмілю, щоб відправити його безпосередньо.",
|
|
||||||
"pathEditor_addHops": "Додавайте хміль у наступній послідовності.",
|
|
||||||
"pathEditor_searchRepeaters": "Пошук повторювачів",
|
|
||||||
"pathEditor_advancedHex": "Просунутий рівень: пряма шлях у форматі шестнадцяткової системи.",
|
|
||||||
"pathEditor_hexLabel": "Префікси для шестнадцяткової системи числення",
|
|
||||||
"pathEditor_hexHelper": "Два шестизначні символи на кожний крок, розділені комами",
|
|
||||||
"pathEditor_invalidTokens": "Неправильно: {tokens}",
|
|
||||||
"routing_lastWorked": "worked {when}",
|
|
||||||
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
||||||
"pathEditor_tooManyHops": "Максимум 64 хмелеві колоди",
|
|
||||||
"pathEditor_usePath": "Використовуйте цей шлях",
|
|
||||||
"pathEditor_removeHop": "Видалити хміль",
|
|
||||||
"pathEditor_unknownHop": "Невідомий ретранслятор",
|
|
||||||
"map_zoomIn": "Увійти в режим збільшення",
|
|
||||||
"map_zoomOut": "Видалити зум",
|
|
||||||
"map_centerMap": "Карта центру",
|
|
||||||
"chrome_bluetoothRequiresChromium": "Web Bluetooth вимагає браузера на основі Chromium",
|
|
||||||
"channels_communityShortId": "ID: {id}...",
|
|
||||||
"pathTrace_legendGpsConfirmed": "GPS підтверджено",
|
|
||||||
"pathTrace_legendInferred": "Висновок щодо положення",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"scanner_bluetoothWebUnsupported": "Bluetooth недоступний у браузері. Підключіться через USB.",
|
|
||||||
"map_searchHint": "Назва або ID вузла",
|
|
||||||
"map_activity": "Активність",
|
|
||||||
"map_online": "Онлайн",
|
|
||||||
"map_recent": "Нещодавні",
|
|
||||||
"map_stale": "Застаріло",
|
|
||||||
"map_visible": "Видимий",
|
|
||||||
"map_hidden": "Прихований",
|
|
||||||
"map_centerOnNode": "Центрувати на вузлі",
|
|
||||||
"map_details": "Деталі",
|
|
||||||
"map_noGps": "Без GPS",
|
|
||||||
"map_noResults": "Не знайдено відповідних вузлів",
|
|
||||||
"pathMap_viewSingle": "Один",
|
|
||||||
"pathMap_viewCombined": "Об'єднаний",
|
|
||||||
"pathMap_play": "Відтворити",
|
|
||||||
"pathMap_pause": "Призупинити",
|
|
||||||
"pathMap_replay": "Повтор",
|
|
||||||
"pathMap_stepForward": "Наступний перехід",
|
|
||||||
"pathMap_stepBack": "Попередній перехід",
|
|
||||||
"pathMap_animationOn": "Відобразити анімацію пакета",
|
|
||||||
"pathMap_animationOff": "Приховати анімацію пакета",
|
|
||||||
"pathMap_hopOf": "Перехід {current} з {total}",
|
|
||||||
"pathMap_observedPaths": "Зафіксовані маршрути: {count}",
|
|
||||||
"pathMap_primary": "Основний",
|
|
||||||
"pathMap_alternate": "Альт. {index}",
|
|
||||||
"pathMap_hopCount": "{count, plural, =1{1 перехід} few{{count} переходи} many{{count} переходів} other{{count} переходів}}",
|
|
||||||
"pathMap_legendShared": "Об'єднаний сегмент",
|
|
||||||
"pathMap_legendEstimated": "Орієнтовний сегмент",
|
|
||||||
"pathMap_sharedNodeCount": "Використовується {count} шляхами",
|
|
||||||
"pathMap_partialAnimation": "{count, plural, =1{1 перехід не має геопозиції — показаний шлях є частковим} few{{count} переходи не мають геопозиції — показаний шлях є частковим} many{{count} переходів не мають геопозиції — показаний шлях є частковим} other{{count} переходів не мають геопозиції — показаний шлях є частковим}}",
|
|
||||||
"pathMap_showAllPaths": "Показати все",
|
|
||||||
"pathMap_hidePath": "Приховати шлях",
|
|
||||||
"pathMap_showPath": "Показати шлях",
|
|
||||||
"pathMap_collapsePanel": "Згорнути панель",
|
|
||||||
"pathMap_expandPanel": "Розгорнути панель",
|
|
||||||
"pathMap_noLocation": "Без геопозиції",
|
|
||||||
"pathMap_followPacket": "Прив'язати вигляд до пакету",
|
|
||||||
"pathMap_unfollowPacket": "Відв'язати вигляд від пакету",
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,8 +34,6 @@
|
|||||||
"common_remove": "移除",
|
"common_remove": "移除",
|
||||||
"common_enable": "启用",
|
"common_enable": "启用",
|
||||||
"common_disable": "禁用",
|
"common_disable": "禁用",
|
||||||
"common_autoRefresh": "自动刷新",
|
|
||||||
"common_interval": "间隔",
|
|
||||||
"common_reboot": "重启",
|
"common_reboot": "重启",
|
||||||
"common_loading": "正在加载...",
|
"common_loading": "正在加载...",
|
||||||
"common_notAvailable": "—",
|
"common_notAvailable": "—",
|
||||||
@@ -105,8 +103,6 @@
|
|||||||
"settings_locationIntervalInvalid": "间隔时间必须至少为 60 秒,但不超过 86400 秒。",
|
"settings_locationIntervalInvalid": "间隔时间必须至少为 60 秒,但不超过 86400 秒。",
|
||||||
"settings_latitude": "纬度",
|
"settings_latitude": "纬度",
|
||||||
"settings_longitude": "经度",
|
"settings_longitude": "经度",
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdate": "GPS 更新时自动发送零跳广告",
|
|
||||||
"settings_autoZeroHopAdvertOnGpsUpdateSubtitle": "当 GPS 位置变化时,发送零跳广告(需要在广告中包含位置)。",
|
|
||||||
"settings_privacyMode": "隐私模式",
|
"settings_privacyMode": "隐私模式",
|
||||||
"settings_privacyModeSubtitle": "在广告中隐藏姓名/位置",
|
"settings_privacyModeSubtitle": "在广告中隐藏姓名/位置",
|
||||||
"settings_privacyModeToggle": "切换隐私模式以在广告中隐藏姓名和位置,保护个人信息。",
|
"settings_privacyModeToggle": "切换隐私模式以在广告中隐藏姓名和位置,保护个人信息。",
|
||||||
@@ -256,19 +252,6 @@
|
|||||||
"appSettings_last6Hours": "过去6小时",
|
"appSettings_last6Hours": "过去6小时",
|
||||||
"appSettings_last24Hours": "过去24小时",
|
"appSettings_last24Hours": "过去24小时",
|
||||||
"appSettings_lastWeek": "上周",
|
"appSettings_lastWeek": "上周",
|
||||||
"appSettings_rasterTileSource": "栅格瓦片源",
|
|
||||||
"appSettings_stadiaEndpoint": "Stadia 端点",
|
|
||||||
"appSettings_stadiaApiKey": "Stadia API 密钥",
|
|
||||||
"appSettings_stadiaApiKeyRequired": "使用 Stadia Maps 时必需",
|
|
||||||
"appSettings_stadiaApiKeyConfigured": "已配置:{maskedKey}",
|
|
||||||
"@appSettings_stadiaApiKeyConfigured": {
|
|
||||||
"placeholders": {
|
|
||||||
"maskedKey": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"appSettings_stadiaApiKeyDialogDescription": "请输入你的 Stadia Maps API 密钥。该应用会使用它来请求栅格瓦片。",
|
|
||||||
"appSettings_offlineMapCache": "离线地图缓存",
|
"appSettings_offlineMapCache": "离线地图缓存",
|
||||||
"appSettings_noAreaSelected": "未选择任何区域",
|
"appSettings_noAreaSelected": "未选择任何区域",
|
||||||
"appSettings_areaSelectedZoom": "已选择区域(缩放 {minZoom} - {maxZoom})",
|
"appSettings_areaSelectedZoom": "已选择区域(缩放 {minZoom} - {maxZoom})",
|
||||||
@@ -811,56 +794,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mapCache_cachedTilesLabel": "Cached tiles",
|
|
||||||
"mapCache_cachedTileSummaryLabel": "Cached tile summary",
|
|
||||||
"mapCache_bulkDownloadDisabledForSource": "Offline bulk downloads are disabled for {source}.",
|
|
||||||
"@mapCache_bulkDownloadDisabledForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_bulkDownloadDisabledInConfig": "Offline bulk downloads are disabled for {source} in this app configuration.",
|
|
||||||
"@mapCache_bulkDownloadDisabledInConfig": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summarySource": "Source: {source}",
|
|
||||||
"@mapCache_summarySource": {
|
|
||||||
"placeholders": {
|
|
||||||
"source": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedTilesForSource": "Cached tiles for source: {count}",
|
|
||||||
"@mapCache_summaryCachedTilesForSource": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryCachedInSelection": "Cached in selected area/zoom: {count}",
|
|
||||||
"@mapCache_summaryCachedInSelection": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_summaryApproxCacheSize": "Approx cache size: {size}",
|
|
||||||
"@mapCache_summaryApproxCacheSize": {
|
|
||||||
"placeholders": {
|
|
||||||
"size": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"mapCache_boundsLabel": "北 {north}, 南 {south}, 东 {east}, 西 {west}",
|
"mapCache_boundsLabel": "北 {north}, 南 {south}, 东 {east}, 西 {west}",
|
||||||
"@mapCache_boundsLabel": {
|
"@mapCache_boundsLabel": {
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
@@ -1202,7 +1135,7 @@
|
|||||||
"repeater_advancedSettings": "高级",
|
"repeater_advancedSettings": "高级",
|
||||||
"repeater_advancedSettingsSubtitle": "高级操作员使用的调节旋钮",
|
"repeater_advancedSettingsSubtitle": "高级操作员使用的调节旋钮",
|
||||||
"repeater_pathHashMode": "路径哈希模式",
|
"repeater_pathHashMode": "路径哈希模式",
|
||||||
"repeater_pathHashModeHelper": "用于在洪泛路径/环路检测标签中编码此中继器 ID 的字节数。0=1 字节(256 个 ID,最多 64 跳),1=2 字节(65K 个 ID,最多 32 跳),2=3 字节(16M 个 ID,最多 21 跳)。v1.14 之前的固件始终使用 1 字节路径;v1.14 及更新版本可配置为 2 或 3 字节路径。",
|
"repeater_pathHashModeHelper": "用于编码此复用器的 ID 的字节数,在“洪流路径/环检测”标签中使用。 0=1 字节(256 个 ID,最多 64 个跳跃),1=2 字节(65K 个 ID,最多 32 个跳跃),2=3 字节(16M 个 ID,最多 21 个跳跃)。 v1.13 及更早版本的固件会使用多字节路径——只有在您的网络升级到 v1.14 或更高版本后才会生效。",
|
||||||
"repeater_txDelay": "洪水(德克萨斯州)延误",
|
"repeater_txDelay": "洪水(德克萨斯州)延误",
|
||||||
"repeater_txDelayHelper": "对于洪水流量,重新传输间隔应设置为包的传输时间(0-2,默认值为0.5)的倍数。 较高的值意味着更少的冲突,但传输速度会变慢。",
|
"repeater_txDelayHelper": "对于洪水流量,重新传输间隔应设置为包的传输时间(0-2,默认值为0.5)的倍数。 较高的值意味着更少的冲突,但传输速度会变慢。",
|
||||||
"repeater_directTxDelay": "直接的 TX 延迟",
|
"repeater_directTxDelay": "直接的 TX 延迟",
|
||||||
@@ -1377,43 +1310,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"telemetry_digitalInputLabel": "数字输入",
|
|
||||||
"telemetry_digitalOutputLabel": "数字输出",
|
|
||||||
"telemetry_analogInputLabel": "模拟输入",
|
|
||||||
"telemetry_analogOutputLabel": "模拟输出",
|
|
||||||
"telemetry_genericLabel": "通用传感器",
|
|
||||||
"telemetry_luminosityLabel": "照度",
|
|
||||||
"telemetry_presenceLabel": "存在检测",
|
|
||||||
"telemetry_humidityLabel": "湿度",
|
|
||||||
"telemetry_accelerometerLabel": "加速度计",
|
|
||||||
"telemetry_pressureLabel": "气压",
|
|
||||||
"telemetry_altitudeLabel": "高度",
|
|
||||||
"telemetry_frequencyLabel": "频率",
|
|
||||||
"telemetry_percentageLabel": "百分比",
|
|
||||||
"telemetry_concentrationLabel": "浓度",
|
|
||||||
"telemetry_powerLabel": "功率",
|
|
||||||
"telemetry_distanceLabel": "距离",
|
|
||||||
"telemetry_energyLabel": "能量",
|
|
||||||
"telemetry_directionLabel": "方向",
|
|
||||||
"telemetry_timeLabel": "时间",
|
|
||||||
"telemetry_gyrometerLabel": "陀螺仪",
|
|
||||||
"telemetry_colourLabel": "颜色",
|
|
||||||
"telemetry_gpsLabel": "GPS",
|
|
||||||
"telemetry_switchLabel": "开关",
|
|
||||||
"telemetry_polylineLabel": "折线",
|
|
||||||
"telemetry_altitudeValue": "{meters} m",
|
|
||||||
"telemetry_frequencyValue": "{hertz} Hz",
|
|
||||||
"telemetry_pressureValue": "{hpa} hPa",
|
|
||||||
"telemetry_luminosityValue": "{lux} lx",
|
|
||||||
"telemetry_powerValue": "{watts} W",
|
|
||||||
"telemetry_distanceValue": "{meters} m",
|
|
||||||
"telemetry_energyValue": "{kilowattHours} kWh",
|
|
||||||
"telemetry_directionValue": "{degrees}°",
|
|
||||||
"telemetry_concentrationValue": "{ppm} ppm",
|
|
||||||
"telemetry_percentageValue": "{percent}%",
|
|
||||||
"telemetry_analogValue": "{value}",
|
|
||||||
"telemetry_autoFetchQuantity": "请求次数",
|
|
||||||
"telemetry_error": "无法获取数据",
|
|
||||||
"telemetry_noData": "暂无遥测数据",
|
"telemetry_noData": "暂无遥测数据",
|
||||||
"telemetry_channelTitle": "频道 {channel}",
|
"telemetry_channelTitle": "频道 {channel}",
|
||||||
"@telemetry_channelTitle": {
|
"@telemetry_channelTitle": {
|
||||||
@@ -2209,9 +2105,6 @@
|
|||||||
"translation_composerTitle": "在发送之前进行翻译",
|
"translation_composerTitle": "在发送之前进行翻译",
|
||||||
"translation_enableTitle": "启用翻译功能",
|
"translation_enableTitle": "启用翻译功能",
|
||||||
"translation_composerSubtitle": "控制作曲家翻译图标的默认状态。",
|
"translation_composerSubtitle": "控制作曲家翻译图标的默认状态。",
|
||||||
"translation_autoIncomingTitle": "自动翻译消息",
|
|
||||||
"translation_autoIncomingSubtitle": "自动为通知以及聊天或频道翻译消息。",
|
|
||||||
"translation_translateMessage": "翻译消息",
|
|
||||||
"translation_targetLanguage": "目标语言",
|
"translation_targetLanguage": "目标语言",
|
||||||
"translation_useAppLanguage": "使用应用程序语言",
|
"translation_useAppLanguage": "使用应用程序语言",
|
||||||
"translation_downloadedModelLabel": "下载的模型",
|
"translation_downloadedModelLabel": "下载的模型",
|
||||||
@@ -2424,191 +2317,8 @@
|
|||||||
"chat_newMessages": "新的消息",
|
"chat_newMessages": "新的消息",
|
||||||
"settings_companionDebugLogSubtitle": "BLE/TCP/USB 协议、响应和原始数据",
|
"settings_companionDebugLogSubtitle": "BLE/TCP/USB 协议、响应和原始数据",
|
||||||
"repeater_chanUtil": "频道利用率",
|
"repeater_chanUtil": "频道利用率",
|
||||||
"@routing_lastWorked": {
|
"dialog_connectCompanion": "连接伴机以访问中继器和房间服务器功能。",
|
||||||
"placeholders": {
|
"dialog_disconnectedTitle": "已断开连接",
|
||||||
"when": {
|
"dialog_disconnectedMessage": "你已与你的伙伴断开连接。",
|
||||||
"type": "String"
|
"contact_connectCompanion": "连接至伴侣设备以访问中继器和房间服务器功能。"
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@routing_deliveryCounts": {
|
|
||||||
"placeholders": {
|
|
||||||
"successes": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"failures": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_hopCounter": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathEditor_invalidTokens": {
|
|
||||||
"placeholders": {
|
|
||||||
"tokens": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@channels_communityShortId": {
|
|
||||||
"placeholders": {
|
|
||||||
"id": {
|
|
||||||
"type": "String"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"messageStatus_sent": "发送",
|
|
||||||
"common_undo": "撤销",
|
|
||||||
"messageStatus_delivered": "已送达",
|
|
||||||
"messageStatus_pending": "发送",
|
|
||||||
"messageStatus_failed": "发送失败",
|
|
||||||
"messageStatus_repeated": "多次听到",
|
|
||||||
"contacts_moreOptions": "更多选择",
|
|
||||||
"contacts_searchOpen": "搜索联系人",
|
|
||||||
"contacts_searchClose": "高级搜索",
|
|
||||||
"routing_title": "路由",
|
|
||||||
"routing_modeAuto": "汽车",
|
|
||||||
"routing_modeFlood": "洪水",
|
|
||||||
"routing_modeManual": "手册",
|
|
||||||
"routing_modeAutoHint": "自动选择已知最佳路径,当没有已知路径时,则进行“洪水”搜索。",
|
|
||||||
"routing_modeFloodHint": "通过所有中继站进行广播。 这种方式最可靠,但占用更多的时间。",
|
|
||||||
"routing_modeManualHint": "总是按照您设置的路径进行导航。",
|
|
||||||
"routing_currentRoute": "当前路线",
|
|
||||||
"routing_directNoHops": "直接连接— 无中继跳",
|
|
||||||
"routing_noPathYet": "目前还没有找到路径。直到找到路径,才会收到后续消息。",
|
|
||||||
"routing_floodBroadcast": "通过所有中继器进行广播",
|
|
||||||
"routing_editPath": "编辑路径",
|
|
||||||
"routing_forgetPath": "忘记原路",
|
|
||||||
"routing_knownPaths": "已知的路径",
|
|
||||||
"routing_knownPathsHint": "点击该路径以切换到它。",
|
|
||||||
"routing_inUse": "使用中",
|
|
||||||
"routing_qualityStrong": "强劲的初始阶段",
|
|
||||||
"routing_qualityGood": "不错的开端",
|
|
||||||
"routing_qualityFair": "第一次尝试,结果良好",
|
|
||||||
"routing_qualityWorked": "已完成",
|
|
||||||
"routing_qualityFlood": "通过新闻报道",
|
|
||||||
"routing_qualityUntested": "未经测试",
|
|
||||||
"routing_lastWorked": "工作于 {when}",
|
|
||||||
"routing_neverWorked": "从未得到证实",
|
|
||||||
"routing_floodDelivery": "洪水配送",
|
|
||||||
"pathEditor_title": "构建路径",
|
|
||||||
"pathEditor_noHops": "目前还没有添加任何啤酒花。点击下面的“添加”按钮,按顺序添加,或者直接保存,不添加任何啤酒花。",
|
|
||||||
"pathEditor_addHops": "按照顺序添加啤酒花",
|
|
||||||
"pathEditor_searchRepeaters": "重复搜索",
|
|
||||||
"pathEditor_advancedHex": "高级:原始十六进制路径",
|
|
||||||
"pathEditor_hexLabel": "十六进制前缀",
|
|
||||||
"pathEditor_hexHelper": "每次跳跃,使用两个十六进制字符,用逗号分隔。",
|
|
||||||
"pathEditor_invalidTokens": "无效:{tokens}",
|
|
||||||
"pathEditor_tooManyHops": "最多 64 个跳跃",
|
|
||||||
"pathEditor_usePath": "请使用此路径",
|
|
||||||
"pathEditor_removeHop": "去除啤酒花",
|
|
||||||
"routing_deliveryCounts": "{successes} delivered, {failures} failed",
|
|
||||||
"pathEditor_hopCounter": "{count} of 64 hops",
|
|
||||||
"pathEditor_unknownHop": "未知的重复器",
|
|
||||||
"map_zoomIn": "放大",
|
|
||||||
"map_zoomOut": "放大",
|
|
||||||
"map_centerMap": "中心地图",
|
|
||||||
"chrome_bluetoothRequiresChromium": "Web Bluetooth 需要 Chromium 浏览器",
|
|
||||||
"channels_communityShortId": "ID:{id}...",
|
|
||||||
"pathTrace_legendGpsConfirmed": "通过GPS确认",
|
|
||||||
"pathTrace_legendInferred": "推测的位置",
|
|
||||||
"@pathMap_hopOf": {
|
|
||||||
"placeholders": {
|
|
||||||
"current": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_observedPaths": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_alternate": {
|
|
||||||
"placeholders": {
|
|
||||||
"index": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_hopCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_gpsCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"confirmed": {
|
|
||||||
"type": "int"
|
|
||||||
},
|
|
||||||
"total": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_sharedNodeCount": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@pathMap_partialAnimation": {
|
|
||||||
"placeholders": {
|
|
||||||
"count": {
|
|
||||||
"type": "int"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"map_online": "在线",
|
|
||||||
"scanner_bluetoothWebUnsupported": "浏览器不支持蓝牙,请改用 USB 连接。",
|
|
||||||
"map_activity": "活动",
|
|
||||||
"map_searchHint": "搜索节点名称或ID",
|
|
||||||
"map_recent": "最近",
|
|
||||||
"map_visible": "可见",
|
|
||||||
"map_stale": "过时",
|
|
||||||
"map_hidden": "已隐藏",
|
|
||||||
"map_centerOnNode": "以节点为中心",
|
|
||||||
"map_details": "详细信息",
|
|
||||||
"map_noGps": "无 GPS",
|
|
||||||
"map_noResults": "未找到匹配的节点",
|
|
||||||
"pathMap_viewSingle": "单条",
|
|
||||||
"pathMap_viewCombined": "综合",
|
|
||||||
"pathMap_play": "播放",
|
|
||||||
"pathMap_pause": "暂停",
|
|
||||||
"pathMap_replay": "重播",
|
|
||||||
"pathMap_stepBack": "上一跳",
|
|
||||||
"pathMap_stepForward": "下一跳",
|
|
||||||
"pathMap_animationOn": "显示数据包动画",
|
|
||||||
"pathMap_animationOff": "隐藏数据包动画",
|
|
||||||
"pathMap_hopOf": "第 {current} 跳,共 {total} 跳",
|
|
||||||
"pathMap_observedPaths": "观测到的路径:{count}",
|
|
||||||
"pathMap_primary": "主路径",
|
|
||||||
"pathMap_alternate": "备用 {index}",
|
|
||||||
"pathMap_hopCount": "{count, plural, =1{1 跳} other{{count} 跳}}",
|
|
||||||
"pathMap_legendShared": "共享路段",
|
|
||||||
"pathMap_legendEstimated": "估算路段",
|
|
||||||
"pathMap_sharedNodeCount": "已被 {count} 条路径使用",
|
|
||||||
"pathMap_showAllPaths": "显示全部",
|
|
||||||
"pathMap_hidePath": "隐藏路径",
|
|
||||||
"pathMap_showPath": "显示路径",
|
|
||||||
"pathMap_collapsePanel": "收起面板",
|
|
||||||
"pathMap_expandPanel": "展开面板",
|
|
||||||
"pathMap_noLocation": "无位置",
|
|
||||||
"pathMap_followPacket": "锁定视图跟随数据包",
|
|
||||||
"pathMap_unfollowPacket": "解锁视图跟随",
|
|
||||||
"pathMap_gpsCount": "{confirmed}/{total} GPS",
|
|
||||||
"pathMap_partialAnimation": "{count, plural, =1{1 跳无位置信息 — 显示的路径不完整} other{{count} 跳无位置信息 — 显示的路径不完整}}"
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import '../connector/meshcore_protocol.dart';
|
import '../connector/meshcore_protocol.dart';
|
||||||
import '../helpers/path_helper.dart';
|
|
||||||
import '../models/contact.dart';
|
import '../models/contact.dart';
|
||||||
import 'app_localizations.dart';
|
import 'app_localizations.dart';
|
||||||
|
|
||||||
@@ -24,30 +23,14 @@ extension ContactLocalization on Contact {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String pathLabel(
|
String pathLabel(AppLocalizations l10n) {
|
||||||
AppLocalizations l10n, {
|
|
||||||
int pathHashByteWidth = pathHashSize,
|
|
||||||
}) {
|
|
||||||
if (pathOverride != null) {
|
if (pathOverride != null) {
|
||||||
if (pathOverride! < 0) return l10n.chat_floodForced;
|
if (pathOverride! < 0) return l10n.chat_floodForced;
|
||||||
if (pathOverride == 0) return l10n.chat_directForced;
|
if (pathOverride == 0) return l10n.chat_directForced;
|
||||||
return l10n.chat_hopsForced(
|
return l10n.chat_hopsForced(pathOverride!);
|
||||||
_displayHopCount(pathOverrideBytes, pathOverride!, pathHashByteWidth),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (pathLength < 0) return l10n.channelPath_floodPath;
|
if (pathLength < 0) return l10n.channelPath_floodPath;
|
||||||
if (pathLength == 0) return l10n.chat_direct;
|
if (pathLength == 0) return l10n.chat_direct;
|
||||||
return l10n.chat_hopsCount(
|
return l10n.chat_hopsCount(pathLength);
|
||||||
_displayHopCount(path, pathLength, pathHashByteWidth),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
int _displayHopCount(
|
|
||||||
List<int>? pathBytes,
|
|
||||||
int storedHopCount,
|
|
||||||
int hashWidth,
|
|
||||||
) {
|
|
||||||
if (pathBytes == null || pathBytes.isEmpty) return storedHopCount;
|
|
||||||
return PathHelper.splitPathBytes(pathBytes, hashWidth).length;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,14 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_localizations/flutter_localizations.dart';
|
import 'package:flutter_localizations/flutter_localizations.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/services.dart';
|
|
||||||
import 'l10n/app_localizations.dart';
|
import 'l10n/app_localizations.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
|
||||||
import 'screens/chrome_required_screen.dart';
|
import 'screens/chrome_required_screen.dart';
|
||||||
|
import 'screens/contacts_screen.dart';
|
||||||
import 'utils/platform_info.dart';
|
import 'utils/platform_info.dart';
|
||||||
|
|
||||||
import 'connector/meshcore_connector.dart';
|
import 'connector/meshcore_connector.dart';
|
||||||
import 'screens/scanner_screen.dart';
|
|
||||||
import 'services/storage_service.dart';
|
import 'services/storage_service.dart';
|
||||||
import 'services/message_retry_service.dart';
|
import 'services/message_retry_service.dart';
|
||||||
import 'services/path_history_service.dart';
|
import 'services/path_history_service.dart';
|
||||||
@@ -24,21 +23,11 @@ import 'services/translation_service.dart';
|
|||||||
import 'services/ui_view_state_service.dart';
|
import 'services/ui_view_state_service.dart';
|
||||||
import 'services/timeout_prediction_service.dart';
|
import 'services/timeout_prediction_service.dart';
|
||||||
import 'storage/prefs_manager.dart';
|
import 'storage/prefs_manager.dart';
|
||||||
import 'theme/mesh_theme.dart';
|
|
||||||
import 'utils/app_logger.dart';
|
import 'utils/app_logger.dart';
|
||||||
|
|
||||||
void main() async {
|
void main() async {
|
||||||
WidgetsFlutterBinding.ensureInitialized();
|
WidgetsFlutterBinding.ensureInitialized();
|
||||||
|
|
||||||
// On desktop, debugPrint is not suppressed in release builds and every
|
|
||||||
// call is a synchronous stdout write. The connector logs heavily on hot
|
|
||||||
// paths (frame handling, queue/channel sync), which shows up as syscall
|
|
||||||
// overhead on low-end Linux machines (issue #202). The in-app debug log
|
|
||||||
// screens are unaffected — they store entries themselves.
|
|
||||||
if (kReleaseMode) {
|
|
||||||
debugPrint = (String? message, {int? wrapWidth}) {};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize SharedPreferences cache
|
// Initialize SharedPreferences cache
|
||||||
await PrefsManager.initialize();
|
await PrefsManager.initialize();
|
||||||
|
|
||||||
@@ -51,9 +40,7 @@ void main() async {
|
|||||||
final bleDebugLogService = BleDebugLogService();
|
final bleDebugLogService = BleDebugLogService();
|
||||||
final appDebugLogService = AppDebugLogService();
|
final appDebugLogService = AppDebugLogService();
|
||||||
final backgroundService = BackgroundService();
|
final backgroundService = BackgroundService();
|
||||||
final mapTileCacheService = MapTileCacheService(
|
final mapTileCacheService = MapTileCacheService();
|
||||||
appSettingsService: appSettingsService,
|
|
||||||
);
|
|
||||||
final chatTextScaleService = ChatTextScaleService();
|
final chatTextScaleService = ChatTextScaleService();
|
||||||
final translationService = TranslationService(appSettingsService);
|
final translationService = TranslationService(appSettingsService);
|
||||||
final uiViewStateService = UiViewStateService();
|
final uiViewStateService = UiViewStateService();
|
||||||
@@ -94,13 +81,8 @@ void main() async {
|
|||||||
timeoutPredictionService: timeoutPredictionService,
|
timeoutPredictionService: timeoutPredictionService,
|
||||||
);
|
);
|
||||||
|
|
||||||
await connector.loadContactCache();
|
await connector.restoreLastCompanionScope();
|
||||||
await connector.loadChannelSettings();
|
await connector.loadAllCachedDataForCurrentCompanion();
|
||||||
await connector.loadCachedChannels();
|
|
||||||
|
|
||||||
// Load persisted channel messages
|
|
||||||
await connector.loadAllChannelMessages();
|
|
||||||
await connector.loadUnreadState();
|
|
||||||
|
|
||||||
runApp(
|
runApp(
|
||||||
MeshCoreApp(
|
MeshCoreApp(
|
||||||
@@ -185,7 +167,7 @@ class MeshCoreApp extends StatelessWidget {
|
|||||||
ChangeNotifierProvider.value(value: translationService),
|
ChangeNotifierProvider.value(value: translationService),
|
||||||
ChangeNotifierProvider.value(value: uiViewStateService),
|
ChangeNotifierProvider.value(value: uiViewStateService),
|
||||||
Provider.value(value: storage),
|
Provider.value(value: storage),
|
||||||
ChangeNotifierProvider.value(value: mapTileCacheService),
|
Provider.value(value: mapTileCacheService),
|
||||||
ChangeNotifierProvider.value(value: timeoutPredictionService),
|
ChangeNotifierProvider.value(value: timeoutPredictionService),
|
||||||
],
|
],
|
||||||
child: Consumer<AppSettingsService>(
|
child: Consumer<AppSettingsService>(
|
||||||
@@ -203,8 +185,23 @@ class MeshCoreApp extends StatelessWidget {
|
|||||||
locale: _localeFromSetting(
|
locale: _localeFromSetting(
|
||||||
settingsService.settings.languageOverride,
|
settingsService.settings.languageOverride,
|
||||||
),
|
),
|
||||||
theme: MeshTheme.light(),
|
theme: ThemeData(
|
||||||
darkTheme: MeshTheme.dark(),
|
colorScheme: ColorScheme.fromSeed(seedColor: Colors.blue),
|
||||||
|
useMaterial3: true,
|
||||||
|
snackBarTheme: const SnackBarThemeData(
|
||||||
|
behavior: SnackBarBehavior.floating,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
darkTheme: ThemeData(
|
||||||
|
colorScheme: ColorScheme.fromSeed(
|
||||||
|
seedColor: Colors.blue,
|
||||||
|
brightness: Brightness.dark,
|
||||||
|
),
|
||||||
|
useMaterial3: true,
|
||||||
|
snackBarTheme: const SnackBarThemeData(
|
||||||
|
behavior: SnackBarBehavior.floating,
|
||||||
|
),
|
||||||
|
),
|
||||||
themeMode: _themeModeFromSetting(
|
themeMode: _themeModeFromSetting(
|
||||||
settingsService.settings.themeMode,
|
settingsService.settings.themeMode,
|
||||||
),
|
),
|
||||||
@@ -212,14 +209,11 @@ class MeshCoreApp extends StatelessWidget {
|
|||||||
// Update notification service with resolved locale
|
// Update notification service with resolved locale
|
||||||
final locale = Localizations.localeOf(context);
|
final locale = Localizations.localeOf(context);
|
||||||
NotificationService().setLocale(locale);
|
NotificationService().setLocale(locale);
|
||||||
return AnnotatedRegion<SystemUiOverlayStyle>(
|
return child ?? const SizedBox.shrink();
|
||||||
value: _systemUiOverlayStyle(context),
|
|
||||||
child: child ?? const SizedBox.shrink(),
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
home: (PlatformInfo.isWeb && !PlatformInfo.isChrome)
|
home: (PlatformInfo.isWeb && !PlatformInfo.isChrome)
|
||||||
? const ChromeRequiredScreen()
|
? const ChromeRequiredScreen()
|
||||||
: const ScannerScreen(),
|
: const ContactsScreen(),
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
@@ -237,24 +231,6 @@ class MeshCoreApp extends StatelessWidget {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SystemUiOverlayStyle _systemUiOverlayStyle(BuildContext context) {
|
|
||||||
final theme = Theme.of(context);
|
|
||||||
final colorScheme = theme.colorScheme;
|
|
||||||
final isDark = theme.brightness == Brightness.dark;
|
|
||||||
final iconBrightness = isDark ? Brightness.light : Brightness.dark;
|
|
||||||
|
|
||||||
// Keep Android system bars aligned with the resolved Flutter theme.
|
|
||||||
return SystemUiOverlayStyle(
|
|
||||||
statusBarColor: Colors.transparent,
|
|
||||||
statusBarIconBrightness: iconBrightness,
|
|
||||||
statusBarBrightness: isDark ? Brightness.dark : Brightness.light,
|
|
||||||
systemNavigationBarColor: colorScheme.surface,
|
|
||||||
systemNavigationBarIconBrightness: iconBrightness,
|
|
||||||
systemNavigationBarDividerColor: colorScheme.surface,
|
|
||||||
systemNavigationBarContrastEnforced: false,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
Locale? _localeFromSetting(String? languageCode) {
|
Locale? _localeFromSetting(String? languageCode) {
|
||||||
if (languageCode == null) return null;
|
if (languageCode == null) return null;
|
||||||
return Locale(languageCode);
|
return Locale(languageCode);
|
||||||
|
|||||||
@@ -76,8 +76,6 @@ class Cyr2LatProfile {
|
|||||||
|
|
||||||
class AppSettings {
|
class AppSettings {
|
||||||
static const Object _unset = Object();
|
static const Object _unset = Object();
|
||||||
static const String stadiaDemo =
|
|
||||||
'51bd0381-4685-4666-bae8-48940f6d77c0';
|
|
||||||
|
|
||||||
final bool clearPathOnMaxRetry;
|
final bool clearPathOnMaxRetry;
|
||||||
final bool mapShowRepeaters;
|
final bool mapShowRepeaters;
|
||||||
@@ -93,15 +91,10 @@ class AppSettings {
|
|||||||
final Map<String, double>? mapCacheBounds;
|
final Map<String, double>? mapCacheBounds;
|
||||||
final int mapCacheMinZoom;
|
final int mapCacheMinZoom;
|
||||||
final int mapCacheMaxZoom;
|
final int mapCacheMaxZoom;
|
||||||
final String mapRasterSourceId;
|
|
||||||
final String mapTileEndpointId;
|
|
||||||
final String? mapTileApiKey;
|
|
||||||
final bool notificationsEnabled;
|
final bool notificationsEnabled;
|
||||||
final bool notifyOnNewMessage;
|
final bool notifyOnNewMessage;
|
||||||
final bool notifyOnNewChannelMessage;
|
final bool notifyOnNewChannelMessage;
|
||||||
final bool notifyOnNewAdvert;
|
final bool notifyOnNewAdvert;
|
||||||
final bool autoSendZeroHopAdvertOnGpsUpdate;
|
|
||||||
final int gpsIntervalSeconds;
|
|
||||||
final bool autoRouteRotationEnabled;
|
final bool autoRouteRotationEnabled;
|
||||||
final double maxRouteWeight;
|
final double maxRouteWeight;
|
||||||
final double initialRouteWeight;
|
final double initialRouteWeight;
|
||||||
@@ -120,7 +113,6 @@ class AppSettings {
|
|||||||
final int tcpServerPort;
|
final int tcpServerPort;
|
||||||
final bool jumpToOldestUnread;
|
final bool jumpToOldestUnread;
|
||||||
final bool translationEnabled;
|
final bool translationEnabled;
|
||||||
final bool autoTranslateIncomingMessages;
|
|
||||||
final String? translationTargetLanguageCode;
|
final String? translationTargetLanguageCode;
|
||||||
final bool composerTranslationEnabled;
|
final bool composerTranslationEnabled;
|
||||||
final String? translationModelSourceUrl;
|
final String? translationModelSourceUrl;
|
||||||
@@ -129,17 +121,6 @@ class AppSettings {
|
|||||||
final List<Cyr2LatProfile> cyr2latProfiles;
|
final List<Cyr2LatProfile> cyr2latProfiles;
|
||||||
final String selectedCyr2latProfileId;
|
final String selectedCyr2latProfileId;
|
||||||
|
|
||||||
String get effectiveMapTileApiKey {
|
|
||||||
final apiKey = mapTileApiKey?.trim();
|
|
||||||
if (apiKey == null || apiKey.isEmpty) {
|
|
||||||
return stadiaDemo;
|
|
||||||
}
|
|
||||||
return apiKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool get usesstadiaDemo =>
|
|
||||||
effectiveMapTileApiKey == stadiaDemo;
|
|
||||||
|
|
||||||
Map<String, String> get cyr2latCharMap {
|
Map<String, String> get cyr2latCharMap {
|
||||||
final profile = cyr2latProfiles.firstWhere(
|
final profile = cyr2latProfiles.firstWhere(
|
||||||
(p) => p.id == selectedCyr2latProfileId,
|
(p) => p.id == selectedCyr2latProfileId,
|
||||||
@@ -159,20 +140,15 @@ class AppSettings {
|
|||||||
this.mapKeyPrefix = '',
|
this.mapKeyPrefix = '',
|
||||||
this.mapShowMarkers = true,
|
this.mapShowMarkers = true,
|
||||||
this.mapShowGuessedLocations = true,
|
this.mapShowGuessedLocations = true,
|
||||||
this.enableMessageTracing = true,
|
this.enableMessageTracing = false,
|
||||||
this.mapCacheBounds,
|
this.mapCacheBounds,
|
||||||
this.mapCacheMinZoom = 10,
|
this.mapCacheMinZoom = 10,
|
||||||
this.mapCacheMaxZoom = 15,
|
this.mapCacheMaxZoom = 15,
|
||||||
this.mapRasterSourceId = 'osm_auto',
|
|
||||||
this.mapTileEndpointId = 'standard_2x',
|
|
||||||
this.mapTileApiKey,
|
|
||||||
this.notificationsEnabled = true,
|
this.notificationsEnabled = true,
|
||||||
this.notifyOnNewMessage = true,
|
this.notifyOnNewMessage = true,
|
||||||
this.notifyOnNewChannelMessage = true,
|
this.notifyOnNewChannelMessage = true,
|
||||||
this.notifyOnNewAdvert = true,
|
this.notifyOnNewAdvert = true,
|
||||||
this.autoSendZeroHopAdvertOnGpsUpdate = false,
|
this.autoRouteRotationEnabled = false,
|
||||||
this.gpsIntervalSeconds = 900,
|
|
||||||
this.autoRouteRotationEnabled = true,
|
|
||||||
this.maxRouteWeight = 5.0,
|
this.maxRouteWeight = 5.0,
|
||||||
this.initialRouteWeight = 3.0,
|
this.initialRouteWeight = 3.0,
|
||||||
this.routeWeightSuccessIncrement = 0.5,
|
this.routeWeightSuccessIncrement = 0.5,
|
||||||
@@ -190,7 +166,6 @@ class AppSettings {
|
|||||||
this.tcpServerPort = 0,
|
this.tcpServerPort = 0,
|
||||||
this.jumpToOldestUnread = false,
|
this.jumpToOldestUnread = false,
|
||||||
this.translationEnabled = false,
|
this.translationEnabled = false,
|
||||||
this.autoTranslateIncomingMessages = true,
|
|
||||||
this.translationTargetLanguageCode,
|
this.translationTargetLanguageCode,
|
||||||
this.composerTranslationEnabled = false,
|
this.composerTranslationEnabled = false,
|
||||||
this.translationModelSourceUrl,
|
this.translationModelSourceUrl,
|
||||||
@@ -229,16 +204,10 @@ class AppSettings {
|
|||||||
'map_cache_bounds': mapCacheBounds,
|
'map_cache_bounds': mapCacheBounds,
|
||||||
'map_cache_min_zoom': mapCacheMinZoom,
|
'map_cache_min_zoom': mapCacheMinZoom,
|
||||||
'map_cache_max_zoom': mapCacheMaxZoom,
|
'map_cache_max_zoom': mapCacheMaxZoom,
|
||||||
'map_raster_source_id': mapRasterSourceId,
|
|
||||||
'map_tile_endpoint_id': mapTileEndpointId,
|
|
||||||
'map_tile_api_key': mapTileApiKey,
|
|
||||||
'notifications_enabled': notificationsEnabled,
|
'notifications_enabled': notificationsEnabled,
|
||||||
'notify_on_new_message': notifyOnNewMessage,
|
'notify_on_new_message': notifyOnNewMessage,
|
||||||
'notify_on_new_channel_message': notifyOnNewChannelMessage,
|
'notify_on_new_channel_message': notifyOnNewChannelMessage,
|
||||||
'notify_on_new_advert': notifyOnNewAdvert,
|
'notify_on_new_advert': notifyOnNewAdvert,
|
||||||
'auto_send_zero_hop_advert_on_gps_update':
|
|
||||||
autoSendZeroHopAdvertOnGpsUpdate,
|
|
||||||
'gps_interval_seconds': gpsIntervalSeconds,
|
|
||||||
'auto_route_rotation_enabled': autoRouteRotationEnabled,
|
'auto_route_rotation_enabled': autoRouteRotationEnabled,
|
||||||
'max_route_weight': maxRouteWeight,
|
'max_route_weight': maxRouteWeight,
|
||||||
'initial_route_weight': initialRouteWeight,
|
'initial_route_weight': initialRouteWeight,
|
||||||
@@ -257,7 +226,6 @@ class AppSettings {
|
|||||||
'tcp_server_port': tcpServerPort,
|
'tcp_server_port': tcpServerPort,
|
||||||
'jump_to_oldest_unread': jumpToOldestUnread,
|
'jump_to_oldest_unread': jumpToOldestUnread,
|
||||||
'translation_enabled': translationEnabled,
|
'translation_enabled': translationEnabled,
|
||||||
'auto_translate_incoming_messages': autoTranslateIncomingMessages,
|
|
||||||
'translation_target_language_code': translationTargetLanguageCode,
|
'translation_target_language_code': translationTargetLanguageCode,
|
||||||
'composer_translation_enabled': composerTranslationEnabled,
|
'composer_translation_enabled': composerTranslationEnabled,
|
||||||
'translation_model_source_url': translationModelSourceUrl,
|
'translation_model_source_url': translationModelSourceUrl,
|
||||||
@@ -293,26 +261,19 @@ class AppSettings {
|
|||||||
mapShowMarkers: json['map_show_markers'] as bool? ?? true,
|
mapShowMarkers: json['map_show_markers'] as bool? ?? true,
|
||||||
mapShowGuessedLocations:
|
mapShowGuessedLocations:
|
||||||
json['map_show_guessed_locations'] as bool? ?? true,
|
json['map_show_guessed_locations'] as bool? ?? true,
|
||||||
enableMessageTracing: json['enable_message_tracing'] as bool? ?? true,
|
enableMessageTracing: json['enable_message_tracing'] as bool? ?? false,
|
||||||
mapCacheBounds: (json['map_cache_bounds'] as Map?)?.map(
|
mapCacheBounds: (json['map_cache_bounds'] as Map?)?.map(
|
||||||
(key, value) => MapEntry(key.toString(), (value as num).toDouble()),
|
(key, value) => MapEntry(key.toString(), (value as num).toDouble()),
|
||||||
),
|
),
|
||||||
mapCacheMinZoom: json['map_cache_min_zoom'] as int? ?? 10,
|
mapCacheMinZoom: json['map_cache_min_zoom'] as int? ?? 10,
|
||||||
mapCacheMaxZoom: json['map_cache_max_zoom'] as int? ?? 15,
|
mapCacheMaxZoom: json['map_cache_max_zoom'] as int? ?? 15,
|
||||||
mapRasterSourceId: json['map_raster_source_id'] as String? ?? 'osm_auto',
|
|
||||||
mapTileEndpointId: json['map_tile_endpoint_id'] as String? ?? 'standard',
|
|
||||||
mapTileApiKey: json['map_tile_api_key'] as String?,
|
|
||||||
notificationsEnabled: json['notifications_enabled'] as bool? ?? true,
|
notificationsEnabled: json['notifications_enabled'] as bool? ?? true,
|
||||||
notifyOnNewMessage: json['notify_on_new_message'] as bool? ?? true,
|
notifyOnNewMessage: json['notify_on_new_message'] as bool? ?? true,
|
||||||
notifyOnNewChannelMessage:
|
notifyOnNewChannelMessage:
|
||||||
json['notify_on_new_channel_message'] as bool? ?? true,
|
json['notify_on_new_channel_message'] as bool? ?? true,
|
||||||
notifyOnNewAdvert: json['notify_on_new_advert'] as bool? ?? true,
|
notifyOnNewAdvert: json['notify_on_new_advert'] as bool? ?? true,
|
||||||
autoSendZeroHopAdvertOnGpsUpdate:
|
|
||||||
json['auto_send_zero_hop_advert_on_gps_update'] as bool? ?? false,
|
|
||||||
gpsIntervalSeconds:
|
|
||||||
(json['gps_interval_seconds'] as num?)?.toInt() ?? 900,
|
|
||||||
autoRouteRotationEnabled:
|
autoRouteRotationEnabled:
|
||||||
json['auto_route_rotation_enabled'] as bool? ?? true,
|
json['auto_route_rotation_enabled'] as bool? ?? false,
|
||||||
maxRouteWeight: (json['max_route_weight'] as num?)?.toDouble() ?? 5.0,
|
maxRouteWeight: (json['max_route_weight'] as num?)?.toDouble() ?? 5.0,
|
||||||
initialRouteWeight:
|
initialRouteWeight:
|
||||||
(json['initial_route_weight'] as num?)?.toDouble() ?? 3.0,
|
(json['initial_route_weight'] as num?)?.toDouble() ?? 3.0,
|
||||||
@@ -346,8 +307,6 @@ class AppSettings {
|
|||||||
tcpServerPort: json['tcp_server_port'] as int? ?? 0,
|
tcpServerPort: json['tcp_server_port'] as int? ?? 0,
|
||||||
jumpToOldestUnread: json['jump_to_oldest_unread'] as bool? ?? false,
|
jumpToOldestUnread: json['jump_to_oldest_unread'] as bool? ?? false,
|
||||||
translationEnabled: json['translation_enabled'] as bool? ?? false,
|
translationEnabled: json['translation_enabled'] as bool? ?? false,
|
||||||
autoTranslateIncomingMessages:
|
|
||||||
json['auto_translate_incoming_messages'] as bool? ?? true,
|
|
||||||
translationTargetLanguageCode:
|
translationTargetLanguageCode:
|
||||||
json['translation_target_language_code'] as String?,
|
json['translation_target_language_code'] as String?,
|
||||||
composerTranslationEnabled:
|
composerTranslationEnabled:
|
||||||
@@ -415,15 +374,10 @@ class AppSettings {
|
|||||||
Object? mapCacheBounds = _unset,
|
Object? mapCacheBounds = _unset,
|
||||||
int? mapCacheMinZoom,
|
int? mapCacheMinZoom,
|
||||||
int? mapCacheMaxZoom,
|
int? mapCacheMaxZoom,
|
||||||
String? mapRasterSourceId,
|
|
||||||
String? mapTileEndpointId,
|
|
||||||
Object? mapTileApiKey = _unset,
|
|
||||||
bool? notificationsEnabled,
|
bool? notificationsEnabled,
|
||||||
bool? notifyOnNewMessage,
|
bool? notifyOnNewMessage,
|
||||||
bool? notifyOnNewChannelMessage,
|
bool? notifyOnNewChannelMessage,
|
||||||
bool? notifyOnNewAdvert,
|
bool? notifyOnNewAdvert,
|
||||||
bool? autoSendZeroHopAdvertOnGpsUpdate,
|
|
||||||
int? gpsIntervalSeconds,
|
|
||||||
bool? autoRouteRotationEnabled,
|
bool? autoRouteRotationEnabled,
|
||||||
double? maxRouteWeight,
|
double? maxRouteWeight,
|
||||||
double? initialRouteWeight,
|
double? initialRouteWeight,
|
||||||
@@ -442,7 +396,6 @@ class AppSettings {
|
|||||||
int? tcpServerPort,
|
int? tcpServerPort,
|
||||||
bool? jumpToOldestUnread,
|
bool? jumpToOldestUnread,
|
||||||
bool? translationEnabled,
|
bool? translationEnabled,
|
||||||
bool? autoTranslateIncomingMessages,
|
|
||||||
Object? translationTargetLanguageCode = _unset,
|
Object? translationTargetLanguageCode = _unset,
|
||||||
bool? composerTranslationEnabled,
|
bool? composerTranslationEnabled,
|
||||||
Object? translationModelSourceUrl = _unset,
|
Object? translationModelSourceUrl = _unset,
|
||||||
@@ -469,20 +422,11 @@ class AppSettings {
|
|||||||
: mapCacheBounds as Map<String, double>?,
|
: mapCacheBounds as Map<String, double>?,
|
||||||
mapCacheMinZoom: mapCacheMinZoom ?? this.mapCacheMinZoom,
|
mapCacheMinZoom: mapCacheMinZoom ?? this.mapCacheMinZoom,
|
||||||
mapCacheMaxZoom: mapCacheMaxZoom ?? this.mapCacheMaxZoom,
|
mapCacheMaxZoom: mapCacheMaxZoom ?? this.mapCacheMaxZoom,
|
||||||
mapRasterSourceId: mapRasterSourceId ?? this.mapRasterSourceId,
|
|
||||||
mapTileEndpointId: mapTileEndpointId ?? this.mapTileEndpointId,
|
|
||||||
mapTileApiKey: mapTileApiKey == _unset
|
|
||||||
? this.mapTileApiKey
|
|
||||||
: mapTileApiKey as String?,
|
|
||||||
notificationsEnabled: notificationsEnabled ?? this.notificationsEnabled,
|
notificationsEnabled: notificationsEnabled ?? this.notificationsEnabled,
|
||||||
notifyOnNewMessage: notifyOnNewMessage ?? this.notifyOnNewMessage,
|
notifyOnNewMessage: notifyOnNewMessage ?? this.notifyOnNewMessage,
|
||||||
notifyOnNewChannelMessage:
|
notifyOnNewChannelMessage:
|
||||||
notifyOnNewChannelMessage ?? this.notifyOnNewChannelMessage,
|
notifyOnNewChannelMessage ?? this.notifyOnNewChannelMessage,
|
||||||
notifyOnNewAdvert: notifyOnNewAdvert ?? this.notifyOnNewAdvert,
|
notifyOnNewAdvert: notifyOnNewAdvert ?? this.notifyOnNewAdvert,
|
||||||
autoSendZeroHopAdvertOnGpsUpdate:
|
|
||||||
autoSendZeroHopAdvertOnGpsUpdate ??
|
|
||||||
this.autoSendZeroHopAdvertOnGpsUpdate,
|
|
||||||
gpsIntervalSeconds: gpsIntervalSeconds ?? this.gpsIntervalSeconds,
|
|
||||||
autoRouteRotationEnabled:
|
autoRouteRotationEnabled:
|
||||||
autoRouteRotationEnabled ?? this.autoRouteRotationEnabled,
|
autoRouteRotationEnabled ?? this.autoRouteRotationEnabled,
|
||||||
maxRouteWeight: maxRouteWeight ?? this.maxRouteWeight,
|
maxRouteWeight: maxRouteWeight ?? this.maxRouteWeight,
|
||||||
@@ -509,8 +453,6 @@ class AppSettings {
|
|||||||
tcpServerPort: tcpServerPort ?? this.tcpServerPort,
|
tcpServerPort: tcpServerPort ?? this.tcpServerPort,
|
||||||
jumpToOldestUnread: jumpToOldestUnread ?? this.jumpToOldestUnread,
|
jumpToOldestUnread: jumpToOldestUnread ?? this.jumpToOldestUnread,
|
||||||
translationEnabled: translationEnabled ?? this.translationEnabled,
|
translationEnabled: translationEnabled ?? this.translationEnabled,
|
||||||
autoTranslateIncomingMessages:
|
|
||||||
autoTranslateIncomingMessages ?? this.autoTranslateIncomingMessages,
|
|
||||||
translationTargetLanguageCode: translationTargetLanguageCode == _unset
|
translationTargetLanguageCode: translationTargetLanguageCode == _unset
|
||||||
? this.translationTargetLanguageCode
|
? this.translationTargetLanguageCode
|
||||||
: translationTargetLanguageCode as String?,
|
: translationTargetLanguageCode as String?,
|
||||||
|
|||||||
@@ -27,10 +27,6 @@ class Channel {
|
|||||||
|
|
||||||
bool get isPublicChannel => pskHex == publicChannelPsk;
|
bool get isPublicChannel => pskHex == publicChannelPsk;
|
||||||
|
|
||||||
bool get isHashtagChannel => name.startsWith('#');
|
|
||||||
|
|
||||||
bool get isPrivateChannel => !isPublicChannel && !isHashtagChannel;
|
|
||||||
|
|
||||||
static Channel? fromFrame(Uint8List frame) {
|
static Channel? fromFrame(Uint8List frame) {
|
||||||
// CHANNEL_INFO format:
|
// CHANNEL_INFO format:
|
||||||
// [0] = RESP_CODE_CHANNEL_INFO (18)
|
// [0] = RESP_CODE_CHANNEL_INFO (18)
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ class ChannelMessage {
|
|||||||
final List<Repeat> repeats;
|
final List<Repeat> repeats;
|
||||||
final int repeatCount;
|
final int repeatCount;
|
||||||
final int? pathLength;
|
final int? pathLength;
|
||||||
final int? pathHashWidth;
|
|
||||||
final Uint8List pathBytes;
|
final Uint8List pathBytes;
|
||||||
final List<Uint8List> pathVariants;
|
final List<Uint8List> pathVariants;
|
||||||
final int? channelIndex;
|
final int? channelIndex;
|
||||||
@@ -67,7 +66,6 @@ class ChannelMessage {
|
|||||||
this.repeats = const [],
|
this.repeats = const [],
|
||||||
this.repeatCount = 0,
|
this.repeatCount = 0,
|
||||||
this.pathLength,
|
this.pathLength,
|
||||||
this.pathHashWidth,
|
|
||||||
Uint8List? pathBytes,
|
Uint8List? pathBytes,
|
||||||
List<Uint8List>? pathVariants,
|
List<Uint8List>? pathVariants,
|
||||||
this.channelIndex,
|
this.channelIndex,
|
||||||
@@ -95,7 +93,6 @@ class ChannelMessage {
|
|||||||
List<Repeat>? repeats,
|
List<Repeat>? repeats,
|
||||||
int? repeatCount,
|
int? repeatCount,
|
||||||
int? pathLength,
|
int? pathLength,
|
||||||
int? pathHashWidth,
|
|
||||||
Uint8List? pathBytes,
|
Uint8List? pathBytes,
|
||||||
List<Uint8List>? pathVariants,
|
List<Uint8List>? pathVariants,
|
||||||
String? packetHash,
|
String? packetHash,
|
||||||
@@ -132,7 +129,6 @@ class ChannelMessage {
|
|||||||
repeats: repeats ?? this.repeats,
|
repeats: repeats ?? this.repeats,
|
||||||
repeatCount: repeatCount ?? this.repeatCount,
|
repeatCount: repeatCount ?? this.repeatCount,
|
||||||
pathLength: pathLength ?? this.pathLength,
|
pathLength: pathLength ?? this.pathLength,
|
||||||
pathHashWidth: pathHashWidth ?? this.pathHashWidth,
|
|
||||||
pathBytes: pathBytes ?? this.pathBytes,
|
pathBytes: pathBytes ?? this.pathBytes,
|
||||||
pathVariants: pathVariants ?? this.pathVariants,
|
pathVariants: pathVariants ?? this.pathVariants,
|
||||||
channelIndex: channelIndex,
|
channelIndex: channelIndex,
|
||||||
@@ -159,7 +155,6 @@ class ChannelMessage {
|
|||||||
|
|
||||||
int pathLen;
|
int pathLen;
|
||||||
int txtType;
|
int txtType;
|
||||||
int? packetPathHashWidth;
|
|
||||||
Uint8List pathBytes = Uint8List(0);
|
Uint8List pathBytes = Uint8List(0);
|
||||||
int channelIdx;
|
int channelIdx;
|
||||||
if (code == respCodeChannelMsgRecvV3) {
|
if (code == respCodeChannelMsgRecvV3) {
|
||||||
@@ -168,18 +163,12 @@ class ChannelMessage {
|
|||||||
final hasPath = (flags & 0x01) != 0;
|
final hasPath = (flags & 0x01) != 0;
|
||||||
reader.skipBytes(1); // Skip reserved byte
|
reader.skipBytes(1); // Skip reserved byte
|
||||||
channelIdx = reader.readByte();
|
channelIdx = reader.readByte();
|
||||||
final pathByte = reader.readUInt8();
|
pathLen = reader.readInt8();
|
||||||
// pathByte packs: top 2 bits = hash width mode, low 6 bits = hop count
|
|
||||||
packetPathHashWidth = ((pathByte & 0xC0) >> 6) + 1;
|
|
||||||
final hopCount = pathByte & 0x3F;
|
|
||||||
pathLen = hopCount;
|
|
||||||
// If a path is present, read hopCount * width bytes
|
|
||||||
if (hasPath && hopCount > 0) {
|
|
||||||
final totalPathBytes = hopCount * packetPathHashWidth;
|
|
||||||
pathBytes = reader.readBytes(totalPathBytes);
|
|
||||||
}
|
|
||||||
// After consuming optional path bytes, read the text type byte.
|
|
||||||
txtType = reader.readByte();
|
txtType = reader.readByte();
|
||||||
|
if (hasPath && pathLen > 0) {
|
||||||
|
reader.rewind(); // Rewind to read path length again for pathBytes
|
||||||
|
pathBytes = reader.readBytes(pathLen);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
channelIdx = reader.readByte();
|
channelIdx = reader.readByte();
|
||||||
pathLen = reader.readInt8();
|
pathLen = reader.readInt8();
|
||||||
@@ -220,7 +209,6 @@ class ChannelMessage {
|
|||||||
isOutgoing: false,
|
isOutgoing: false,
|
||||||
status: ChannelMessageStatus.sent,
|
status: ChannelMessageStatus.sent,
|
||||||
pathLength: pathLen,
|
pathLength: pathLen,
|
||||||
pathHashWidth: packetPathHashWidth,
|
|
||||||
pathBytes: pathBytes,
|
pathBytes: pathBytes,
|
||||||
channelIndex: channelIdx,
|
channelIndex: channelIdx,
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
|
import 'dart:math';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
|
||||||
import 'package:crypto/crypto.dart' as crypto;
|
import 'package:crypto/crypto.dart' as crypto;
|
||||||
import 'package:meshcore_open/utils/keys.dart';
|
|
||||||
|
|
||||||
import 'channel.dart';
|
import 'channel.dart';
|
||||||
|
|
||||||
@@ -37,7 +37,11 @@ class Community {
|
|||||||
|
|
||||||
/// Generate a new community with a random 32-byte secret
|
/// Generate a new community with a random 32-byte secret
|
||||||
factory Community.create({required String id, required String name}) {
|
factory Community.create({required String id, required String name}) {
|
||||||
final secret = randomBytes(32);
|
final random = Random.secure();
|
||||||
|
final secret = Uint8List(32);
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
secret[i] = random.nextInt(256);
|
||||||
|
}
|
||||||
return Community(
|
return Community(
|
||||||
id: id,
|
id: id,
|
||||||
name: name,
|
name: name,
|
||||||
@@ -206,7 +210,12 @@ class Community {
|
|||||||
|
|
||||||
/// Create a copy of this community with a regenerated random secret
|
/// Create a copy of this community with a regenerated random secret
|
||||||
Community withRegeneratedSecret() {
|
Community withRegeneratedSecret() {
|
||||||
return withNewSecret(randomBytes(32));
|
final random = Random.secure();
|
||||||
|
final newSecret = Uint8List(32);
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
newSecret[i] = random.nextInt(256);
|
||||||
|
}
|
||||||
|
return withNewSecret(newSecret);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Extract secret from QR data (for updating existing community)
|
/// Extract secret from QR data (for updating existing community)
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ class Contact {
|
|||||||
String pathFormattedIdList(int hashByteWidth) {
|
String pathFormattedIdList(int hashByteWidth) {
|
||||||
final pathBytes = pathBytesForDisplay;
|
final pathBytes = pathBytesForDisplay;
|
||||||
if (pathBytes.isEmpty) return '';
|
if (pathBytes.isEmpty) return '';
|
||||||
final w = hashByteWidth.clamp(1, 4);
|
final w = hashByteWidth.clamp(1, 8);
|
||||||
final parts = <String>[];
|
final parts = <String>[];
|
||||||
for (int i = 0; i < pathBytes.length; i += w) {
|
for (int i = 0; i < pathBytes.length; i += w) {
|
||||||
final end = (i + w) <= pathBytes.length ? (i + w) : pathBytes.length;
|
final end = (i + w) <= pathBytes.length ? (i + w) : pathBytes.length;
|
||||||
@@ -166,18 +166,8 @@ class Contact {
|
|||||||
final type = reader.readByte();
|
final type = reader.readByte();
|
||||||
final flags = reader.readByte();
|
final flags = reader.readByte();
|
||||||
final pathLen = reader.readByte();
|
final pathLen = reader.readByte();
|
||||||
int hopCount = 0;
|
final safePathLen = pathLen > 0
|
||||||
int byteLen = 0;
|
? (pathLen > maxPathSize ? maxPathSize : pathLen)
|
||||||
if (pathLen == 0xFF) {
|
|
||||||
hopCount = -1;
|
|
||||||
} else {
|
|
||||||
final mode = (pathLen & 0xC0) >> 6;
|
|
||||||
hopCount = pathLen & 0x3F;
|
|
||||||
final width = mode + 1;
|
|
||||||
byteLen = hopCount * width;
|
|
||||||
}
|
|
||||||
final safePathLen = byteLen > 0
|
|
||||||
? (byteLen > maxPathSize ? maxPathSize : byteLen)
|
|
||||||
: 0;
|
: 0;
|
||||||
final pathBytes = reader.readBytes(maxPathSize).sublist(0, safePathLen);
|
final pathBytes = reader.readBytes(maxPathSize).sublist(0, safePathLen);
|
||||||
final name = reader.readCStringGreedy(maxNameSize);
|
final name = reader.readCStringGreedy(maxNameSize);
|
||||||
@@ -223,7 +213,7 @@ class Contact {
|
|||||||
name: name.isEmpty ? 'Unknown' : name,
|
name: name.isEmpty ? 'Unknown' : name,
|
||||||
type: type,
|
type: type,
|
||||||
flags: flags,
|
flags: flags,
|
||||||
pathLength: hopCount,
|
pathLength: (pathLen == 0xFF || pathLen > maxPathSize) ? -1 : pathLen,
|
||||||
path: pathBytes,
|
path: pathBytes,
|
||||||
latitude: lat,
|
latitude: lat,
|
||||||
longitude: lon,
|
longitude: lon,
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
import 'dart:typed_data';
|
|
||||||
import 'dart:ui';
|
|
||||||
|
|
||||||
import 'package:latlong2/latlong.dart';
|
|
||||||
|
|
||||||
import 'path_history.dart';
|
|
||||||
|
|
||||||
/// One observed route rendered on the path map — the live traced path
|
|
||||||
/// (primary) or an alternate from the contact's path history — resolved to
|
|
||||||
/// map coordinates with per-hop confidence flags.
|
|
||||||
class DisplayPath {
|
|
||||||
final String id;
|
|
||||||
final String label;
|
|
||||||
final Color color;
|
|
||||||
final bool isPrimary;
|
|
||||||
|
|
||||||
/// Outbound hop prefixes, including hops that could not be placed on the map.
|
|
||||||
final List<Uint8List> hopBytes;
|
|
||||||
|
|
||||||
/// Resolved map points: self, each locatable hop, then the target when its
|
|
||||||
/// position is known. Hops with no position are skipped here but still
|
|
||||||
/// counted in [unresolvedHops].
|
|
||||||
final List<LatLng> points;
|
|
||||||
|
|
||||||
/// Display name for each entry of [points].
|
|
||||||
final List<String> pointLabels;
|
|
||||||
|
|
||||||
/// Whether each entry of [points] is a GPS-grade position (vs inferred).
|
|
||||||
final List<bool> pointConfirmed;
|
|
||||||
|
|
||||||
/// Per segment (length points-1): true when either endpoint is inferred or
|
|
||||||
/// unlocatable hops were skipped in between — rendered dashed.
|
|
||||||
final List<bool> segmentEstimated;
|
|
||||||
|
|
||||||
/// Per segment: the transmission ordinal of the segment's destination,
|
|
||||||
/// used to highlight the matching hop-list row during animation.
|
|
||||||
final List<int> rowForSegment;
|
|
||||||
|
|
||||||
/// Total transmissions on the full route (including unlocatable hops).
|
|
||||||
final int totalTransmissions;
|
|
||||||
|
|
||||||
/// True when the route ends with a chat-target endpoint row.
|
|
||||||
final bool hasTargetEndpoint;
|
|
||||||
|
|
||||||
final int gpsConfirmedHops;
|
|
||||||
final int unresolvedHops;
|
|
||||||
final double distanceMeters;
|
|
||||||
|
|
||||||
/// History metadata; null for the live traced (primary) path.
|
|
||||||
final PathRecord? record;
|
|
||||||
|
|
||||||
const DisplayPath({
|
|
||||||
required this.id,
|
|
||||||
required this.label,
|
|
||||||
required this.color,
|
|
||||||
required this.isPrimary,
|
|
||||||
required this.hopBytes,
|
|
||||||
required this.points,
|
|
||||||
required this.pointLabels,
|
|
||||||
required this.pointConfirmed,
|
|
||||||
required this.segmentEstimated,
|
|
||||||
required this.rowForSegment,
|
|
||||||
required this.totalTransmissions,
|
|
||||||
required this.hasTargetEndpoint,
|
|
||||||
required this.gpsConfirmedHops,
|
|
||||||
required this.unresolvedHops,
|
|
||||||
required this.distanceMeters,
|
|
||||||
this.record,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -3,6 +3,7 @@ class PathRecord {
|
|||||||
final int tripTimeMs;
|
final int tripTimeMs;
|
||||||
final DateTime? timestamp;
|
final DateTime? timestamp;
|
||||||
final bool wasFloodDiscovery;
|
final bool wasFloodDiscovery;
|
||||||
|
final int byteCount;
|
||||||
final List<int> pathBytes;
|
final List<int> pathBytes;
|
||||||
final int successCount;
|
final int successCount;
|
||||||
final int failureCount;
|
final int failureCount;
|
||||||
@@ -17,6 +18,7 @@ class PathRecord {
|
|||||||
required this.successCount,
|
required this.successCount,
|
||||||
required this.failureCount,
|
required this.failureCount,
|
||||||
this.routeWeight = 1.0,
|
this.routeWeight = 1.0,
|
||||||
|
this.byteCount = 0,
|
||||||
});
|
});
|
||||||
|
|
||||||
String get displayText =>
|
String get displayText =>
|
||||||
@@ -48,6 +50,7 @@ class PathRecord {
|
|||||||
successCount: json['success_count'] as int? ?? 0,
|
successCount: json['success_count'] as int? ?? 0,
|
||||||
failureCount: json['failure_count'] as int? ?? 0,
|
failureCount: json['failure_count'] as int? ?? 0,
|
||||||
routeWeight: (json['route_weight'] as num?)?.toDouble() ?? 1.0,
|
routeWeight: (json['route_weight'] as num?)?.toDouble() ?? 1.0,
|
||||||
|
byteCount: json['byte_count'] as int? ?? 0,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,177 +0,0 @@
|
|||||||
import 'package:flutter/foundation.dart';
|
|
||||||
import 'package:flutter/scheduler.dart';
|
|
||||||
import 'package:latlong2/latlong.dart';
|
|
||||||
|
|
||||||
/// Timeline state for the packet-flow animation on the path map.
|
|
||||||
///
|
|
||||||
/// The packet travels each segment over [segmentMs] (scaled by [speed]),
|
|
||||||
/// then dwells at the reached hop for [dwellMs] so the hop visibly lights up.
|
|
||||||
/// Overlay layers listen to this controller directly; [activeSegment] only
|
|
||||||
/// fires when the segment index changes so list highlights rebuild cheaply.
|
|
||||||
class PathPlaybackController extends ChangeNotifier {
|
|
||||||
static const double segmentMs = 1100;
|
|
||||||
static const double dwellMs = 380;
|
|
||||||
static const List<double> speedSteps = [0.5, 1.0, 2.0];
|
|
||||||
|
|
||||||
late final Ticker _ticker;
|
|
||||||
List<LatLng> _points = const [];
|
|
||||||
double _timelineMs = 0;
|
|
||||||
Duration _lastTick = Duration.zero;
|
|
||||||
bool _playing = false;
|
|
||||||
bool _started = false;
|
|
||||||
double _speed = 1.0;
|
|
||||||
|
|
||||||
/// Segment currently being traveled (clamped to the last segment), or -1
|
|
||||||
/// while the animation has not been started — listeners use this for
|
|
||||||
/// hop-list highlighting without rebuilding every tick.
|
|
||||||
final ValueNotifier<int> activeSegment = ValueNotifier(-1);
|
|
||||||
|
|
||||||
PathPlaybackController(TickerProvider vsync) {
|
|
||||||
_ticker = vsync.createTicker(_onTick);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<LatLng> get points => _points;
|
|
||||||
bool get hasPath => _points.length >= 2;
|
|
||||||
int get segmentCount => hasPath ? _points.length - 1 : 0;
|
|
||||||
bool get playing => _playing;
|
|
||||||
double get speed => _speed;
|
|
||||||
|
|
||||||
/// True once the user has started or stepped the animation; the packet
|
|
||||||
/// overlay renders only in this state.
|
|
||||||
bool get started => _started;
|
|
||||||
|
|
||||||
double get _slotMs => segmentMs + dwellMs;
|
|
||||||
double get _totalMs => segmentCount * _slotMs;
|
|
||||||
bool get isComplete => hasPath && _timelineMs >= _totalMs;
|
|
||||||
|
|
||||||
int get currentSegment {
|
|
||||||
if (!hasPath) return 0;
|
|
||||||
return (_timelineMs / _slotMs).floor().clamp(0, segmentCount - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Travel progress through [currentSegment]; 1.0 while dwelling at its end.
|
|
||||||
double get segmentProgress {
|
|
||||||
if (!hasPath) return 0;
|
|
||||||
final within = _timelineMs - currentSegment * _slotMs;
|
|
||||||
return (within / segmentMs).clamp(0.0, 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Dwell progress (0..1) at the reached hop, or null while traveling.
|
|
||||||
double? get dwellProgress {
|
|
||||||
if (!hasPath || isComplete) return null;
|
|
||||||
final within = _timelineMs - currentSegment * _slotMs;
|
|
||||||
if (within < segmentMs) return null;
|
|
||||||
return ((within - segmentMs) / dwellMs).clamp(0.0, 1.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Index of the point the packet has most recently reached.
|
|
||||||
int get reachedPointIndex {
|
|
||||||
if (!hasPath) return 0;
|
|
||||||
if (isComplete) return _points.length - 1;
|
|
||||||
return segmentProgress >= 1.0 ? currentSegment + 1 : currentSegment;
|
|
||||||
}
|
|
||||||
|
|
||||||
LatLng get position {
|
|
||||||
if (!hasPath) return const LatLng(0, 0);
|
|
||||||
final seg = currentSegment;
|
|
||||||
final a = _points[seg];
|
|
||||||
final b = _points[seg + 1];
|
|
||||||
final t = segmentProgress;
|
|
||||||
return LatLng(
|
|
||||||
a.latitude + (b.latitude - a.latitude) * t,
|
|
||||||
a.longitude + (b.longitude - a.longitude) * t,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Replaces the path and resets the animation to the start.
|
|
||||||
void setPath(List<LatLng> points) {
|
|
||||||
_ticker.stop();
|
|
||||||
_points = List.unmodifiable(points);
|
|
||||||
_timelineMs = 0;
|
|
||||||
_playing = false;
|
|
||||||
_started = false;
|
|
||||||
activeSegment.value = -1;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
void play() {
|
|
||||||
if (!hasPath) return;
|
|
||||||
if (isComplete) _timelineMs = 0;
|
|
||||||
_started = true;
|
|
||||||
_playing = true;
|
|
||||||
activeSegment.value = currentSegment;
|
|
||||||
if (!_ticker.isActive) {
|
|
||||||
_lastTick = Duration.zero;
|
|
||||||
_ticker.start();
|
|
||||||
}
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
void pause() {
|
|
||||||
_ticker.stop();
|
|
||||||
_playing = false;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
void togglePlay() => _playing ? pause() : play();
|
|
||||||
|
|
||||||
void replay() {
|
|
||||||
if (!hasPath) return;
|
|
||||||
_timelineMs = 0;
|
|
||||||
activeSegment.value = 0;
|
|
||||||
play();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Stops playback and hides the packet overlay.
|
|
||||||
void stop() {
|
|
||||||
_ticker.stop();
|
|
||||||
_playing = false;
|
|
||||||
_started = false;
|
|
||||||
_timelineMs = 0;
|
|
||||||
activeSegment.value = -1;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
void stepForward() => _jumpToPoint(reachedPointIndex + 1);
|
|
||||||
|
|
||||||
void stepBack() => _jumpToPoint(reachedPointIndex - 1);
|
|
||||||
|
|
||||||
void cycleSpeed() {
|
|
||||||
final index = speedSteps.indexOf(_speed);
|
|
||||||
_speed = speedSteps[(index + 1) % speedSteps.length];
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
void _jumpToPoint(int index) {
|
|
||||||
if (!hasPath) return;
|
|
||||||
_ticker.stop();
|
|
||||||
_playing = false;
|
|
||||||
_started = true;
|
|
||||||
final clamped = index.clamp(0, _points.length - 1);
|
|
||||||
// Land at the start of the dwell window so the hop pulse plays.
|
|
||||||
_timelineMs = clamped == 0 ? 0 : (clamped - 1) * _slotMs + segmentMs;
|
|
||||||
activeSegment.value = currentSegment;
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
void _onTick(Duration elapsed) {
|
|
||||||
final dtMs = (elapsed - _lastTick).inMicroseconds / 1000.0;
|
|
||||||
_lastTick = elapsed;
|
|
||||||
_timelineMs = (_timelineMs + dtMs * _speed).clamp(0.0, _totalMs);
|
|
||||||
if (_timelineMs >= _totalMs) {
|
|
||||||
_ticker.stop();
|
|
||||||
_playing = false;
|
|
||||||
}
|
|
||||||
if (activeSegment.value != currentSegment) {
|
|
||||||
activeSegment.value = currentSegment;
|
|
||||||
}
|
|
||||||
notifyListeners();
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
|
||||||
void dispose() {
|
|
||||||
_ticker.dispose();
|
|
||||||
activeSegment.dispose();
|
|
||||||
super.dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -81,16 +81,6 @@ class RadioSettings {
|
|||||||
txPowerDbm: 20,
|
txPowerDbm: 20,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(
|
|
||||||
'Australia (Mid)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 915.075,
|
|
||||||
bandwidth: LoRaBandwidth.bw125,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf9,
|
|
||||||
codingRate: LoRaCodingRate.cr4_5,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
(
|
||||||
'Australia SA, WA, QLD',
|
'Australia SA, WA, QLD',
|
||||||
RadioSettings(
|
RadioSettings(
|
||||||
@@ -191,276 +181,6 @@ class RadioSettings {
|
|||||||
txPowerDbm: 14,
|
txPowerDbm: 14,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
(
|
|
||||||
'Russia Artyom (VVO)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 864.281,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_6,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Biysk (BSK)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 869.000,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_5,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Chelyabinsk (CEK)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_6,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Cherepovets (CEE)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.570,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf7,
|
|
||||||
codingRate: LoRaCodingRate.cr4_8,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Irkutsk (IKT)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf7,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Ivanovo (IWA)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_8,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Izhevsk (IJK)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.732,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_8,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Kaluga (KLF)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf7,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Kazan (KZN)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_6,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Khabarovsk (KHV)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 864.281,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_6,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Kirov (KVX)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_8,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Lipetsk (LPK)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.950,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf9,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Moscow (MOW)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf7,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Nizhny Novgorod (GOJ)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_6,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Novosibirsk (OVB)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 869.000,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf9,
|
|
||||||
codingRate: LoRaCodingRate.cr4_8,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Rostov-on-Don (ROV)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf9,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Ryazan (RZN)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.880,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf9,
|
|
||||||
codingRate: LoRaCodingRate.cr4_5,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Samara (KUF)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 864.281,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Saratov (GSV)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 864.281,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia St. Petersburg (LED)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.856,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf7,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Tambov (TBW)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.950,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf10,
|
|
||||||
codingRate: LoRaCodingRate.cr4_5,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Tula (TYA)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Tver (KLD)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 869.169,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_8,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Ufa (UFA)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.732,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_8,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Volgograd (VOG)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 869.525,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf7,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Voronezh (VOZ)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 868.731,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf8,
|
|
||||||
codingRate: LoRaCodingRate.cr4_6,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
'Russia Yekaterinburg (SVX)',
|
|
||||||
RadioSettings(
|
|
||||||
frequencyMHz: 869.046,
|
|
||||||
bandwidth: LoRaBandwidth.bw62_5,
|
|
||||||
spreadingFactor: LoRaSpreadingFactor.sf7,
|
|
||||||
codingRate: LoRaCodingRate.cr4_7,
|
|
||||||
txPowerDbm: 20,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
(
|
(
|
||||||
'Switzerland',
|
'Switzerland',
|
||||||
RadioSettings(
|
RadioSettings(
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import 'package:provider/provider.dart';
|
|||||||
|
|
||||||
import '../l10n/l10n.dart';
|
import '../l10n/l10n.dart';
|
||||||
import '../services/app_debug_log_service.dart';
|
import '../services/app_debug_log_service.dart';
|
||||||
import '../theme/mesh_theme.dart';
|
|
||||||
import '../widgets/adaptive_app_bar_title.dart';
|
import '../widgets/adaptive_app_bar_title.dart';
|
||||||
import '../helpers/snack_bar_builder.dart';
|
import '../helpers/snack_bar_builder.dart';
|
||||||
|
|
||||||
@@ -59,58 +58,26 @@ class AppDebugLogScreen extends StatelessWidget {
|
|||||||
child: hasEntries
|
child: hasEntries
|
||||||
? ListView.separated(
|
? ListView.separated(
|
||||||
itemCount: entries.length,
|
itemCount: entries.length,
|
||||||
separatorBuilder: (_, _) =>
|
separatorBuilder: (_, _) => const Divider(height: 1),
|
||||||
const Divider(height: 1, color: MeshPalette.line),
|
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
final entry = entries[index];
|
final entry = entries[index];
|
||||||
return Container(
|
return ListTile(
|
||||||
color: MeshPalette.bg,
|
dense: true,
|
||||||
padding: const EdgeInsets.symmetric(
|
leading: _buildLevelIcon(entry.level),
|
||||||
horizontal: 16,
|
title: Text(
|
||||||
vertical: 8,
|
'[${entry.tag}] ${entry.message}',
|
||||||
),
|
style: const TextStyle(
|
||||||
child: Row(
|
fontSize: 12,
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
fontFamily: 'monospace',
|
||||||
children: [
|
|
||||||
_buildLevelIcon(context, entry.level),
|
|
||||||
const SizedBox(width: 10),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text.rich(
|
|
||||||
TextSpan(
|
|
||||||
children: [
|
|
||||||
TextSpan(
|
|
||||||
text: '[${entry.tag}] ',
|
|
||||||
style: MeshTheme.mono(
|
|
||||||
fontSize: 11.5,
|
|
||||||
color: _levelColor(entry.level),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
TextSpan(
|
subtitle: Text(
|
||||||
text: entry.message,
|
|
||||||
style: MeshTheme.mono(
|
|
||||||
fontSize: 11.5,
|
|
||||||
color: MeshPalette.ink2,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 2),
|
|
||||||
Text(
|
|
||||||
entry.formattedTime,
|
entry.formattedTime,
|
||||||
style: MeshTheme.mono(
|
style: TextStyle(
|
||||||
fontSize: 9.5,
|
fontSize: 10,
|
||||||
color: MeshPalette.ink4,
|
color: Colors.grey[600],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@@ -118,25 +85,25 @@ class AppDebugLogScreen extends StatelessWidget {
|
|||||||
child: Column(
|
child: Column(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
const Icon(
|
Icon(
|
||||||
Icons.bug_report_outlined,
|
Icons.bug_report_outlined,
|
||||||
size: 64,
|
size: 64,
|
||||||
color: MeshPalette.ink3,
|
color: Colors.grey[400],
|
||||||
),
|
),
|
||||||
const SizedBox(height: 16),
|
const SizedBox(height: 16),
|
||||||
Text(
|
Text(
|
||||||
context.l10n.debugLog_noEntries,
|
context.l10n.debugLog_noEntries,
|
||||||
style: const TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 16,
|
fontSize: 16,
|
||||||
color: MeshPalette.ink3,
|
color: Colors.grey[600],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
Text(
|
Text(
|
||||||
context.l10n.debugLog_enableInSettings,
|
context.l10n.debugLog_enableInSettings,
|
||||||
style: const TextStyle(
|
style: TextStyle(
|
||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
color: MeshPalette.ink3,
|
color: Colors.grey[500],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -148,37 +115,18 @@ class AppDebugLogScreen extends StatelessWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Color _levelColor(AppDebugLogLevel level) {
|
Widget _buildLevelIcon(AppDebugLogLevel level) {
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case AppDebugLogLevel.info:
|
case AppDebugLogLevel.info:
|
||||||
return MeshPalette.blue;
|
return const Icon(Icons.info_outline, size: 18, color: Colors.blue);
|
||||||
case AppDebugLogLevel.warning:
|
|
||||||
return MeshPalette.warn;
|
|
||||||
case AppDebugLogLevel.error:
|
|
||||||
return MeshPalette.alert;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildLevelIcon(BuildContext context, AppDebugLogLevel level) {
|
|
||||||
switch (level) {
|
|
||||||
case AppDebugLogLevel.info:
|
|
||||||
return const Icon(
|
|
||||||
Icons.info_outline,
|
|
||||||
size: 18,
|
|
||||||
color: MeshPalette.blue,
|
|
||||||
);
|
|
||||||
case AppDebugLogLevel.warning:
|
case AppDebugLogLevel.warning:
|
||||||
return const Icon(
|
return const Icon(
|
||||||
Icons.warning_amber_outlined,
|
Icons.warning_amber_outlined,
|
||||||
size: 18,
|
size: 18,
|
||||||
color: MeshPalette.warn,
|
color: Colors.orange,
|
||||||
);
|
);
|
||||||
case AppDebugLogLevel.error:
|
case AppDebugLogLevel.error:
|
||||||
return const Icon(
|
return const Icon(Icons.error_outline, size: 18, color: Colors.red);
|
||||||
Icons.error_outline,
|
|
||||||
size: 18,
|
|
||||||
color: MeshPalette.alert,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,19 +4,11 @@ import 'package:flutter/services.dart';
|
|||||||
import '../l10n/l10n.dart';
|
import '../l10n/l10n.dart';
|
||||||
import '../services/ble_debug_log_service.dart';
|
import '../services/ble_debug_log_service.dart';
|
||||||
import '../connector/meshcore_protocol.dart';
|
import '../connector/meshcore_protocol.dart';
|
||||||
import '../theme/mesh_theme.dart';
|
|
||||||
import '../widgets/adaptive_app_bar_title.dart';
|
import '../widgets/adaptive_app_bar_title.dart';
|
||||||
import '../helpers/snack_bar_builder.dart';
|
import '../helpers/snack_bar_builder.dart';
|
||||||
|
|
||||||
enum _BleLogView { frames, rawLogRx }
|
enum _BleLogView { frames, rawLogRx }
|
||||||
|
|
||||||
int _decodeRawPathByteLen(int pathLenRaw) {
|
|
||||||
if (pathLenRaw == 0xFF || pathLenRaw == 0) return 0;
|
|
||||||
final hashCount = pathLenRaw & 0x3F;
|
|
||||||
final hashWidth = ((pathLenRaw >> 6) & 0x03) + 1;
|
|
||||||
return hashCount * hashWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
class BleDebugLogScreen extends StatefulWidget {
|
class BleDebugLogScreen extends StatefulWidget {
|
||||||
const BleDebugLogScreen({super.key});
|
const BleDebugLogScreen({super.key});
|
||||||
|
|
||||||
@@ -40,7 +32,6 @@ class _BleDebugLogScreenState extends State<BleDebugLogScreen> {
|
|||||||
return Scaffold(
|
return Scaffold(
|
||||||
appBar: AppBar(
|
appBar: AppBar(
|
||||||
title: AdaptiveAppBarTitle(context.l10n.debugLog_bleTitle),
|
title: AdaptiveAppBarTitle(context.l10n.debugLog_bleTitle),
|
||||||
centerTitle: true,
|
|
||||||
actions: [
|
actions: [
|
||||||
IconButton(
|
IconButton(
|
||||||
tooltip: context.l10n.debugLog_copyLog,
|
tooltip: context.l10n.debugLog_copyLog,
|
||||||
@@ -110,14 +101,24 @@ class _BleDebugLogScreenState extends State<BleDebugLogScreen> {
|
|||||||
itemCount: showingFrames
|
itemCount: showingFrames
|
||||||
? entries.length
|
? entries.length
|
||||||
: rawEntries.length,
|
: rawEntries.length,
|
||||||
separatorBuilder: (_, _) =>
|
separatorBuilder: (_, _) => const Divider(height: 1),
|
||||||
const Divider(height: 1, color: MeshPalette.line),
|
|
||||||
itemBuilder: (context, index) {
|
itemBuilder: (context, index) {
|
||||||
if (showingFrames) {
|
if (showingFrames) {
|
||||||
final entry = entries[index];
|
final entry = entries[index];
|
||||||
final time =
|
final time =
|
||||||
'${entry.timestamp.hour.toString().padLeft(2, '0')}:${entry.timestamp.minute.toString().padLeft(2, '0')}:${entry.timestamp.second.toString().padLeft(2, '0')}';
|
'${entry.timestamp.hour.toString().padLeft(2, '0')}:${entry.timestamp.minute.toString().padLeft(2, '0')}:${entry.timestamp.second.toString().padLeft(2, '0')}';
|
||||||
Future<void> copyHex() async {
|
return ListTile(
|
||||||
|
dense: true,
|
||||||
|
title: Text(entry.description),
|
||||||
|
subtitle: Text('${entry.hexPreview}\n$time'),
|
||||||
|
isThreeLine: true,
|
||||||
|
leading: Icon(
|
||||||
|
entry.outgoing
|
||||||
|
? Icons.upload
|
||||||
|
: Icons.download,
|
||||||
|
size: 18,
|
||||||
|
),
|
||||||
|
onLongPress: () async {
|
||||||
await Clipboard.setData(
|
await Clipboard.setData(
|
||||||
ClipboardData(
|
ClipboardData(
|
||||||
text: entry.payload
|
text: entry.payload
|
||||||
@@ -129,74 +130,7 @@ class _BleDebugLogScreenState extends State<BleDebugLogScreen> {
|
|||||||
.join(''),
|
.join(''),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
if (context.mounted) {
|
},
|
||||||
showDismissibleSnackBar(
|
|
||||||
context,
|
|
||||||
content: Text(
|
|
||||||
context.l10n.debugLog_bleCopied,
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return GestureDetector(
|
|
||||||
onTap: copyHex,
|
|
||||||
onLongPress: copyHex,
|
|
||||||
onSecondaryTap: copyHex,
|
|
||||||
child: Container(
|
|
||||||
color: MeshPalette.bg,
|
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
horizontal: 16,
|
|
||||||
vertical: 8,
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
crossAxisAlignment:
|
|
||||||
CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Icon(
|
|
||||||
entry.outgoing
|
|
||||||
? Icons.upload
|
|
||||||
: Icons.download,
|
|
||||||
size: 18,
|
|
||||||
color: entry.outgoing
|
|
||||||
? MeshPalette.blue
|
|
||||||
: MeshPalette.signal,
|
|
||||||
),
|
|
||||||
const SizedBox(width: 10),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment:
|
|
||||||
CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
entry.description,
|
|
||||||
style: MeshTheme.mono(
|
|
||||||
fontSize: 11.5,
|
|
||||||
color: MeshPalette.ink,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 2),
|
|
||||||
Text(
|
|
||||||
entry.hexPreview,
|
|
||||||
style: MeshTheme.mono(
|
|
||||||
fontSize: 10,
|
|
||||||
color: MeshPalette.ink3,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 2),
|
|
||||||
Text(
|
|
||||||
time,
|
|
||||||
style: MeshTheme.mono(
|
|
||||||
fontSize: 9.5,
|
|
||||||
color: MeshPalette.ink4,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,65 +138,18 @@ class _BleDebugLogScreenState extends State<BleDebugLogScreen> {
|
|||||||
final info = _decodeRawPacket(entry.payload);
|
final info = _decodeRawPacket(entry.payload);
|
||||||
final time =
|
final time =
|
||||||
'${entry.timestamp.hour.toString().padLeft(2, '0')}:${entry.timestamp.minute.toString().padLeft(2, '0')}:${entry.timestamp.second.toString().padLeft(2, '0')}';
|
'${entry.timestamp.hour.toString().padLeft(2, '0')}:${entry.timestamp.minute.toString().padLeft(2, '0')}:${entry.timestamp.second.toString().padLeft(2, '0')}';
|
||||||
return GestureDetector(
|
return ListTile(
|
||||||
|
dense: true,
|
||||||
|
title: Text(info.title),
|
||||||
|
subtitle: Text('${info.summary}\n$time'),
|
||||||
|
isThreeLine: true,
|
||||||
|
leading: const Icon(Icons.download, size: 18),
|
||||||
onTap: () => _showRawDialog(context, info),
|
onTap: () => _showRawDialog(context, info),
|
||||||
child: Container(
|
|
||||||
color: MeshPalette.bg,
|
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
horizontal: 16,
|
|
||||||
vertical: 8,
|
|
||||||
),
|
|
||||||
child: Row(
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
const Icon(
|
|
||||||
Icons.download,
|
|
||||||
size: 18,
|
|
||||||
color: MeshPalette.signal,
|
|
||||||
),
|
|
||||||
const SizedBox(width: 10),
|
|
||||||
Expanded(
|
|
||||||
child: Column(
|
|
||||||
crossAxisAlignment:
|
|
||||||
CrossAxisAlignment.start,
|
|
||||||
children: [
|
|
||||||
Text(
|
|
||||||
info.title,
|
|
||||||
style: MeshTheme.mono(
|
|
||||||
fontSize: 11.5,
|
|
||||||
color: MeshPalette.ink,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 2),
|
|
||||||
Text(
|
|
||||||
info.summary,
|
|
||||||
style: MeshTheme.mono(
|
|
||||||
fontSize: 10,
|
|
||||||
color: MeshPalette.ink3,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 2),
|
|
||||||
Text(
|
|
||||||
time,
|
|
||||||
style: MeshTheme.mono(
|
|
||||||
fontSize: 9.5,
|
|
||||||
color: MeshPalette.ink4,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
: Center(
|
: Center(
|
||||||
child: Text(
|
child: Text(context.l10n.debugLog_noBleActivity),
|
||||||
context.l10n.debugLog_noBleActivity,
|
|
||||||
style: const TextStyle(color: MeshPalette.ink3),
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@@ -321,17 +208,16 @@ class _BleDebugLogScreenState extends State<BleDebugLogScreen> {
|
|||||||
rawHex: _bytesToHex(raw),
|
rawHex: _bytesToHex(raw),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
final pathLenRaw = raw[index++];
|
final pathLen = raw[index++];
|
||||||
final pathByteLen = _decodeRawPathByteLen(pathLenRaw);
|
if (raw.length < index + pathLen) {
|
||||||
if (raw.length < index + pathByteLen) {
|
|
||||||
return _RawPacketInfo(
|
return _RawPacketInfo(
|
||||||
title: 'RX RAW_LOG_RX_DATA • ${_payloadTypeLabel(payloadType)}',
|
title: 'RX RAW_LOG_RX_DATA • ${_payloadTypeLabel(payloadType)}',
|
||||||
summary: 'Truncated path',
|
summary: 'Truncated path',
|
||||||
rawHex: _bytesToHex(raw),
|
rawHex: _bytesToHex(raw),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
final pathBytes = raw.sublist(index, index + pathByteLen);
|
final pathBytes = raw.sublist(index, index + pathLen);
|
||||||
index += pathByteLen;
|
index += pathLen;
|
||||||
if (raw.length <= index) {
|
if (raw.length <= index) {
|
||||||
return _RawPacketInfo(
|
return _RawPacketInfo(
|
||||||
title: 'RX RAW_LOG_RX_DATA • ${_payloadTypeLabel(payloadType)}',
|
title: 'RX RAW_LOG_RX_DATA • ${_payloadTypeLabel(payloadType)}',
|
||||||
@@ -344,7 +230,7 @@ class _BleDebugLogScreenState extends State<BleDebugLogScreen> {
|
|||||||
final title =
|
final title =
|
||||||
'RX ${_payloadTypeLabel(payloadType)} • ${_routeLabel(routeType)} • v$payloadVer';
|
'RX ${_payloadTypeLabel(payloadType)} • ${_routeLabel(routeType)} • v$payloadVer';
|
||||||
final summary = _decodePayloadSummary(payloadType, payload);
|
final summary = _decodePayloadSummary(payloadType, payload);
|
||||||
final pathSummary = pathByteLen > 0
|
final pathSummary = pathLen > 0
|
||||||
? 'Path=${_bytesToHex(pathBytes)}'
|
? 'Path=${_bytesToHex(pathBytes)}'
|
||||||
: 'Path=none';
|
: 'Path=none';
|
||||||
final detail = '$summary • $pathSummary • len=${raw.length}';
|
final detail = '$summary • $pathSummary • len=${raw.length}';
|
||||||
|
|||||||