import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart' as intl;

import 'app_localizations_de.dart';
import 'app_localizations_el.dart';
import 'app_localizations_en.dart';
import 'app_localizations_es.dart';
import 'app_localizations_fr.dart';
import 'app_localizations_hr.dart';
import 'app_localizations_it.dart';
import 'app_localizations_sl.dart';
import 'app_localizations_zh.dart';

// ignore_for_file: type=lint

/// Callers can lookup localized strings with an instance of AppLocalizations
/// returned by `AppLocalizations.of(context)`.
///
/// Applications need to include `AppLocalizations.delegate()` in their app's
/// `localizationDelegates` list, and the locales they support in the app's
/// `supportedLocales` list. For example:
///
/// ```dart
/// import 'l10n/app_localizations.dart';
///
/// return MaterialApp(
///   localizationsDelegates: AppLocalizations.localizationsDelegates,
///   supportedLocales: AppLocalizations.supportedLocales,
///   home: MyApplicationHome(),
/// );
/// ```
///
/// ## Update pubspec.yaml
///
/// Please make sure to update your pubspec.yaml to include the following
/// packages:
///
/// ```yaml
/// dependencies:
///   # Internationalization support.
///   flutter_localizations:
///     sdk: flutter
///   intl: any # Use the pinned version from flutter_localizations
///
///   # Rest of dependencies
/// ```
///
/// ## iOS Applications
///
/// iOS applications define key application metadata, including supported
/// locales, in an Info.plist file that is built into the application bundle.
/// To configure the locales supported by your app, you’ll need to edit this
/// file.
///
/// First, open your project’s ios/Runner.xcworkspace Xcode workspace file.
/// Then, in the Project Navigator, open the Info.plist file under the Runner
/// project’s Runner folder.
///
/// Next, select the Information Property List item, select Add Item from the
/// Editor menu, then select Localizations from the pop-up menu.
///
/// Select and expand the newly-created Localizations item then, for each
/// locale your application supports, add a new item and select the locale
/// you wish to add from the pop-up menu in the Value field. This list should
/// be consistent with the languages listed in the AppLocalizations.supportedLocales
/// property.
abstract class AppLocalizations {
  AppLocalizations(String locale)
    : localeName = intl.Intl.canonicalizedLocale(locale.toString());

  final String localeName;

  static AppLocalizations? of(BuildContext context) {
    return Localizations.of<AppLocalizations>(context, AppLocalizations);
  }

  static const LocalizationsDelegate<AppLocalizations> delegate =
      _AppLocalizationsDelegate();

  /// A list of this localizations delegate along with the default localizations
  /// delegates.
  ///
  /// Returns a list of localizations delegates containing this delegate along with
  /// GlobalMaterialLocalizations.delegate, GlobalCupertinoLocalizations.delegate,
  /// and GlobalWidgetsLocalizations.delegate.
  ///
  /// Additional delegates can be added by appending to this list in
  /// MaterialApp. This list does not have to be used at all if a custom list
  /// of delegates is preferred or required.
  static const List<LocalizationsDelegate<dynamic>> localizationsDelegates =
      <LocalizationsDelegate<dynamic>>[
        delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ];

  /// A list of this localizations delegate's supported locales.
  static const List<Locale> supportedLocales = <Locale>[
    Locale('de'),
    Locale('el'),
    Locale('en'),
    Locale('es'),
    Locale('fr'),
    Locale('hr'),
    Locale('it'),
    Locale('sl'),
    Locale('zh'),
  ];

  /// The application title
  ///
  /// In en, this message translates to:
  /// **'MeshCore SAR'**
  String get appTitle;

  /// Messages tab label
  ///
  /// In en, this message translates to:
  /// **'Messages'**
  String get messages;

  /// Contacts tab label
  ///
  /// In en, this message translates to:
  /// **'Contacts'**
  String get contacts;

  /// Map tab label
  ///
  /// In en, this message translates to:
  /// **'Map'**
  String get map;

  /// Settings screen title
  ///
  /// In en, this message translates to:
  /// **'Settings'**
  String get settings;

  /// Connect button label
  ///
  /// In en, this message translates to:
  /// **'Connect'**
  String get connect;

  /// Disconnect button label
  ///
  /// In en, this message translates to:
  /// **'Disconnect'**
  String get disconnect;

  /// Text shown when scanning for BLE devices
  ///
  /// In en, this message translates to:
  /// **'Scanning for devices...'**
  String get scanningForDevices;

  /// Text shown when no BLE devices are found
  ///
  /// In en, this message translates to:
  /// **'No devices found'**
  String get noDevicesFound;

  /// Button to restart BLE scanning
  ///
  /// In en, this message translates to:
  /// **'Scan Again'**
  String get scanAgain;

  /// Subtitle text for device in scan list
  ///
  /// In en, this message translates to:
  /// **'Tap to connect'**
  String get tapToConnect;

  /// Error message when device is not connected
  ///
  /// In en, this message translates to:
  /// **'Device not connected'**
  String get deviceNotConnected;

  /// Error when location permission is denied
  ///
  /// In en, this message translates to:
  /// **'Location permission denied'**
  String get locationPermissionDenied;

  /// Error when location permission is permanently denied
  ///
  /// In en, this message translates to:
  /// **'Location permission permanently denied. Please enable in Settings.'**
  String get locationPermissionPermanentlyDenied;

  /// Message when location permission is needed
  ///
  /// In en, this message translates to:
  /// **'Location permission is required for GPS tracking and team coordination. You can enable it later in Settings.'**
  String get locationPermissionRequired;

  /// Error when location services are disabled
  ///
  /// In en, this message translates to:
  /// **'Location services are disabled. Please enable them in Settings.'**
  String get locationServicesDisabled;

  /// Error when GPS location cannot be obtained
  ///
  /// In en, this message translates to:
  /// **'Failed to get GPS location'**
  String get failedToGetGpsLocation;

  /// Success message showing advertised location
  ///
  /// In en, this message translates to:
  /// **'Advertised at {latitude}, {longitude}'**
  String advertisedAtLocation(String latitude, String longitude);

  /// Error message for failed advertisement
  ///
  /// In en, this message translates to:
  /// **'Failed to advertise: {error}'**
  String failedToAdvertise(String error);

  /// Text shown during reconnection attempts
  ///
  /// In en, this message translates to:
  /// **'Reconnecting... ({attempt}/{max})'**
  String reconnecting(int attempt, int max);

  /// Tooltip for cancel reconnection button
  ///
  /// In en, this message translates to:
  /// **'Cancel reconnection'**
  String get cancelReconnection;

  /// Menu item for map management
  ///
  /// In en, this message translates to:
  /// **'Map Management'**
  String get mapManagement;

  /// General settings section header
  ///
  /// In en, this message translates to:
  /// **'General'**
  String get general;

  /// Theme setting label
  ///
  /// In en, this message translates to:
  /// **'Theme'**
  String get theme;

  /// Theme selection dialog title
  ///
  /// In en, this message translates to:
  /// **'Choose Theme'**
  String get chooseTheme;

  /// Light theme option
  ///
  /// In en, this message translates to:
  /// **'Light'**
  String get light;

  /// Dark theme option
  ///
  /// In en, this message translates to:
  /// **'Dark'**
  String get dark;

  /// Description for blue light theme
  ///
  /// In en, this message translates to:
  /// **'Blue light theme'**
  String get blueLightTheme;

  /// Description for blue dark theme
  ///
  /// In en, this message translates to:
  /// **'Blue dark theme'**
  String get blueDarkTheme;

  /// SAR Red theme option
  ///
  /// In en, this message translates to:
  /// **'SAR Red'**
  String get sarRed;

  /// Description for SAR Red theme
  ///
  /// In en, this message translates to:
  /// **'Alert/Emergency mode'**
  String get alertEmergencyMode;

  /// SAR Green theme option
  ///
  /// In en, this message translates to:
  /// **'SAR Green'**
  String get sarGreen;

  /// Description for SAR Green theme
  ///
  /// In en, this message translates to:
  /// **'Safe/All Clear mode'**
  String get safeAllClearMode;

  /// Auto/System theme option
  ///
  /// In en, this message translates to:
  /// **'Auto (System)'**
  String get autoSystem;

  /// Description for system theme
  ///
  /// In en, this message translates to:
  /// **'Follow system theme'**
  String get followSystemTheme;

  /// Setting to show RX/TX indicators
  ///
  /// In en, this message translates to:
  /// **'Show RX/TX Indicators'**
  String get showRxTxIndicators;

  /// Description for RX/TX indicators setting
  ///
  /// In en, this message translates to:
  /// **'Display packet activity indicators in top bar'**
  String get displayPacketActivity;

  /// Setting to enable simple mode
  ///
  /// In en, this message translates to:
  /// **'Simple Mode'**
  String get simpleMode;

  /// Description for simple mode setting
  ///
  /// In en, this message translates to:
  /// **'Hide non-essential information in messages and contacts'**
  String get simpleModeDescription;

  /// Setting to disable the map tab
  ///
  /// In en, this message translates to:
  /// **'Disable Map'**
  String get disableMap;

  /// Description for disable map setting
  ///
  /// In en, this message translates to:
  /// **'Hide the map tab to reduce battery usage'**
  String get disableMapDescription;

  /// Language setting label
  ///
  /// In en, this message translates to:
  /// **'Language'**
  String get language;

  /// Language selection dialog title
  ///
  /// In en, this message translates to:
  /// **'Choose Language'**
  String get chooseLanguage;

  /// English language option
  ///
  /// In en, this message translates to:
  /// **'English'**
  String get english;

  /// Slovenian language option
  ///
  /// In en, this message translates to:
  /// **'Slovenian'**
  String get slovenian;

  /// Croatian language option
  ///
  /// In en, this message translates to:
  /// **'Croatian'**
  String get croatian;

  /// German language option
  ///
  /// In en, this message translates to:
  /// **'German'**
  String get german;

  /// Spanish language option
  ///
  /// In en, this message translates to:
  /// **'Spanish'**
  String get spanish;

  /// French language option
  ///
  /// In en, this message translates to:
  /// **'French'**
  String get french;

  /// Italian language option
  ///
  /// In en, this message translates to:
  /// **'Italian'**
  String get italian;

  /// Location settings section header
  ///
  /// In en, this message translates to:
  /// **'Location Broadcasting'**
  String get locationBroadcasting;

  /// Auto location tracking setting
  ///
  /// In en, this message translates to:
  /// **'Auto Location Tracking'**
  String get autoLocationTracking;

  /// Description for auto location tracking
  ///
  /// In en, this message translates to:
  /// **'Automatically broadcast position updates'**
  String get automaticallyBroadcastPosition;

  /// Configure tracking button label
  ///
  /// In en, this message translates to:
  /// **'Configure Tracking'**
  String get configureTracking;

  /// Description for tracking configuration
  ///
  /// In en, this message translates to:
  /// **'Distance and time thresholds'**
  String get distanceAndTimeThresholds;

  /// Tracking configuration dialog title
  ///
  /// In en, this message translates to:
  /// **'Location Tracking Configuration'**
  String get locationTrackingConfiguration;

  /// Description for tracking configuration dialog
  ///
  /// In en, this message translates to:
  /// **'Configure when location broadcasts are sent to the mesh network'**
  String get configureWhenLocationBroadcasts;

  /// Minimum distance setting label
  ///
  /// In en, this message translates to:
  /// **'Minimum Distance'**
  String get minimumDistance;

  /// Description for minimum distance
  ///
  /// In en, this message translates to:
  /// **'Broadcast only after moving {distance} meters'**
  String broadcastAfterMoving(String distance);

  /// Maximum distance setting label
  ///
  /// In en, this message translates to:
  /// **'Maximum Distance'**
  String get maximumDistance;

  /// Description for maximum distance
  ///
  /// In en, this message translates to:
  /// **'Always broadcast after moving {distance} meters'**
  String alwaysBroadcastAfterMoving(String distance);

  /// Minimum time interval setting label
  ///
  /// In en, this message translates to:
  /// **'Minimum Time Interval'**
  String get minimumTimeInterval;

  /// Description for time interval
  ///
  /// In en, this message translates to:
  /// **'Always broadcast every {duration}'**
  String alwaysBroadcastEvery(String duration);

  /// Save button label
  ///
  /// In en, this message translates to:
  /// **'Save'**
  String get save;

  /// Cancel button label
  ///
  /// In en, this message translates to:
  /// **'Cancel'**
  String get cancel;

  /// Close button label
  ///
  /// In en, this message translates to:
  /// **'Close'**
  String get close;

  /// About section header
  ///
  /// In en, this message translates to:
  /// **'About'**
  String get about;

  /// App version label
  ///
  /// In en, this message translates to:
  /// **'App Version'**
  String get appVersion;

  /// App name label
  ///
  /// In en, this message translates to:
  /// **'App Name'**
  String get appName;

