// ignore: unused_import
import 'package:intl/intl.dart' as intl;
import 'app_localizations.dart';

// ignore_for_file: type=lint

/// The translations for French (`fr`).
class AppLocalizationsFr extends AppLocalizations {
  AppLocalizationsFr([String locale = 'fr']) : super(locale);

  @override
  String get appTitle => 'MeshCore Open';

  @override
  String get nav_contacts => 'Contacts';

  @override
  String get nav_channels => 'Canaux';

  @override
  String get nav_map => 'Carte';

  @override
  String get common_cancel => 'Annuler';

  @override
  String get common_ok => 'D\'accord';

  @override
  String get common_connect => 'Connecter';

  @override
  String get common_unknownDevice => 'Appareil inconnu';

  @override
  String get common_save => 'Enregistrer';

  @override
  String get common_delete => 'Supprimer';

  @override
  String get common_deleteAll => 'Tout supprimer';

  @override
  String get common_close => 'Fermer';

  @override
  String get common_done => 'Terminé';

  @override
  String get common_edit => 'Modifier';

  @override
  String get common_add => 'Ajouter';

  @override
  String get common_settings => 'Paramètres';

  @override
  String get common_disconnect => 'Déconnecter';

  @override
  String get common_connected => 'Connecté';

  @override
  String get common_disconnected => 'Déconnecté';

  @override
  String get common_create => 'Créer';

  @override
  String get common_continue => 'Continuer';

  @override
  String get common_share => 'Partager';

  @override
  String get common_copy => 'Copier';

  @override
  String get common_retry => 'Réessayer';

  @override
  String get common_hide => 'Masquer';

  @override
  String get common_remove => 'Supprimer';

  @override
  String get common_enable => 'Activer';

  @override
  String get common_disable => 'Désactiver';

  @override
  String get common_undo => 'Annuler';

  @override
  String get messageStatus_sent => 'Envoyé';

  @override
  String get messageStatus_delivered => 'Livré';

  @override
  String get messageStatus_pending => 'Envoi en cours';

  @override
  String get messageStatus_failed => 'Échec de l\'envoi';

  @override
  String get messageStatus_repeated => 'Reçu plusieurs fois';

  @override
  String get common_reboot => 'Redémarrer';

  @override
  String get common_loading => 'Chargement...';

  @override
  String get common_notAvailable => '—';

  @override
  String common_voltageValue(String volts) {
    return '$volts V';
  }

  @override
  String common_percentValue(int percent) {
    return '$percent%';
  }

  @override
  String get common_autoRefresh => 'Actualisation automatique';

  @override
  String get common_interval => 'Intervalle';

  @override
  String get scanner_title => 'MeshCore Open';

  @override
  String get connectionChoiceUsbLabel => 'USB';

  @override
  String get connectionChoiceBluetoothLabel => 'Bluetooth';

  @override
  String get connectionChoiceTcpLabel => 'TCP';

  @override
  String get tcpScreenTitle => 'Établir une connexion via TCP';

  @override
  String get tcpHostLabel => 'Adresse IP';

  @override
  String get tcpHostHint => '192.168.40.10';

  @override
  String get tcpPortLabel => 'Port';

  @override
  String get tcpPortHint => '5000';

  @override
  String get tcpStatus_notConnected =>
      'Entrez l\'adresse de destination et connectez-vous.';

  @override
  String tcpStatus_connectingTo(String endpoint) {
    return 'Connexion à $endpoint...';
  }

  @override
  String get tcpErrorHostRequired => 'Une adresse IP est obligatoire.';

  @override
  String get tcpErrorPortInvalid =>
      'La taille du port doit être comprise entre 1 et 65535.';

  @override
  String get tcpErrorUnsupported =>
      'Le protocole TCP n\'est pas pris en charge sur cette plateforme.';

  @override
  String get tcpErrorTimedOut => 'La connexion TCP a expiré.';

  @override
  String tcpConnectionFailed(String error) {
    return 'Échec de la connexion TCP : $error';
  }

  @override
  String get usbScreenTitle => 'Connectez via USB';

  @override
  String get usbScreenSubtitle =>
      'Sélectionnez un périphérique série détecté et connectez-vous directement à votre nœud MeshCore.';

  @override
  String get usbScreenStatus => 'Sélectionnez un périphérique USB';

  @override
  String get usbScreenNote =>
      'La communication série USB est active sur les appareils Android et les plateformes de bureau compatibles.';

  @override
  String get usbScreenEmptyState =>
      'Aucun périphérique USB n\'a été trouvé. Veuillez en brancher un et rafraîchir la page.';

  @override
  String get usbErrorPermissionDenied => 'L\'accès via USB a été refusé.';

  @override
  String get usbErrorDeviceMissing =>
      'Le périphérique USB sélectionné n\'est plus disponible.';

  @override
  String get usbErrorInvalidPort => 'Sélectionnez un périphérique USB valide.';

  @override
  String get usbErrorBusy =>
      'Une autre demande de connexion USB est déjà en cours.';

  @override
  String get usbErrorNotConnected => 'Aucun appareil USB n\'est connecté.';

  @override
  String get usbErrorOpenFailed =>
      'Impossible d\'ouvrir l\'appareil USB sélectionné.';

  @override
  String get usbErrorConnectFailed =>
      'Impossible de se connecter à l\'appareil USB sélectionné.';

  @override
  String get usbErrorUnsupported =>
      'La communication série USB n\'est pas prise en charge sur cette plateforme.';

  @override
  String get usbErrorAlreadyActive => 'Une connexion USB est déjà établie.';

  @override
  String get usbErrorNoDeviceSelected =>
      'Aucun appareil USB n\'a été sélectionné.';

  @override
  String get usbErrorPortClosed => 'La connexion USB n\'est pas établie.';

  @override
  String get usbErrorConnectTimedOut =>
      'La connexion a expiré. Assurez-vous que l\'appareil dispose du firmware USB Companion.';

  @override
  String get usbFallbackDeviceName =>
      'Dispositif de communication série sur le Web';

  @override
  String get usbStatus_notConnected => 'Sélectionnez un périphérique USB';

  @override
  String get usbStatus_connecting => 'Connexion au périphérique USB...';

  @override
  String get usbStatus_searching => 'Recherche de périphériques USB...';

  @override
  String usbConnectionFailed(String error) {
    return 'Échec de la connexion USB : $error';
  }

  @override
  String get scanner_scanning => 'Recherche de périphériques...';

  @override
  String get scanner_connecting => 'Connexion en cours...';

  @override
  String get scanner_disconnecting => 'Déconnexion...';

  @override
  String get scanner_notConnected => 'Non connecté';

  @override
  String scanner_connectedTo(String deviceName) {
    return 'Connecté à $deviceName';
  }

  @override
  String get scanner_searchingDevices => 'Recherche des appareils MeshCore...';

  @override
  String get scanner_tapToScan =>
      'Appuyez sur Scanner pour trouver les appareils MeshCore';

  @override
  String scanner_connectionFailed(String error) {
    return 'Échec de la connexion : $error';
  }

  @override
  String get scanner_stop => 'Arrêter';

  @override
  String get scanner_scan => 'Scanner';

  @override
  String get scanner_bluetoothOff => 'Le Bluetooth est désactivé.';

  @override
  String get scanner_bluetoothOffMessage =>
      'Veuillez activer le Bluetooth pour rechercher des appareils.';

  @override
  String get scanner_chromeRequired => 'Navigateur Chrome requis';

  @override
  String get scanner_chromeRequiredMessage =>
      'Cette application web nécessite Google Chrome ou un navigateur basé sur Chromium pour le support Bluetooth.';

  @override
  String get scanner_enableBluetooth => 'Activer le Bluetooth';

  @override
  String get scanner_bluetoothWebUnsupported =>
      'La fonctionnalité Bluetooth n\'est pas disponible dans le navigateur. Veuillez vous connecter via USB à la place.';

  @override
  String get device_quickSwitch => 'Basculement rapide';

  @override
  String get device_meshcore => 'MeshCore';

  @override
  String get settings_title => 'Paramètres';

  @override
  String get settings_deviceInfo => 'Informations du périphérique';

  @override
  String get settings_appSettings => 'Paramètres de l\'application';

  @override
  String get settings_appSettingsSubtitle =>
      'Notifications, messagerie et préférences de carte';

  @override
  String get settings_nodeSettings => 'Paramètres du nœud';

  @override
  String get settings_nodeName => 'Nom du nœud';

  @override
  String get settings_nodeNameNotSet => 'Non défini';

  @override
  String get settings_nodeNameHint => 'Entrer le nom du nœud';

  @override
  String get settings_nodeNameUpdated => 'Nom mis à jour';

  @override
  String get settings_radioSettings => 'Paramètres Radio';

  @override
  String get settings_radioSettingsSubtitle =>
      'Fréquence, puissance, facteur d\'espacement';

  @override
  String get settings_radioSettingsUpdated => 'Paramètres radio mis à jour';

  @override
  String get settings_regionSettings => 'Régions';

  @override
  String get settings_regionSettingsSubtitle => 'Gérer les régions stockées';

  @override
  String get settings_regionManagement_screenTitle => 'Gestion de région';

  @override
  String get settings_regionNameHint => 'Entrer le nom de la région';

  @override
  String get settings_regionAddRegion => 'Ajouter une région';

  @override
  String get settings_regionFetchRegions =>
      'Récupérer les régions à partir des répéteurs';

  @override
  String get settings_regionFetchRegionsFail =>
      'Aucune région n\'a été trouvée';

  @override
  String get settings_regionFetchRegionsAlreadyExists =>
      'Cette région a déjà été ajoutée';

  @override
  String get settings_regionName => 'Nom de la région';

  @override
  String get settings_regionDeleted => 'Région supprimée';

  @override
  String get settings_deleteRegion => 'Supprimer la région';

  @override
  String settings_deleteRegionConfirm(String region) {
    return 'Supprimez $region de la liste des régions ?';
  }

  @override
  String get settings_location => 'Emplacement';

  @override
  String get settings_locationSubtitle => 'Coordonnées GPS';

  @override
  String get settings_locationUpdated => 'Emplacement mis à jour';

  @override
  String get settings_locationBothRequired =>
      'Entrez la latitude et la longitude.';

  @override
  String get settings_locationInvalid => 'Latitude ou longitude invalide.';

  @override
  String get settings_locationGPSEnable => 'Activer le GPS';

  @override
  String get settings_locationGPSEnableSubtitle =>
      'Activer la mise à jour automatique de la localisation via GPS';

  @override
  String get settings_locationIntervalSec =>
      'Intervalle de mise à jour du GPS (secondes)';

  @override
  String get settings_locationIntervalInvalid =>
      'L\'intervalle doit être compris entre 60 et 86400 secondes.';

  @override
  String get settings_latitude => 'Latitude';

  @override
  String get settings_longitude => 'Longitude';

  @override
  String get settings_contactSettings => 'Paramètres de contact';

  @override
  String get settings_contactSettingsSubtitle =>
      'Paramètres pour l\'ajout de contacts';

  @override
  String get settings_privacyMode => 'Mode de confidentialité';

  @override
  String get settings_privacyModeSubtitle =>
      'Masquer le nom et la localisation dans les annonces';

  @override
  String get settings_privacyModeToggle =>
      'Activez le mode confidentialité pour masquer votre nom et votre localisation dans les annonces.';

  @override
  String get settings_privacyModeEnabled => 'Mode de confidentialité activé';

  @override
  String get settings_privacyModeDisabled =>
      'Mode de confidentialité désactivé';

  @override
  String get settings_privacy => 'Paramètres de confidentialité';

  @override
  String get settings_privacySubtitle => 'Contrôlez les informations partagées';

  @override
  String get settings_privacySettingsDescription =>
      'Choisissez les informations que votre appareil partage avec les autres.';

  @override
  String get settings_denyAll => 'Refuser tout';

  @override
  String get settings_allowByContact => 'Autoriser par drapeaux de contact';

  @override
  String get settings_allowAll => 'Autoriser tout';

  @override
  String get settings_telemetryBaseMode => 'Mode de base Télémétrie';

  @override
  String get settings_telemetryLocationMode =>
      'Mode de localisation de la télémétrie';

  @override
  String get settings_telemetryEnvironmentMode =>
      'Mode d\'environnement de la télémétrie';

  @override
  String get settings_advertLocation => 'Localisation de l\'annonce';

  @override
  String get settings_advertLocationSubtitle =>
      'Inclure la localisation dans l\'annonce';

  @override
  String get settings_autoZeroHopAdvertOnGpsUpdate =>
      'Annonce zéro saut automatique lors de la mise à jour GPS';

  @override
  String get settings_autoZeroHopAdvertOnGpsUpdateSubtitle =>
      'Lorsque la position GPS change, envoyer une annonce zéro saut (nécessite la position dans l\'annonce).';

  @override
  String get settings_multiAck => 'Plusieurs accusés de réception';

  @override
  String get settings_telemetryModeUpdated =>
      'Le mode télémétrie a été mis à jour';

  @override
  String get settings_actions => 'Actions';

  @override
  String get settings_deleteAllPaths => 'Supprimer tous les chemins';

  @override
  String get settings_deleteAllPathsSubtitle =>
      'Effacer toutes les données de chemin des contacts.';

  @override
  String get settings_sendAdvertisement => 'S\'annoncer';

  @override
  String get settings_sendAdvertisementSubtitle =>
      'Diffuser la présence maintenant';

  @override
  String get settings_advertisementSent => 'Annonce envoyée';

  @override
  String get settings_syncTime => 'Synchroniser l\'heure';

  @override
  String get settings_syncTimeSubtitle =>
      'Régler l\'heure de l\'appareil sur celle du téléphone.';

  @override
  String get settings_timeSynchronized => 'Heure synchronisée';

  @override
  String get settings_refreshContacts => 'Actualiser les contacts';

  @override
  String get settings_refreshContactsSubtitle =>
      'Recharger la liste des contacts depuis l\'appareil';

  @override
  String get settings_rebootDevice => 'Redémarrer l\'appareil';

  @override
  String get settings_rebootDeviceSubtitle => 'Redémarrer l\'appareil MeshCore';

  @override
  String get settings_rebootDeviceConfirm =>
      'Êtes-vous sûr de vouloir redémarrer l\'appareil ? Vous serez déconnecté.';

  @override
  String get settings_debug => 'Débogage';

  @override
  String get settings_companionDebugLog => 'Journal de débogage associé';

  @override
  String get settings_companionDebugLogSubtitle =>
      'Commandes, réponses et données brutes pour les protocoles BLE/TCP/USB';

  @override
  String get settings_appDebugLog => 'Journal de débogage de l\'application';

  @override
  String get settings_appDebugLogSubtitle =>
      'Messages de débogage de l\'application';

  @override
  String get settings_about => 'À propos';

  @override
  String settings_aboutVersion(String version) {
    return 'MeshCore Open v$version';
  }

  @override
  String get settings_aboutLegalese => 'Projet open source MeshCore 2026';

  @override
  String get settings_aboutDescription =>
      'Client Flutter open source pour les appareils de réseau maillé LoRa MeshCore.';

  @override
  String get settings_aboutOpenMeteoAttribution =>
      'Données d\'élévation LOS : Open-Meteo (CC BY 4.0)';

  @override
  String get settings_infoName => 'Nom';

  @override
  String get settings_infoId => 'ID';

  @override
  String get settings_infoStatus => 'État';

  @override
  String get settings_infoBattery => 'Batterie';

  @override
  String get settings_infoPublicKey => 'Clé publique';

  @override
  String get settings_infoContactsCount => 'Nombre de contacts';

  @override
  String get settings_infoChannelCount => 'Nombre de canaux';

  @override
  String get settings_infoHardware => 'Matériel';

  @override
  String get settings_infoFirmware => 'Firmware';

  @override
  String get settings_presets => 'Préréglages';

  @override
  String get settings_frequency => 'Fréquence (MHz)';

  @override
  String get settings_frequencyHelper => '300,0 - 2 500,0';

  @override
  String get settings_frequencyInvalid => 'Fréquence invalide (300-2500 MHz)';

  @override
  String get settings_bandwidth => 'Bande passante';

  @override
  String get settings_spreadingFactor => 'Facteur d\'étalement (SF)';

  @override
  String get settings_codingRate => 'Taux de codage (CR)';

  @override
  String get settings_txPower => 'Puissance TX (dBm)';

  @override
  String get settings_txPowerHelper => '0 - 22';

  @override
  String get settings_txPowerInvalid => 'Puissance TX invalide (0-22 dBm)';

  @override
  String get settings_clientRepeat => 'Répétition hors réseau';

  @override
  String get settings_clientRepeatSubtitle =>
      'Permettre à cet appareil de relayer les paquets du maillage pour les autres.';

  @override
  String get settings_clientRepeatFreqWarning =>
      'Pour les transmissions hors réseau, il est nécessaire d\'utiliser les fréquences de 433, 869 ou 918 MHz.';

  @override
  String settings_error(String message) {
    return 'Erreur : $message';
  }

