mirror of
https://github.com/zjs81/meshcore-open.git
synced 2026-04-20 22:13:48 +00:00
* Add notification rate limiting with privacy-safe debug logging - Add batching system to prevent notification storms (3s rate limit, 5s batch window) - Queue rapid notifications and show batch summaries - Debug logs show device names for adverts, sender/channel for messages (no content leaks) - Remove unused _maxBatchSize constant Context: Added after getting notification-flooded while evaluating RF flood management. The irony. * Update notification_service.dart I made a mistake and removed this * Add l10n support for notification strings Addresses PR #110 review feedback to use the translations system: - Add notification strings to app_en.arb (plurals for batch summary) - Update NotificationService to use lookupAppLocalizations() - Wire locale from MaterialApp to NotificationService - Regenerate localization files New strings added (English only, translations needed): - notification_activityTitle: "MeshCore Activity" - notification_messagesCount: "{count} message(s)" - notification_channelMessagesCount: "{count} channel message(s)" - notification_newNodesCount: "{count} new node(s)" - notification_newTypeDiscovered: "New {type} discovered" - notification_receivedNewMessage: "Received new message" * Add notification string translations for all supported languages Translated notification_activityTitle, notification_messagesCount, notification_channelMessagesCount, notification_newNodesCount, notification_newTypeDiscovered, and notification_receivedNewMessage to: bg, de, es, fr, it, nl, pl, pt, ru, sk, sl, sv, uk, zh Includes proper ICU plural forms for Slavic languages (few/many/other) and Slovenian dual form. * Apply dart format to notification_service.dart --------- Co-authored-by: Winston Lowe <wel97459@gmail.com>
2827 lines
67 KiB
Dart
2827 lines
67 KiB
Dart
// ignore: unused_import
|
|
import 'package:intl/intl.dart' as intl;
|
|
import 'app_localizations.dart';
|
|
|
|
// ignore_for_file: type=lint
|
|
|
|
/// The translations for English (`en`).
|
|
class AppLocalizationsEn extends AppLocalizations {
|
|
AppLocalizationsEn([String locale = 'en']) : super(locale);
|
|
|
|
@override
|
|
String get appTitle => 'MeshCore Open';
|
|
|
|
@override
|
|
String get nav_contacts => 'Contacts';
|
|
|
|
@override
|
|
String get nav_channels => 'Channels';
|
|
|
|
@override
|
|
String get nav_map => 'Map';
|
|
|
|
@override
|
|
String get common_cancel => 'Cancel';
|
|
|
|
@override
|
|
String get common_ok => 'OK';
|
|
|
|
@override
|
|
String get common_connect => 'Connect';
|
|
|
|
@override
|
|
String get common_unknownDevice => 'Unknown Device';
|
|
|
|
@override
|
|
String get common_save => 'Save';
|
|
|
|
@override
|
|
String get common_delete => 'Delete';
|
|
|
|
@override
|
|
String get common_close => 'Close';
|
|
|
|
@override
|
|
String get common_edit => 'Edit';
|
|
|
|
@override
|
|
String get common_add => 'Add';
|
|
|
|
@override
|
|
String get common_settings => 'Settings';
|
|
|
|
@override
|
|
String get common_disconnect => 'Disconnect';
|
|
|
|
@override
|
|
String get common_connected => 'Connected';
|
|
|
|
@override
|
|
String get common_disconnected => 'Disconnected';
|
|
|
|
@override
|
|
String get common_create => 'Create';
|
|
|
|
@override
|
|
String get common_continue => 'Continue';
|
|
|
|
@override
|
|
String get common_share => 'Share';
|
|
|
|
@override
|
|
String get common_copy => 'Copy';
|
|
|
|
@override
|
|
String get common_retry => 'Retry';
|
|
|
|
@override
|
|
String get common_hide => 'Hide';
|
|
|
|
@override
|
|
String get common_remove => 'Remove';
|
|
|
|
@override
|
|
String get common_enable => 'Enable';
|
|
|
|
@override
|
|
String get common_disable => 'Disable';
|
|
|
|
@override
|
|
String get common_reboot => 'Reboot';
|
|
|
|
@override
|
|
String get common_loading => 'Loading...';
|
|
|
|
@override
|
|
String get common_notAvailable => '—';
|
|
|
|
@override
|
|
String common_voltageValue(String volts) {
|
|
return '$volts V';
|
|
}
|
|
|
|
@override
|
|
String common_percentValue(int percent) {
|
|
return '$percent%';
|
|
}
|
|
|
|
@override
|
|
String get scanner_title => 'MeshCore Open';
|
|
|
|
@override
|
|
String get scanner_scanning => 'Scanning for devices...';
|
|
|
|
@override
|
|
String get scanner_connecting => 'Connecting...';
|
|
|
|
@override
|
|
String get scanner_disconnecting => 'Disconnecting...';
|
|
|
|
@override
|
|
String get scanner_notConnected => 'Not connected';
|
|
|
|
@override
|
|
String scanner_connectedTo(String deviceName) {
|
|
return 'Connected to $deviceName';
|
|
}
|
|
|
|
@override
|
|
String get scanner_searchingDevices => 'Searching for MeshCore devices...';
|
|
|
|
@override
|
|
String get scanner_tapToScan => 'Tap Scan to find MeshCore devices';
|
|
|
|
@override
|
|
String scanner_connectionFailed(String error) {
|
|
return 'Connection failed: $error';
|
|
}
|
|
|
|
@override
|
|
String get scanner_stop => 'Stop';
|
|
|
|
@override
|
|
String get scanner_scan => 'Scan';
|
|
|
|
@override
|
|
String get device_quickSwitch => 'Quick switch';
|
|
|
|
@override
|
|
String get device_meshcore => 'MeshCore';
|
|
|
|
@override
|
|
String get settings_title => 'Settings';
|
|
|
|
@override
|
|
String get settings_deviceInfo => 'Device Info';
|
|
|
|
@override
|
|
String get settings_appSettings => 'App Settings';
|
|
|
|
@override
|
|
String get settings_appSettingsSubtitle =>
|
|
'Notifications, messaging, and map preferences';
|
|
|
|
@override
|
|
String get settings_nodeSettings => 'Node Settings';
|
|
|
|
@override
|
|
String get settings_nodeName => 'Node Name';
|
|
|
|
@override
|
|
String get settings_nodeNameNotSet => 'Not set';
|
|
|
|
@override
|
|
String get settings_nodeNameHint => 'Enter node name';
|
|
|
|
@override
|
|
String get settings_nodeNameUpdated => 'Name updated';
|
|
|
|
@override
|
|
String get settings_radioSettings => 'Radio Settings';
|
|
|
|
@override
|
|
String get settings_radioSettingsSubtitle =>
|
|
'Frequency, power, spreading factor';
|
|
|
|
@override
|
|
String get settings_radioSettingsUpdated => 'Radio settings updated';
|
|
|
|
@override
|
|
String get settings_location => 'Location';
|
|
|
|
@override
|
|
String get settings_locationSubtitle => 'GPS coordinates';
|
|
|
|
@override
|
|
String get settings_locationUpdated => 'Location and GPS settings updated';
|
|
|
|
@override
|
|
String get settings_locationBothRequired =>
|
|
'Enter both latitude and longitude.';
|
|
|
|
@override
|
|
String get settings_locationInvalid => 'Invalid latitude or longitude.';
|
|
|
|
@override
|
|
String get settings_locationGPSEnable => 'GPS Enable';
|
|
|
|
@override
|
|
String get settings_locationGPSEnableSubtitle =>
|
|
'Enables GPS to automatically update location.';
|
|
|
|
@override
|
|
String get settings_locationIntervalSec => 'Interval for GPS (Seconds)';
|
|
|
|
@override
|
|
String get settings_locationIntervalInvalid =>
|
|
'Interval must be at least 60 seconds, and less than 86400 seconds.';
|
|
|
|
@override
|
|
String get settings_latitude => 'Latitude';
|
|
|
|
@override
|
|
String get settings_longitude => 'Longitude';
|
|
|
|
@override
|
|
String get settings_privacyMode => 'Privacy Mode';
|
|
|
|
@override
|
|
String get settings_privacyModeSubtitle =>
|
|
'Hide name/location in advertisements';
|
|
|
|
@override
|
|
String get settings_privacyModeToggle =>
|
|
'Toggle privacy mode to hide your name and location in advertisements.';
|
|
|
|
@override
|
|
String get settings_privacyModeEnabled => 'Privacy mode enabled';
|
|
|
|
@override
|
|
String get settings_privacyModeDisabled => 'Privacy mode disabled';
|
|
|
|
@override
|
|
String get settings_actions => 'Actions';
|
|
|
|
@override
|
|
String get settings_sendAdvertisement => 'Send Advertisement';
|
|
|
|
@override
|
|
String get settings_sendAdvertisementSubtitle => 'Broadcast presence now';
|
|
|
|
@override
|
|
String get settings_advertisementSent => 'Advertisement sent';
|
|
|
|
@override
|
|
String get settings_syncTime => 'Sync Time';
|
|
|
|
@override
|
|
String get settings_syncTimeSubtitle => 'Set device clock to phone time';
|
|
|
|
@override
|
|
String get settings_timeSynchronized => 'Time synchronized';
|
|
|
|
@override
|
|
String get settings_refreshContacts => 'Refresh Contacts';
|
|
|
|
@override
|
|
String get settings_refreshContactsSubtitle =>
|
|
'Reload contact list from device';
|
|
|
|
@override
|
|
String get settings_rebootDevice => 'Reboot Device';
|
|
|
|
@override
|
|
String get settings_rebootDeviceSubtitle => 'Restart the MeshCore device';
|
|
|
|
@override
|
|
String get settings_rebootDeviceConfirm =>
|
|
'Are you sure you want to reboot the device? You will be disconnected.';
|
|
|
|
@override
|
|
String get settings_debug => 'Debug';
|
|
|
|
@override
|
|
String get settings_bleDebugLog => 'BLE Debug Log';
|
|
|
|
@override
|
|
String get settings_bleDebugLogSubtitle =>
|
|
'BLE commands, responses, and raw data';
|
|
|
|
@override
|
|
String get settings_appDebugLog => 'App Debug Log';
|
|
|
|
@override
|
|
String get settings_appDebugLogSubtitle => 'Application debug messages';
|
|
|
|
@override
|
|
String get settings_about => 'About';
|
|
|
|
@override
|
|
String settings_aboutVersion(String version) {
|
|
return 'MeshCore Open v$version';
|
|
}
|
|
|
|
@override
|
|
String get settings_aboutLegalese => '2026 MeshCore Open Source Project';
|
|
|
|
@override
|
|
String get settings_aboutDescription =>
|
|
'An open-source Flutter client for MeshCore LoRa mesh networking devices.';
|
|
|
|
@override
|
|
String get settings_infoName => 'Name';
|
|
|
|
@override
|
|
String get settings_infoId => 'ID';
|
|
|
|
@override
|
|
String get settings_infoStatus => 'Status';
|
|
|
|
@override
|
|
String get settings_infoBattery => 'Battery';
|
|
|
|
@override
|
|
String get settings_infoPublicKey => 'Public Key';
|
|
|
|
@override
|
|
String get settings_infoContactsCount => 'Contacts Count';
|
|
|
|
@override
|
|
String get settings_infoChannelCount => 'Channel Count';
|
|
|
|
@override
|
|
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
|
|
String get settings_frequency => 'Frequency (MHz)';
|
|
|
|
@override
|
|
String get settings_frequencyHelper => '300.0 - 2500.0';
|
|
|
|
@override
|
|
String get settings_frequencyInvalid => 'Invalid frequency (300-2500 MHz)';
|
|
|
|
@override
|
|
String get settings_bandwidth => 'Bandwidth';
|
|
|
|
@override
|
|
String get settings_spreadingFactor => 'Spreading Factor';
|
|
|
|
@override
|
|
String get settings_codingRate => 'Coding Rate';
|
|
|
|
@override
|
|
String get settings_txPower => 'TX Power (dBm)';
|
|
|
|
@override
|
|
String get settings_txPowerHelper => '0 - 22';
|
|
|
|
@override
|
|
String get settings_txPowerInvalid => 'Invalid TX power (0-22 dBm)';
|
|
|
|
@override
|
|
String get settings_longRange => 'Long Range';
|
|
|
|
@override
|
|
String get settings_fastSpeed => 'Fast Speed';
|
|
|
|
@override
|
|
String settings_error(String message) {
|
|
return 'Error: $message';
|
|
}
|
|
|
|
@override
|
|
String get appSettings_title => 'App Settings';
|
|
|
|
@override
|
|
String get appSettings_appearance => 'Appearance';
|
|
|
|
@override
|
|
String get appSettings_theme => 'Theme';
|
|
|
|
@override
|
|
String get appSettings_themeSystem => 'System default';
|
|
|
|
@override
|
|
String get appSettings_themeLight => 'Light';
|
|
|
|
@override
|
|
String get appSettings_themeDark => 'Dark';
|
|
|
|
@override
|
|
String get appSettings_language => 'Language';
|
|
|
|
@override
|
|
String get appSettings_languageSystem => 'System default';
|
|
|
|
@override
|
|
String get appSettings_languageEn => 'English';
|
|
|
|
@override
|
|
String get appSettings_languageFr => 'Français';
|
|
|
|
@override
|
|
String get appSettings_languageEs => 'Español';
|
|
|
|
@override
|
|
String get appSettings_languageDe => 'Deutsch';
|
|
|
|
@override
|
|
String get appSettings_languagePl => 'Polski';
|
|
|
|
@override
|
|
String get appSettings_languageSl => 'Slovenščina';
|
|
|
|
@override
|
|
String get appSettings_languagePt => 'Português';
|
|
|
|
@override
|
|
String get appSettings_languageIt => 'Italiano';
|
|
|
|
@override
|
|
String get appSettings_languageZh => '中文';
|
|
|
|
@override
|
|
String get appSettings_languageSv => 'Svenska';
|
|
|
|
@override
|
|
String get appSettings_languageNl => 'Nederlands';
|
|
|
|
@override
|
|
String get appSettings_languageSk => 'Slovenčina';
|
|
|
|
@override
|
|
String get appSettings_languageBg => 'Български';
|
|
|
|
@override
|
|
String get appSettings_languageRu => 'Русский';
|
|
|
|
@override
|
|
String get appSettings_languageUk => 'Українська';
|
|
|
|
@override
|
|
String get appSettings_notifications => 'Notifications';
|
|
|
|
@override
|
|
String get appSettings_enableNotifications => 'Enable Notifications';
|
|
|
|
@override
|
|
String get appSettings_enableNotificationsSubtitle =>
|
|
'Receive notifications for messages and adverts';
|
|
|
|
@override
|
|
String get appSettings_notificationPermissionDenied =>
|
|
'Notification permission denied';
|
|
|
|
@override
|
|
String get appSettings_notificationsEnabled => 'Notifications enabled';
|
|
|
|
@override
|
|
String get appSettings_notificationsDisabled => 'Notifications disabled';
|
|
|
|
@override
|
|
String get appSettings_messageNotifications => 'Message Notifications';
|
|
|
|
@override
|
|
String get appSettings_messageNotificationsSubtitle =>
|
|
'Show notification when receiving new messages';
|
|
|
|
@override
|
|
String get appSettings_channelMessageNotifications =>
|
|
'Channel Message Notifications';
|
|
|
|
@override
|
|
String get appSettings_channelMessageNotificationsSubtitle =>
|
|
'Show notification when receiving channel messages';
|
|
|
|
@override
|
|
String get appSettings_advertisementNotifications =>
|
|
'Advertisement Notifications';
|
|
|
|
@override
|
|
String get appSettings_advertisementNotificationsSubtitle =>
|
|
'Show notification when new nodes are discovered';
|
|
|
|
@override
|
|
String get appSettings_messaging => 'Messaging';
|
|
|
|
@override
|
|
String get appSettings_clearPathOnMaxRetry => 'Clear Path on Max Retry';
|
|
|
|
@override
|
|
String get appSettings_clearPathOnMaxRetrySubtitle =>
|
|
'Reset contact path after 5 failed send attempts';
|
|
|
|
@override
|
|
String get appSettings_pathsWillBeCleared =>
|
|
'Paths will be cleared after 5 failed retries';
|
|
|
|
@override
|
|
String get appSettings_pathsWillNotBeCleared =>
|
|
'Paths will not be auto-cleared';
|
|
|
|
@override
|
|
String get appSettings_autoRouteRotation => 'Auto Route Rotation';
|
|
|
|
@override
|
|
String get appSettings_autoRouteRotationSubtitle =>
|
|
'Cycle between best paths and flood mode';
|
|
|
|
@override
|
|
String get appSettings_autoRouteRotationEnabled =>
|
|
'Auto route rotation enabled';
|
|
|
|
@override
|
|
String get appSettings_autoRouteRotationDisabled =>
|
|
'Auto route rotation disabled';
|
|
|
|
@override
|
|
String get appSettings_battery => 'Battery';
|
|
|
|
@override
|
|
String get appSettings_batteryChemistry => 'Battery Chemistry';
|
|
|
|
@override
|
|
String appSettings_batteryChemistryPerDevice(String deviceName) {
|
|
return 'Set per device ($deviceName)';
|
|
}
|
|
|
|
@override
|
|
String get appSettings_batteryChemistryConnectFirst =>
|
|
'Connect to a device to choose';
|
|
|
|
@override
|
|
String get appSettings_batteryNmc => '18650 NMC (3.0-4.2V)';
|
|
|
|
@override
|
|
String get appSettings_batteryLifepo4 => 'LiFePO4 (2.6-3.65V)';
|
|
|
|
@override
|
|
String get appSettings_batteryLipo => 'LiPo (3.0-4.2V)';
|
|
|
|
@override
|
|
String get appSettings_mapDisplay => 'Map Display';
|
|
|
|
@override
|
|
String get appSettings_showRepeaters => 'Show Repeaters';
|
|
|
|
@override
|
|
String get appSettings_showRepeatersSubtitle =>
|
|
'Display repeater nodes on the map';
|
|
|
|
@override
|
|
String get appSettings_showChatNodes => 'Show Chat Nodes';
|
|
|
|
@override
|
|
String get appSettings_showChatNodesSubtitle =>
|
|
'Display chat nodes on the map';
|
|
|
|
@override
|
|
String get appSettings_showOtherNodes => 'Show Other Nodes';
|
|
|
|
@override
|
|
String get appSettings_showOtherNodesSubtitle =>
|
|
'Display other node types on the map';
|
|
|
|
@override
|
|
String get appSettings_timeFilter => 'Time Filter';
|
|
|
|
@override
|
|
String get appSettings_timeFilterShowAll => 'Show all nodes';
|
|
|
|
@override
|
|
String appSettings_timeFilterShowLast(int hours) {
|
|
return 'Show nodes from last $hours hours';
|
|
}
|
|
|
|
@override
|
|
String get appSettings_mapTimeFilter => 'Map Time Filter';
|
|
|
|
@override
|
|
String get appSettings_showNodesDiscoveredWithin =>
|
|
'Show nodes discovered within:';
|
|
|
|
@override
|
|
String get appSettings_allTime => 'All time';
|
|
|
|
@override
|
|
String get appSettings_lastHour => 'Last hour';
|
|
|
|
@override
|
|
String get appSettings_last6Hours => 'Last 6 hours';
|
|
|
|
@override
|
|
String get appSettings_last24Hours => 'Last 24 hours';
|
|
|
|
@override
|
|
String get appSettings_lastWeek => 'Last week';
|
|
|
|
@override
|
|
String get appSettings_offlineMapCache => 'Offline Map Cache';
|
|
|
|
@override
|
|
String get appSettings_noAreaSelected => 'No area selected';
|
|
|
|
@override
|
|
String appSettings_areaSelectedZoom(int minZoom, int maxZoom) {
|
|
return 'Area selected (zoom $minZoom-$maxZoom)';
|
|
}
|
|
|
|
@override
|
|
String get appSettings_debugCard => 'Debug';
|
|
|
|
@override
|
|
String get appSettings_appDebugLogging => 'App Debug Logging';
|
|
|
|
@override
|
|
String get appSettings_appDebugLoggingSubtitle =>
|
|
'Log app debug messages for troubleshooting';
|
|
|
|
@override
|
|
String get appSettings_appDebugLoggingEnabled => 'App debug logging enabled';
|
|
|
|
@override
|
|
String get appSettings_appDebugLoggingDisabled =>
|
|
'App debug logging disabled';
|
|
|
|
@override
|
|
String get contacts_title => 'Contacts';
|
|
|
|
@override
|
|
String get contacts_noContacts => 'No contacts yet';
|
|
|
|
@override
|
|
String get contacts_contactsWillAppear =>
|
|
'Contacts will appear when devices advertise';
|
|
|
|
@override
|
|
String get contacts_searchContacts => 'Search contacts...';
|
|
|
|
@override
|
|
String get contacts_noUnreadContacts => 'No unread contacts';
|
|
|
|
@override
|
|
String get contacts_noContactsFound => 'No contacts or groups found';
|
|
|
|
@override
|
|
String get contacts_deleteContact => 'Delete Contact';
|
|
|
|
@override
|
|
String contacts_removeConfirm(String contactName) {
|
|
return 'Remove $contactName from contacts?';
|
|
}
|
|
|
|
@override
|
|
String get contacts_manageRepeater => 'Manage Repeater';
|
|
|
|
@override
|
|
String get contacts_manageRoom => 'Manage Room Server';
|
|
|
|
@override
|
|
String get contacts_roomLogin => 'Room Server Login';
|
|
|
|
@override
|
|
String get contacts_openChat => 'Open Chat';
|
|
|
|
@override
|
|
String get contacts_editGroup => 'Edit Group';
|
|
|
|
@override
|
|
String get contacts_deleteGroup => 'Delete Group';
|
|
|
|
@override
|
|
String contacts_deleteGroupConfirm(String groupName) {
|
|
return 'Remove \"$groupName\"?';
|
|
}
|
|
|
|
@override
|
|
String get contacts_newGroup => 'New Group';
|
|
|
|
@override
|
|
String get contacts_groupName => 'Group name';
|
|
|
|
@override
|
|
String get contacts_groupNameRequired => 'Group name is required';
|
|
|
|
@override
|
|
String contacts_groupAlreadyExists(String name) {
|
|
return 'Group \"$name\" already exists';
|
|
}
|
|
|
|
@override
|
|
String get contacts_filterContacts => 'Filter contacts...';
|
|
|
|
@override
|
|
String get contacts_noContactsMatchFilter => 'No contacts match your filter';
|
|
|
|
@override
|
|
String get contacts_noMembers => 'No members';
|
|
|
|
@override
|
|
String get contacts_lastSeenNow => 'Last seen now';
|
|
|
|
@override
|
|
String contacts_lastSeenMinsAgo(int minutes) {
|
|
return 'Last seen $minutes mins ago';
|
|
}
|
|
|
|
@override
|
|
String get contacts_lastSeenHourAgo => 'Last seen 1 hour ago';
|
|
|
|
@override
|
|
String contacts_lastSeenHoursAgo(int hours) {
|
|
return 'Last seen $hours hours ago';
|
|
}
|
|
|
|
@override
|
|
String get contacts_lastSeenDayAgo => 'Last seen 1 day ago';
|
|
|
|
@override
|
|
String contacts_lastSeenDaysAgo(int days) {
|
|
return 'Last seen $days days ago';
|
|
}
|
|
|
|
@override
|
|
String get channels_title => 'Channels';
|
|
|
|
@override
|
|
String get channels_noChannelsConfigured => 'No channels configured';
|
|
|
|
@override
|
|
String get channels_addPublicChannel => 'Add Public Channel';
|
|
|
|
@override
|
|
String get channels_searchChannels => 'Search channels...';
|
|
|
|
@override
|
|
String get channels_noChannelsFound => 'No channels found';
|
|
|
|
@override
|
|
String channels_channelIndex(int index) {
|
|
return 'Channel $index';
|
|
}
|
|
|
|
@override
|
|
String get channels_hashtagChannel => 'Hashtag channel';
|
|
|
|
@override
|
|
String get channels_public => 'Public';
|
|
|
|
@override
|
|
String get channels_private => 'Private';
|
|
|
|
@override
|
|
String get channels_publicChannel => 'Public channel';
|
|
|
|
@override
|
|
String get channels_privateChannel => 'Private channel';
|
|
|
|
@override
|
|
String get channels_editChannel => 'Edit channel';
|
|
|
|
@override
|
|
String get channels_deleteChannel => 'Delete channel';
|
|
|
|
@override
|
|
String channels_deleteChannelConfirm(String name) {
|
|
return 'Delete \"$name\"? This cannot be undone.';
|
|
}
|
|
|
|
@override
|
|
String channels_channelDeleted(String name) {
|
|
return 'Channel \"$name\" deleted';
|
|
}
|
|
|
|
@override
|
|
String get channels_addChannel => 'Add Channel';
|
|
|
|
@override
|
|
String get channels_channelIndexLabel => 'Channel Index';
|
|
|
|
@override
|
|
String get channels_channelName => 'Channel Name';
|
|
|
|
@override
|
|
String get channels_usePublicChannel => 'Use Public Channel';
|
|
|
|
@override
|
|
String get channels_standardPublicPsk => 'Standard public PSK';
|
|
|
|
@override
|
|
String get channels_pskHex => 'PSK (Hex)';
|
|
|
|
@override
|
|
String get channels_generateRandomPsk => 'Generate random PSK';
|
|
|
|
@override
|
|
String get channels_enterChannelName => 'Please enter a channel name';
|
|
|
|
@override
|
|
String get channels_pskMustBe32Hex => 'PSK must be 32 hex characters';
|
|
|
|
@override
|
|
String channels_channelAdded(String name) {
|
|
return 'Channel \"$name\" added';
|
|
}
|
|
|
|
@override
|
|
String channels_editChannelTitle(int index) {
|
|
return 'Edit Channel $index';
|
|
}
|
|
|
|
@override
|
|
String get channels_smazCompression => 'SMAZ compression';
|
|
|
|
@override
|
|
String channels_channelUpdated(String name) {
|
|
return 'Channel \"$name\" updated';
|
|
}
|
|
|
|
@override
|
|
String get channels_publicChannelAdded => 'Public channel added';
|
|
|
|
@override
|
|
String get channels_sortBy => 'Sort by';
|
|
|
|
@override
|
|
String get channels_sortManual => 'Manual';
|
|
|
|
@override
|
|
String get channels_sortAZ => 'A-Z';
|
|
|
|
@override
|
|
String get channels_sortLatestMessages => 'Latest messages';
|
|
|
|
@override
|
|
String get channels_sortUnread => 'Unread';
|
|
|
|
@override
|
|
String get channels_createPrivateChannel => 'Create a Private Channel';
|
|
|
|
@override
|
|
String get channels_createPrivateChannelDesc => 'Secured with a secret key.';
|
|
|
|
@override
|
|
String get channels_joinPrivateChannel => 'Join a Private Channel';
|
|
|
|
@override
|
|
String get channels_joinPrivateChannelDesc => 'Manually enter a secret key.';
|
|
|
|
@override
|
|
String get channels_joinPublicChannel => 'Join the Public Channel';
|
|
|
|
@override
|
|
String get channels_joinPublicChannelDesc => 'Anyone can join this channel.';
|
|
|
|
@override
|
|
String get channels_joinHashtagChannel => 'Join a Hashtag Channel';
|
|
|
|
@override
|
|
String get channels_joinHashtagChannelDesc =>
|
|
'Anyone can join hashtag channels.';
|
|
|
|
@override
|
|
String get channels_scanQrCode => 'Scan a QR Code';
|
|
|
|
@override
|
|
String get channels_scanQrCodeComingSoon => 'Coming soon';
|
|
|
|
@override
|
|
String get channels_enterHashtag => 'Enter hashtag';
|
|
|
|
@override
|
|
String get channels_hashtagHint => 'e.g. #team';
|
|
|
|
@override
|
|
String get chat_noMessages => 'No messages yet';
|
|
|
|
@override
|
|
String get chat_sendMessageToStart => 'Send a message to get started';
|
|
|
|
@override
|
|
String get chat_originalMessageNotFound => 'Original message not found';
|
|
|
|
@override
|
|
String chat_replyingTo(String name) {
|
|
return 'Replying to $name';
|
|
}
|
|
|
|
@override
|
|
String chat_replyTo(String name) {
|
|
return 'Reply to $name';
|
|
}
|
|
|
|
@override
|
|
String get chat_location => 'Location';
|
|
|
|
@override
|
|
String chat_sendMessageTo(String contactName) {
|
|
return 'Send a message to $contactName';
|
|
}
|
|
|
|
@override
|
|
String get chat_typeMessage => 'Type a message...';
|
|
|
|
@override
|
|
String chat_messageTooLong(int maxBytes) {
|
|
return 'Message too long (max $maxBytes bytes).';
|
|
}
|
|
|
|
@override
|
|
String get chat_messageCopied => 'Message copied';
|
|
|
|
@override
|
|
String get chat_messageDeleted => 'Message deleted';
|
|
|
|
@override
|
|
String get chat_retryingMessage => 'Retrying message';
|
|
|
|
@override
|
|
String chat_retryCount(int current, int max) {
|
|
return 'Retry $current/$max';
|
|
}
|
|
|
|
@override
|
|
String get chat_sendGif => 'Send GIF';
|
|
|
|
@override
|
|
String get chat_reply => 'Reply';
|
|
|
|
@override
|
|
String get chat_addReaction => 'Add Reaction';
|
|
|
|
@override
|
|
String get chat_me => 'Me';
|
|
|
|
@override
|
|
String get emojiCategorySmileys => 'Smileys';
|
|
|
|
@override
|
|
String get emojiCategoryGestures => 'Gestures';
|
|
|
|
@override
|
|
String get emojiCategoryHearts => 'Hearts';
|
|
|
|
@override
|
|
String get emojiCategoryObjects => 'Objects';
|
|
|
|
@override
|
|
String get gifPicker_title => 'Choose a GIF';
|
|
|
|
@override
|
|
String get gifPicker_searchHint => 'Search GIFs...';
|
|
|
|
@override
|
|
String get gifPicker_poweredBy => 'Powered by GIPHY';
|
|
|
|
@override
|
|
String get gifPicker_noGifsFound => 'No GIFs found';
|
|
|
|
@override
|
|
String get gifPicker_failedLoad => 'Failed to load GIFs';
|
|
|
|
@override
|
|
String get gifPicker_failedSearch => 'Failed to search GIFs';
|
|
|
|
@override
|
|
String get gifPicker_noInternet => 'No internet connection';
|
|
|
|
@override
|
|
String get debugLog_appTitle => 'App Debug Log';
|
|
|
|
@override
|
|
String get debugLog_bleTitle => 'BLE Debug Log';
|
|
|
|
@override
|
|
String get debugLog_copyLog => 'Copy log';
|
|
|
|
@override
|
|
String get debugLog_clearLog => 'Clear log';
|
|
|
|
@override
|
|
String get debugLog_copied => 'Debug log copied';
|
|
|
|
@override
|
|
String get debugLog_bleCopied => 'BLE log copied';
|
|
|
|
@override
|
|
String get debugLog_noEntries => 'No debug logs yet';
|
|
|
|
@override
|
|
String get debugLog_enableInSettings =>
|
|
'Enable app debug logging in settings';
|
|
|
|
@override
|
|
String get debugLog_frames => 'Frames';
|
|
|
|
@override
|
|
String get debugLog_rawLogRx => 'Raw Log-RX';
|
|
|
|
@override
|
|
String get debugLog_noBleActivity => 'No BLE activity yet';
|
|
|
|
@override
|
|
String debugFrame_length(int count) {
|
|
return 'Frame Length: $count bytes';
|
|
}
|
|
|
|
@override
|
|
String debugFrame_command(String value) {
|
|
return 'Command: 0x$value';
|
|
}
|
|
|
|
@override
|
|
String get debugFrame_textMessageHeader => 'Text Message Frame:';
|
|
|
|
@override
|
|
String debugFrame_destinationPubKey(String pubKey) {
|
|
return '- Destination PubKey: $pubKey';
|
|
}
|
|
|
|
@override
|
|
String debugFrame_timestamp(int timestamp) {
|
|
return '- Timestamp: $timestamp';
|
|
}
|
|
|
|
@override
|
|
String debugFrame_flags(String value) {
|
|
return '- Flags: 0x$value';
|
|
}
|
|
|
|
@override
|
|
String debugFrame_textType(int type, String label) {
|
|
return '- Text Type: $type ($label)';
|
|
}
|
|
|
|
@override
|
|
String get debugFrame_textTypeCli => 'CLI';
|
|
|
|
@override
|
|
String get debugFrame_textTypePlain => 'Plain';
|
|
|
|
@override
|
|
String debugFrame_text(String text) {
|
|
return '- Text: \"$text\"';
|
|
}
|
|
|
|
@override
|
|
String get debugFrame_hexDump => 'Hex Dump:';
|
|
|
|
@override
|
|
String get chat_pathManagement => 'Path Management';
|
|
|
|
@override
|
|
String get chat_routingMode => 'Routing mode';
|
|
|
|
@override
|
|
String get chat_autoUseSavedPath => 'Auto (use saved path)';
|
|
|
|
@override
|
|
String get chat_forceFloodMode => 'Force Flood Mode';
|
|
|
|
@override
|
|
String get chat_recentAckPaths => 'Recent ACK Paths (tap to use):';
|
|
|
|
@override
|
|
String get chat_pathHistoryFull =>
|
|
'Path history is full. Remove entries to add new ones.';
|
|
|
|
@override
|
|
String get chat_hopSingular => 'hop';
|
|
|
|
@override
|
|
String get chat_hopPlural => 'hops';
|
|
|
|
@override
|
|
String chat_hopsCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'hops',
|
|
one: 'hop',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String get chat_successes => 'successes';
|
|
|
|
@override
|
|
String get chat_removePath => 'Remove path';
|
|
|
|
@override
|
|
String get chat_noPathHistoryYet =>
|
|
'No path history yet.\nSend a message to discover paths.';
|
|
|
|
@override
|
|
String get chat_pathActions => 'Path Actions:';
|
|
|
|
@override
|
|
String get chat_setCustomPath => 'Set Custom Path';
|
|
|
|
@override
|
|
String get chat_setCustomPathSubtitle => 'Manually specify routing path';
|
|
|
|
@override
|
|
String get chat_clearPath => 'Clear Path';
|
|
|
|
@override
|
|
String get chat_clearPathSubtitle => 'Force rediscovery on next send';
|
|
|
|
@override
|
|
String get chat_pathCleared =>
|
|
'Path cleared. Next message will rediscover route.';
|
|
|
|
@override
|
|
String get chat_floodModeSubtitle => 'Use routing toggle in app bar';
|
|
|
|
@override
|
|
String get chat_floodModeEnabled =>
|
|
'Flood mode enabled. Toggle back via routing icon in app bar.';
|
|
|
|
@override
|
|
String get chat_fullPath => 'Full Path';
|
|
|
|
@override
|
|
String get chat_pathDetailsNotAvailable =>
|
|
'Path details not available yet. Try sending a message to refresh.';
|
|
|
|
@override
|
|
String chat_pathSetHops(int hopCount, String status) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
hopCount,
|
|
locale: localeName,
|
|
other: 'hops',
|
|
one: 'hop',
|
|
);
|
|
return 'Path set: $hopCount $_temp0 - $status';
|
|
}
|
|
|
|
@override
|
|
String get chat_pathSavedLocally => 'Saved locally. Connect to sync.';
|
|
|
|
@override
|
|
String get chat_pathDeviceConfirmed => 'Device confirmed.';
|
|
|
|
@override
|
|
String get chat_pathDeviceNotConfirmed => 'Device not confirmed yet.';
|
|
|
|
@override
|
|
String get chat_type => 'Type';
|
|
|
|
@override
|
|
String get chat_path => 'Path';
|
|
|
|
@override
|
|
String get chat_publicKey => 'Public Key';
|
|
|
|
@override
|
|
String get chat_compressOutgoingMessages => 'Compress outgoing messages';
|
|
|
|
@override
|
|
String get chat_floodForced => 'Flood (forced)';
|
|
|
|
@override
|
|
String get chat_directForced => 'Direct (forced)';
|
|
|
|
@override
|
|
String chat_hopsForced(int count) {
|
|
return '$count hops (forced)';
|
|
}
|
|
|
|
@override
|
|
String get chat_floodAuto => 'Flood (auto)';
|
|
|
|
@override
|
|
String get chat_direct => 'Direct';
|
|
|
|
@override
|
|
String get chat_poiShared => 'POI Shared';
|
|
|
|
@override
|
|
String chat_unread(int count) {
|
|
return 'Unread: $count';
|
|
}
|
|
|
|
@override
|
|
String get chat_openLink => 'Open Link?';
|
|
|
|
@override
|
|
String get chat_openLinkConfirmation =>
|
|
'Do you want to open this link in your browser?';
|
|
|
|
@override
|
|
String get chat_open => 'Open';
|
|
|
|
@override
|
|
String chat_couldNotOpenLink(String url) {
|
|
return 'Could not open link: $url';
|
|
}
|
|
|
|
@override
|
|
String get chat_invalidLink => 'Invalid link format';
|
|
|
|
@override
|
|
String get map_title => 'Node Map';
|
|
|
|
@override
|
|
String get map_noNodesWithLocation => 'No nodes with location data';
|
|
|
|
@override
|
|
String get map_nodesNeedGps =>
|
|
'Nodes need to share their GPS coordinates\nto appear on the map';
|
|
|
|
@override
|
|
String map_nodesCount(int count) {
|
|
return 'Nodes: $count';
|
|
}
|
|
|
|
@override
|
|
String map_pinsCount(int count) {
|
|
return 'Pins: $count';
|
|
}
|
|
|
|
@override
|
|
String get map_chat => 'Chat';
|
|
|
|
@override
|
|
String get map_repeater => 'Repeater';
|
|
|
|
@override
|
|
String get map_room => 'Room';
|
|
|
|
@override
|
|
String get map_sensor => 'Sensor';
|
|
|
|
@override
|
|
String get map_pinDm => 'Pin (DM)';
|
|
|
|
@override
|
|
String get map_pinPrivate => 'Pin (Private)';
|
|
|
|
@override
|
|
String get map_pinPublic => 'Pin (Public)';
|
|
|
|
@override
|
|
String get map_lastSeen => 'Last Seen';
|
|
|
|
@override
|
|
String get map_disconnectConfirm =>
|
|
'Are you sure you want to disconnect from this device?';
|
|
|
|
@override
|
|
String get map_from => 'From';
|
|
|
|
@override
|
|
String get map_source => 'Source';
|
|
|
|
@override
|
|
String get map_flags => 'Flags';
|
|
|
|
@override
|
|
String get map_shareMarkerHere => 'Share marker here';
|
|
|
|
@override
|
|
String get map_pinLabel => 'Pin label';
|
|
|
|
@override
|
|
String get map_label => 'Label';
|
|
|
|
@override
|
|
String get map_pointOfInterest => 'Point of interest';
|
|
|
|
@override
|
|
String get map_sendToContact => 'Send to contact';
|
|
|
|
@override
|
|
String get map_sendToChannel => 'Send to channel';
|
|
|
|
@override
|
|
String get map_noChannelsAvailable => 'No channels available';
|
|
|
|
@override
|
|
String get map_publicLocationShare => 'Public location share';
|
|
|
|
@override
|
|
String map_publicLocationShareConfirm(String channelLabel) {
|
|
return 'You are about to share a location in $channelLabel. This channel is public and anyone with the PSK can see it.';
|
|
}
|
|
|
|
@override
|
|
String get map_connectToShareMarkers =>
|
|
'Connect to a device to share markers';
|
|
|
|
@override
|
|
String get map_filterNodes => 'Filter Nodes';
|
|
|
|
@override
|
|
String get map_nodeTypes => 'Node Types';
|
|
|
|
@override
|
|
String get map_chatNodes => 'Chat Nodes';
|
|
|
|
@override
|
|
String get map_repeaters => 'Repeaters';
|
|
|
|
@override
|
|
String get map_otherNodes => 'Other Nodes';
|
|
|
|
@override
|
|
String get map_keyPrefix => 'Key Prefix';
|
|
|
|
@override
|
|
String get map_filterByKeyPrefix => 'Filter by key prefix';
|
|
|
|
@override
|
|
String get map_publicKeyPrefix => 'Public key prefix';
|
|
|
|
@override
|
|
String get map_markers => 'Markers';
|
|
|
|
@override
|
|
String get map_showSharedMarkers => 'Show shared markers';
|
|
|
|
@override
|
|
String get map_lastSeenTime => 'Last Seen Time';
|
|
|
|
@override
|
|
String get map_sharedPin => 'Shared pin';
|
|
|
|
@override
|
|
String get map_joinRoom => 'Join Room';
|
|
|
|
@override
|
|
String get map_manageRepeater => 'Manage Repeater';
|
|
|
|
@override
|
|
String get mapCache_title => 'Offline Map Cache';
|
|
|
|
@override
|
|
String get mapCache_selectAreaFirst => 'Select an area to cache first';
|
|
|
|
@override
|
|
String get mapCache_noTilesToDownload => 'No tiles to download for this area';
|
|
|
|
@override
|
|
String get mapCache_downloadTilesTitle => 'Download tiles';
|
|
|
|
@override
|
|
String mapCache_downloadTilesPrompt(int count) {
|
|
return 'Download $count tiles for offline use?';
|
|
}
|
|
|
|
@override
|
|
String get mapCache_downloadAction => 'Download';
|
|
|
|
@override
|
|
String mapCache_cachedTiles(int count) {
|
|
return 'Cached $count tiles';
|
|
}
|
|
|
|
@override
|
|
String mapCache_cachedTilesWithFailed(int downloaded, int failed) {
|
|
return 'Cached $downloaded tiles ($failed failed)';
|
|
}
|
|
|
|
@override
|
|
String get mapCache_clearOfflineCacheTitle => 'Clear offline cache';
|
|
|
|
@override
|
|
String get mapCache_clearOfflineCachePrompt => 'Remove all cached map tiles?';
|
|
|
|
@override
|
|
String get mapCache_offlineCacheCleared => 'Offline cache cleared';
|
|
|
|
@override
|
|
String get mapCache_noAreaSelected => 'No area selected';
|
|
|
|
@override
|
|
String get mapCache_cacheArea => 'Cache Area';
|
|
|
|
@override
|
|
String get mapCache_useCurrentView => 'Use Current View';
|
|
|
|
@override
|
|
String get mapCache_zoomRange => 'Zoom Range';
|
|
|
|
@override
|
|
String mapCache_estimatedTiles(int count) {
|
|
return 'Estimated tiles: $count';
|
|
}
|
|
|
|
@override
|
|
String mapCache_downloadedTiles(int completed, int total) {
|
|
return 'Downloaded $completed / $total';
|
|
}
|
|
|
|
@override
|
|
String get mapCache_downloadTilesButton => 'Download Tiles';
|
|
|
|
@override
|
|
String get mapCache_clearCacheButton => 'Clear Cache';
|
|
|
|
@override
|
|
String mapCache_failedDownloads(int count) {
|
|
return 'Failed downloads: $count';
|
|
}
|
|
|
|
@override
|
|
String mapCache_boundsLabel(
|
|
String north,
|
|
String south,
|
|
String east,
|
|
String west,
|
|
) {
|
|
return 'N $north, S $south, E $east, W $west';
|
|
}
|
|
|
|
@override
|
|
String get time_justNow => 'Just now';
|
|
|
|
@override
|
|
String time_minutesAgo(int minutes) {
|
|
return '${minutes}m ago';
|
|
}
|
|
|
|
@override
|
|
String time_hoursAgo(int hours) {
|
|
return '${hours}h ago';
|
|
}
|
|
|
|
@override
|
|
String time_daysAgo(int days) {
|
|
return '${days}d ago';
|
|
}
|
|
|
|
@override
|
|
String get time_hour => 'hour';
|
|
|
|
@override
|
|
String get time_hours => 'hours';
|
|
|
|
@override
|
|
String get time_day => 'day';
|
|
|
|
@override
|
|
String get time_days => 'days';
|
|
|
|
@override
|
|
String get time_week => 'week';
|
|
|
|
@override
|
|
String get time_weeks => 'weeks';
|
|
|
|
@override
|
|
String get time_month => 'month';
|
|
|
|
@override
|
|
String get time_months => 'months';
|
|
|
|
@override
|
|
String get time_minutes => 'minutes';
|
|
|
|
@override
|
|
String get time_allTime => 'All Time';
|
|
|
|
@override
|
|
String get dialog_disconnect => 'Disconnect';
|
|
|
|
@override
|
|
String get dialog_disconnectConfirm =>
|
|
'Are you sure you want to disconnect from this device?';
|
|
|
|
@override
|
|
String get login_repeaterLogin => 'Repeater Login';
|
|
|
|
@override
|
|
String get login_roomLogin => 'Room Server Login';
|
|
|
|
@override
|
|
String get login_password => 'Password';
|
|
|
|
@override
|
|
String get login_enterPassword => 'Enter password';
|
|
|
|
@override
|
|
String get login_savePassword => 'Save password';
|
|
|
|
@override
|
|
String get login_savePasswordSubtitle =>
|
|
'Password will be stored securely on this device';
|
|
|
|
@override
|
|
String get login_repeaterDescription =>
|
|
'Enter the repeater password to access settings and status.';
|
|
|
|
@override
|
|
String get login_roomDescription =>
|
|
'Enter the room password to access settings and status.';
|
|
|
|
@override
|
|
String get login_routing => 'Routing';
|
|
|
|
@override
|
|
String get login_routingMode => 'Routing mode';
|
|
|
|
@override
|
|
String get login_autoUseSavedPath => 'Auto (use saved path)';
|
|
|
|
@override
|
|
String get login_forceFloodMode => 'Force Flood Mode';
|
|
|
|
@override
|
|
String get login_managePaths => 'Manage Paths';
|
|
|
|
@override
|
|
String get login_login => 'Login';
|
|
|
|
@override
|
|
String login_attempt(int current, int max) {
|
|
return 'Attempt $current/$max';
|
|
}
|
|
|
|
@override
|
|
String login_failed(String error) {
|
|
return 'Login failed: $error';
|
|
}
|
|
|
|
@override
|
|
String get login_failedMessage =>
|
|
'Login failed. Either the password is incorrect or the repeater is unreachable.';
|
|
|
|
@override
|
|
String get common_reload => 'Reload';
|
|
|
|
@override
|
|
String get common_clear => 'Clear';
|
|
|
|
@override
|
|
String path_currentPath(String path) {
|
|
return 'Current path: $path';
|
|
}
|
|
|
|
@override
|
|
String path_usingHopsPath(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'hops',
|
|
one: 'hop',
|
|
);
|
|
return 'Using $count $_temp0 path';
|
|
}
|
|
|
|
@override
|
|
String get path_enterCustomPath => 'Enter Custom Path';
|
|
|
|
@override
|
|
String get path_currentPathLabel => 'Current path';
|
|
|
|
@override
|
|
String get path_hexPrefixInstructions =>
|
|
'Enter 2-character hex prefixes for each hop, separated by commas.';
|
|
|
|
@override
|
|
String get path_hexPrefixExample =>
|
|
'Example: A1,F2,3C (each node uses first byte of its public key)';
|
|
|
|
@override
|
|
String get path_labelHexPrefixes => 'Path (hex prefixes)';
|
|
|
|
@override
|
|
String get path_helperMaxHops =>
|
|
'Max 64 hops. Each prefix is 2 hex characters (1 byte)';
|
|
|
|
@override
|
|
String get path_selectFromContacts => 'Or select from contacts:';
|
|
|
|
@override
|
|
String get path_noRepeatersFound => 'No repeaters or room servers found.';
|
|
|
|
@override
|
|
String get path_customPathsRequire =>
|
|
'Custom paths require intermediate hops that can relay messages.';
|
|
|
|
@override
|
|
String path_invalidHexPrefixes(String prefixes) {
|
|
return 'Invalid hex prefixes: $prefixes';
|
|
}
|
|
|
|
@override
|
|
String get path_tooLong => 'Path too long. Maximum 64 hops allowed.';
|
|
|
|
@override
|
|
String get path_setPath => 'Set Path';
|
|
|
|
@override
|
|
String get repeater_management => 'Repeater Management';
|
|
|
|
@override
|
|
String get room_management => 'Room Server Management';
|
|
|
|
@override
|
|
String get repeater_managementTools => 'Management Tools';
|
|
|
|
@override
|
|
String get repeater_status => 'Status';
|
|
|
|
@override
|
|
String get repeater_statusSubtitle =>
|
|
'View repeater status, stats, and neighbors';
|
|
|
|
@override
|
|
String get repeater_telemetry => 'Telemetry';
|
|
|
|
@override
|
|
String get repeater_telemetrySubtitle =>
|
|
'View telemetry of sensors and system stats';
|
|
|
|
@override
|
|
String get repeater_cli => 'CLI';
|
|
|
|
@override
|
|
String get repeater_cliSubtitle => 'Send commands to the repeater';
|
|
|
|
@override
|
|
String get repeater_neighbours => 'Neighbors';
|
|
|
|
@override
|
|
String get repeater_neighboursSubtitle => 'View zero hop neighbors.';
|
|
|
|
@override
|
|
String get repeater_settings => 'Settings';
|
|
|
|
@override
|
|
String get repeater_settingsSubtitle => 'Configure repeater parameters';
|
|
|
|
@override
|
|
String get repeater_statusTitle => 'Repeater Status';
|
|
|
|
@override
|
|
String get repeater_routingMode => 'Routing mode';
|
|
|
|
@override
|
|
String get repeater_autoUseSavedPath => 'Auto (use saved path)';
|
|
|
|
@override
|
|
String get repeater_forceFloodMode => 'Force Flood Mode';
|
|
|
|
@override
|
|
String get repeater_pathManagement => 'Path management';
|
|
|
|
@override
|
|
String get repeater_refresh => 'Refresh';
|
|
|
|
@override
|
|
String get repeater_statusRequestTimeout => 'Status request timed out.';
|
|
|
|
@override
|
|
String repeater_errorLoadingStatus(String error) {
|
|
return 'Error loading status: $error';
|
|
}
|
|
|
|
@override
|
|
String get repeater_systemInformation => 'System Information';
|
|
|
|
@override
|
|
String get repeater_battery => 'Battery';
|
|
|
|
@override
|
|
String get repeater_clockAtLogin => 'Clock (at login)';
|
|
|
|
@override
|
|
String get repeater_uptime => 'Uptime';
|
|
|
|
@override
|
|
String get repeater_queueLength => 'Queue Length';
|
|
|
|
@override
|
|
String get repeater_debugFlags => 'Debug Flags';
|
|
|
|
@override
|
|
String get repeater_radioStatistics => 'Radio Statistics';
|
|
|
|
@override
|
|
String get repeater_lastRssi => 'Last RSSI';
|
|
|
|
@override
|
|
String get repeater_lastSnr => 'Last SNR';
|
|
|
|
@override
|
|
String get repeater_noiseFloor => 'Noise Floor';
|
|
|
|
@override
|
|
String get repeater_txAirtime => 'TX Airtime';
|
|
|
|
@override
|
|
String get repeater_rxAirtime => 'RX Airtime';
|
|
|
|
@override
|
|
String get repeater_packetStatistics => 'Packet Statistics';
|
|
|
|
@override
|
|
String get repeater_sent => 'Sent';
|
|
|
|
@override
|
|
String get repeater_received => 'Received';
|
|
|
|
@override
|
|
String get repeater_duplicates => 'Duplicates';
|
|
|
|
@override
|
|
String repeater_daysHoursMinsSecs(
|
|
int days,
|
|
int hours,
|
|
int minutes,
|
|
int seconds,
|
|
) {
|
|
return '$days days ${hours}h ${minutes}m ${seconds}s';
|
|
}
|
|
|
|
@override
|
|
String repeater_packetTxTotal(int total, String flood, String direct) {
|
|
return 'Total: $total, Flood: $flood, Direct: $direct';
|
|
}
|
|
|
|
@override
|
|
String repeater_packetRxTotal(int total, String flood, String direct) {
|
|
return 'Total: $total, Flood: $flood, Direct: $direct';
|
|
}
|
|
|
|
@override
|
|
String repeater_duplicatesFloodDirect(String flood, String direct) {
|
|
return 'Flood: $flood, Direct: $direct';
|
|
}
|
|
|
|
@override
|
|
String repeater_duplicatesTotal(int total) {
|
|
return 'Total: $total';
|
|
}
|
|
|
|
@override
|
|
String get repeater_settingsTitle => 'Repeater Settings';
|
|
|
|
@override
|
|
String get repeater_basicSettings => 'Basic Settings';
|
|
|
|
@override
|
|
String get repeater_repeaterName => 'Repeater Name';
|
|
|
|
@override
|
|
String get repeater_repeaterNameHelper => 'Display name for this repeater';
|
|
|
|
@override
|
|
String get repeater_adminPassword => 'Admin Password';
|
|
|
|
@override
|
|
String get repeater_adminPasswordHelper => 'Full access password';
|
|
|
|
@override
|
|
String get repeater_guestPassword => 'Guest Password';
|
|
|
|
@override
|
|
String get repeater_guestPasswordHelper => 'Read-only access password';
|
|
|
|
@override
|
|
String get repeater_radioSettings => 'Radio Settings';
|
|
|
|
@override
|
|
String get repeater_frequencyMhz => 'Frequency (MHz)';
|
|
|
|
@override
|
|
String get repeater_frequencyHelper => '300-2500 MHz';
|
|
|
|
@override
|
|
String get repeater_txPower => 'TX Power';
|
|
|
|
@override
|
|
String get repeater_txPowerHelper => '1-30 dBm';
|
|
|
|
@override
|
|
String get repeater_bandwidth => 'Bandwidth';
|
|
|
|
@override
|
|
String get repeater_spreadingFactor => 'Spreading Factor';
|
|
|
|
@override
|
|
String get repeater_codingRate => 'Coding Rate';
|
|
|
|
@override
|
|
String get repeater_locationSettings => 'Location Settings';
|
|
|
|
@override
|
|
String get repeater_latitude => 'Latitude';
|
|
|
|
@override
|
|
String get repeater_latitudeHelper => 'Decimal degrees (e.g., 37.7749)';
|
|
|
|
@override
|
|
String get repeater_longitude => 'Longitude';
|
|
|
|
@override
|
|
String get repeater_longitudeHelper => 'Decimal degrees (e.g., -122.4194)';
|
|
|
|
@override
|
|
String get repeater_features => 'Features';
|
|
|
|
@override
|
|
String get repeater_packetForwarding => 'Packet Forwarding';
|
|
|
|
@override
|
|
String get repeater_packetForwardingSubtitle =>
|
|
'Enable repeater to forward packets';
|
|
|
|
@override
|
|
String get repeater_guestAccess => 'Guest Access';
|
|
|
|
@override
|
|
String get repeater_guestAccessSubtitle => 'Allow read-only guest access';
|
|
|
|
@override
|
|
String get repeater_privacyMode => 'Privacy Mode';
|
|
|
|
@override
|
|
String get repeater_privacyModeSubtitle =>
|
|
'Hide name/location in advertisements';
|
|
|
|
@override
|
|
String get repeater_advertisementSettings => 'Advertisement Settings';
|
|
|
|
@override
|
|
String get repeater_localAdvertInterval => 'Local Advertisement Interval';
|
|
|
|
@override
|
|
String repeater_localAdvertIntervalMinutes(int minutes) {
|
|
return '$minutes minutes';
|
|
}
|
|
|
|
@override
|
|
String get repeater_floodAdvertInterval => 'Flood Advertisement Interval';
|
|
|
|
@override
|
|
String repeater_floodAdvertIntervalHours(int hours) {
|
|
return '$hours hours';
|
|
}
|
|
|
|
@override
|
|
String get repeater_encryptedAdvertInterval =>
|
|
'Encrypted Advertisement Interval';
|
|
|
|
@override
|
|
String get repeater_dangerZone => 'Danger Zone';
|
|
|
|
@override
|
|
String get repeater_rebootRepeater => 'Reboot Repeater';
|
|
|
|
@override
|
|
String get repeater_rebootRepeaterSubtitle => 'Restart the repeater device';
|
|
|
|
@override
|
|
String get repeater_rebootRepeaterConfirm =>
|
|
'Are you sure you want to reboot this repeater?';
|
|
|
|
@override
|
|
String get repeater_regenerateIdentityKey => 'Regenerate Identity Key';
|
|
|
|
@override
|
|
String get repeater_regenerateIdentityKeySubtitle =>
|
|
'Generate new public/private key pair';
|
|
|
|
@override
|
|
String get repeater_regenerateIdentityKeyConfirm =>
|
|
'This will generate a new identity for the repeater. Continue?';
|
|
|
|
@override
|
|
String get repeater_eraseFileSystem => 'Erase File System';
|
|
|
|
@override
|
|
String get repeater_eraseFileSystemSubtitle =>
|
|
'Format the repeater file system';
|
|
|
|
@override
|
|
String get repeater_eraseFileSystemConfirm =>
|
|
'WARNING: This will erase all data on the repeater. This cannot be undone!';
|
|
|
|
@override
|
|
String get repeater_eraseSerialOnly =>
|
|
'Erase is only available over serial console.';
|
|
|
|
@override
|
|
String repeater_commandSent(String command) {
|
|
return 'Command sent: $command';
|
|
}
|
|
|
|
@override
|
|
String repeater_errorSendingCommand(String error) {
|
|
return 'Error sending command: $error';
|
|
}
|
|
|
|
@override
|
|
String get repeater_confirm => 'Confirm';
|
|
|
|
@override
|
|
String get repeater_settingsSaved => 'Settings saved successfully';
|
|
|
|
@override
|
|
String repeater_errorSavingSettings(String error) {
|
|
return 'Error saving settings: $error';
|
|
}
|
|
|
|
@override
|
|
String get repeater_refreshBasicSettings => 'Refresh Basic Settings';
|
|
|
|
@override
|
|
String get repeater_refreshRadioSettings => 'Refresh Radio Settings';
|
|
|
|
@override
|
|
String get repeater_refreshTxPower => 'Refresh TX power';
|
|
|
|
@override
|
|
String get repeater_refreshLocationSettings => 'Refresh Location Settings';
|
|
|
|
@override
|
|
String get repeater_refreshPacketForwarding => 'Refresh Packet Forwarding';
|
|
|
|
@override
|
|
String get repeater_refreshGuestAccess => 'Refresh Guest Access';
|
|
|
|
@override
|
|
String get repeater_refreshPrivacyMode => 'Refresh Privacy Mode';
|
|
|
|
@override
|
|
String get repeater_refreshAdvertisementSettings =>
|
|
'Refresh Advertisement Settings';
|
|
|
|
@override
|
|
String repeater_refreshed(String label) {
|
|
return '$label refreshed';
|
|
}
|
|
|
|
@override
|
|
String repeater_errorRefreshing(String label) {
|
|
return 'Error refreshing $label';
|
|
}
|
|
|
|
@override
|
|
String get repeater_cliTitle => 'Repeater CLI';
|
|
|
|
@override
|
|
String get repeater_debugNextCommand => 'Debug Next Command';
|
|
|
|
@override
|
|
String get repeater_commandHelp => 'Command Help';
|
|
|
|
@override
|
|
String get repeater_clearHistory => 'Clear History';
|
|
|
|
@override
|
|
String get repeater_noCommandsSent => 'No commands sent yet';
|
|
|
|
@override
|
|
String get repeater_typeCommandOrUseQuick =>
|
|
'Type a command below or use quick commands';
|
|
|
|
@override
|
|
String get repeater_enterCommandHint => 'Enter command...';
|
|
|
|
@override
|
|
String get repeater_previousCommand => 'Previous command';
|
|
|
|
@override
|
|
String get repeater_nextCommand => 'Next command';
|
|
|
|
@override
|
|
String get repeater_enterCommandFirst => 'Enter a command first';
|
|
|
|
@override
|
|
String get repeater_cliCommandFrameTitle => 'CLI Command Frame';
|
|
|
|
@override
|
|
String repeater_cliCommandError(String error) {
|
|
return 'Error: $error';
|
|
}
|
|
|
|
@override
|
|
String get repeater_cliQuickGetName => 'Get Name';
|
|
|
|
@override
|
|
String get repeater_cliQuickGetRadio => 'Get Radio';
|
|
|
|
@override
|
|
String get repeater_cliQuickGetTx => 'Get TX';
|
|
|
|
@override
|
|
String get repeater_cliQuickNeighbors => 'Neighbors';
|
|
|
|
@override
|
|
String get repeater_cliQuickVersion => 'Version';
|
|
|
|
@override
|
|
String get repeater_cliQuickAdvertise => 'Advertise';
|
|
|
|
@override
|
|
String get repeater_cliQuickClock => 'Clock';
|
|
|
|
@override
|
|
String get repeater_cliHelpAdvert => 'Sends an advertisement packet';
|
|
|
|
@override
|
|
String get repeater_cliHelpReboot =>
|
|
'Reboots the device. (note, you\'ll prob get \'Timeout\' which is normal)';
|
|
|
|
@override
|
|
String get repeater_cliHelpClock =>
|
|
'Displays current time per device\'s clock.';
|
|
|
|
@override
|
|
String get repeater_cliHelpPassword =>
|
|
'Sets a new admin password for the device.';
|
|
|
|
@override
|
|
String get repeater_cliHelpVersion =>
|
|
'Shows the device version and firmware build date.';
|
|
|
|
@override
|
|
String get repeater_cliHelpClearStats =>
|
|
'Resets various stats counters to zero.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetAf => 'Sets the air-time-factor.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetTx =>
|
|
'Sets LoRa transmit power in dBm. (reboot to apply)';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetRepeat =>
|
|
'Enables or disables the repeater role for this node.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetAllowReadOnly =>
|
|
'(Room server) If \'on\', then login in blank password will be allowed, but cannot Post to room. (just read only)';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetFloodMax =>
|
|
'Sets the maximum number of hops of inbound flood packet (if >= max, packet is not forwarded)';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetIntThresh =>
|
|
'Sets the Interference Threshold (in DB). Default is 14. Set to 0 to disable channel interference detection.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetAgcResetInterval =>
|
|
'Sets the interval to reset the Auto Gain Controller. Set to 0 to disable.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetMultiAcks =>
|
|
'Enables or disables the \'double ACKs\' feature.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetAdvertInterval =>
|
|
'Sets the timer interval in minutes to send a local (zero-hop) advertisement packet. Set to 0 to disable.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetFloodAdvertInterval =>
|
|
'Sets the timer interval in hours to send a flood advertisement packet. Set to 0 to disable.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetGuestPassword =>
|
|
'Sets/updates the guest password. (for repeaters, guest logins can send the \"Get Stats\" request)';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetName => 'Sets the advertisement name.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetLat =>
|
|
'Sets the advertisement map latitude. (decimal degrees)';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetLon =>
|
|
'Sets the advertisement map longitude. (decimal degrees)';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetRadio =>
|
|
'Sets completely new radio params, and saves to preferences. Requires a \"reboot\" command to apply.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetRxDelay =>
|
|
'Sets (experimental) base (must be > 1 for effect) for applying slight delay to received packets, based on signal strength/score. Set to 0 to disable.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetTxDelay =>
|
|
'Sets a factor multiplied with time-on-air for a flood-mode packet and with a randomized slot system, to delay its forwarding. (to decrease likelihood of collisions)';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetDirectTxDelay =>
|
|
'Same as txdelay, but for applying a random delay to the forwarding of direct-mode packets.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetBridgeEnabled => 'Enable/Disable bridge.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetBridgeDelay =>
|
|
'Set delay before retransmitting packets.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetBridgeSource =>
|
|
'Choose wether the bridge will retransmit received packets or transmitted packets.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetBridgeBaud =>
|
|
'Set serial link baudrate for rs232 bridges.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetBridgeSecret =>
|
|
'Set bridge secret for espnow bridges.';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetAdcMultiplier =>
|
|
'Sets custom factor to adjust reported battery voltage (only supported on select boards).';
|
|
|
|
@override
|
|
String get repeater_cliHelpTempRadio =>
|
|
'Sets temporary radio params for the given number of minutes, reverting to original radio params afterward. (does NOT save to preferences).';
|
|
|
|
@override
|
|
String get repeater_cliHelpSetPerm =>
|
|
'Modifies the ACL. Removes matching entry (by pubkey prefix) if \"permissions\" is zero. Adds new entry if pubkey-hex is full length and is not currently in ACL. Updates entry by matching pubkey prefix. Permission bits vary per firmware role, but low 2 bits are: 0 (Guest), 1 (Read only), 2 (Read write), 3 (Admin)';
|
|
|
|
@override
|
|
String get repeater_cliHelpGetBridgeType =>
|
|
'Gets bridge type none, rs232, espnow';
|
|
|
|
@override
|
|
String get repeater_cliHelpLogStart =>
|
|
'Starts packet logging to file system.';
|
|
|
|
@override
|
|
String get repeater_cliHelpLogStop => 'Stops packet logging to file system.';
|
|
|
|
@override
|
|
String get repeater_cliHelpLogErase =>
|
|
'Erases the packet logs from file system.';
|
|
|
|
@override
|
|
String get repeater_cliHelpNeighbors =>
|
|
'Shows a list of other repeater nodes heard via zero-hop adverts. Each line is id-prefix-hex:timestamp:snr-times-4';
|
|
|
|
@override
|
|
String get repeater_cliHelpNeighborRemove =>
|
|
'Removes first matching entry (by pubkey prefix (hex)), from neighbors list.';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegion =>
|
|
'(serial only) Lists all defined regions and current flood permissions.';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegionLoad =>
|
|
'NOTE: this is a special multi-command invocation. Each subsequent command is a region name (indented with spaces to indicate parent hierarchy, with one space at minimum). Terminated by sending a blank line/command.';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegionGet =>
|
|
'Searches for region with given name prefix (or \"*\" for the global scope). Replies with \"-> region-name (parent-name) \'F\'\"';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegionPut =>
|
|
'Adds or updates a region definition with given name.';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegionRemove =>
|
|
'Removes a region definition with given name. (must match exactly, and have no child regions)';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegionAllowf =>
|
|
'Sets the \'F\'lood permission for the given region. (\'*\' for the global/legacy scope)';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegionDenyf =>
|
|
'Removes the \'F\'lood permission for the given region. (NOTE: at this stage NOT advised to use this on the global/legacy scope!!)';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegionHome =>
|
|
'Replies with the current \'home\' region. (Note applied anywhere yet, reserved for future)';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegionHomeSet => 'Sets the \'home\' region.';
|
|
|
|
@override
|
|
String get repeater_cliHelpRegionSave =>
|
|
'Persists the region list/map to storage.';
|
|
|
|
@override
|
|
String get repeater_cliHelpGps =>
|
|
'Gives status of gps. When gps is off, it replies only off, if on it replies with on, status, fix, sat count';
|
|
|
|
@override
|
|
String get repeater_cliHelpGpsOnOff => 'Toggles gps power state.';
|
|
|
|
@override
|
|
String get repeater_cliHelpGpsSync => 'Syncs node time with gps clock.';
|
|
|
|
@override
|
|
String get repeater_cliHelpGpsSetLoc =>
|
|
'Sets node\'s position to gps coordinates and save preferences.';
|
|
|
|
@override
|
|
String get repeater_cliHelpGpsAdvert =>
|
|
'Gives location advert configuration of the node:\n- none: don\'t include location in adverts\n- share: share gps location (from SensorManager)\n- prefs: advert the location stored in preferences';
|
|
|
|
@override
|
|
String get repeater_cliHelpGpsAdvertSet =>
|
|
'Sets location advert configuration.';
|
|
|
|
@override
|
|
String get repeater_commandsListTitle => 'Commands List';
|
|
|
|
@override
|
|
String get repeater_commandsListNote =>
|
|
'NOTE: for the various \"set ...\" commands, there is also a \"get ...\" command.';
|
|
|
|
@override
|
|
String get repeater_general => 'General';
|
|
|
|
@override
|
|
String get repeater_settingsCategory => 'Settings';
|
|
|
|
@override
|
|
String get repeater_bridge => 'Bridge';
|
|
|
|
@override
|
|
String get repeater_logging => 'Logging';
|
|
|
|
@override
|
|
String get repeater_neighborsRepeaterOnly => 'Neighbors (Repeater only)';
|
|
|
|
@override
|
|
String get repeater_regionManagementRepeaterOnly =>
|
|
'Region Management (Repeater only)';
|
|
|
|
@override
|
|
String get repeater_regionNote =>
|
|
'Region commands have been introduced to manage region definitions and permissions.';
|
|
|
|
@override
|
|
String get repeater_gpsManagement => 'GPS Management';
|
|
|
|
@override
|
|
String get repeater_gpsNote =>
|
|
'gps command has been introduced to manage location related topics.';
|
|
|
|
@override
|
|
String get telemetry_receivedData => 'Received Telemetry Data';
|
|
|
|
@override
|
|
String get telemetry_requestTimeout => 'Telemetry request timed out.';
|
|
|
|
@override
|
|
String telemetry_errorLoading(String error) {
|
|
return 'Error loading telemetry: $error';
|
|
}
|
|
|
|
@override
|
|
String get telemetry_noData => 'No telemetry data available.';
|
|
|
|
@override
|
|
String telemetry_channelTitle(int channel) {
|
|
return 'Channel $channel';
|
|
}
|
|
|
|
@override
|
|
String get telemetry_batteryLabel => 'Battery';
|
|
|
|
@override
|
|
String get telemetry_voltageLabel => 'Voltage';
|
|
|
|
@override
|
|
String get telemetry_mcuTemperatureLabel => 'MCU Temperature';
|
|
|
|
@override
|
|
String get telemetry_temperatureLabel => 'Temperature';
|
|
|
|
@override
|
|
String get telemetry_currentLabel => 'Current';
|
|
|
|
@override
|
|
String telemetry_batteryValue(int percent, String volts) {
|
|
return '$percent% / ${volts}V';
|
|
}
|
|
|
|
@override
|
|
String telemetry_voltageValue(String volts) {
|
|
return '${volts}V';
|
|
}
|
|
|
|
@override
|
|
String telemetry_currentValue(String amps) {
|
|
return '${amps}A';
|
|
}
|
|
|
|
@override
|
|
String telemetry_temperatureValue(String celsius, String fahrenheit) {
|
|
return '$celsius°C / $fahrenheit°F';
|
|
}
|
|
|
|
@override
|
|
String get neighbors_receivedData => 'Received Neighbours Data';
|
|
|
|
@override
|
|
String get neighbors_requestTimedOut => 'Neighbours request timed out.';
|
|
|
|
@override
|
|
String neighbors_errorLoading(String error) {
|
|
return 'Error loading neighbors: $error';
|
|
}
|
|
|
|
@override
|
|
String get neighbors_repeatersNeighbours => 'Repeaters Neighbours';
|
|
|
|
@override
|
|
String get neighbors_noData => 'No neighbours data available.';
|
|
|
|
@override
|
|
String neighbors_unknownContact(String pubkey) {
|
|
return 'Unknown $pubkey';
|
|
}
|
|
|
|
@override
|
|
String neighbors_heardAgo(String time) {
|
|
return 'Heard: $time ago';
|
|
}
|
|
|
|
@override
|
|
String get channelPath_title => 'Packet Path';
|
|
|
|
@override
|
|
String get channelPath_viewMap => 'View map';
|
|
|
|
@override
|
|
String get channelPath_otherObservedPaths => 'Other Observed Paths';
|
|
|
|
@override
|
|
String get channelPath_repeaterHops => 'Repeater Hops';
|
|
|
|
@override
|
|
String get channelPath_noHopDetails =>
|
|
'Hop details are not provided for this packet.';
|
|
|
|
@override
|
|
String get channelPath_messageDetails => 'Message Details';
|
|
|
|
@override
|
|
String get channelPath_senderLabel => 'Sender';
|
|
|
|
@override
|
|
String get channelPath_timeLabel => 'Time';
|
|
|
|
@override
|
|
String get channelPath_repeatsLabel => 'Repeats';
|
|
|
|
@override
|
|
String channelPath_pathLabel(int index) {
|
|
return 'Path $index';
|
|
}
|
|
|
|
@override
|
|
String get channelPath_observedLabel => 'Observed';
|
|
|
|
@override
|
|
String channelPath_observedPathTitle(int index, String hops) {
|
|
return 'Observed path $index • $hops';
|
|
}
|
|
|
|
@override
|
|
String get channelPath_noLocationData => 'No location data';
|
|
|
|
@override
|
|
String channelPath_timeWithDate(int day, int month, String time) {
|
|
return '$day/$month $time';
|
|
}
|
|
|
|
@override
|
|
String channelPath_timeOnly(String time) {
|
|
return '$time';
|
|
}
|
|
|
|
@override
|
|
String get channelPath_unknownPath => 'Unknown';
|
|
|
|
@override
|
|
String get channelPath_floodPath => 'Flood';
|
|
|
|
@override
|
|
String get channelPath_directPath => 'Direct';
|
|
|
|
@override
|
|
String channelPath_observedZeroOf(int total) {
|
|
return '0 of $total hops';
|
|
}
|
|
|
|
@override
|
|
String channelPath_observedSomeOf(int observed, int total) {
|
|
return '$observed of $total hops';
|
|
}
|
|
|
|
@override
|
|
String get channelPath_mapTitle => 'Path Map';
|
|
|
|
@override
|
|
String get channelPath_noRepeaterLocations =>
|
|
'No repeater locations available for this path.';
|
|
|
|
@override
|
|
String channelPath_primaryPath(int index) {
|
|
return 'Path $index (Primary)';
|
|
}
|
|
|
|
@override
|
|
String get channelPath_pathLabelTitle => 'Path';
|
|
|
|
@override
|
|
String get channelPath_observedPathHeader => 'Observed Path';
|
|
|
|
@override
|
|
String channelPath_selectedPathLabel(String label, String prefixes) {
|
|
return '$label • $prefixes';
|
|
}
|
|
|
|
@override
|
|
String get channelPath_noHopDetailsAvailable =>
|
|
'No hop details available for this packet.';
|
|
|
|
@override
|
|
String get channelPath_unknownRepeater => 'Unknown Repeater';
|
|
|
|
@override
|
|
String get community_title => 'Community';
|
|
|
|
@override
|
|
String get community_create => 'Create Community';
|
|
|
|
@override
|
|
String get community_createDesc =>
|
|
'Create a new community and share via QR code.';
|
|
|
|
@override
|
|
String get community_join => 'Join';
|
|
|
|
@override
|
|
String get community_joinTitle => 'Join Community';
|
|
|
|
@override
|
|
String community_joinConfirmation(String name) {
|
|
return 'Do you want to join the community \"$name\"?';
|
|
}
|
|
|
|
@override
|
|
String get community_scanQr => 'Scan Community QR';
|
|
|
|
@override
|
|
String get community_scanInstructions =>
|
|
'Point the camera at a community QR code';
|
|
|
|
@override
|
|
String get community_showQr => 'Show QR Code';
|
|
|
|
@override
|
|
String get community_publicChannel => 'Community Public';
|
|
|
|
@override
|
|
String get community_hashtagChannel => 'Community Hashtag';
|
|
|
|
@override
|
|
String get community_name => 'Community Name';
|
|
|
|
@override
|
|
String get community_enterName => 'Enter community name';
|
|
|
|
@override
|
|
String community_created(String name) {
|
|
return 'Community \"$name\" created';
|
|
}
|
|
|
|
@override
|
|
String community_joined(String name) {
|
|
return 'Joined community \"$name\"';
|
|
}
|
|
|
|
@override
|
|
String get community_qrTitle => 'Share Community';
|
|
|
|
@override
|
|
String community_qrInstructions(String name) {
|
|
return 'Scan this QR code to join \"$name\"';
|
|
}
|
|
|
|
@override
|
|
String get community_hashtagPrivacyHint =>
|
|
'Community hashtag channels are only joinable by members of the community';
|
|
|
|
@override
|
|
String get community_invalidQrCode => 'Invalid community QR code';
|
|
|
|
@override
|
|
String get community_alreadyMember => 'Already a Member';
|
|
|
|
@override
|
|
String community_alreadyMemberMessage(String name) {
|
|
return 'You are already a member of \"$name\".';
|
|
}
|
|
|
|
@override
|
|
String get community_addPublicChannel => 'Add Community Public Channel';
|
|
|
|
@override
|
|
String get community_addPublicChannelHint =>
|
|
'Automatically add the public channel for this community';
|
|
|
|
@override
|
|
String get community_noCommunities => 'No communities joined yet';
|
|
|
|
@override
|
|
String get community_scanOrCreate =>
|
|
'Scan a QR code or create a community to get started';
|
|
|
|
@override
|
|
String get community_manageCommunities => 'Manage Communities';
|
|
|
|
@override
|
|
String get community_delete => 'Leave Community';
|
|
|
|
@override
|
|
String community_deleteConfirm(String name) {
|
|
return 'Leave \"$name\"?';
|
|
}
|
|
|
|
@override
|
|
String community_deleteChannelsWarning(int count) {
|
|
return 'This will also delete $count channel(s) and their messages.';
|
|
}
|
|
|
|
@override
|
|
String community_deleted(String name) {
|
|
return 'Left community \"$name\"';
|
|
}
|
|
|
|
@override
|
|
String get community_regenerateSecret => 'Regenerate Secret';
|
|
|
|
@override
|
|
String community_regenerateSecretConfirm(String name) {
|
|
return 'Regenerate the secret key for \"$name\"? All members will need to scan the new QR code to continue communicating.';
|
|
}
|
|
|
|
@override
|
|
String get community_regenerate => 'Regenerate';
|
|
|
|
@override
|
|
String community_secretRegenerated(String name) {
|
|
return 'Secret regenerated for \"$name\"';
|
|
}
|
|
|
|
@override
|
|
String get community_updateSecret => 'Update Secret';
|
|
|
|
@override
|
|
String community_secretUpdated(String name) {
|
|
return 'Secret updated for \"$name\"';
|
|
}
|
|
|
|
@override
|
|
String community_scanToUpdateSecret(String name) {
|
|
return 'Scan the new QR code to update the secret for \"$name\"';
|
|
}
|
|
|
|
@override
|
|
String get community_addHashtagChannel => 'Add Community Hashtag';
|
|
|
|
@override
|
|
String get community_addHashtagChannelDesc =>
|
|
'Add a hashtag channel for this community';
|
|
|
|
@override
|
|
String get community_selectCommunity => 'Select Community';
|
|
|
|
@override
|
|
String get community_regularHashtag => 'Regular Hashtag';
|
|
|
|
@override
|
|
String get community_regularHashtagDesc => 'Public hashtag (anyone can join)';
|
|
|
|
@override
|
|
String get community_communityHashtag => 'Community Hashtag';
|
|
|
|
@override
|
|
String get community_communityHashtagDesc => 'Private to community members';
|
|
|
|
@override
|
|
String community_forCommunity(String name) {
|
|
return 'For $name';
|
|
}
|
|
|
|
@override
|
|
String get listFilter_tooltip => 'Filter and sort';
|
|
|
|
@override
|
|
String get listFilter_sortBy => 'Sort by';
|
|
|
|
@override
|
|
String get listFilter_latestMessages => 'Latest messages';
|
|
|
|
@override
|
|
String get listFilter_heardRecently => 'Heard recently';
|
|
|
|
@override
|
|
String get listFilter_az => 'A-Z';
|
|
|
|
@override
|
|
String get listFilter_filters => 'Filters';
|
|
|
|
@override
|
|
String get listFilter_all => 'All';
|
|
|
|
@override
|
|
String get listFilter_users => 'Users';
|
|
|
|
@override
|
|
String get listFilter_repeaters => 'Repeaters';
|
|
|
|
@override
|
|
String get listFilter_roomServers => 'Room servers';
|
|
|
|
@override
|
|
String get listFilter_unreadOnly => 'Unread only';
|
|
|
|
@override
|
|
String get listFilter_newGroup => 'New group';
|
|
|
|
@override
|
|
String get pathTrace_you => 'You';
|
|
|
|
@override
|
|
String get pathTrace_failed => 'Path trace failed.';
|
|
|
|
@override
|
|
String get pathTrace_notAvailable => 'Path trace not available.';
|
|
|
|
@override
|
|
String get pathTrace_refreshTooltip => 'Refresh Path Trace.';
|
|
|
|
@override
|
|
String get pathTrace_someHopsNoLocation =>
|
|
'One or more of the hops is missing a location!';
|
|
|
|
@override
|
|
String get contacts_pathTrace => 'Path Trace';
|
|
|
|
@override
|
|
String get contacts_ping => 'Ping';
|
|
|
|
@override
|
|
String get contacts_repeaterPathTrace => 'Path trace to repeater';
|
|
|
|
@override
|
|
String get contacts_repeaterPing => 'Ping repeater';
|
|
|
|
@override
|
|
String get contacts_roomPathTrace => 'Path trace to room server';
|
|
|
|
@override
|
|
String get contacts_roomPing => 'Ping room server';
|
|
|
|
@override
|
|
String get contacts_chatTraceRoute => 'Path trace route';
|
|
|
|
@override
|
|
String contacts_pathTraceTo(String name) {
|
|
return 'Trace route to $name';
|
|
}
|
|
|
|
@override
|
|
String get contacts_clipboardEmpty => 'Clipboard is empty.';
|
|
|
|
@override
|
|
String get contacts_invalidAdvertFormat => 'Invalid contact data';
|
|
|
|
@override
|
|
String get contacts_contactImported => 'Contact has been imported.';
|
|
|
|
@override
|
|
String get contacts_contactImportFailed => 'Failed to import contact.';
|
|
|
|
@override
|
|
String get contacts_zeroHopAdvert => 'Zero Hop Advert';
|
|
|
|
@override
|
|
String get contacts_floodAdvert => 'Flood Advert';
|
|
|
|
@override
|
|
String get contacts_copyAdvertToClipboard => 'Copy Advert to Clipboard';
|
|
|
|
@override
|
|
String get contacts_addContactFromClipboard => 'Add Contact from Clipboard';
|
|
|
|
@override
|
|
String get contacts_ShareContact => 'Copy contact to Clipboard';
|
|
|
|
@override
|
|
String get contacts_ShareContactZeroHop => 'Share contact by advert';
|
|
|
|
@override
|
|
String get contacts_zeroHopContactAdvertSent => 'Sent contact by advert.';
|
|
|
|
@override
|
|
String get contacts_zeroHopContactAdvertFailed => 'Failed to send contact.';
|
|
|
|
@override
|
|
String get contacts_contactAdvertCopied => 'Advert copied to Clipboard.';
|
|
|
|
@override
|
|
String get contacts_contactAdvertCopyFailed =>
|
|
'Copying advert to Clipboard failed.';
|
|
|
|
@override
|
|
String get notification_activityTitle => 'MeshCore Activity';
|
|
|
|
@override
|
|
String notification_messagesCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'messages',
|
|
one: 'message',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String notification_channelMessagesCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'channel messages',
|
|
one: 'channel message',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String notification_newNodesCount(int count) {
|
|
String _temp0 = intl.Intl.pluralLogic(
|
|
count,
|
|
locale: localeName,
|
|
other: 'new nodes',
|
|
one: 'new node',
|
|
);
|
|
return '$count $_temp0';
|
|
}
|
|
|
|
@override
|
|
String notification_newTypeDiscovered(String contactType) {
|
|
return 'New $contactType discovered';
|
|
}
|
|
|
|
@override
|
|
String get notification_receivedNewMessage => 'Received new message';
|
|
|
|
@override
|
|
String get settings_gpxExportRepeaters =>
|
|
'Export repeaters / room server to GPX';
|
|
|
|
@override
|
|
String get settings_gpxExportRepeatersSubtitle =>
|
|
'Exports repeaters / roomserver with a location to GPX file.';
|
|
|
|
@override
|
|
String get settings_gpxExportContacts => 'Export companions to GPX';
|
|
|
|
@override
|
|
String get settings_gpxExportContactsSubtitle =>
|
|
'Exports companions with a location to GPX file.';
|
|
|
|
@override
|
|
String get settings_gpxExportAll => 'Export all contacts to GPX';
|
|
|
|
@override
|
|
String get settings_gpxExportAllSubtitle =>
|
|
'Exports all contacts with a location to GPX file.';
|
|
|
|
@override
|
|
String get settings_gpxExportSuccess => 'Successfully exported GPX file.';
|
|
|
|
@override
|
|
String get settings_gpxExportNoContacts => 'No contacts to export.';
|
|
|
|
@override
|
|
String get settings_gpxExportNotAvailable =>
|
|
'Not supported on your device/OS';
|
|
|
|
@override
|
|
String get settings_gpxExportError => 'There was an error when exporting.';
|
|
|
|
@override
|
|
String get settings_gpxExportRepeatersRoom =>
|
|
'Repeater & room server locations';
|
|
|
|
@override
|
|
String get settings_gpxExportChat => 'Companion locations';
|
|
|
|
@override
|
|
String get settings_gpxExportAllContacts => 'All contacts locations';
|
|
|
|
@override
|
|
String get settings_gpxExportShareText =>
|
|
'Map data exported from meshcore-open';
|
|
|
|
@override
|
|
String get settings_gpxExportShareSubject =>
|
|
'meshcore-open GPX map data export';
|
|
}
|