  /// About dialog title
  ///
  /// In en, this message translates to:
  /// **'About MeshCore SAR'**
  String get aboutMeshCoreSar;

  /// About dialog description
  ///
  /// In en, this message translates to:
  /// **'A Search & Rescue application designed for emergency response teams. Features include:\n\n• BLE mesh networking for device-to-device communication\n• Offline maps with multiple layer options\n• Real-time team member tracking\n• SAR tactical markers (found person, fire, staging)\n• Contact management and messaging\n• GPS tracking with compass heading\n• Map tile caching for offline use'**
  String get aboutDescription;

  /// Technologies used section title
  ///
  /// In en, this message translates to:
  /// **'Technologies Used:'**
  String get technologiesUsed;

  /// List of technologies used
  ///
  /// In en, this message translates to:
  /// **'• Flutter for cross-platform development\n• BLE (Bluetooth Low Energy) for mesh networking\n• OpenStreetMap for mapping\n• Provider for state management\n• SharedPreferences for local storage'**
  String get technologiesList;

  /// More info button label
  ///
  /// In en, this message translates to:
  /// **'More Info'**
  String get moreInfo;

  /// Learn more link description
  ///
  /// In en, this message translates to:
  /// **'Learn more about MeshCore SAR'**
  String get learnMoreAbout;

  /// Developer section header
  ///
  /// In en, this message translates to:
  /// **'Developer'**
  String get developer;

  /// Package name label
  ///
  /// In en, this message translates to:
  /// **'Package Name'**
  String get packageName;

  /// Sample data section header
  ///
  /// In en, this message translates to:
  /// **'Sample Data'**
  String get sampleData;

  /// Sample data section description
  ///
  /// In en, this message translates to:
  /// **'Load or clear sample contacts, channel messages, and SAR markers for testing'**
  String get sampleDataDescription;

  /// Load sample data button
  ///
  /// In en, this message translates to:
  /// **'Load Sample Data'**
  String get loadSampleData;

  /// Clear all data button
  ///
  /// In en, this message translates to:
  /// **'Clear All Data'**
  String get clearAllData;

  /// Clear data confirmation dialog title
  ///
  /// In en, this message translates to:
  /// **'Clear All Data'**
  String get clearAllDataConfirmTitle;

  /// Clear data confirmation message
  ///
  /// In en, this message translates to:
  /// **'This will clear all contacts and SAR markers. Are you sure?'**
  String get clearAllDataConfirmMessage;

  /// Clear button label
  ///
  /// In en, this message translates to:
  /// **'Clear'**
  String get clear;

  /// Success message after loading sample data
  ///
  /// In en, this message translates to:
  /// **'Loaded {teamCount} team members, {channelCount} channels, {sarCount} SAR markers, {messageCount} messages'**
  String loadedSampleData(
    int teamCount,
    int channelCount,
    int sarCount,
    int messageCount,
  );

  /// Error message when sample data fails to load
  ///
  /// In en, this message translates to:
  /// **'Failed to load sample data: {error}'**
  String failedToLoadSampleData(String error);

  /// Success message after clearing all data
  ///
  /// In en, this message translates to:
  /// **'All data cleared'**
  String get allDataCleared;

  /// Error message when background tracking fails to start
  ///
  /// In en, this message translates to:
  /// **'Failed to start background tracking. Check permissions and BLE connection.'**
  String get failedToStartBackgroundTracking;

  /// Success message for location broadcast
  ///
  /// In en, this message translates to:
  /// **'Location broadcast: {latitude}, {longitude}'**
  String locationBroadcast(String latitude, String longitude);

  /// Information about default PIN for pairing
  ///
  /// In en, this message translates to:
  /// **'The default pin for devices without a screen is 123456. Trouble pairing? Forget the bluetooth device in system settings.'**
  String get defaultPinInfo;

  /// Empty state message when there are no messages
  ///
  /// In en, this message translates to:
  /// **'No messages yet'**
  String get noMessagesYet;

  /// Instruction to pull down to refresh messages
  ///
  /// In en, this message translates to:
  /// **'Pull down to sync messages'**
  String get pullDownToSync;

  /// Delete contact action label
  ///
  /// In en, this message translates to:
  /// **'Delete Contact'**
  String get deleteContact;

  /// Delete button label
  ///
  /// In en, this message translates to:
  /// **'Delete'**
  String get delete;

  /// Action to view contact location on map
  ///
  /// In en, this message translates to:
  /// **'View on Map'**
  String get viewOnMap;

  /// Refresh button label
  ///
  /// In en, this message translates to:
  /// **'Refresh'**
  String get refresh;

  /// Action to send direct message to contact
  ///
  /// In en, this message translates to:
  /// **'Send'**
  String get sendDirectMessage;

  /// Action to reset contact path for re-routing
  ///
  /// In en, this message translates to:
  /// **'Reset Path (Re-route)'**
  String get resetPath;

  /// Success message when public key is copied
  ///
  /// In en, this message translates to:
  /// **'Public key copied to clipboard'**
  String get publicKeyCopied;

  /// Success message when a value is copied to clipboard
  ///
  /// In en, this message translates to:
  /// **'{label} copied to clipboard'**
  String copiedToClipboard(String label);

  /// Validation message for empty password field
  ///
  /// In en, this message translates to:
  /// **'Please enter a password'**
  String get pleaseEnterPassword;

  /// Error message when contact sync fails
  ///
  /// In en, this message translates to:
  /// **'Failed to sync contacts: {error}'**
  String failedToSyncContacts(String error);

  /// Success message after successful room login
  ///
  /// In en, this message translates to:
  /// **'Logged in successfully! Waiting for room messages...'**
  String get loggedInSuccessfully;

  /// Error message when room login fails
  ///
  /// In en, this message translates to:
  /// **'Login failed - incorrect password'**
  String get loginFailed;

  /// Status message during room login process
  ///
  /// In en, this message translates to:
  /// **'Logging in to {roomName}...'**
  String loggingIn(String roomName);

  /// Error message when login command fails to send
  ///
  /// In en, this message translates to:
  /// **'Failed to send login: {error}'**
  String failedToSendLogin(String error);

  /// Warning title for low GPS accuracy
  ///
  /// In en, this message translates to:
  /// **'Low Location Accuracy'**
  String get lowLocationAccuracy;

  /// Continue button label
  ///
  /// In en, this message translates to:
  /// **'Continue'**
  String get continue_;

  /// Action to send SAR marker
  ///
  /// In en, this message translates to:
  /// **'Send SAR marker'**
  String get sendSarMarker;

  /// Action to delete a map drawing
  ///
  /// In en, this message translates to:
  /// **'Delete Drawing'**
  String get deleteDrawing;

  /// Drawing tools section or menu title
  ///
  /// In en, this message translates to:
  /// **'Drawing Tools'**
  String get drawingTools;

  /// Map drawing mode: line
  ///
  /// In en, this message translates to:
  /// **'Draw Line'**
  String get drawLine;

  /// Description for line drawing mode
  ///
  /// In en, this message translates to:
  /// **'Draw a freehand line on the map'**
  String get drawLineDesc;

  /// Map drawing mode: rectangle
  ///
  /// In en, this message translates to:
  /// **'Draw Rectangle'**
  String get drawRectangle;

  /// Description for rectangle drawing mode
  ///
  /// In en, this message translates to:
  /// **'Draw a rectangular area on the map'**
  String get drawRectangleDesc;

  /// Map drawing mode: measure distance
  ///
  /// In en, this message translates to:
  /// **'Measure Distance'**
  String get measureDistance;

  /// Description for distance measurement mode
  ///
  /// In en, this message translates to:
  /// **'Long press two points to measure'**
  String get measureDistanceDesc;

  /// Tooltip to clear measurement
  ///
  /// In en, this message translates to:
  /// **'Clear Measurement'**
  String get clearMeasurement;

  /// Label showing measured distance
  ///
  /// In en, this message translates to:
  /// **'Distance: {distance}'**
  String distanceLabel(String distance);

  /// Instruction when first measurement point is set
  ///
  /// In en, this message translates to:
  /// **'Long press for second point'**
  String get longPressForSecondPoint;

  /// Instruction to start measurement
  ///
  /// In en, this message translates to:
  /// **'Long press to set first point'**
  String get longPressToStartMeasurement;

  /// Instruction to restart measurement after completion
  ///
  /// In en, this message translates to:
  /// **'Long press to start new measurement'**
  String get longPressToStartNewMeasurement;

  /// Action to share drawings to network
  ///
  /// In en, this message translates to:
  /// **'Share Drawings'**
  String get shareDrawings;

  /// Action to clear all local drawings
  ///
  /// In en, this message translates to:
  /// **'Clear All Drawings'**
  String get clearAllDrawings;

  /// Tooltip to complete drawing a line
  ///
  /// In en, this message translates to:
  /// **'Complete Line'**
  String get completeLine;

  /// Subtitle showing how many drawings will be broadcast
  ///
  /// In en, this message translates to:
  /// **'Broadcast {count} drawing{plural} to team'**
  String broadcastDrawingsToTeam(int count, String plural);

  /// Subtitle for remove all drawings action
  ///
  /// In en, this message translates to:
  /// **'Remove all {count} drawing{plural}'**
  String removeAllDrawings(int count, String plural);

  /// Confirmation dialog message for deleting all drawings
  ///
  /// In en, this message translates to:
  /// **'Delete all {count} drawing{plural} from the map?'**
  String deleteAllDrawingsConfirm(int count, String plural);

  /// Generic drawing label
  ///
  /// In en, this message translates to:
  /// **'Drawing'**
  String get drawing;

  /// Title for share drawings dialog
  ///
  /// In en, this message translates to:
  /// **'Share {count} Drawing{plural}'**
  String shareDrawingsCount(int count, String plural);

  /// System message when drawings are sent to room
  ///
  /// In en, this message translates to:
  /// **'Sent {count} map drawing{plural} to {roomName}'**
  String sentDrawingsToRoom(int count, String plural, String roomName);

  /// Snackbar message showing drawings shared to room
  ///
  /// In en, this message translates to:
  /// **'Shared {success}/{total} drawing{plural} to {roomName}'**
  String sharedDrawingsToRoom(
    int success,
    int total,
    String plural,
    String roomName,
  );

  /// Toggle to show/hide received drawings from other team members
  ///
  /// In en, this message translates to:
  /// **'Show Received Drawings'**
  String get showReceivedDrawings;

  /// Subtitle when received drawings are visible
  ///
  /// In en, this message translates to:
  /// **'Showing all drawings'**
  String get showingAllDrawings;

  /// Subtitle when received drawings are hidden
  ///
  /// In en, this message translates to:
  /// **'Showing only your drawings'**
  String get showingOnlyYourDrawings;

  /// Toggle to show/hide SAR markers on map
  ///
  /// In en, this message translates to:
  /// **'Show SAR Markers'**
  String get showSarMarkers;

  /// Subtitle when SAR markers are visible
  ///
  /// In en, this message translates to:
  /// **'Showing SAR markers'**
  String get showingSarMarkers;

  /// Subtitle when SAR markers are hidden
  ///
  /// In en, this message translates to:
  /// **'Hiding SAR markers'**
  String get hidingSarMarkers;

  /// Clear all button label
  ///
  /// In en, this message translates to:
  /// **'Clear All'**
  String get clearAll;

  /// Message when there are no drawings to share
  ///
  /// In en, this message translates to:
  /// **'No local drawings to share'**
  String get noLocalDrawings;

  /// Public channel option for sharing
  ///
  /// In en, this message translates to:
  /// **'Public Channel'**
  String get publicChannel;

  /// Description for public channel broadcast
  ///
  /// In en, this message translates to:
  /// **'Broadcast to all nearby nodes (ephemeral)'**
  String get broadcastToAll;

  /// Description for room storage permanence
  ///
  /// In en, this message translates to:
  /// **'Stored permanently in room'**
  String get storedPermanently;

  /// System message when drawings are sent to public channel
  ///
  /// In en, this message translates to:
  /// **'Sent {count} map drawing{plural} to Public Channel'**
  String drawingsSentToPublicChannel(int count, String plural);

  /// Snackbar message showing success count for drawings shared to public channel
  ///
  /// In en, this message translates to:
  /// **'Shared {success}/{total} drawings to Public Channel'**
  String drawingsSharedToPublicChannel(int success, int total);

  /// Error message when device is not connected for direct messaging
  ///
  /// In en, this message translates to:
  /// **'Not connected to device'**
  String get notConnectedToDevice;

  /// Title for direct message sheet
  ///
  /// In en, this message translates to:
  /// **'Direct Message'**
  String get directMessage;

  /// Success message after sending direct message
  ///
  /// In en, this message translates to:
  /// **'Direct message sent to {contactName}'**
  String directMessageSentTo(String contactName);

  /// Error message when sending direct message fails
  ///
  /// In en, this message translates to:
  /// **'Failed to send: {error}'**
  String failedToSend(String error);