  @override
  String get appSettings_title => 'Paramètres de l\'application';

  @override
  String get appSettings_appearance => 'Apparence';

  @override
  String get appSettings_theme => 'Thème';

  @override
  String get appSettings_themeSystem => 'Défaut système';

  @override
  String get appSettings_themeLight => 'Clair';

  @override
  String get appSettings_themeDark => 'Sombre';

  @override
  String get appSettings_language => 'Langue';

  @override
  String get appSettings_languageSystem => 'Par défaut du système';

  @override
  String get appSettings_languageEn => 'Anglais';

  @override
  String get appSettings_languageFr => 'Français';

  @override
  String get appSettings_languageEs => 'Espagnol';

  @override
  String get appSettings_languageDe => 'Allemand';

  @override
  String get appSettings_languagePl => 'Polonais';

  @override
  String get appSettings_languageSl => 'Slovène';

  @override
  String get appSettings_languagePt => 'Portugais';

  @override
  String get appSettings_languageIt => 'Italien';

  @override
  String get appSettings_languageZh => 'Chinois';

  @override
  String get appSettings_languageSv => 'Suédois';

  @override
  String get appSettings_languageNl => 'Néerlandais';

  @override
  String get appSettings_languageSk => 'Slovaque';

  @override
  String get appSettings_languageBg => 'Bulgare';

  @override
  String get appSettings_languageRu => 'Russe';

  @override
  String get appSettings_languageUk => 'Ukrainien';

  @override
  String get repeater_pathHashModeOption0 => '0 - 1 octet';

  @override
  String get repeater_pathHashModeOption1 => '1 à 2 octets';

  @override
  String get repeater_pathHashModeOption2 => '2 à 3 octets';

  @override
  String get repeater_pathHashModeOption3 => '3 à 4 octets';

  @override
  String get appSettings_enableMessageTracing =>
      'Activer le traçage des messages';

  @override
  String get appSettings_enableMessageTracingSubtitle =>
      'Afficher les métadonnées détaillées de routage et de synchronisation des messages';

  @override
  String get appSettings_notifications => 'Notifications';

  @override
  String get appSettings_enableNotifications => 'Activer les notifications';

  @override
  String get appSettings_enableNotificationsSubtitle =>
      'Recevoir des notifications pour les messages et les annonces';

  @override
  String get appSettings_notificationPermissionDenied =>
      'Permission de notification refusée';

  @override
  String get appSettings_notificationsEnabled => 'Notifications activées';

  @override
  String get appSettings_notificationsDisabled => 'Notifications désactivées';

  @override
  String get appSettings_messageNotifications => 'Notifications de messages';

  @override
  String get appSettings_messageNotificationsSubtitle =>
      'Afficher une notification lors de la réception de nouveaux messages';

  @override
  String get appSettings_channelMessageNotifications =>
      'Notifications des messages de canal';

  @override
  String get appSettings_channelMessageNotificationsSubtitle =>
      'Afficher une notification lors de la réception des messages de canal';

  @override
  String get appSettings_advertisementNotifications =>
      'Notifications d\'annonces';

  @override
  String get appSettings_advertisementNotificationsSubtitle =>
      'Afficher une notification lors de la découverte de nouveaux nœuds';

  @override
  String get appSettings_messaging => 'Messagerie';

  @override
  String get appSettings_clearPathOnMaxRetry =>
      'Effacer le chemin après le nombre maximal de tentatives';

  @override
  String get appSettings_clearPathOnMaxRetrySubtitle =>
      'Réinitialiser le chemin de contact après 5 tentatives d\'envoi infructueuses';

  @override
  String get appSettings_pathsWillBeCleared =>
      'Les chemins seront effacés après 5 échecs.';

  @override
  String get appSettings_pathsWillNotBeCleared =>
      'Les chemins ne seront pas effacés automatiquement.';

  @override
  String get appSettings_autoRouteRotation => 'Rotation automatique du routage';

  @override
  String get appSettings_autoRouteRotationSubtitle =>
      'Alterner entre les meilleurs chemins et le mode flood';

  @override
  String get appSettings_autoRouteRotationEnabled =>
      'Rotation automatique du routage activée';

  @override
  String get appSettings_autoRouteRotationDisabled =>
      'Rotation automatique du routage désactivée';

  @override
  String get appSettings_maxRouteWeight => 'Poids maximal du chemin';

  @override
  String get appSettings_maxRouteWeightSubtitle =>
      'Poids maximal qu\'un chemin peut accumuler grâce aux livraisons réussies.';

  @override
  String get appSettings_initialRouteWeight => 'Poids initial de l\'itinéraire';

  @override
  String get appSettings_initialRouteWeightSubtitle =>
      'Poids de départ pour les nouveaux chemins découverts';

  @override
  String get appSettings_routeWeightSuccessIncrement =>
      'Incrément du poids de succès';

  @override
  String get appSettings_routeWeightSuccessIncrementSubtitle =>
      'Poids ajouté à un chemin après une livraison réussie.';

  @override
  String get appSettings_routeWeightFailureDecrement =>
      'Décrément du poids d\'échec';

  @override
  String get appSettings_routeWeightFailureDecrementSubtitle =>
      'Poids retiré d\'un chemin après une tentative de livraison infructueuse.';

  @override
  String get appSettings_maxMessageRetries =>
      'Nombre maximal de tentatives d\'envoi';

  @override
  String get appSettings_maxMessageRetriesSubtitle =>
      'Nombre de tentatives avant de marquer un message comme ayant échoué.';

  @override
  String get appSettings_battery => 'Batterie';

  @override
  String get appSettings_batteryChemistry => 'Chimie de la batterie';

  @override
  String appSettings_batteryChemistryPerDevice(String deviceName) {
    return 'Définir par appareil ($deviceName)';
  }

  @override
  String get appSettings_batteryChemistryConnectFirst =>
      'Connectez un appareil pour choisir';

  @override
  String get appSettings_batteryNmc => '18650 NMC (3,0-4,2V)';

  @override
  String get appSettings_batteryLifepo4 => 'LiFePO4 (2,6-3,65V)';

  @override
  String get appSettings_batteryLipo => 'LiPo (3,0-4,2V)';

  @override
  String get appSettings_batteryLipoHv => 'Tension élevée LiPo (3,0-4,35 V)';

  @override
  String get appSettings_mapDisplay => 'Affichage de la carte';

  @override
  String get appSettings_showRepeaters => 'Afficher les répéteurs';

  @override
  String get appSettings_showRepeatersSubtitle =>
      'Afficher les nœuds répéteurs sur la carte';

  @override
  String get appSettings_showChatNodes => 'Afficher les nœuds de discussion';

  @override
  String get appSettings_showChatNodesSubtitle =>
      'Afficher les nœuds de chat sur la carte';

  @override
  String get appSettings_showOtherNodes => 'Afficher d\'autres nœuds';

  @override
  String get appSettings_showOtherNodesSubtitle =>
      'Afficher d\'autres types de nœuds sur la carte';

  @override
  String get appSettings_timeFilter => 'Filtre du temps';

  @override
  String get appSettings_timeFilterShowAll => 'Afficher tous les nœuds';

  @override
  String appSettings_timeFilterShowLast(int hours) {
    return 'Afficher les nœuds des $hours dernières heures';
  }

  @override
  String get appSettings_mapTimeFilter => 'Filtre temporel de la carte';

  @override
  String get appSettings_showNodesDiscoveredWithin =>
      'Afficher les nœuds découverts au cours de :';

  @override
  String get appSettings_allTime => 'Tout le temps';

  @override
  String get appSettings_lastHour => 'Dernière heure';

  @override
  String get appSettings_last6Hours => 'Dernières 6 heures';

  @override
  String get appSettings_last24Hours => 'Dernières 24 heures';

  @override
  String get appSettings_lastWeek => 'La semaine dernière';

  @override
  String get appSettings_rasterTileSource => 'Source de tuiles raster';

  @override
  String get appSettings_stadiaEndpoint => 'Point de terminaison Stadia';

  @override
  String get appSettings_stadiaApiKey => 'Clé API Stadia';

  @override
  String get appSettings_stadiaApiKeyRequired =>
      'Requis pour l’utilisation de Stadia Maps';

  @override
  String appSettings_stadiaApiKeyConfigured(String maskedKey) {
    return 'Configuré : $maskedKey';
  }

  @override
  String get appSettings_stadiaApiKeyDialogDescription =>
      'Entrez votre clé API Stadia Maps. Cette application l’utilise pour les requêtes de tuiles raster.';

  @override
  String get appSettings_offlineMapCache => 'Cache de carte hors ligne';

  @override
  String get appSettings_unitsTitle => 'Unités';

  @override
  String get appSettings_unitsMetric => 'Métrique (m/km)';

  @override
  String get appSettings_unitsImperial => 'Impérial (ft / mi)';

  @override
  String get appSettings_noAreaSelected => 'Aucune zone sélectionnée';

  @override
  String appSettings_areaSelectedZoom(int minZoom, int maxZoom) {
    return 'Zone sélectionnée (zoom $minZoom-$maxZoom)';
  }

  @override
  String get appSettings_debugCard => 'Débogage';

  @override
  String get appSettings_appDebugLogging =>
      'Journalisation des débogages de l\'application';

  @override
  String get appSettings_appDebugLoggingSubtitle =>
      'Journaliser les messages de débogage de l\'application pour le dépannage.';

  @override
  String get appSettings_appDebugLoggingEnabled =>
      'Journalisation de débogage de l\'application activée';

  @override
  String get appSettings_appDebugLoggingDisabled =>
      'Journalisation de débogage de l\'application désactivée';

  @override
  String get contacts_title => 'Contacts';

  @override
  String get contacts_noContacts => 'Aucun contact trouvé.';

  @override
  String get contacts_contactsWillAppear =>
      'Les contacts apparaîtront lorsque les appareils diffuseront leur annonce.';

  @override
  String get contacts_unread => 'Non lu';

  @override
  String get contacts_searchContactsNoNumber => 'Rechercher des contacts...';

  @override
  String contacts_searchContacts(int number, String str) {
    return 'Rechercher $number$str contacts...';
  }

  @override
  String contacts_searchFavorites(int number, String str) {
    return 'Rechercher $number$str Favoris...';
  }

  @override
  String contacts_searchUsers(int number, String str) {
    return 'Rechercher $number$str utilisateurs...';
  }

  @override
  String contacts_searchRepeaters(int number, String str) {
    return 'Rechercher $number$str Répéteurs...';
  }

  @override
  String contacts_searchRoomServers(int number, String str) {
    return 'Rechercher $number$str room server...';
  }

  @override
  String get contacts_noUnreadContacts => 'Aucun contact non lu';

  @override
  String get contacts_noContactsFound => 'Aucun contact ou groupe trouvé.';

  @override
  String get contacts_deleteContact => 'Supprimer le contact';

  @override
  String contacts_removeConfirm(String contactName) {
    return 'Supprimer $contactName des contacts ?';
  }

  @override
  String get contacts_manageRepeater => 'Gérer le répéteur';

  @override
  String get contacts_manageRoom => 'Gérer le room server';

  @override
  String get contacts_roomLogin => 'Connexion au room server';

  @override
  String get contacts_openChat => 'Ouvrir le chat';

  @override
  String get contacts_editGroup => 'Modifier le groupe';

  @override
  String get contacts_deleteGroup => 'Supprimer le groupe';

  @override
  String contacts_deleteGroupConfirm(String groupName) {
    return 'Supprimer le groupe \"$groupName\" ?';
  }

  @override
  String get contacts_newGroup => 'Nouveau groupe';

  @override
  String get contacts_moreOptions => 'Plus d\'options';

  @override
  String get contacts_searchOpen => 'Rechercher des contacts';

  @override
  String get contacts_searchClose => 'Recherche avancée';

  @override
  String get contacts_groupName => 'Nom du groupe';

  @override
  String get contacts_groupNameRequired => 'Le nom du groupe est obligatoire.';

  @override
  String get contacts_groupNameReserved => 'Ce nom de groupe est réservé';

  @override
  String contacts_groupAlreadyExists(String name) {
    return 'Le groupe \"$name\" existe déjà.';
  }

  @override
  String get contacts_filterContacts => 'Filtrer les contacts...';

  @override
  String get contacts_noContactsMatchFilter =>
      'Aucun contact ne correspond à votre filtre.';

  @override
  String get contacts_noMembers => 'Aucun membre';

  @override
  String get contacts_lastSeenNow => 'À l\'instant';

  @override
  String contacts_lastSeenMinsAgo(int minutes) {
    return '~ $minutes min';
  }

  @override
  String get contacts_lastSeenHourAgo => '~ 1 heure';

  @override
  String contacts_lastSeenHoursAgo(int hours) {
    return '~ $hours heures';
  }

  @override
  String get contacts_lastSeenDayAgo => '~ 1 jour';

  @override
  String contacts_lastSeenDaysAgo(int days) {
    return '~ $days jours';
  }

  @override
  String get contact_info => 'Informations de contact';

  @override
  String get contact_settings => 'Paramètres de contact';

  @override
  String get contact_telemetry => 'Télémétrie';

  @override
  String get contact_lastSeen => 'Vu pour la dernière fois';

  @override
  String get contact_clearChat => 'Effacer la conversation';

  @override
  String get contact_teleBase => 'Base de télémétrie';

  @override
  String get contact_teleBaseSubtitle =>
      'Autoriser le partage du niveau de batterie et de la télémétrie de base';

  @override
  String get contact_teleLoc => 'Emplacement de télémétrie';

  @override
  String get contact_teleLocSubtitle =>
      'Autoriser le partage des données de localisation';

  @override
  String get contact_teleEnv => 'Environnement Télémétrie';

  @override
  String get contact_teleEnvSubtitle =>
      'Autoriser le partage des données des capteurs d\'environnement';

  @override
  String get channels_title => 'Canaux';

  @override
  String get channels_noChannelsConfigured => 'Aucun canal configuré';

  @override
  String get channels_addPublicChannel => 'Ajouter un canal public';

  @override
  String get channels_searchChannels => 'Rechercher des canaux...';

  @override
  String get channels_noChannelsFound => 'Aucun canal trouvé';

  @override
  String channels_channelIndex(int index) {
    return 'Canal $index';
  }

  @override
  String get channels_public => 'Public';

  @override
  String channels_via(String path) {
    return 'via $path';
  }

  @override
  String get channels_private => 'Privé';

  @override
  String get channels_editChannel => 'Modifier le canal';

  @override
  String get channels_muteChannel => 'Désactiver les notifications du canal';

  @override
  String get channels_unmuteChannel => 'Réactiver les notifications du canal';

  @override
  String get channels_deleteChannel => 'Supprimer le canal';

  @override
  String channels_deleteChannelConfirm(String name) {
    return 'Supprimer \"$name\" ? Cette action est irréversible.';
  }

  @override
  String channels_channelDeleteFailed(String name) {
    return 'Échec de la suppression du canal \"$name\"';
  }

  @override
  String channels_channelDeleted(String name) {
    return 'Canal \"$name\" supprimé';
  }

  @override
  String get channels_addChannel => 'Ajouter un canal';

  @override
  String get channels_channelIndexLabel => 'Index du canal';

  @override
  String get channels_channelName => 'Nom du canal';

  @override
  String get channels_usePublicChannel => 'Utiliser le canal public';

  @override
  String get channels_standardPublicPsk => 'PSK public standard';

  @override
  String get channels_pskHex => 'PSK (Hexadécimal)';

  @override
  String get channels_generateRandomPsk => 'Générer une PSK aléatoire';

  @override
  String get channels_enterChannelName => 'Veuillez entrer un nom de canal';

  @override
  String get channels_pskMustBe32Hex =>
      'La PSK doit contenir 32 caractères hexadécimaux.';

  @override
  String channels_channelAdded(String name) {
    return 'Le canal \"$name\" a été ajouté';
  }

  @override
  String channels_editChannelTitle(int index) {
    return 'Modifier le Canal $index';
  }

  @override
  String get channels_smazCompression => 'Compression SMAZ';

  @override
  String get channels_cyr2latCompression => 'Compression Cyr2Lat';

  @override
  String get channels_cyr2latCompressionDscr =>
      'Remplace certains caractères cyrilliques par des caractères latins lors de l\'envoi.';

  @override
  String get channels_cyr2latSettingsHeading => 'Paramètres Cyr2Lat';

  @override
  String get channels_cyr2latSettingsSubheading => 'Liste des remplacements';

  @override
  String get channels_cyr2latSettingsDscr =>
      'Modifier la configuration JSON des remplacements de caractères';

  @override
  String get channels_cyr2latSettingsDialogHint =>
      'Tableau de remplacement JSON';

  @override
  String channels_cyr2latSettingsDialogWrongJSON(Object error) {
    return 'JSON incorrect : $error';
  }

  @override
  String channels_channelUpdated(String name) {
    return 'Le canal \"$name\" a été mis à jour';
  }

  @override
  String get settings_cyr2latProfileAdd => 'Ajouter un profil Cyr2Lat';

