Compare commits

...

38 Commits

Author SHA1 Message Date
zjs81 4239fb11ed Fix radio settings to only send repeat byte when the current state is known 2026-02-18 00:07:08 -07:00
zjs81 5fae2e5f73 fix formatting 2026-02-17 23:50:11 -07:00
zjs81 947fafbbb7 Refactor radio settings and localization updates
fixes #72

- Removed preset configurations for 915 MHz, 868 MHz, and 433 MHz from the RadioSettings model.
- Introduced a new list of regional preset configurations for various countries.
- Updated the settings screen to use a dropdown for selecting presets instead of chips.
- Added a switch for enabling client repeat functionality with appropriate warnings for frequency usage.
- Updated localization files for multiple languages to reflect changes in settings related to client repeat functionality.
2026-02-17 23:42:04 -07:00
zjs81 72f0aa7208 Update dependencies and improve code consistency across multiple files 2026-02-14 02:22:45 -07:00
zjs81 f87d4896ab Merge pull request #161 from ChaoticLeah/enhancement/bluetooth-disabled-warning
Add warning when bluetooth is off
2026-02-14 02:00:36 -07:00
zjs81 9250dfec31 Gate the turn on BLE button to android 2026-02-14 01:54:30 -07:00
zjs81 37db955ab2 Fixed banner flash, added enable bluetooth button fixed theme to use app theme colors removed FAB overrides because material 3 does this for us, fixed missing translations. 2026-02-14 01:46:40 -07:00
zjs81 739d9475c0 Merge remote-tracking branch 'origin/main' into enhancement/bluetooth-disabled-warning 2026-02-14 01:28:54 -07:00
zjs81 b526175be4 bump version for android 2026-02-14 01:13:06 -07:00
Winston Lowe 73081862ad Add path tracing functionality (#165)
- Implemented path tracing feature in the map screen, allowing users to add nodes to a path and visualize it on the map.
- Added buttons for starting path tracing, removing the last node, and running the path trace.
- Introduced a new overlay to display current path information and distance.
- Updated localization files for multiple languages to include new strings related to path tracing.
- Refactored map rendering logic to accommodate path tracing visuals.
2026-02-14 01:10:34 -07:00
just_stuff_tm fac062a100 Refine device info layout and add collapsible map legend (#164) 2026-02-12 13:46:28 -07:00
Leah ef6bd78632 Merge branch 'enhancement/bluetooth-disabled-warning' of github.com:ChaoticLeah/meshcore-open into enhancement/bluetooth-disabled-warning 2026-02-12 20:15:58 +01:00
Leah 01c8390989 make stuff unawaited + maybe fix edge case? 2026-02-12 20:14:56 +01:00
Leah c05f813d65 Update lib/screens/scanner_screen.dart
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-12 20:02:56 +01:00
Ded c52b19b09f Merge pull request #162 from just-stuff-tm/fix/battery-layout-overflow
Fix battery chemistry dropdown layout overflow
2026-02-11 21:27:30 -08:00
just_stuff_tm 6a666839b6 Fix battery chemistry dropdown layout overflow 2026-02-12 00:05:00 -05:00
Leah bc77f7e287 Remove unused translation
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2026-02-11 23:03:41 +01:00
Leah 9332d8126f linted and added greying out 2026-02-11 22:58:15 +01:00
Leah 9ce00556ec Add warning when bluetooth is off 2026-02-11 22:40:42 +01:00
Ded 4995f5f380 Merge pull request #159 from ChaoticLeah/add-flake-nix
Add flake.nix for development environment
2026-02-11 09:10:46 -08:00
Leah 4e6e7b6061 fix smaller copilot issues 2026-02-11 17:45:15 +01:00
Leah aa350aa4ae fixing copilot issues 2026-02-11 17:33:31 +01:00
Leah dfd38b19e9 add flake.lock 2026-02-11 17:26:43 +01:00
Leah 4afab3f629 remove unnessisary bits and nix darwin stuff 2026-02-11 17:25:44 +01:00
Ded 67816130ac Merge pull request #152 from zjs81/remove-wakelock
remove wakelock
2026-02-11 08:18:57 -08:00
Ded d573f0c312 Merge pull request #158 from ChaoticLeah/update-gitignore
Update .gitignore to exclude .gradle/
2026-02-11 08:16:38 -08:00
Ded 5b699cd624 keep ignores organized 2026-02-11 08:16:07 -08:00
Leah a4d3d248a5 Add flake.nix for development environment 2026-02-11 17:15:49 +01:00
Ded 2a3f2b3a24 Merge pull request #150 from ericszimmermann/german
translations to german updated.
2026-02-11 08:13:28 -08:00
Leah 675083fa01 Update .gitignore to exclude .gradle/ 2026-02-11 17:10:49 +01:00
Ded 5fc4b80b16 Merge pull request #144 from zjs81/support-whisperos
add support for whipseros
2026-02-11 08:03:44 -08:00
446564 84a32c1e67 remove wakelock
was being used to keep ble active which is not what it does

in early testing the ble remains connected with display off and also
when switching apps
2026-02-10 19:38:46 -08:00
ericz 607583060a translations to german updated. 2026-02-10 22:55:39 +01:00
Ded 71cf556b61 Merge pull request #148 from spfmoby/more-better-french-translations
Still better french translations
2026-02-10 11:24:47 -08:00
Zach c26174ad18 Chore bump version 2026-02-10 09:01:56 -07:00
spfmoby 04021a39a1 Better french translations 2026-02-10 08:12:51 +01:00
446564 fe23e9f7a0 add support for whipseros
needed a new ble prefix
2026-02-09 05:36:25 -08:00
Ded d7ec1876af Merge pull request #143 from zjs81/alpha6
chore: update version to alpha 6
2026-02-08 19:07:29 -08:00
53 changed files with 2317 additions and 1131 deletions
+1
View File
@@ -65,6 +65,7 @@ secrets.dart
**/ios/Flutter/Flutter.podspec **/ios/Flutter/Flutter.podspec
# Android # Android
.gradle/
**/android/.gradle/ **/android/.gradle/
**/android/captures/ **/android/captures/
**/android/local.properties **/android/local.properties
+1 -1
View File
@@ -83,5 +83,5 @@ flutter {
} }
dependencies { dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4") coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4")
} }
Generated
+61
View File
@@ -0,0 +1,61 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1770562336,
"narHash": "sha256-ub1gpAONMFsT/GU2hV6ZWJjur8rJ6kKxdm9IlCT0j84=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "d6c71932130818840fc8fe9509cf50be8c64634f",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}
+86
View File
@@ -0,0 +1,86 @@
{
description = "MeshCore Flutter Application";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system:
let
pkgs = nixpkgs.legacyPackages.${system};
in
{
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
# Flutter and Dart
flutter
dart
# Java (required for Android development)
jdk17
# Android development tools
android-tools
gradle
# For the shell hook to set up the environment for Flutter development
gtk3
glib
sysprof
libclang
cmake
ninja
pkg-config
libdatrie
# Additional tools for installing Android SDK if not present
curl
unzip
];
shellHook = ''
echo "MeshCore Flutter Development Environment"
export PKG_CONFIG_PATH="${pkgs.gtk3}/lib/pkgconfig:${pkgs.glib}/lib/pkgconfig:${pkgs.sysprof}/lib/pkgconfig:$PKG_CONFIG_PATH"
export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath [pkgs.gtk3 pkgs.glib pkgs.sysprof pkgs.libdatrie]}:$LD_LIBRARY_PATH"
export CMAKE_INSTALL_PREFIX="$PWD/build/bundle"
# Setup Android SDK in home directory (standard location)
export ANDROID_HOME="$HOME/Android/Sdk"
export ANDROID_SDK_ROOT="$ANDROID_HOME"
export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools/bin:$PATH"
echo "Android SDK: $ANDROID_HOME"
echo ""
# Check if Android SDK exists and offer to download if not
if [ ! -d "$ANDROID_HOME" ]; then
echo "WARNING: Android SDK not found at $ANDROID_HOME"
echo ""
echo "To download and set up the Android SDK, run this command:"
echo ""
cat << 'EOF'
mkdir -p ~/Android/Sdk && cd ~/Android/Sdk && \
curl -o cmdline-tools.zip ${if pkgs.stdenv.isDarwin then "https://dl.google.com/android/repository/commandlinetools-mac-10406996_latest.zip" else "https://dl.google.com/android/repository/commandlinetools-linux-10406996_latest.zip"} && \
unzip -q cmdline-tools.zip && \
mkdir -p cmdline-tools/latest && \
mv cmdline-tools/* cmdline-tools/latest/ 2>/dev/null || echo "Warning: failed to move Android cmdline-tools into 'latest' directory; please check your SDK layout." >&2 && \
rm cmdline-tools.zip && \
cd cmdline-tools/latest/bin && \
yes | ./sdkmanager --sdk_root=~/Android/Sdk 'platform-tools' && \
echo "Android SDK setup complete!"
EOF
echo ""
echo "Then run 'flutter doctor' again to verify."
echo ""
else
echo "Android SDK found at $ANDROID_HOME"
fi
echo "To check that everything is set up correctly, run 'flutter doctor' and ensure there are no issues."
'';
};
}
);
}
+16 -11
View File
@@ -5,7 +5,6 @@ import 'package:crypto/crypto.dart' as crypto;
import 'package:pointycastle/export.dart'; import 'package:pointycastle/export.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:wakelock_plus/wakelock_plus.dart';
import '../models/channel.dart'; import '../models/channel.dart';
import '../models/channel_message.dart'; import '../models/channel_message.dart';
@@ -91,6 +90,8 @@ class MeshCoreConnector extends ChangeNotifier {
int? _currentBwHz; int? _currentBwHz;
int? _currentSf; int? _currentSf;
int? _currentCr; int? _currentCr;
bool? _clientRepeat;
int? _firmwareVerCode;
int? _batteryMillivolts; int? _batteryMillivolts;
double? _selfLatitude; double? _selfLatitude;
double? _selfLongitude; double? _selfLongitude;
@@ -201,6 +202,8 @@ class MeshCoreConnector extends ChangeNotifier {
int? get currentBwHz => _currentBwHz; int? get currentBwHz => _currentBwHz;
int? get currentSf => _currentSf; int? get currentSf => _currentSf;
int? get currentCr => _currentCr; int? get currentCr => _currentCr;
bool? get clientRepeat => _clientRepeat;
int? get firmwareVerCode => _firmwareVerCode;
Map<String, String>? get currentCustomVars => _currentCustomVars; Map<String, String>? get currentCustomVars => _currentCustomVars;
int? get batteryMillivolts => _batteryMillivolts; int? get batteryMillivolts => _batteryMillivolts;
int get maxContacts => _maxContacts; int get maxContacts => _maxContacts;
@@ -658,7 +661,8 @@ class MeshCoreConnector extends ChangeNotifier {
_scanResults.clear(); _scanResults.clear();
for (var result in results) { for (var result in results) {
if (result.device.platformName.startsWith("MeshCore-") || if (result.device.platformName.startsWith("MeshCore-") ||
result.advertisementData.advName.startsWith("MeshCore-")) { result.advertisementData.advName.startsWith("MeshCore-") ||
result.advertisementData.advName.startsWith("Whisper-")) {
_scanResults.add(result); _scanResults.add(result);
} }
} }
@@ -775,9 +779,6 @@ class MeshCoreConnector extends ChangeNotifier {
_setState(MeshCoreConnectionState.connected); _setState(MeshCoreConnectionState.connected);
// Enable wake lock to prevent BLE disconnection when screen turns off
await WakelockPlus.enable();
await _requestDeviceInfo(); await _requestDeviceInfo();
_startBatteryPolling(); _startBatteryPolling();
final gotSelfInfo = await _waitForSelfInfo( final gotSelfInfo = await _waitForSelfInfo(
@@ -886,9 +887,6 @@ class MeshCoreConnector extends ChangeNotifier {
_setState(MeshCoreConnectionState.disconnecting); _setState(MeshCoreConnectionState.disconnecting);
_stopBatteryPolling(); _stopBatteryPolling();
// Disable wake lock when disconnecting
await WakelockPlus.disable();
await _notifySubscription?.cancel(); await _notifySubscription?.cancel();
_notifySubscription = null; _notifySubscription = null;
@@ -922,6 +920,8 @@ class MeshCoreConnector extends ChangeNotifier {
_selfName = null; _selfName = null;
_selfLatitude = null; _selfLatitude = null;
_selfLongitude = null; _selfLongitude = null;
_clientRepeat = null;
_firmwareVerCode = null;
_batteryMillivolts = null; _batteryMillivolts = null;
_batteryRequested = false; _batteryRequested = false;
_awaitingSelfInfo = false; _awaitingSelfInfo = false;
@@ -1826,6 +1826,13 @@ class MeshCoreConnector extends ChangeNotifier {
void _handleDeviceInfo(Uint8List frame) { void _handleDeviceInfo(Uint8List frame) {
if (frame.length < 4) return; if (frame.length < 4) return;
_firmwareVerCode = frame[1];
// Parse client_repeat from firmware v9+ (byte 80)
if (frame.length >= 81) {
_clientRepeat = frame[80] != 0;
}
// Firmware reports MAX_CONTACTS / 2 for v3+ device info. // Firmware reports MAX_CONTACTS / 2 for v3+ device info.
final reportedContacts = frame[2]; final reportedContacts = frame[2];
final reportedChannels = frame[3]; final reportedChannels = frame[3];
@@ -1846,8 +1853,8 @@ class MeshCoreConnector extends ChangeNotifier {
unawaited(getChannels(maxChannels: nextMaxChannels)); unawaited(getChannels(maxChannels: nextMaxChannels));
} }
} }
notifyListeners();
} }
notifyListeners();
} }
void _handleNoMoreMessages() { void _handleNoMoreMessages() {
@@ -3214,8 +3221,6 @@ class MeshCoreConnector extends ChangeNotifier {
} }
void _handleDisconnection() { void _handleDisconnection() {
// Disable wake lock when connection is lost
WakelockPlus.disable();
_stopBatteryPolling(); _stopBatteryPolling();
for (final entry in _pendingRepeaterAcks.values) { for (final entry in _pendingRepeaterAcks.values) {
+13 -2
View File
@@ -550,18 +550,29 @@ Uint8List buildSetChannelFrame(int channelIndex, String name, Uint8List psk) {
} }
// Build CMD_SET_RADIO_PARAMS frame // Build CMD_SET_RADIO_PARAMS frame
// Format: [cmd][freq x4][bw x4][sf][cr] // Format: [cmd][freq x4][bw x4][sf][cr] (pre-v9)
// [cmd][freq x4][bw x4][sf][cr][repeat] (firmware v9+)
// freq: frequency in Hz (300000-2500000) // freq: frequency in Hz (300000-2500000)
// bw: bandwidth in Hz (7000-500000) // bw: bandwidth in Hz (7000-500000)
// sf: spreading factor (5-12) // sf: spreading factor (5-12)
// cr: coding rate (5-8) // cr: coding rate (5-8)
Uint8List buildSetRadioParamsFrame(int freqHz, int bwHz, int sf, int cr) { // clientRepeat: enable off-grid packet repeat (firmware v9+, omit for older)
Uint8List buildSetRadioParamsFrame(
int freqHz,
int bwHz,
int sf,
int cr, {
bool? clientRepeat,
}) {
final writer = BufferWriter(); final writer = BufferWriter();
writer.writeByte(cmdSetRadioParams); writer.writeByte(cmdSetRadioParams);
writer.writeUInt32LE(freqHz); writer.writeUInt32LE(freqHz);
writer.writeUInt32LE(bwHz); writer.writeUInt32LE(bwHz);
writer.writeByte(sf); writer.writeByte(sf);
writer.writeByte(cr); writer.writeByte(cr);
if (clientRepeat != null) {
writer.writeByte(clientRepeat ? 1 : 0);
}
return writer.toBytes(); return writer.toBytes();
} }
+12 -8
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Брой контакти", "settings_infoContactsCount": "Брой контакти",
"settings_infoChannelCount": "Брой канали", "settings_infoChannelCount": "Брой канали",
"settings_presets": "Предварителни настройки", "settings_presets": "Предварителни настройки",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Честота (MHz)", "settings_frequency": "Честота (MHz)",
"settings_frequencyHelper": "300.0 - 2500.0", "settings_frequencyHelper": "300.0 - 2500.0",
"settings_frequencyInvalid": "Невалидна честота (300-2500 MHz)", "settings_frequencyInvalid": "Невалидна честота (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX Мощност (dBm)", "settings_txPower": "TX Мощност (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Невалидна мощност на TX (0-22 dBm)", "settings_txPowerInvalid": "Невалидна мощност на TX (0-22 dBm)",
"settings_longRange": "Дълъг обхват",
"settings_fastSpeed": "Бърза скорост",
"settings_error": "Грешка: {message}", "settings_error": "Грешка: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{нов възел} other{нови възли}}", "notification_newNodesCount": "{count} {count, plural, =1{нов възел} other{нови възли}}",
"notification_newTypeDiscovered": "Открит нов {contactType}", "notification_newTypeDiscovered": "Открит нов {contactType}",
"notification_receivedNewMessage": "Получено ново съобщение", "notification_receivedNewMessage": "Получено ново съобщение",
"contacts_contactAdvertCopyFailed": "Копирането на обявата в клипборда не успя.",
"settings_gpxExportContactsSubtitle": "Експортира спътници с местоположение в GPX файл.", "settings_gpxExportContactsSubtitle": "Експортира спътници с местоположение в GPX файл.",
"settings_gpxExportRepeatersSubtitle": "Изпраща повторители / roomserver с местоположение в GPX файл.", "settings_gpxExportRepeatersSubtitle": "Изпраща повторители / roomserver с местоположение в GPX файл.",
"settings_gpxExportAll": "Експортирай всички контакти в GPX", "settings_gpxExportAll": "Експортирай всички контакти в GPX",
@@ -1591,6 +1585,16 @@
"settings_gpxExportAllContacts": "Местоположения на всички контакти", "settings_gpxExportAllContacts": "Местоположения на всички контакти",
"settings_gpxExportShareText": "Картинни данни изнесени от meshcore-open", "settings_gpxExportShareText": "Картинни данни изнесени от meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open износ на данни за карта в формат GPX", "settings_gpxExportShareSubject": "meshcore-open износ на данни за карта в формат GPX",
"pathTrace_someHopsNoLocation": "Един или повече от хмелите липсва местоположение!" "pathTrace_someHopsNoLocation": "Един или повече от хмелите липсва местоположение!",
"map_pathTraceCancelled": "Отменен е следването на пътя.",
"pathTrace_clearTooltip": "Изчисти пътя",
"map_removeLast": "Премахни Последно",
"map_runTrace": "Изпълни Път на Следване",
"map_tapToAdd": "Натиснете върху възлите, за да ги добавите към пътя.",
"scanner_bluetoothOff": "Bluetooth е изключен.",
"scanner_enableBluetooth": "Активирайте Bluetooth",
"scanner_bluetoothOffMessage": "Моля, активирайте Bluetooth, за да сканирате за устройства.",
"settings_clientRepeatSubtitle": "Позволете на това устройство да предава пакети към мрежата за други устройства.",
"settings_clientRepeatFreqWarning": "За повторение извън мрежата са необходими честоти от 433, 869 или 918 MHz.",
"settings_clientRepeat": "Без електричество – повторение"
} }
+61 -50
View File
@@ -96,14 +96,14 @@
"settings_privacyModeEnabled": "Datenschutzmodus aktiviert", "settings_privacyModeEnabled": "Datenschutzmodus aktiviert",
"settings_privacyModeDisabled": "Datenschutzmodus deaktiviert", "settings_privacyModeDisabled": "Datenschutzmodus deaktiviert",
"settings_actions": "Aktionen", "settings_actions": "Aktionen",
"settings_sendAdvertisement": "Sende eine Ankündigung", "settings_sendAdvertisement": "Sende Ankündigung",
"settings_sendAdvertisementSubtitle": "Sende Ankündigung", "settings_sendAdvertisementSubtitle": "Sende eine Ankündigung",
"settings_advertisementSent": "Ankündigung gesendet", "settings_advertisementSent": "Ankündigung gesendet",
"settings_syncTime": "Zeitsynchronisierung", "settings_syncTime": "Zeitsynchronisierung",
"settings_syncTimeSubtitle": "Stelle die Gerätezeit auf die Uhrzeit des Telefons ein", "settings_syncTimeSubtitle": "Stelle die Gerätezeit auf die Uhrzeit des Telefons ein",
"settings_timeSynchronized": "Zeit synchronisiert", "settings_timeSynchronized": "Zeit synchronisiert",
"settings_refreshContacts": "Kontakte aktualisieren", "settings_refreshContacts": "Kontakte aktualisieren",
"settings_refreshContactsSubtitle": "Kontakte-Liste vom Gerät neu laden", "settings_refreshContactsSubtitle": "Kontakt-Liste vom Gerät neu laden",
"settings_rebootDevice": "Gerät neu starten", "settings_rebootDevice": "Gerät neu starten",
"settings_rebootDeviceSubtitle": "MeshCore-Gerät neu starten", "settings_rebootDeviceSubtitle": "MeshCore-Gerät neu starten",
"settings_rebootDeviceConfirm": "Sind Sie sicher, dass Sie das Gerät neu starten möchten? Sie werden getrennt.", "settings_rebootDeviceConfirm": "Sind Sie sicher, dass Sie das Gerät neu starten möchten? Sie werden getrennt.",
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Anzahl Kontakte", "settings_infoContactsCount": "Anzahl Kontakte",
"settings_infoChannelCount": "Anzahl Kanäle", "settings_infoChannelCount": "Anzahl Kanäle",
"settings_presets": "Voreinstellungen", "settings_presets": "Voreinstellungen",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Frequenz (MHz)", "settings_frequency": "Frequenz (MHz)",
"settings_frequencyHelper": "300,00 - 2.500,00", "settings_frequencyHelper": "300,00 - 2.500,00",
"settings_frequencyInvalid": "Ungültige Frequenz (300-2500 MHz)", "settings_frequencyInvalid": "Ungültige Frequenz (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX-Leistung (dBm)", "settings_txPower": "TX-Leistung (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Ungültige TX-Leistung (0-22 dBm)", "settings_txPowerInvalid": "Ungültige TX-Leistung (0-22 dBm)",
"settings_longRange": "Grosse Reichweite",
"settings_fastSpeed": "Schnelle Geschwindigkeit",
"settings_error": "Fehler: {message}", "settings_error": "Fehler: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -540,7 +535,7 @@
"chat_routingMode": "Routenmodus", "chat_routingMode": "Routenmodus",
"chat_autoUseSavedPath": "Automatisch (gespeicherten Pfad verwenden)", "chat_autoUseSavedPath": "Automatisch (gespeicherten Pfad verwenden)",
"chat_forceFloodMode": "Flut-Modus erzwingen", "chat_forceFloodMode": "Flut-Modus erzwingen",
"chat_recentAckPaths": "Aktuelle ACK-Pfade (tasten, um zu verwenden):", "chat_recentAckPaths": "Aktuelle ACK-Pfade (antippen, um zu verwenden):",
"chat_pathHistoryFull": "Die Pfadhistorie ist voll. Entferne Einträge, um neue hinzuzufügen.", "chat_pathHistoryFull": "Die Pfadhistorie ist voll. Entferne Einträge, um neue hinzuzufügen.",
"chat_hopSingular": "Sprung", "chat_hopSingular": "Sprung",
"chat_hopPlural": "Sprünge", "chat_hopPlural": "Sprünge",
@@ -554,7 +549,7 @@
}, },
"chat_successes": "Erfolgreich", "chat_successes": "Erfolgreich",
"chat_removePath": "Pfad entfernen", "chat_removePath": "Pfad entfernen",
"chat_noPathHistoryYet": "Keine eine Pfadhistorie vorhanden.\nSende eine Nachricht, um Pfade zu entdecken.", "chat_noPathHistoryYet": "Keine Pfadhistorie vorhanden.\nSende eine Nachricht, um Pfade zu entdecken.",
"chat_pathActions": "Pfadaktionen:", "chat_pathActions": "Pfadaktionen:",
"chat_setCustomPath": "Lege benutzerdefinierten Pfad fest", "chat_setCustomPath": "Lege benutzerdefinierten Pfad fest",
"chat_setCustomPathSubtitle": "Manuellen Routenpfad festlegen", "chat_setCustomPathSubtitle": "Manuellen Routenpfad festlegen",
@@ -717,7 +712,7 @@
"mapCache_cacheArea": "Zwischenspeicherbereich", "mapCache_cacheArea": "Zwischenspeicherbereich",
"mapCache_useCurrentView": "Aktuelle Ansicht verwenden", "mapCache_useCurrentView": "Aktuelle Ansicht verwenden",
"mapCache_zoomRange": "Zoom Bereich", "mapCache_zoomRange": "Zoom Bereich",
"mapCache_estimatedTiles": "Geschätzte Fliesen: {count}", "mapCache_estimatedTiles": "Geschätzte Kacheln: {count}",
"@mapCache_estimatedTiles": { "@mapCache_estimatedTiles": {
"placeholders": { "placeholders": {
"count": { "count": {
@@ -854,7 +849,7 @@
}, },
"path_enterCustomPath": "Gebe Pfad ein", "path_enterCustomPath": "Gebe Pfad ein",
"path_currentPathLabel": "Aktueller Pfad", "path_currentPathLabel": "Aktueller Pfad",
"path_hexPrefixInstructions": "Gebe für jeden Hopfen 2-stellige Hex-Präfixe ein, getrennt durch Kommas.", "path_hexPrefixInstructions": "Gebe für jeden Zwischen-Hop das 2-stellige Hex-Präfix ein, getrennt durch Kommas.",
"path_hexPrefixExample": "Beispiel: A1,F2,3C (jeder Knoten verwendet den ersten Byte seines öffentlichen Schlüssels)", "path_hexPrefixExample": "Beispiel: A1,F2,3C (jeder Knoten verwendet den ersten Byte seines öffentlichen Schlüssels)",
"path_labelHexPrefixes": "Pfad (Hex-Präfixe)", "path_labelHexPrefixes": "Pfad (Hex-Präfixe)",
"path_helperMaxHops": "Max 64 Sprünge. Jede Präfixe ist 2 Hexadezimalzeichen (1 Byte)", "path_helperMaxHops": "Max 64 Sprünge. Jede Präfixe ist 2 Hexadezimalzeichen (1 Byte)",
@@ -887,7 +882,7 @@
"repeater_forceFloodMode": "Flut-Modus erzwingen", "repeater_forceFloodMode": "Flut-Modus erzwingen",
"repeater_pathManagement": "Pfadverwaltung", "repeater_pathManagement": "Pfadverwaltung",
"repeater_refresh": "Aktualisieren", "repeater_refresh": "Aktualisieren",
"repeater_statusRequestTimeout": "Statusanfrage zeitweise fehlgeschlagen.", "repeater_statusRequestTimeout": "Statusanfrage durch Timeout fehlgeschlagen.",
"repeater_errorLoadingStatus": "Fehler beim Laden des Status: {error}", "repeater_errorLoadingStatus": "Fehler beim Laden des Status: {error}",
"@repeater_errorLoadingStatus": { "@repeater_errorLoadingStatus": {
"placeholders": { "placeholders": {
@@ -957,7 +952,7 @@
} }
} }
}, },
"repeater_duplicatesFloodDirect": "Überflut: {flood}, Direkt: {direct}", "repeater_duplicatesFloodDirect": "Flut: {flood}, Direkt: {direct}",
"@repeater_duplicatesFloodDirect": { "@repeater_duplicatesFloodDirect": {
"placeholders": { "placeholders": {
"flood": { "flood": {
@@ -983,7 +978,7 @@
"repeater_adminPassword": "Admin-Passwort", "repeater_adminPassword": "Admin-Passwort",
"repeater_adminPasswordHelper": "Vollzugriffspasswort", "repeater_adminPasswordHelper": "Vollzugriffspasswort",
"repeater_guestPassword": "Gast-Passwort", "repeater_guestPassword": "Gast-Passwort",
"repeater_guestPasswordHelper": "Schreibgeschützter Zugriffspasswort", "repeater_guestPasswordHelper": "Schreibgeschütztes Zugriffspasswort",
"repeater_radioSettings": "Funk Einstellungen", "repeater_radioSettings": "Funk Einstellungen",
"repeater_frequencyMhz": "Frequenz (MHz)", "repeater_frequencyMhz": "Frequenz (MHz)",
"repeater_frequencyHelper": "300-2500 MHz", "repeater_frequencyHelper": "300-2500 MHz",
@@ -1086,11 +1081,11 @@
} }
}, },
"repeater_cliTitle": "Repeater CLI", "repeater_cliTitle": "Repeater CLI",
"repeater_debugNextCommand": "Fehlersuche Nächster Befehl", "repeater_debugNextCommand": "Fehlersuche des nächsten Befehls",
"repeater_commandHelp": "Hilfe", "repeater_commandHelp": "Hilfe",
"repeater_clearHistory": "Löschen der Historie", "repeater_clearHistory": "Löschen der Historie",
"repeater_noCommandsSent": "Noch keine Befehle gesendet.", "repeater_noCommandsSent": "Noch keine Befehle gesendet.",
"repeater_typeCommandOrUseQuick": "Geben Sie einen Befehl unten ein oder verwenden Sie Schnellbefehle", "repeater_typeCommandOrUseQuick": "Geben Sie unten einen Befehl ein oder verwenden Sie die Schnellbefehle",
"repeater_enterCommandHint": "Geben Sie den Befehl ein...", "repeater_enterCommandHint": "Geben Sie den Befehl ein...",
"repeater_previousCommand": "Vorhergehende Aktion", "repeater_previousCommand": "Vorhergehende Aktion",
"repeater_nextCommand": "Nächste Aktion", "repeater_nextCommand": "Nächste Aktion",
@@ -1132,7 +1127,7 @@
"repeater_cliHelpSetLat": "Legt die Breitengrad der Ankündigung fest. (dezimale Grad)", "repeater_cliHelpSetLat": "Legt die Breitengrad der Ankündigung fest. (dezimale Grad)",
"repeater_cliHelpSetLon": "Legt die Längengrade der Ankündigung fest. (dezimale Grad)", "repeater_cliHelpSetLon": "Legt die Längengrade der Ankündigung fest. (dezimale Grad)",
"repeater_cliHelpSetRadio": "Legt komplett neue Radio-Parameter fest und speichert diese als Präferenzen. Benötigt einen \"Reboot\"-Befehl, um sie anzuwenden.", "repeater_cliHelpSetRadio": "Legt komplett neue Radio-Parameter fest und speichert diese als Präferenzen. Benötigt einen \"Reboot\"-Befehl, um sie anzuwenden.",
"repeater_cliHelpSetRxDelay": "Sets (experimentell) als Basis (muss > 1 sein für den Effekt) zur Anwendung einer leichten Verzögerung bei empfangenen Paketen, basierend auf Signalstärke/Punktzahl. Auf 0 setzen, um die Funktion zu deaktivieren.", "repeater_cliHelpSetRxDelay": "Fügt eine leichte Verzögerung bei empfangenen Paketen hinzu, basierend auf Signalstärke/Punktzahl. Auf 0 setzen, um die Funktion zu deaktivieren.",
"repeater_cliHelpSetTxDelay": "Legt einen Faktor fest, der mit der Zeit bei voller Zuluft für ein Flood-Mode-Paket und mit einem zufälligen Slot-System multipliziert wird, um dessen Weiterleitung zu verzögern (um Kollisionen zu vermeiden).", "repeater_cliHelpSetTxDelay": "Legt einen Faktor fest, der mit der Zeit bei voller Zuluft für ein Flood-Mode-Paket und mit einem zufälligen Slot-System multipliziert wird, um dessen Weiterleitung zu verzögern (um Kollisionen zu vermeiden).",
"repeater_cliHelpSetDirectTxDelay": "Ähnlich wie txdelay, aber zum Anwenden einer zufälligen Verzögerung bei der Weiterleitung von Direktmodus-Paketen.", "repeater_cliHelpSetDirectTxDelay": "Ähnlich wie txdelay, aber zum Anwenden einer zufälligen Verzögerung bei der Weiterleitung von Direktmodus-Paketen.",
"repeater_cliHelpSetBridgeEnabled": "Brücke aktivieren/deaktivieren.", "repeater_cliHelpSetBridgeEnabled": "Brücke aktivieren/deaktivieren.",
@@ -1143,14 +1138,14 @@
"repeater_cliHelpSetAdcMultiplier": "Legt einen benutzerdefinierten Faktor zur Anpassung der gemeldeten Batteriewirkspannung fest (nur auf ausgewählten Boards unterstützt).", "repeater_cliHelpSetAdcMultiplier": "Legt einen benutzerdefinierten Faktor zur Anpassung der gemeldeten Batteriewirkspannung fest (nur auf ausgewählten Boards unterstützt).",
"repeater_cliHelpTempRadio": "Legt vorübergehende Funkparameter für die angegebene Anzahl von Minuten fest und kehrt anschließend zu den ursprünglichen Funkparametern zurück (wird nicht in den Einstellungen gespeichert).", "repeater_cliHelpTempRadio": "Legt vorübergehende Funkparameter für die angegebene Anzahl von Minuten fest und kehrt anschließend zu den ursprünglichen Funkparametern zurück (wird nicht in den Einstellungen gespeichert).",
"repeater_cliHelpSetPerm": "Ändert die ACL. Entfernt das passende Eintragen (durch Pubkey-Präfix), wenn \"permissions\" auf 0 steht. Fügt ein neues Eintragen hinzu, wenn die Pubkey-Hex-Länge vollständig ist und nicht bereits in der ACL vorhanden ist. Aktualisiert das Eintragen anhand des übereinstimmenden Pubkey-Präfix. Berechtigungsbits variieren je nach Firmware-Rolle, aber die unteren 2 Bits sind: 0 (Gast), 1 (Nur Lesen), 2 (Lesen/Schreiben), 3 (Admin)", "repeater_cliHelpSetPerm": "Ändert die ACL. Entfernt das passende Eintragen (durch Pubkey-Präfix), wenn \"permissions\" auf 0 steht. Fügt ein neues Eintragen hinzu, wenn die Pubkey-Hex-Länge vollständig ist und nicht bereits in der ACL vorhanden ist. Aktualisiert das Eintragen anhand des übereinstimmenden Pubkey-Präfix. Berechtigungsbits variieren je nach Firmware-Rolle, aber die unteren 2 Bits sind: 0 (Gast), 1 (Nur Lesen), 2 (Lesen/Schreiben), 3 (Admin)",
"repeater_cliHelpGetBridgeType": "Ruft Brückentyp none, rs232, espnow ab.", "repeater_cliHelpGetBridgeType": "Ruft Brückentyp: none, rs232, espnow ab.",
"repeater_cliHelpLogStart": "Beginnt die Paketprotokollierung in das Dateisystem.", "repeater_cliHelpLogStart": "Beginnt die Paketprotokollierung in das Dateisystem.",
"repeater_cliHelpLogStop": "Stoppt das Paketprotokollieren in das Dateisystem.", "repeater_cliHelpLogStop": "Stoppt das Paketprotokollieren in das Dateisystem.",
"repeater_cliHelpLogErase": "Löscht die Paketprotokolle aus dem Dateisystem.", "repeater_cliHelpLogErase": "Löscht die Paketprotokolle aus dem Dateisystem.",
"repeater_cliHelpNeighbors": "Zeigt eine Liste anderer Repeater-Knoten an, die über Zero-Hop-Ankündigung gehört wurden. Jede Zeile ist id-prefix-hex:timestamp:snr-times-4", "repeater_cliHelpNeighbors": "Zeigt eine Liste anderer Repeater-Knoten an, die über Zero-Hop-Ankündigung gehört wurden. Jede Zeile ist id-prefix-hex:timestamp:snr-times-4",
"repeater_cliHelpNeighborRemove": "Entfernt das erste übereinstimmende Element (über Pubkey-Präfix (hex)) aus der Liste der Nachbarn.", "repeater_cliHelpNeighborRemove": "Entfernt das erste übereinstimmende Element (über Pubkey-Präfix (hex)) aus der Liste der Nachbarn.",
"repeater_cliHelpRegion": "Listet alle definierten Regionen auf.", "repeater_cliHelpRegion": "Listet alle definierten Regionen auf.",
"repeater_cliHelpRegionLoad": "Hinweis: Dies ist ein spezieller Mehrbefehl-Aufruf. Jeder nachfolgende Befehl ist ein Regionsname (eingedruckt mit Leerzeichen zur Angabe der übergeordneten Hierarchie, mit mindestens einem Leerzeichen). Beendet durch das Senden einer Leerzeile/des Befehls.", "repeater_cliHelpRegionLoad": "Hinweis: Dies ist ein spezieller Mehrbefehl-Aufruf. Jeder nachfolgende Befehl ist ein Regionsname (eingeckt mit Leerzeichen zur Angabe der übergeordneten Hierarchie, mit mindestens einem Leerzeichen). Beendet durch das Senden einer Leerzeile.",
"repeater_cliHelpRegionGet": "Sucht die Region mit dem gegebenen Namenspräfix (oder \"\\\" für den globalen Scope) und antwortet mit \"-> region-name (parent-name) 'F'\".", "repeater_cliHelpRegionGet": "Sucht die Region mit dem gegebenen Namenspräfix (oder \"\\\" für den globalen Scope) und antwortet mit \"-> region-name (parent-name) 'F'\".",
"repeater_cliHelpRegionPut": "Fügt eine Region-Definition mit dem angegebenen Namen hinzu oder aktualisiert diese.", "repeater_cliHelpRegionPut": "Fügt eine Region-Definition mit dem angegebenen Namen hinzu oder aktualisiert diese.",
"repeater_cliHelpRegionRemove": "Löscht eine Regiondefinition mit dem angegebenen Namen. (muss genau übereinstimmen und keine Kindregionen haben)", "repeater_cliHelpRegionRemove": "Löscht eine Regiondefinition mit dem angegebenen Namen. (muss genau übereinstimmen und keine Kindregionen haben)",
@@ -1243,7 +1238,7 @@
"channelPath_otherObservedPaths": "Sonstige beobachtete Pfade", "channelPath_otherObservedPaths": "Sonstige beobachtete Pfade",
"channelPath_repeaterHops": "Repeater-Sprünge", "channelPath_repeaterHops": "Repeater-Sprünge",
"channelPath_noHopDetails": "Die Detailangaben für dieses Paket sind nicht verfügbar.", "channelPath_noHopDetails": "Die Detailangaben für dieses Paket sind nicht verfügbar.",
"channelPath_messageDetails": "Nachrichtsdetails", "channelPath_messageDetails": "Nachrichtendetails",
"channelPath_senderLabel": "Sender", "channelPath_senderLabel": "Sender",
"channelPath_timeLabel": "Zeit", "channelPath_timeLabel": "Zeit",
"channelPath_repeatsLabel": "Wiederholungen", "channelPath_repeatsLabel": "Wiederholungen",
@@ -1347,7 +1342,7 @@
"listFilter_users": "Benutzer", "listFilter_users": "Benutzer",
"listFilter_repeaters": "Repeater", "listFilter_repeaters": "Repeater",
"listFilter_roomServers": "Raumserver", "listFilter_roomServers": "Raumserver",
"listFilter_unreadOnly": "Nur nicht gelesen", "listFilter_unreadOnly": "Nicht gelesen",
"listFilter_newGroup": "Neue Gruppe", "listFilter_newGroup": "Neue Gruppe",
"@neighbors_errorLoading": { "@neighbors_errorLoading": {
"placeholders": { "placeholders": {
@@ -1358,11 +1353,11 @@
}, },
"repeater_neighbours": "Nachbarn", "repeater_neighbours": "Nachbarn",
"repeater_neighboursSubtitle": "Anzahl der Hop-Nachbarn anzeigen.", "repeater_neighboursSubtitle": "Anzahl der Hop-Nachbarn anzeigen.",
"neighbors_receivedData": "Empfangene Nachbarendaten", "neighbors_receivedData": "Empfangene Nachbarsdaten",
"neighbors_requestTimedOut": "Nachbarn melden zeitweise Ausfall.", "neighbors_requestTimedOut": "Anfrage durch Timeout fehlgeschlagen.",
"neighbors_errorLoading": "Fehler beim Laden der Nachbarn: {error}", "neighbors_errorLoading": "Fehler beim Laden der Nachbarn: {error}",
"neighbors_repeatersNeighbours": "Nachbarn", "neighbors_repeatersNeighbours": "Nachbarn",
"neighbors_noData": "Keine Nachbardaten verfügbar.", "neighbors_noData": "Keine Nachbarsdaten verfügbar.",
"channels_joinPrivateChannel": "Treten Sie einem privaten Kanal bei", "channels_joinPrivateChannel": "Treten Sie einem privaten Kanal bei",
"channels_joinPrivateChannelDesc": "Manuelle Eingabe eines geheimen Schlüssels.", "channels_joinPrivateChannelDesc": "Manuelle Eingabe eines geheimen Schlüssels.",
"channels_createPrivateChannel": "Erstelle einen privaten Kanal", "channels_createPrivateChannel": "Erstelle einen privaten Kanal",
@@ -1389,8 +1384,8 @@
} }
} }
}, },
"neighbors_heardAgo": "Hörte: {time} vor her.", "neighbors_heardAgo": "Gehört vor: {time}",
"neighbors_unknownContact": "Unbekannte {pubkey}", "neighbors_unknownContact": "Unbekannt {pubkey}",
"settings_locationGPSEnable": "GPS aktivieren", "settings_locationGPSEnable": "GPS aktivieren",
"settings_locationGPSEnableSubtitle": "Aktiviert GPS zur automatischen Aktualisierung des Standorts.", "settings_locationGPSEnableSubtitle": "Aktiviert GPS zur automatischen Aktualisierung des Standorts.",
"settings_locationIntervalSec": "Intervall für GPS (Sekunden)", "settings_locationIntervalSec": "Intervall für GPS (Sekunden)",
@@ -1493,9 +1488,9 @@
"community_deleted": "Community \"{name}\" verlassen", "community_deleted": "Community \"{name}\" verlassen",
"community_addHashtagChannel": "Füge einen Community-Hashtag hinzu", "community_addHashtagChannel": "Füge einen Community-Hashtag hinzu",
"community_addHashtagChannelDesc": "Füge einen Hashtag-Kanal für diese Community hinzu", "community_addHashtagChannelDesc": "Füge einen Hashtag-Kanal für diese Community hinzu",
"community_selectCommunity": "Wählen Sie Community", "community_selectCommunity": "Wählen Sie eine Community",
"community_regularHashtag": "Regulärer Hashtag", "community_regularHashtag": "Regulärer Hashtag",
"community_regularHashtagDesc": "Öffentliches Hashtag (jeder kann teilnehmen)", "community_regularHashtagDesc": "Öffentlicher Hashtag (jeder kann teilnehmen)",
"community_communityHashtagDesc": "Nur für Mitglieder der Community", "community_communityHashtagDesc": "Nur für Mitglieder der Community",
"community_forCommunity": "Für {name}", "community_forCommunity": "Für {name}",
"community_communityHashtag": "Community Hashtag", "community_communityHashtag": "Community Hashtag",
@@ -1559,59 +1554,75 @@
"appSettings_languageUk": "Ukrainisch", "appSettings_languageUk": "Ukrainisch",
"contacts_contactImported": "Kontakt wurde importiert.", "contacts_contactImported": "Kontakt wurde importiert.",
"contacts_contactImportFailed": "Kontakt konnte nicht importiert werden", "contacts_contactImportFailed": "Kontakt konnte nicht importiert werden",
"contacts_zeroHopAdvert": "Zero-Hop-Anzeige", "contacts_zeroHopAdvert": "Zero-Hop-Ankündigung",
"contacts_floodAdvert": "Überflutungsanzeige", "contacts_floodAdvert": "Flut-Ankündigung",
"contacts_addContactFromClipboard": "Kontakt aus Zwischenablage hinzufügen", "contacts_addContactFromClipboard": "Kontakt aus Zwischenablage hinzufügen",
"contacts_ShareContactZeroHop": "Kontakt über Anzeige teilen", "contacts_ShareContactZeroHop": "Kontakt über Anzeige teilen",
"contacts_copyAdvertToClipboard": "Werbung in die Zwischenablage kopieren", "contacts_copyAdvertToClipboard": "Ankündigung in die Zwischenablage kopieren",
"contacts_ShareContact": "Kontakt in die Zwischenablage kopieren", "contacts_ShareContact": "Kontakt in die Zwischenablage kopieren",
"contacts_zeroHopContactAdvertFailed": "Kontakt konnte nicht gesendet werden.", "contacts_zeroHopContactAdvertFailed": "Kontakt konnte nicht gesendet werden.",
"contacts_zeroHopContactAdvertSent": "Kontakt über Anzeige gesendet", "contacts_zeroHopContactAdvertSent": "Kontakt über Anzeige gesendet",
"contacts_contactAdvertCopied": "Anzeige in die Zwischenablage kopiert.", "contacts_contactAdvertCopied": "Anzeige in die Zwischenablage kopiert.",
"contacts_contactAdvertCopyFailed": "Kopieren des Werbeinhalts in die Zwischenablage fehlgeschlagen.", "contacts_contactAdvertCopyFailed": "Kopieren der Ankündigung in die Zwischenablage fehlgeschlagen.",
"notification_activityTitle": "MeshCore Aktivität", "notification_activityTitle": "MeshCore Aktivität",
"notification_messagesCount": "{count} {count, plural, =1{Nachricht} other{Nachrichten}}", "notification_messagesCount": "{count} {count, plural, =1{Nachricht} other{Nachrichten}}",
"@notification_messagesCount": { "@notification_messagesCount": {
"placeholders": { "placeholders": {
"count": {"type": "int"} "count": {
"type": "int"
}
} }
}, },
"notification_channelMessagesCount": "{count} {count, plural, =1{Kanalnachricht} other{Kanalnachrichten}}", "notification_channelMessagesCount": "{count} {count, plural, =1{Kanalnachricht} other{Kanalnachrichten}}",
"@notification_channelMessagesCount": { "@notification_channelMessagesCount": {
"placeholders": { "placeholders": {
"count": {"type": "int"} "count": {
"type": "int"
}
} }
}, },
"notification_newNodesCount": "{count} {count, plural, =1{neuer Knoten} other{neue Knoten}}", "notification_newNodesCount": "{count} {count, plural, =1{neuer Knoten} other{neue Knoten}}",
"@notification_newNodesCount": { "@notification_newNodesCount": {
"placeholders": { "placeholders": {
"count": {"type": "int"} "count": {
"type": "int"
}
} }
}, },
"notification_newTypeDiscovered": "Neuer {contactType} entdeckt", "notification_newTypeDiscovered": "Neuer {contactType} entdeckt",
"@notification_newTypeDiscovered": { "@notification_newTypeDiscovered": {
"placeholders": { "placeholders": {
"contactType": {"type": "String"} "contactType": {
"type": "String"
}
} }
}, },
"notification_receivedNewMessage": "Neue Nachricht empfangen", "notification_receivedNewMessage": "Neue Nachricht empfangen",
"contacts_contactAdvertCopyFailed": "Kopieren des Werbeinhalts in die Zwischenablage fehlgeschlagen.", "settings_gpxExportAll": "Alle Knoten als GPX exportieren",
"settings_gpxExportAll": "Alle Kontakte nach GPX exportieren", "settings_gpxExportAllSubtitle": "Exportiert alle Knoten mit einem Standort in eine GPX-Datei.",
"settings_gpxExportAllSubtitle": "Exportiert alle Kontakte mit einem Standort in eine GPX-Datei.", "settings_gpxExportRepeaters": "Repeater und Raumserver als GPX exportieren",
"settings_gpxExportRepeaters": "Repeater und Raumserver nach GPX exportieren", "settings_gpxExportContacts": "Kontakte als GPX exportieren",
"settings_gpxExportContacts": "Begleiter nach GPX exportieren",
"settings_gpxExportRepeatersSubtitle": "Exportiert Repeater und Raumserver mit einem Standort in eine GPX-Datei.", "settings_gpxExportRepeatersSubtitle": "Exportiert Repeater und Raumserver mit einem Standort in eine GPX-Datei.",
"settings_gpxExportContactsSubtitle": "Exportiert Begleiter mit einem Ort in eine GPX-Datei.", "settings_gpxExportContactsSubtitle": "Exportiert Kontakte mit einem Ort in eine GPX-Datei.",
"settings_gpxExportRepeatersRoom": "Repeater- und Raumserver-Standorte", "settings_gpxExportRepeatersRoom": "Repeater- und Raumserver-Standorte",
"settings_gpxExportChat": "Begleiterstandorte", "settings_gpxExportChat": "Kontaktstandorte",
"settings_gpxExportNoContacts": "Keine Kontakte zum Exportieren.", "settings_gpxExportNoContacts": "Keine Kontakte zum Exportieren.",
"settings_gpxExportError": "Beim Export ist ein Fehler aufgetreten.", "settings_gpxExportError": "Beim Export ist ein Fehler aufgetreten.",
"settings_gpxExportNotAvailable": "Nicht auf Ihrem Gerät/Betriebssystem unterstützt", "settings_gpxExportNotAvailable": "Nicht auf Ihrem Gerät/Betriebssystem unterstützt",
"settings_gpxExportSuccess": "Erfolgreich GPX-Datei exportiert.", "settings_gpxExportSuccess": "GPX-Datei erfolgreich exportiert.",
"settings_gpxExportAllContacts": "Alle Kontaktstandorte", "settings_gpxExportAllContacts": "Alle Kontaktstandorte",
"settings_gpxExportShareSubject": "meshcore-open GPX-Kartendaten exportieren", "settings_gpxExportShareSubject": "GPX-Kartendaten aus meshcore-open exportieren",
"settings_gpxExportShareText": "Kartendaten aus meshcore-open exportiert", "settings_gpxExportShareText": "GPX-Kartendaten aus meshcore-open exportiert",
"pathTrace_someHopsNoLocation": "Eine oder mehrere der Hopfen fehlen einen Standort!" "pathTrace_someHopsNoLocation": "Bei einer oder mehreren Knoten fehlt der Standort!",
"map_removeLast": "Letztes Entfernen",
"map_tapToAdd": "Tippen Sie auf Knoten, um sie zum Pfad hinzuzufügen.",
"map_runTrace": "Pfadverlauf ausführen",
"pathTrace_clearTooltip": "Pfad löschen",
"map_pathTraceCancelled": "Pfadverfolgung abgebrochen.",
"scanner_bluetoothOffMessage": "Bitte aktivieren Sie Bluetooth, um nach Geräten zu suchen.",
"scanner_bluetoothOff": "Bluetooth ist deaktiviert.",
"scanner_enableBluetooth": "Bluetooth aktivieren",
"settings_clientRepeat": "Wiederholung, ohne Stromanschluss",
"settings_clientRepeatFreqWarning": "Die Kommunikation ohne Stromversorgung erfordert Frequenzen von 433, 869 oder 918 MHz.",
"settings_clientRepeatSubtitle": "Ermöglichen Sie diesem Gerät, Mesh-Pakete für andere zu wiederholen."
} }
+406 -169
View File
File diff suppressed because it is too large Load Diff
+24 -13
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Número de contactos", "settings_infoContactsCount": "Número de contactos",
"settings_infoChannelCount": "Número de canales", "settings_infoChannelCount": "Número de canales",
"settings_presets": "Preajustes", "settings_presets": "Preajustes",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Frecuencia (MHz)", "settings_frequency": "Frecuencia (MHz)",
"settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyHelper": "300,0 - 2500,0",
"settings_frequencyInvalid": "Frecuencia inválida (300-2500 MHz)", "settings_frequencyInvalid": "Frecuencia inválida (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX Potencia (dBm)", "settings_txPower": "TX Potencia (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Potencia de TX inválida (0-22 dBm)", "settings_txPowerInvalid": "Potencia de TX inválida (0-22 dBm)",
"settings_longRange": "Largo Alcance",
"settings_fastSpeed": "Velocidad Rápida",
"settings_error": "Error: {message}", "settings_error": "Error: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1569,34 +1564,40 @@
"contacts_zeroHopContactAdvertSent": "Envió contacto por anuncio.", "contacts_zeroHopContactAdvertSent": "Envió contacto por anuncio.",
"contacts_contactAdvertCopied": "Anuncio copiado al Portapapeles.", "contacts_contactAdvertCopied": "Anuncio copiado al Portapapeles.",
"contacts_contactAdvertCopyFailed": "Copiar anuncio al Portapapeles ha fallado.", "contacts_contactAdvertCopyFailed": "Copiar anuncio al Portapapeles ha fallado.",
"notification_activityTitle": "Actividad de MeshCore", "notification_activityTitle": "Actividad de MeshCore",
"notification_messagesCount": "{count} {count, plural, =1{mensaje} other{mensajes}}", "notification_messagesCount": "{count} {count, plural, =1{mensaje} other{mensajes}}",
"@notification_messagesCount": { "@notification_messagesCount": {
"placeholders": { "placeholders": {
"count": {"type": "int"} "count": {
"type": "int"
}
} }
}, },
"notification_channelMessagesCount": "{count} {count, plural, =1{mensaje de canal} other{mensajes de canal}}", "notification_channelMessagesCount": "{count} {count, plural, =1{mensaje de canal} other{mensajes de canal}}",
"@notification_channelMessagesCount": { "@notification_channelMessagesCount": {
"placeholders": { "placeholders": {
"count": {"type": "int"} "count": {
"type": "int"
}
} }
}, },
"notification_newNodesCount": "{count} {count, plural, =1{nuevo nodo} other{nuevos nodos}}", "notification_newNodesCount": "{count} {count, plural, =1{nuevo nodo} other{nuevos nodos}}",
"@notification_newNodesCount": { "@notification_newNodesCount": {
"placeholders": { "placeholders": {
"count": {"type": "int"} "count": {
"type": "int"
}
} }
}, },
"notification_newTypeDiscovered": "Nuevo {contactType} descubierto", "notification_newTypeDiscovered": "Nuevo {contactType} descubierto",
"@notification_newTypeDiscovered": { "@notification_newTypeDiscovered": {
"placeholders": { "placeholders": {
"contactType": {"type": "String"} "contactType": {
"type": "String"
}
} }
}, },
"notification_receivedNewMessage": "Nuevo mensaje recibido", "notification_receivedNewMessage": "Nuevo mensaje recibido",
"contacts_contactAdvertCopyFailed": "Copiar anuncio al Portapapeles ha fallado.",
"settings_gpxExportContactsSubtitle": "Exporta compañeros con una ubicación a archivo GPX.", "settings_gpxExportContactsSubtitle": "Exporta compañeros con una ubicación a archivo GPX.",
"settings_gpxExportRepeaters": "Exportar repetidores / servidor de sala a GPX", "settings_gpxExportRepeaters": "Exportar repetidores / servidor de sala a GPX",
"settings_gpxExportSuccess": "Archivo GPX exportado con éxito.", "settings_gpxExportSuccess": "Archivo GPX exportado con éxito.",
@@ -1612,6 +1613,16 @@
"settings_gpxExportAllContacts": "Todas las ubicaciones de contactos", "settings_gpxExportAllContacts": "Todas las ubicaciones de contactos",
"settings_gpxExportShareText": "Datos del mapa exportados desde meshcore-open", "settings_gpxExportShareText": "Datos del mapa exportados desde meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open exportación de datos de mapa GPX", "settings_gpxExportShareSubject": "meshcore-open exportación de datos de mapa GPX",
"pathTrace_someHopsNoLocation": "Uno o más de los lúpulos carecen de una ubicación" "pathTrace_someHopsNoLocation": "Uno o más de los lúpulos carecen de una ubicación",
"pathTrace_clearTooltip": "Borrar ruta",
"map_runTrace": "Ejecutar Rastreo de Ruta",
"map_tapToAdd": "Pulse en los nodos para agregarlos al camino.",
"map_removeLast": "Eliminar último",
"map_pathTraceCancelled": "Rastreo de ruta cancelado.",
"scanner_bluetoothOffMessage": "Por favor, active el Bluetooth para escanear dispositivos.",
"scanner_bluetoothOff": "Bluetooth está desactivado.",
"scanner_enableBluetooth": "Habilitar Bluetooth",
"settings_clientRepeatFreqWarning": "Para la comunicación fuera de la red, se requiere una frecuencia de 433, 869 o 918 MHz.",
"settings_clientRepeat": "Repetir sin conexión",
"settings_clientRepeatSubtitle": "Permita que este dispositivo repita los paquetes de red para otros usuarios."
} }
+46 -42
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Nombre de contacts", "settings_infoContactsCount": "Nombre de contacts",
"settings_infoChannelCount": "Nombre de canaux", "settings_infoChannelCount": "Nombre de canaux",
"settings_presets": "Préréglages", "settings_presets": "Préréglages",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Fréquence (MHz)", "settings_frequency": "Fréquence (MHz)",
"settings_frequencyHelper": "300,0 - 2 500,0", "settings_frequencyHelper": "300,0 - 2 500,0",
"settings_frequencyInvalid": "Fréquence invalide (300-2500 MHz)", "settings_frequencyInvalid": "Fréquence invalide (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX Puissance (dBm)", "settings_txPower": "TX Puissance (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Puissance TX invalide (0-22 dBm)", "settings_txPowerInvalid": "Puissance TX invalide (0-22 dBm)",
"settings_longRange": "Portée Longue",
"settings_fastSpeed": "Vitesse Rapide",
"settings_error": "Erreur : {message}", "settings_error": "Erreur : {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -210,8 +205,8 @@
"appSettings_batteryLifepo4": "LiFePO4 (2,6-3,65V)", "appSettings_batteryLifepo4": "LiFePO4 (2,6-3,65V)",
"appSettings_batteryLipo": "LiPo (3,0-4,2V)", "appSettings_batteryLipo": "LiPo (3,0-4,2V)",
"appSettings_mapDisplay": "Affichage de la carte", "appSettings_mapDisplay": "Affichage de la carte",
"appSettings_showRepeaters": "Afficher les répétiteurs", "appSettings_showRepeaters": "Afficher les répéteurs",
"appSettings_showRepeatersSubtitle": "Afficher les nœuds répétiteurs sur la carte", "appSettings_showRepeatersSubtitle": "Afficher les nœuds répéteurs sur la carte",
"appSettings_showChatNodes": "Afficher les nœuds de discussion", "appSettings_showChatNodes": "Afficher les nœuds de discussion",
"appSettings_showChatNodesSubtitle": "Afficher les nœuds de chat sur la carte", "appSettings_showChatNodesSubtitle": "Afficher les nœuds de chat sur la carte",
"appSettings_showOtherNodes": "Afficher d'autres nœuds", "appSettings_showOtherNodes": "Afficher d'autres nœuds",
@@ -266,7 +261,7 @@
} }
} }
}, },
"contacts_manageRepeater": "Gérer le répétiteur", "contacts_manageRepeater": "Gérer le répéteur",
"contacts_roomLogin": "Connexion Salle", "contacts_roomLogin": "Connexion Salle",
"contacts_openChat": "Ouverture du Chat", "contacts_openChat": "Ouverture du Chat",
"contacts_editGroup": "Modifier le groupe", "contacts_editGroup": "Modifier le groupe",
@@ -542,9 +537,9 @@
"chat_forceFloodMode": "Mode tout le réseau forcé", "chat_forceFloodMode": "Mode tout le réseau forcé",
"chat_recentAckPaths": "Chemins ACK récents (touchez pour utiliser) :", "chat_recentAckPaths": "Chemins ACK récents (touchez pour utiliser) :",
"chat_pathHistoryFull": "L'historique du chemin est plein. Supprimez les entrées pour en ajouter de nouvelles.", "chat_pathHistoryFull": "L'historique du chemin est plein. Supprimez les entrées pour en ajouter de nouvelles.",
"chat_hopSingular": "Sautez", "chat_hopSingular": "saut",
"chat_hopPlural": "sautez", "chat_hopPlural": "sauts",
"chat_hopsCount": "{count} {count, plural, =1{hop} other{hops}}", "chat_hopsCount": "{count} {count, plural, =1{saut} other{sauts}}",
"@chat_hopsCount": { "@chat_hopsCount": {
"placeholders": { "placeholders": {
"count": { "count": {
@@ -636,7 +631,7 @@
} }
}, },
"map_chat": "Chat", "map_chat": "Chat",
"map_repeater": "Répétiteur", "map_repeater": "Répéteur",
"map_room": "Salle", "map_room": "Salle",
"map_sensor": "Capteur", "map_sensor": "Capteur",
"map_pinDm": "Clé (DM)", "map_pinDm": "Clé (DM)",
@@ -677,7 +672,7 @@
"map_lastSeenTime": "Dernière fois vu", "map_lastSeenTime": "Dernière fois vu",
"map_sharedPin": "Clé partagée", "map_sharedPin": "Clé partagée",
"map_joinRoom": "Rejoindre la salle", "map_joinRoom": "Rejoindre la salle",
"map_manageRepeater": "Gérer le répétiteur", "map_manageRepeater": "Gérer le répéteur",
"mapCache_title": "Cache de Carte Hors Ligne", "mapCache_title": "Cache de Carte Hors Ligne",
"mapCache_selectAreaFirst": "Sélectionner une zone pour la mise en cache en premier", "mapCache_selectAreaFirst": "Sélectionner une zone pour la mise en cache en premier",
"mapCache_noTilesToDownload": "Aucun tuilage à télécharger pour cette zone.", "mapCache_noTilesToDownload": "Aucun tuilage à télécharger pour cette zone.",
@@ -800,13 +795,13 @@
"time_allTime": "Tout le temps", "time_allTime": "Tout le temps",
"dialog_disconnect": "Déconnecter", "dialog_disconnect": "Déconnecter",
"dialog_disconnectConfirm": "Êtes-vous sûr de vouloir vous déconnecter de cet appareil ?", "dialog_disconnectConfirm": "Êtes-vous sûr de vouloir vous déconnecter de cet appareil ?",
"login_repeaterLogin": "Connexion au répétiteur", "login_repeaterLogin": "Connexion au répéteur",
"login_roomLogin": "Connexion Salle", "login_roomLogin": "Connexion Salle",
"login_password": "Mot de passe", "login_password": "Mot de passe",
"login_enterPassword": "Entrez votre mot de passe", "login_enterPassword": "Entrez votre mot de passe",
"login_savePassword": "Sauvegarder le mot de passe", "login_savePassword": "Sauvegarder le mot de passe",
"login_savePasswordSubtitle": "Le mot de passe sera stocké en toute sécurité sur cet appareil.", "login_savePasswordSubtitle": "Le mot de passe sera stocké en toute sécurité sur cet appareil.",
"login_repeaterDescription": "Entrez le mot de passe du répétiteur pour accéder aux paramètres et à l'état.", "login_repeaterDescription": "Entrez le mot de passe du répéteur pour accéder aux paramètres et à l'état.",
"login_roomDescription": "Entrez le mot de passe de la pièce pour accéder aux paramètres et à l'état.", "login_roomDescription": "Entrez le mot de passe de la pièce pour accéder aux paramètres et à l'état.",
"login_routing": "Redirection", "login_routing": "Redirection",
"login_routingMode": "Mode de routage", "login_routingMode": "Mode de routage",
@@ -871,17 +866,17 @@
}, },
"path_tooLong": "Le chemin est trop long. Maximum 64 sauts autorisés.", "path_tooLong": "Le chemin est trop long. Maximum 64 sauts autorisés.",
"path_setPath": "Définir le chemin", "path_setPath": "Définir le chemin",
"repeater_management": "Gestion des répétiteurs", "repeater_management": "Gestion des répéteurs",
"repeater_managementTools": "Outils de Gestion", "repeater_managementTools": "Outils de Gestion",
"repeater_status": "État", "repeater_status": "État",
"repeater_statusSubtitle": "Afficher l'état, les statistiques et les voisins du répétiteur", "repeater_statusSubtitle": "Afficher l'état, les statistiques et les voisins du répéteur",
"repeater_telemetry": "Télémetrie", "repeater_telemetry": "Télémetrie",
"repeater_telemetrySubtitle": "Afficher la télémétrie des capteurs et les statistiques du système", "repeater_telemetrySubtitle": "Afficher la télémétrie des capteurs et les statistiques du système",
"repeater_cli": "CLI", "repeater_cli": "CLI",
"repeater_cliSubtitle": "Envoyer des commandes au répétiteur", "repeater_cliSubtitle": "Envoyer des commandes au répéteur",
"repeater_settings": "Paramètres", "repeater_settings": "Paramètres",
"repeater_settingsSubtitle": "Configurer les paramètres du répétiteur", "repeater_settingsSubtitle": "Configurer les paramètres du répéteur",
"repeater_statusTitle": "État du répétiteur", "repeater_statusTitle": "État du répéteur",
"repeater_routingMode": "Mode de routage", "repeater_routingMode": "Mode de routage",
"repeater_autoUseSavedPath": "Auto (utiliser le chemin sauvegardé)", "repeater_autoUseSavedPath": "Auto (utiliser le chemin sauvegardé)",
"repeater_forceFloodMode": "Mode tout le réseau forcé", "repeater_forceFloodMode": "Mode tout le réseau forcé",
@@ -976,10 +971,10 @@
} }
} }
}, },
"repeater_settingsTitle": "Paramètres du répétiteur", "repeater_settingsTitle": "Paramètres du répéteur",
"repeater_basicSettings": "Paramètres de base", "repeater_basicSettings": "Paramètres de base",
"repeater_repeaterName": "Nom du répétiteur", "repeater_repeaterName": "Nom du répéteur",
"repeater_repeaterNameHelper": "Afficher le nom de ce répétiteur", "repeater_repeaterNameHelper": "Afficher le nom de ce répéteur",
"repeater_adminPassword": "Mot de passe Administrateur", "repeater_adminPassword": "Mot de passe Administrateur",
"repeater_adminPasswordHelper": "Mot de passe d'accès complet", "repeater_adminPasswordHelper": "Mot de passe d'accès complet",
"repeater_guestPassword": "Mot de passe invité", "repeater_guestPassword": "Mot de passe invité",
@@ -999,7 +994,7 @@
"repeater_longitudeHelper": "Degrés décimaux (par exemple, -122,4194)", "repeater_longitudeHelper": "Degrés décimaux (par exemple, -122,4194)",
"repeater_features": "Fonctionnalités", "repeater_features": "Fonctionnalités",
"repeater_packetForwarding": "Transfert de paquets", "repeater_packetForwarding": "Transfert de paquets",
"repeater_packetForwardingSubtitle": "Activer le répétiteur pour transmettre des paquets", "repeater_packetForwardingSubtitle": "Activer le répéteur pour transmettre des paquets",
"repeater_guestAccess": "Accès Invité", "repeater_guestAccess": "Accès Invité",
"repeater_guestAccessSubtitle": "Autoriser l'accès invité en lecture seule", "repeater_guestAccessSubtitle": "Autoriser l'accès invité en lecture seule",
"repeater_privacyMode": "Mode de confidentialité", "repeater_privacyMode": "Mode de confidentialité",
@@ -1026,14 +1021,14 @@
"repeater_encryptedAdvertInterval": "Intervalle d'annonces cryptées", "repeater_encryptedAdvertInterval": "Intervalle d'annonces cryptées",
"repeater_dangerZone": "Zone dangereuse", "repeater_dangerZone": "Zone dangereuse",
"repeater_rebootRepeater": "Redémarrer Répéteur", "repeater_rebootRepeater": "Redémarrer Répéteur",
"repeater_rebootRepeaterSubtitle": "Réinitialiser l'appareil répétiteur", "repeater_rebootRepeaterSubtitle": "Réinitialiser l'appareil répéteur",
"repeater_rebootRepeaterConfirm": "Êtes-vous sûr de vouloir redémarrer ce répétiteur ?", "repeater_rebootRepeaterConfirm": "Êtes-vous sûr de vouloir redémarrer ce répéteur ?",
"repeater_regenerateIdentityKey": "Ré générer la clé d'identité", "repeater_regenerateIdentityKey": "Ré générer la clé d'identité",
"repeater_regenerateIdentityKeySubtitle": "Générer une nouvelle paire de clés publique/privée", "repeater_regenerateIdentityKeySubtitle": "Générer une nouvelle paire de clés publique/privée",
"repeater_regenerateIdentityKeyConfirm": "Cela générera une nouvelle identité pour le répétiteur. Continuer ?", "repeater_regenerateIdentityKeyConfirm": "Cela générera une nouvelle identité pour le répéteur. Continuer ?",
"repeater_eraseFileSystem": "Supprimer le système de fichiers", "repeater_eraseFileSystem": "Supprimer le système de fichiers",
"repeater_eraseFileSystemSubtitle": "Formater le système de fichiers du répétiteur", "repeater_eraseFileSystemSubtitle": "Formater le système de fichiers du répéteur",
"repeater_eraseFileSystemConfirm": "AVERTISSEMENT : Cela effacera toutes les données du répétiteur. Cela ne peut pas être annulé !", "repeater_eraseFileSystemConfirm": "AVERTISSEMENT : Cela effacera toutes les données du répéteur. Cela ne peut pas être annulé !",
"repeater_eraseSerialOnly": "Erase n'est disponible que via la console série.", "repeater_eraseSerialOnly": "Erase n'est disponible que via la console série.",
"repeater_commandSent": "Commande envoyée : {command}", "repeater_commandSent": "Commande envoyée : {command}",
"@repeater_commandSent": { "@repeater_commandSent": {
@@ -1085,7 +1080,7 @@
} }
} }
}, },
"repeater_cliTitle": "Répétiteur CLI", "repeater_cliTitle": "Répéteur CLI",
"repeater_debugNextCommand": "Déboguer Prochaine Commande", "repeater_debugNextCommand": "Déboguer Prochaine Commande",
"repeater_commandHelp": "Aide", "repeater_commandHelp": "Aide",
"repeater_clearHistory": "Effacer l'historique", "repeater_clearHistory": "Effacer l'historique",
@@ -1119,13 +1114,13 @@
"repeater_cliHelpClearStats": "Réinitialise divers compteurs de statistiques à zéro.", "repeater_cliHelpClearStats": "Réinitialise divers compteurs de statistiques à zéro.",
"repeater_cliHelpSetAf": "Définit le facteur de temps d'air.", "repeater_cliHelpSetAf": "Définit le facteur de temps d'air.",
"repeater_cliHelpSetTx": "Définit la puissance de transmission LoRa en dBm (réinitialisation requise pour appliquer).", "repeater_cliHelpSetTx": "Définit la puissance de transmission LoRa en dBm (réinitialisation requise pour appliquer).",
"repeater_cliHelpSetRepeat": "Active ou désactive le rôle du répétiteur pour ce nœud.", "repeater_cliHelpSetRepeat": "Active ou désactive le rôle du répéteur pour ce nœud.",
"repeater_cliHelpSetAllowReadOnly": "(Room server) Si \"activé\", alors un mot de passe vide permettra la connexion, mais ne permettra pas de publier dans la pièce. (lecture seule uniquement)", "repeater_cliHelpSetAllowReadOnly": "(Room server) Si \"activé\", alors un mot de passe vide permettra la connexion, mais ne permettra pas de publier dans la pièce. (lecture seule uniquement)",
"repeater_cliHelpSetFloodMax": "Définit le nombre maximal de sauts pour les paquets de balayage entrants (si >= max, le paquet n'est pas acheminé).", "repeater_cliHelpSetFloodMax": "Définit le nombre maximal de sauts pour les paquets de balayage entrants (si >= max, le paquet n'est pas acheminé).",
"repeater_cliHelpSetIntThresh": "Définit le seuil d'interférence (en dB). La valeur par défaut est de 14. Définir sur 0 désactive la détection des interférences de canal.", "repeater_cliHelpSetIntThresh": "Définit le seuil d'interférence (en dB). La valeur par défaut est de 14. Définir sur 0 désactive la détection des interférences de canal.",
"repeater_cliHelpSetAgcResetInterval": "Définit l'intervalle pour réinitialiser le contrôleur de gain automatique. Mettez à 0 pour désactiver.", "repeater_cliHelpSetAgcResetInterval": "Définit l'intervalle pour réinitialiser le contrôleur de gain automatique. Mettez à 0 pour désactiver.",
"repeater_cliHelpSetMultiAcks": "Active ou désactive la fonctionnalité « double ACKs ».", "repeater_cliHelpSetMultiAcks": "Active ou désactive la fonctionnalité « double ACKs ».",
"repeater_cliHelpSetAdvertInterval": "Définit l'intervalle du minuteur pour envoyer un paquet d'annonce local (sans relais). Définir sur 0 pour désactiver.", "repeater_cliHelpSetAdvertInterval": "Définit l'intervalle entre chaque émission d'une annonce locale (sans relais). Définir sur 0 pour désactiver.",
"repeater_cliHelpSetFloodAdvertInterval": "Définit l'intervalle du minuteur en heures pour envoyer un paquet d'annonce massive. Définir sur 0 pour désactiver.", "repeater_cliHelpSetFloodAdvertInterval": "Définit l'intervalle du minuteur en heures pour envoyer un paquet d'annonce massive. Définir sur 0 pour désactiver.",
"repeater_cliHelpSetGuestPassword": "Définit/met à jour le mot de passe de l'invité. (pour les répéteurs, les connexions d'invités peuvent envoyer la requête \"Get Stats\")", "repeater_cliHelpSetGuestPassword": "Définit/met à jour le mot de passe de l'invité. (pour les répéteurs, les connexions d'invités peuvent envoyer la requête \"Get Stats\")",
"repeater_cliHelpSetName": "Définit le nom de l'annonce.", "repeater_cliHelpSetName": "Définit le nom de l'annonce.",
@@ -1147,7 +1142,7 @@
"repeater_cliHelpLogStart": "Démarre l'enregistrement des paquets dans le système de fichiers.", "repeater_cliHelpLogStart": "Démarre l'enregistrement des paquets dans le système de fichiers.",
"repeater_cliHelpLogStop": "Arrêter de journaliser les paquets vers le système de fichiers.", "repeater_cliHelpLogStop": "Arrêter de journaliser les paquets vers le système de fichiers.",
"repeater_cliHelpLogErase": "Supprime les journaux de paquets du système de fichiers.", "repeater_cliHelpLogErase": "Supprime les journaux de paquets du système de fichiers.",
"repeater_cliHelpNeighbors": "Affiche une liste d'autres nœuds répétiteurs entendus via des annonces sans relais. Chaque ligne est id-préfixe-hexadécimal:timestamp:snr-fois-4", "repeater_cliHelpNeighbors": "Affiche une liste d'autres nœuds répéteurs entendus via des annonces sans relais. Chaque ligne est id-préfixe-hexadécimal:timestamp:snr-fois-4",
"repeater_cliHelpNeighborRemove": "Supprime la première entrée correspondante (par préfixe de clé publique (hexadécimal)) de la liste des voisins.", "repeater_cliHelpNeighborRemove": "Supprime la première entrée correspondante (par préfixe de clé publique (hexadécimal)) de la liste des voisins.",
"repeater_cliHelpRegion": "(série uniquement) Liste toutes les régions définies et les autorisations actuelles d'annonces sur tout le réseau (flood).", "repeater_cliHelpRegion": "(série uniquement) Liste toutes les régions définies et les autorisations actuelles d'annonces sur tout le réseau (flood).",
"repeater_cliHelpRegionLoad": "REMARQUE : il s'agit d'une invocation multi-commande spéciale. Chaque commande subséquente est un nom de région (indenté avec des espaces pour indiquer la hiérarchie parent, avec un minimum d'un espace). Terminé par l'envoi d'une ligne vide/commande.", "repeater_cliHelpRegionLoad": "REMARQUE : il s'agit d'une invocation multi-commande spéciale. Chaque commande subséquente est un nom de région (indenté avec des espaces pour indiquer la hiérarchie parent, avec un minimum d'un espace). Terminé par l'envoi d'une ligne vide/commande.",
@@ -1171,8 +1166,8 @@
"repeater_settingsCategory": "Paramètres", "repeater_settingsCategory": "Paramètres",
"repeater_bridge": "Pont", "repeater_bridge": "Pont",
"repeater_logging": "Journalisation", "repeater_logging": "Journalisation",
"repeater_neighborsRepeaterOnly": "Voisins (Uniquement répétiteur)", "repeater_neighborsRepeaterOnly": "Voisins (Uniquement répéteur)",
"repeater_regionManagementRepeaterOnly": "Gestion des régions (uniquement pour le répétiteur)", "repeater_regionManagementRepeaterOnly": "Gestion des régions (uniquement pour le répéteur)",
"repeater_regionNote": "Les commandes de région ont été introduites pour gérer les définitions et les autorisations des régions.", "repeater_regionNote": "Les commandes de région ont été introduites pour gérer les définitions et les autorisations des régions.",
"repeater_gpsManagement": "Gestion GPS", "repeater_gpsManagement": "Gestion GPS",
"repeater_gpsNote": "La commande GPS a été introduite pour gérer les sujets liés à la localisation.", "repeater_gpsNote": "La commande GPS a été introduite pour gérer les sujets liés à la localisation.",
@@ -1241,7 +1236,7 @@
"channelPath_title": "Chemin de paquet", "channelPath_title": "Chemin de paquet",
"channelPath_viewMap": "Afficher la carte", "channelPath_viewMap": "Afficher la carte",
"channelPath_otherObservedPaths": "Autres chemins observés", "channelPath_otherObservedPaths": "Autres chemins observés",
"channelPath_repeaterHops": "Sauts du répétiteur", "channelPath_repeaterHops": "Sauts du répéteur",
"channelPath_noHopDetails": "Les détails de l'envoi ne sont pas fournis pour ce paquet.", "channelPath_noHopDetails": "Les détails de l'envoi ne sont pas fournis pour ce paquet.",
"channelPath_messageDetails": "Détails du message", "channelPath_messageDetails": "Détails du message",
"channelPath_senderLabel": "Expéditeur", "channelPath_senderLabel": "Expéditeur",
@@ -1306,7 +1301,7 @@
} }
}, },
"channelPath_mapTitle": "Carte du chemin", "channelPath_mapTitle": "Carte du chemin",
"channelPath_noRepeaterLocations": "Aucune position de répétiteur disponible pour ce chemin.", "channelPath_noRepeaterLocations": "Aucune position de répéteur disponible pour ce chemin.",
"channelPath_primaryPath": "Chemin {index} (Principal)", "channelPath_primaryPath": "Chemin {index} (Principal)",
"@channelPath_primaryPath": { "@channelPath_primaryPath": {
"placeholders": { "placeholders": {
@@ -1558,9 +1553,9 @@
"appSettings_languageRu": "Russe", "appSettings_languageRu": "Russe",
"contacts_clipboardEmpty": "Le presse-papiers est vide.", "contacts_clipboardEmpty": "Le presse-papiers est vide.",
"contacts_contactImported": "Le contact a été importé.", "contacts_contactImported": "Le contact a été importé.",
"contacts_floodAdvert": "Annonce de crue", "contacts_floodAdvert": "Annonce à tout le réseau",
"contacts_contactImportFailed": "Échec de l'importation du contact.", "contacts_contactImportFailed": "Échec de l'importation du contact.",
"contacts_zeroHopAdvert": "Annonce Zero Hop", "contacts_zeroHopAdvert": "Annonce Zero saut",
"contacts_copyAdvertToClipboard": "Copier l'annonce dans le presse-papiers", "contacts_copyAdvertToClipboard": "Copier l'annonce dans le presse-papiers",
"contacts_addContactFromClipboard": "Ajouter un contact depuis le presse-papiers", "contacts_addContactFromClipboard": "Ajouter un contact depuis le presse-papiers",
"contacts_ShareContact": "Copier le contact dans le presse-papiers", "contacts_ShareContact": "Copier le contact dans le presse-papiers",
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{nouveau nœud} other{nouveaux nœuds}}", "notification_newNodesCount": "{count} {count, plural, =1{nouveau nœud} other{nouveaux nœuds}}",
"notification_newTypeDiscovered": "Nouveau {contactType} découvert", "notification_newTypeDiscovered": "Nouveau {contactType} découvert",
"notification_receivedNewMessage": "Nouveau message reçu", "notification_receivedNewMessage": "Nouveau message reçu",
"contacts_zeroHopContactAdvertFailed": "Échec de l'envoi du contact.",
"settings_gpxExportRepeaters": "Exporter les répéteurs / serveur de salle au format GPX", "settings_gpxExportRepeaters": "Exporter les répéteurs / serveur de salle au format GPX",
"settings_gpxExportRepeatersSubtitle": "Exporte les répéteurs / roomserver avec une localisation vers un fichier GPX.", "settings_gpxExportRepeatersSubtitle": "Exporte les répéteurs / roomserver avec une localisation vers un fichier GPX.",
"settings_gpxExportNoContacts": "Aucun contact à exporter.", "settings_gpxExportNoContacts": "Aucun contact à exporter.",
@@ -1591,6 +1585,16 @@
"settings_gpxExportAllContacts": "Tous les emplacements des contacts", "settings_gpxExportAllContacts": "Tous les emplacements des contacts",
"settings_gpxExportShareText": "Données de carte exportées à partir de meshcore-open", "settings_gpxExportShareText": "Données de carte exportées à partir de meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open exporter les données de carte GPX", "settings_gpxExportShareSubject": "meshcore-open exporter les données de carte GPX",
"pathTrace_someHopsNoLocation": "Une ou plusieurs des houblons manquent d'une localisation !" "pathTrace_someHopsNoLocation": "Un ou plusieurs des sauts manquent d'une localisation !",
"map_tapToAdd": "Appuyez sur les nœuds pour les ajouter au chemin.",
"pathTrace_clearTooltip": "Effacer le chemin",
"map_pathTraceCancelled": "Traçage de chemin annulé",
"map_removeLast": "Supprimer le dernier",
"map_runTrace": "Exécuter la traçage de chemin",
"scanner_bluetoothOffMessage": "Veuillez activer le Bluetooth pour rechercher des appareils.",
"scanner_bluetoothOff": "Le Bluetooth est désactivé.",
"scanner_enableBluetooth": "Activer le Bluetooth",
"settings_clientRepeatFreqWarning": "Pour les transmissions hors réseau, il est nécessaire d'utiliser les fréquences de 433, 869 ou 918 MHz.",
"settings_clientRepeatSubtitle": "Permettez à cet appareil de répéter les paquets de données pour les autres.",
"settings_clientRepeat": "Répétition hors réseau"
} }
+12 -8
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Numero contatti", "settings_infoContactsCount": "Numero contatti",
"settings_infoChannelCount": "Numero Canale", "settings_infoChannelCount": "Numero Canale",
"settings_presets": "Preset", "settings_presets": "Preset",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Frequenza (MHz)", "settings_frequency": "Frequenza (MHz)",
"settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyHelper": "300,0 - 2500,0",
"settings_frequencyInvalid": "Frequenza non valida (300-2500 MHz)", "settings_frequencyInvalid": "Frequenza non valida (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX Potenza (dBm)", "settings_txPower": "TX Potenza (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Potere TX non valido (0-22 dBm)", "settings_txPowerInvalid": "Potere TX non valido (0-22 dBm)",
"settings_longRange": "Lungo Raggio",
"settings_fastSpeed": "Velocità Rapida",
"settings_error": "Errore: {message}", "settings_error": "Errore: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{nuovo nodo} other{nuovi nodi}}", "notification_newNodesCount": "{count} {count, plural, =1{nuovo nodo} other{nuovi nodi}}",
"notification_newTypeDiscovered": "Nuovo {contactType} scoperto", "notification_newTypeDiscovered": "Nuovo {contactType} scoperto",
"notification_receivedNewMessage": "Nuovo messaggio ricevuto", "notification_receivedNewMessage": "Nuovo messaggio ricevuto",
"contacts_contactAdvertCopied": "Annuncio copiato negli Appunti.",
"settings_gpxExportRepeaters": "Esporta ripetitori / server di stanza in GPX", "settings_gpxExportRepeaters": "Esporta ripetitori / server di stanza in GPX",
"settings_gpxExportContacts": "Esporta compagni in GPX", "settings_gpxExportContacts": "Esporta compagni in GPX",
"settings_gpxExportSuccess": "Esportazione del file GPX completata con successo.", "settings_gpxExportSuccess": "Esportazione del file GPX completata con successo.",
@@ -1591,6 +1585,16 @@
"settings_gpxExportAllContacts": "Tutte le posizioni dei contatti", "settings_gpxExportAllContacts": "Tutte le posizioni dei contatti",
"settings_gpxExportShareText": "Dati mappa esportati da meshcore-open", "settings_gpxExportShareText": "Dati mappa esportati da meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open esportazione dati mappa GPX", "settings_gpxExportShareSubject": "meshcore-open esportazione dati mappa GPX",
"pathTrace_someHopsNoLocation": "Uno o più dei luppoli mancano di una posizione!" "pathTrace_someHopsNoLocation": "Uno o più dei luppoli mancano di una posizione!",
"map_removeLast": "Rimuovi ultimo",
"map_pathTraceCancelled": "Tracciamento del percorso annullato.",
"pathTrace_clearTooltip": "Pulisci percorso",
"map_runTrace": "Esegui Path Trace",
"map_tapToAdd": "Tocca i nodi per aggiungerli al percorso.",
"scanner_bluetoothOff": "Il Bluetooth è disattivato.",
"scanner_bluetoothOffMessage": "Si prega di attivare il Bluetooth per effettuare la scansione dei dispositivi.",
"scanner_enableBluetooth": "Abilita il Bluetooth",
"settings_clientRepeat": "Ripetizione \"fuori dalla rete\"",
"settings_clientRepeatFreqWarning": "Per la comunicazione fuori rete, è necessario utilizzare frequenze di 433, 869 o 918 MHz.",
"settings_clientRepeatSubtitle": "Permetti a questo dispositivo di ripetere i pacchetti di rete per gli altri."
} }
+60 -24
View File
@@ -376,6 +376,24 @@ abstract class AppLocalizations {
/// **'Scan'** /// **'Scan'**
String get scanner_scan; String get scanner_scan;
/// No description provided for @scanner_bluetoothOff.
///
/// In en, this message translates to:
/// **'Bluetooth is off'**
String get scanner_bluetoothOff;
/// No description provided for @scanner_bluetoothOffMessage.
///
/// In en, this message translates to:
/// **'Please turn on Bluetooth to scan for devices'**
String get scanner_bluetoothOffMessage;
/// No description provided for @scanner_enableBluetooth.
///
/// In en, this message translates to:
/// **'Enable Bluetooth'**
String get scanner_enableBluetooth;
/// No description provided for @device_quickSwitch. /// No description provided for @device_quickSwitch.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -730,24 +748,6 @@ abstract class AppLocalizations {
/// **'Presets'** /// **'Presets'**
String get settings_presets; String get settings_presets;
/// No description provided for @settings_preset915Mhz.
///
/// In en, this message translates to:
/// **'915 MHz'**
String get settings_preset915Mhz;
/// No description provided for @settings_preset868Mhz.
///
/// In en, this message translates to:
/// **'868 MHz'**
String get settings_preset868Mhz;
/// No description provided for @settings_preset433Mhz.
///
/// In en, this message translates to:
/// **'433 MHz'**
String get settings_preset433Mhz;
/// No description provided for @settings_frequency. /// No description provided for @settings_frequency.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -802,17 +802,23 @@ abstract class AppLocalizations {
/// **'Invalid TX power (0-22 dBm)'** /// **'Invalid TX power (0-22 dBm)'**
String get settings_txPowerInvalid; String get settings_txPowerInvalid;
/// No description provided for @settings_longRange. /// No description provided for @settings_clientRepeat.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Long Range'** /// **'Off-Grid Repeat'**
String get settings_longRange; String get settings_clientRepeat;
/// No description provided for @settings_fastSpeed. /// No description provided for @settings_clientRepeatSubtitle.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
/// **'Fast Speed'** /// **'Allow this device to repeat mesh packets for others'**
String get settings_fastSpeed; String get settings_clientRepeatSubtitle;
/// No description provided for @settings_clientRepeatFreqWarning.
///
/// In en, this message translates to:
/// **'Off-grid repeat requires 433, 869, or 918 MHz frequency'**
String get settings_clientRepeatFreqWarning;
/// No description provided for @settings_error. /// No description provided for @settings_error.
/// ///
@@ -2518,6 +2524,30 @@ abstract class AppLocalizations {
/// **'Manage Repeater'** /// **'Manage Repeater'**
String get map_manageRepeater; String get map_manageRepeater;
/// No description provided for @map_tapToAdd.
///
/// In en, this message translates to:
/// **'Tap on nodes to add them to the path.'**
String get map_tapToAdd;
/// No description provided for @map_runTrace.
///
/// In en, this message translates to:
/// **'Run Path Trace'**
String get map_runTrace;
/// No description provided for @map_removeLast.
///
/// In en, this message translates to:
/// **'Remove Last'**
String get map_removeLast;
/// No description provided for @map_pathTraceCancelled.
///
/// In en, this message translates to:
/// **'Path trace cancelled.'**
String get map_pathTraceCancelled;
/// No description provided for @mapCache_title. /// No description provided for @mapCache_title.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
@@ -4730,6 +4760,12 @@ abstract class AppLocalizations {
/// **'One or more of the hops is missing a location!'** /// **'One or more of the hops is missing a location!'**
String get pathTrace_someHopsNoLocation; String get pathTrace_someHopsNoLocation;
/// No description provided for @pathTrace_clearTooltip.
///
/// In en, this message translates to:
/// **'Clear path.'**
String get pathTrace_clearTooltip;
/// No description provided for @contacts_pathTrace. /// No description provided for @contacts_pathTrace.
/// ///
/// In en, this message translates to: /// In en, this message translates to:
+33 -11
View File
@@ -143,6 +143,16 @@ class AppLocalizationsBg extends AppLocalizations {
@override @override
String get scanner_scan => 'Сканирай'; String get scanner_scan => 'Сканирай';
@override
String get scanner_bluetoothOff => 'Bluetooth е изключен.';
@override
String get scanner_bluetoothOffMessage =>
'Моля, активирайте Bluetooth, за да сканирате за устройства.';
@override
String get scanner_enableBluetooth => 'Активирайте Bluetooth';
@override @override
String get device_quickSwitch => 'Бързо превключване'; String get device_quickSwitch => 'Бързо превключване';
@@ -340,15 +350,6 @@ class AppLocalizationsBg extends AppLocalizations {
@override @override
String get settings_presets => 'Предварителни настройки'; String get settings_presets => 'Предварителни настройки';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Честота (MHz)'; String get settings_frequency => 'Честота (MHz)';
@@ -377,10 +378,15 @@ class AppLocalizationsBg extends AppLocalizations {
String get settings_txPowerInvalid => 'Невалидна мощност на TX (0-22 dBm)'; String get settings_txPowerInvalid => 'Невалидна мощност на TX (0-22 dBm)';
@override @override
String get settings_longRange => 'Дълъг обхват'; String get settings_clientRepeat => 'Без електричество – повторение';
@override @override
String get settings_fastSpeed => 'Бърза скорост'; String get settings_clientRepeatSubtitle =>
'Позволете на това устройство да предава пакети към мрежата за други устройства.';
@override
String get settings_clientRepeatFreqWarning =>
'За повторение извън мрежата са необходими честоти от 433, 869 или 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1363,6 +1369,19 @@ class AppLocalizationsBg extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Управление на Повтарящ се Елемент'; String get map_manageRepeater => 'Управление на Повтарящ се Елемент';
@override
String get map_tapToAdd =>
'Натиснете върху възлите, за да ги добавите към пътя.';
@override
String get map_runTrace => 'Изпълни Път на Следване';
@override
String get map_removeLast => 'Премахни Последно';
@override
String get map_pathTraceCancelled => 'Отменен е следването на пътя.';
@override @override
String get mapCache_title => 'Кеш на офлайн карти'; String get mapCache_title => 'Кеш на офлайн карти';
@@ -2699,6 +2718,9 @@ class AppLocalizationsBg extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Един или повече от хмелите липсва местоположение!'; 'Един или повече от хмелите липсва местоположение!';
@override
String get pathTrace_clearTooltip => 'Изчисти пътя';
@override @override
String get contacts_pathTrace => 'Пътен проследяване'; String get contacts_pathTrace => 'Пътен проследяване';
+72 -49
View File
@@ -143,6 +143,16 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get scanner_scan => 'Scannen'; String get scanner_scan => 'Scannen';
@override
String get scanner_bluetoothOff => 'Bluetooth ist deaktiviert.';
@override
String get scanner_bluetoothOffMessage =>
'Bitte aktivieren Sie Bluetooth, um nach Geräten zu suchen.';
@override
String get scanner_enableBluetooth => 'Bluetooth aktivieren';
@override @override
String get device_quickSwitch => 'Schnelles Umschalten'; String get device_quickSwitch => 'Schnelles Umschalten';
@@ -244,10 +254,10 @@ class AppLocalizationsDe extends AppLocalizations {
String get settings_actions => 'Aktionen'; String get settings_actions => 'Aktionen';
@override @override
String get settings_sendAdvertisement => 'Sende eine Ankündigung'; String get settings_sendAdvertisement => 'Sende Ankündigung';
@override @override
String get settings_sendAdvertisementSubtitle => 'Sende Ankündigung'; String get settings_sendAdvertisementSubtitle => 'Sende eine Ankündigung';
@override @override
String get settings_advertisementSent => 'Ankündigung gesendet'; String get settings_advertisementSent => 'Ankündigung gesendet';
@@ -267,7 +277,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get settings_refreshContactsSubtitle => String get settings_refreshContactsSubtitle =>
'Kontakte-Liste vom Gerät neu laden'; 'Kontakt-Liste vom Gerät neu laden';
@override @override
String get settings_rebootDevice => 'Gerät neu starten'; String get settings_rebootDevice => 'Gerät neu starten';
@@ -334,15 +344,6 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get settings_presets => 'Voreinstellungen'; String get settings_presets => 'Voreinstellungen';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Frequenz (MHz)'; String get settings_frequency => 'Frequenz (MHz)';
@@ -371,10 +372,15 @@ class AppLocalizationsDe extends AppLocalizations {
String get settings_txPowerInvalid => 'Ungültige TX-Leistung (0-22 dBm)'; String get settings_txPowerInvalid => 'Ungültige TX-Leistung (0-22 dBm)';
@override @override
String get settings_longRange => 'Grosse Reichweite'; String get settings_clientRepeat => 'Wiederholung, ohne Stromanschluss';
@override @override
String get settings_fastSpeed => 'Schnelle Geschwindigkeit'; String get settings_clientRepeatSubtitle =>
'Ermöglichen Sie diesem Gerät, Mesh-Pakete für andere zu wiederholen.';
@override
String get settings_clientRepeatFreqWarning =>
'Die Kommunikation ohne Stromversorgung erfordert Frequenzen von 433, 869 oder 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1086,7 +1092,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get chat_recentAckPaths => String get chat_recentAckPaths =>
'Aktuelle ACK-Pfade (tasten, um zu verwenden):'; 'Aktuelle ACK-Pfade (antippen, um zu verwenden):';
@override @override
String get chat_pathHistoryFull => String get chat_pathHistoryFull =>
@@ -1117,7 +1123,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get chat_noPathHistoryYet => String get chat_noPathHistoryYet =>
'Keine eine Pfadhistorie vorhanden.\nSende eine Nachricht, um Pfade zu entdecken.'; 'Keine Pfadhistorie vorhanden.\nSende eine Nachricht, um Pfade zu entdecken.';
@override @override
String get chat_pathActions => 'Pfadaktionen:'; String get chat_pathActions => 'Pfadaktionen:';
@@ -1362,6 +1368,19 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Repeater verwalten'; String get map_manageRepeater => 'Repeater verwalten';
@override
String get map_tapToAdd =>
'Tippen Sie auf Knoten, um sie zum Pfad hinzuzufügen.';
@override
String get map_runTrace => 'Pfadverlauf ausführen';
@override
String get map_removeLast => 'Letztes Entfernen';
@override
String get map_pathTraceCancelled => 'Pfadverfolgung abgebrochen.';
@override @override
String get mapCache_title => 'Offline-Karten-Cache'; String get mapCache_title => 'Offline-Karten-Cache';
@@ -1418,7 +1437,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String mapCache_estimatedTiles(int count) { String mapCache_estimatedTiles(int count) {
return 'Geschätzte Fliesen: $count'; return 'Geschätzte Kacheln: $count';
} }
@override @override
@@ -1592,7 +1611,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get path_hexPrefixInstructions => String get path_hexPrefixInstructions =>
'Gebe für jeden Hopfen 2-stellige Hex-Präfixe ein, getrennt durch Kommas.'; 'Gebe für jeden Zwischen-Hop das 2-stellige Hex-Präfix ein, getrennt durch Kommas.';
@override @override
String get path_hexPrefixExample => String get path_hexPrefixExample =>
@@ -1689,7 +1708,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get repeater_statusRequestTimeout => String get repeater_statusRequestTimeout =>
'Statusanfrage zeitweise fehlgeschlagen.'; 'Statusanfrage durch Timeout fehlgeschlagen.';
@override @override
String repeater_errorLoadingStatus(String error) { String repeater_errorLoadingStatus(String error) {
@@ -1766,7 +1785,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String repeater_duplicatesFloodDirect(String flood, String direct) { String repeater_duplicatesFloodDirect(String flood, String direct) {
return 'Überflut: $flood, Direkt: $direct'; return 'Flut: $flood, Direkt: $direct';
} }
@override @override
@@ -1797,7 +1816,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get repeater_guestPasswordHelper => String get repeater_guestPasswordHelper =>
'Schreibgeschützter Zugriffspasswort'; 'Schreibgeschütztes Zugriffspasswort';
@override @override
String get repeater_radioSettings => 'Funk Einstellungen'; String get repeater_radioSettings => 'Funk Einstellungen';
@@ -1992,7 +2011,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get repeater_cliTitle => 'Repeater CLI'; String get repeater_cliTitle => 'Repeater CLI';
@override @override
String get repeater_debugNextCommand => 'Fehlersuche Nächster Befehl'; String get repeater_debugNextCommand => 'Fehlersuche des nächsten Befehls';
@override @override
String get repeater_commandHelp => 'Hilfe'; String get repeater_commandHelp => 'Hilfe';
@@ -2005,7 +2024,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get repeater_typeCommandOrUseQuick => String get repeater_typeCommandOrUseQuick =>
'Geben Sie einen Befehl unten ein oder verwenden Sie Schnellbefehle'; 'Geben Sie unten einen Befehl ein oder verwenden Sie die Schnellbefehle';
@override @override
String get repeater_enterCommandHint => 'Geben Sie den Befehl ein...'; String get repeater_enterCommandHint => 'Geben Sie den Befehl ein...';
@@ -2131,7 +2150,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get repeater_cliHelpSetRxDelay => String get repeater_cliHelpSetRxDelay =>
'Sets (experimentell) als Basis (muss > 1 sein für den Effekt) zur Anwendung einer leichten Verzögerung bei empfangenen Paketen, basierend auf Signalstärke/Punktzahl. Auf 0 setzen, um die Funktion zu deaktivieren.'; 'Fügt eine leichte Verzögerung bei empfangenen Paketen hinzu, basierend auf Signalstärke/Punktzahl. Auf 0 setzen, um die Funktion zu deaktivieren.';
@override @override
String get repeater_cliHelpSetTxDelay => String get repeater_cliHelpSetTxDelay =>
@@ -2175,7 +2194,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get repeater_cliHelpGetBridgeType => String get repeater_cliHelpGetBridgeType =>
'Ruft Brückentyp none, rs232, espnow ab.'; 'Ruft Brückentyp: none, rs232, espnow ab.';
@override @override
String get repeater_cliHelpLogStart => String get repeater_cliHelpLogStart =>
@@ -2202,7 +2221,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get repeater_cliHelpRegionLoad => String get repeater_cliHelpRegionLoad =>
'Hinweis: Dies ist ein spezieller Mehrbefehl-Aufruf. Jeder nachfolgende Befehl ist ein Regionsname (eingedruckt mit Leerzeichen zur Angabe der übergeordneten Hierarchie, mit mindestens einem Leerzeichen). Beendet durch das Senden einer Leerzeile/des Befehls.'; 'Hinweis: Dies ist ein spezieller Mehrbefehl-Aufruf. Jeder nachfolgende Befehl ist ein Regionsname (eingeckt mit Leerzeichen zur Angabe der übergeordneten Hierarchie, mit mindestens einem Leerzeichen). Beendet durch das Senden einer Leerzeile.';
@override @override
String get repeater_cliHelpRegionGet => String get repeater_cliHelpRegionGet =>
@@ -2351,10 +2370,11 @@ class AppLocalizationsDe extends AppLocalizations {
} }
@override @override
String get neighbors_receivedData => 'Empfangene Nachbarendaten'; String get neighbors_receivedData => 'Empfangene Nachbarsdaten';
@override @override
String get neighbors_requestTimedOut => 'Nachbarn melden zeitweise Ausfall.'; String get neighbors_requestTimedOut =>
'Anfrage durch Timeout fehlgeschlagen.';
@override @override
String neighbors_errorLoading(String error) { String neighbors_errorLoading(String error) {
@@ -2365,16 +2385,16 @@ class AppLocalizationsDe extends AppLocalizations {
String get neighbors_repeatersNeighbours => 'Nachbarn'; String get neighbors_repeatersNeighbours => 'Nachbarn';
@override @override
String get neighbors_noData => 'Keine Nachbardaten verfügbar.'; String get neighbors_noData => 'Keine Nachbarsdaten verfügbar.';
@override @override
String neighbors_unknownContact(String pubkey) { String neighbors_unknownContact(String pubkey) {
return 'Unbekannte $pubkey'; return 'Unbekannt $pubkey';
} }
@override @override
String neighbors_heardAgo(String time) { String neighbors_heardAgo(String time) {
return 'Hörte: $time vor her.'; return 'Gehört vor: $time';
} }
@override @override
@@ -2394,7 +2414,7 @@ class AppLocalizationsDe extends AppLocalizations {
'Die Detailangaben für dieses Paket sind nicht verfügbar.'; 'Die Detailangaben für dieses Paket sind nicht verfügbar.';
@override @override
String get channelPath_messageDetails => 'Nachrichtsdetails'; String get channelPath_messageDetails => 'Nachrichtendetails';
@override @override
String get channelPath_senderLabel => 'Sender'; String get channelPath_senderLabel => 'Sender';
@@ -2630,14 +2650,14 @@ class AppLocalizationsDe extends AppLocalizations {
'Füge einen Hashtag-Kanal für diese Community hinzu'; 'Füge einen Hashtag-Kanal für diese Community hinzu';
@override @override
String get community_selectCommunity => 'Wählen Sie Community'; String get community_selectCommunity => 'Wählen Sie eine Community';
@override @override
String get community_regularHashtag => 'Regulärer Hashtag'; String get community_regularHashtag => 'Regulärer Hashtag';
@override @override
String get community_regularHashtagDesc => String get community_regularHashtagDesc =>
'Öffentliches Hashtag (jeder kann teilnehmen)'; 'Öffentlicher Hashtag (jeder kann teilnehmen)';
@override @override
String get community_communityHashtag => 'Community Hashtag'; String get community_communityHashtag => 'Community Hashtag';
@@ -2682,7 +2702,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get listFilter_roomServers => 'Raumserver'; String get listFilter_roomServers => 'Raumserver';
@override @override
String get listFilter_unreadOnly => 'Nur nicht gelesen'; String get listFilter_unreadOnly => 'Nicht gelesen';
@override @override
String get listFilter_newGroup => 'Neue Gruppe'; String get listFilter_newGroup => 'Neue Gruppe';
@@ -2701,7 +2721,10 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Eine oder mehrere der Hopfen fehlen einen Standort!'; 'Bei einer oder mehreren Knoten fehlt der Standort!';
@override
String get pathTrace_clearTooltip => 'Pfad löschen';
@override @override
String get contacts_pathTrace => 'Pfadverfolgung'; String get contacts_pathTrace => 'Pfadverfolgung';
@@ -2743,14 +2766,14 @@ class AppLocalizationsDe extends AppLocalizations {
'Kontakt konnte nicht importiert werden'; 'Kontakt konnte nicht importiert werden';
@override @override
String get contacts_zeroHopAdvert => 'Zero-Hop-Anzeige'; String get contacts_zeroHopAdvert => 'Zero-Hop-Ankündigung';
@override @override
String get contacts_floodAdvert => 'Überflutungsanzeige'; String get contacts_floodAdvert => 'Flut-Ankündigung';
@override @override
String get contacts_copyAdvertToClipboard => String get contacts_copyAdvertToClipboard =>
'Werbung in die Zwischenablage kopieren'; 'Ankündigung in die Zwischenablage kopieren';
@override @override
String get contacts_addContactFromClipboard => String get contacts_addContactFromClipboard =>
@@ -2776,7 +2799,7 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get contacts_contactAdvertCopyFailed => String get contacts_contactAdvertCopyFailed =>
'Kopieren des Werbeinhalts in die Zwischenablage fehlgeschlagen.'; 'Kopieren der Ankündigung in die Zwischenablage fehlgeschlagen.';
@override @override
String get notification_activityTitle => 'MeshCore Aktivität'; String get notification_activityTitle => 'MeshCore Aktivität';
@@ -2824,28 +2847,28 @@ class AppLocalizationsDe extends AppLocalizations {
@override @override
String get settings_gpxExportRepeaters => String get settings_gpxExportRepeaters =>
'Repeater und Raumserver nach GPX exportieren'; 'Repeater und Raumserver als GPX exportieren';
@override @override
String get settings_gpxExportRepeatersSubtitle => String get settings_gpxExportRepeatersSubtitle =>
'Exportiert Repeater und Raumserver mit einem Standort in eine GPX-Datei.'; 'Exportiert Repeater und Raumserver mit einem Standort in eine GPX-Datei.';
@override @override
String get settings_gpxExportContacts => 'Begleiter nach GPX exportieren'; String get settings_gpxExportContacts => 'Kontakte als GPX exportieren';
@override @override
String get settings_gpxExportContactsSubtitle => String get settings_gpxExportContactsSubtitle =>
'Exportiert Begleiter mit einem Ort in eine GPX-Datei.'; 'Exportiert Kontakte mit einem Ort in eine GPX-Datei.';
@override @override
String get settings_gpxExportAll => 'Alle Kontakte nach GPX exportieren'; String get settings_gpxExportAll => 'Alle Knoten als GPX exportieren';
@override @override
String get settings_gpxExportAllSubtitle => String get settings_gpxExportAllSubtitle =>
'Exportiert alle Kontakte mit einem Standort in eine GPX-Datei.'; 'Exportiert alle Knoten mit einem Standort in eine GPX-Datei.';
@override @override
String get settings_gpxExportSuccess => 'Erfolgreich GPX-Datei exportiert.'; String get settings_gpxExportSuccess => 'GPX-Datei erfolgreich exportiert.';
@override @override
String get settings_gpxExportNoContacts => 'Keine Kontakte zum Exportieren.'; String get settings_gpxExportNoContacts => 'Keine Kontakte zum Exportieren.';
@@ -2863,16 +2886,16 @@ class AppLocalizationsDe extends AppLocalizations {
'Repeater- und Raumserver-Standorte'; 'Repeater- und Raumserver-Standorte';
@override @override
String get settings_gpxExportChat => 'Begleiterstandorte'; String get settings_gpxExportChat => 'Kontaktstandorte';
@override @override
String get settings_gpxExportAllContacts => 'Alle Kontaktstandorte'; String get settings_gpxExportAllContacts => 'Alle Kontaktstandorte';
@override @override
String get settings_gpxExportShareText => String get settings_gpxExportShareText =>
'Kartendaten aus meshcore-open exportiert'; 'GPX-Kartendaten aus meshcore-open exportiert';
@override @override
String get settings_gpxExportShareSubject => String get settings_gpxExportShareSubject =>
'meshcore-open GPX-Kartendaten exportieren'; 'GPX-Kartendaten aus meshcore-open exportieren';
} }
+32 -11
View File
@@ -142,6 +142,16 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get scanner_scan => 'Scan'; String get scanner_scan => 'Scan';
@override
String get scanner_bluetoothOff => 'Bluetooth is off';
@override
String get scanner_bluetoothOffMessage =>
'Please turn on Bluetooth to scan for devices';
@override
String get scanner_enableBluetooth => 'Enable Bluetooth';
@override @override
String get device_quickSwitch => 'Quick switch'; String get device_quickSwitch => 'Quick switch';
@@ -332,15 +342,6 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get settings_presets => 'Presets'; String get settings_presets => 'Presets';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Frequency (MHz)'; String get settings_frequency => 'Frequency (MHz)';
@@ -369,10 +370,15 @@ class AppLocalizationsEn extends AppLocalizations {
String get settings_txPowerInvalid => 'Invalid TX power (0-22 dBm)'; String get settings_txPowerInvalid => 'Invalid TX power (0-22 dBm)';
@override @override
String get settings_longRange => 'Long Range'; String get settings_clientRepeat => 'Off-Grid Repeat';
@override @override
String get settings_fastSpeed => 'Fast Speed'; String get settings_clientRepeatSubtitle =>
'Allow this device to repeat mesh packets for others';
@override
String get settings_clientRepeatFreqWarning =>
'Off-grid repeat requires 433, 869, or 918 MHz frequency';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1342,6 +1348,18 @@ class AppLocalizationsEn extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Manage Repeater'; String get map_manageRepeater => 'Manage Repeater';
@override
String get map_tapToAdd => 'Tap on nodes to add them to the path.';
@override
String get map_runTrace => 'Run Path Trace';
@override
String get map_removeLast => 'Remove Last';
@override
String get map_pathTraceCancelled => 'Path trace cancelled.';
@override @override
String get mapCache_title => 'Offline Map Cache'; String get mapCache_title => 'Offline Map Cache';
@@ -2659,6 +2677,9 @@ class AppLocalizationsEn extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'One or more of the hops is missing a location!'; 'One or more of the hops is missing a location!';
@override
String get pathTrace_clearTooltip => 'Clear path.';
@override @override
String get contacts_pathTrace => 'Path Trace'; String get contacts_pathTrace => 'Path Trace';
+32 -11
View File
@@ -143,6 +143,16 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get scanner_scan => 'Escanea'; String get scanner_scan => 'Escanea';
@override
String get scanner_bluetoothOff => 'Bluetooth está desactivado.';
@override
String get scanner_bluetoothOffMessage =>
'Por favor, active el Bluetooth para escanear dispositivos.';
@override
String get scanner_enableBluetooth => 'Habilitar Bluetooth';
@override @override
String get device_quickSwitch => 'Cambiar rápidamente'; String get device_quickSwitch => 'Cambiar rápidamente';
@@ -337,15 +347,6 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get settings_presets => 'Preajustes'; String get settings_presets => 'Preajustes';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Frecuencia (MHz)'; String get settings_frequency => 'Frecuencia (MHz)';
@@ -374,10 +375,15 @@ class AppLocalizationsEs extends AppLocalizations {
String get settings_txPowerInvalid => 'Potencia de TX inválida (0-22 dBm)'; String get settings_txPowerInvalid => 'Potencia de TX inválida (0-22 dBm)';
@override @override
String get settings_longRange => 'Largo Alcance'; String get settings_clientRepeat => 'Repetir sin conexión';
@override @override
String get settings_fastSpeed => 'Velocidad Rápida'; String get settings_clientRepeatSubtitle =>
'Permita que este dispositivo repita los paquetes de red para otros usuarios.';
@override
String get settings_clientRepeatFreqWarning =>
'Para la comunicación fuera de la red, se requiere una frecuencia de 433, 869 o 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1360,6 +1366,18 @@ class AppLocalizationsEs extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Gestionar Repetidor'; String get map_manageRepeater => 'Gestionar Repetidor';
@override
String get map_tapToAdd => 'Pulse en los nodos para agregarlos al camino.';
@override
String get map_runTrace => 'Ejecutar Rastreo de Ruta';
@override
String get map_removeLast => 'Eliminar último';
@override
String get map_pathTraceCancelled => 'Rastreo de ruta cancelado.';
@override @override
String get mapCache_title => 'Caché de Mapa Offline'; String get mapCache_title => 'Caché de Mapa Offline';
@@ -2698,6 +2716,9 @@ class AppLocalizationsEs extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Uno o más de los lúpulos carecen de una ubicación'; 'Uno o más de los lúpulos carecen de una ubicación';
@override
String get pathTrace_clearTooltip => 'Borrar ruta';
@override @override
String get contacts_pathTrace => 'Rastreo de caminos'; String get contacts_pathTrace => 'Rastreo de caminos';
+69 -48
View File
@@ -143,6 +143,16 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get scanner_scan => 'Scanner'; String get scanner_scan => 'Scanner';
@override
String get scanner_bluetoothOff => 'Le Bluetooth est désactivé.';
@override
String get scanner_bluetoothOffMessage =>
'Veuillez activer le Bluetooth pour rechercher des appareils.';
@override
String get scanner_enableBluetooth => 'Activer le Bluetooth';
@override @override
String get device_quickSwitch => 'Basculement rapide'; String get device_quickSwitch => 'Basculement rapide';
@@ -338,15 +348,6 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get settings_presets => 'Préréglages'; String get settings_presets => 'Préréglages';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Fréquence (MHz)'; String get settings_frequency => 'Fréquence (MHz)';
@@ -375,10 +376,15 @@ class AppLocalizationsFr extends AppLocalizations {
String get settings_txPowerInvalid => 'Puissance TX invalide (0-22 dBm)'; String get settings_txPowerInvalid => 'Puissance TX invalide (0-22 dBm)';
@override @override
String get settings_longRange => 'Portée Longue'; String get settings_clientRepeat => 'Répétition hors réseau';
@override @override
String get settings_fastSpeed => 'Vitesse Rapide'; String get settings_clientRepeatSubtitle =>
'Permettez à cet appareil de répéter les paquets de données pour les autres.';
@override
String get settings_clientRepeatFreqWarning =>
'Pour les transmissions hors réseau, il est nécessaire d\'utiliser les fréquences de 433, 869 ou 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -560,11 +566,11 @@ class AppLocalizationsFr extends AppLocalizations {
String get appSettings_mapDisplay => 'Affichage de la carte'; String get appSettings_mapDisplay => 'Affichage de la carte';
@override @override
String get appSettings_showRepeaters => 'Afficher les répétiteurs'; String get appSettings_showRepeaters => 'Afficher les répéteurs';
@override @override
String get appSettings_showRepeatersSubtitle => String get appSettings_showRepeatersSubtitle =>
'Afficher les nœuds répétiteurs sur la carte'; 'Afficher les nœuds répéteurs sur la carte';
@override @override
String get appSettings_showChatNodes => 'Afficher les nœuds de discussion'; String get appSettings_showChatNodes => 'Afficher les nœuds de discussion';
@@ -671,7 +677,7 @@ class AppLocalizationsFr extends AppLocalizations {
} }
@override @override
String get contacts_manageRepeater => 'Gérer le répétiteur'; String get contacts_manageRepeater => 'Gérer le répéteur';
@override @override
String get contacts_manageRoom => 'Gérer le Room Server'; String get contacts_manageRoom => 'Gérer le Room Server';
@@ -1094,18 +1100,18 @@ class AppLocalizationsFr extends AppLocalizations {
'L\'historique du chemin est plein. Supprimez les entrées pour en ajouter de nouvelles.'; 'L\'historique du chemin est plein. Supprimez les entrées pour en ajouter de nouvelles.';
@override @override
String get chat_hopSingular => 'Sautez'; String get chat_hopSingular => 'saut';
@override @override
String get chat_hopPlural => 'sautez'; String get chat_hopPlural => 'sauts';
@override @override
String chat_hopsCount(int count) { String chat_hopsCount(int count) {
String _temp0 = intl.Intl.pluralLogic( String _temp0 = intl.Intl.pluralLogic(
count, count,
locale: localeName, locale: localeName,
other: 'hops', other: 'sauts',
one: 'hop', one: 'saut',
); );
return '$count $_temp0'; return '$count $_temp0';
} }
@@ -1259,7 +1265,7 @@ class AppLocalizationsFr extends AppLocalizations {
String get map_chat => 'Chat'; String get map_chat => 'Chat';
@override @override
String get map_repeater => 'Répétiteur'; String get map_repeater => 'Répéteur';
@override @override
String get map_room => 'Salle'; String get map_room => 'Salle';
@@ -1365,7 +1371,20 @@ class AppLocalizationsFr extends AppLocalizations {
String get map_joinRoom => 'Rejoindre la salle'; String get map_joinRoom => 'Rejoindre la salle';
@override @override
String get map_manageRepeater => 'Gérer le répétiteur'; String get map_manageRepeater => 'Gérer le répéteur';
@override
String get map_tapToAdd =>
'Appuyez sur les nœuds pour les ajouter au chemin.';
@override
String get map_runTrace => 'Exécuter la traçage de chemin';
@override
String get map_removeLast => 'Supprimer le dernier';
@override
String get map_pathTraceCancelled => 'Traçage de chemin annulé';
@override @override
String get mapCache_title => 'Cache de Carte Hors Ligne'; String get mapCache_title => 'Cache de Carte Hors Ligne';
@@ -1509,7 +1528,7 @@ class AppLocalizationsFr extends AppLocalizations {
'Êtes-vous sûr de vouloir vous déconnecter de cet appareil ?'; 'Êtes-vous sûr de vouloir vous déconnecter de cet appareil ?';
@override @override
String get login_repeaterLogin => 'Connexion au répétiteur'; String get login_repeaterLogin => 'Connexion au répéteur';
@override @override
String get login_roomLogin => 'Connexion Salle'; String get login_roomLogin => 'Connexion Salle';
@@ -1529,7 +1548,7 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get login_repeaterDescription => String get login_repeaterDescription =>
'Entrez le mot de passe du répétiteur pour accéder aux paramètres et à l\'état.'; 'Entrez le mot de passe du répéteur pour accéder aux paramètres et à l\'état.';
@override @override
String get login_roomDescription => String get login_roomDescription =>
@@ -1634,7 +1653,7 @@ class AppLocalizationsFr extends AppLocalizations {
String get path_setPath => 'Définir le chemin'; String get path_setPath => 'Définir le chemin';
@override @override
String get repeater_management => 'Gestion des répétiteurs'; String get repeater_management => 'Gestion des répéteurs';
@override @override
String get room_management => 'Administración del Servidor de Habitación'; String get room_management => 'Administración del Servidor de Habitación';
@@ -1647,7 +1666,7 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get repeater_statusSubtitle => String get repeater_statusSubtitle =>
'Afficher l\'état, les statistiques et les voisins du répétiteur'; 'Afficher l\'état, les statistiques et les voisins du répéteur';
@override @override
String get repeater_telemetry => 'Télémetrie'; String get repeater_telemetry => 'Télémetrie';
@@ -1660,7 +1679,7 @@ class AppLocalizationsFr extends AppLocalizations {
String get repeater_cli => 'CLI'; String get repeater_cli => 'CLI';
@override @override
String get repeater_cliSubtitle => 'Envoyer des commandes au répétiteur'; String get repeater_cliSubtitle => 'Envoyer des commandes au répéteur';
@override @override
String get repeater_neighbours => 'Voisins'; String get repeater_neighbours => 'Voisins';
@@ -1674,10 +1693,10 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get repeater_settingsSubtitle => String get repeater_settingsSubtitle =>
'Configurer les paramètres du répétiteur'; 'Configurer les paramètres du répéteur';
@override @override
String get repeater_statusTitle => 'État du répétiteur'; String get repeater_statusTitle => 'État du répéteur';
@override @override
String get repeater_routingMode => 'Mode de routage'; String get repeater_routingMode => 'Mode de routage';
@@ -1783,16 +1802,16 @@ class AppLocalizationsFr extends AppLocalizations {
} }
@override @override
String get repeater_settingsTitle => 'Paramètres du répétiteur'; String get repeater_settingsTitle => 'Paramètres du répéteur';
@override @override
String get repeater_basicSettings => 'Paramètres de base'; String get repeater_basicSettings => 'Paramètres de base';
@override @override
String get repeater_repeaterName => 'Nom du répétiteur'; String get repeater_repeaterName => 'Nom du répéteur';
@override @override
String get repeater_repeaterNameHelper => 'Afficher le nom de ce répétiteur'; String get repeater_repeaterNameHelper => 'Afficher le nom de ce répéteur';
@override @override
String get repeater_adminPassword => 'Mot de passe Administrateur'; String get repeater_adminPassword => 'Mot de passe Administrateur';
@@ -1856,7 +1875,7 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get repeater_packetForwardingSubtitle => String get repeater_packetForwardingSubtitle =>
'Activer le répétiteur pour transmettre des paquets'; 'Activer le répéteur pour transmettre des paquets';
@override @override
String get repeater_guestAccess => 'Accès Invité'; String get repeater_guestAccess => 'Accès Invité';
@@ -1905,11 +1924,11 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get repeater_rebootRepeaterSubtitle => String get repeater_rebootRepeaterSubtitle =>
'Réinitialiser l\'appareil répétiteur'; 'Réinitialiser l\'appareil répéteur';
@override @override
String get repeater_rebootRepeaterConfirm => String get repeater_rebootRepeaterConfirm =>
'Êtes-vous sûr de vouloir redémarrer ce répétiteur ?'; 'Êtes-vous sûr de vouloir redémarrer ce répéteur ?';
@override @override
String get repeater_regenerateIdentityKey => 'Ré générer la clé d\'identité'; String get repeater_regenerateIdentityKey => 'Ré générer la clé d\'identité';
@@ -1920,18 +1939,18 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get repeater_regenerateIdentityKeyConfirm => String get repeater_regenerateIdentityKeyConfirm =>
'Cela générera une nouvelle identité pour le répétiteur. Continuer ?'; 'Cela générera une nouvelle identité pour le répéteur. Continuer ?';
@override @override
String get repeater_eraseFileSystem => 'Supprimer le système de fichiers'; String get repeater_eraseFileSystem => 'Supprimer le système de fichiers';
@override @override
String get repeater_eraseFileSystemSubtitle => String get repeater_eraseFileSystemSubtitle =>
'Formater le système de fichiers du répétiteur'; 'Formater le système de fichiers du répéteur';
@override @override
String get repeater_eraseFileSystemConfirm => String get repeater_eraseFileSystemConfirm =>
'AVERTISSEMENT : Cela effacera toutes les données du répétiteur. Cela ne peut pas être annulé !'; 'AVERTISSEMENT : Cela effacera toutes les données du répéteur. Cela ne peut pas être annulé !';
@override @override
String get repeater_eraseSerialOnly => String get repeater_eraseSerialOnly =>
@@ -1999,7 +2018,7 @@ class AppLocalizationsFr extends AppLocalizations {
} }
@override @override
String get repeater_cliTitle => 'Répétiteur CLI'; String get repeater_cliTitle => 'Répéteur CLI';
@override @override
String get repeater_debugNextCommand => 'Déboguer Prochaine Commande'; String get repeater_debugNextCommand => 'Déboguer Prochaine Commande';
@@ -2091,7 +2110,7 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get repeater_cliHelpSetRepeat => String get repeater_cliHelpSetRepeat =>
'Active ou désactive le rôle du répétiteur pour ce nœud.'; 'Active ou désactive le rôle du répéteur pour ce nœud.';
@override @override
String get repeater_cliHelpSetAllowReadOnly => String get repeater_cliHelpSetAllowReadOnly =>
@@ -2115,7 +2134,7 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get repeater_cliHelpSetAdvertInterval => String get repeater_cliHelpSetAdvertInterval =>
'Définit l\'intervalle du minuteur pour envoyer un paquet d\'annonce local (sans relais). Définir sur 0 pour désactiver.'; 'Définit l\'intervalle entre chaque émission d\'une annonce locale (sans relais). Définir sur 0 pour désactiver.';
@override @override
String get repeater_cliHelpSetFloodAdvertInterval => String get repeater_cliHelpSetFloodAdvertInterval =>
@@ -2201,7 +2220,7 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get repeater_cliHelpNeighbors => String get repeater_cliHelpNeighbors =>
'Affiche une liste d\'autres nœuds répétiteurs entendus via des annonces sans relais. Chaque ligne est id-préfixe-hexadécimal:timestamp:snr-fois-4'; 'Affiche une liste d\'autres nœuds répéteurs entendus via des annonces sans relais. Chaque ligne est id-préfixe-hexadécimal:timestamp:snr-fois-4';
@override @override
String get repeater_cliHelpNeighborRemove => String get repeater_cliHelpNeighborRemove =>
@@ -2289,12 +2308,11 @@ class AppLocalizationsFr extends AppLocalizations {
String get repeater_logging => 'Journalisation'; String get repeater_logging => 'Journalisation';
@override @override
String get repeater_neighborsRepeaterOnly => String get repeater_neighborsRepeaterOnly => 'Voisins (Uniquement répéteur)';
'Voisins (Uniquement répétiteur)';
@override @override
String get repeater_regionManagementRepeaterOnly => String get repeater_regionManagementRepeaterOnly =>
'Gestion des régions (uniquement pour le répétiteur)'; 'Gestion des régions (uniquement pour le répéteur)';
@override @override
String get repeater_regionNote => String get repeater_regionNote =>
@@ -2399,7 +2417,7 @@ class AppLocalizationsFr extends AppLocalizations {
String get channelPath_otherObservedPaths => 'Autres chemins observés'; String get channelPath_otherObservedPaths => 'Autres chemins observés';
@override @override
String get channelPath_repeaterHops => 'Sauts du répétiteur'; String get channelPath_repeaterHops => 'Sauts du répéteur';
@override @override
String get channelPath_noHopDetails => String get channelPath_noHopDetails =>
@@ -2467,7 +2485,7 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get channelPath_noRepeaterLocations => String get channelPath_noRepeaterLocations =>
'Aucune position de répétiteur disponible pour ce chemin.'; 'Aucune position de répéteur disponible pour ce chemin.';
@override @override
String channelPath_primaryPath(int index) { String channelPath_primaryPath(int index) {
@@ -2713,7 +2731,10 @@ class AppLocalizationsFr extends AppLocalizations {
@override @override
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Une ou plusieurs des houblons manquent d\'une localisation !'; 'Un ou plusieurs des sauts manquent d\'une localisation !';
@override
String get pathTrace_clearTooltip => 'Effacer le chemin';
@override @override
String get contacts_pathTrace => 'Traçage de chemin'; String get contacts_pathTrace => 'Traçage de chemin';
@@ -2756,10 +2777,10 @@ class AppLocalizationsFr extends AppLocalizations {
'Échec de l\'importation du contact.'; 'Échec de l\'importation du contact.';
@override @override
String get contacts_zeroHopAdvert => 'Annonce Zero Hop'; String get contacts_zeroHopAdvert => 'Annonce Zero saut';
@override @override
String get contacts_floodAdvert => 'Annonce de crue'; String get contacts_floodAdvert => 'Annonce à tout le réseau';
@override @override
String get contacts_copyAdvertToClipboard => String get contacts_copyAdvertToClipboard =>
+32 -11
View File
@@ -143,6 +143,16 @@ class AppLocalizationsIt extends AppLocalizations {
@override @override
String get scanner_scan => 'Scansiona'; String get scanner_scan => 'Scansiona';
@override
String get scanner_bluetoothOff => 'Il Bluetooth è disattivato.';
@override
String get scanner_bluetoothOffMessage =>
'Si prega di attivare il Bluetooth per effettuare la scansione dei dispositivi.';
@override
String get scanner_enableBluetooth => 'Abilita il Bluetooth';
@override @override
String get device_quickSwitch => 'Passa velocemente'; String get device_quickSwitch => 'Passa velocemente';
@@ -336,15 +346,6 @@ class AppLocalizationsIt extends AppLocalizations {
@override @override
String get settings_presets => 'Preset'; String get settings_presets => 'Preset';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Frequenza (MHz)'; String get settings_frequency => 'Frequenza (MHz)';
@@ -373,10 +374,15 @@ class AppLocalizationsIt extends AppLocalizations {
String get settings_txPowerInvalid => 'Potere TX non valido (0-22 dBm)'; String get settings_txPowerInvalid => 'Potere TX non valido (0-22 dBm)';
@override @override
String get settings_longRange => 'Lungo Raggio'; String get settings_clientRepeat => 'Ripetizione \"fuori dalla rete\"';
@override @override
String get settings_fastSpeed => 'Velocità Rapida'; String get settings_clientRepeatSubtitle =>
'Permetti a questo dispositivo di ripetere i pacchetti di rete per gli altri.';
@override
String get settings_clientRepeatFreqWarning =>
'Per la comunicazione fuori rete, è necessario utilizzare frequenze di 433, 869 o 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1359,6 +1365,18 @@ class AppLocalizationsIt extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Gestisci Ripetitore'; String get map_manageRepeater => 'Gestisci Ripetitore';
@override
String get map_tapToAdd => 'Tocca i nodi per aggiungerli al percorso.';
@override
String get map_runTrace => 'Esegui Path Trace';
@override
String get map_removeLast => 'Rimuovi ultimo';
@override
String get map_pathTraceCancelled => 'Tracciamento del percorso annullato.';
@override @override
String get mapCache_title => 'Cache Mappa Offline'; String get mapCache_title => 'Cache Mappa Offline';
@@ -2699,6 +2717,9 @@ class AppLocalizationsIt extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Uno o più dei luppoli mancano di una posizione!'; 'Uno o più dei luppoli mancano di una posizione!';
@override
String get pathTrace_clearTooltip => 'Pulisci percorso';
@override @override
String get contacts_pathTrace => 'Traccia Percorso'; String get contacts_pathTrace => 'Traccia Percorso';
+33 -11
View File
@@ -142,6 +142,16 @@ class AppLocalizationsNl extends AppLocalizations {
@override @override
String get scanner_scan => 'Scan'; String get scanner_scan => 'Scan';
@override
String get scanner_bluetoothOff => 'Bluetooth is uitgeschakeld';
@override
String get scanner_bluetoothOffMessage =>
'Zorg ervoor dat Bluetooth is ingeschakeld om naar apparaten te zoeken.';
@override
String get scanner_enableBluetooth => 'Activeer Bluetooth';
@override @override
String get device_quickSwitch => 'Snelle overschakeling'; String get device_quickSwitch => 'Snelle overschakeling';
@@ -334,15 +344,6 @@ class AppLocalizationsNl extends AppLocalizations {
@override @override
String get settings_presets => 'Presets'; String get settings_presets => 'Presets';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Frequentie (MHz)'; String get settings_frequency => 'Frequentie (MHz)';
@@ -371,10 +372,15 @@ class AppLocalizationsNl extends AppLocalizations {
String get settings_txPowerInvalid => 'Ongeldige TX-vermogen (0-22 dBm)'; String get settings_txPowerInvalid => 'Ongeldige TX-vermogen (0-22 dBm)';
@override @override
String get settings_longRange => 'Lange Afstand'; String get settings_clientRepeat => 'Herhalen: Afgekoppeld';
@override @override
String get settings_fastSpeed => 'Hoge Snelheid'; String get settings_clientRepeatSubtitle =>
'Laat dit apparaat de mesh-pakketten opnieuw verzenden voor andere apparaten.';
@override
String get settings_clientRepeatFreqWarning =>
'Om een signaal buiten het netwerk te versturen, zijn frequenties van 433, 869 of 918 MHz vereist.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1355,6 +1361,19 @@ class AppLocalizationsNl extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Beheer Repeater'; String get map_manageRepeater => 'Beheer Repeater';
@override
String get map_tapToAdd =>
'Tik op knooppunten om ze toe te voegen aan het pad';
@override
String get map_runTrace => 'Padeshulp traceren';
@override
String get map_removeLast => 'Verwijder Laatste';
@override
String get map_pathTraceCancelled => 'Pad traceren geannuleerd';
@override @override
String get mapCache_title => 'Offline Kaarten Cache'; String get mapCache_title => 'Offline Kaarten Cache';
@@ -2689,6 +2708,9 @@ class AppLocalizationsNl extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Een of meer van de hops ontbreken een locatie!'; 'Een of meer van de hops ontbreken een locatie!';
@override
String get pathTrace_clearTooltip => 'Weg wissen';
@override @override
String get contacts_pathTrace => 'Pad Traceren'; String get contacts_pathTrace => 'Pad Traceren';
+32 -11
View File
@@ -143,6 +143,16 @@ class AppLocalizationsPl extends AppLocalizations {
@override @override
String get scanner_scan => 'Przeskanuj'; String get scanner_scan => 'Przeskanuj';
@override
String get scanner_bluetoothOff => 'Bluetooth jest wyłączony';
@override
String get scanner_bluetoothOffMessage =>
'Prosimy włączyć Bluetooth, aby przeskanować urządzenia.';
@override
String get scanner_enableBluetooth => 'Włącz Bluetooth';
@override @override
String get device_quickSwitch => 'Szybka zmiana'; String get device_quickSwitch => 'Szybka zmiana';
@@ -337,15 +347,6 @@ class AppLocalizationsPl extends AppLocalizations {
@override @override
String get settings_presets => 'Preset'; String get settings_presets => 'Preset';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Częstotliwość (MHz)'; String get settings_frequency => 'Częstotliwość (MHz)';
@@ -375,10 +376,15 @@ class AppLocalizationsPl extends AppLocalizations {
String get settings_txPowerInvalid => 'Nieprawidłowa moc TX (0-22 dBm)'; String get settings_txPowerInvalid => 'Nieprawidłowa moc TX (0-22 dBm)';
@override @override
String get settings_longRange => 'Długi zasięg'; String get settings_clientRepeat => 'Powtórzenie: Niezależne od sieci';
@override @override
String get settings_fastSpeed => 'Szybka prędkość'; String get settings_clientRepeatSubtitle =>
'Pozwól temu urządzeniu powtarzać pakiety danych dla innych urządzeń.';
@override
String get settings_clientRepeatFreqWarning =>
'Powtórka poza siecią wymaga częstotliwości 433, 869 lub 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1361,6 +1367,18 @@ class AppLocalizationsPl extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Zarządzaj Powtórzami'; String get map_manageRepeater => 'Zarządzaj Powtórzami';
@override
String get map_tapToAdd => 'Kliknij na węzły, aby dodać je do ścieżki.';
@override
String get map_runTrace => 'Uruchom ślad ścieżki';
@override
String get map_removeLast => 'Usuń ostatni';
@override
String get map_pathTraceCancelled => 'Śledzenie ścieżki anulowano.';
@override @override
String get mapCache_title => 'Bufor Map Offline'; String get mapCache_title => 'Bufor Map Offline';
@@ -2697,6 +2715,9 @@ class AppLocalizationsPl extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Jeden lub więcej z chmieli nie ma określonej lokalizacji!'; 'Jeden lub więcej z chmieli nie ma określonej lokalizacji!';
@override
String get pathTrace_clearTooltip => 'Wyczyść ścieżkę';
@override @override
String get contacts_pathTrace => 'Śledzenie Ścieżek'; String get contacts_pathTrace => 'Śledzenie Ścieżek';
+32 -11
View File
@@ -143,6 +143,16 @@ class AppLocalizationsPt extends AppLocalizations {
@override @override
String get scanner_scan => 'Digitalizar'; String get scanner_scan => 'Digitalizar';
@override
String get scanner_bluetoothOff => 'Bluetooth está desativado';
@override
String get scanner_bluetoothOffMessage =>
'Por favor, ative o Bluetooth para escanear por dispositivos.';
@override
String get scanner_enableBluetooth => 'Ative o Bluetooth';
@override @override
String get device_quickSwitch => 'Mudar rapidamente'; String get device_quickSwitch => 'Mudar rapidamente';
@@ -338,15 +348,6 @@ class AppLocalizationsPt extends AppLocalizations {
@override @override
String get settings_presets => 'Presets'; String get settings_presets => 'Presets';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Frequência (MHz)'; String get settings_frequency => 'Frequência (MHz)';
@@ -375,10 +376,15 @@ class AppLocalizationsPt extends AppLocalizations {
String get settings_txPowerInvalid => 'Potência de TX inválida (0-22 dBm)'; String get settings_txPowerInvalid => 'Potência de TX inválida (0-22 dBm)';
@override @override
String get settings_longRange => 'Alcance Longo'; String get settings_clientRepeat => 'Repetição sem rede';
@override @override
String get settings_fastSpeed => 'Velocidade Rápida'; String get settings_clientRepeatSubtitle =>
'Permita que este dispositivo repita pacotes de rede para outros dispositivos.';
@override
String get settings_clientRepeatFreqWarning =>
'A repetição fora da rede requer frequências de 433, 869 ou 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1361,6 +1367,18 @@ class AppLocalizationsPt extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Gerenciar Repetidor'; String get map_manageRepeater => 'Gerenciar Repetidor';
@override
String get map_tapToAdd => 'Toque nos nós para adicioná-los ao caminho.';
@override
String get map_runTrace => 'Executar Traçado de Caminho';
@override
String get map_removeLast => 'Remover Último';
@override
String get map_pathTraceCancelled => 'Rastreamento de caminho cancelado.';
@override @override
String get mapCache_title => 'Cache de Mapa Offline'; String get mapCache_title => 'Cache de Mapa Offline';
@@ -2700,6 +2718,9 @@ class AppLocalizationsPt extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Um ou mais dos lúpulos estão sem localização!'; 'Um ou mais dos lúpulos estão sem localização!';
@override
String get pathTrace_clearTooltip => 'Limpar caminho';
@override @override
String get contacts_pathTrace => 'Traçado de Caminho'; String get contacts_pathTrace => 'Traçado de Caminho';
+32 -11
View File
@@ -142,6 +142,16 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get scanner_scan => 'Сканирование'; String get scanner_scan => 'Сканирование';
@override
String get scanner_bluetoothOff => 'Bluetooth выключен';
@override
String get scanner_bluetoothOffMessage =>
'Пожалуйста, включите Bluetooth, чтобы найти устройства.';
@override
String get scanner_enableBluetooth => 'Включите Bluetooth';
@override @override
String get device_quickSwitch => 'Быстрое переключение'; String get device_quickSwitch => 'Быстрое переключение';
@@ -335,15 +345,6 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get settings_presets => 'Пресеты'; String get settings_presets => 'Пресеты';
@override
String get settings_preset915Mhz => '915 МГц';
@override
String get settings_preset868Mhz => '868 МГц';
@override
String get settings_preset433Mhz => '433 МГц';
@override @override
String get settings_frequency => 'Частота (МГц)'; String get settings_frequency => 'Частота (МГц)';
@@ -373,10 +374,15 @@ class AppLocalizationsRu extends AppLocalizations {
'Недопустимая мощность передачи (0–22 дБм)'; 'Недопустимая мощность передачи (0–22 дБм)';
@override @override
String get settings_longRange => 'Дальний радиус'; String get settings_clientRepeat => 'Повторение \"вне сети\"';
@override @override
String get settings_fastSpeed => 'Высокая скорость'; String get settings_clientRepeatSubtitle =>
'Позвольте этому устройству повторять пакеты данных для других устройств.';
@override
String get settings_clientRepeatFreqWarning =>
'Для работы в режиме \"без подключения к сети\" требуется частота 433, 869 или 918 МГц.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1362,6 +1368,18 @@ class AppLocalizationsRu extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Управление репитером'; String get map_manageRepeater => 'Управление репитером';
@override
String get map_tapToAdd => 'Нажимайте на узлы, чтобы добавить их в путь.';
@override
String get map_runTrace => 'Запустить трассировку пути';
@override
String get map_removeLast => 'Удалить последний';
@override
String get map_pathTraceCancelled => 'Отмена трассировки пути';
@override @override
String get mapCache_title => 'Кэш офлайн-карты'; String get mapCache_title => 'Кэш офлайн-карты';
@@ -2702,6 +2720,9 @@ class AppLocalizationsRu extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Одному или нескольким хмелям не указано местоположение!'; 'Одному или нескольким хмелям не указано местоположение!';
@override
String get pathTrace_clearTooltip => 'Очистить путь';
@override @override
String get contacts_pathTrace => 'Трассировка пути'; String get contacts_pathTrace => 'Трассировка пути';
+32 -11
View File
@@ -143,6 +143,16 @@ class AppLocalizationsSk extends AppLocalizations {
@override @override
String get scanner_scan => 'Skončiť'; String get scanner_scan => 'Skončiť';
@override
String get scanner_bluetoothOff => 'Bluetooth je vypnutý';
@override
String get scanner_bluetoothOffMessage =>
'Prosím, zapnite Bluetooth, aby ste mohli skenovať pre zariadenia.';
@override
String get scanner_enableBluetooth => 'Povolte Bluetooth';
@override @override
String get device_quickSwitch => 'Rýchle prepínač'; String get device_quickSwitch => 'Rýchle prepínač';
@@ -334,15 +344,6 @@ class AppLocalizationsSk extends AppLocalizations {
@override @override
String get settings_presets => 'Prednastavenia'; String get settings_presets => 'Prednastavenia';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Frekvencia (MHz)'; String get settings_frequency => 'Frekvencia (MHz)';
@@ -371,10 +372,15 @@ class AppLocalizationsSk extends AppLocalizations {
String get settings_txPowerInvalid => 'Neplatná hodnota výkonu TX (0-22 dBm)'; String get settings_txPowerInvalid => 'Neplatná hodnota výkonu TX (0-22 dBm)';
@override @override
String get settings_longRange => 'Dlhý dosah'; String get settings_clientRepeat => 'Opätovné použitie bez elektrickej siete';
@override @override
String get settings_fastSpeed => 'Rýchla rýchlosť'; String get settings_clientRepeatSubtitle =>
'Umožnite, aby toto zariadenie opakovávalo siete pre ostatných.';
@override
String get settings_clientRepeatFreqWarning =>
'Použitie off-grid systému vyžaduje frekvencie 433, 869 alebo 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1356,6 +1362,18 @@ class AppLocalizationsSk extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Spravovať Opakovanie'; String get map_manageRepeater => 'Spravovať Opakovanie';
@override
String get map_tapToAdd => 'Kliknite na uzly, aby ste ich pridali k ceste.';
@override
String get map_runTrace => 'Spustiť trasovaním cesty';
@override
String get map_removeLast => 'Odstrániť posledný';
@override
String get map_pathTraceCancelled => 'Zrušenie stopáže cesty bolo zrušené.';
@override @override
String get mapCache_title => 'Offline Mapa Pamäť'; String get mapCache_title => 'Offline Mapa Pamäť';
@@ -2685,6 +2703,9 @@ class AppLocalizationsSk extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Jedna alebo viac chmeľov chýba lokalita!'; 'Jedna alebo viac chmeľov chýba lokalita!';
@override
String get pathTrace_clearTooltip => 'Zmazať cestu';
@override @override
String get contacts_pathTrace => 'Sledovanie lúčov'; String get contacts_pathTrace => 'Sledovanie lúčov';
+32 -11
View File
@@ -143,6 +143,16 @@ class AppLocalizationsSl extends AppLocalizations {
@override @override
String get scanner_scan => 'Skeniraj'; String get scanner_scan => 'Skeniraj';
@override
String get scanner_bluetoothOff => 'Bluetooth je izklopljen';
@override
String get scanner_bluetoothOffMessage =>
'Prosimo, vklopite Bluetooth, da lahko poiščete naprave.';
@override
String get scanner_enableBluetooth => 'Omogočite Bluetooth';
@override @override
String get device_quickSwitch => 'Hitro preklop'; String get device_quickSwitch => 'Hitro preklop';
@@ -333,15 +343,6 @@ class AppLocalizationsSl extends AppLocalizations {
@override @override
String get settings_presets => 'Prednastavitve'; String get settings_presets => 'Prednastavitve';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Frekvenca (MHz)'; String get settings_frequency => 'Frekvenca (MHz)';
@@ -370,10 +371,15 @@ class AppLocalizationsSl extends AppLocalizations {
String get settings_txPowerInvalid => 'Neveljavna TX moč (0-22 dBm)'; String get settings_txPowerInvalid => 'Neveljavna TX moč (0-22 dBm)';
@override @override
String get settings_longRange => 'DDolg doseg'; String get settings_clientRepeat => 'Neovadno ponavljanje';
@override @override
String get settings_fastSpeed => 'Visoka hitrost'; String get settings_clientRepeatSubtitle =>
'Omogočite temu naprave, da ponavlja paketne sporočila za druge.';
@override
String get settings_clientRepeatFreqWarning =>
'Za ponovni prenos na brezžični način so potrebne frekvence 433, 869 ali 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1352,6 +1358,18 @@ class AppLocalizationsSl extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Upravljajte Ponovitve'; String get map_manageRepeater => 'Upravljajte Ponovitve';
@override
String get map_tapToAdd => 'Pritisnite na vozlišča, da jih dodate poti.';
@override
String get map_runTrace => 'Zaženi sledenje poti';
@override
String get map_removeLast => 'Odstrani Zadnji';
@override
String get map_pathTraceCancelled => 'Spremljanje poti je prekinjeno.';
@override @override
String get mapCache_title => String get mapCache_title =>
'Omrezni predpomnilnik zemljeških zemljejevskih slik'; 'Omrezni predpomnilnik zemljeških zemljejevskih slik';
@@ -2688,6 +2706,9 @@ class AppLocalizationsSl extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Ena ali več hmelju manjka lokacija!'; 'Ena ali več hmelju manjka lokacija!';
@override
String get pathTrace_clearTooltip => 'Počisti pot';
@override @override
String get contacts_pathTrace => 'Sledenje poti'; String get contacts_pathTrace => 'Sledenje poti';
+32 -11
View File
@@ -142,6 +142,16 @@ class AppLocalizationsSv extends AppLocalizations {
@override @override
String get scanner_scan => 'Skanna'; String get scanner_scan => 'Skanna';
@override
String get scanner_bluetoothOff => 'Bluetooth är avstängt';
@override
String get scanner_bluetoothOffMessage =>
'Vänligen aktivera Bluetooth för att söka efter enheter.';
@override
String get scanner_enableBluetooth => 'Aktivera Bluetooth';
@override @override
String get device_quickSwitch => 'Snabb växling'; String get device_quickSwitch => 'Snabb växling';
@@ -331,15 +341,6 @@ class AppLocalizationsSv extends AppLocalizations {
@override @override
String get settings_presets => 'Fördefinierade inställningar'; String get settings_presets => 'Fördefinierade inställningar';
@override
String get settings_preset915Mhz => '915 MHz';
@override
String get settings_preset868Mhz => '868 MHz';
@override
String get settings_preset433Mhz => '433 MHz';
@override @override
String get settings_frequency => 'Frekvens (MHz)'; String get settings_frequency => 'Frekvens (MHz)';
@@ -368,10 +369,15 @@ class AppLocalizationsSv extends AppLocalizations {
String get settings_txPowerInvalid => 'Ogiltig TX-effekt (0-22 dBm)'; String get settings_txPowerInvalid => 'Ogiltig TX-effekt (0-22 dBm)';
@override @override
String get settings_longRange => 'Lång räckvidd'; String get settings_clientRepeat => 'Upprepa utan elnät';
@override @override
String get settings_fastSpeed => 'Snabb hastighet'; String get settings_clientRepeatSubtitle =>
'Låt enheten repetera nätpaket för andra användare.';
@override
String get settings_clientRepeatFreqWarning =>
'För att kunna kommunicera utanför elnätet krävs frekvenserna 433, 869 eller 918 MHz.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1348,6 +1354,18 @@ class AppLocalizationsSv extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Hantera Upprepare'; String get map_manageRepeater => 'Hantera Upprepare';
@override
String get map_tapToAdd => 'Tryck på noder för att lägga till dem i banan.';
@override
String get map_runTrace => 'Kör spårsökning';
@override
String get map_removeLast => 'Ta bort sista';
@override
String get map_pathTraceCancelled => 'Sökvägsspårning avbruten.';
@override @override
String get mapCache_title => 'Offline Kartcache'; String get mapCache_title => 'Offline Kartcache';
@@ -2673,6 +2691,9 @@ class AppLocalizationsSv extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'En eller flera av humlen saknar en plats!'; 'En eller flera av humlen saknar en plats!';
@override
String get pathTrace_clearTooltip => 'Rensa väg';
@override @override
String get contacts_pathTrace => 'Path Trace'; String get contacts_pathTrace => 'Path Trace';
+32 -11
View File
@@ -143,6 +143,16 @@ class AppLocalizationsUk extends AppLocalizations {
@override @override
String get scanner_scan => 'Сканувати'; String get scanner_scan => 'Сканувати';
@override
String get scanner_bluetoothOff => 'Bluetooth вимкнено';
@override
String get scanner_bluetoothOffMessage =>
'Будь ласка, увімкніть Bluetooth, щоб сканувати пристрої.';
@override
String get scanner_enableBluetooth => 'Увімкніть Bluetooth';
@override @override
String get device_quickSwitch => 'Швидке перемикання'; String get device_quickSwitch => 'Швидке перемикання';
@@ -336,15 +346,6 @@ class AppLocalizationsUk extends AppLocalizations {
@override @override
String get settings_presets => 'Попередні налаштування'; String get settings_presets => 'Попередні налаштування';
@override
String get settings_preset915Mhz => '915 МГц';
@override
String get settings_preset868Mhz => '868 МГц';
@override
String get settings_preset433Mhz => '433 МГц';
@override @override
String get settings_frequency => 'Частота (МГц)'; String get settings_frequency => 'Частота (МГц)';
@@ -373,10 +374,15 @@ class AppLocalizationsUk extends AppLocalizations {
String get settings_txPowerInvalid => 'Некоректна потужність TX (0-22 дБм)'; String get settings_txPowerInvalid => 'Некоректна потужність TX (0-22 дБм)';
@override @override
String get settings_longRange => 'Дальній діапазон'; String get settings_clientRepeat => 'Автономна система';
@override @override
String get settings_fastSpeed => 'Висока швидкість'; String get settings_clientRepeatSubtitle =>
'Дозвольте цьому пристрою повторювати пакети даних для інших пристроїв.';
@override
String get settings_clientRepeatFreqWarning =>
'Повтор без підключення до мережі вимагає частоти 433, 869 або 918 МГц.';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1361,6 +1367,18 @@ class AppLocalizationsUk extends AppLocalizations {
@override @override
String get map_manageRepeater => 'Керувати ретранслятором'; String get map_manageRepeater => 'Керувати ретранслятором';
@override
String get map_tapToAdd => 'Натисніть на вузли, щоб додати їх до шляху';
@override
String get map_runTrace => 'Виконати трасування шляху';
@override
String get map_removeLast => 'Видалити останній';
@override
String get map_pathTraceCancelled => 'Відмінується трасування шляху';
@override @override
String get mapCache_title => 'Офлайн-кеш карти'; String get mapCache_title => 'Офлайн-кеш карти';
@@ -2709,6 +2727,9 @@ class AppLocalizationsUk extends AppLocalizations {
String get pathTrace_someHopsNoLocation => String get pathTrace_someHopsNoLocation =>
'Одне або більше хмелів відсутнє місце розташування!'; 'Одне або більше хмелів відсутнє місце розташування!';
@override
String get pathTrace_clearTooltip => 'Очистити шлях';
@override @override
String get contacts_pathTrace => 'Трасування шляхів'; String get contacts_pathTrace => 'Трасування шляхів';
+30 -11
View File
@@ -142,6 +142,15 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get scanner_scan => '扫描'; String get scanner_scan => '扫描';
@override
String get scanner_bluetoothOff => '蓝牙已关闭';
@override
String get scanner_bluetoothOffMessage => '请打开蓝牙功能,以便搜索设备。';
@override
String get scanner_enableBluetooth => '启用蓝牙';
@override @override
String get device_quickSwitch => '快速切换'; String get device_quickSwitch => '快速切换';
@@ -322,15 +331,6 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get settings_presets => '预设'; String get settings_presets => '预设';
@override
String get settings_preset915Mhz => '915 兆赫';
@override
String get settings_preset868Mhz => '868 兆赫';
@override
String get settings_preset433Mhz => '433 兆赫';
@override @override
String get settings_frequency => '频率 (MHz)'; String get settings_frequency => '频率 (MHz)';
@@ -359,10 +359,14 @@ class AppLocalizationsZh extends AppLocalizations {
String get settings_txPowerInvalid => '无效的发射功率(0-22 dBm'; String get settings_txPowerInvalid => '无效的发射功率(0-22 dBm';
@override @override
String get settings_longRange => '远距'; String get settings_clientRepeat => '网重复';
@override @override
String get settings_fastSpeed => '高速'; String get settings_clientRepeatSubtitle => '允许此设备重复发送网状数据包给其他设备';
@override
String get settings_clientRepeatFreqWarning =>
'离网重复通信需要使用 433、869 或 918 兆赫兹的频率。';
@override @override
String settings_error(String message) { String settings_error(String message) {
@@ -1301,6 +1305,18 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get map_manageRepeater => '管理重复器'; String get map_manageRepeater => '管理重复器';
@override
String get map_tapToAdd => '点击节点将其添加到路径中';
@override
String get map_runTrace => '运行路径跟踪';
@override
String get map_removeLast => '删除最后一个';
@override
String get map_pathTraceCancelled => '路径跟踪已取消';
@override @override
String get mapCache_title => '离线地图缓存'; String get mapCache_title => '离线地图缓存';
@@ -2557,6 +2573,9 @@ class AppLocalizationsZh extends AppLocalizations {
@override @override
String get pathTrace_someHopsNoLocation => '其中一个或多个啤酒花缺少位置!'; String get pathTrace_someHopsNoLocation => '其中一个或多个啤酒花缺少位置!';
@override
String get pathTrace_clearTooltip => '清除路径';
@override @override
String get contacts_pathTrace => '路径追踪'; String get contacts_pathTrace => '路径追踪';
+12 -8
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Aantal Contacten", "settings_infoContactsCount": "Aantal Contacten",
"settings_infoChannelCount": "Aantal Kanalen", "settings_infoChannelCount": "Aantal Kanalen",
"settings_presets": "Presets", "settings_presets": "Presets",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Frequentie (MHz)", "settings_frequency": "Frequentie (MHz)",
"settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyHelper": "300,0 - 2500,0",
"settings_frequencyInvalid": "Ongeldige frequentie (300-2500 MHz)", "settings_frequencyInvalid": "Ongeldige frequentie (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX Vermogen (dBm)", "settings_txPower": "TX Vermogen (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Ongeldige TX-vermogen (0-22 dBm)", "settings_txPowerInvalid": "Ongeldige TX-vermogen (0-22 dBm)",
"settings_longRange": "Lange Afstand",
"settings_fastSpeed": "Hoge Snelheid",
"settings_error": "Fout: {message}", "settings_error": "Fout: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{nieuw knooppunt} other{nieuwe knooppunten}}", "notification_newNodesCount": "{count} {count, plural, =1{nieuw knooppunt} other{nieuwe knooppunten}}",
"notification_newTypeDiscovered": "Nieuw {contactType} ontdekt", "notification_newTypeDiscovered": "Nieuw {contactType} ontdekt",
"notification_receivedNewMessage": "Nieuw bericht ontvangen", "notification_receivedNewMessage": "Nieuw bericht ontvangen",
"contacts_zeroHopContactAdvertFailed": "Mislukt om contact te verzenden",
"settings_gpxExportRepeatersSubtitle": "Exporteert repeaters / roomserver met een locatie naar GPX-bestand.", "settings_gpxExportRepeatersSubtitle": "Exporteert repeaters / roomserver met een locatie naar GPX-bestand.",
"settings_gpxExportRepeaters": "Exporteer repeaters / roomserver naar GPX", "settings_gpxExportRepeaters": "Exporteer repeaters / roomserver naar GPX",
"settings_gpxExportSuccess": "Succesvol GPX-bestand geëxporteerd.", "settings_gpxExportSuccess": "Succesvol GPX-bestand geëxporteerd.",
@@ -1591,6 +1585,16 @@
"settings_gpxExportAllContacts": "Alle contactlocaties", "settings_gpxExportAllContacts": "Alle contactlocaties",
"settings_gpxExportShareText": "Kaartgegevens geëxporteerd uit meshcore-open", "settings_gpxExportShareText": "Kaartgegevens geëxporteerd uit meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open GPX kaartgegevens exporteren", "settings_gpxExportShareSubject": "meshcore-open GPX kaartgegevens exporteren",
"pathTrace_someHopsNoLocation": "Een of meer van de hops ontbreken een locatie!" "pathTrace_someHopsNoLocation": "Een of meer van de hops ontbreken een locatie!",
"map_removeLast": "Verwijder Laatste",
"pathTrace_clearTooltip": "Weg wissen",
"map_pathTraceCancelled": "Pad traceren geannuleerd",
"map_tapToAdd": "Tik op knooppunten om ze toe te voegen aan het pad",
"map_runTrace": "Padeshulp traceren",
"scanner_enableBluetooth": "Activeer Bluetooth",
"scanner_bluetoothOffMessage": "Zorg ervoor dat Bluetooth is ingeschakeld om naar apparaten te zoeken.",
"scanner_bluetoothOff": "Bluetooth is uitgeschakeld",
"settings_clientRepeat": "Herhalen: Afgekoppeld",
"settings_clientRepeatSubtitle": "Laat dit apparaat de mesh-pakketten opnieuw verzenden voor andere apparaten.",
"settings_clientRepeatFreqWarning": "Om een signaal buiten het netwerk te versturen, zijn frequenties van 433, 869 of 918 MHz vereist."
} }
+12 -8
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Liczba kontaktów", "settings_infoContactsCount": "Liczba kontaktów",
"settings_infoChannelCount": "Liczba kanałów", "settings_infoChannelCount": "Liczba kanałów",
"settings_presets": "Preset", "settings_presets": "Preset",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Częstotliwość (MHz)", "settings_frequency": "Częstotliwość (MHz)",
"settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyHelper": "300,0 - 2500,0",
"settings_frequencyInvalid": "Nieprawidłowa częstotliwość (300-2500 MHz)", "settings_frequencyInvalid": "Nieprawidłowa częstotliwość (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX Moc (dBm)", "settings_txPower": "TX Moc (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Nieprawidłowa moc TX (0-22 dBm)", "settings_txPowerInvalid": "Nieprawidłowa moc TX (0-22 dBm)",
"settings_longRange": "Długi zasięg",
"settings_fastSpeed": "Szybka prędkość",
"settings_error": "Błąd: {message}", "settings_error": "Błąd: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{nowy węzeł} few{nowe węzły} many{nowych węzłów} other{nowych węzłów}}", "notification_newNodesCount": "{count} {count, plural, =1{nowy węzeł} few{nowe węzły} many{nowych węzłów} other{nowych węzłów}}",
"notification_newTypeDiscovered": "Nowy {contactType} wykryty", "notification_newTypeDiscovered": "Nowy {contactType} wykryty",
"notification_receivedNewMessage": "Otrzymano nową wiadomość", "notification_receivedNewMessage": "Otrzymano nową wiadomość",
"contacts_zeroHopContactAdvertFailed": "Nie udało się wysłać kontaktu.",
"settings_gpxExportContacts": "Eksportuj towarzyszy do GPX", "settings_gpxExportContacts": "Eksportuj towarzyszy do GPX",
"settings_gpxExportRepeaters": "Eksportuj powtórki / serwer pokojowy do GPX", "settings_gpxExportRepeaters": "Eksportuj powtórki / serwer pokojowy do GPX",
"settings_gpxExportRepeatersSubtitle": "Eksportuje powtarzacze / roomserver z lokalizacją do pliku GPX.", "settings_gpxExportRepeatersSubtitle": "Eksportuje powtarzacze / roomserver z lokalizacją do pliku GPX.",
@@ -1591,6 +1585,16 @@
"settings_gpxExportChat": "Lokalizacje towarzyszy", "settings_gpxExportChat": "Lokalizacje towarzyszy",
"settings_gpxExportShareText": "Dane mapy wyeksportowane z meshcore-open", "settings_gpxExportShareText": "Dane mapy wyeksportowane z meshcore-open",
"settings_gpxExportShareSubject": "Eksport danych mapy GPX meshcore-open", "settings_gpxExportShareSubject": "Eksport danych mapy GPX meshcore-open",
"pathTrace_someHopsNoLocation": "Jeden lub więcej z chmieli nie ma określonej lokalizacji!" "pathTrace_someHopsNoLocation": "Jeden lub więcej z chmieli nie ma określonej lokalizacji!",
"map_pathTraceCancelled": "Śledzenie ścieżki anulowano.",
"map_runTrace": "Uruchom ślad ścieżki",
"pathTrace_clearTooltip": "Wyczyść ścieżkę",
"map_removeLast": "Usuń ostatni",
"map_tapToAdd": "Kliknij na węzły, aby dodać je do ścieżki.",
"scanner_bluetoothOffMessage": "Prosimy włączyć Bluetooth, aby przeskanować urządzenia.",
"scanner_bluetoothOff": "Bluetooth jest wyłączony",
"scanner_enableBluetooth": "Włącz Bluetooth",
"settings_clientRepeatSubtitle": "Pozwól temu urządzeniu powtarzać pakiety danych dla innych urządzeń.",
"settings_clientRepeat": "Powtórzenie: Niezależne od sieci",
"settings_clientRepeatFreqWarning": "Powtórka poza siecią wymaga częstotliwości 433, 869 lub 918 MHz."
} }
+12 -8
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Número de Contatos", "settings_infoContactsCount": "Número de Contatos",
"settings_infoChannelCount": "Número do Canal", "settings_infoChannelCount": "Número do Canal",
"settings_presets": "Presets", "settings_presets": "Presets",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Frequência (MHz)", "settings_frequency": "Frequência (MHz)",
"settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyHelper": "300,0 - 2500,0",
"settings_frequencyInvalid": "Frequência inválida (300-2500 MHz)", "settings_frequencyInvalid": "Frequência inválida (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX Potência (dBm)", "settings_txPower": "TX Potência (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Potência de TX inválida (0-22 dBm)", "settings_txPowerInvalid": "Potência de TX inválida (0-22 dBm)",
"settings_longRange": "Alcance Longo",
"settings_fastSpeed": "Velocidade Rápida",
"settings_error": "Erro: {message}", "settings_error": "Erro: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{novo nó} other{novos nós}}", "notification_newNodesCount": "{count} {count, plural, =1{novo nó} other{novos nós}}",
"notification_newTypeDiscovered": "Novo {contactType} descoberto", "notification_newTypeDiscovered": "Novo {contactType} descoberto",
"notification_receivedNewMessage": "Nova mensagem recebida", "notification_receivedNewMessage": "Nova mensagem recebida",
"contacts_zeroHopContactAdvertFailed": "Falha ao enviar contato.",
"settings_gpxExportRepeaters": "Exportar repetidores / servidor de sala para GPX", "settings_gpxExportRepeaters": "Exportar repetidores / servidor de sala para GPX",
"settings_gpxExportRepeatersSubtitle": "Exporta repetidores / roomserver com localização para arquivo GPX.", "settings_gpxExportRepeatersSubtitle": "Exporta repetidores / roomserver com localização para arquivo GPX.",
"settings_gpxExportSuccess": "Arquivo GPX exportado com sucesso.", "settings_gpxExportSuccess": "Arquivo GPX exportado com sucesso.",
@@ -1591,6 +1585,16 @@
"settings_gpxExportAllContacts": "Todos os locais de contatos", "settings_gpxExportAllContacts": "Todos os locais de contatos",
"settings_gpxExportShareText": "Dados do mapa exportados do meshcore-open", "settings_gpxExportShareText": "Dados do mapa exportados do meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open exportação de dados de mapa GPX", "settings_gpxExportShareSubject": "meshcore-open exportação de dados de mapa GPX",
"pathTrace_someHopsNoLocation": "Um ou mais dos lúpulos estão sem localização!" "pathTrace_someHopsNoLocation": "Um ou mais dos lúpulos estão sem localização!",
"map_runTrace": "Executar Traçado de Caminho",
"map_pathTraceCancelled": "Rastreamento de caminho cancelado.",
"pathTrace_clearTooltip": "Limpar caminho",
"map_removeLast": "Remover Último",
"map_tapToAdd": "Toque nos nós para adicioná-los ao caminho.",
"scanner_enableBluetooth": "Ative o Bluetooth",
"scanner_bluetoothOff": "Bluetooth está desativado",
"scanner_bluetoothOffMessage": "Por favor, ative o Bluetooth para escanear por dispositivos.",
"settings_clientRepeatFreqWarning": "A repetição fora da rede requer frequências de 433, 869 ou 918 MHz.",
"settings_clientRepeat": "Repetição sem rede",
"settings_clientRepeatSubtitle": "Permita que este dispositivo repita pacotes de rede para outros dispositivos."
} }
+12 -8
View File
@@ -101,9 +101,6 @@
"settings_infoContactsCount": "Количество контактов", "settings_infoContactsCount": "Количество контактов",
"settings_infoChannelCount": "Количество каналов", "settings_infoChannelCount": "Количество каналов",
"settings_presets": "Пресеты", "settings_presets": "Пресеты",
"settings_preset915Mhz": "915 МГц",
"settings_preset868Mhz": "868 МГц",
"settings_preset433Mhz": "433 МГц",
"settings_frequency": "Частота (МГц)", "settings_frequency": "Частота (МГц)",
"settings_frequencyHelper": "300.0 2500.0", "settings_frequencyHelper": "300.0 2500.0",
"settings_frequencyInvalid": "Недопустимая частота (300–2500 МГц)", "settings_frequencyInvalid": "Недопустимая частота (300–2500 МГц)",
@@ -113,8 +110,6 @@
"settings_txPower": "Мощность передачи (дБм)", "settings_txPower": "Мощность передачи (дБм)",
"settings_txPowerHelper": "0 22", "settings_txPowerHelper": "0 22",
"settings_txPowerInvalid": "Недопустимая мощность передачи (0–22 дБм)", "settings_txPowerInvalid": "Недопустимая мощность передачи (0–22 дБм)",
"settings_longRange": "Дальний радиус",
"settings_fastSpeed": "Высокая скорость",
"settings_error": "Ошибка: {message}", "settings_error": "Ошибка: {message}",
"appSettings_title": "Настройки приложения", "appSettings_title": "Настройки приложения",
"appSettings_appearance": "Внешний вид", "appSettings_appearance": "Внешний вид",
@@ -815,7 +810,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{новый узел} few{новых узла} many{новых узлов} other{новых узлов}}", "notification_newNodesCount": "{count} {count, plural, =1{новый узел} few{новых узла} many{новых узлов} other{новых узлов}}",
"notification_newTypeDiscovered": "Обнаружен новый {contactType}", "notification_newTypeDiscovered": "Обнаружен новый {contactType}",
"notification_receivedNewMessage": "Получено новое сообщение", "notification_receivedNewMessage": "Получено новое сообщение",
"contacts_zeroHopContactAdvertSent": "Отправлено сообщение по объявлению.",
"settings_gpxExportRepeaters": "Экспортировать рипитеры / сервер комнаты в GPX", "settings_gpxExportRepeaters": "Экспортировать рипитеры / сервер комнаты в GPX",
"settings_gpxExportRepeatersSubtitle": "Экспортирует ретрансляторы / сервер комнат с местоположением в файл GPX.", "settings_gpxExportRepeatersSubtitle": "Экспортирует ретрансляторы / сервер комнат с местоположением в файл GPX.",
"settings_gpxExportContacts": "Экспортировать спутников в GPX", "settings_gpxExportContacts": "Экспортировать спутников в GPX",
@@ -831,6 +825,16 @@
"settings_gpxExportNoContacts": "Нет контактов для экспорта.", "settings_gpxExportNoContacts": "Нет контактов для экспорта.",
"settings_gpxExportShareText": "Данные карты экспортированы из meshcore-open", "settings_gpxExportShareText": "Данные карты экспортированы из meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open экспорт данных карты GPX", "settings_gpxExportShareSubject": "meshcore-open экспорт данных карты GPX",
"pathTrace_someHopsNoLocation": "Одному или нескольким хмелям не указано местоположение!" "pathTrace_someHopsNoLocation": "Одному или нескольким хмелям не указано местоположение!",
"map_tapToAdd": "Нажимайте на узлы, чтобы добавить их в путь.",
"map_removeLast": "Удалить последний",
"map_pathTraceCancelled": "Отмена трассировки пути",
"pathTrace_clearTooltip": "Очистить путь",
"map_runTrace": "Запустить трассировку пути",
"scanner_enableBluetooth": "Включите Bluetooth",
"scanner_bluetoothOff": "Bluetooth выключен",
"scanner_bluetoothOffMessage": "Пожалуйста, включите Bluetooth, чтобы найти устройства.",
"settings_clientRepeatFreqWarning": "Для работы в режиме \"без подключения к сети\" требуется частота 433, 869 или 918 МГц.",
"settings_clientRepeatSubtitle": "Позвольте этому устройству повторять пакеты данных для других устройств.",
"settings_clientRepeat": "Повторение \"вне сети\""
} }
+12 -8
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Počet kontaktov", "settings_infoContactsCount": "Počet kontaktov",
"settings_infoChannelCount": "Počet kanálov", "settings_infoChannelCount": "Počet kanálov",
"settings_presets": "Prednastavenia", "settings_presets": "Prednastavenia",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Frekvencia (MHz)", "settings_frequency": "Frekvencia (MHz)",
"settings_frequencyHelper": "300,0 2500,0", "settings_frequencyHelper": "300,0 2500,0",
"settings_frequencyInvalid": "Neplatná frekvencia (300-2500 MHz)", "settings_frequencyInvalid": "Neplatná frekvencia (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX Výkon (dBm)", "settings_txPower": "TX Výkon (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Neplatná hodnota výkonu TX (0-22 dBm)", "settings_txPowerInvalid": "Neplatná hodnota výkonu TX (0-22 dBm)",
"settings_longRange": "Dlhý dosah",
"settings_fastSpeed": "Rýchla rýchlosť",
"settings_error": "Chyba: {message}", "settings_error": "Chyba: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{nový uzol} few{nové uzly} other{nových uzlov}}", "notification_newNodesCount": "{count} {count, plural, =1{nový uzol} few{nové uzly} other{nových uzlov}}",
"notification_newTypeDiscovered": "Nový {contactType} objavený", "notification_newTypeDiscovered": "Nový {contactType} objavený",
"notification_receivedNewMessage": "Prijatá nová správa", "notification_receivedNewMessage": "Prijatá nová správa",
"contacts_ShareContact": "Kopírovať kontakt do schránky",
"settings_gpxExportRepeatersSubtitle": "Exportuje repeater / roomserver s lokalitou do súboru GPX.", "settings_gpxExportRepeatersSubtitle": "Exportuje repeater / roomserver s lokalitou do súboru GPX.",
"settings_gpxExportContacts": "Export sprievodcov do GPX", "settings_gpxExportContacts": "Export sprievodcov do GPX",
"settings_gpxExportSuccess": "Úspešne exportovaný súbor GPX.", "settings_gpxExportSuccess": "Úspešne exportovaný súbor GPX.",
@@ -1591,6 +1585,16 @@
"settings_gpxExportChat": "Lokácie sprievodcov", "settings_gpxExportChat": "Lokácie sprievodcov",
"settings_gpxExportShareText": "Mapové údaje exportované z meshcore-open", "settings_gpxExportShareText": "Mapové údaje exportované z meshcore-open",
"settings_gpxExportShareSubject": "meshcore-open export dát GPX mapových údajov", "settings_gpxExportShareSubject": "meshcore-open export dát GPX mapových údajov",
"pathTrace_someHopsNoLocation": "Jedna alebo viac chmeľov chýba lokalita!" "pathTrace_someHopsNoLocation": "Jedna alebo viac chmeľov chýba lokalita!",
"pathTrace_clearTooltip": "Zmazať cestu",
"map_tapToAdd": "Kliknite na uzly, aby ste ich pridali k ceste.",
"map_removeLast": "Odstrániť posledný",
"map_runTrace": "Spustiť trasovaním cesty",
"map_pathTraceCancelled": "Zrušenie stopáže cesty bolo zrušené.",
"scanner_bluetoothOffMessage": "Prosím, zapnite Bluetooth, aby ste mohli skenovať pre zariadenia.",
"scanner_bluetoothOff": "Bluetooth je vypnutý",
"scanner_enableBluetooth": "Povolte Bluetooth",
"settings_clientRepeat": "Opätovné použitie bez elektrickej siete",
"settings_clientRepeatFreqWarning": "Použitie off-grid systému vyžaduje frekvencie 433, 869 alebo 918 MHz.",
"settings_clientRepeatSubtitle": "Umožnite, aby toto zariadenie opakovávalo siete pre ostatných."
} }
+12 -8
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Število stikov", "settings_infoContactsCount": "Število stikov",
"settings_infoChannelCount": "Število kanalov", "settings_infoChannelCount": "Število kanalov",
"settings_presets": "Prednastavitve", "settings_presets": "Prednastavitve",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Frekvenca (MHz)", "settings_frequency": "Frekvenca (MHz)",
"settings_frequencyHelper": "300,00 - 2500,00", "settings_frequencyHelper": "300,00 - 2500,00",
"settings_frequencyInvalid": "Neveljavna frekvenca (300-2500 MHz)", "settings_frequencyInvalid": "Neveljavna frekvenca (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX Moč (dBm)", "settings_txPower": "TX Moč (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Neveljavna TX moč (0-22 dBm)", "settings_txPowerInvalid": "Neveljavna TX moč (0-22 dBm)",
"settings_longRange": "DDolg doseg",
"settings_fastSpeed": "Visoka hitrost",
"settings_error": "Napaka: {message}", "settings_error": "Napaka: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{novo vozlišče} =2{novi vozlišči} few{nova vozlišča} other{novih vozlišč}}", "notification_newNodesCount": "{count} {count, plural, =1{novo vozlišče} =2{novi vozlišči} few{nova vozlišča} other{novih vozlišč}}",
"notification_newTypeDiscovered": "Odkrito novo {contactType}", "notification_newTypeDiscovered": "Odkrito novo {contactType}",
"notification_receivedNewMessage": "Prejeto novo sporočilo", "notification_receivedNewMessage": "Prejeto novo sporočilo",
"contacts_ShareContact": "Kopiraj stik v Odložišče",
"settings_gpxExportAll": "Izvozi vse kontakte v GPX", "settings_gpxExportAll": "Izvozi vse kontakte v GPX",
"settings_gpxExportContacts": "Izvoz spremljevalcev v GPX", "settings_gpxExportContacts": "Izvoz spremljevalcev v GPX",
"settings_gpxExportRepeatersSubtitle": "Izvozi ponovljene oddajnike / strežnik sobe z lokacijo v datoteko GPX.", "settings_gpxExportRepeatersSubtitle": "Izvozi ponovljene oddajnike / strežnik sobe z lokacijo v datoteko GPX.",
@@ -1591,6 +1585,16 @@
"settings_gpxExportNoContacts": "Ni stikov za izvoz.", "settings_gpxExportNoContacts": "Ni stikov za izvoz.",
"settings_gpxExportNotAvailable": "Ni podprto na vašem napravi/operacijskem sistemu", "settings_gpxExportNotAvailable": "Ni podprto na vašem napravi/operacijskem sistemu",
"settings_gpxExportShareSubject": "meshcore-open izvoz podatkov GPX karte", "settings_gpxExportShareSubject": "meshcore-open izvoz podatkov GPX karte",
"pathTrace_someHopsNoLocation": "Ena ali več hmelju manjka lokacija!" "pathTrace_someHopsNoLocation": "Ena ali več hmelju manjka lokacija!",
"map_tapToAdd": "Pritisnite na vozlišča, da jih dodate poti.",
"map_removeLast": "Odstrani Zadnji",
"map_runTrace": "Zaženi sledenje poti",
"pathTrace_clearTooltip": "Počisti pot",
"map_pathTraceCancelled": "Spremljanje poti je prekinjeno.",
"scanner_enableBluetooth": "Omogočite Bluetooth",
"scanner_bluetoothOffMessage": "Prosimo, vklopite Bluetooth, da lahko poiščete naprave.",
"scanner_bluetoothOff": "Bluetooth je izklopljen",
"settings_clientRepeatFreqWarning": "Za ponovni prenos na brezžični način so potrebne frekvence 433, 869 ali 918 MHz.",
"settings_clientRepeatSubtitle": "Omogočite temu naprave, da ponavlja paketne sporočila za druge.",
"settings_clientRepeat": "Neovadno ponavljanje"
} }
+12 -8
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Kontakterantal", "settings_infoContactsCount": "Kontakterantal",
"settings_infoChannelCount": "Kanalantal", "settings_infoChannelCount": "Kanalantal",
"settings_presets": "Fördefinierade inställningar", "settings_presets": "Fördefinierade inställningar",
"settings_preset915Mhz": "915 MHz",
"settings_preset868Mhz": "868 MHz",
"settings_preset433Mhz": "433 MHz",
"settings_frequency": "Frekvens (MHz)", "settings_frequency": "Frekvens (MHz)",
"settings_frequencyHelper": "300,0 - 2500,0", "settings_frequencyHelper": "300,0 - 2500,0",
"settings_frequencyInvalid": "Ogiltig frekvens (300-2500 MHz)", "settings_frequencyInvalid": "Ogiltig frekvens (300-2500 MHz)",
@@ -143,8 +140,6 @@
"settings_txPower": "TX-effekt (dBm)", "settings_txPower": "TX-effekt (dBm)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Ogiltig TX-effekt (0-22 dBm)", "settings_txPowerInvalid": "Ogiltig TX-effekt (0-22 dBm)",
"settings_longRange": "Lång räckvidd",
"settings_fastSpeed": "Snabb hastighet",
"settings_error": "Fel: {message}", "settings_error": "Fel: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{ny nod} other{nya noder}}", "notification_newNodesCount": "{count} {count, plural, =1{ny nod} other{nya noder}}",
"notification_newTypeDiscovered": "Ny {contactType} upptäckt", "notification_newTypeDiscovered": "Ny {contactType} upptäckt",
"notification_receivedNewMessage": "Nytt meddelande mottaget", "notification_receivedNewMessage": "Nytt meddelande mottaget",
"contacts_ShareContactZeroHop": "Dela kontakt via annons",
"settings_gpxExportAll": "Exportera alla kontakter till GPX", "settings_gpxExportAll": "Exportera alla kontakter till GPX",
"settings_gpxExportRepeatersSubtitle": "Exporterar repeater / roomserver med plats till GPX-fil.", "settings_gpxExportRepeatersSubtitle": "Exporterar repeater / roomserver med plats till GPX-fil.",
"settings_gpxExportSuccess": "Har exporterat GPX-fil med framgång", "settings_gpxExportSuccess": "Har exporterat GPX-fil med framgång",
@@ -1591,6 +1585,16 @@
"settings_gpxExportAllContacts": "Alla kontakters platser", "settings_gpxExportAllContacts": "Alla kontakters platser",
"settings_gpxExportShareSubject": "meshcore-open export av GPX-kartdata", "settings_gpxExportShareSubject": "meshcore-open export av GPX-kartdata",
"settings_gpxExportShareText": "Kartdata exporterad från meshcore-open", "settings_gpxExportShareText": "Kartdata exporterad från meshcore-open",
"pathTrace_someHopsNoLocation": "En eller flera av humlen saknar en plats!" "pathTrace_someHopsNoLocation": "En eller flera av humlen saknar en plats!",
"pathTrace_clearTooltip": "Rensa väg",
"map_pathTraceCancelled": "Sökvägsspårning avbruten.",
"map_runTrace": "Kör spårsökning",
"map_tapToAdd": "Tryck på noder för att lägga till dem i banan.",
"map_removeLast": "Ta bort sista",
"scanner_enableBluetooth": "Aktivera Bluetooth",
"scanner_bluetoothOffMessage": "Vänligen aktivera Bluetooth för att söka efter enheter.",
"scanner_bluetoothOff": "Bluetooth är avstängt",
"settings_clientRepeatSubtitle": "Låt enheten repetera nätpaket för andra användare.",
"settings_clientRepeat": "Upprepa utan elnät",
"settings_clientRepeatFreqWarning": "För att kunna kommunicera utanför elnätet krävs frekvenserna 433, 869 eller 918 MHz."
} }
+12 -8
View File
@@ -131,9 +131,6 @@
"settings_infoContactsCount": "Кількість контактів", "settings_infoContactsCount": "Кількість контактів",
"settings_infoChannelCount": "Кількість каналів", "settings_infoChannelCount": "Кількість каналів",
"settings_presets": "Попередні налаштування", "settings_presets": "Попередні налаштування",
"settings_preset915Mhz": "915 МГц",
"settings_preset868Mhz": "868 МГц",
"settings_preset433Mhz": "433 МГц",
"settings_frequency": "Частота (МГц)", "settings_frequency": "Частота (МГц)",
"settings_frequencyHelper": "300.0 - 2500.0", "settings_frequencyHelper": "300.0 - 2500.0",
"settings_frequencyInvalid": "Некоректна частота (300-2500 МГц)", "settings_frequencyInvalid": "Некоректна частота (300-2500 МГц)",
@@ -143,8 +140,6 @@
"settings_txPower": "Потужність TX (дБм)", "settings_txPower": "Потужність TX (дБм)",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "Некоректна потужність TX (0-22 дБм)", "settings_txPowerInvalid": "Некоректна потужність TX (0-22 дБм)",
"settings_longRange": "Дальній діапазон",
"settings_fastSpeed": "Висока швидкість",
"settings_error": "Помилка: {message}", "settings_error": "Помилка: {message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} {count, plural, =1{новий вузол} few{нових вузли} many{нових вузлів} other{нових вузлів}}", "notification_newNodesCount": "{count} {count, plural, =1{новий вузол} few{нових вузли} many{нових вузлів} other{нових вузлів}}",
"notification_newTypeDiscovered": "Виявлено новий {contactType}", "notification_newTypeDiscovered": "Виявлено новий {contactType}",
"notification_receivedNewMessage": "Отримано нове повідомлення", "notification_receivedNewMessage": "Отримано нове повідомлення",
"contacts_ShareContactZeroHop": "Поділитися контактом за оголошенням",
"settings_gpxExportRepeaters": "Експортувати ретранслятори / сервер кімнати до GPX", "settings_gpxExportRepeaters": "Експортувати ретранслятори / сервер кімнати до GPX",
"settings_gpxExportRepeatersSubtitle": "Експортує ретранслятори / сервер кімнати з місцезнаходженням у файл GPX.", "settings_gpxExportRepeatersSubtitle": "Експортує ретранслятори / сервер кімнати з місцезнаходженням у файл GPX.",
"settings_gpxExportSuccess": "Успішно експортовано файл GPX.", "settings_gpxExportSuccess": "Успішно експортовано файл GPX.",
@@ -1591,6 +1585,16 @@
"settings_gpxExportShareText": "Дані карти експортовані з meshcore-open", "settings_gpxExportShareText": "Дані карти експортовані з meshcore-open",
"settings_gpxExportAllContacts": "Усі місця контактів", "settings_gpxExportAllContacts": "Усі місця контактів",
"settings_gpxExportShareSubject": "експорт даних карти meshcore-open у форматі GPX", "settings_gpxExportShareSubject": "експорт даних карти meshcore-open у форматі GPX",
"pathTrace_someHopsNoLocation": "Одне або більше хмелів відсутнє місце розташування!" "pathTrace_someHopsNoLocation": "Одне або більше хмелів відсутнє місце розташування!",
"map_tapToAdd": "Натисніть на вузли, щоб додати їх до шляху",
"map_runTrace": "Виконати трасування шляху",
"pathTrace_clearTooltip": "Очистити шлях",
"map_removeLast": "Видалити останній",
"map_pathTraceCancelled": "Відмінується трасування шляху",
"scanner_enableBluetooth": "Увімкніть Bluetooth",
"scanner_bluetoothOffMessage": "Будь ласка, увімкніть Bluetooth, щоб сканувати пристрої.",
"scanner_bluetoothOff": "Bluetooth вимкнено",
"settings_clientRepeatFreqWarning": "Повтор без підключення до мережі вимагає частоти 433, 869 або 918 МГц.",
"settings_clientRepeatSubtitle": "Дозвольте цьому пристрою повторювати пакети даних для інших пристроїв.",
"settings_clientRepeat": "Автономна система"
} }
+12 -8
View File
@@ -136,9 +136,6 @@
"settings_infoContactsCount": "联系人数量", "settings_infoContactsCount": "联系人数量",
"settings_infoChannelCount": "通道数量", "settings_infoChannelCount": "通道数量",
"settings_presets": "预设", "settings_presets": "预设",
"settings_preset915Mhz": "915 兆赫",
"settings_preset868Mhz": "868 兆赫",
"settings_preset433Mhz": "433 兆赫",
"settings_frequency": "频率 (MHz)", "settings_frequency": "频率 (MHz)",
"settings_frequencyHelper": "300.0 - 2500.0", "settings_frequencyHelper": "300.0 - 2500.0",
"settings_frequencyInvalid": "无效频率(300-2500 MHz", "settings_frequencyInvalid": "无效频率(300-2500 MHz",
@@ -148,8 +145,6 @@
"settings_txPower": "TX 功率(dBm", "settings_txPower": "TX 功率(dBm",
"settings_txPowerHelper": "0 - 22", "settings_txPowerHelper": "0 - 22",
"settings_txPowerInvalid": "无效的发射功率(0-22 dBm", "settings_txPowerInvalid": "无效的发射功率(0-22 dBm",
"settings_longRange": "远距离",
"settings_fastSpeed": "高速",
"settings_error": "[保存:{message}]\n错误:{message}", "settings_error": "[保存:{message}]\n错误:{message}",
"@settings_error": { "@settings_error": {
"placeholders": { "placeholders": {
@@ -1575,7 +1570,6 @@
"notification_newNodesCount": "{count} 个新节点", "notification_newNodesCount": "{count} 个新节点",
"notification_newTypeDiscovered": "发现新 {contactType}", "notification_newTypeDiscovered": "发现新 {contactType}",
"notification_receivedNewMessage": "收到新消息", "notification_receivedNewMessage": "收到新消息",
"contacts_contactAdvertCopyFailed": "将广告复制到剪贴板操作失败。",
"settings_gpxExportRepeaters": "导出重复器/房间服务器到GPX", "settings_gpxExportRepeaters": "导出重复器/房间服务器到GPX",
"settings_gpxExportRepeatersSubtitle": "导出带有位置的重复器/房间服务器到GPX文件。", "settings_gpxExportRepeatersSubtitle": "导出带有位置的重复器/房间服务器到GPX文件。",
"settings_gpxExportContactsSubtitle": "导出带有位置的伙伴到GPX文件。", "settings_gpxExportContactsSubtitle": "导出带有位置的伙伴到GPX文件。",
@@ -1591,6 +1585,16 @@
"settings_gpxExportNoContacts": "没有联系人可导出", "settings_gpxExportNoContacts": "没有联系人可导出",
"settings_gpxExportShareText": "来自meshcore-open的导出地图数据", "settings_gpxExportShareText": "来自meshcore-open的导出地图数据",
"settings_gpxExportShareSubject": "meshcore-open GPX 地图数据导出", "settings_gpxExportShareSubject": "meshcore-open GPX 地图数据导出",
"pathTrace_someHopsNoLocation": "其中一个或多个啤酒花缺少位置!" "pathTrace_someHopsNoLocation": "其中一个或多个啤酒花缺少位置!",
"map_tapToAdd": "点击节点将其添加到路径中",
"pathTrace_clearTooltip": "清除路径",
"map_pathTraceCancelled": "路径跟踪已取消",
"map_removeLast": "删除最后一个",
"map_runTrace": "运行路径跟踪",
"scanner_bluetoothOffMessage": "请打开蓝牙功能,以便搜索设备。",
"scanner_bluetoothOff": "蓝牙已关闭",
"scanner_enableBluetooth": "启用蓝牙",
"settings_clientRepeat": "离网重复",
"settings_clientRepeatSubtitle": "允许此设备重复发送网状数据包给其他设备",
"settings_clientRepeatFreqWarning": "离网重复通信需要使用 433、869 或 918 兆赫兹的频率。"
} }
+194 -40
View File
@@ -59,46 +59,200 @@ class RadioSettings {
required this.txPowerDbm, required this.txPowerDbm,
}); });
// Preset configurations // Regional preset configurations
static RadioSettings get preset915MHz => RadioSettings( static final List<(String, RadioSettings)> presets = [
frequencyMHz: 915.0, (
bandwidth: LoRaBandwidth.bw125, 'Australia',
spreadingFactor: LoRaSpreadingFactor.sf7, RadioSettings(
codingRate: LoRaCodingRate.cr4_5, frequencyMHz: 915.8,
txPowerDbm: 20, bandwidth: LoRaBandwidth.bw250,
); spreadingFactor: LoRaSpreadingFactor.sf10,
codingRate: LoRaCodingRate.cr4_5,
static RadioSettings get preset868MHz => RadioSettings( txPowerDbm: 20,
frequencyMHz: 868.0, ),
bandwidth: LoRaBandwidth.bw125, ),
spreadingFactor: LoRaSpreadingFactor.sf7, (
codingRate: LoRaCodingRate.cr4_5, 'Australia (Narrow)',
txPowerDbm: 14, RadioSettings(
); frequencyMHz: 916.575,
bandwidth: LoRaBandwidth.bw62_5,
static RadioSettings get preset433MHz => RadioSettings( spreadingFactor: LoRaSpreadingFactor.sf7,
frequencyMHz: 433.0, codingRate: LoRaCodingRate.cr4_5,
bandwidth: LoRaBandwidth.bw125, txPowerDbm: 20,
spreadingFactor: LoRaSpreadingFactor.sf7, ),
codingRate: LoRaCodingRate.cr4_5, ),
txPowerDbm: 20, (
); 'Australia SA, WA, QLD',
RadioSettings(
static RadioSettings get presetLongRange => RadioSettings( frequencyMHz: 923.125,
frequencyMHz: 915.0, bandwidth: LoRaBandwidth.bw62_5,
bandwidth: LoRaBandwidth.bw125, spreadingFactor: LoRaSpreadingFactor.sf8,
spreadingFactor: LoRaSpreadingFactor.sf12, codingRate: LoRaCodingRate.cr4_5,
codingRate: LoRaCodingRate.cr4_8, txPowerDbm: 20,
txPowerDbm: 20, ),
); ),
(
static RadioSettings get presetFastSpeed => RadioSettings( 'Czech Republic',
frequencyMHz: 915.0, RadioSettings(
bandwidth: LoRaBandwidth.bw500, frequencyMHz: 869.432,
spreadingFactor: LoRaSpreadingFactor.sf7, bandwidth: LoRaBandwidth.bw62_5,
codingRate: LoRaCodingRate.cr4_5, spreadingFactor: LoRaSpreadingFactor.sf7,
txPowerDbm: 20, codingRate: LoRaCodingRate.cr4_5,
); txPowerDbm: 14,
),
),
(
'EU 433MHz',
RadioSettings(
frequencyMHz: 433.650,
bandwidth: LoRaBandwidth.bw250,
spreadingFactor: LoRaSpreadingFactor.sf11,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 20,
),
),
(
'EU/UK (Long Range)',
RadioSettings(
frequencyMHz: 869.525,
bandwidth: LoRaBandwidth.bw250,
spreadingFactor: LoRaSpreadingFactor.sf11,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 14,
),
),
(
'EU/UK (Medium Range)',
RadioSettings(
frequencyMHz: 869.525,
bandwidth: LoRaBandwidth.bw250,
spreadingFactor: LoRaSpreadingFactor.sf10,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 14,
),
),
(
'EU/UK (Narrow)',
RadioSettings(
frequencyMHz: 869.618,
bandwidth: LoRaBandwidth.bw62_5,
spreadingFactor: LoRaSpreadingFactor.sf8,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 14,
),
),
(
'New Zealand',
RadioSettings(
frequencyMHz: 917.375,
bandwidth: LoRaBandwidth.bw250,
spreadingFactor: LoRaSpreadingFactor.sf11,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 20,
),
),
(
'New Zealand (Narrow)',
RadioSettings(
frequencyMHz: 917.375,
bandwidth: LoRaBandwidth.bw62_5,
spreadingFactor: LoRaSpreadingFactor.sf7,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 20,
),
),
(
'Portugal 433',
RadioSettings(
frequencyMHz: 433.375,
bandwidth: LoRaBandwidth.bw62_5,
spreadingFactor: LoRaSpreadingFactor.sf9,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 20,
),
),
(
'Portugal 869',
RadioSettings(
frequencyMHz: 869.618,
bandwidth: LoRaBandwidth.bw62_5,
spreadingFactor: LoRaSpreadingFactor.sf7,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 14,
),
),
(
'Switzerland',
RadioSettings(
frequencyMHz: 869.618,
bandwidth: LoRaBandwidth.bw62_5,
spreadingFactor: LoRaSpreadingFactor.sf8,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 14,
),
),
(
'USA Arizona',
RadioSettings(
frequencyMHz: 908.205,
bandwidth: LoRaBandwidth.bw62_5,
spreadingFactor: LoRaSpreadingFactor.sf10,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 20,
),
),
(
'USA/Canada',
RadioSettings(
frequencyMHz: 910.525,
bandwidth: LoRaBandwidth.bw62_5,
spreadingFactor: LoRaSpreadingFactor.sf7,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 20,
),
),
(
'Vietnam',
RadioSettings(
frequencyMHz: 920.250,
bandwidth: LoRaBandwidth.bw250,
spreadingFactor: LoRaSpreadingFactor.sf11,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 20,
),
),
// Off-grid repeat presets (valid client_repeat frequencies)
(
'Off-Grid 433',
RadioSettings(
frequencyMHz: 433.0,
bandwidth: LoRaBandwidth.bw250,
spreadingFactor: LoRaSpreadingFactor.sf11,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 20,
),
),
(
'Off-Grid 869',
RadioSettings(
frequencyMHz: 869.0,
bandwidth: LoRaBandwidth.bw250,
spreadingFactor: LoRaSpreadingFactor.sf11,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 14,
),
),
(
'Off-Grid 918',
RadioSettings(
frequencyMHz: 918.0,
bandwidth: LoRaBandwidth.bw250,
spreadingFactor: LoRaSpreadingFactor.sf11,
codingRate: LoRaCodingRate.cr4_5,
txPowerDbm: 20,
),
),
];
int get frequencyHz => (frequencyMHz * 1000).round(); int get frequencyHz => (frequencyMHz * 1000).round();
int get bandwidthHz => bandwidth.hz; int get bandwidthHz => bandwidth.hz;
+1 -1
View File
@@ -55,7 +55,7 @@ class AppDebugLogScreen extends StatelessWidget {
child: hasEntries child: hasEntries
? ListView.separated( ? ListView.separated(
itemCount: entries.length, itemCount: entries.length,
separatorBuilder: (_, __) => const Divider(height: 1), separatorBuilder: (_, _) => const Divider(height: 1),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final entry = entries[index]; final entry = entries[index];
return ListTile( return ListTile(
+17 -2
View File
@@ -384,6 +384,7 @@ class AppSettingsScreen extends StatelessWidget {
); );
} }
// Fixed rendering issues
Widget _buildBatteryCard( Widget _buildBatteryCard(
BuildContext context, BuildContext context,
AppSettingsService settingsService, AppSettingsService settingsService,
@@ -399,6 +400,7 @@ class AppSettingsScreen extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox(height: 4),
Padding( Padding(
padding: const EdgeInsets.fromLTRB(16, 16, 16, 8), padding: const EdgeInsets.fromLTRB(16, 16, 16, 8),
child: Text( child: Text(
@@ -406,6 +408,8 @@ class AppSettingsScreen extends StatelessWidget {
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
), ),
), ),
// Main tile (icon + text only)
ListTile( ListTile(
leading: const Icon(Icons.battery_full), leading: const Icon(Icons.battery_full),
title: Text(context.l10n.appSettings_batteryChemistry), title: Text(context.l10n.appSettings_batteryChemistry),
@@ -416,8 +420,19 @@ class AppSettingsScreen extends StatelessWidget {
) )
: context.l10n.appSettings_batteryChemistryConnectFirst, : context.l10n.appSettings_batteryChemistryConnectFirst,
), ),
trailing: DropdownButton<String>( contentPadding: const EdgeInsets.symmetric(horizontal: 16),
value: selection, ),
// Dropdown (separate full-width row)
Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: DropdownButtonFormField<String>(
initialValue: selection,
isExpanded: true,
decoration: const InputDecoration(
border: UnderlineInputBorder(),
isDense: true,
),
onChanged: isConnected onChanged: isConnected
? (value) { ? (value) {
if (value != null) { if (value != null) {
+1 -1
View File
@@ -100,7 +100,7 @@ class _BleDebugLogScreenState extends State<BleDebugLogScreen> {
itemCount: showingFrames itemCount: showingFrames
? entries.length ? entries.length
: rawEntries.length, : rawEntries.length,
separatorBuilder: (_, __) => const Divider(height: 1), separatorBuilder: (_, _) => const Divider(height: 1),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (showingFrames) { if (showingFrames) {
final entry = entries[index]; final entry = entries[index];
+1 -1
View File
@@ -594,7 +594,7 @@ class _ChannelMessagePathMapScreenState
: ListView.separated( : ListView.separated(
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 4),
itemCount: hops.length, itemCount: hops.length,
separatorBuilder: (_, __) => const Divider(height: 1), separatorBuilder: (_, _) => const Divider(height: 1),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final hop = hops[index]; final hop = hops[index];
return ListTile( return ListTile(
+240 -53
View File
@@ -1,8 +1,10 @@
import 'dart:math'; import 'dart:math';
import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_map/flutter_map.dart';
import 'package:latlong2/latlong.dart'; import 'package:latlong2/latlong.dart';
import 'package:meshcore_open/screens/path_trace_map.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import '../connector/meshcore_connector.dart'; import '../connector/meshcore_connector.dart';
@@ -48,9 +50,14 @@ class _MapScreenState extends State<MapScreen> {
final MapMarkerService _markerService = MapMarkerService(); final MapMarkerService _markerService = MapMarkerService();
final Set<String> _hiddenMarkerIds = {}; final Set<String> _hiddenMarkerIds = {};
Set<String> _removedMarkerIds = {}; Set<String> _removedMarkerIds = {};
bool _isBuildingPathTrace = false;
bool _isSelectingPoi = false; bool _isSelectingPoi = false;
bool _hasInitializedMap = false; bool _hasInitializedMap = false;
bool _removedMarkersLoaded = false; bool _removedMarkersLoaded = false;
final List<int> _pathTrace = [];
final List<LatLng> _points = [];
final List<Polyline> _polylines = [];
bool _legendExpanded = false;
@override @override
void initState() { void initState() {
@@ -147,6 +154,19 @@ class _MapScreenState extends State<MapScreen> {
.where((c) => c.hasLocation) .where((c) => c.hasLocation)
.toList(); .toList();
_polylines.clear();
_polylines.addAll(
_points.length > 1
? [
Polyline(
points: _points,
strokeWidth: 4,
color: Colors.blueAccent,
),
]
: <Polyline>[],
);
// Calculate center and zoom of all nodes, or default to (0, 0) // Calculate center and zoom of all nodes, or default to (0, 0)
LatLng center = const LatLng(0, 0); LatLng center = const LatLng(0, 0);
double initialZoom = 10.0; double initialZoom = 10.0;
@@ -247,6 +267,12 @@ class _MapScreenState extends State<MapScreen> {
centerTitle: true, centerTitle: true,
automaticallyImplyLeading: false, automaticallyImplyLeading: false,
actions: [ actions: [
if (!_isBuildingPathTrace)
IconButton(
icon: const Icon(Icons.radar),
onPressed: () => _startPath(),
tooltip: context.l10n.contacts_pathTrace,
),
PopupMenuButton( PopupMenuButton(
itemBuilder: (context) => [ itemBuilder: (context) => [
PopupMenuItem( PopupMenuItem(
@@ -334,6 +360,8 @@ class _MapScreenState extends State<MapScreen> {
MapTileCacheService.userAgentPackageName, MapTileCacheService.userAgentPackageName,
maxZoom: 19, maxZoom: 19,
), ),
if (_polylines.isNotEmpty && _isBuildingPathTrace)
PolylineLayer(polylines: _polylines),
MarkerLayer( MarkerLayer(
markers: [ markers: [
if (highlightPosition != null) if (highlightPosition != null)
@@ -390,7 +418,12 @@ class _MapScreenState extends State<MapScreen> {
), ),
], ],
), ),
_buildLegend(contactsWithLocation.length, sharedMarkers.length), if (!_isBuildingPathTrace)
_buildLegend(
contactsWithLocation.length,
sharedMarkers.length,
),
if (_isBuildingPathTrace) _buildPathTraceOverlay(),
], ],
), ),
bottomNavigationBar: SafeArea( bottomNavigationBar: SafeArea(
@@ -434,7 +467,11 @@ class _MapScreenState extends State<MapScreen> {
width: 35, width: 35,
height: 35, height: 35,
child: GestureDetector( child: GestureDetector(
onTap: () => _showNodeInfo(context, contact), onLongPress: () =>
_isBuildingPathTrace ? _showNodeInfo(context, contact) : null,
onTap: () => _isBuildingPathTrace
? _addToPath(context, contact)
: _showNodeInfo(context, contact),
child: Column( child: Column(
children: [ children: [
Container( Container(
@@ -503,60 +540,102 @@ class _MapScreenState extends State<MapScreen> {
top: 16, top: 16,
right: 16, right: 16,
child: Card( child: Card(
child: Padding( child: Column(
padding: const EdgeInsets.all(12.0), mainAxisSize: MainAxisSize.min,
child: Column( children: [
crossAxisAlignment: CrossAxisAlignment.start, InkWell(
mainAxisSize: MainAxisSize.min, borderRadius: BorderRadius.circular(12),
children: [ onTap: () {
Text( setState(() {
context.l10n.map_nodesCount(nodeCount), _legendExpanded = !_legendExpanded;
style: const TextStyle( });
fontWeight: FontWeight.bold, },
fontSize: 14, child: Padding(
padding: const EdgeInsets.fromLTRB(12, 10, 12, 10),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
context.l10n.map_nodesCount(nodeCount),
style: const TextStyle(
fontWeight: FontWeight.bold,
fontSize: 14,
),
),
Text(
context.l10n.map_pinsCount(markerCount),
style: const TextStyle(
fontWeight: FontWeight.w600,
fontSize: 12,
),
),
],
),
const SizedBox(width: 8),
AnimatedRotation(
turns: _legendExpanded ? 0.5 : 0,
duration: const Duration(milliseconds: 200),
child: const Icon(Icons.expand_more, size: 20),
),
],
), ),
), ),
Text( ),
context.l10n.map_pinsCount(markerCount), AnimatedCrossFade(
style: const TextStyle( firstChild: const SizedBox.shrink(),
fontWeight: FontWeight.bold, secondChild: Padding(
fontSize: 12, padding: const EdgeInsets.fromLTRB(12, 0, 12, 12),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(height: 6),
_buildLegendItem(
Icons.person,
context.l10n.map_chat,
Colors.blue,
),
_buildLegendItem(
Icons.router,
context.l10n.map_repeater,
Colors.green,
),
_buildLegendItem(
Icons.meeting_room,
context.l10n.map_room,
Colors.purple,
),
_buildLegendItem(
Icons.sensors,
context.l10n.map_sensor,
Colors.orange,
),
_buildLegendItem(
Icons.flag,
context.l10n.map_pinDm,
Colors.blue,
),
_buildLegendItem(
Icons.flag,
context.l10n.map_pinPrivate,
Colors.purple,
),
_buildLegendItem(
Icons.flag,
context.l10n.map_pinPublic,
Colors.orange,
),
],
), ),
), ),
const SizedBox(height: 8), crossFadeState: _legendExpanded
_buildLegendItem( ? CrossFadeState.showSecond
Icons.person, : CrossFadeState.showFirst,
context.l10n.map_chat, duration: const Duration(milliseconds: 200),
Colors.blue, ),
), ],
_buildLegendItem(
Icons.router,
context.l10n.map_repeater,
Colors.green,
),
_buildLegendItem(
Icons.meeting_room,
context.l10n.map_room,
Colors.purple,
),
_buildLegendItem(
Icons.sensors,
context.l10n.map_sensor,
Colors.orange,
),
_buildLegendItem(Icons.flag, context.l10n.map_pinDm, Colors.blue),
_buildLegendItem(
Icons.flag,
context.l10n.map_pinPrivate,
Colors.purple,
),
_buildLegendItem(
Icons.flag,
context.l10n.map_pinPublic,
Colors.orange,
),
],
),
), ),
), ),
); );
@@ -564,7 +643,7 @@ class _MapScreenState extends State<MapScreen> {
Widget _buildLegendItem(IconData icon, String label, Color color) { Widget _buildLegendItem(IconData icon, String label, Color color) {
return Padding( return Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0), padding: const EdgeInsets.symmetric(vertical: 1.0),
child: Row( child: Row(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
@@ -1412,6 +1491,114 @@ class _MapScreenState extends State<MapScreen> {
return context.l10n.time_allTime; return context.l10n.time_allTime;
} }
} }
void _addToPath(BuildContext context, Contact contact) {
setState(() {
_pathTrace.add(
contact.publicKey[0],
); // Add first 16 bytes of public key to path trace
_points.add(LatLng(contact.latitude!, contact.longitude!));
});
}
void _startPath() {
setState(() {
_isBuildingPathTrace = true;
_pathTrace.clear();
_points.clear();
_polylines.clear();
});
}
void _removePath() {
setState(() {
_pathTrace.removeLast(); // Remove last node from path trace
_points.removeLast(); // Remove last point from points list
_polylines.clear(); // Clear polylines
});
}
Widget _buildPathTraceOverlay() {
final l10n = context.l10n;
return Positioned(
top: 16,
left: 16,
right: 16,
child: Card(
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(
l10n.contacts_pathTrace,
style: TextStyle(fontWeight: FontWeight.bold),
),
if (_pathTrace.isEmpty) const SizedBox(height: 8),
if (_pathTrace.isEmpty)
Text(l10n.map_tapToAdd, style: TextStyle(fontSize: 12)),
const SizedBox(height: 6),
if (_pathTrace.isNotEmpty)
Text(
"${l10n.path_currentPathLabel} ${formatDistance(getPathDistanceMeters(_points))}",
style: TextStyle(fontSize: 12, color: Colors.grey[700]),
),
SelectableText(
_pathTrace
.map((b) => b.toRadixString(16).padLeft(2, '0'))
.join(','),
style: TextStyle(fontSize: 18),
),
const SizedBox(height: 6),
Row(
mainAxisSize: MainAxisSize.min,
children: [
if (_pathTrace.isNotEmpty)
ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => PathTraceMapScreen(
title: l10n.contacts_pathTrace,
path: Uint8List.fromList(_pathTrace),
),
),
);
setState(() {
_isBuildingPathTrace = false;
});
},
child: Text(l10n.map_runTrace),
),
if (_pathTrace.isNotEmpty)
ElevatedButton(
onPressed: _removePath,
child: Text(l10n.map_removeLast),
),
if (_pathTrace.isEmpty)
ElevatedButton(
onPressed: () {
setState(() {
_isBuildingPathTrace = false;
_pathTrace.clear();
_points.clear();
_polylines.clear();
});
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(l10n.map_pathTraceCancelled)),
);
},
child: Text(l10n.common_cancel),
),
],
),
],
),
),
),
);
}
} }
class _MarkerPayload { class _MarkerPayload {
+81 -74
View File
@@ -13,6 +13,23 @@ import 'package:meshcore_open/services/map_tile_cache_service.dart';
import 'package:meshcore_open/widgets/snr_indicator.dart'; import 'package:meshcore_open/widgets/snr_indicator.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
double getPathDistanceMeters(List<LatLng> points) {
if (points.length <= 1) return 0.0;
double distanceMeters = 0.0;
final distanceCalculator = Distance();
for (int i = 0; i < points.length - 1; i++) {
distanceMeters += distanceCalculator(points[i], points[i + 1]);
}
return distanceMeters;
}
String formatDistance(double distanceMeters) {
return '(${(distanceMeters / 1609.34).toStringAsFixed(2)} Miles / ${(distanceMeters / 1000).toStringAsFixed(2)} Km)';
}
class PathTraceData { class PathTraceData {
final Uint8List pathData; final Uint8List pathData;
final Uint8List snrData; final Uint8List snrData;
@@ -50,7 +67,6 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
bool _isLoading = false; bool _isLoading = false;
bool _failed2Loaded = false; bool _failed2Loaded = false;
bool _hasData = false; bool _hasData = false;
bool _noLocationErr = false;
PathTraceData? _traceData; PathTraceData? _traceData;
List<LatLng> _points = <LatLng>[]; List<LatLng> _points = <LatLng>[];
List<Polyline> _polylines = []; List<Polyline> _polylines = [];
@@ -58,7 +74,7 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
double _initialZoom = 2.0; double _initialZoom = 2.0;
LatLngBounds? _bounds; LatLngBounds? _bounds;
ValueKey<String> _mapKey = const ValueKey('initial'); ValueKey<String> _mapKey = const ValueKey('initial');
double _pathDistance = 0.0; double _pathDistanceMeters = 0.0;
String _formatPathPrefixes(Uint8List pathBytes) { String _formatPathPrefixes(Uint8List pathBytes) {
return pathBytes return pathBytes
@@ -93,23 +109,11 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
return traceBytes; return traceBytes;
} }
double getPathDistance() {
double totalDistance = 0.0;
final distanceCalculator = Distance();
for (int i = 0; i < _points.length - 1; i++) {
totalDistance += distanceCalculator(_points[i], _points[i + 1]);
}
return totalDistance;
}
Future<void> _doPathTrace() async { Future<void> _doPathTrace() async {
if (mounted) { if (mounted) {
setState(() { setState(() {
_isLoading = true; _isLoading = true;
_failed2Loaded = false; _failed2Loaded = false;
_noLocationErr = false;
}); });
} }
@@ -160,6 +164,14 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
}); });
} }
if (code == respCodeErr) {
_timeoutTimer?.cancel();
if (!mounted) return;
setState(() {
_isLoading = false;
_failed2Loaded = true;
});
}
// Check if it's a binary response // Check if it's a binary response
if (frame.length > 8 && if (frame.length > 8 &&
code == pushCodeTraceData && code == pushCodeTraceData &&
@@ -215,8 +227,6 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
contact.latitude != null && contact.latitude != null &&
contact.longitude != null) { contact.longitude != null) {
_points.add(LatLng(contact.latitude!, contact.longitude!)); _points.add(LatLng(contact.latitude!, contact.longitude!));
} else {
_noLocationErr = true;
} }
} }
_polylines = _points.length > 1 _polylines = _points.length > 1
@@ -235,7 +245,7 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
_mapKey = ValueKey( _mapKey = ValueKey(
'${context.l10n.pathTrace_you},${_formatPathPrefixes(_traceData!.pathData)}', '${context.l10n.pathTrace_you},${_formatPathPrefixes(_traceData!.pathData)}',
); );
_pathDistance = getPathDistance(); _pathDistanceMeters = getPathDistanceMeters(_points);
}); });
} }
@@ -279,20 +289,7 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
top: false, top: false,
child: Stack( child: Stack(
children: [ children: [
if (_noLocationErr) if (!_hasData)
Center(
child: Card(
color: Colors.red,
child: Padding(
padding: EdgeInsets.all(12),
child: Text(
context.l10n.pathTrace_someHopsNoLocation,
style: TextStyle(color: Colors.white),
),
),
),
),
if (!_hasData && !_noLocationErr)
Center( Center(
child: Column( child: Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@@ -304,43 +301,11 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
], ],
), ),
), ),
if (_hasData && !_noLocationErr) if (_hasData) _buildMapPathTrace(context, tileCache),
FlutterMap(
key: _mapKey,
options: MapOptions(
initialCenter: _initialCenter!,
initialZoom: _initialZoom,
initialCameraFit: _bounds == null
? null
: CameraFit.bounds(
bounds: _bounds!,
padding: const EdgeInsets.all(64),
maxZoom: 16,
),
minZoom: 2.0,
maxZoom: 18.0,
),
children: [
TileLayer(
urlTemplate: kMapTileUrlTemplate,
tileProvider: tileCache.tileProvider,
userAgentPackageName:
MapTileCacheService.userAgentPackageName,
maxZoom: 19,
),
if (_polylines.isNotEmpty)
PolylineLayer(polylines: _polylines),
if (_traceData!.pathData.isNotEmpty)
MarkerLayer(
markers: _buildHopMarkers(_traceData!.pathData),
),
],
),
if (_points.isEmpty && if (_points.isEmpty &&
!_hasData && !_hasData &&
!_isLoading && !_isLoading &&
!_failed2Loaded && !_failed2Loaded)
!_noLocationErr)
Center( Center(
child: Card( child: Card(
color: Colors.white.withValues(alpha: 0.9), color: Colors.white.withValues(alpha: 0.9),
@@ -352,8 +317,7 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
), ),
), ),
), ),
if (_hasData && !_noLocationErr) if (_hasData) _buildLegendCard(context, _traceData!),
_buildLegendCard(context, _traceData!),
], ],
), ),
), ),
@@ -365,7 +329,8 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
List<Marker> _buildHopMarkers(List<int> pathData) { List<Marker> _buildHopMarkers(List<int> pathData) {
return [ return [
for (final hop in pathData) for (final hop in pathData)
if (_traceData!.pathContacts[hop]!.hasLocation) if (_traceData!.pathContacts[hop] != null &&
_traceData!.pathContacts[hop]!.hasLocation)
Marker( Marker(
point: LatLng( point: LatLng(
_traceData!.pathContacts[hop]!.latitude!, _traceData!.pathContacts[hop]!.latitude!,
@@ -453,7 +418,9 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
.toRadixString(16) .toRadixString(16)
.padLeft(2, '0') .padLeft(2, '0')
.toUpperCase(); .toUpperCase();
return contactName != null ? "$hex: $contactName" : hex; return contactName != null
? "$hex: $contactName"
: "$hex: ${context.l10n.channelPath_unknownRepeater}";
} }
} else { } else {
final contactName = final contactName =
@@ -462,7 +429,9 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
.toRadixString(16) .toRadixString(16)
.padLeft(2, '0') .padLeft(2, '0')
.toUpperCase(); .toUpperCase();
return contactName != null ? "$hex: $contactName" : hex; return contactName != null
? "$hex: $contactName"
: "$hex: ${context.l10n.channelPath_unknownRepeater}";
} }
} }
@@ -475,7 +444,9 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
.toRadixString(16) .toRadixString(16)
.padLeft(2, '0') .padLeft(2, '0')
.toUpperCase(); .toUpperCase();
return contactName != null ? "$hex: $contactName" : hex; return contactName != null
? "$hex: $contactName"
: "$hex: ${context.l10n.channelPath_unknownRepeater}";
} else { } else {
return context.l10n.pathTrace_you; return context.l10n.pathTrace_you;
} }
@@ -486,10 +457,46 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
.toRadixString(16) .toRadixString(16)
.padLeft(2, '0') .padLeft(2, '0')
.toUpperCase(); .toUpperCase();
return contactName != null ? "$hex: $contactName" : hex; return contactName != null
? "$hex: $contactName"
: "$hex: ${context.l10n.channelPath_unknownRepeater}";
} }
} }
Widget _buildMapPathTrace(
BuildContext context,
MapTileCacheService tileCache,
) {
return FlutterMap(
key: _mapKey,
options: MapOptions(
interactionOptions: InteractionOptions(flags: ~InteractiveFlag.rotate),
initialCenter: _initialCenter!,
initialZoom: _initialZoom,
initialCameraFit: _bounds == null
? null
: CameraFit.bounds(
bounds: _bounds!,
padding: const EdgeInsets.all(64),
maxZoom: 16,
),
minZoom: 2.0,
maxZoom: 18.0,
),
children: [
TileLayer(
urlTemplate: kMapTileUrlTemplate,
tileProvider: tileCache.tileProvider,
userAgentPackageName: MapTileCacheService.userAgentPackageName,
maxZoom: 19,
),
if (_polylines.isNotEmpty) PolylineLayer(polylines: _polylines),
if (_traceData!.pathData.isNotEmpty)
MarkerLayer(markers: _buildHopMarkers(_traceData!.pathData)),
],
);
}
Widget _buildLegendCard(BuildContext context, PathTraceData pathTraceData) { Widget _buildLegendCard(BuildContext context, PathTraceData pathTraceData) {
final l10n = context.l10n; final l10n = context.l10n;
final maxHeight = MediaQuery.of(context).size.height * 0.35; final maxHeight = MediaQuery.of(context).size.height * 0.35;
@@ -509,7 +516,7 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
Padding( Padding(
padding: const EdgeInsets.all(12), padding: const EdgeInsets.all(12),
child: Text( child: Text(
'${l10n.channelPath_repeaterHops} (${(_pathDistance / 1609.34).toStringAsFixed(2)} Miles / ${(_pathDistance / 1000).toStringAsFixed(2)} Km)', '${l10n.channelPath_repeaterHops} ${formatDistance(_pathDistanceMeters)}',
style: const TextStyle(fontWeight: FontWeight.w600), style: const TextStyle(fontWeight: FontWeight.w600),
), ),
), ),
@@ -523,7 +530,7 @@ class _PathTraceMapScreenState extends State<PathTraceMapScreen> {
child: ListView.separated( child: ListView.separated(
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 4),
itemCount: pathTraceData.pathData.length + 1, itemCount: pathTraceData.pathData.length + 1,
separatorBuilder: (_, __) => const Divider(height: 1), separatorBuilder: (_, _) => const Divider(height: 1),
itemBuilder: (context, index) { itemBuilder: (context, index) {
return Column( return Column(
children: [ children: [
+75 -7
View File
@@ -1,3 +1,6 @@
import 'dart:async';
import 'dart:io' show Platform;
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@@ -18,6 +21,8 @@ class ScannerScreen extends StatefulWidget {
class _ScannerScreenState extends State<ScannerScreen> { class _ScannerScreenState extends State<ScannerScreen> {
bool _changedNavigation = false; bool _changedNavigation = false;
late final VoidCallback _connectionListener; late final VoidCallback _connectionListener;
BluetoothAdapterState _bluetoothState = BluetoothAdapterState.unknown;
late StreamSubscription<BluetoothAdapterState> _bluetoothStateSubscription;
@override @override
void initState() { void initState() {
@@ -39,12 +44,25 @@ class _ScannerScreenState extends State<ScannerScreen> {
}; };
connector.addListener(_connectionListener); connector.addListener(_connectionListener);
_bluetoothStateSubscription = FlutterBluePlus.adapterState.listen((state) {
if (mounted) {
setState(() {
_bluetoothState = state;
});
// Cancel scan if Bluetooth turns off while scanning
if (state != BluetoothAdapterState.on) {
unawaited(connector.stopScan());
}
}
});
} }
@override @override
void dispose() { void dispose() {
final connector = Provider.of<MeshCoreConnector>(context, listen: false); final connector = Provider.of<MeshCoreConnector>(context, listen: false);
connector.removeListener(_connectionListener); connector.removeListener(_connectionListener);
unawaited(_bluetoothStateSubscription.cancel());
super.dispose(); super.dispose();
} }
@@ -62,6 +80,10 @@ class _ScannerScreenState extends State<ScannerScreen> {
builder: (context, connector, child) { builder: (context, connector, child) {
return Column( return Column(
children: [ children: [
// Bluetooth off warning
if (_bluetoothState == BluetoothAdapterState.off)
_bluetoothOffWarning(context),
// Status bar // Status bar
_buildStatusBar(context, connector), _buildStatusBar(context, connector),
@@ -76,15 +98,18 @@ class _ScannerScreenState extends State<ScannerScreen> {
builder: (context, connector, child) { builder: (context, connector, child) {
final isScanning = final isScanning =
connector.state == MeshCoreConnectionState.scanning; connector.state == MeshCoreConnectionState.scanning;
final isBluetoothOff = _bluetoothState == BluetoothAdapterState.off;
return FloatingActionButton.extended( return FloatingActionButton.extended(
onPressed: () { onPressed: isBluetoothOff
if (isScanning) { ? null
connector.stopScan(); : () {
} else { if (isScanning) {
connector.startScan(); connector.stopScan();
} } else {
}, connector.startScan();
}
},
icon: isScanning icon: isScanning
? const SizedBox( ? const SizedBox(
width: 20, width: 20,
@@ -205,4 +230,47 @@ class _ScannerScreenState extends State<ScannerScreen> {
} }
} }
} }
Widget _bluetoothOffWarning(BuildContext context) {
final errorColor = Theme.of(context).colorScheme.error;
return Container(
width: double.infinity,
padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
color: errorColor.withValues(alpha: 0.15),
child: Row(
children: [
Icon(Icons.bluetooth_disabled, size: 24, color: errorColor),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
context.l10n.scanner_bluetoothOff,
style: TextStyle(
color: errorColor,
fontWeight: FontWeight.w600,
fontSize: 14,
),
),
const SizedBox(height: 4),
Text(
context.l10n.scanner_bluetoothOffMessage,
style: TextStyle(
color: errorColor.withValues(alpha: 0.85),
fontSize: 12,
),
),
],
),
),
if (Platform.isAndroid)
TextButton(
onPressed: () => FlutterBluePlus.turnOn(),
child: Text(context.l10n.scanner_enableBluetooth),
),
],
),
);
}
} }
+150 -87
View File
@@ -21,6 +21,7 @@ class SettingsScreen extends StatefulWidget {
class _SettingsScreenState extends State<SettingsScreen> { class _SettingsScreenState extends State<SettingsScreen> {
bool _showBatteryVoltage = false; bool _showBatteryVoltage = false;
bool _deviceInfoExpanded = false;
String _appVersion = ''; String _appVersion = '';
@override @override
@@ -74,43 +75,84 @@ class _SettingsScreenState extends State<SettingsScreen> {
MeshCoreConnector connector, MeshCoreConnector connector,
) { ) {
final l10n = context.l10n; final l10n = context.l10n;
return Card( return Card(
child: Padding( child: Column(
padding: const EdgeInsets.all(16), crossAxisAlignment: CrossAxisAlignment.start,
child: Column( children: [
crossAxisAlignment: CrossAxisAlignment.start, InkWell(
children: [ borderRadius: BorderRadius.circular(12),
Text( onTap: () {
l10n.settings_deviceInfo, setState(() {
style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold), _deviceInfoExpanded = !_deviceInfoExpanded;
), });
const SizedBox(height: 16), },
_buildInfoRow(l10n.settings_infoName, connector.deviceDisplayName), child: Padding(
_buildInfoRow(l10n.settings_infoId, connector.deviceIdLabel), padding: const EdgeInsets.fromLTRB(16, 16, 16, 16),
_buildInfoRow( child: Row(
l10n.settings_infoStatus, children: [
connector.isConnected Expanded(
? l10n.common_connected child: Text(
: l10n.common_disconnected, l10n.settings_deviceInfo,
), style: const TextStyle(
_buildBatteryInfoRow(context, connector), fontSize: 18,
if (connector.selfName != null) fontWeight: FontWeight.bold,
_buildInfoRow(l10n.settings_nodeName, connector.selfName!), ),
if (connector.selfPublicKey != null) ),
_buildInfoRow( ),
l10n.settings_infoPublicKey, AnimatedRotation(
'${pubKeyToHex(connector.selfPublicKey!).substring(0, 16)}...', turns: _deviceInfoExpanded ? 0.5 : 0,
duration: const Duration(milliseconds: 200),
child: const Icon(Icons.expand_more),
),
],
), ),
_buildInfoRow(
l10n.settings_infoContactsCount,
'${connector.contacts.length}',
), ),
_buildInfoRow( ),
l10n.settings_infoChannelCount,
'${connector.channels.length}', AnimatedCrossFade(
firstChild: const SizedBox.shrink(),
secondChild: Padding(
padding: const EdgeInsets.fromLTRB(16, 0, 16, 16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_buildInfoRow(
l10n.settings_infoName,
connector.deviceDisplayName,
),
_buildInfoRow(l10n.settings_infoId, connector.deviceIdLabel),
_buildInfoRow(
l10n.settings_infoStatus,
connector.isConnected
? l10n.common_connected
: l10n.common_disconnected,
),
_buildBatteryInfoRow(context, connector),
if (connector.selfName != null)
_buildInfoRow(l10n.settings_nodeName, connector.selfName!),
if (connector.selfPublicKey != null)
_buildInfoRow(
l10n.settings_infoPublicKey,
'${pubKeyToHex(connector.selfPublicKey!).substring(0, 16)}...',
),
_buildInfoRow(
l10n.settings_infoContactsCount,
'${connector.contacts.length}',
),
_buildInfoRow(
l10n.settings_infoChannelCount,
'${connector.channels.length}',
),
],
),
), ),
], crossFadeState: _deviceInfoExpanded
), ? CrossFadeState.showSecond
: CrossFadeState.showFirst,
duration: const Duration(milliseconds: 200),
),
],
), ),
); );
} }
@@ -355,22 +397,33 @@ class _SettingsScreenState extends State<SettingsScreen> {
Color? valueColor, Color? valueColor,
VoidCallback? onTap, VoidCallback? onTap,
}) { }) {
final theme = Theme.of(context);
final row = Padding( final row = Padding(
padding: const EdgeInsets.symmetric(vertical: 4), padding: const EdgeInsets.symmetric(vertical: 10),
child: Row( child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Row(
children: [ children: [
if (leading != null) ...[leading, const SizedBox(width: 8)], if (leading != null) ...[leading, const SizedBox(width: 8)],
Text(label, style: TextStyle(color: Colors.grey[600])), Expanded(
child: Text(
label,
style: theme.textTheme.bodySmall?.copyWith(
color: theme.colorScheme.onSurfaceVariant,
fontWeight: FontWeight.w500,
),
),
),
], ],
), ),
Flexible( const SizedBox(height: 4),
child: Text( Text(
value, value,
style: TextStyle(fontWeight: FontWeight.w500, color: valueColor), style: theme.textTheme.bodyLarge?.copyWith(
overflow: TextOverflow.ellipsis, color: valueColor,
fontWeight: FontWeight.w500,
), ),
), ),
], ],
@@ -379,11 +432,12 @@ class _SettingsScreenState extends State<SettingsScreen> {
if (onTap != null) { if (onTap != null) {
return InkWell( return InkWell(
borderRadius: BorderRadius.circular(6),
onTap: onTap, onTap: onTap,
borderRadius: BorderRadius.circular(4),
child: row, child: row,
); );
} }
return row; return row;
} }
@@ -688,7 +742,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
); );
} }
_gpxExport( Future<void> _gpxExport(
GpxExport exporter, GpxExport exporter,
String name, String name,
String description, String description,
@@ -728,7 +782,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
} }
} }
_buildExportCard(MeshCoreConnector connector) { Widget _buildExportCard(MeshCoreConnector connector) {
final l10n = context.l10n; final l10n = context.l10n;
return Card( return Card(
child: Column( child: Column(
@@ -808,6 +862,7 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> {
LoRaSpreadingFactor _spreadingFactor = LoRaSpreadingFactor.sf7; LoRaSpreadingFactor _spreadingFactor = LoRaSpreadingFactor.sf7;
LoRaCodingRate _codingRate = LoRaCodingRate.cr4_5; LoRaCodingRate _codingRate = LoRaCodingRate.cr4_5;
final _txPowerController = TextEditingController(text: '20'); final _txPowerController = TextEditingController(text: '20');
bool _clientRepeat = false;
@override @override
void initState() { void initState() {
@@ -857,6 +912,8 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> {
if (widget.connector.currentTxPower != null) { if (widget.connector.currentTxPower != null) {
_txPowerController.text = widget.connector.currentTxPower.toString(); _txPowerController.text = widget.connector.currentTxPower.toString();
} }
_clientRepeat = widget.connector.clientRepeat ?? false;
} }
@override @override
@@ -906,9 +963,29 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> {
widget.connector.currentCr, widget.connector.currentCr,
); );
// if the client repeat isnt null then we know its supported
//otherwise we leave it out of the frame to avoid accidentally enabling
final knownRepeat = widget.connector.clientRepeat != null;
if (knownRepeat) {
const validRepeatFreqsKHz = {433000, 869000, 918000};
if (_clientRepeat && !validRepeatFreqsKHz.contains(freqHz)) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(l10n.settings_clientRepeatFreqWarning)),
);
return;
}
}
try { try {
await widget.connector.sendFrame( await widget.connector.sendFrame(
buildSetRadioParamsFrame(freqHz, bwHz, sf, cr), buildSetRadioParamsFrame(
freqHz,
bwHz,
sf,
cr,
clientRepeat: knownRepeat ? _clientRepeat : null,
),
); );
await widget.connector.sendFrame(buildSetRadioTxPowerFrame(txPower)); await widget.connector.sendFrame(buildSetRadioTxPowerFrame(txPower));
await widget.connector.refreshDeviceInfo(); await widget.connector.refreshDeviceInfo();
@@ -947,37 +1024,25 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( DropdownButtonFormField<int>(
l10n.settings_presets, decoration: InputDecoration(
style: const TextStyle(fontWeight: FontWeight.bold), labelText: l10n.settings_presets,
), border: const OutlineInputBorder(),
const SizedBox(height: 8), ),
Wrap( items: [
spacing: 8, for (var i = 0; i < RadioSettings.presets.length; i++)
children: [ DropdownMenuItem(
_PresetChip( value: i,
label: l10n.settings_preset915Mhz, child: Text(RadioSettings.presets[i].$1),
onTap: () => _applyPreset(RadioSettings.preset915MHz), ),
),
_PresetChip(
label: l10n.settings_preset868Mhz,
onTap: () => _applyPreset(RadioSettings.preset868MHz),
),
_PresetChip(
label: l10n.settings_preset433Mhz,
onTap: () => _applyPreset(RadioSettings.preset433MHz),
),
_PresetChip(
label: l10n.settings_longRange,
onTap: () => _applyPreset(RadioSettings.presetLongRange),
),
_PresetChip(
label: l10n.settings_fastSpeed,
onTap: () => _applyPreset(RadioSettings.presetFastSpeed),
),
], ],
onChanged: (index) {
if (index != null) {
_applyPreset(RadioSettings.presets[index].$2);
}
},
), ),
const SizedBox(height: 24), const SizedBox(height: 16),
TextField( TextField(
controller: _frequencyController, controller: _frequencyController,
decoration: InputDecoration( decoration: InputDecoration(
@@ -1049,6 +1114,16 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> {
), ),
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
), ),
if (widget.connector.clientRepeat != null) ...[
const SizedBox(height: 16),
SwitchListTile(
title: Text(l10n.settings_clientRepeat),
subtitle: Text(l10n.settings_clientRepeatSubtitle),
value: _clientRepeat,
onChanged: (value) => setState(() => _clientRepeat = value),
contentPadding: EdgeInsets.zero,
),
],
], ],
), ),
), ),
@@ -1062,15 +1137,3 @@ class _RadioSettingsDialogState extends State<_RadioSettingsDialog> {
); );
} }
} }
class _PresetChip extends StatelessWidget {
final String label;
final VoidCallback onTap;
const _PresetChip({required this.label, required this.onTap});
@override
Widget build(BuildContext context) {
return ActionChip(label: Text(label), onPressed: onTap);
}
}
+5 -12
View File
@@ -1,4 +1,3 @@
import 'dart:isolate';
import 'dart:io'; import 'dart:io';
import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:flutter_foreground_task/flutter_foreground_task.dart';
@@ -15,20 +14,14 @@ class BackgroundService {
channelDescription: 'Keeps MeshCore running in the background.', channelDescription: 'Keeps MeshCore running in the background.',
channelImportance: NotificationChannelImportance.LOW, channelImportance: NotificationChannelImportance.LOW,
priority: NotificationPriority.LOW, priority: NotificationPriority.LOW,
iconData: const NotificationIconData(
resType: ResourceType.mipmap,
resPrefix: ResourcePrefix.ic,
name: 'launcher',
),
), ),
iosNotificationOptions: const IOSNotificationOptions( iosNotificationOptions: const IOSNotificationOptions(
showNotification: false, showNotification: false,
playSound: false, playSound: false,
), ),
foregroundTaskOptions: const ForegroundTaskOptions( foregroundTaskOptions: ForegroundTaskOptions(
interval: 5000, eventAction: ForegroundTaskEventAction.repeat(5000),
autoRunOnBoot: false, autoRunOnBoot: false,
allowWakeLock: true,
allowWifiLock: false, allowWifiLock: false,
), ),
); );
@@ -64,13 +57,13 @@ void startCallback() {
class _MeshCoreTaskHandler extends TaskHandler { class _MeshCoreTaskHandler extends TaskHandler {
@override @override
void onStart(DateTime timestamp, SendPort? sendPort) {} Future<void> onStart(DateTime timestamp, TaskStarter starter) async {}
@override @override
void onRepeatEvent(DateTime timestamp, SendPort? sendPort) {} void onRepeatEvent(DateTime timestamp) {}
@override @override
void onDestroy(DateTime timestamp, SendPort? sendPort) {} Future<void> onDestroy(DateTime timestamp, bool isTimeout) async {}
@override @override
void onNotificationButtonPressed(String id) {} void onNotificationButtonPressed(String id) {}
+18 -18
View File
@@ -67,7 +67,7 @@ class NotificationService {
try { try {
await _notifications.initialize( await _notifications.initialize(
initSettings, settings: initSettings,
onDidReceiveNotificationResponse: _onNotificationTapped, onDidReceiveNotificationResponse: _onNotificationTapped,
); );
_isInitialized = true; _isInitialized = true;
@@ -149,10 +149,10 @@ class NotificationService {
); );
await _notifications.show( await _notifications.show(
contactId?.hashCode ?? 0, id: contactId?.hashCode ?? 0,
contactName, title: contactName,
message, body: message,
notificationDetails, notificationDetails: notificationDetails,
payload: 'message:$contactId', payload: 'message:$contactId',
); );
} }
@@ -194,10 +194,10 @@ class NotificationService {
); );
await _notifications.show( await _notifications.show(
contactId?.hashCode ?? DateTime.now().millisecondsSinceEpoch, id: contactId?.hashCode ?? DateTime.now().millisecondsSinceEpoch,
_l10n.notification_newTypeDiscovered(contactType), title: _l10n.notification_newTypeDiscovered(contactType),
contactName, body: contactName,
notificationDetails, notificationDetails: notificationDetails,
payload: 'advert:$contactId', payload: 'advert:$contactId',
); );
} }
@@ -248,10 +248,10 @@ class NotificationService {
: preview; : preview;
await _notifications.show( await _notifications.show(
channelIndex?.hashCode ?? DateTime.now().millisecondsSinceEpoch, id: channelIndex?.hashCode ?? DateTime.now().millisecondsSinceEpoch,
channelName, title: channelName,
body, body: body,
notificationDetails, notificationDetails: notificationDetails,
payload: 'channel:$channelIndex', payload: 'channel:$channelIndex',
); );
} }
@@ -285,7 +285,7 @@ class NotificationService {
} }
Future<void> cancel(int id) async { Future<void> cancel(int id) async {
await _notifications.cancel(id); await _notifications.cancel(id: id);
} }
// //
@@ -469,10 +469,10 @@ class NotificationService {
const notificationDetails = NotificationDetails(android: androidDetails); const notificationDetails = NotificationDetails(android: androidDetails);
await _notifications.show( await _notifications.show(
'batch_summary'.hashCode, id: 'batch_summary'.hashCode,
_l10n.notification_activityTitle, title: _l10n.notification_activityTitle,
parts.join(', '), body: parts.join(', '),
notificationDetails, notificationDetails: notificationDetails,
payload: 'batch', payload: 'batch',
); );
} }
+1 -1
View File
@@ -156,7 +156,7 @@ class _QrScannerWidgetState extends State<QrScannerWidget>
MobileScanner( MobileScanner(
controller: _controller, controller: _controller,
onDetect: _handleDetection, onDetect: _handleDetection,
errorBuilder: (context, error, child) { errorBuilder: (context, error) {
return _buildErrorWidget(context, error); return _buildErrorWidget(context, error);
}, },
), ),
+58 -58
View File
@@ -153,14 +153,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
dart_polylabel2:
dependency: transitive
description:
name: dart_polylabel2
sha256: "7eeab15ce72894e4bdba6a8765712231fc81be0bd95247de4ad9966abc57adc6"
url: "https://pub.dev"
source: hosted
version: "1.0.0"
dbus: dbus:
dependency: transitive dependency: transitive
description: description:
name: dbus name: dbus
sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" sha256: d0c98dcd4f5169878b6cf8f6e0a52403a9dff371a3e2f019697accbf6f44a270
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.7.11" version: "0.7.12"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@@ -173,10 +181,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: ffi name: ffi
sha256: d07d37192dbf97461359c1518788f203b0c9102cfd2c35a716b823741219542c sha256: "6d7fd89431262d8f3125e81b50d3847a091d846eafcd4fdb88dd06f36d705a45"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.5" version: "2.2.0"
file: file:
dependency: transitive dependency: transitive
description: description:
@@ -202,10 +210,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_blue_plus name: flutter_blue_plus
sha256: "399b3dbc15562ef59749f04e43a99ccbb91540022380d5f269aff3c2787534e4" sha256: "88a65ead7dea67ddcc03e6ca846163c6b6cc09a2dcebdb8bb601fcd654ea9382"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.0" version: "2.1.1"
flutter_blue_plus_android: flutter_blue_plus_android:
dependency: transitive dependency: transitive
description: description:
@@ -218,10 +226,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: flutter_blue_plus_darwin name: flutter_blue_plus_darwin
sha256: d160a8128e3a016fa58dd65ab6dac05cbc73e0fa799a1f24211d041641ed63ba sha256: "52b155d868e17c1c8ad85520a0912d447d92aedccb5a5e234d3edc98ebd1307a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.1.0" version: "8.1.1"
flutter_blue_plus_linux: flutter_blue_plus_linux:
dependency: transitive dependency: transitive
description: description:
@@ -250,10 +258,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: flutter_blue_plus_winrt name: flutter_blue_plus_winrt
sha256: "34be2d8e23d5881b46accebb0e71025f7d52869d72ea98b5082c20764e06aa80" sha256: ed894f0ab341f4cece8fa33edc381d46424a7c5bfd0e841d933d0f8c34c86521
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.0.16" version: "0.0.18"
flutter_cache_manager: flutter_cache_manager:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -266,18 +274,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_foreground_task name: flutter_foreground_task
sha256: "6cf10a27f5e344cd2ecad0752d3a5f4ec32846d82fda8753b3fe2480ebb832a3" sha256: "48ea45056155a99fb30b15f14f4039a044d925bc85f381ed0b2d3b00a60b99de"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.5.0" version: "9.2.0"
flutter_launcher_icons: flutter_launcher_icons:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_launcher_icons name: flutter_launcher_icons
sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea" sha256: "10f13781741a2e3972126fae08393d3c4e01fa4cd7473326b94b72cf594195e7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.13.1" version: "0.14.4"
flutter_linkify: flutter_linkify:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -290,34 +298,42 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_lints name: flutter_lints
sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" sha256: "3105dc8492f6183fb076ccf1f351ac3d60564bff92e20bfc4af9cc1651f4e7e1"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.0" version: "6.0.0"
flutter_local_notifications: flutter_local_notifications:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_local_notifications name: flutter_local_notifications
sha256: ef41ae901e7529e52934feba19ed82827b11baa67336829564aeab3129460610 sha256: "2b50e938a275e1ad77352d6a25e25770f4130baa61eaf02de7a9a884680954ad"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "18.0.1" version: "20.1.0"
flutter_local_notifications_linux: flutter_local_notifications_linux:
dependency: transitive dependency: transitive
description: description:
name: flutter_local_notifications_linux name: flutter_local_notifications_linux
sha256: "8f685642876742c941b29c32030f6f4f6dacd0e4eaecb3efbb187d6a3812ca01" sha256: dce0116868cedd2cdf768af0365fc37ff1cbef7c02c4f51d0587482e625868d0
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.0" version: "7.0.0"
flutter_local_notifications_platform_interface: flutter_local_notifications_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: flutter_local_notifications_platform_interface name: flutter_local_notifications_platform_interface
sha256: "6c5b83c86bf819cdb177a9247a3722067dd8cc6313827ce7c77a4b238a26fd52" sha256: "23de31678a48c084169d7ae95866df9de5c9d2a44be3e5915a2ff067aeeba899"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.0.0" version: "10.0.0"
flutter_local_notifications_windows:
dependency: transitive
description:
name: flutter_local_notifications_windows
sha256: e97a1a3016512437d9c0b12fae7d1491c3c7b9aa7f03a69b974308840656b02a
url: "https://pub.dev"
source: hosted
version: "2.0.1"
flutter_localizations: flutter_localizations:
dependency: "direct main" dependency: "direct main"
description: flutter description: flutter
@@ -327,10 +343,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_map name: flutter_map
sha256: "2ecb34619a4be19df6f40c2f8dce1591675b4eff7a6857bd8f533706977385da" sha256: "391e7dc95cc3f5190748210a69d4cfeb5d8f84dcdfa9c3235d0a9d7742ccb3f8"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.0.2" version: "8.2.2"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@@ -361,10 +377,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: hooks name: hooks
sha256: "5d309c86e7ce34cd8e37aa71cb30cb652d3829b900ab145e4d9da564b31d59f7" sha256: "7a08a0d684cb3b8fb604b78455d5d352f502b68079f7b80b831c62220ab0a4f6"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.0" version: "1.0.1"
http: http:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -397,14 +413,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.20.2" version: "0.20.2"
js:
dependency: transitive
description:
name: js
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
url: "https://pub.dev"
source: hosted
version: "0.7.2"
json_annotation: json_annotation:
dependency: transitive dependency: transitive
description: description:
@@ -457,10 +465,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 sha256: "12f842a479589fea194fe5c5a3095abc7be0c1f2ddfa9a0e76aed1dbd26a87df"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.1.1" version: "6.1.0"
lists: lists:
dependency: transitive dependency: transitive
description: description:
@@ -529,10 +537,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: mobile_scanner name: mobile_scanner
sha256: "0b466a0a8a211b366c2e87f3345715faef9b6011c7147556ad22f37de6ba3173" sha256: c6184bf2913dd66be244108c9c27ca04b01caf726321c44b0e7a7a1e32d41044
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.11" version: "7.1.4"
native_toolchain_c: native_toolchain_c:
dependency: transitive dependency: transitive
description: description:
@@ -553,10 +561,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: objective_c name: objective_c
sha256: "983c7fa1501f6dcc0cb7af4e42072e9993cb28d73604d25ebf4dab08165d997e" sha256: "100a1c87616ab6ed41ec263b083c0ef3261ee6cd1dc3b0f35f8ddfa4f996fe52"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.2.5" version: "9.3.0"
octo_image: octo_image:
dependency: transitive dependency: transitive
description: description:
@@ -569,10 +577,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: package_info_plus name: package_info_plus
sha256: "16eee997588c60225bda0488b6dcfac69280a6b7a3cf02c741895dd370a02968" sha256: f69da0d3189a4b4ceaeb1a3defb0f329b3b352517f52bed4290f83d4f06bc08d
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "8.3.1" version: "9.0.0"
package_info_plus_platform_interface: package_info_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@@ -665,18 +673,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: pointycastle name: pointycastle
sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" sha256: "92aa3841d083cc4b0f4709b5c74fd6409a3e6ba833ffc7dc6a8fee096366acf5"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.9.1" version: "4.0.0"
polylabel:
dependency: transitive
description:
name: polylabel
sha256: "41b9099afb2aa6c1730bdd8a0fab1400d287694ec7615dd8516935fa3144214b"
url: "https://pub.dev"
source: hosted
version: "1.0.1"
posix: posix:
dependency: transitive dependency: transitive
description: description:
@@ -822,10 +822,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.10.1" version: "1.10.2"
sqflite: sqflite:
dependency: transitive dependency: transitive
description: description:
@@ -958,10 +958,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_ios name: url_launcher_ios
sha256: cfde38aa257dae62ffe79c87fab20165dfdf6988c1d31b58ebf59b9106062aad sha256: "580fe5dfb51671ae38191d316e027f6b76272b026370708c2d898799750a02b0"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.3.6" version: "6.4.1"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:
@@ -1030,10 +1030,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: wakelock_plus name: wakelock_plus
sha256: "61713aa82b7f85c21c9f4cd0a148abd75f38a74ec645fcb1e446f882c82fd09b" sha256: "9296d40c9adbedaba95d1e704f4e0b434be446e2792948d0e4aa977048104228"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.3" version: "1.4.0"
wakelock_plus_platform_interface: wakelock_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
+9 -9
View File
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts # In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix. # of the product and file versions while build-number is used as the build suffix.
version: 5.0.0+6 version: 6.0.0+7
environment: environment:
sdk: ^3.9.2 sdk: ^3.9.2
@@ -41,19 +41,19 @@ dependencies:
provider: ^6.1.5+1 provider: ^6.1.5+1
shared_preferences: ^2.2.2 shared_preferences: ^2.2.2
uuid: ^4.3.3 uuid: ^4.3.3
flutter_map: ^7.0.2 flutter_map: ^8.2.2
latlong2: ^0.9.1 latlong2: ^0.9.1
flutter_local_notifications: ^18.0.1 flutter_local_notifications: ^20.1.0
crypto: ^3.0.3 crypto: ^3.0.3
pointycastle: ^3.7.4 pointycastle: ^4.0.0
http: ^1.2.0 http: ^1.2.0
cached_network_image: ^3.4.1 cached_network_image: ^3.4.1
flutter_cache_manager: ^3.4.1 flutter_cache_manager: ^3.4.1
flutter_foreground_task: ^6.1.2 flutter_foreground_task: ^9.2.0
wakelock_plus: ^1.2.8 wakelock_plus: ^1.2.8
characters: ^1.4.0 characters: ^1.4.0
package_info_plus: ^8.0.0 package_info_plus: ^9.0.0
mobile_scanner: ^6.0.0 # QR/barcode scanning mobile_scanner: ^7.1.4 # QR/barcode scanning
qr_flutter: ^4.1.0 # QR code generation qr_flutter: ^4.1.0 # QR code generation
url_launcher: ^6.3.0 # Launch URLs in system browser url_launcher: ^6.3.0 # Launch URLs in system browser
flutter_linkify: ^6.0.0 # Auto-detect and linkify URLs in text flutter_linkify: ^6.0.0 # Auto-detect and linkify URLs in text
@@ -70,8 +70,8 @@ dev_dependencies:
# activated in the `analysis_options.yaml` file located at the root of your # activated in the `analysis_options.yaml` file located at the root of your
# package. See that file for information about deactivating specific lint # package. See that file for information about deactivating specific lint
# rules and activating additional ones. # rules and activating additional ones.
flutter_lints: ^5.0.0 flutter_lints: ^6.0.0
flutter_launcher_icons: ^0.13.1 flutter_launcher_icons: ^0.14.4
# For information on the generic Dart part of this file, see the # For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec # following page: https://dart.dev/tools/pub/pubspec
+1 -127
View File
@@ -1,127 +1 @@
{ {}
"bg": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"de": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"es": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"fr": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"it": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"nl": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"pl": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"pt": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"ru": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"sk": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"sl": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"sv": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"uk": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
],
"zh": [
"notification_activityTitle",
"notification_messagesCount",
"notification_channelMessagesCount",
"notification_newNodesCount",
"notification_newTypeDiscovered",
"notification_receivedNewMessage"
]
}
+1
View File
@@ -9,6 +9,7 @@ list(APPEND FLUTTER_PLUGIN_LIST
) )
list(APPEND FLUTTER_FFI_PLUGIN_LIST list(APPEND FLUTTER_FFI_PLUGIN_LIST
flutter_local_notifications_windows
) )
set(PLUGIN_BUNDLED_LIBRARIES) set(PLUGIN_BUNDLED_LIBRARIES)