  /// Information about direct messaging behavior
  ///
  /// In en, this message translates to:
  /// **'This message will be sent directly to {contactName}. It will also appear in the main messages feed.'**
  String directMessageInfo(String contactName);

  /// Placeholder text for message input field
  ///
  /// In en, this message translates to:
  /// **'Type your message...'**
  String get typeYourMessage;

  /// Subtitle for SAR marker sheet header
  ///
  /// In en, this message translates to:
  /// **'Quick location marker'**
  String get quickLocationMarker;

  /// Label for marker type selection section
  ///
  /// In en, this message translates to:
  /// **'Marker Type'**
  String get markerType;

  /// Label for destination selection section
  ///
  /// In en, this message translates to:
  /// **'Send To'**
  String get sendTo;

  /// Warning when no rooms or channels exist
  ///
  /// In en, this message translates to:
  /// **'No destinations available.'**
  String get noDestinationsAvailable;

  /// Placeholder for destination dropdown
  ///
  /// In en, this message translates to:
  /// **'Select destination...'**
  String get selectDestination;

  /// Information about ephemeral channel broadcasts
  ///
  /// In en, this message translates to:
  /// **'Ephemeral: Broadcast over-the-air only. Not stored - nodes must be online.'**
  String get ephemeralBroadcastInfo;

  /// Information about persistent room storage
  ///
  /// In en, this message translates to:
  /// **'Persistent: Stored immutably in room. Synced automatically and preserved offline.'**
  String get persistentRoomInfo;

  /// Label for location section
  ///
  /// In en, this message translates to:
  /// **'Location'**
  String get location;

  /// Button label to insert current GPS location
  ///
  /// In en, this message translates to:
  /// **'My Location'**
  String get myLocation;

  /// Badge showing location is from map tap
  ///
  /// In en, this message translates to:
  /// **'From Map'**
  String get fromMap;

  /// Loading message while fetching GPS location
  ///
  /// In en, this message translates to:
  /// **'Getting location...'**
  String get gettingLocation;

  /// Title for location error messages
  ///
  /// In en, this message translates to:
  /// **'Location Error'**
  String get locationError;

  /// Retry button label
  ///
  /// In en, this message translates to:
  /// **'Retry'**
  String get retry;

  /// Tooltip for refresh location button
  ///
  /// In en, this message translates to:
  /// **'Refresh location'**
  String get refreshLocation;

  /// Display of GPS accuracy in meters
  ///
  /// In en, this message translates to:
  /// **'Accuracy: ±{accuracy}m'**
  String accuracyMeters(int accuracy);

  /// Label for optional notes field
  ///
  /// In en, this message translates to:
  /// **'Notes (optional)'**
  String get notesOptional;

  /// Placeholder for notes field
  ///
  /// In en, this message translates to:
  /// **'Add additional information...'**
  String get addAdditionalInformation;

  /// Warning dialog content for low GPS accuracy
  ///
  /// In en, this message translates to:
  /// **'Location accuracy is ±{accuracy}m. This may not be accurate enough for SAR operations.\n\nContinue anyway?'**
  String lowAccuracyWarning(int accuracy);

  /// Title for room login dialog
  ///
  /// In en, this message translates to:
  /// **'Login to Room'**
  String get loginToRoom;

  /// Information about room password
  ///
  /// In en, this message translates to:
  /// **'Enter the password to access this room. The password will be saved for future use.'**
  String get enterPasswordInfo;

  /// Password field label
  ///
  /// In en, this message translates to:
  /// **'Password'**
  String get password;

  /// Password field hint
  ///
  /// In en, this message translates to:
  /// **'Enter room password'**
  String get enterRoomPassword;

  /// Button text while logging in
  ///
  /// In en, this message translates to:
  /// **'Logging in...'**
  String get loggingInDots;

  /// Login button label
  ///
  /// In en, this message translates to:
  /// **'Login'**
  String get login;

  /// Error message when adding room fails
  ///
  /// In en, this message translates to:
  /// **'Failed to add room to device: {error}\n\nThe room may not have advertised yet.\nTry waiting for the room to broadcast.'**
  String failedToAddRoom(String error);

  /// Direct routing indicator
  ///
  /// In en, this message translates to:
  /// **'Direct'**
  String get direct;

  /// Flood routing indicator
  ///
  /// In en, this message translates to:
  /// **'Flood'**
  String get flood;

  /// Admin badge label
  ///
  /// In en, this message translates to:
  /// **'Admin'**
  String get admin;

  /// Logged in status badge
  ///
  /// In en, this message translates to:
  /// **'Logged In'**
  String get loggedIn;

  /// Message when GPS data is not available
  ///
  /// In en, this message translates to:
  /// **'No GPS data'**
  String get noGpsData;

  /// Distance label
  ///
  /// In en, this message translates to:
  /// **'Distance'**
  String get distance;

  /// Status message for direct ping
  ///
  /// In en, this message translates to:
  /// **'Pinging {name} (direct via path)...'**
  String pingingDirect(String name);

  /// Status message for flood ping
  ///
  /// In en, this message translates to:
  /// **'Pinging {name} (flooding - no path)...'**
  String pingingFlood(String name);

  /// Warning when direct ping times out
  ///
  /// In en, this message translates to:
  /// **'Direct ping timeout - retrying {name} with flooding...'**
  String directPingTimeout(String name);

  /// Success message for ping
  ///
  /// In en, this message translates to:
  /// **'Ping successful to {name}{fallback}'**
  String pingSuccessful(String name, String fallback);

  /// Suffix for ping success with fallback
  ///
  /// In en, this message translates to:
  /// **' (via flooding fallback)'**
  String get viaFloodingFallback;

  /// Error message when ping fails
  ///
  /// In en, this message translates to:
  /// **'Ping failed to {name} - no response received'**
  String pingFailed(String name);

  /// Confirmation message for deleting contact
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to delete \"{name}\"?\n\nThis will remove the contact from both the app and the companion radio device.'**
  String deleteContactConfirmation(String name);

  /// Status message while removing contact
  ///
  /// In en, this message translates to:
  /// **'Removing {name}...'**
  String removingContact(String name);

  /// Success message after removing contact
  ///
  /// In en, this message translates to:
  /// **'Contact \"{name}\" removed'**
  String contactRemoved(String name);

  /// Error message when contact removal fails
  ///
  /// In en, this message translates to:
  /// **'Failed to remove contact: {error}'**
  String failedToRemoveContact(String error);

  /// Contact type label
  ///
  /// In en, this message translates to:
  /// **'Type'**
  String get type;

  /// Public key label
  ///
  /// In en, this message translates to:
  /// **'Public Key'**
  String get publicKey;

  /// Last seen label
  ///
  /// In en, this message translates to:
  /// **'Last Seen'**
  String get lastSeen;

  /// Room status section header
  ///
  /// In en, this message translates to:
  /// **'Room Status'**
  String get roomStatus;

  /// Login status label
  ///
  /// In en, this message translates to:
  /// **'Login Status'**
  String get loginStatus;

  /// Not logged in status
  ///
  /// In en, this message translates to:
  /// **'Not Logged In'**
  String get notLoggedIn;

  /// Admin access label
  ///
  /// In en, this message translates to:
  /// **'Admin Access'**
  String get adminAccess;

  /// Yes answer
  ///
  /// In en, this message translates to:
  /// **'Yes'**
  String get yes;

  /// No answer
  ///
  /// In en, this message translates to:
  /// **'No'**
  String get no;

  /// Permissions label
  ///
  /// In en, this message translates to:
  /// **'Permissions'**
  String get permissions;

  /// Password saved label
  ///
  /// In en, this message translates to:
  /// **'Password Saved'**
  String get passwordSaved;

  /// Location section header
  ///
  /// In en, this message translates to:
  /// **'Location:'**
  String get locationColon;

  /// Telemetry section header
  ///
  /// In en, this message translates to:
  /// **'Telemetry'**
  String get telemetry;

  /// Status message while requesting telemetry
  ///
  /// In en, this message translates to:
  /// **'Requesting telemetry from {name}...'**
  String requestingTelemetry(String name);

  /// Voltage label
  ///
  /// In en, this message translates to:
  /// **'Voltage'**
  String get voltage;

  /// Battery label
  ///
  /// In en, this message translates to:
  /// **'Battery'**
  String get battery;

  /// Temperature label
  ///
  /// In en, this message translates to:
  /// **'Temperature'**
  String get temperature;

  /// Humidity label
  ///
  /// In en, this message translates to:
  /// **'Humidity'**
  String get humidity;

  /// Pressure label
  ///
  /// In en, this message translates to:
  /// **'Pressure'**
  String get pressure;

  /// GPS from telemetry label
  ///
  /// In en, this message translates to:
  /// **'GPS (Telemetry)'**
  String get gpsTelemetry;

  /// Updated timestamp label
  ///
  /// In en, this message translates to:
  /// **'Updated'**
  String get updated;

  /// Info message after path reset
  ///
  /// In en, this message translates to:
  /// **'Path reset for {name}. Next message will find a new route.'**
  String pathResetInfo(String name);

  /// Button to re-login to room
  ///
  /// In en, this message translates to:
  /// **'Re-Login to Room'**
  String get reLoginToRoom;

  /// Compass heading label
  ///
  /// In en, this message translates to:
  /// **'Heading'**
  String get heading;

  /// Elevation/altitude label
  ///
  /// In en, this message translates to:
  /// **'Elevation'**
  String get elevation;

  /// GPS accuracy label
  ///
  /// In en, this message translates to:
  /// **'Accuracy'**
  String get accuracy;

  /// Bearing label in compass
  ///
  /// In en, this message translates to:
  /// **'Bearing'**
  String get bearing;

  /// Direction label in compass
  ///
  /// In en, this message translates to:
  /// **'Direction'**
  String get direction;

  /// Title for filter markers dialog
  ///
  /// In en, this message translates to:
  /// **'Filter Markers'**
  String get filterMarkers;

  /// Tooltip for filter button
  ///
  /// In en, this message translates to:
  /// **'Filter markers'**
  String get filterMarkersTooltip;

  /// Filter option for contacts
  ///
  /// In en, this message translates to:
  /// **'Contacts'**
  String get contactsFilter;

  /// Filter option for repeaters
  ///
  /// In en, this message translates to:
  /// **'Repeaters'**
  String get repeatersFilter;

  /// SAR markers section header
  ///
  /// In en, this message translates to:
  /// **'SAR Markers'**
  String get sarMarkers;

  /// Found person SAR marker type
  ///
  /// In en, this message translates to:
  /// **'Found Person'**
  String get foundPerson;

  /// Fire SAR marker type
  ///
  /// In en, this message translates to:
  /// **'Fire'**
  String get fire;

  /// Staging area SAR marker type
  ///
  /// In en, this message translates to:
  /// **'Staging Area'**
  String get stagingArea;

  /// Button to show all filters
  ///
  /// In en, this message translates to:
  /// **'Show All'**
  String get showAll;

  /// Title for nearby contacts list in compass
  ///
  /// In en, this message translates to:
  /// **'Nearby Contacts'**
  String get nearbyContacts;

  /// Message when GPS location is unavailable
  ///
  /// In en, this message translates to:
  /// **'Location unavailable'**
  String get locationUnavailable;

  /// Relative bearing direction - ahead
  ///
  /// In en, this message translates to:
  /// **'ahead'**
  String get ahead;

  /// Relative bearing direction - right
  ///
  /// In en, this message translates to:
  /// **'{degrees}° right'**
  String degreesRight(int degrees);

  /// Relative bearing direction - left
  ///
  /// In en, this message translates to:
  /// **'{degrees}° left'**
  String degreesLeft(int degrees);

  /// Latitude and longitude display format
  ///
  /// In en, this message translates to:
  /// **'Lat: {latitude} Lon: {longitude}'**
  String latLonFormat(String latitude, String longitude);

  /// Empty state message when there are no contacts
  ///
  /// In en, this message translates to:
  /// **'No contacts yet'**
  String get noContactsYet;

  /// Instruction to connect device to load contacts
  ///
  /// In en, this message translates to:
  /// **'Connect to a device to load contacts'**
  String get connectToDeviceToLoadContacts;

  /// Section header for team members (chat contacts)
  ///
  /// In en, this message translates to:
  /// **'Team Members'**
  String get teamMembers;

  /// Section header for repeater nodes
  ///
  /// In en, this message translates to:
  /// **'Repeaters'**
  String get repeaters;

  /// Section header for rooms
  ///
  /// In en, this message translates to:
  /// **'Rooms'**
  String get rooms;

  /// Section header for broadcast channels
  ///
  /// In en, this message translates to:
  /// **'Channels'**
  String get channels;

  /// Title for cache statistics section
  ///
  /// In en, this message translates to:
  /// **'Cache Statistics'**
  String get cacheStatistics;

  /// Label for total number of cached tiles
  ///
  /// In en, this message translates to:
  /// **'Total Tiles'**
  String get totalTiles;