  @override
  String get settings_cyr2latProfileName => 'Nom du profil';

  @override
  String get settings_cyr2latProfileNameEmpty =>
      'Le nom du profil ne peut pas être vide';

  @override
  String get settings_cyr2latProfileAdded => 'Profil ajouté avec succès';

  @override
  String get settings_cyr2latProfileUpdated => 'Profil mis à jour avec succès';

  @override
  String get settings_cyr2latProfileEdit => 'Modifier le profil Cyr2Lat';

  @override
  String get settings_cyr2latProfileDelete => 'Supprimer le profil Cyr2Lat';

  @override
  String get settings_cyr2latProfileDeleted => 'Profil supprimé avec succès';

  @override
  String settings_cyr2latProfileDeleteDscr(String name) {
    return 'Êtes-vous sûr de vouloir supprimer le profil \"$name\" ?';
  }

  @override
  String get channels_publicChannelAdded => 'Canal public ajouté';

  @override
  String get channels_sortBy => 'Trier par';

  @override
  String get channels_sortManual => 'Manuel';

  @override
  String get channels_sortAZ => 'A à Z';

  @override
  String get channels_sortLatestMessages => 'Derniers messages';

  @override
  String get channels_sortUnread => 'Non lus';

  @override
  String get channels_createPrivateChannel => 'Créer un Canal Privé';

  @override
  String get channels_createPrivateChannelDesc =>
      'Sécurisé avec une clé secrète.';

  @override
  String get channels_joinPrivateChannel => 'Rejoindre un Canal Privé';

  @override
  String get channels_joinPrivateChannelDesc =>
      'Entrer manuellement une clé secrète.';

  @override
  String get channels_joinPublicChannel => 'Rejoindre le canal public';

  @override
  String get channels_joinPublicChannelDesc =>
      'Tout le monde peut rejoindre ce canal.';

  @override
  String get channels_joinHashtagChannel => 'Rejoindre un Canal Hashtag';

  @override
  String get channels_joinHashtagChannelDesc =>
      'N\'importe qui peut rejoindre les canaux #hashtag.';

  @override
  String get channels_scanQrCode => 'Scanner un QR code';

  @override
  String get channels_scanQrCodeComingSoon => 'Bientôt disponible';

  @override
  String get channels_enterHashtag => 'Entrez le hashtag';

  @override
  String get channels_hashtagHint => 'ex. #equipe';

  @override
  String channels_regionSetTo(String region) {
    return 'Région : $region';
  }

  @override
  String get channels_regionNotSet => 'Région : aucune';

  @override
  String get channels_regionSelect_Title => 'Choisissez une région';

  @override
  String get channels_clearRegion => 'Zone dégagée';

  @override
  String get chat_noMessages => 'Aucun message pour le moment';

  @override
  String get chat_sendMessage => 'Envoyer un message';

  @override
  String chat_sendMessageTo(String contactName) {
    return 'Envoyer un message à $contactName';
  }

  @override
  String get chat_sendMessageToStart => 'Envoyer un message pour commencer';

  @override
  String get chat_originalMessageNotFound => 'Message d\'origine non trouvé';

  @override
  String chat_replyingTo(String name) {
    return 'Répondre à $name';
  }

  @override
  String chat_replyTo(String name) {
    return 'Répondre à $name';
  }

  @override
  String get chat_location => 'Emplacement';

  @override
  String get chat_typeMessage => 'Saisir un message...';

  @override
  String chat_messageTooLong(int maxBytes) {
    return 'Message trop long (max $maxBytes octets).';
  }

  @override
  String get chat_messageCopied => 'Message copié';

  @override
  String get chat_messageDeleted => 'Message supprimé';

  @override
  String get chat_retryingMessage => 'Nouvelle tentative d\'envoi du message';

  @override
  String chat_retryCount(int current, int max) {
    return 'Essai $current/$max';
  }

  @override
  String get chat_sendGif => 'Envoyer un GIF';

  @override
  String get chat_sendImage => 'Envoyer l\'image';

  @override
  String get chat_imagePickFailed => 'Je n\'ai pas pu ouvrir cette image';

  @override
  String get chat_receivedGif => 'Reçu un GIF';

  @override
  String get chat_reply => 'Répondre';

  @override
  String get chat_addReaction => 'Ajouter une réaction';

  @override
  String get chat_me => 'Moi';

  @override
  String get emojiCategorySmileys => 'Émojis';

  @override
  String get emojiCategoryGestures => 'Gestes';

  @override
  String get emojiCategoryHearts => 'Cœurs';

  @override
  String get emojiCategoryObjects => 'Objets';

  @override
  String get gifPicker_title => 'Choisir un GIF';

  @override
  String get gifPicker_searchHint => 'Rechercher des GIF...';

  @override
  String get gifPicker_poweredBy => 'Propulsé par GIPHY';

  @override
  String get gifPicker_noGifsFound => 'Aucun GIF trouvé';

  @override
  String get gifPicker_failedLoad => 'Impossible de charger les GIFs';

  @override
  String get gifPicker_failedSearch => 'Recherche de GIFs échouée';

  @override
  String get gifPicker_noInternet => 'Aucune connexion internet';

  @override
  String get debugLog_appTitle => 'Journal de débogage de l\'application';

  @override
  String get debugLog_bleTitle => 'Journal de débogage BLE';

  @override
  String get debugLog_copyLog => 'Copier le journal';

  @override
  String get debugLog_clearLog => 'Effacer le journal';

  @override
  String get debugLog_copied => 'Journal de débogage copié';

  @override
  String get debugLog_bleCopied => 'Journal BLE copié';

  @override
  String get debugLog_noEntries => 'Aucun journal de débogage pour le moment.';

  @override
  String get debugLog_enableInSettings =>
      'Activer le débogage de l\'application dans les paramètres';

  @override
  String get debugLog_frames => 'Cadres';

  @override
  String get debugLog_rawLogRx => 'Enregistrement brut - RX';

  @override
  String get debugLog_noBleActivity =>
      'Pas d\'activité BLE enregistrée pour le moment.';

  @override
  String debugFrame_length(int count) {
    return 'Longueur du cadre : $count octets';
  }

  @override
  String debugFrame_command(String value) {
    return 'Commande : 0x$value';
  }

  @override
  String get debugFrame_textMessageHeader => 'Message :';

  @override
  String debugFrame_destinationPubKey(String pubKey) {
    return '- Clé publique de destination : $pubKey';
  }

  @override
  String debugFrame_timestamp(int timestamp) {
    return '- Timestamp : $timestamp';
  }

  @override
  String debugFrame_flags(String value) {
    return '- Indicateurs : 0x$value';
  }

  @override
  String debugFrame_textType(int type, String label) {
    return '- Type de texte : $type ($label)';
  }

  @override
  String get debugFrame_textTypeCli => 'CLI';

  @override
  String get debugFrame_textTypePlain => 'Texte brut';

  @override
  String debugFrame_text(String text) {
    return '- Texte : \"$text\"';
  }

  @override
  String get debugFrame_hexDump => 'Dump hexadécimal :';

  @override
  String chat_hopsCount(int count) {
    String _temp0 = intl.Intl.pluralLogic(
      count,
      locale: localeName,
      other: 'sauts',
      one: 'saut',
    );
    return '$count $_temp0';
  }

  @override
  String get chat_removePath => 'Supprimer le chemin';

  @override
  String get chat_noPathHistoryYet =>
      'Aucun historique de parcours disponible.\nEnvoyez un message pour découvrir les parcours.';

  @override
  String get chat_pathCleared =>
      'Chemin effacé. Le prochain message redécouvrira la route.';

  @override
  String get chat_fullPath => 'Chemin complet';

  @override
  String get routing_title => 'Routage';

  @override
  String get routing_modeAuto => 'Auto';

  @override
  String get routing_modeFlood => 'Flood';

  @override
  String get routing_modeManual => 'Manuel';

  @override
  String get routing_modeAutoHint =>
      'Sélectionne automatiquement le meilleur chemin connu, et utilise le flood si aucun chemin n\'est connu.';

  @override
  String get routing_modeFloodHint =>
      'Diffusion via tous les répéteurs. La méthode la plus fiable, mais qui utilise plus de temps d\'antenne.';

  @override
  String get routing_modeManualHint =>
      'Envoie toujours selon le chemin exact que vous avez défini.';

  @override
  String get routing_currentRoute => 'Route actuelle';

  @override
  String get routing_directNoHops => 'Direct — sans relais';

  @override
  String get routing_noPathYet =>
      'Aucun chemin pour le moment. Le prochain message passera en flood jusqu\'à ce qu\'une route soit découverte.';

  @override
  String get routing_floodBroadcast => 'Diffusion via tous les répéteurs';

  @override
  String get routing_editPath => 'Modifier le chemin';

  @override
  String get routing_forgetPath => 'Oublier le chemin';

  @override
  String get routing_knownPaths => 'Chemins connus';

  @override
  String get routing_knownPathsHint => 'Touchez un chemin pour l\'utiliser.';

  @override
  String get routing_inUse => 'En cours d\'utilisation';

  @override
  String get routing_qualityStrong => 'Premier saut fort';

  @override
  String get routing_qualityGood => 'Premier saut correct';

  @override
  String get routing_qualityFair => 'Premier saut moyen';

  @override
  String get routing_qualityWorked => 'A déjà fonctionné';

  @override
  String get routing_qualityFlood => 'Entendu via flood';

  @override
  String get routing_qualityUntested => 'Non testé';

  @override
  String routing_lastWorked(String when) {
    return 'a fonctionné $when';
  }

  @override
  String get routing_neverWorked => 'jamais confirmé';

  @override
  String routing_deliveryCounts(int successes, int failures) {
    return '$successes livrés, $failures échoués';
  }

  @override
  String get routing_floodDelivery => 'Livraison flood';

  @override
  String get pathEditor_title => 'Créer un chemin';

  @override
  String pathEditor_hopCounter(int count) {
    return '$count sur 64 sauts';
  }

  @override
  String get pathEditor_noHops =>
      'Aucun saut pour le moment. Touchez les répéteurs ci-dessous pour les ajouter dans l\'ordre, ou enregistrez sans saut pour envoyer directement.';

  @override
  String get pathEditor_addHops => 'Ajouter les sauts dans l\'ordre';

  @override
  String get pathEditor_searchRepeaters => 'Rechercher des répétiteurs';

  @override
  String get pathEditor_advancedHex => 'Avancé : chemin hexadécimal brut';

  @override
  String get pathEditor_hexLabel => 'Préfixes hexadécimaux';

  @override
  String get pathEditor_hexHelper =>
      'Deux caractères hexadécimaux par saut, séparés par des virgules.';

  @override
  String pathEditor_invalidTokens(String tokens) {
    return 'Invalide : $tokens';
  }

  @override
  String get pathEditor_tooManyHops => 'Maximum 64 sauts';

  @override
  String get pathEditor_usePath => 'Utiliser ce chemin';

  @override
  String get pathEditor_removeHop => 'Supprimer le saut';

  @override
  String get pathEditor_unknownHop => 'Répéteur non identifié';

  @override
  String get chat_pathSavedLocally =>
      'Sauvegardé localement. Connectez-vous pour synchroniser.';

  @override
  String get chat_pathDeviceConfirmed => 'Appareil confirmé.';

  @override
  String get chat_pathDeviceNotConfirmed =>
      'L\'appareil n\'a pas encore été confirmé.';

  @override
  String get chat_type => 'Type';

  @override
  String get chat_path => 'Chemin';

  @override
  String get chat_publicKey => 'Clé publique';

  @override
  String get chat_compressOutgoingMessages =>
      'Compresser les messages sortants';

  @override
  String get chat_floodForced => 'Flood (forcé)';

  @override
  String get chat_directForced => 'Direct (forcé)';

  @override
  String chat_hopsForced(int count) {
    return '$count sauts (forcés)';
  }

  @override
  String get chat_floodAuto => 'Flood (auto)';

  @override
  String get chat_direct => 'Direct';

  @override
  String get chat_poiShared => 'Point d\'intérêt partagé';

  @override
  String chat_unread(int count) {
    return 'Non lu : $count';
  }

  @override
  String get chat_markAsUnread => 'Signaler comme non lu';

  @override
  String get chat_newMessages => 'Nouveaux messages';

  @override
  String get chat_openLink => 'Ouvrir le lien ?';

  @override
  String get chat_openLinkConfirmation =>
      'Voulez-vous ouvrir ce lien dans votre navigateur ?';

  @override
  String get chat_open => 'Ouvrir';

  @override
  String chat_couldNotOpenLink(String url) {
    return 'Impossible d\'ouvrir le lien : $url';
  }

  @override
  String get chat_invalidLink => 'Format de lien invalide';

  @override
  String get map_title => 'Carte des nœuds';

  @override
  String get map_searchHint => 'Rechercher par nom ou ID de nœud';

  @override
  String get map_activity => 'Activité';

  @override
  String get map_online => 'En ligne';

  @override
  String get map_recent => 'Récents';

  @override
  String get map_stale => 'Rancide';

  @override
  String get map_visible => 'Visible';

  @override
  String get map_hidden => 'Masqué';

  @override
  String get map_centerOnNode => 'Centrer sur le nœud';

  @override
  String get map_details => 'Détails';

  @override
  String get map_noGps => 'Aucun GPS';

  @override
  String get map_noResults => 'Aucun nœud correspondant';

  @override
  String get map_lineOfSight => 'Ligne de vue';

  @override
  String get map_losScreenTitle => 'Ligne de vue';

  @override
  String get map_noNodesWithLocation =>
      'Aucun nœud avec des données de localisation';

  @override
  String get map_nodesNeedGps =>
      'Les nœuds doivent partager leurs coordonnées GPS\npour apparaître sur la carte.';

  @override
  String map_nodesCount(int count) {
    return 'Nœuds : $count';
  }

  @override
  String map_pinsCount(int count) {
    return 'Épingles : $count';
  }

  @override
  String get map_chat => 'Conversation';

  @override
  String get map_repeater => 'Répéteur';

  @override
  String get map_room => 'Room server';

  @override
  String get map_sensor => 'Capteur';

  @override
  String get map_pinDm => 'Épingle (DM)';

  @override
  String get map_pinPrivate => 'Épingle (privé)';

  @override
  String get map_pinPublic => 'Épingle (public)';

  @override
  String get map_lastSeen => 'Vu pour la dernière fois';

  @override
  String get map_disconnectConfirm =>
      'Êtes-vous sûr de vouloir vous déconnecter de cet appareil ?';

  @override
  String get map_from => 'Depuis';

  @override
  String get map_source => 'Source';

  @override
  String get map_flags => 'Drapeaux';

  @override
  String get map_type => 'Type';

  @override
  String get map_path => 'Chemin';

  @override
  String get map_location => 'Localisation';

  @override
  String get map_estLocation => 'Localisation estimée';

  @override
  String get map_publicKey => 'Clé publique';

  @override
  String get map_publicKeyPrefixHint => 'p. ex. ab12';

  @override
  String get map_shareMarkerHere => 'Partager le marqueur ici';

  @override
  String get map_setAsMyLocation => 'Définir comme ma localisation';

  @override
  String get map_pinLabel => 'Libellé de l\'épingle';

  @override
  String get map_label => 'Étiquette';

  @override
  String get map_pointOfInterest => 'Point d\'intérêt';

  @override
  String get map_sendToContact => 'Envoyer au contact';

  @override
  String get map_sendToChannel => 'Envoyer sur le canal';

  @override
  String get map_noChannelsAvailable => 'Aucun canal disponible';

  @override
  String get map_publicLocationShare => 'Partage public de localisation';

  @override
  String map_publicLocationShareConfirm(String channelLabel) {
    return 'Vous êtes sur le point de partager une localisation dans $channelLabel. Ce canal est public et toute personne disposant de la PSK peut la voir.';
  }

  @override
  String get map_connectToShareMarkers =>
      'Connectez-vous à un appareil pour partager des marqueurs';

  @override
  String get map_filterNodes => 'Filtrer les nœuds';

  @override
  String get map_nodeTypes => 'Types de nœuds';

  @override
  String get map_chatNodes => 'Nœuds de chat';

  @override
  String get map_repeaters => 'Répéteurs';

  @override
  String get map_otherNodes => 'Autres nœuds';

  @override
  String get map_showOverlaps => 'Chevauchements de clés de répéteur';

  @override
  String get map_keyPrefix => 'Préfixe de clé';

  @override
  String get map_filterByKeyPrefix => 'Filtrer par préfixe de clé';

  @override
  String get map_publicKeyPrefix => 'Préfixe de clé publique';

  @override
  String get map_markers => 'Marqueurs';

  @override
  String get map_showSharedMarkers => 'Afficher les marqueurs partagés';

  @override
  String get map_showGuessedLocations =>
      'Afficher les emplacements estimés des nœuds';

  @override
  String get map_showDiscoveryContacts => 'Afficher les contacts de découverte';

  @override
  String get map_guessedLocation => 'Localisation estimée';