  /// Label for cache size in MB
  ///
  /// In en, this message translates to:
  /// **'Cache Size'**
  String get cacheSize;

  /// Label for cache store name
  ///
  /// In en, this message translates to:
  /// **'Store Name'**
  String get storeName;

  /// Message when cache statistics are unavailable
  ///
  /// In en, this message translates to:
  /// **'No cache statistics available'**
  String get noCacheStatistics;

  /// Title for download region section
  ///
  /// In en, this message translates to:
  /// **'Download Region'**
  String get downloadRegion;

  /// Label for map layer selection
  ///
  /// In en, this message translates to:
  /// **'Map Layer'**
  String get mapLayer;

  /// Title for region bounds input section
  ///
  /// In en, this message translates to:
  /// **'Region Bounds'**
  String get regionBounds;

  /// Label for north coordinate
  ///
  /// In en, this message translates to:
  /// **'North'**
  String get north;

  /// Label for south coordinate
  ///
  /// In en, this message translates to:
  /// **'South'**
  String get south;

  /// Label for east coordinate
  ///
  /// In en, this message translates to:
  /// **'East'**
  String get east;

  /// Label for west coordinate
  ///
  /// In en, this message translates to:
  /// **'West'**
  String get west;

  /// Title for zoom levels section
  ///
  /// In en, this message translates to:
  /// **'Zoom Levels'**
  String get zoomLevels;

  /// Label for minimum zoom level
  ///
  /// In en, this message translates to:
  /// **'Min: {zoom}'**
  String minZoom(int zoom);

  /// Label for maximum zoom level
  ///
  /// In en, this message translates to:
  /// **'Max: {zoom}'**
  String maxZoom(int zoom);

  /// Status message during download
  ///
  /// In en, this message translates to:
  /// **'Downloading...'**
  String get downloadingDots;

  /// Button to cancel download
  ///
  /// In en, this message translates to:
  /// **'Cancel Download'**
  String get cancelDownload;

  /// Button to start region download
  ///
  /// In en, this message translates to:
  /// **'Download Region'**
  String get downloadRegionButton;

  /// Warning about download size and time
  ///
  /// In en, this message translates to:
  /// **'Note: Large regions or high zoom levels may take significant time and storage.'**
  String get downloadNote;

  /// Title for cache management section
  ///
  /// In en, this message translates to:
  /// **'Cache Management'**
  String get cacheManagement;

  /// Button to clear all cached maps
  ///
  /// In en, this message translates to:
  /// **'Clear All Maps'**
  String get clearAllMaps;

  /// Title for clear maps confirmation dialog
  ///
  /// In en, this message translates to:
  /// **'Clear All Maps'**
  String get clearMapsConfirmTitle;

  /// Confirmation message for clearing maps
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to delete all downloaded maps? This action cannot be undone.'**
  String get clearMapsConfirmMessage;

  /// Success message after map download
  ///
  /// In en, this message translates to:
  /// **'Map download completed!'**
  String get mapDownloadCompleted;

  /// Success message after clearing cache
  ///
  /// In en, this message translates to:
  /// **'Cache cleared successfully!'**
  String get cacheClearedSuccessfully;

  /// Message when download is cancelled
  ///
  /// In en, this message translates to:
  /// **'Download cancelled'**
  String get downloadCancelled;

  /// Initial status when download begins
  ///
  /// In en, this message translates to:
  /// **'Starting download...'**
  String get startingDownload;

  /// Status during tile download
  ///
  /// In en, this message translates to:
  /// **'Downloading map tiles...'**
  String get downloadingMapTiles;

  /// Status after successful download
  ///
  /// In en, this message translates to:
  /// **'Download completed successfully!'**
  String get downloadCompletedSuccessfully;

  /// Status while cancelling download
  ///
  /// In en, this message translates to:
  /// **'Cancelling download...'**
  String get cancellingDownload;

  /// Error message when loading cache stats fails
  ///
  /// In en, this message translates to:
  /// **'Error loading stats: {error}'**
  String errorLoadingStats(String error);

  /// Error message when download fails
  ///
  /// In en, this message translates to:
  /// **'Download failed: {error}'**
  String downloadFailed(String error);

  /// Error message when cancel fails
  ///
  /// In en, this message translates to:
  /// **'Cancel failed: {error}'**
  String cancelFailed(String error);

  /// Error message when clearing cache fails
  ///
  /// In en, this message translates to:
  /// **'Clear cache failed: {error}'**
  String clearCacheFailed(String error);

  /// Validation error for minimum zoom
  ///
  /// In en, this message translates to:
  /// **'Min zoom: {error}'**
  String minZoomError(String error);

  /// Validation error for maximum zoom
  ///
  /// In en, this message translates to:
  /// **'Max zoom: {error}'**
  String maxZoomError(String error);

  /// Validation error when min zoom > max zoom
  ///
  /// In en, this message translates to:
  /// **'Minimum zoom must be less than or equal to maximum zoom'**
  String get minZoomGreaterThanMax;

  /// Title for map layer selection dialog
  ///
  /// In en, this message translates to:
  /// **'Select Map Layer'**
  String get selectMapLayer;

  /// Title for map options dialog
  ///
  /// In en, this message translates to:
  /// **'Map Options'**
  String get mapOptions;

  /// Toggle for showing map legend
  ///
  /// In en, this message translates to:
  /// **'Show Legend'**
  String get showLegend;

  /// Description for show legend toggle
  ///
  /// In en, this message translates to:
  /// **'Display marker type counts'**
  String get displayMarkerTypeCounts;

  /// Toggle for rotating map with compass heading
  ///
  /// In en, this message translates to:
  /// **'Rotate Map with Heading'**
  String get rotateMapWithHeading;

  /// Description for rotate map toggle
  ///
  /// In en, this message translates to:
  /// **'Map follows your direction when moving'**
  String get mapFollowsDirection;

  /// Button to reset map rotation to north
  ///
  /// In en, this message translates to:
  /// **'Reset Rotation'**
  String get resetMapRotation;

  /// Tooltip for reset rotation button
  ///
  /// In en, this message translates to:
  /// **'Reset map to north'**
  String get resetMapRotationTooltip;

  /// Toggle for showing map debug information
  ///
  /// In en, this message translates to:
  /// **'Show Map Debug Info'**
  String get showMapDebugInfo;

  /// Description for debug info toggle
  ///
  /// In en, this message translates to:
  /// **'Display zoom level and bounds'**
  String get displayZoomLevelBounds;

  /// Toggle for fullscreen map mode
  ///
  /// In en, this message translates to:
  /// **'Fullscreen Mode'**
  String get fullscreenMode;

  /// Description for fullscreen mode toggle
  ///
  /// In en, this message translates to:
  /// **'Hide all UI controls for full map view'**
  String get hideUiFullMapView;

  /// OpenStreetMap layer name
  ///
  /// In en, this message translates to:
  /// **'OpenStreetMap'**
  String get openStreetMap;

  /// OpenTopoMap layer name
  ///
  /// In en, this message translates to:
  /// **'OpenTopoMap'**
  String get openTopoMap;

  /// ESRI Satellite imagery layer name
  ///
  /// In en, this message translates to:
  /// **'ESRI Satellite'**
  String get esriSatellite;

  /// Google Hybrid layer name (satellite + labels)
  ///
  /// In en, this message translates to:
  /// **'Google Hybrid'**
  String get googleHybrid;

  /// Google Roadmap layer name (street map)
  ///
  /// In en, this message translates to:
  /// **'Google Roadmap'**
  String get googleRoadmap;

  /// Google Terrain layer name (topographic)
  ///
  /// In en, this message translates to:
  /// **'Google Terrain'**
  String get googleTerrain;

  /// Tooltip for download visible area button
  ///
  /// In en, this message translates to:
  /// **'Download visible area'**
  String get downloadVisibleArea;

  /// Loading message for map initialization
  ///
  /// In en, this message translates to:
  /// **'Initializing map...'**
  String get initializingMap;

  /// Label when dragging a pin on map
  ///
  /// In en, this message translates to:
  /// **'Drag to Position'**
  String get dragToPosition;

  /// Label for creating SAR marker from pin
  ///
  /// In en, this message translates to:
  /// **'Create SAR Marker'**
  String get createSarMarker;

  /// Compass title in detailed compass dialog
  ///
  /// In en, this message translates to:
  /// **'Compass'**
  String get compass;

  /// Subtitle for compass dialog
  ///
  /// In en, this message translates to:
  /// **'Navigation & Contacts'**
  String get navigationAndContacts;

  /// Label for SAR alert badge on messages
  ///
  /// In en, this message translates to:
  /// **'SAR ALERT'**
  String get sarAlert;

  /// Success message when message is sent to public channel
  ///
  /// In en, this message translates to:
  /// **'Message sent to public channel'**
  String get messageSentToPublicChannel;

  /// Error when no room is selected for SAR marker
  ///
  /// In en, this message translates to:
  /// **'Please select a room to send SAR marker'**
  String get pleaseSelectRoomToSendSar;

  /// Error message when SAR marker fails to send
  ///
  /// In en, this message translates to:
  /// **'Failed to send SAR marker: {error}'**
  String failedToSendSarMarker(String error);

  /// Success message when SAR marker is sent to room
  ///
  /// In en, this message translates to:
  /// **'SAR marker sent to {roomName}'**
  String sarMarkerSentTo(String roomName);

  /// Warning when trying to sync messages while not connected
  ///
  /// In en, this message translates to:
  /// **'Not connected - cannot sync messages'**
  String get notConnectedCannotSync;

  /// Success message showing number of synced messages
  ///
  /// In en, this message translates to:
  /// **'Synced {count} message(s)'**
  String syncedMessageCount(int count);

  /// Info message when no new messages to sync
  ///
  /// In en, this message translates to:
  /// **'No new messages'**
  String get noNewMessages;

  /// Error message when sync fails
  ///
  /// In en, this message translates to:
  /// **'Sync failed: {error}'**
  String syncFailed(String error);

  /// Error when message retry fails
  ///
  /// In en, this message translates to:
  /// **'Failed to resend message'**
  String get failedToResendMessage;

  /// Info message when retrying a failed message
  ///
  /// In en, this message translates to:
  /// **'Retrying message...'**
  String get retryingMessage;

  /// Error message when retry fails
  ///
  /// In en, this message translates to:
  /// **'Retry failed: {error}'**
  String retryFailed(String error);

  /// Success message when text is copied
  ///
  /// In en, this message translates to:
  /// **'Text copied to clipboard'**
  String get textCopiedToClipboard;

  /// Error when sender info is missing for reply
  ///
  /// In en, this message translates to:
  /// **'Cannot reply: sender information missing'**
  String get cannotReplySenderMissing;

  /// Error when contact not found for reply
  ///
  /// In en, this message translates to:
  /// **'Cannot reply: contact not found'**
  String get cannotReplyContactNotFound;

  /// Info message when message is deleted
  ///
  /// In en, this message translates to:
  /// **'Message deleted'**
  String get messageDeleted;

  /// Option to copy message text to clipboard
  ///
  /// In en, this message translates to:
  /// **'Copy text'**
  String get copyText;

  /// Option to save SAR message as a reusable template
  ///
  /// In en, this message translates to:
  /// **'Save as Template'**
  String get saveAsTemplate;

  /// Success message when SAR template is saved
  ///
  /// In en, this message translates to:
  /// **'Template saved successfully'**
  String get templateSaved;

  /// Error message when trying to save duplicate template
  ///
  /// In en, this message translates to:
  /// **'Template with this emoji already exists'**
  String get templateAlreadyExists;

  /// Dialog title for deleting a message
  ///
  /// In en, this message translates to:
  /// **'Delete message'**
  String get deleteMessage;

  /// Confirmation text for message deletion
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to delete this message?'**
  String get deleteMessageConfirmation;

  /// Option to share SAR marker location
  ///
  /// In en, this message translates to:
  /// **'Share location'**
  String get shareLocation;

  /// Formatted text for sharing SAR marker location
  ///
  /// In en, this message translates to:
  /// **'{markerInfo}\n\nCoordinates: {lat}, {lon}\n\nGoogle Maps: {url}'**
  String shareLocationText(
    String markerInfo,
    String lat,
    String lon,
    String url,
  );

  /// Subject line when sharing SAR marker location
  ///
  /// In en, this message translates to:
  /// **'SAR Location'**
  String get sarLocationShare;

  /// Success message when location is shared
  ///
  /// In en, this message translates to:
  /// **'Location shared'**
  String get locationShared;

  /// Success message when contacts are refreshed
  ///
  /// In en, this message translates to:
  /// **'Refreshed contacts'**
  String get refreshedContacts;

  /// Time indicator for very recent activity
  ///
  /// In en, this message translates to:
  /// **'Just now'**
  String get justNow;

  /// Time indicator for minutes ago
  ///
  /// In en, this message translates to:
  /// **'{minutes}m ago'**
  String minutesAgo(int minutes);