  @override
  String get map_lastSeenTime => 'Vu pour la dernière fois';

  @override
  String get map_sharedPin => 'Épingle partagée';

  @override
  String get map_sharedAt => 'Partagé';

  @override
  String get map_joinRoom => 'Rejoindre le room server';

  @override
  String get map_manageRepeater => 'Gérer le répéteur';

  @override
  String get map_tapToAdd =>
      'Appuyez sur les nœuds pour les ajouter au chemin.';

  @override
  String get map_runTrace => 'Exécuter la traçage de chemin';

  @override
  String get map_runTraceWithReturnPath => 'Revenir sur le même chemin.';

  @override
  String get map_removeLast => 'Supprimer le dernier';

  @override
  String get map_pathTraceCancelled => 'Traçage de chemin annulé';

  @override
  String get mapCache_title => 'Cache de carte hors ligne';

  @override
  String get mapCache_selectAreaFirst =>
      'Sélectionnez d\'abord une zone à mettre en cache';

  @override
  String get mapCache_noTilesToDownload =>
      'Aucune tuile à télécharger pour cette zone.';

  @override
  String get mapCache_downloadTilesTitle => 'Télécharger les tuiles';

  @override
  String mapCache_downloadTilesPrompt(int count) {
    return 'Télécharger $count tuiles pour une utilisation hors ligne ?';
  }

  @override
  String get mapCache_downloadAction => 'Télécharger';

  @override
  String mapCache_cachedTiles(int count) {
    return '$count tuiles mises en cache';
  }

  @override
  String mapCache_cachedTilesWithFailed(int downloaded, int failed) {
    return '$downloaded tuiles mises en cache ($failed en échec)';
  }

  @override
  String get mapCache_clearOfflineCacheTitle => 'Effacer le cache hors ligne';

  @override
  String get mapCache_clearOfflineCachePrompt =>
      'Supprimer toutes les tuiles de carte mises en cache ?';

  @override
  String get mapCache_offlineCacheCleared =>
      'Le cache hors ligne a été effacé.';

  @override
  String get mapCache_noAreaSelected => 'Aucune zone sélectionnée';

  @override
  String get mapCache_cacheArea => 'Zone à mettre en cache';

  @override
  String get mapCache_useCurrentView => 'Utiliser la vue actuelle';

  @override
  String get mapCache_zoomRange => 'Plage de zoom';

  @override
  String mapCache_estimatedTiles(int count) {
    return 'Estimation des tuiles : $count';
  }

  @override
  String mapCache_downloadedTiles(int completed, int total) {
    return '$completed / $total téléchargées';
  }

  @override
  String get mapCache_downloadTilesButton => 'Télécharger les tuiles';

  @override
  String get mapCache_clearCacheButton => 'Vider le cache';

  @override
  String mapCache_failedDownloads(int count) {
    return 'Téléchargements échoués : $count';
  }

  @override
  String get mapCache_cachedTilesLabel => 'Cached tiles';

  @override
  String get mapCache_cachedTileSummaryLabel => 'Cached tile summary';

  @override
  String mapCache_bulkDownloadDisabledForSource(String source) {
    return 'Offline bulk downloads are disabled for $source.';
  }

  @override
  String mapCache_bulkDownloadDisabledInConfig(String source) {
    return 'Offline bulk downloads are disabled for $source in this app configuration.';
  }

  @override
  String mapCache_summarySource(String source) {
    return 'Source: $source';
  }

  @override
  String mapCache_summaryCachedTilesForSource(int count) {
    return 'Cached tiles for source: $count';
  }

  @override
  String mapCache_summaryCachedInSelection(int count) {
    return 'Cached in selected area/zoom: $count';
  }

  @override
  String mapCache_summaryApproxCacheSize(String size) {
    return 'Approx cache size: $size';
  }

  @override
  String mapCache_boundsLabel(
    String north,
    String south,
    String east,
    String west,
  ) {
    return 'N $north, S $south, E $east, O $west';
  }

  @override
  String get time_justNow => 'Maintenant';

  @override
  String time_minutesAgo(int minutes) {
    return '$minutes minutes auparavant';
  }

  @override
  String time_hoursAgo(int hours) {
    return '${hours}h auparavant';
  }

  @override
  String time_daysAgo(int days) {
    return '$days jours avant';
  }

  @override
  String get time_hour => 'heure';

  @override
  String get time_hours => 'heures';

  @override
  String get time_day => 'jour';

  @override
  String get time_days => 'jours';

  @override
  String get time_week => 'semaine';

  @override
  String get time_weeks => 'semaines';

  @override
  String get time_month => 'mois';

  @override
  String get time_months => 'mois';

  @override
  String get time_minutes => 'minutes';

  @override
  String get time_allTime => 'Tout le temps';

  @override
  String get dialog_disconnect => 'Déconnecter';

  @override
  String get dialog_disconnectConfirm =>
      'Êtes-vous sûr de vouloir vous déconnecter de cet appareil ?';

  @override
  String get login_repeaterLogin => 'Connexion au répéteur';

  @override
  String get login_roomLogin => 'Connexion au room server';

  @override
  String get login_password => 'Mot de passe';

  @override
  String get login_enterPassword => 'Entrez votre mot de passe';

  @override
  String get login_savePassword => 'Sauvegarder le mot de passe';

  @override
  String get login_savePasswordSubtitle =>
      'Le mot de passe sera stocké en toute sécurité sur cet appareil.';

  @override
  String get login_repeaterDescription =>
      'Entrez le mot de passe du répéteur pour accéder aux paramètres et à l\'état.';

  @override
  String get login_roomDescription =>
      'Entrez le mot de passe de la pièce pour accéder aux paramètres et à l\'état.';

  @override
  String get login_routing => 'Redirection';

  @override
  String get login_routingMode => 'Mode de routage';

  @override
  String get login_autoUseSavedPath => 'Auto (utiliser le chemin sauvegardé)';

  @override
  String get login_forceFloodMode => 'Mode tout le réseau forcé';

  @override
  String get login_managePaths => 'Gérer les chemins';

  @override
  String get login_login => 'Connexion';

  @override
  String login_attempt(int current, int max) {
    return 'Essayer $current/$max';
  }

  @override
  String login_failed(String error) {
    return 'Connexion échouée : $error';
  }

  @override
  String get login_failedMessage =>
      'Connexion échouée. Soit le mot de passe est incorrect, soit le relais est injoignable.';

  @override
  String get common_reload => 'Recharger';

  @override
  String get common_clear => 'Effacer';

  @override
  String get path_currentPathLabel => 'Chemin actuel';

  @override
  String get path_noRepeatersFound => 'Aucun répéteur ou room server trouvé.';

  @override
  String get repeater_management => 'Gestion des répéteurs';

  @override
  String get room_management => 'Gestion du room server';

  @override
  String get repeater_guest => 'Informations sur les répéteurs';

  @override
  String get room_guest => 'Informations sur le serveur';

  @override
  String get repeater_managementTools => 'Outils de Gestion';

  @override
  String get repeater_guestTools => 'Outils pour les invités';

  @override
  String get repeater_status => 'État';

  @override
  String get repeater_statusSubtitle =>
      'Afficher l\'état, les statistiques et les voisins du répéteur';

  @override
  String get repeater_telemetry => 'Télémetrie';

  @override
  String get repeater_telemetrySubtitle =>
      'Afficher la télémétrie des capteurs et les statistiques du système';

  @override
  String get repeater_cli => 'CLI';

  @override
  String get repeater_cliSubtitle => 'Envoyer des commandes au répéteur';

  @override
  String get repeater_neighbors => 'Voisins';

  @override
  String get repeater_neighborsSubtitle => 'Afficher les voisins de saut nuls.';

  @override
  String get repeater_settings => 'Paramètres';

  @override
  String get repeater_settingsSubtitle =>
      'Configurer les paramètres du répéteur';

  @override
  String get repeater_clockSyncAfterLogin =>
      'Synchronisation de l\'horloge après la connexion';

  @override
  String get repeater_clockSyncAfterLoginSubtitle =>
      'Envoyer automatiquement une notification \"synchronisation de l\'heure\" après une connexion réussie.';

  @override
  String get repeater_statusTitle => 'État du répéteur';

  @override
  String get repeater_routingMode => 'Mode de routage';

  @override
  String get repeater_refresh => 'Rafraîchir';

  @override
  String get repeater_statusRequestTimeout =>
      'Demande de statut délai dépassé.';

  @override
  String repeater_errorLoadingStatus(String error) {
    return 'Erreur lors du chargement du statut : $error';
  }

  @override
  String get repeater_systemInformation => 'Informations Système';

  @override
  String get repeater_battery => 'Batterie';

  @override
  String get repeater_clockAtLogin => 'Horloge (au démarrage)';

  @override
  String get repeater_uptime => 'Disponibilité';

  @override
  String get repeater_queueLength => 'Longueur de la file d\'attente';

  @override
  String get repeater_debugFlags => 'Marqueurs de débogage';

  @override
  String get repeater_radioStatistics => 'Statistiques Radio';

  @override
  String get repeater_lastRssi => 'Dernier RSSI';

  @override
  String get repeater_lastSnr => 'Dernier SNR';

  @override
  String get repeater_noiseFloor => 'Niveau de Bruit';

  @override
  String get repeater_txAirtime => 'TX Airtime';

  @override
  String get repeater_rxAirtime => 'RX Airtime';

  @override
  String get repeater_chanUtil => 'Utilisation du canal';

  @override
  String get repeater_packetStatistics => 'Statistiques des paquets';

  @override
  String get repeater_sent => 'Envoyé';

  @override
  String get repeater_received => 'Reçu';

  @override
  String get repeater_duplicates => 'Doublons';

  @override
  String repeater_daysHoursMinsSecs(
    int days,
    int hours,
    int minutes,
    int seconds,
  ) {
    return '$days jours ${hours}h ${minutes}m ${seconds}s';
  }

  @override
  String repeater_packetTxTotal(int total, String flood, String direct) {
    return 'Total : $total, Tout le réseau : $flood, Direct : $direct';
  }

  @override
  String repeater_packetRxTotal(int total, String flood, String direct) {
    return 'Total : $total, Tout le réseau : $flood, Direct : $direct';
  }

  @override
  String repeater_duplicatesFloodDirect(String flood, String direct) {
    return 'Tout le réseau : $flood, Direct : $direct';
  }

  @override
  String repeater_duplicatesTotal(int total) {
    return 'Total : $total';
  }

  @override
  String get repeater_settingsTitle => 'Paramètres du répéteur';

  @override
  String get repeater_basicSettings => 'Paramètres de base';

  @override
  String get repeater_repeaterName => 'Nom du répéteur';

  @override
  String get repeater_repeaterNameHelper => 'Afficher le nom de ce répéteur';

  @override
  String get repeater_adminPassword => 'Mot de passe Administrateur';

  @override
  String get repeater_adminPasswordHelper => 'Mot de passe d\'accès complet';

  @override
  String get repeater_guestPassword => 'Mot de passe invité';

  @override
  String get repeater_guestPasswordHelper =>
      'Accès en lecture seule avec mot de passe';

  @override
  String get repeater_radioSettings => 'Paramètres Radio';

  @override
  String get repeater_frequencyMhz => 'Fréquence (MHz)';

  @override
  String get repeater_frequencyHelper => '300-2500 MHz';

  @override
  String get repeater_txPower => 'TX Puissance';

  @override
  String get repeater_txPowerHelper => '1 à 30 dBm';

  @override
  String get repeater_bandwidth => 'Bande passante';

  @override
  String get repeater_spreadingFactor => 'Facteur de répartition (SF)';

  @override
  String get repeater_codingRate => 'Taux de codage (CR)';

  @override
  String get repeater_locationSettings => 'Paramètres de localisation';

  @override
  String get repeater_latitude => 'Latitude';

  @override
  String get repeater_latitudeHelper =>
      'Degrés décimaux (par exemple, 37.7749)';

  @override
  String get repeater_longitude => 'Longitude';

  @override
  String get repeater_longitudeHelper =>
      'Degrés décimaux (par exemple, -122,4194)';

  @override
  String get repeater_features => 'Fonctionnalités';

  @override
  String get repeater_packetForwarding => 'Mode répéteur';

  @override
  String get repeater_packetForwardingSubtitle =>
      'Activer le répéteur pour transmettre des paquets';

  @override
  String get repeater_guestAccess => 'Accès Invité';

  @override
  String get repeater_guestAccessSubtitle =>
      'Autoriser l\'accès invité en lecture seule';

  @override
  String get repeater_privacyMode => 'Mode de confidentialité';

  @override
  String get repeater_privacyModeSubtitle =>
      'Masquer le nom et la localisation dans les annonces';

  @override
  String get repeater_advertisementSettings => 'Paramètres d\'annonces';

  @override
  String get repeater_localAdvertInterval =>
      'Intervalle des annonces Locale (0 saut)';

  @override
  String repeater_localAdvertIntervalMinutes(int minutes) {
    return '$minutes minutes';
  }

  @override
  String get repeater_floodAdvertInterval =>
      'Intervalle des annonces à tout le réseau (flood)';

  @override
  String repeater_floodAdvertIntervalHours(int hours) {
    return '$hours heures';
  }

  @override
  String get repeater_encryptedAdvertInterval =>
      'Intervalle d\'annonces cryptées';

  @override
  String get repeater_dangerZone => 'Zone dangereuse';

  @override
  String get repeater_rebootRepeater => 'Redémarrer Répéteur';

  @override
  String get repeater_rebootRepeaterSubtitle =>
      'Réinitialiser l\'appareil répéteur';

  @override
  String get repeater_rebootRepeaterConfirm =>
      'Êtes-vous sûr de vouloir redémarrer ce répéteur ?';

  @override
  String get repeater_regenerateIdentityKey => 'Ré générer la clé d\'identité';

  @override
  String get repeater_regenerateIdentityKeySubtitle =>
      'Générer une nouvelle paire de clés publique/privée';

  @override
  String get repeater_regenerateIdentityKeyConfirm =>
      'Cela générera une nouvelle identité pour le répéteur. Continuer ?';

  @override
  String get repeater_eraseFileSystem => 'Supprimer le système de fichiers';

  @override
  String get repeater_eraseFileSystemSubtitle =>
      'Formater le système de fichiers du répéteur';

  @override
  String get repeater_eraseFileSystemConfirm =>
      'AVERTISSEMENT : Cela effacera toutes les données du répéteur. Cela ne peut pas être annulé !';

  @override
  String get repeater_eraseSerialOnly =>
      'Erase n\'est disponible que via la console série.';

  @override
  String repeater_commandSent(String command) {
    return 'Commande envoyée : $command';
  }

  @override
  String repeater_errorSendingCommand(String error) {
    return 'Erreur lors de l\'envoi de la commande : $error';
  }

  @override
  String get repeater_confirm => 'Confirmer';

  @override
  String get repeater_settingsSaved =>
      'Les paramètres ont été enregistrés avec succès.';

  @override
  String get repeater_rxGain => 'Augmentation du rendement de RX';

  @override
  String get repeater_rxGainHelper =>
      'Meilleure sensibilité, consommation de courant plus élevée (uniquement pour les modèles SX1262/SX1268)';

  @override
  String get repeater_refreshRxGain =>
      'Renforcer les gains de RX grâce à la mise à jour';

  @override
  String get repeater_multiAcks => 'Plusieurs accusés de réception';

  @override
  String get repeater_multiAcksSubtitle =>
      'Valider les messages via plusieurs chemins pour une meilleure livraison.';

  @override
  String get repeater_refreshMultiAcks =>
      'Renvoyer plusieurs accusés de réception';

  @override
  String get repeater_networkHealth => 'Santé du réseau';

  @override
  String get repeater_loopDetect => 'Détection de boucles';

  @override
  String get repeater_loopDetectHelper =>
      'Envoyer des paquets de données qui semblent former des boucles de routage.';

  @override
  String get repeater_loopDetectOff => 'Désactivé';

  @override
  String get repeater_loopDetectMinimal => 'Minimal';

  @override
  String get repeater_loopDetectModerate => 'Modéré';

  @override
  String get repeater_loopDetectStrict => 'Strict';

  @override
  String get repeater_dutyCycle => 'Cycle de fonctionnement';

  @override
  String get repeater_dutyCycleHelper =>
      'Pourcentage maximal de temps d\'antenne';

  @override
  String repeater_dutyCyclePercent(int percent) {
    return '$percent%';
  }

  @override
  String get repeater_ownerInfo => 'Informations sur le propriétaire';

  @override
  String get repeater_ownerInfoHelper =>
      'Métadonnées publiques pour cet appareil';

  @override
  String get repeater_refreshOwnerInfo =>
      'Rafraîchir les informations du propriétaire';

  @override
  String get repeater_floodMax => 'Nombre maximal de sauts en flood';

  @override
  String get repeater_floodMaxHelper =>
      'Nombre maximal de paquets de données qu\'un flux peut transmettre (0-64)';

  @override
  String get repeater_advancedSettings => 'Avancé';

  @override
  String get repeater_advancedSettingsSubtitle =>
      'Réglages avancés pour les opérateurs expérimentés';

  @override
  String get repeater_pathHashMode => 'Mode de hachage de chemin';

  @override
  String get repeater_pathHashModeHelper =>
      'Octets utilisés pour encoder l\'ID de ce routeur dans les balises de détection de flux/boucles. 0 = 1 octet (256 ID, jusqu\'à 64 sauts), 1 = 2 octets (65 000 ID, jusqu\'à 32 sauts), 2 = 3 octets (16 millions d\'ID, jusqu\'à 21 sauts). Les versions 1.13 et antérieures utilisent des chemins multi-octets ; à partir de la version 1.14, cela n\'est plus nécessaire.';

  @override
  String get repeater_keySettings => 'Modifier les clés d\'identité';

  @override
  String get repeater_keySettingsSubtitle =>
      'Modifier la paire de clés publique/privée';

  @override
  String get repeater_prvKey => 'Clé privée';

  @override
  String get repeater_prvKeyHelper =>
      'Une nouvelle clé privée pour le répéteur, une chaîne hexadécimale de 128 caractères.';

  @override
  String get repeater_generatePrvKey => 'Générez une paire de clés aléatoire';

  @override
  String get repeater_stopGeneratingPrvKey =>
      'Arrêter la recherche de la paire de clés';

  @override
  String get repeater_pubKey => 'Clé publique';

  @override
  String get repeater_pubKeyHelper =>
      'Voici la clé publique associée à la clé privée générée. Vous ne pouvez pas la définir directement.';

  @override
  String get repeater_pubKeyPrefix => 'Préfixe souhaité';

  @override
  String repeater_pubKeyPrefixHelper(int tries) {
    return 'Trouvez une clé publique qui commence par ces chiffres hexadécimaux. Nombre de tentatives nécessaires : $tries.';
  }

  @override
  String get repeater_txDelay => 'Délai de transmission en flood';

  @override
  String get repeater_txDelayHelper =>
      'Intervalle de retransmission pour le trafic flood, en multipliant le temps d\'émission des paquets (0-2, valeur par défaut : 0,5). Une valeur plus élevée réduit les collisions, mais ralentit la transmission.';

  @override
  String get repeater_directTxDelay => 'Délai de transmission direct';

  @override
  String get repeater_directTxDelayHelper =>
      'Intervalle de retransmission pour le trafic direct (non flood), en multipliant le temps de transmission des paquets (0-2, valeur par défaut : 0,3).';

  @override
  String get repeater_intThresh => 'Seuil de perturbation';

  @override
  String get repeater_intThreshHelper =>
      'Seuil dépassé pour la calibration du niveau de bruit de la radio, afin de rejeter les interférences supérieures à ce niveau. 0 désactive – ne mettez cette valeur que si vous constatez des erreurs RX dans une bande de fréquences bruyante.';

  @override
  String get repeater_agcResetInterval =>
      'Intervalle de réinitialisation de l\'AGC';

  @override
  String get repeater_agcResetIntervalHelper =>
      'À quelle fréquence réinitialiser le contrôle automatique du gain de la radio pour revenir à un état normal ? Chaque seconde, ou à chaque multiple de 4. Désactiver la réinitialisation périodique avec 0.';

  @override
  String get repeater_actionsTitle => 'Actions';

  @override
  String get repeater_sendAdvert => 'Envoyer une annonce flood';

  @override
  String get repeater_sendAdvertSubtitle =>
      'Diffuser une annonce flood via le réseau.';

  @override
  String get repeater_sendAdvertZeroHop => 'Envoyer une annonce sans relais';

  @override
  String get repeater_sendAdvertZeroHopSubtitle =>
      'Diffuser une annonce d\'un seul saut (sans relais)';

  @override
  String get repeater_clockSync => 'Synchroniser l\'heure maintenant';

  @override
  String get repeater_clockSyncSubtitle =>
      'Envoyez l\'heure de votre téléphone au répéteur.';

  @override
  String repeater_actionSucceeded(String action) {
    return '$action a réussi';
  }

  @override
  String repeater_actionFailed(String action, String error) {
    return '$action a échoué : $error';
  }

  @override
  String get repeater_settingsSavedRebootNeeded =>
      'Paramètres sauvegardés — redémarrer le répéteur pour appliquer les modifications.';

  @override
  String repeater_settingsPartialFailure(String failures) {
    return 'Certaines configurations ont échoué : $failures';
  }

  @override
  String repeater_errorSavingSettings(String error) {
    return 'Erreur lors de la sauvegarde des paramètres : $error';
  }

  @override
  String get repeater_refreshBasicSettings =>
      'Rafraîchir les paramètres de base';

  @override
  String get repeater_refreshRadioSettings => 'Rafraîchir les paramètres Radio';

  @override
  String get repeater_refreshTxPower => 'Rafraîchir la puissance TX';

  @override
  String get repeater_refreshPacketForwarding =>
      'Rafraîchir le routage des paquets';

  @override
  String get repeater_refreshGuestAccess => 'Rafraîchir l\'accès invité';

  @override
  String get repeater_refreshPrivacyMode =>
      'Rafraîchir le Mode Confidentialité';

  @override
  String repeater_refreshed(String label) {
    return '$label rafraîchi';
  }

  @override
  String repeater_errorRefreshing(String label) {
    return 'Erreur lors du rafraîchissement de $label';
  }

  @override
  String get repeater_cliTitle => 'CLI du répéteur';

  @override
  String get repeater_debugNextCommand => 'Déboguer la prochaine commande';

  @override
  String get repeater_commandHelp => 'Aide';

  @override
  String get repeater_clearHistory => 'Effacer l\'historique';

  @override
  String get repeater_noCommandsSent =>
      'Aucune commande n\'a encore été envoyée.';

  @override
  String get repeater_typeCommandOrUseQuick =>
      'Saisissez une commande ci-dessous ou utilisez les commandes rapides';

  @override
  String get repeater_enterCommandHint => 'Entrer la commande...';

  @override
  String get repeater_previousCommand => 'Commande précédente';

  @override
  String get repeater_nextCommand => 'Prochaine commande';

  @override
  String get repeater_enterCommandFirst => 'Entrez d\'abord une commande';

  @override
  String get repeater_cliCommandFrameTitle => 'Frame de commande CLI';

  @override
  String repeater_cliCommandError(String error) {
    return 'Erreur : $error';
  }

  @override
  String get repeater_cliQuickGetName => 'Obtenir le nom';

  @override
  String get repeater_cliQuickGetRadio => 'Obtenir la radio';

  @override
  String get repeater_cliQuickGetTx => 'Obtenir TX';

  @override
  String get repeater_cliQuickNeighbors => 'Voisins';

  @override
  String get repeater_cliQuickVersion => 'Version';

  @override
  String get repeater_cliQuickAdvertise => 'Diffuser';

  @override
  String get repeater_cliQuickClock => 'Horloge';

  @override
  String get repeater_cliQuickClockSync => 'Synchronisation de l\'horloge';

  @override
  String get repeater_cliQuickDiscovery => 'Découvrir les voisins';

  @override
  String get repeater_cliHelpAdvert => 'Envoie un paquet d\'annonce';

  @override
  String get repeater_cliHelpReboot =>
      'Redémarre l\'appareil. (Note, vous risquez d\'obtenir \'Timeout\' ce qui est normal)';

  @override
  String get repeater_cliHelpClock =>
      'Affiche l\'heure actuelle par l\'horloge de chaque appareil.';

  @override
  String get repeater_cliHelpPassword =>
      'Définit un nouveau mot de passe administrateur pour l\'appareil.';

  @override
  String get repeater_cliHelpVersion =>
      'Affiche la version du périphérique et la date de construction du micrologiciel.';

  @override
  String get repeater_cliHelpClearStats =>
      'Réinitialise divers compteurs de statistiques à zéro.';

  @override
  String get repeater_cliHelpSetAf => 'Définit le facteur de temps d\'air.';

  @override
  String get repeater_cliHelpSetTx =>
      'Définit la puissance de transmission LoRa en dBm (réinitialisation requise pour appliquer).';

  @override
  String get repeater_cliHelpSetRepeat =>
      'Active ou désactive le rôle du répéteur pour ce nœud.';

  @override
  String get repeater_cliHelpSetAllowReadOnly =>
      '(Room server) Si \"activé\", alors un mot de passe vide permettra la connexion, mais ne permettra pas de publier dans la pièce. (lecture seule uniquement)';

  @override
  String get repeater_cliHelpSetFloodMax =>
      'Définit le nombre maximal de sauts pour les paquets de balayage entrants (si >= max, le paquet n\'est pas acheminé).';

  @override
  String get repeater_cliHelpSetIntThresh =>
      'Définit le seuil d\'interférence (en dB). La valeur par défaut est de 14. Définir sur 0 désactive la détection des interférences de canal.';

  @override
  String get repeater_cliHelpSetAgcResetInterval =>
      'Définit l\'intervalle pour réinitialiser le contrôleur de gain automatique. Mettez à 0 pour désactiver.';

  @override
  String get repeater_cliHelpSetMultiAcks =>
      'Active ou désactive la fonctionnalité « double ACKs ».';

  @override
  String get repeater_cliHelpSetAdvertInterval =>
      'Définit l\'intervalle entre chaque émission d\'une annonce locale (sans relais). Définir sur 0 pour désactiver.';

  @override
  String get repeater_cliHelpSetFloodAdvertInterval =>
      'Définit l\'intervalle du minuteur en heures pour envoyer un paquet d\'annonce massive. Définir sur 0 pour désactiver.';

  @override
  String get repeater_cliHelpSetGuestPassword =>
      'Définit/met à jour le mot de passe de l\'invité. (pour les répéteurs, les connexions d\'invités peuvent envoyer la requête \"Get Stats\")';

  @override
  String get repeater_cliHelpSetName => 'Définit le nom de l\'annonce.';

  @override
  String get repeater_cliHelpSetLat =>
      'Définit la latitude de la carte des annonces. (degrés décimaux)';

  @override
  String get repeater_cliHelpSetLon =>
      'Définit la longitude de la carte de l\'annonce. (degrés décimaux)';

  @override
  String get repeater_cliHelpSetRadio =>
      'Définit complètement de nouveaux paramètres de radio et les enregistre dans les préférences. Nécessite une commande \"redémarrage\" pour les appliquer.';

  @override
  String get repeater_cliHelpSetRxDelay =>
      'Paramètres (expérimental) de base pour appliquer un léger délai aux paquets reçus, en fonction de la force du signal/score. Définir sur 0 pour désactiver.';

  @override
  String get repeater_cliHelpSetTxDelay =>
      'Définit un facteur multiplié par le temps de fonctionnement en mode vers tout le réseau (flood) pour un paquet et avec un système de slot aléatoire, afin de retarder son envoi (pour diminuer la probabilité de collisions).';

  @override
  String get repeater_cliHelpSetDirectTxDelay =>
      'Identique à txdelay, mais pour appliquer un délai aléatoire au transfert des paquets en mode direct.';

  @override
  String get repeater_cliHelpSetBridgeEnabled => 'Activer/Désactiver le pont.';

  @override
  String get repeater_cliHelpSetBridgeDelay =>
      'Définir le délai avant de renvoyer les paquets.';

  @override
  String get repeater_cliHelpSetBridgeSource =>
      'Choisissez si le pont retransmettra les paquets reçus ou les paquets transmis.';

  @override
  String get repeater_cliHelpSetBridgeBaud =>
      'Définir la vitesse de communication série pour les ponts Rs232.';

  @override
  String get repeater_cliHelpSetBridgeSecret =>
      'Définir le secret du pont pour les ponts espnow.';

  @override
  String get repeater_cliHelpSetAdcMultiplier =>
      'Définit un facteur personnalisé pour ajuster la tension de la batterie signalée (uniquement pris en charge sur certains cartes).';

  @override
  String get repeater_cliHelpTempRadio =>
      'Définit des paramètres radio temporaires pour le nombre de minutes donné, puis revient aux paramètres radio d\'origine. (ne sauvegarde pas dans les préférences).';

  @override
  String get repeater_cliHelpSetPerm =>
      'Modifie l’ACL. Supprime l’entrée correspondante (par préfixe de clé publique) si \"permissions\" est égal à zéro. Ajoute une nouvelle entrée si la clé publique hexadécimale a une longueur complète et n’est pas actuellement dans l’ACL. Met à jour l’entrée en fonction du préfixe de clé publique. Les bits de permission varient en fonction du rôle du firmware, mais les 2 bits inférieurs sont : 0 (Invité), 1 (Lecture seule), 2 (Lecture/écriture), 3 (Administrateur).';

  @override
  String get repeater_cliHelpGetBridgeType =>
      'Obtenir le type de pont : aucun, rs232, espnow';

  @override
  String get repeater_cliHelpLogStart =>
      'Démarre l\'enregistrement des paquets dans le système de fichiers.';

  @override
  String get repeater_cliHelpLogStop =>
      'Arrêter de journaliser les paquets vers le système de fichiers.';

  @override
  String get repeater_cliHelpLogErase =>
      'Supprime les journaux de paquets du système de fichiers.';

  @override
  String get repeater_cliHelpNeighbors =>
      'Affiche une liste d\'autres nœuds répéteurs entendus via des annonces sans relais. Chaque ligne est id-préfixe-hexadécimal:timestamp:snr-fois-4';

  @override
  String get repeater_cliHelpNeighborRemove =>
      'Supprime la première entrée correspondante (par préfixe de clé publique (hexadécimal)) de la liste des voisins.';

  @override
  String get repeater_cliHelpRegion =>
      '(série uniquement) Liste toutes les régions définies et les autorisations actuelles d\'annonces sur tout le réseau (flood).';

  @override
  String get repeater_cliHelpRegionLoad =>
      'REMARQUE : il s\'agit d\'une invocation multi-commande spéciale. Chaque commande subséquente est un nom de région (indenté avec des espaces pour indiquer la hiérarchie parent, avec un minimum d\'un espace). Terminé par l\'envoi d\'une ligne vide/commande.';

  @override
  String get repeater_cliHelpRegionGet =>
      'Recherche la région avec le préfixe de nom donné (ou \"\" pour l\'étendue globale). Répond avec \"-> nom-de-région (nom-parent) \'F\'\"';

  @override
  String get repeater_cliHelpRegionPut =>
      'Ajoute ou met à jour une définition de région avec le nom donné.';

  @override
  String get repeater_cliHelpRegionRemove =>
      'Supprime une définition de région avec le nom donné.';

  @override
  String get repeater_cliHelpRegionAllowf =>
      'Définit les autorisations de \"Flot\" pour la région donnée. (\'\' pour la portée globale/héritée)';

  @override
  String get repeater_cliHelpRegionDenyf =>
      'Supprime l\'autorisation \'F\'lood\' pour la région donnée. (NOTE : à ce stade, il n\'est pas conseillé de l\'utiliser sur l\'étendue globale/héritée !! )';

  @override
  String get repeater_cliHelpRegionHome =>
      'Répond avec la région \'maison\' actuelle. (Note appliquée nulle part pour l\'instant, réservée à une utilisation future)';

  @override
  String get repeater_cliHelpRegionHomeSet => 'Définit la région \'maison\'.';

  @override
  String get repeater_cliHelpRegionSave =>
      'Conserve la liste/la carte des régions dans le stockage.';

  @override
  String get repeater_cliHelpGps =>
      'Affiche l’état du GPS. Lorsque le GPS est éteint, il répond uniquement « éteint », si allumé, il répond avec « allumé », l’état, la correction, le nombre de satellites.';

  @override
  String get repeater_cliHelpGpsOnOff => 'Activer/désactiver le GPS.';

  @override
  String get repeater_cliHelpGpsSync =>
      'Synchronise l\'heure du nœud avec l\'horloge GPS.';

  @override
  String get repeater_cliHelpGpsSetLoc =>
      'Définit la position du nœud aux coordonnées GPS et enregistre les préférences.';

  @override
  String get repeater_cliHelpGpsAdvert =>
      'Donne la configuration de l\'annonce de la localisation du nœud :\n- none : ne pas inclure la localisation dans les annonces\n- share : partager la localisation GPS (du SensorManager)\n- prefs : annoncer la localisation stockée dans les préférences';

  @override
  String get repeater_cliHelpGpsAdvertSet =>
      'Définit la configuration de l\'annonce de localisation.';

  @override
  String get repeater_commandsListTitle => 'Liste des commandes';

  @override
  String get repeater_commandsListNote =>
      'NOTE : pour les diverses commandes « set »..., il existe également une commande « get »...';

  @override
  String get repeater_general => 'Général';

  @override
  String get repeater_settingsCategory => 'Paramètres';

  @override
  String get repeater_bridge => 'Pont';

  @override
  String get repeater_logging => 'Journalisation';

  @override
  String get repeater_neighborsRepeaterOnly => 'Voisins (Uniquement répéteur)';