  /// Time indicator for hours ago
  ///
  /// In en, this message translates to:
  /// **'{hours}h ago'**
  String hoursAgo(int hours);

  /// Time indicator for days ago
  ///
  /// In en, this message translates to:
  /// **'{days}d ago'**
  String daysAgo(int days);

  /// Time indicator for seconds ago
  ///
  /// In en, this message translates to:
  /// **'{seconds}s ago'**
  String secondsAgo(int seconds);

  /// Delivery status: sending
  ///
  /// In en, this message translates to:
  /// **'Sending...'**
  String get sending;

  /// Delivery status: sent
  ///
  /// In en, this message translates to:
  /// **'Sent'**
  String get sent;

  /// Delivery status: delivered
  ///
  /// In en, this message translates to:
  /// **'Delivered'**
  String get delivered;

  /// Delivery status with round-trip time
  ///
  /// In en, this message translates to:
  /// **'Delivered ({time}ms)'**
  String deliveredWithTime(int time);

  /// Delivery status: failed
  ///
  /// In en, this message translates to:
  /// **'Failed'**
  String get failed;

  /// Delivery status for channel messages (no echoes yet)
  ///
  /// In en, this message translates to:
  /// **'Broadcast'**
  String get broadcast;

  /// Grouped message delivery count
  ///
  /// In en, this message translates to:
  /// **'Delivered to {delivered}/{total} contacts'**
  String deliveredToContacts(int delivered, int total);

  /// Status when all recipients received the message
  ///
  /// In en, this message translates to:
  /// **'All delivered'**
  String get allDelivered;

  /// Header for expandable recipient list
  ///
  /// In en, this message translates to:
  /// **'Recipient Details'**
  String get recipientDetails;

  /// Delivery status: pending/waiting
  ///
  /// In en, this message translates to:
  /// **'Pending'**
  String get pending;

  /// SAR marker type: found person
  ///
  /// In en, this message translates to:
  /// **'Found Person'**
  String get sarMarkerFoundPerson;

  /// SAR marker type: fire
  ///
  /// In en, this message translates to:
  /// **'Fire Location'**
  String get sarMarkerFire;

  /// SAR marker type: staging area
  ///
  /// In en, this message translates to:
  /// **'Staging Area'**
  String get sarMarkerStagingArea;

  /// SAR marker type: object
  ///
  /// In en, this message translates to:
  /// **'Object Found'**
  String get sarMarkerObject;

  /// Sender label in notifications
  ///
  /// In en, this message translates to:
  /// **'From'**
  String get from;

  /// Coordinates label
  ///
  /// In en, this message translates to:
  /// **'Coordinates'**
  String get coordinates;

  /// Notification action text
  ///
  /// In en, this message translates to:
  /// **'Tap to view on map'**
  String get tapToViewOnMap;

  /// Section title for radio settings
  ///
  /// In en, this message translates to:
  /// **'Radio Settings'**
  String get radioSettings;

  /// Label for radio frequency field
  ///
  /// In en, this message translates to:
  /// **'Frequency (MHz)'**
  String get frequencyMHz;

  /// Helper text example for frequency
  ///
  /// In en, this message translates to:
  /// **'e.g., 869.618'**
  String get frequencyExample;

  /// Label for bandwidth dropdown
  ///
  /// In en, this message translates to:
  /// **'Bandwidth'**
  String get bandwidth;

  /// Label for spreading factor dropdown
  ///
  /// In en, this message translates to:
  /// **'Spreading Factor'**
  String get spreadingFactor;

  /// Label for coding rate dropdown
  ///
  /// In en, this message translates to:
  /// **'Coding Rate'**
  String get codingRate;

  /// Label for TX power field
  ///
  /// In en, this message translates to:
  /// **'TX Power (dBm)'**
  String get txPowerDbm;

  /// Helper text showing maximum TX power
  ///
  /// In en, this message translates to:
  /// **'Max: {power} dBm'**
  String maxPowerDbm(int power);

  /// Label for the current user in message bubbles
  ///
  /// In en, this message translates to:
  /// **'You'**
  String get you;

  /// Title for offline vector maps section
  ///
  /// In en, this message translates to:
  /// **'Offline Vector Maps'**
  String get offlineVectorMaps;

  /// Description for offline vector maps section
  ///
  /// In en, this message translates to:
  /// **'Import and manage offline vector map tiles (MBTiles format) for use without internet connection'**
  String get offlineVectorMapsDescription;

  /// Button to import MBTiles file
  ///
  /// In en, this message translates to:
  /// **'Import MBTiles File'**
  String get importMbtiles;

  /// Note about supported MBTiles file types
  ///
  /// In en, this message translates to:
  /// **'Supports MBTiles files with vector tiles (PBF/MVT format). Geofabrik extracts work great!'**
  String get importMbtilesNote;

  /// Message when no MBTiles files are available
  ///
  /// In en, this message translates to:
  /// **'No offline vector maps found'**
  String get noMbtilesFiles;

  /// Success message after importing MBTiles file
  ///
  /// In en, this message translates to:
  /// **'MBTiles file imported successfully'**
  String get mbtilesImportedSuccessfully;

  /// Error message when MBTiles import fails
  ///
  /// In en, this message translates to:
  /// **'Failed to import MBTiles file'**
  String get failedToImportMbtiles;

  /// Title for delete MBTiles confirmation dialog
  ///
  /// In en, this message translates to:
  /// **'Delete Offline Map'**
  String get deleteMbtilesConfirmTitle;

  /// Confirmation message for deleting MBTiles file
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to delete \"{name}\"? This will permanently remove the offline map.'**
  String deleteMbtilesConfirmMessage(String name);

  /// Success message after deleting MBTiles file
  ///
  /// In en, this message translates to:
  /// **'Offline map deleted successfully'**
  String get mbtilesDeletedSuccessfully;

  /// Error message when MBTiles deletion fails
  ///
  /// In en, this message translates to:
  /// **'Failed to delete offline map'**
  String get failedToDeleteMbtiles;

  /// Title for import/export section
  ///
  /// In en, this message translates to:
  /// **'Import/Export Cached Tiles'**
  String get importExportCachedTiles;

  /// Description for import/export functionality
  ///
  /// In en, this message translates to:
  /// **'Backup, share, and restore downloaded map tiles between devices'**
  String get importExportDescription;

  /// Button to export tiles to archive file
  ///
  /// In en, this message translates to:
  /// **'Export Tiles to File'**
  String get exportTilesToFile;

  /// Button to import tiles from archive file
  ///
  /// In en, this message translates to:
  /// **'Import Tiles from File'**
  String get importTilesFromFile;

  /// Title for export file picker
  ///
  /// In en, this message translates to:
  /// **'Select Export Location'**
  String get selectExportLocation;

  /// Title for import file picker
  ///
  /// In en, this message translates to:
  /// **'Select Tile Archive'**
  String get selectImportFile;

  /// Status message during export
  ///
  /// In en, this message translates to:
  /// **'Exporting tiles...'**
  String get exportingTiles;

  /// Status message during import
  ///
  /// In en, this message translates to:
  /// **'Importing tiles...'**
  String get importingTiles;

  /// Success message after export
  ///
  /// In en, this message translates to:
  /// **'Exported {count} tiles successfully'**
  String exportSuccess(int count);

  /// Success message after import
  ///
  /// In en, this message translates to:
  /// **'Imported {count} stores successfully'**
  String importSuccess(int count);

  /// Error message when export fails
  ///
  /// In en, this message translates to:
  /// **'Export failed: {error}'**
  String exportFailed(String error);

  /// Error message when import fails
  ///
  /// In en, this message translates to:
  /// **'Import failed: {error}'**
  String importFailed(String error);

  /// Note about export functionality
  ///
  /// In en, this message translates to:
  /// **'Creates a compressed archive (.fmtc) file that can be shared and imported on other devices.'**
  String get exportNote;

  /// Note about import functionality
  ///
  /// In en, this message translates to:
  /// **'Imports map tiles from a previously exported archive file. Tiles will be merged with existing cache.'**
  String get importNote;

  /// Message when cache is empty
  ///
  /// In en, this message translates to:
  /// **'No tiles available to export'**
  String get noTilesToExport;

  /// Information about archive contents
  ///
  /// In en, this message translates to:
  /// **'Archive contains {count} stores'**
  String archiveContainsStores(int count);

  /// Label for vector tile type
  ///
  /// In en, this message translates to:
  /// **'Vector Tiles'**
  String get vectorTiles;

  /// Label for vector tile schema
  ///
  /// In en, this message translates to:
  /// **'Schema'**
  String get schema;

  /// Unknown value label
  ///
  /// In en, this message translates to:
  /// **'Unknown'**
  String get unknown;

  /// Label for geographic bounds
  ///
  /// In en, this message translates to:
  /// **'Bounds'**
  String get bounds;

  /// Section header for online map layers
  ///
  /// In en, this message translates to:
  /// **'Online Layers'**
  String get onlineLayers;

  /// Section header for offline map layers (MBTiles)
  ///
  /// In en, this message translates to:
  /// **'Offline Layers'**
  String get offlineLayers;

  /// Location trail title
  ///
  /// In en, this message translates to:
  /// **'Location Trail'**
  String get locationTrail;

  /// Toggle to show/hide trail on map
  ///
  /// In en, this message translates to:
  /// **'Show Trail on Map'**
  String get showTrailOnMap;

  /// Trail visibility status - visible
  ///
  /// In en, this message translates to:
  /// **'Trail is visible on the map'**
  String get trailVisible;

  /// Trail visibility status - hidden but recording
  ///
  /// In en, this message translates to:
  /// **'Trail is hidden (still recording)'**
  String get trailHiddenRecording;

  /// Duration label
  ///
  /// In en, this message translates to:
  /// **'Duration'**
  String get duration;

  /// Trail points count label
  ///
  /// In en, this message translates to:
  /// **'Points'**
  String get points;

  /// Button to clear location trail
  ///
  /// In en, this message translates to:
  /// **'Clear Trail'**
  String get clearTrail;

  /// Confirmation dialog title
  ///
  /// In en, this message translates to:
  /// **'Clear Trail?'**
  String get clearTrailQuestion;

  /// Confirmation dialog message
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to clear the current location trail? This action cannot be undone.'**
  String get clearTrailConfirmation;

  /// Message when no trail exists
  ///
  /// In en, this message translates to:
  /// **'No trail recorded yet'**
  String get noTrailRecorded;

  /// Instructions to start trail recording
  ///
  /// In en, this message translates to:
  /// **'Start location tracking to record your trail'**
  String get startTrackingToRecord;

  /// Trail controls tooltip
  ///
  /// In en, this message translates to:
  /// **'Trail Controls'**
  String get trailControls;

  /// Button label to export trail to GPX file
  ///
  /// In en, this message translates to:
  /// **'Export Trail to GPX'**
  String get exportTrailToGpx;

  /// Button label to import trail from GPX file
  ///
  /// In en, this message translates to:
  /// **'Import Trail from GPX'**
  String get importTrailFromGpx;

  /// Success message when trail is exported
  ///
  /// In en, this message translates to:
  /// **'Trail exported successfully!'**
  String get trailExportedSuccessfully;

  /// Error message when trail export fails
  ///
  /// In en, this message translates to:
  /// **'Failed to export trail'**
  String get failedToExportTrail;

  /// Error message when trail import fails
  ///
  /// In en, this message translates to:
  /// **'Failed to import trail: {error}'**
  String failedToImportTrail(String error);

  /// Import trail dialog title
  ///
  /// In en, this message translates to:
  /// **'Import Trail'**
  String get importTrail;

  /// Import trail confirmation dialog content
  ///
  /// In en, this message translates to:
  /// **'Import trail with {pointCount} points?\n\nYou can replace your current trail or view it alongside.'**
  String importTrailQuestion(int pointCount);

  /// Button to import trail alongside current trail
  ///
  /// In en, this message translates to:
  /// **'View Alongside'**
  String get viewAlongside;

  /// Button to replace current trail with imported trail
  ///
  /// In en, this message translates to:
  /// **'Replace Current'**
  String get replaceCurrent;

  /// Success message when trail is imported
  ///
  /// In en, this message translates to:
  /// **'Trail imported! ({pointCount} points)'**
  String trailImported(int pointCount);

  /// Success message when trail is replaced
  ///
  /// In en, this message translates to:
  /// **'Trail replaced! ({pointCount} points)'**
  String trailReplaced(int pointCount);

  /// Contact trails section header
  ///
  /// In en, this message translates to:
  /// **'Contact Trails'**
  String get contactTrails;

  /// Toggle label to show all contact trails
  ///
  /// In en, this message translates to:
  /// **'Show All Contact Trails'**
  String get showAllContactTrails;

  /// Subtitle when no contacts have trails
  ///
  /// In en, this message translates to:
  /// **'No contacts with location history'**
  String get noContactsWithLocationHistory;