  @override
  String get repeater_regionManagementRepeaterOnly =>
      'Gestion des régions (uniquement pour le répéteur)';

  @override
  String get repeater_regionNote =>
      'Les commandes de région ont été introduites pour gérer les définitions et les autorisations des régions.';

  @override
  String get repeater_gpsManagement => 'Gestion GPS';

  @override
  String get repeater_gpsNote =>
      'La commande GPS a été introduite pour gérer les sujets liés à la localisation.';

  @override
  String get repeater_getCategory => 'Obtenir des valeurs';

  @override
  String get repeater_powerMgmt => 'Gestion de l\'énergie';

  @override
  String get repeater_sensors => 'Capteurs';

  @override
  String get repeater_cliHelpPowerOff =>
      'Éteint l\'appareil. (aucune réponse n\'est attendue)';

  @override
  String get repeater_cliHelpClkReboot =>
      'Réinitialise l\'horloge à une époque connue et redémarre l\'appareil.';

  @override
  String get repeater_cliHelpAdvertZeroHop =>
      'Envoie une publicité sans intermédiaire (uniquement aux voisins immédiats).';

  @override
  String get repeater_cliHelpStartOta =>
      'Démarre une mise à jour du firmware par voie radio sur les cartes prises en charge.';

  @override
  String get repeater_cliHelpTime =>
      'Définit l\'heure de l\'appareil sur les secondes de l\'époque Unix spécifiée. L\'heure ne peut pas reculer.';

  @override
  String get repeater_cliHelpBoard =>
      'Indique le fabricant du panneau / l\'identifiant du matériel.';

  @override
  String get repeater_cliHelpDiscoverNeighbors =>
      'Envoie une requête de découverte de nœuds aux voisins proches. (Uniquement pour les répéteurs)';

  @override
  String get repeater_cliHelpPowersaving =>
      'Indique si le mode d\'économie d\'énergie est activé ou désactivé.';

  @override
  String get repeater_cliHelpPowersavingOnOff =>
      'Active ou désactive le mode d\'économie d\'énergie (si pris en charge).';

  @override
  String get repeater_cliHelpErase =>
      '(Uniquement pour les appareils) Formate le système de fichiers de l\'appareil. Efface tous les paramètres et les contacts.';

  @override
  String get repeater_cliHelpSetDutyCycle =>
      'Définit le cycle de transmission maximal autorisé en pourcentage (de 1 à 100). Ajuste automatiquement le facteur de temps d\'émission.';

  @override
  String get repeater_cliHelpSetPrvKey =>
      '(Uniquement pour les séries) Remplace la clé privée d\'identification de l\'appareil. Un redémarrage est nécessaire pour appliquer. Génère une nouvelle clé publique.';

  @override
  String get repeater_cliHelpSetRadioRxGain =>
      '(Uniquement pour les SX126x) Active le gain RX amplifié pour une meilleure sensibilité à des courants plus élevés.';

  @override
  String get repeater_cliHelpSetOwnerInfo =>
      'Définit la chaîne d\'informations de contact du propriétaire, qui figure dans les annonces. Utilisez \'|\' pour les sauts de ligne.';

  @override
  String get repeater_cliHelpSetPathHashMode =>
      'Définit le mode de hachage de chemin. 0 = mode ancien, 1 = mode standard, 2 = mode strict. Influence la façon dont les chemins de routage sont correspondus.';

  @override
  String get repeater_cliHelpSetLoopDetect =>
      'Définit la sensibilité de la détection des boucles de routage : désactivée, minimale, modérée ou stricte.';

  @override
  String get repeater_cliHelpSetFreq =>
      '(Uniquement pour les modèles série) Permet de régler rapidement la fréquence. Redémarrage nécessaire. Il est préférable d\'utiliser l\'option \"réglage radio\" pour configurer tous les paramètres radio.';

  @override
  String get repeater_cliHelpSetBridgeChannel =>
      '(Uniquement pour le pont ESPNow) Définit le canal WiFi (de 1 à 14) utilisé par le pont.';

  @override
  String get repeater_cliHelpGetName => 'Affiche le nom du nœud configuré.';

  @override
  String get repeater_cliHelpGetRole =>
      'Indique le rôle du firmware (répéteur, serveur de pièce, etc.).';

  @override
  String get repeater_cliHelpGetPublicKey =>
      'Affiche la clé publique du dispositif.';

  @override
  String get repeater_cliHelpGetPrvKey =>
      '(Uniquement pour les séries) Affiche la clé privée de l\'appareil. Traitez-la comme une information confidentielle.';

  @override
  String get repeater_cliHelpGetRepeat =>
      'Indique si le transfert de paquets (en tant que routeur) est activé ou désactivé.';

  @override
  String get repeater_cliHelpGetTx => 'Indique la puissance actuelle en dBm.';

  @override
  String get repeater_cliHelpGetFreq =>
      'Affiche la fréquence radio configurée en MHz.';

  @override
  String get repeater_cliHelpGetRadio =>
      'Affiche tous les paramètres radio : fréquence, largeur de bande, facteur de dispersion, taux de codage.';

  @override
  String get repeater_cliHelpGetRadioRxGain =>
      '(Uniquement pour les SX126x) Affiche l\'état du gain amplifié de la réception.';

  @override
  String get repeater_cliHelpGetAf =>
      'Indique le facteur de temps d\'antenne actuel.';

  @override
  String get repeater_cliHelpGetDutyCycle =>
      'Affiche le cycle de fonctionnement actuel autorisé en pourcentage.';

  @override
  String get repeater_cliHelpGetIntThresh =>
      'Indique le seuil d\'interférence du canal en dB.';

  @override
  String get repeater_cliHelpGetAgcResetInterval =>
      'Indique l\'intervalle de réinitialisation de l\'AGC en secondes.';

  @override
  String get repeater_cliHelpGetMultiAcks =>
      'Indique si le mode \"double ACK\" est activé (1) ou désactivé (0).';

  @override
  String get repeater_cliHelpGetAllowReadOnly =>
      'Indique si l\'accès en lecture seule pour les invités est autorisé.';

  @override
  String get repeater_cliHelpGetAdvertInterval =>
      'Indique l\'intervalle publicitaire local en minutes.';

  @override
  String get repeater_cliHelpGetFloodAdvertInterval =>
      'Indique l\'intervalle publicitaire pour la diffusion de l\'annonce en heures.';

  @override
  String get repeater_cliHelpGetGuestPassword =>
      'Affiche le mot de passe invité configuré.';

  @override
  String get repeater_cliHelpGetLat => 'Affiche la latitude configurée.';

  @override
  String get repeater_cliHelpGetLon => 'Affiche la longitude configurée.';

  @override
  String get repeater_cliHelpGetRxDelay =>
      'Affiche la valeur de base de rxdelay.';

  @override
  String get repeater_cliHelpGetTxDelay =>
      'Indique le facteur de délai de transmission en mode flood.';

  @override
  String get repeater_cliHelpGetDirectTxDelay =>
      'Indique le facteur de délai direct.';

  @override
  String get repeater_cliHelpGetFloodMax =>
      'Indique le nombre maximal de fois où le niveau de l\'eau a atteint son point culminant.';

  @override
  String get repeater_cliHelpGetOwnerInfo =>
      'Affiche la chaîne d\'informations de contact du propriétaire.';

  @override
  String get repeater_cliHelpGetPathHashMode =>
      'Affiche le mode \"hash de chemin\" (0/1/2).';

  @override
  String get repeater_cliHelpGetLoopDetect =>
      'Illustre la sensibilité à la détection des boucles.';

  @override
  String get repeater_cliHelpGetAcl =>
      '(Uniquement pour les séries) Liste les entrées de contrôle d\'accès sur un répéteur.';

  @override
  String get repeater_cliHelpGetBridgeEnabled =>
      'Indique si le pont est activé.';

  @override
  String get repeater_cliHelpGetBridgeDelay =>
      'Indique le délai du pont en millisecondes.';

  @override
  String get repeater_cliHelpGetBridgeSource =>
      'Indique si le pont transmet des paquets RX ou TX.';

  @override
  String get repeater_cliHelpGetBridgeBaud =>
      '(Uniquement pour le pont RS232) Affiche la vitesse de communication du pont.';

  @override
  String get repeater_cliHelpGetBridgeChannel =>
      '(Uniquement pour le pont ESPNow) Affiche le canal WiFi du pont.';

  @override
  String get repeater_cliHelpGetBridgeSecret =>
      '(Uniquement pour le pont ESPNow) Affiche la clé partagée du pont.';

  @override
  String get repeater_cliHelpGetBootloaderVer =>
      '(Uniquement pour le NRF52) Affiche la version du chargeur initial.';

  @override
  String get repeater_cliHelpGetAdcMultiplier =>
      'Affiche le multiplicateur de l\'ADC (mise à l\'échelle de la tension de la batterie).';

  @override
  String get repeater_cliHelpGetPwrMgtSupport =>
      'Indique si le système dispose de fonctionnalités de gestion de l\'alimentation.';

  @override
  String get repeater_cliHelpGetPwrMgtSource =>
      'Indique la source d\'alimentation actuelle : externe ou batterie.';

  @override
  String get repeater_cliHelpGetPwrMgtBootReason =>
      'Indique les raisons les plus récentes de réinitialisation et d\'arrêt.';

  @override
  String get repeater_cliHelpGetPwrMgtBootMv =>
      'Affiche la tension de la batterie au démarrage, en millivolts (mV).';

  @override
  String get repeater_cliHelpSensorGet =>
      'Lit une valeur de configuration personnalisée pour un capteur en utilisant une touche.';

  @override
  String get repeater_cliHelpSensorSet =>
      'Crée une configuration personnalisée pour un capteur.';

  @override
  String get repeater_cliHelpSensorList =>
      'Affiche toutes les configurations de capteurs personnalisées, avec une pagination à partir d\'un index de départ optionnel.';

  @override
  String get repeater_cliHelpRegionDefault =>
      'Affiche la portée régionale par défaut actuelle.';

  @override
  String get repeater_cliHelpRegionDefaultSet =>
      'Définit la portée régionale par défaut. Utilisez \"<null>\" pour la réinitialiser.';

  @override
  String get repeater_cliHelpRegionListAllowed =>
      'Énumère les régions autorisant la circulation des véhicules en cas de flood.';

  @override
  String get repeater_cliHelpRegionListDenied =>
      'Liste les régions qui interdisent la circulation en cas de flood.';

  @override
  String get repeater_cliHelpStatsPackets =>
      '(Uniquement pour les séries) Affiche des statistiques au niveau des paquets.';

  @override
  String get repeater_cliHelpStatsRadio =>
      '(Uniquement pour les séries) Affiche les statistiques de la radio.';

  @override
  String get repeater_cliHelpStatsCore =>
      '(Uniquement pour les séries) Affiche les statistiques du micrologicem intégré.';

  @override
  String get telemetry_receivedData => 'Données de télémétrie reçues';

  @override
  String get telemetry_requestTimeout => 'Demande de télémétrie expirée.';

  @override
  String telemetry_errorLoading(String error) {
    return 'Erreur lors du chargement de la télémétrie : $error';
  }

  @override
  String get telemetry_noData => 'Aucune donnée de télémétrie disponible.';

  @override
  String telemetry_channelTitle(int channel) {
    return 'Canal $channel';
  }

  @override
  String get telemetry_batteryLabel => 'Batterie';

  @override
  String get telemetry_voltageLabel => 'Tension';

  @override
  String get telemetry_mcuTemperatureLabel => 'Température du MCU';

  @override
  String get telemetry_temperatureLabel => 'Température';

  @override
  String get telemetry_currentLabel => 'Actuellement';

  @override
  String telemetry_batteryValue(int percent, String volts) {
    return '$percent% / ${volts}V';
  }

  @override
  String telemetry_voltageValue(String volts) {
    return '${volts}V';
  }

  @override
  String telemetry_currentValue(String amps) {
    return '${amps}A';
  }

  @override
  String telemetry_temperatureValue(String celsius, String fahrenheit) {
    return '$celsius°C / $fahrenheit°F';
  }

  @override
  String get telemetry_digitalInputLabel => 'Entrée numérique';

  @override
  String get telemetry_digitalOutputLabel => 'Sortie numérique';

  @override
  String get telemetry_analogInputLabel => 'Entrée analogique';

  @override
  String get telemetry_analogOutputLabel => 'Sortie analogique';

  @override
  String get telemetry_genericLabel => 'Capteur générique';

  @override
  String get telemetry_luminosityLabel => 'Luminosité';

  @override
  String get telemetry_presenceLabel => 'Présence';

  @override
  String get telemetry_humidityLabel => 'Humidité';

  @override
  String get telemetry_accelerometerLabel => 'Accéléromètre';

  @override
  String get telemetry_pressureLabel => 'Pression';

  @override
  String get telemetry_altitudeLabel => 'Altitude';

  @override
  String get telemetry_frequencyLabel => 'Fréquence';

  @override
  String get telemetry_percentageLabel => 'Pourcentage';

  @override
  String get telemetry_concentrationLabel => 'Concentration';

  @override
  String get telemetry_powerLabel => 'Puissance';

  @override
  String get telemetry_distanceLabel => 'Distance';

  @override
  String get telemetry_energyLabel => 'Énergie';

  @override
  String get telemetry_directionLabel => 'Direction';

  @override
  String get telemetry_timeLabel => 'Heure';

  @override
  String get telemetry_gyrometerLabel => 'Gyromètre';

  @override
  String get telemetry_colourLabel => 'Couleur';

  @override
  String get telemetry_gpsLabel => 'GPS';

  @override
  String get telemetry_switchLabel => 'Interrupteur';

  @override
  String get telemetry_polylineLabel => 'Polyligne';

  @override
  String telemetry_altitudeValue(String meters) {
    return '$meters m';
  }

  @override
  String telemetry_frequencyValue(String hertz) {
    return '$hertz Hz';
  }

  @override
  String telemetry_pressureValue(String hpa) {
    return '$hpa hPa';
  }

  @override
  String telemetry_luminosityValue(String lux) {
    return '$lux lx';
  }

  @override
  String telemetry_powerValue(String watts) {
    return '$watts W';
  }

  @override
  String telemetry_distanceValue(String meters) {
    return '$meters m';
  }

  @override
  String telemetry_energyValue(String kilowattHours) {
    return '$kilowattHours kWh';
  }

  @override
  String telemetry_directionValue(String degrees) {
    return '$degrees°';
  }

  @override
  String telemetry_concentrationValue(String ppm) {
    return '$ppm ppm';
  }

  @override
  String telemetry_percentageValue(String percent) {
    return '$percent%';
  }

  @override
  String telemetry_analogValue(String value) {
    return '$value';
  }

  @override
  String get telemetry_autoFetchQuantity => 'Nombre de requêtes';

  @override
  String get telemetry_error => 'Impossible de récupérer les données';

  @override
  String get neighbors_receivedData => 'Données des voisins reçues';

  @override
  String get neighbors_requestTimedOut => 'Les voisins demandent un délai.';

  @override
  String neighbors_errorLoading(String error) {
    return 'Erreur lors du chargement des voisins : $error';
  }

  @override
  String get neighbors_repeatersNeighbors => 'Répéteurs Voisins';

  @override
  String get neighbors_noData =>
      'Aucune donnée concernant les voisins disponible.';

  @override
  String neighbors_unknownContact(String pubkey) {
    return 'Clé publique inconnue $pubkey';
  }

  @override
  String neighbors_heardAgo(String time) {
    return 'Écouté : $time auparavant';
  }

  @override
  String get channelPath_title => 'Chemin de paquet';

  @override
  String get channelPath_viewMap => 'Afficher la carte';

  @override
  String get channelPath_otherObservedPaths => 'Autres chemins observés';

  @override
  String get channelPath_repeaterHops => 'Sauts du répéteur';

  @override
  String get channelPath_noHopDetails =>
      'Les détails de l\'envoi ne sont pas fournis pour ce paquet.';

  @override
  String get channelPath_messageDetails => 'Détails du message';

  @override
  String get channelPath_senderLabel => 'Expéditeur';

  @override
  String get channelPath_timeLabel => 'Temps';

  @override
  String get channelPath_repeatsLabel => 'Répétitions';

  @override
  String channelPath_pathLabel(int index) {
    return 'Chemin $index';
  }

  @override
  String get channelPath_observedLabel => 'Observé';

  @override
  String channelPath_observedPathTitle(int index, String hops) {
    return 'Chemin observé $index • $hops';
  }

  @override
  String get channelPath_noLocationData => 'Aucune donnée de localisation';

  @override
  String channelPath_timeWithDate(int day, int month, String time) {
    return '$day/$month $time';
  }

  @override
  String channelPath_timeOnly(String time) {
    return '$time';
  }

  @override
  String get channelPath_unknownPath => 'Inconnu';

  @override
  String get channelPath_floodPath => 'Tout le réseau';

  @override
  String get channelPath_directPath => 'Afficher';

  @override
  String channelPath_observedZeroOf(int total) {
    return '0 de $total sauts';
  }