  /// Subtitle showing number of contacts with trails
  ///
  /// In en, this message translates to:
  /// **'Showing trails for {count} contacts'**
  String showingTrailsForContacts(int count);

  /// Expansion tile title for individual contact trails
  ///
  /// In en, this message translates to:
  /// **'Individual Contact Trails'**
  String get individualContactTrails;

  /// Device information section header
  ///
  /// In en, this message translates to:
  /// **'Device Information'**
  String get deviceInformation;

  /// Bluetooth Low Energy device name label
  ///
  /// In en, this message translates to:
  /// **'BLE Name'**
  String get bleName;

  /// Mesh network name label
  ///
  /// In en, this message translates to:
  /// **'Mesh Name'**
  String get meshName;

  /// Label when a value is not set
  ///
  /// In en, this message translates to:
  /// **'Not set'**
  String get notSet;

  /// Device model label
  ///
  /// In en, this message translates to:
  /// **'Model'**
  String get model;

  /// Version label
  ///
  /// In en, this message translates to:
  /// **'Version'**
  String get version;

  /// Firmware build date label
  ///
  /// In en, this message translates to:
  /// **'Build Date'**
  String get buildDate;

  /// Firmware label
  ///
  /// In en, this message translates to:
  /// **'Firmware'**
  String get firmware;

  /// Maximum contacts capacity label
  ///
  /// In en, this message translates to:
  /// **'Max Contacts'**
  String get maxContacts;

  /// Maximum channels capacity label
  ///
  /// In en, this message translates to:
  /// **'Max Channels'**
  String get maxChannels;

  /// Public information section header
  ///
  /// In en, this message translates to:
  /// **'Public Info'**
  String get publicInfo;

  /// Mesh network name field label
  ///
  /// In en, this message translates to:
  /// **'Mesh Network Name'**
  String get meshNetworkName;

  /// Helper text for mesh network name field
  ///
  /// In en, this message translates to:
  /// **'Name broadcast in mesh advertisements'**
  String get nameBroadcastInMesh;

  /// Telemetry and location sharing toggle label
  ///
  /// In en, this message translates to:
  /// **'Telemetry & Location Sharing'**
  String get telemetryAndLocationSharing;

  /// Latitude field label (short form)
  ///
  /// In en, this message translates to:
  /// **'Lat'**
  String get lat;

  /// Longitude field label (short form)
  ///
  /// In en, this message translates to:
  /// **'Lon'**
  String get lon;

  /// Tooltip for use current location button
  ///
  /// In en, this message translates to:
  /// **'Use current location'**
  String get useCurrentLocation;

  /// Device type: none or unknown
  ///
  /// In en, this message translates to:
  /// **'None/Unknown'**
  String get noneUnknown;

  /// Device type: chat node
  ///
  /// In en, this message translates to:
  /// **'Chat Node'**
  String get chatNode;

  /// Device type: repeater
  ///
  /// In en, this message translates to:
  /// **'Repeater'**
  String get repeater;

  /// Device type: room or channel
  ///
  /// In en, this message translates to:
  /// **'Room/Channel'**
  String get roomChannel;

  /// Generic device type with number
  ///
  /// In en, this message translates to:
  /// **'Type {number}'**
  String typeNumber(int number);

  /// Short success message when copying to clipboard
  ///
  /// In en, this message translates to:
  /// **'Copied {label} to clipboard'**
  String copiedToClipboardShort(String label);

  /// Generic error message for save failures
  ///
  /// In en, this message translates to:
  /// **'Failed to save: {error}'**
  String failedToSave(String error);

  /// Error message when getting location fails
  ///
  /// In en, this message translates to:
  /// **'Failed to get location: {error}'**
  String failedToGetLocation(String error);

  /// SAR templates menu title
  ///
  /// In en, this message translates to:
  /// **'SAR Templates'**
  String get sarTemplates;

  /// Subtitle for SAR templates settings
  ///
  /// In en, this message translates to:
  /// **'Manage cursor on target templates'**
  String get manageSarTemplates;

  /// Button to add new SAR template
  ///
  /// In en, this message translates to:
  /// **'Add Template'**
  String get addTemplate;

  /// Dialog title for editing template
  ///
  /// In en, this message translates to:
  /// **'Edit Template'**
  String get editTemplate;

  /// Action to delete template
  ///
  /// In en, this message translates to:
  /// **'Delete Template'**
  String get deleteTemplate;

  /// Label for template name field
  ///
  /// In en, this message translates to:
  /// **'Template Name'**
  String get templateName;

  /// Hint text for template name
  ///
  /// In en, this message translates to:
  /// **'e.g. Found Person'**
  String get templateNameHint;

  /// Label for template emoji field
  ///
  /// In en, this message translates to:
  /// **'Emoji'**
  String get templateEmoji;

  /// Validation error when emoji field is empty
  ///
  /// In en, this message translates to:
  /// **'Emoji is required'**
  String get emojiRequired;

  /// Validation error when name field is empty
  ///
  /// In en, this message translates to:
  /// **'Name is required'**
  String get nameRequired;

  /// Label for template description field
  ///
  /// In en, this message translates to:
  /// **'Description (Optional)'**
  String get templateDescription;

  /// Hint text for template description
  ///
  /// In en, this message translates to:
  /// **'Add additional context...'**
  String get templateDescriptionHint;

  /// Label for template color picker
  ///
  /// In en, this message translates to:
  /// **'Color'**
  String get templateColor;

  /// Label for format preview
  ///
  /// In en, this message translates to:
  /// **'Preview (SAR Message Format)'**
  String get previewFormat;

  /// Button to import templates from clipboard
  ///
  /// In en, this message translates to:
  /// **'Import'**
  String get importFromClipboard;

  /// Button to export templates to clipboard
  ///
  /// In en, this message translates to:
  /// **'Export'**
  String get exportToClipboard;

  /// Confirmation message for template deletion
  ///
  /// In en, this message translates to:
  /// **'Delete template \'{name}\'?'**
  String deleteTemplateConfirmation(String name);

  /// Success message when template is added
  ///
  /// In en, this message translates to:
  /// **'Template added'**
  String get templateAdded;

  /// Success message when template is updated
  ///
  /// In en, this message translates to:
  /// **'Template updated'**
  String get templateUpdated;

  /// Success message when template is deleted
  ///
  /// In en, this message translates to:
  /// **'Template deleted'**
  String get templateDeleted;