  @override
  String channelPath_observedSomeOf(int observed, int total) {
    return '$observed sur $total sauts';
  }

  @override
  String get channelPath_mapTitle => 'Carte du chemin';

  @override
  String get channelPath_noRepeaterLocations =>
      'Aucune position de répéteur disponible pour ce chemin.';

  @override
  String channelPath_primaryPath(int index) {
    return 'Chemin $index (Principal)';
  }

  @override
  String get channelPath_pathLabelTitle => 'Chemin';

  @override
  String get channelPath_observedPathHeader => 'Chemin observé';

  @override
  String channelPath_selectedPathLabel(String label, String prefixes) {
    return '$label • $prefixes';
  }

  @override
  String get channelPath_noHopDetailsAvailable =>
      'Aucun détail de saut disponible pour ce paquet.';

  @override
  String get channelPath_unknownRepeater => 'Répéteur Inconnu';

  @override
  String get community_title => 'Communauté';

  @override
  String get community_create => 'Créer une Communauté';

  @override
  String get community_createDesc =>
      'Créer une nouvelle communauté et la partager via QR code.';

  @override
  String get community_join => 'Rejoindre';

  @override
  String get community_joinTitle => 'Rejoindre la communauté';

  @override
  String community_joinConfirmation(String name) {
    return 'Souhaitez-vous rejoindre la communauté \"$name\" ?';
  }

  @override
  String get community_scanQr => 'Scanner un QR code de communauté';

  @override
  String get community_scanInstructions =>
      'Pointez l\'appareil photo vers un QR code de communauté.';

  @override
  String get community_showQr => 'Afficher le QR Code';

  @override
  String get community_publicChannel => 'Communauté Publique';

  @override
  String get community_hashtagChannel => 'Hashtag Communauté';

  @override
  String get community_name => 'Nom de la communauté';

  @override
  String get community_enterName => 'Entrez le nom de la communauté';

  @override
  String community_created(String name) {
    return 'Communauté \"$name\" créée';
  }

  @override
  String community_joined(String name) {
    return 'Rejoint la communauté \"$name\"';
  }

  @override
  String get community_qrTitle => 'Partager Communauté';

  @override
  String community_qrInstructions(String name) {
    return 'Scanner ce QR code pour rejoindre $name';
  }

  @override
  String get community_hashtagPrivacyHint =>
      'Les canaux hashtag de la communauté ne sont accessibles qu\'aux membres de la communauté';

  @override
  String get community_invalidQrCode => 'QR code de communauté non valide';

  @override
  String get community_alreadyMember => 'Déjà membre';

  @override
  String community_alreadyMemberMessage(String name) {
    return 'Vous êtes déjà membre de \"$name\".';
  }

  @override
  String get community_addPublicChannel =>
      'Ajouter un Canal Public de la Communauté';

  @override
  String get community_addPublicChannelHint =>
      'Ajouter automatiquement le canal public pour cette communauté';

  @override
  String get community_noCommunities =>
      'Aucun groupe n\'a été rejoint pour le moment.';

  @override
  String get community_scanOrCreate =>
      'Scanner un QR code ou créer une communauté pour commencer';

  @override
  String get community_manageCommunities => 'Gérer les Communautés';

  @override
  String get community_delete => 'Quitter la communauté';

  @override
  String community_deleteConfirm(String name) {
    return 'Quitter \"$name\" ?';
  }

  @override
  String community_deleteChannelsWarning(int count) {
    return 'Cela supprimera également $count canal/canaux et leurs messages.';
  }

  @override
  String community_deleted(String name) {
    return 'Communauté \"$name\" quittée';
  }

  @override
  String get community_regenerateSecret => 'Régénérer le secret';

  @override
  String community_regenerateSecretConfirm(String name) {
    return 'Régénérer la clé secrète pour \"$name\" ? Tous les membres devront scanner le nouveau QR code pour continuer à communiquer.';
  }

  @override
  String get community_regenerate => 'Régénérer';

  @override
  String community_secretRegenerated(String name) {
    return 'Mot de passe secret régénéré pour \"$name\"';
  }

  @override
  String get community_updateSecret => 'Mettre à jour le secret';

  @override
  String community_secretUpdated(String name) {
    return 'Modification secrète mise à jour pour \"$name\"';
  }

  @override
  String community_scanToUpdateSecret(String name) {
    return 'Scanner le nouveau QR code pour mettre à jour le mot de passe pour \"$name\"';
  }

  @override
  String get community_addHashtagChannel => 'Ajouter un Hashtag Communauté';

  @override
  String get community_addHashtagChannelDesc =>
      'Ajouter un canal hashtag pour cette communauté';

  @override
  String get community_selectCommunity => 'Sélectionner Communauté';

  @override
  String get community_regularHashtag => 'Hashtag régulier';

  @override
  String get community_regularHashtagDesc =>
      'Hashtag public (tout le monde peut rejoindre)';

  @override
  String get community_communityHashtag => 'Hashtag de la communauté';

  @override
  String get community_communityHashtagDesc =>
      'Exclusif aux membres de la communauté';

  @override
  String community_forCommunity(String name) {
    return 'Pour $name';
  }

  @override
  String get listFilter_tooltip => 'Filtrer et trier';

  @override
  String get listFilter_sortBy => 'Trier par';

  @override
  String get listFilter_latestMessages => 'Derniers messages';

  @override
  String get listFilter_heardRecently => 'Écoute récemment';

  @override
  String get listFilter_az => 'A à Z';

  @override
  String get listFilter_filters => 'Filtres';

  @override
  String get listFilter_all => 'Tout';

  @override
  String get listFilter_favorites => 'Préférences';

  @override
  String get listFilter_addToFavorites => 'Ajouter à mes favoris';

  @override
  String get listFilter_removeFromFavorites => 'Supprimer des favoris';

  @override
  String get listFilter_users => 'Utilisateurs';

  @override
  String get listFilter_repeaters => 'Répéteurs';

  @override
  String get listFilter_roomServers => 'Serveurs de salle';

  @override
  String get listFilter_unreadOnly => 'Messages non lus seulement';

  @override
  String get listFilter_newGroup => 'Nouveau groupe';

  @override
  String get pathTrace_you => 'Vous';

  @override
  String get pathTrace_failed => 'Échec du traçage du chemin.';

  @override
  String get pathTrace_notAvailable => 'Le traçage du chemin est indisponible.';

  @override
  String get pathTrace_refreshTooltip => 'Actualiser le traçage du chemin';

  @override
  String get pathTrace_someHopsNoLocation =>
      'Un ou plusieurs des sauts manquent d\'une localisation !';

  @override
  String get pathTrace_clearTooltip => 'Effacer le chemin';

  @override
  String get losSelectStartEnd =>
      'Sélectionnez les nœuds de début et de fin pour LOS.';

  @override
  String losRunFailed(String error) {
    return 'Échec de la vérification de la ligne de vue : $error';
  }

  @override
  String get losClearAllPoints => 'Effacer tous les points';

  @override
  String get losRunToViewElevationProfile =>
      'Exécutez LOS pour afficher le profil d\'altitude';

  @override
  String get losMenuTitle => 'Menu LOS';

  @override
  String get losMenuSubtitle =>
      'Appuyez sur les nœuds ou appuyez longuement sur la carte pour des points personnalisés';

  @override
  String get losShowDisplayNodes => 'Afficher les nœuds d\'affichage';

  @override
  String get losCustomPoints => 'Points personnalisés';

  @override
  String losCustomPointLabel(int index) {
    return 'Personnalisé $index';
  }

  @override
  String get losPointA => 'Point A';

  @override
  String get losPointB => 'Point B';

  @override
  String losAntennaA(String value, String unit) {
    return 'Antenne A : $value $unit';
  }

  @override
  String losAntennaB(String value, String unit) {
    return 'Antenne B : $value $unit';
  }

  @override
  String get losRun => 'Exécuter la LOS';

  @override
  String get losNoElevationData => 'Aucune donnée d\'altitude';

  @override
  String losProfileClear(
    String distance,
    String distanceUnit,
    String clearance,
    String heightUnit,
  ) {
    return '$distance $distanceUnit, LOS clair, clairance minimale $clearance $heightUnit';
  }

  @override
  String losProfileBlocked(
    String distance,
    String distanceUnit,
    String obstruction,
    String heightUnit,
  ) {
    return '$distance $distanceUnit, bloqué par $obstruction $heightUnit';
  }

  @override
  String get losStatusChecking => 'LOS : vérification...';

  @override
  String get losStatusNoData => 'LOS : aucune donnée';

  @override
  String losStatusSummary(int clear, int total, int blocked, int unknown) {
    return 'LOS : $clear/$total clair, $blocked bloqué, $unknown inconnu';
  }

  @override
  String get losErrorElevationUnavailable =>
      'Données d\'altitude indisponibles pour un ou plusieurs échantillons.';

  @override
  String get losErrorInvalidInput =>
      'Données de points/d\'altitude non valides pour le calcul de la LOS.';

  @override
  String get losRenameCustomPoint => 'Renommer le point personnalisé';

  @override
  String get losPointName => 'Nom du point';

  @override
  String get losShowPanelTooltip => 'Afficher le panneau LOS';

  @override
  String get losHidePanelTooltip => 'Masquer le panneau LOS';

  @override
  String get losElevationAttribution =>
      'Données d’altitude : Open-Meteo (CC BY 4.0)';

  @override
  String get losLegendRadioHorizon => 'Horizon radio';

  @override
  String get losLegendLosBeam => 'Ligne de visée';

  @override
  String get losLegendTerrain => 'Terrain';

  @override
  String get losBlockedSpotsTitle => 'Places occupés';

  @override
  String get losBlockedSpotsHint =>
      'Sélectionnez un emplacement bloqué pour le mettre en évidence sur la carte.';

  @override
  String losBlockedSpotChip(
    String distance,
    String distanceUnit,
    String obstruction,
    String heightUnit,
  ) {
    return '$distance $distanceUnit • $obstruction $heightUnit';
  }

  @override
  String get losSelectedObstructionTitle => 'Obstruction sélectionnée';

  @override
  String losSelectedObstructionDetails(
    String obstruction,
    String heightUnit,
    String distanceFromA,
    String distanceUnit,
    String distanceFromB,
  ) {
    return 'Bloqué par $obstruction, à une hauteur de $heightUnit, à une distance de $distanceFromA par rapport à A et à une distance de $distanceFromB par rapport à B ($distanceUnit).';
  }

  @override
  String get losFrequencyLabel => 'Fréquence';

  @override
  String get losFrequencyInfoTooltip => 'Voir les détails du calcul';

  @override
  String get losFrequencyDialogTitle => 'Calcul de l’horizon radio';

  @override
  String losFrequencyDialogDescription(
    double baselineK,
    double baselineFreq,
    double frequencyMHz,
    double kFactor,
  ) {
    return 'À partir de k=$baselineK à $baselineFreq MHz, le calcul ajuste le facteur k pour la bande actuelle de $frequencyMHz MHz, ce qui définit la limite incurvée de l\'horizon radio.';
  }

  @override
  String get contacts_pathTrace => 'Traçage de chemin';

  @override
  String get contacts_ping => 'Ping';

  @override
  String get contacts_repeaterPathTrace => 'Tracer le chemin vers le répéteur';

  @override
  String get contacts_repeaterPing => 'Pinguer le répéteur';

  @override
  String get contacts_roomPathTrace => 'Traçage du chemin vers le room server';

  @override
  String get contacts_roomPing => 'Pinguer le room server';

  @override
  String get contacts_chatTraceRoute => 'Tracer le chemin';

  @override
  String contacts_pathTraceTo(String name) {
    return 'Tracer l\'itinéraire vers $name';
  }

  @override
  String get contacts_clipboardEmpty => 'Le presse-papiers est vide.';

  @override
  String get contacts_invalidAdvertFormat => 'Données de contact non valides';

  @override
  String get contacts_contactImported => 'Le contact a été importé.';

  @override
  String get contacts_contactImportFailed =>
      'Échec de l\'importation du contact.';

  @override
  String get contacts_zeroHopAdvert => 'Annonce Zero saut';

  @override
  String get contacts_floodAdvert => 'Annonce à tout le réseau';

  @override
  String get contacts_copyAdvertToClipboard =>
      'Copier l\'annonce dans le presse-papiers';

  @override
  String get contacts_addContactFromClipboard =>
      'Ajouter un contact depuis le presse-papiers';

  @override
  String get contacts_ShareContact =>
      'Copier le contact dans le presse-papiers';

  @override
  String get contacts_ShareContactZeroHop => 'Partager un contact par annonce';

  @override
  String get contacts_zeroHopContactAdvertSent =>
      'Envoyer un contact par annonce.';

  @override
  String get contacts_zeroHopContactAdvertFailed =>
      'Échec de l\'envoi du contact.';

  @override
  String get contacts_contactAdvertCopied =>
      'Annonce copiée dans le presse-papiers.';

  @override
  String get contacts_contactAdvertCopyFailed =>
      'La copie de l\'annonce vers le presse-papiers a échoué.';

  @override
  String get notification_activityTitle => 'Activité MeshCore';

  @override
  String notification_messagesCount(int count) {
    String _temp0 = intl.Intl.pluralLogic(
      count,
      locale: localeName,
      other: 'messages',
      one: 'message',
    );
    return '$count $_temp0';
  }

  @override
  String notification_channelMessagesCount(int count) {
    String _temp0 = intl.Intl.pluralLogic(
      count,
      locale: localeName,
      other: 'messages de canal',
      one: 'message de canal',
    );
    return '$count $_temp0';
  }

  @override
  String notification_newNodesCount(int count) {
    String _temp0 = intl.Intl.pluralLogic(
      count,
      locale: localeName,
      other: 'nouveaux nœuds',
      one: 'nouveau nœud',
    );
    return '$count $_temp0';
  }

  @override
  String notification_newTypeDiscovered(String contactType) {
    return 'Nouveau $contactType découvert';
  }

  @override
  String get notification_receivedNewMessage => 'Nouveau message reçu';

  @override
  String get settings_gpxExportRepeaters =>
      'Exporter les répéteurs / room servers au format GPX';

  @override
  String get settings_gpxExportRepeatersSubtitle =>
      'Exporte les répéteurs / roomserver avec une localisation vers un fichier GPX.';

  @override
  String get settings_gpxExportContacts =>
      'Exporter les compagnons au format GPX';

  @override
  String get settings_gpxExportContactsSubtitle =>
      'Exporte les compagnons avec un emplacement vers un fichier GPX.';

  @override
  String get settings_gpxExportAll =>
      'Exporter tous les contacts au format GPX';

  @override
  String get settings_gpxExportAllSubtitle =>
      'Exporte tous les contacts avec une localisation vers un fichier GPX.';

  @override
  String get settings_gpxExportSuccess => 'Fichier GPX exporté avec succès.';

  @override
  String get settings_gpxExportNoContacts => 'Aucun contact à exporter.';

  @override
  String get settings_gpxExportNotAvailable =>
      'Non pris en charge sur votre appareil/Système d\'exploitation';

  @override
  String get settings_gpxExportError =>
      'Une erreur s\'est produite lors de l\'exportation.';

  @override
  String get settings_gpxExportRepeatersRoom =>
      'Emplacements des répéteurs et room servers';

  @override
  String get settings_gpxExportChat => 'Emplacements des compagnons';

  @override
  String get settings_gpxExportAllContacts =>
      'Tous les emplacements des contacts';

  @override
  String get settings_gpxExportShareText =>
      'Données de carte exportées à partir de meshcore-open';

  @override
  String get settings_gpxExportShareSubject =>
      'meshcore-open exporter les données de carte GPX';

  @override
  String get snrIndicator_nearByRepeaters => 'Répéteurs à proximité';

  @override
  String get snrIndicator_lastSeen => 'Vu pour la dernière fois';

  @override
  String get contactsSettings_title => 'Paramètres des contacts';

  @override
  String get contactsSettings_autoAddTitle => 'Découverte automatique';

  @override
  String get contactsSettings_otherTitle =>
      'Autres paramètres liés aux contacts';

  @override
  String get contactsSettings_autoAddUsersTitle =>
      'Ajouter automatiquement les utilisateurs';

  @override
  String get contactsSettings_autoAddUsersSubtitle =>
      'Autoriser le compagnon à ajouter automatiquement les utilisateurs découverts';

  @override
  String get contactsSettings_autoAddRepeatersTitle =>
      'Ajouter automatiquement les répéteurs';

  @override
  String get contactsSettings_autoAddRepeatersSubtitle =>
      'Autoriser le compagnon à ajouter automatiquement les répéteurs découverts';

  @override
  String get contactsSettings_autoAddRoomServersTitle =>
      'Ajouter automatiquement les room servers';

  @override
  String get contactsSettings_autoAddRoomServersSubtitle =>
      'Autoriser le compagnon à ajouter automatiquement les room servers découverts';

  @override
  String get contactsSettings_autoAddSensorsTitle =>
      'Ajouter automatiquement les capteurs';

  @override
  String get contactsSettings_autoAddSensorsSubtitle =>
      'Autoriser le compagnon à ajouter automatiquement les capteurs découverts.';

  @override
  String get contactsSettings_overwriteOldestTitle => 'Écraser le plus ancien';

  @override
  String get contactsSettings_overwriteOldestSubtitle =>
      'Lorsque la liste de contacts est pleine, le contact le plus ancien non favori sera remplacé.';

  @override
  String get discoveredContacts_Title => 'Contacts découverts';

  @override
  String get discoveredContacts_noMatching => 'Aucun contact correspondant';

  @override
  String get discoveredContacts_searchHint =>
      'Rechercher des contacts découverts';

  @override
  String get discoveredContacts_contactAdded => 'Contact ajouté';

  @override
  String get discoveredContacts_addContact => 'Ajouter un contact';

  @override
  String get discoveredContacts_copyContact =>
      'Copier le contact dans le presse-papiers';

  @override
  String get discoveredContacts_deleteContact => 'Supprimer le contact';

  @override
  String get discoveredContacts_deleteContactAll =>
      'Supprimer tous les contacts découverts';

  @override
  String get discoveredContacts_deleteContactAllContent =>
      'Êtes-vous sûr de vouloir supprimer tous les contacts découverts ?';

  @override
  String get chat_sendCooldown =>
      'Veuillez patienter un instant avant de réessayer.';

  @override
  String get appSettings_jumpToOldestUnread =>
      'Accéder au message le plus ancien non lu';

  @override
  String get appSettings_jumpToOldestUnreadSubtitle =>
      'Lorsque vous ouvrez une conversation contenant des messages non lus, faites défiler la page jusqu\'au premier message non lu, plutôt que jusqu\'au dernier.';

  @override
  String get appSettings_languageHu => 'Hongrois';

  @override
  String get appSettings_languageJa => 'Japonais';

  @override
  String get appSettings_languageKo => 'Coréen';

  @override
  String get radioStats_tooltip =>
      'Statistiques des radios et des réseaux sans fil';

  @override
  String get radioStats_screenTitle => 'Statistiques de radio';

  @override
  String get radioStats_notConnected =>
      'Connectez-vous à un appareil pour visualiser les statistiques de la radio.';

  @override
  String get radioStats_firmwareTooOld =>
      'Les statistiques radio nécessitent un firmware compatible v8 ou une version ultérieure.';

  @override
  String get radioStats_waiting => 'En attente des données…';

  @override
  String radioStats_noiseFloor(int noiseDbm) {
    return 'Niveau de bruit : $noiseDbm dBm';
  }

  @override
  String radioStats_lastRssi(int rssiDbm) {
    return 'Dernier RSSI : $rssiDbm dBm';
  }

  @override
  String radioStats_lastSnr(String snr) {
    return 'Dernier SNR : $snr dB';
  }

  @override
  String radioStats_txAir(int seconds) {
    return 'Temps d\'antenne TX (total) : $seconds s';
  }

  @override
  String radioStats_rxAir(int seconds) {
    return 'Temps d\'antenne RX (total) : $seconds s';
  }

  @override
  String get radioStats_chartCaption =>
      'Niveau de bruit (dBm) sur les échantillons récents.';

  @override
  String radioStats_stripNoise(int noiseDbm) {
    return 'Niveau de bruit : $noiseDbm dBm';
  }

  @override
  String get radioStats_stripWaiting =>
      'Récupération des statistiques de la radio…';

  @override
  String get radioStats_settingsTile => 'Statistiques de radio';

  @override
  String get radioStats_settingsSubtitle =>
      'Niveau de bruit, RSSI, rapport signal/bruit (SNR) et temps d\'antenne';

  @override
  String get translation_title => 'Traduction';

  @override
  String get imageMessages_enableTitle => 'Messages avec images';

  @override
  String get imageMessages_enableSubtitle =>
      'Envoyer des images via le maillage. Nécessite un téléchargement unique du modèle d\'image.';

  @override
  String get imageMessages_modelSectionTitle => 'Modèle d\'image';

  @override
  String get imageMessages_downloadModel => 'Télécharger';

  @override
  String get imageMessages_cancelDownload => 'Annuler';

  @override
  String get imageMessages_removeModel => 'Supprimer le modèle';

  @override
  String get imageMessages_modelReady => 'Prêt';

  @override
  String get imageMessages_modelNotPublished =>
      'Non publié — cette version ne peut pas le télécharger.';

  @override
  String get imageMessages_downloadFailed =>
      'Le modèle d\'image ne pouvait pas être téléchargé.';

  @override
  String get imageMessages_autoProcessTitle =>
      'Traiter automatiquement les images';

  @override
  String get imageMessages_autoProcessSubtitle =>
      'Reconstruisez chaque image dès son arrivée. Cela utilise environ 2 Go de mémoire pendant une seconde à chaque fois ; désactivez la reconstruction au toucher pour éviter cela.';

  @override
  String get translation_enableTitle => 'Activer la traduction';

  @override
  String get translation_enableSubtitle =>
      'Traduire les messages entrants et permettre la traduction avant l\'envoi.';

  @override
  String get translation_composerTitle => 'Traduire avant d\'envoyer';

  @override
  String get translation_composerSubtitle =>
      'Contrôle l\'état par défaut de l\'icône de traduction du composant.';

  @override
  String get translation_autoIncomingTitle =>
      'Traduire automatiquement les messages';

  @override
  String get translation_autoIncomingSubtitle =>
      'Traduit automatiquement les messages pour les notifications et pour les discussions ou les canaux.';

  @override
  String get translation_translateMessage => 'Traduire le message';

  @override
  String get translation_targetLanguage => 'Langue cible';

  @override
  String get translation_useAppLanguage =>
      'Utiliser la langue de l\'application';

  @override
  String get translation_downloadedModelLabel => 'Modèle téléchargé';

  @override
  String get translation_presetModelLabel => 'Modèle Hugging Face préconfiguré';

  @override
  String get translation_manualUrlLabel => 'URL du modèle manuel';

  @override
  String get translation_downloadModel => 'Télécharger le modèle';

  @override
  String get translation_downloading => 'Téléchargement...';

  @override
  String get translation_working => 'Au travail...';

  @override
  String get translation_stop => 'Arrêtez';

  @override
  String get translation_mergingChunks =>
      'Fusion des fragments téléchargés dans le fichier final...';

  @override
  String get translation_downloadedModels => 'Modèles téléchargés';

  @override
  String get translation_deleteModel => 'Supprimer le modèle';

  @override
  String get translation_modelDownloaded => 'Modèle de traduction téléchargé.';

  @override
  String get translation_downloadStopped =>
      'Le téléchargement a été interrompu.';

  @override
  String translation_downloadFailed(String error) {
    return 'Échec du téléchargement : $error';
  }

  @override
  String get translation_enterUrlFirst => 'Entrez d\'abord l\'URL du modèle.';

  @override
  String get scanner_linuxPairingShowPin => 'Afficher le code PIN';

  @override
  String get scanner_linuxPairingHidePin => 'Masquer le code PIN';

  @override
  String get scanner_linuxPairingPinTitle =>
      'Code PIN pour la connexion Bluetooth';

  @override
  String scanner_linuxPairingPinPrompt(String deviceName) {
    return 'Entrez le code PIN pour $deviceName (laissez vide si nécessaire).';
  }

  @override
  String get translation_messageTranslation => 'Traduction du message';

  @override
  String get translation_translateBeforeSending => 'Traduire avant d\'envoyer';

  @override
  String get translation_composerEnabledHint =>
      'Les messages seront traduits avant d\'être envoyés.';

  @override
  String get translation_composerDisabledHint =>
      'Envoyez des messages dans la langue originale, telle que vous l\'avez tapée.';

  @override
  String translation_translateTo(String language) {
    return 'Traduire en $language';
  }

  @override
  String get translation_translationOptions => 'Options de traduction';

  @override
  String get translation_systemLanguage => 'Langue du système';

  @override
  String get background_serviceTitle => 'MeshCore en cours d\'exécution';

  @override
  String get background_serviceText => 'Maintien de la connexion BLE';

  @override
  String appSettings_translationModelDeleted(String name) {
    return 'Supprimé $name';
  }

  @override
  String appSettings_translationModelDeleteFailed(String error) {
    return 'Échec de la suppression : $error';
  }

  @override
  String channels_channelUpdateFailed(String error) {
    return 'Échec de la mise à jour du canal : $error';
  }

  @override
  String get contact_typeChat => 'Chat';

  @override
  String get contact_typeRepeater => 'Répéteur';

  @override
  String get contact_typeRoom => 'Room';

  @override
  String get contact_typeSensor => 'Capteur';

  @override
  String get contact_typeUnknown => 'Inconnu';

  @override
  String get map_zoomIn => 'Zoom avant';

  @override
  String get map_zoomOut => 'Zoom arrière';

  @override
  String get map_centerMap => 'Centrer la carte';

  @override
  String get chrome_bluetoothRequiresChromium =>
      'Web Bluetooth nécessite un navigateur Chromium.';

  @override
  String channels_communityShortId(String id) {
    return 'ID : $id…';
  }

  @override
  String get pathTrace_legendGpsConfirmed => 'GPS confirmé';

  @override
  String get pathTrace_legendInferred => 'Position déduite';

  @override
  String get pathMap_viewSingle => 'Simple';

  @override
  String get pathMap_viewCombined => 'Combiné';

  @override
  String get pathMap_play => 'Lecture';

  @override
  String get pathMap_pause => 'Pause';

  @override
  String get pathMap_replay => 'Rejouer';

  @override
  String get pathMap_stepBack => 'Saut précédent';

  @override
  String get pathMap_stepForward => 'Saut suivant';

  @override
  String get pathMap_animationOn => 'Afficher l\'animation des paquets';

  @override
  String get pathMap_animationOff => 'Masquer l\'animation des paquets';

  @override
  String pathMap_hopOf(int current, int total) {
    return 'Saut $current sur $total';
  }

  @override
  String pathMap_observedPaths(int count) {
    return 'Chemins observés : $count';
  }

  @override
  String get pathMap_primary => 'Principal';

  @override
  String pathMap_alternate(int index) {
    return 'Alternative $index';
  }

  @override
  String pathMap_hopCount(int count) {
    String _temp0 = intl.Intl.pluralLogic(
      count,
      locale: localeName,
      other: '$count sauts',
      one: '1 saut',
    );
    return '$_temp0';
  }

  @override
  String pathMap_gpsCount(int confirmed, int total) {
    return '$confirmed/$total GPS';
  }

  @override
  String get pathMap_legendShared => 'Segment partagé';

  @override
  String get pathMap_legendEstimated => 'Segment estimé';

  @override
  String pathMap_sharedNodeCount(int count) {
    return 'Utilisé par $count chemins';
  }

  @override
  String pathMap_partialAnimation(int count) {
    String _temp0 = intl.Intl.pluralLogic(
      count,
      locale: localeName,
      other:
          '$count sauts n\'ont pas de localisation — le chemin indiqué est partiel',
      one: 'Un saut n\'a pas de localisation — le chemin indiqué est partiel',
    );
    return '$_temp0';
  }

  @override
  String get pathMap_showAllPaths => 'Afficher tout';

  @override
  String get pathMap_hidePath => 'Masquer le chemin';

  @override
  String get pathMap_showPath => 'Afficher le chemin';

  @override
  String get pathMap_collapsePanel => 'Réduire le panneau';

  @override
  String get pathMap_expandPanel => 'Développer le panneau';

  @override
  String get pathMap_noLocation => 'Aucune localisation';

  @override
  String get pathMap_followPacket => 'Verrouiller la vue sur le paquet';

  @override
  String get pathMap_unfollowPacket => 'Déverrouiller la vue du paquet';

  @override
  String get imageSend_title => 'Envoyer l\'image';

  @override
  String get imageSend_cropNote =>
      'Redimensionné à 512 × 512 · le rapport d’aspect n’a pas été conservé';

  @override
  String get imageSend_originalSize =>
      'Texte original\n\nVeuillez traduire le texte suivant en français :';

  @override
  String get imageSend_onAirSize => 'En direct';

  @override
  String get imageSend_quality => 'Qualité';

  @override
  String get imageSend_qualityStandard => 'Standard';

  @override
  String get imageSend_qualityHigh => 'Haut';

  @override
  String get imageSend_packetsLabel => 'Paquets';

  @override
  String get imageSend_airtimeLabel => 'Durée de diffusion';

  @override
  String get imageSend_sizeLabel => 'Charge utile';

  @override
  String imageSend_packetsCount(int count) {
    String _temp0 = intl.Intl.pluralLogic(
      count,
      locale: localeName,
      other: 'paquets',
      one: 'paquet',
    );
    return '$count $_temp0';
  }

  @override
  String imageSend_range(String min, String max) {
    return '$min–$max';
  }

  @override
  String get imageSend_unknownValue => '—';

  @override
  String get imageSend_radioUnknownTitle => 'Réglages de la radio inconnus';

  @override
  String get imageSend_radioUnknownBody =>
      'Connectez-vous à un appareil afin que l\'heure de diffusion puisse être calculée.';

  @override
  String get imageSend_longSendTitle => 'Longue transmission';

  @override
  String imageSend_longSendBody(String duration) {
    return 'Cela maintiendra la chaîne pendant environ $duration.';
  }

  @override
  String get imageSend_floodNote =>
      'Routage des inondations : chaque répéteur dans la zone retransmet chaque paquet, de sorte que le canal reste occupé plus longtemps que cela.';

  @override
  String get imageSend_parityTitle => 'Paquet de récupération';

  @override
  String get imageSend_paritySubtitle =>
      'Un paquet supplémentaire. Les messages de groupe ne sont pas reconnus, ce qui permet au destinataire de reconstruire l\'image si un seul paquet est perdu.';

  @override
  String get imageSend_send => 'Envoyer';

  @override
  String get imageSend_cancel => 'Annuler';

  @override
  String get imageSend_encodeFailed => 'Cette image ne peut pas être encodée.';

  @override
  String get imageSend_codecDownloading =>
      'Le modèle d\'image est toujours en téléchargement.';

  @override
  String get imageSend_codecUnavailable =>
      'L\'envoi d\'images n\'est pas disponible sur cet appareil.';

  @override
  String get imageSend_codecDisabled =>
      'Les messages d\'images sont désactivés dans les paramètres.';

  @override
  String get imageSend_deviceUnsupported =>
      'Cette radio ne peut pas envoyer de paquets d\'images. Connectez un appareil exécutant le firmware compagnon version 13 ou ultérieure.';

  @override
  String get imageSend_directMessagesUnsupported =>
      'Les images se déplacent en tant que données de groupe, elles ne peuvent donc être envoyées que sur un canal — et non par message direct.';

  @override
  String get imageSend_tooLarge =>
      'Cette image a été encodée en plus de paquets que le format de maillage ne permet.';

  @override
  String imageSend_sentConfirmation(int count) {
    String _temp0 = intl.Intl.pluralLogic(
      count,
      locale: localeName,
      other: 'paquets',
      one: 'paquet',
    );
    return 'Image envoyée en $count $_temp0.';
  }

  @override
  String imageSend_sendFailed(String error) {
    return 'L\'image n\'a pas pu être envoyée : $error';
  }

  @override
  String imageSend_sendingProgress(int sent, int total) {
    return 'Envoi de l\'image — paquet $sent sur $total';
  }

  @override
  String receivedImage_senderPrefix(String prefix) {
    return 'Nœud $prefix';
  }

  @override
  String receivedImage_incoming(int received, int total) {
    return '$received sur $total paquets';
  }

  @override
  String get receivedImage_queued => 'En attendant de décoder';

  @override
  String get receivedImage_tapToDecode => 'Tapez pour décoder';

  @override
  String get receivedImage_decoding => 'Reconstitution… d’environ 1 s';

  @override
  String receivedImage_incomplete(int received, int total) {
    return 'Image incomplète — $received sur $total paquets reçus';
  }

  @override
  String get receivedImage_corrupt =>
      'L\'image ne pouvait pas être reconstruite';

  @override
  String get receivedImage_decoderMissing =>
      'Image reçue — le décodage de l\'image est interrompu';

  @override
  String get receivedImage_evicted => 'Image non stockée';

  @override
  String get receivedImage_retry => 'Réessayez';

  @override
  String get receivedImage_decodeAgain => 'Décoder à nouveau';

  @override
  String get receivedImage_openSettings => 'Mettre en place';

  @override
  String get receivedImage_tapToProcess => 'Tapez pour traiter';

  @override
  String receivedImage_awaiting(int bytes, int packets) {
    String _temp0 = intl.Intl.pluralLogic(
      packets,
      locale: localeName,
      other: 'paquets',
      one: 'paquet',
    );
    return '$bytes octets · $packets $_temp0';
  }

  @override
  String imageSend_secondsValue(String seconds) {
    return '$seconds s';
  }

  @override
  String imageSend_minutesSecondsValue(String minutes, String seconds) {
    return '$minutes minutes $seconds secondes';
  }
}