  /// Success message after importing templates
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =0{No templates imported} =1{Imported 1 template} other{Imported {count} templates}}'**
  String templatesImported(int count);

  /// Success message after exporting templates
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{Exported 1 template to clipboard} other{Exported {count} templates to clipboard}}'**
  String templatesExported(int count);

  /// Action to reset templates to defaults
  ///
  /// In en, this message translates to:
  /// **'Reset to Defaults'**
  String get resetToDefaults;

  /// Confirmation message for reset to defaults
  ///
  /// In en, this message translates to:
  /// **'This will delete all custom templates and restore the 4 default templates. Continue?'**
  String get resetToDefaultsConfirmation;

  /// Reset button label
  ///
  /// In en, this message translates to:
  /// **'Reset'**
  String get reset;

  /// Success message after reset
  ///
  /// In en, this message translates to:
  /// **'Templates reset to defaults'**
  String get resetComplete;

  /// Message when no templates exist
  ///
  /// In en, this message translates to:
  /// **'No templates available'**
  String get noTemplates;

  /// Helper text when no templates exist
  ///
  /// In en, this message translates to:
  /// **'Tap + to create your first template'**
  String get tapAddToCreate;

  /// OK button label
  ///
  /// In en, this message translates to:
  /// **'OK'**
  String get ok;

  /// Permissions section header
  ///
  /// In en, this message translates to:
  /// **'Permissions'**
  String get permissionsSection;

  /// Location permission label
  ///
  /// In en, this message translates to:
  /// **'Location Permission'**
  String get locationPermission;

  /// Loading state indicator
  ///
  /// In en, this message translates to:
  /// **'Checking...'**
  String get checking;

  /// Location permission status: granted always
  ///
  /// In en, this message translates to:
  /// **'Granted (Always)'**
  String get locationPermissionGrantedAlways;

  /// Location permission status: granted while in use
  ///
  /// In en, this message translates to:
  /// **'Granted (While In Use)'**
  String get locationPermissionGrantedWhileInUse;

  /// Location permission status: denied, user can request
  ///
  /// In en, this message translates to:
  /// **'Denied - Tap to request'**
  String get locationPermissionDeniedTapToRequest;

  /// Location permission status: permanently denied
  ///
  /// In en, this message translates to:
  /// **'Permanently Denied - Open Settings'**
  String get locationPermissionPermanentlyDeniedOpenSettings;

  /// Content for location permission dialog when permanently denied
  ///
  /// In en, this message translates to:
  /// **'Location permission is permanently denied. Please enable it in your device settings to use GPS tracking and location sharing features.'**
  String get locationPermissionDialogContent;

  /// Button to open device settings
  ///
  /// In en, this message translates to:
  /// **'Open Settings'**
  String get openSettings;

  /// Success message when location permission is granted
  ///
  /// In en, this message translates to:
  /// **'Location permission granted!'**
  String get locationPermissionGranted;

  /// Info message about location permission requirement
  ///
  /// In en, this message translates to:
  /// **'Location permission is required for GPS tracking and location sharing.'**
  String get locationPermissionRequiredForGps;

  /// Info message when permission is already granted
  ///
  /// In en, this message translates to:
  /// **'Location permission is already granted.'**
  String get locationPermissionAlreadyGranted;

  /// SAR Navy Blue theme name
  ///
  /// In en, this message translates to:
  /// **'SAR Navy Blue'**
  String get sarNavyBlue;

  /// Description for SAR Navy Blue theme
  ///
  /// In en, this message translates to:
  /// **'Professional/Operations Mode'**
  String get sarNavyBlueDescription;

  /// Title for recipient selector sheet
  ///
  /// In en, this message translates to:
  /// **'Select Recipient'**
  String get selectRecipient;

  /// Subtitle for public channel option
  ///
  /// In en, this message translates to:
  /// **'Broadcast to all nearby'**
  String get broadcastToAllNearby;

  /// Placeholder text for recipient search field
  ///
  /// In en, this message translates to:
  /// **'Search recipients...'**
  String get searchRecipients;

  /// Message when no contacts match search
  ///
  /// In en, this message translates to:
  /// **'No contacts found'**
  String get noContactsFound;

  /// Message when no rooms match search
  ///
  /// In en, this message translates to:
  /// **'No rooms found'**
  String get noRoomsFound;

  /// Message when no contacts or rooms exist
  ///
  /// In en, this message translates to:
  /// **'No contacts or rooms available'**
  String get noContactsOrRoomsAvailable;

  /// Message when no recipients exist (contacts, rooms, or channels)
  ///
  /// In en, this message translates to:
  /// **'No recipients available'**
  String get noRecipientsAvailable;

  /// Message when no channels match the search
  ///
  /// In en, this message translates to:
  /// **'No channels found'**
  String get noChannelsFound;

  /// Info message when only public channel is available
  ///
  /// In en, this message translates to:
  /// **'Messages will be sent to public channel'**
  String get messagesWillBeSentToPublicChannel;

  /// Notification title for new message
  ///
  /// In en, this message translates to:
  /// **'New message'**
  String get newMessage;

  /// Channel label in notifications
  ///
  /// In en, this message translates to:
  /// **'Channel'**
  String get channel;

  /// Sample team member name
  ///
  /// In en, this message translates to:
  /// **'Police Lead'**
  String get samplePoliceLead;

  /// Sample team member name
  ///
  /// In en, this message translates to:
  /// **'Drone Operator'**
  String get sampleDroneOperator;

  /// Sample team member name
  ///
  /// In en, this message translates to:
  /// **'Firefighter'**
  String get sampleFirefighterAlpha;

  /// Sample team member name
  ///
  /// In en, this message translates to:
  /// **'Medic'**
  String get sampleMedicCharlie;

  /// Sample team member name
  ///
  /// In en, this message translates to:
  /// **'Command'**
  String get sampleCommandDelta;

  /// Sample team member name
  ///
  /// In en, this message translates to:
  /// **'Fire Engine'**
  String get sampleFireEngine;

  /// Sample team member name
  ///
  /// In en, this message translates to:
  /// **'Air Support'**
  String get sampleAirSupport;

  /// Sample team member name
  ///
  /// In en, this message translates to:
  /// **'Base Coordinator'**
  String get sampleBaseCoordinator;

  /// Emergency channel name
  ///
  /// In en, this message translates to:
  /// **'Emergency'**
  String get channelEmergency;

  /// Coordination channel name
  ///
  /// In en, this message translates to:
  /// **'Coordination'**
  String get channelCoordination;

  /// Updates channel name
  ///
  /// In en, this message translates to:
  /// **'Updates'**
  String get channelUpdates;

  /// Sample sender name
  ///
  /// In en, this message translates to:
  /// **'Sample Team Member'**
  String get sampleTeamMember;

  /// Sample sender name
  ///
  /// In en, this message translates to:
  /// **'Sample Scout'**
  String get sampleScout;

  /// Sample sender name
  ///
  /// In en, this message translates to:
  /// **'Sample Base'**
  String get sampleBase;

  /// Sample sender name
  ///
  /// In en, this message translates to:
  /// **'Sample Searcher'**
  String get sampleSearcher;

  /// Sample object note
  ///
  /// In en, this message translates to:
  /// **' Backpack found - blue color'**
  String get sampleObjectBackpack;

  /// Sample object note
  ///
  /// In en, this message translates to:
  /// **' Vehicle abandoned - check for owner'**
  String get sampleObjectVehicle;

  /// Sample object note
  ///
  /// In en, this message translates to:
  /// **' Camping equipment discovered'**
  String get sampleObjectCamping;

  /// Sample object note
  ///
  /// In en, this message translates to:
  /// **' Trail marker found off-path'**
  String get sampleObjectTrailMarker;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'All teams check in'**
  String get sampleMsgAllTeamsCheckIn;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'Weather update: Clear skies, temp 18°C'**
  String get sampleMsgWeatherUpdate;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'Base camp established at staging area'**
  String get sampleMsgBaseCamp;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'Team moving to sector 2'**
  String get sampleMsgTeamAlpha;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'Radio check - all stations respond'**
  String get sampleMsgRadioCheck;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'Water supply available at checkpoint 3'**
  String get sampleMsgWaterSupply;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'Team reporting: sector 1 clear'**
  String get sampleMsgTeamBravo;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'ETA to rally point: 15 minutes'**
  String get sampleMsgEtaRallyPoint;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'Supply drop confirmed for 14:00'**
  String get sampleMsgSupplyDrop;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'Drone survey completed - no findings'**
  String get sampleMsgDroneSurvey;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'Team requesting backup'**
  String get sampleMsgTeamCharlie;

  /// Sample channel message
  ///
  /// In en, this message translates to:
  /// **'All units: maintain radio discipline'**
  String get sampleMsgRadioDiscipline;

  /// Sample emergency message
  ///
  /// In en, this message translates to:
  /// **'URGENT: Medical assistance needed at sector 4'**
  String get sampleMsgUrgentMedical;

  /// Sample emergency message note
  ///
  /// In en, this message translates to:
  /// **' Adult male, conscious'**
  String get sampleMsgAdultMale;

  /// Sample emergency message
  ///
  /// In en, this message translates to:
  /// **'Fire spotted - coordinates incoming'**
  String get sampleMsgFireSpotted;

  /// Sample emergency message note
  ///
  /// In en, this message translates to:
  /// **' Spreading rapidly!'**
  String get sampleMsgSpreadingRapidly;

  /// Sample emergency message
  ///
  /// In en, this message translates to:
  /// **'PRIORITY: Need helicopter support'**
  String get sampleMsgPriorityHelicopter;

  /// Sample emergency message
  ///
  /// In en, this message translates to:
  /// **'Medical team en route to your location'**
  String get sampleMsgMedicalTeamEnRoute;

  /// Sample emergency message
  ///
  /// In en, this message translates to:
  /// **'Evac helicopter ETA 10 minutes'**
  String get sampleMsgEvacHelicopter;

  /// Sample emergency message
  ///
  /// In en, this message translates to:
  /// **'Emergency resolved - all clear'**
  String get sampleMsgEmergencyResolved;

  /// Sample emergency message note
  ///
  /// In en, this message translates to:
  /// **' Emergency staging area'**
  String get sampleMsgEmergencyStagingArea;

  /// Sample emergency message
  ///
  /// In en, this message translates to:
  /// **'Emergency services notified and responding'**
  String get sampleMsgEmergencyServices;

  /// Sample team name
  ///
  /// In en, this message translates to:
  /// **'Team Lead'**
  String get sampleAlphaTeamLead;

  /// Sample team name
  ///
  /// In en, this message translates to:
  /// **'Scout'**
  String get sampleBravoScout;

  /// Sample team name
  ///
  /// In en, this message translates to:
  /// **'Medic'**
  String get sampleCharlieMedic;

  /// Sample team name
  ///
  /// In en, this message translates to:
  /// **'Navigator'**
  String get sampleDeltaNavigator;

  /// Sample team name
  ///
  /// In en, this message translates to:
  /// **'Support'**
  String get sampleEchoSupport;

  /// Sample team name
  ///
  /// In en, this message translates to:
  /// **'Base Command'**
  String get sampleBaseCommand;

  /// Sample team name
  ///
  /// In en, this message translates to:
  /// **'Field Coordinator'**
  String get sampleFieldCoordinator;

  /// Sample team name
  ///
  /// In en, this message translates to:
  /// **'Medical Team'**
  String get sampleMedicalTeam;

  /// Label for map drawing messages
  ///
  /// In en, this message translates to:
  /// **'Map Drawing'**
  String get mapDrawing;

  /// Option to navigate to drawing on map
  ///
  /// In en, this message translates to:
  /// **'Navigate to Drawing'**
  String get navigateToDrawing;

  /// Option to copy coordinates to clipboard
  ///
  /// In en, this message translates to:
  /// **'Copy Coordinates'**
  String get copyCoordinates;

  /// Option to hide drawing from map
  ///
  /// In en, this message translates to:
  /// **'Hide from Map'**
  String get hideFromMap;

  /// Label for line type drawings
  ///
  /// In en, this message translates to:
  /// **'Line Drawing'**
  String get lineDrawing;

  /// Label for rectangle type drawings
  ///
  /// In en, this message translates to:
  /// **'Rectangle Drawing'**
  String get rectangleDrawing;

  /// Success message when coordinates are copied
  ///
  /// In en, this message translates to:
  /// **'Coordinates copied to clipboard'**
  String get coordinatesCopiedToClipboard;

  /// Label for manual coordinate input toggle
  ///
  /// In en, this message translates to:
  /// **'Manual Coordinates'**
  String get manualCoordinates;

  /// Description for manual coordinate input option
  ///
  /// In en, this message translates to:
  /// **'Enter coordinates manually'**
  String get enterCoordinatesManually;

  /// Label for latitude input field
  ///
  /// In en, this message translates to:
  /// **'Latitude'**
  String get latitudeLabel;

  /// Label for longitude input field
  ///
  /// In en, this message translates to:
  /// **'Longitude'**
  String get longitudeLabel;

  /// Error message for invalid latitude value
  ///
  /// In en, this message translates to:
  /// **'Invalid latitude (-90 to 90)'**
  String get invalidLatitude;

  /// Error message for invalid longitude value
  ///
  /// In en, this message translates to:
  /// **'Invalid longitude (-180 to 180)'**
  String get invalidLongitude;

  /// Example coordinate format hint
  ///
  /// In en, this message translates to:
  /// **'Example: 46.0569, 14.5058'**
  String get exampleCoordinates;

  /// Label for shared drawing notifications
  ///
  /// In en, this message translates to:
  /// **'Map Drawing'**
  String get drawingShared;

  /// Success message when drawing is hidden
  ///
  /// In en, this message translates to:
  /// **'Drawing hidden from map'**
  String get drawingHidden;

  /// Message showing how many drawings were already shared
  ///
  /// In en, this message translates to:
  /// **'{count, plural, =1{1 already shared} other{{count} already shared}}'**
  String alreadyShared(int count);

  /// Success message after sharing new drawings
  ///
  /// In en, this message translates to:
  /// **'Shared {count} new drawing{plural}'**
  String newDrawingsShared(int count, String plural);

  /// Title for share single drawing dialog
  ///
  /// In en, this message translates to:
  /// **'Share Drawing'**
  String get shareDrawing;

  /// Subtitle for public channel sharing option
  ///
  /// In en, this message translates to:
  /// **'Share with all nearby devices'**
  String get shareWithAllNearbyDevices;

  /// Header for room sharing section
  ///
  /// In en, this message translates to:
  /// **'Share to Room'**
  String get shareToRoom;

  /// Subtitle for room sharing option
  ///
  /// In en, this message translates to:
  /// **'Send to persistent room storage'**
  String get sendToPersistentStorage;

  /// Confirmation message for deleting a single drawing
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to delete this drawing?'**
  String get deleteDrawingConfirm;

  /// Success message after deleting a drawing
  ///
  /// In en, this message translates to:
  /// **'Drawing deleted'**
  String get drawingDeleted;

  /// Header showing count of user's drawings
  ///
  /// In en, this message translates to:
  /// **'Your Drawings ({count})'**
  String yourDrawingsCount(int count);

  /// Status label for shared drawings
  ///
  /// In en, this message translates to:
  /// **'Shared'**
  String get shared;

  /// Line drawing type label
  ///
  /// In en, this message translates to:
  /// **'Line'**
  String get line;

  /// Rectangle drawing type label
  ///
  /// In en, this message translates to:
  /// **'Rectangle'**
  String get rectangle;

  /// Title for update dialog when new version is available
  ///
  /// In en, this message translates to:
  /// **'Update Available'**
  String get updateAvailable;

  /// Label for current app version
  ///
  /// In en, this message translates to:
  /// **'Current'**
  String get currentVersion;

  /// Label for latest available app version
  ///
  /// In en, this message translates to:
  /// **'Latest'**
  String get latestVersion;

  /// Button to download app update
  ///
  /// In en, this message translates to:
  /// **'Download'**
  String get downloadUpdate;

  /// Button to dismiss update dialog
  ///
  /// In en, this message translates to:
  /// **'Later'**
  String get updateLater;

  /// Label for cadastral parcels WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Cadastral Parcels'**
  String get cadastralParcels;

  /// Label for forest roads WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Forest Roads'**
  String get forestRoads;

  /// Tooltip for cadastral parcels overlay toggle button
  ///
  /// In en, this message translates to:
  /// **'Show Cadastral Parcels'**
  String get showCadastralParcels;

  /// Tooltip for forest roads overlay toggle button
  ///
  /// In en, this message translates to:
  /// **'Show Forest Roads'**
  String get showForestRoads;

  /// Section header for WMS overlay layers in layer selector
  ///
  /// In en, this message translates to:
  /// **'WMS Overlays'**
  String get wmsOverlays;

  /// Label for hiking/mountain trails WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Hiking Trails'**
  String get hikingTrails;

  /// Label for main roads WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Main Roads'**
  String get mainRoads;

  /// Label for house numbers WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'House Numbers'**
  String get houseNumbers;

  /// Label for fire hazard risk zones WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Fire Hazard Zones'**
  String get fireHazardZones;

  /// Label for historical forest fires WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Historical Fires'**
  String get historicalFires;

  /// Label for firebreaks WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Firebreaks'**
  String get firebreaks;

  /// Label for Kras fire zones WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Kras Fire Zones'**
  String get krasFireZones;

  /// Label for geographic place names WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Place Names'**
  String get placeNames;

  /// Label for municipality borders WMS overlay layer
  ///
  /// In en, this message translates to:
  /// **'Municipality Borders'**
  String get municipalityBorders;

  /// Label for DTK25 topographic base map layer
  ///
  /// In en, this message translates to:
  /// **'Topographic Map 1:25000'**
  String get topographicMap;

  /// Header for recent messages overlay on map in fullscreen mode
  ///
  /// In en, this message translates to:
  /// **'Recent Messages'**
  String get recentMessages;

  /// Button to add a new channel
  ///
  /// In en, this message translates to:
  /// **'Add Channel'**
  String get addChannel;

  /// Label for channel name field
  ///
  /// In en, this message translates to:
  /// **'Channel Name'**
  String get channelName;

  /// Hint for channel name field
  ///
  /// In en, this message translates to:
  /// **'e.g., Rescue Team Alpha'**
  String get channelNameHint;

  /// Label for channel secret field
  ///
  /// In en, this message translates to:
  /// **'Channel Secret'**
  String get channelSecret;

  /// Hint for channel secret field
  ///
  /// In en, this message translates to:
  /// **'Shared password for this channel'**
  String get channelSecretHint;

  /// Help text explaining channel secret
  ///
  /// In en, this message translates to:
  /// **'This secret must be shared with all team members who need access to this channel'**
  String get channelSecretHelp;

  /// Information banner explaining hash and private channel types
  ///
  /// In en, this message translates to:
  /// **'Hash channels (#team): Secret auto-generated from name. Same name = same channel across devices.\n\nPrivate channels: Use explicit secret. Only those with the secret can join.'**
  String get channelTypesInfo;

  /// Help text for hash channels (# prefix)
  ///
  /// In en, this message translates to:
  /// **'Hash channel: Secret will be auto-generated from the channel name. Anyone using the same name will join the same channel.'**
  String get hashChannelInfo;

  /// Validation error for empty channel name
  ///
  /// In en, this message translates to:
  /// **'Channel name is required'**
  String get channelNameRequired;

  /// Validation error for channel name too long
  ///
  /// In en, this message translates to:
  /// **'Channel name must be 31 characters or less'**
  String get channelNameTooLong;

  /// Validation error for empty channel secret
  ///
  /// In en, this message translates to:
  /// **'Channel secret is required'**
  String get channelSecretRequired;

  /// Validation error for channel secret too long
  ///
  /// In en, this message translates to:
  /// **'Channel secret must be 32 characters or less'**
  String get channelSecretTooLong;

  /// Validation error for non-ASCII characters
  ///
  /// In en, this message translates to:
  /// **'Only ASCII characters are allowed'**
  String get invalidAsciiCharacters;

  /// Success message after creating channel
  ///
  /// In en, this message translates to:
  /// **'Channel created successfully'**
  String get channelCreatedSuccessfully;

  /// Error message when channel creation fails
  ///
  /// In en, this message translates to:
  /// **'Failed to create channel: {error}'**
  String channelCreationFailed(String error);

  /// Delete channel button/menu item
  ///
  /// In en, this message translates to:
  /// **'Delete Channel'**
  String get deleteChannel;

  /// Confirmation dialog when deleting a channel
  ///
  /// In en, this message translates to:
  /// **'Are you sure you want to delete channel \"{channelName}\"? This action cannot be undone.'**
  String deleteChannelConfirmation(String channelName);

  /// Success message after deleting channel
  ///
  /// In en, this message translates to:
  /// **'Channel deleted successfully'**
  String get channelDeletedSuccessfully;

  /// Error message when channel deletion fails
  ///
  /// In en, this message translates to:
  /// **'Failed to delete channel: {error}'**
  String channelDeletionFailed(String error);

  /// Error when no channel slots available
  ///
  /// In en, this message translates to:
  /// **'All channel slots are in use (maximum 39 custom channels)'**
  String get allChannelSlotsInUse;

  /// Button text for creating a channel
  ///
  /// In en, this message translates to:
  /// **'Create Channel'**
  String get createChannel;

  /// Wizard back button text
  ///
  /// In en, this message translates to:
  /// **'Back'**
  String get wizardBack;

  /// Wizard skip button text
  ///
  /// In en, this message translates to:
  /// **'Skip'**
  String get wizardSkip;

  /// Wizard next button text
  ///
  /// In en, this message translates to:
  /// **'Next'**
  String get wizardNext;

  /// Wizard final button text to complete onboarding
  ///
  /// In en, this message translates to:
  /// **'Get Started'**
  String get wizardGetStarted;

  /// Welcome wizard first page title
  ///
  /// In en, this message translates to:
  /// **'Welcome to MeshCore SAR'**
  String get wizardWelcomeTitle;

  /// Welcome wizard first page description
  ///
  /// In en, this message translates to:
  /// **'A powerful off-grid communication tool for search and rescue operations. Connect with your team using mesh radio technology when traditional networks are unavailable.'**
  String get wizardWelcomeDescription;

  /// Wizard connecting page title
  ///
  /// In en, this message translates to:
  /// **'Connecting to Your Radio'**
  String get wizardConnectingTitle;

  /// Wizard connecting page description
  ///
  /// In en, this message translates to:
  /// **'Connect your smartphone to a MeshCore radio device via Bluetooth to start communicating off-grid.'**
  String get wizardConnectingDescription;

  /// Wizard connecting feature 1
  ///
  /// In en, this message translates to:
  /// **'Scan for nearby MeshCore devices'**
  String get wizardConnectingFeature1;

  /// Wizard connecting feature 2
  ///
  /// In en, this message translates to:
  /// **'Pair with your radio via Bluetooth'**
  String get wizardConnectingFeature2;

  /// Wizard connecting feature 3
  ///
  /// In en, this message translates to:
  /// **'Works completely offline - no internet required'**
  String get wizardConnectingFeature3;

  /// Wizard simple mode page title
  ///
  /// In en, this message translates to:
  /// **'Simple Mode'**
  String get wizardSimpleModeTitle;

  /// Wizard simple mode page description
  ///
  /// In en, this message translates to:
  /// **'New to mesh networking? Enable Simple Mode for a streamlined interface with essential features only.'**
  String get wizardSimpleModeDescription;

  /// Wizard simple mode feature 1
  ///
  /// In en, this message translates to:
  /// **'Beginner-friendly interface with core functions'**
  String get wizardSimpleModeFeature1;

  /// Wizard simple mode feature 2
  ///
  /// In en, this message translates to:
  /// **'Switch to Advanced Mode anytime in Settings'**
  String get wizardSimpleModeFeature2;

  /// Wizard channel page title
  ///
  /// In en, this message translates to:
  /// **'Channels'**
  String get wizardChannelTitle;

  /// Wizard channel page description
  ///
  /// In en, this message translates to:
  /// **'Broadcast messages to everyone on a channel, perfect for team-wide announcements and coordination.'**
  String get wizardChannelDescription;

  /// Wizard channel feature 1
  ///
  /// In en, this message translates to:
  /// **'Public Channel for general team communication'**
  String get wizardChannelFeature1;

  /// Wizard channel feature 2
  ///
  /// In en, this message translates to:
  /// **'Create custom channels for specific groups'**
  String get wizardChannelFeature2;

  /// Wizard channel feature 3
  ///
  /// In en, this message translates to:
  /// **'Messages are automatically relayed by the mesh'**
  String get wizardChannelFeature3;

  /// Wizard contacts page title
  ///
  /// In en, this message translates to:
  /// **'Contacts'**
  String get wizardContactsTitle;

  /// Wizard contacts page description
  ///
  /// In en, this message translates to:
  /// **'Your team members appear automatically as they join the mesh network. Send them direct messages or view their location.'**
  String get wizardContactsDescription;

  /// Wizard contacts feature 1
  ///
  /// In en, this message translates to:
  /// **'Contacts discovered automatically'**
  String get wizardContactsFeature1;

  /// Wizard contacts feature 2
  ///
  /// In en, this message translates to:
  /// **'Send private direct messages'**
  String get wizardContactsFeature2;

  /// Wizard contacts feature 3
  ///
  /// In en, this message translates to:
  /// **'View battery level and last seen time'**
  String get wizardContactsFeature3;

  /// Wizard map page title
  ///
  /// In en, this message translates to:
  /// **'Map & Location'**
  String get wizardMapTitle;

  /// Wizard map page description
  ///
  /// In en, this message translates to:
  /// **'Track your team in real-time and mark important locations for search and rescue operations.'**
  String get wizardMapDescription;

  /// Wizard map feature 1
  ///
  /// In en, this message translates to:
  /// **'SAR markers for found persons, fires, and staging areas'**
  String get wizardMapFeature1;

  /// Wizard map feature 2
  ///
  /// In en, this message translates to:
  /// **'Real-time GPS tracking of team members'**
  String get wizardMapFeature2;

  /// Wizard map feature 3
  ///
  /// In en, this message translates to:
  /// **'Download offline maps for remote areas'**
  String get wizardMapFeature3;

  /// Wizard map feature 4
  ///
  /// In en, this message translates to:
  /// **'Draw shapes and share tactical information'**
  String get wizardMapFeature4;

  /// Settings option to re-show welcome wizard
  ///
  /// In en, this message translates to:
  /// **'View Welcome Tutorial'**
  String get viewWelcomeTutorial;

  /// Destination option to send SAR marker to all team contacts
  ///
  /// In en, this message translates to:
  /// **'All Team Contacts'**
  String get allTeamContacts;

  /// Information about sending to all contacts
  ///
  /// In en, this message translates to:
  /// **'Direct messages with ACKs. Sent to {count} team members.'**
  String directMessagesInfo(int count);

  /// Success message after sending SAR marker to all contacts
  ///
  /// In en, this message translates to:
  /// **'SAR marker sent to {count} contacts'**
  String sarMarkerSentToContacts(int count);

  /// Message when there are no chat contacts to send to
  ///
  /// In en, this message translates to:
  /// **'No team contacts available'**
  String get noContactsAvailable;

  /// No description provided for @reply.
  ///
  /// In en, this message translates to:
  /// **'Reply'**
  String get reply;

  /// No description provided for @technicalDetails.
  ///
  /// In en, this message translates to:
  /// **'Technical details'**
  String get technicalDetails;

  /// No description provided for @messageTechnicalDetails.
  ///
  /// In en, this message translates to:
  /// **'Message technical details'**
  String get messageTechnicalDetails;

  /// No description provided for @linkQuality.
  ///
  /// In en, this message translates to:
  /// **'Link quality'**
  String get linkQuality;

  /// No description provided for @delivery.
  ///
  /// In en, this message translates to:
  /// **'Delivery'**
  String get delivery;

  /// No description provided for @status.
  ///
  /// In en, this message translates to:
  /// **'Status'**
  String get status;

  /// No description provided for @expectedAckTag.
  ///
  /// In en, this message translates to:
  /// **'Expected ACK tag'**
  String get expectedAckTag;

  /// No description provided for @roundTrip.
  ///
  /// In en, this message translates to:
  /// **'Round-trip'**
  String get roundTrip;

  /// No description provided for @retryAttempt.
  ///
  /// In en, this message translates to:
  /// **'Retry attempt'**
  String get retryAttempt;

  /// No description provided for @floodFallback.
  ///
  /// In en, this message translates to:
  /// **'Flood fallback'**
  String get floodFallback;

  /// No description provided for @identity.
  ///
  /// In en, this message translates to:
  /// **'Identity'**
  String get identity;

  /// No description provided for @messageId.
  ///
  /// In en, this message translates to:
  /// **'Message ID'**
  String get messageId;

  /// No description provided for @sender.
  ///
  /// In en, this message translates to:
  /// **'Sender'**
  String get sender;

  /// No description provided for @senderKey.
  ///
  /// In en, this message translates to:
  /// **'Sender key'**
  String get senderKey;

  /// No description provided for @recipient.
  ///
  /// In en, this message translates to:
  /// **'Recipient'**
  String get recipient;

  /// No description provided for @recipientKey.
  ///
  /// In en, this message translates to:
  /// **'Recipient key'**
  String get recipientKey;

  /// No description provided for @voice.
  ///
  /// In en, this message translates to:
  /// **'Voice'**
  String get voice;

  /// No description provided for @voiceId.
  ///
  /// In en, this message translates to:
  /// **'Voice ID'**
  String get voiceId;

  /// No description provided for @envelope.
  ///
  /// In en, this message translates to:
  /// **'Envelope'**
  String get envelope;

  /// No description provided for @sessionProgress.
  ///
  /// In en, this message translates to:
  /// **'Session progress'**
  String get sessionProgress;

  /// No description provided for @complete.
  ///
  /// In en, this message translates to:
  /// **'Complete'**
  String get complete;

  /// No description provided for @rawDump.
  ///
  /// In en, this message translates to:
  /// **'Raw dump'**
  String get rawDump;

  /// No description provided for @cannotRetryMissingRecipient.
  ///
  /// In en, this message translates to:
  /// **'Cannot retry: recipient information missing'**
  String get cannotRetryMissingRecipient;

  /// No description provided for @voiceUnavailable.
  ///
  /// In en, this message translates to:
  /// **'Voice unavailable right now'**
  String get voiceUnavailable;

  /// No description provided for @requestingVoice.
  ///
  /// In en, this message translates to:
  /// **'Requesting voice'**
  String get requestingVoice;
}

class _AppLocalizationsDelegate
    extends LocalizationsDelegate<AppLocalizations> {
  const _AppLocalizationsDelegate();

  @override
  Future<AppLocalizations> load(Locale locale) {
    return SynchronousFuture<AppLocalizations>(lookupAppLocalizations(locale));
  }

  @override
  bool isSupported(Locale locale) => <String>[
    'de',
    'el',
    'en',
    'es',
    'fr',
    'hr',
    'it',
    'sl',
    'zh',
  ].contains(locale.languageCode);

  @override
  bool shouldReload(_AppLocalizationsDelegate old) => false;
}

AppLocalizations lookupAppLocalizations(Locale locale) {
  // Lookup logic when only language code is specified.
  switch (locale.languageCode) {
    case 'de':
      return AppLocalizationsDe();
    case 'el':
      return AppLocalizationsEl();
    case 'en':
      return AppLocalizationsEn();
    case 'es':
      return AppLocalizationsEs();
    case 'fr':
      return AppLocalizationsFr();
    case 'hr':
      return AppLocalizationsHr();
    case 'it':
      return AppLocalizationsIt();
    case 'sl':
      return AppLocalizationsSl();
    case 'zh':
      return AppLocalizationsZh();
  }

  throw FlutterError(
    'AppLocalizations.delegate failed to load unsupported locale "$locale". This is likely '
    'an issue with the localizations generation tool. Please file an issue '
    'on GitHub with a reproducible sample app and the gen-l10n configuration '
    'that was used.',
  );
}
