<?php
return [
    'app.title' => 'Mon Application',
    'app.welcome' => 'Bienvenue',
    'app.copyright' => '© {year} {app}',
    'app.description' => 'Application web avec gestion des utilisateurs',
    'nav.home' => 'Accueil',
    'nav.about' => 'À propos',
    'nav.doc' => 'Documentation',
    'doc.title' => 'Documentation',
    'doc.cat_general_admin' => 'Administration générale',
    'doc.cat_module_admin' => 'Administration des modules',
    'doc.cat_general_user' => 'Guide d\'utilisation général',
    'doc.cat_module_user' => 'Guides d\'utilisation des modules',
    'doc.empty' => 'Aucune documentation disponible pour votre profil.',
    'doc.back' => 'Retour à la documentation',
    'nav.login' => 'Connexion',
    'nav.logout' => 'Déconnexion',
    'nav.profile' => 'Mon profil',
    'nav.admin' => 'Administration',
    'nav.settings' => 'Paramètres',
    'nav.users' => 'Utilisateurs',
    'auth.username' => 'Identifiant ou e-mail',
    'auth.password' => 'Mot de passe',
    'auth.password_new' => 'Nouveau mot de passe',
    'auth.password_conf' => 'Confirmer le mot de passe',
    'auth.password_keep' => 'Laisser vide pour conserver le mot de passe actuel',
    'auth.login' => 'Se connecter',
    'auth.logout' => 'Se déconnecter',
    'auth.remember' => 'Se souvenir de moi',
    'auth.login_title' => 'Connexion',
    'auth.login_error' => 'Nom d\'utilisateur ou mot de passe incorrect.',
    'auth.too_many_attempts' => 'Trop de tentatives de connexion. Réessayez dans quelques minutes.',
    'auth.login_inactive' => 'Ce compte est désactivé.',
    'auth.logout_success' => 'Vous avez été déconnecté.',
    'auth.no_access' => 'Accès refusé. Permissions insuffisantes.',
    'auth.method' => 'Méthode d\'authentification',
    'auth.method_local' => 'Compte applicatif',
    'auth.method_oauth' => 'OAuth / SSO',
    'auth.method_ldap' => 'LDAP / Active Directory',
    'auth.or_use' => 'Ou se connecter avec :',
    'user.list' => 'Liste des utilisateurs',
    'user.create' => 'Créer un utilisateur',
    'user.edit' => 'Modifier',
    'user.delete' => 'Supprimer',
    'user.confirm_delete' => 'Êtes-vous sûr de vouloir supprimer l\'utilisateur « {username} » ?',
    'user.profile' => 'Rôle',
    'user.roles' => 'Rôles',
    'user.roles_hint' => 'Sélectionnez un ou plusieurs rôles. L\'app_admin (système) accorde tous les droits sur tous les modules.',
    'user.roles_system' => 'Système',
    'user.role_self_locked' => 'verrouillé : vous ne pouvez pas retirer votre propre rôle d\'administrateur',
    'user.language' => 'Langue',
    'user.theme' => 'Thème',
    'user.postgresql_prefs' => 'Préférences PostgreSQL',
    'user.postgresql_landing' => 'Page d\'accueil après sélection d\'une base',
    'user.postgresql_landing_hint' => 'Page sur laquelle vous arrivez après avoir choisi une base PostgreSQL. Réglable aussi en un clic depuis le bouton flottant des pages de rapport.',
    'user.oracle_prefs' => 'Préférences Oracle',
    'user.oracle_landing' => 'Page d\'accueil après sélection d\'une base',
    'user.oracle_landing_hint' => 'Page sur laquelle vous arrivez après avoir choisi une base de données Oracle.',
    'user.oracle_report_format' => 'Format des rapports Oracle',
    'user.oracle_format_html' => 'HTML statique',
    'user.oracle_format_active' => 'Dynamique (quand disponible)',
    'user.oracle_format_hint' => 'Concerne ASH et SQL Monitor. AWR n\'a pas de format dynamique.',
    'user.active' => 'Actif',
    'user.inactive' => 'Inactif',
    'user.created_at' => 'Créé le',
    'user.last_login' => 'Dernière connexion',
    'user.email' => 'Email',
    'user.password' => 'Mot de passe',
    'user.save' => 'Enregistrer',
    'user.cancel' => 'Annuler',
    'user.never' => 'Jamais',
    'user.actions' => 'Actions',
    'role.app_admin' => 'Administrateur de l\'application',
    'role.oracle_admin' => 'Administrateur Oracle',
    'role.oracle_user' => 'Utilisateur Oracle',
    'role.cmdb_admin' => 'Administrateur CMDB',
    'role.cmdb_user' => 'Utilisateur CMDB',
    'role.cnp_admin' => 'Administrateur CNP',
    'role.cnp_user' => 'Utilisateur CNP',
    'theme.label' => 'Thème',
    'theme.os' => 'Thème du système',
    'theme.light' => 'Clair',
    'theme.dark' => 'Sombre',
    'theme.colorblind' => 'Contraste élevé / Daltonien',
    'theme.custom' => 'Personnalisé',
    'lang.label' => 'Langue',
    'lang.fr' => 'Français',
    'lang.en' => 'English',
    'lang.pl' => 'Polski',
    'lang.it' => 'Italiano',
    'lang.es' => 'Español',
    'lang.ro' => 'Română',
    'lang.de' => 'Deutsch',
    'settings.title' => 'Paramètres de l\'application',
    'settings.app_name' => 'Nom de l\'application',
    'settings.app_logo' => 'Logo',
    'settings.app_logo_hint' => 'PNG, JPG, SVG, WebP — max 2 Mo',
    'settings.app_favicon' => 'Favicon',
    'settings.app_favicon_hint' => 'PNG, ICO, SVG — max 512 Ko. Conseillé : 32×32 px',
    'settings.app_logo_del' => 'Supprimer le logo',
    'settings.app_favicon_del' => 'Supprimer la favicon',
    'settings.appearance' => 'Apparence',
    'settings.default_theme' => 'Thème par défaut',
    'settings.default_lang' => 'Langue par défaut',
    'settings.auth_methods' => 'Méthodes d\'authentification',
    'settings.smtp_title' => 'Email (SMTP)',
    'settings.smtp_hint' => 'Configuration du serveur SMTP pour l\'envoi d\'emails (notifications, alertes).',
    'settings.smtp_host' => 'Serveur SMTP',
    'settings.smtp_port' => 'Port',
    'settings.smtp_encryption' => 'Chiffrement',
    'settings.smtp_enc_none' => 'Aucun',
    'settings.smtp_auth_enabled' => 'Authentification SMTP',
    'settings.smtp_auth_hint' => 'Décocher si le serveur est un relais interne qui n\'exige pas d\'identifiants.',
    'settings.smtp_username' => 'Utilisateur',
    'settings.smtp_password' => 'Mot de passe',
    'settings.smtp_from_address' => 'Adresse expéditeur',
    'settings.smtp_from_name' => 'Nom expéditeur',
    'settings.smtp_test' => 'Tester la connexion',
    'settings.smtp_test_send' => 'Envoyer un test',
    'settings.smtp_test_ok' => 'Connexion SMTP réussie.',
    'settings.smtp_test_sent' => 'E-mail de test envoyé. Vérifiez votre boîte de réception.',
    'settings.smtp_test_rcpt_placeholder' => 'adresse@destinataire.com',
    'settings.smtp_test_rcpt_required' => 'Saisissez une adresse e-mail destinataire pour le test.',
    'settings.smtp_test_subject' => 'Configuration SMTP validée',
    'settings.smtp_test_body' => 'Si vous recevez cet e-mail, la configuration SMTP de l\'application est correcte.',
    'settings.smtp_host_required' => 'Le serveur SMTP n\'est pas configuré.',
    'report_sub.title' => 'Abonnements rapports',
    'report_sub.schedules_title' => 'Planification des rapports',
    'report_sub.matrix_title' => 'Abonnements utilisateurs',
    'report_sub.save' => 'Enregistrer',
    'report_sub.saved' => 'Abonnements enregistrés.',
    'report_sub.col_user' => 'Utilisateur',
    'report_sub.col_email' => 'E-mail',
    'report_sub.no_users' => 'Aucun utilisateur actif avec une adresse e-mail.',
    'report_sub.frequency_daily' => 'Quotidien',
    'report_sub.frequency_weekly' => 'Hebdomadaire',
    'report_sub.frequency_monthly' => 'Mensuel',
    'report_sub.day_of_month' => 'Jour du mois',
    'report_sub.logical_day' => 'Jour logique',
    'report_sub.dow_1' => 'Lundi',
    'report_sub.dow_2' => 'Mardi',
    'report_sub.dow_3' => 'Mercredi',
    'report_sub.dow_4' => 'Jeudi',
    'report_sub.dow_5' => 'Vendredi',
    'report_sub.dow_6' => 'Samedi',
    'report_sub.dow_7' => 'Dimanche',
    'report_sub.logical_first_monday' => '1er lundi',
    'report_sub.logical_first_tuesday' => '1er mardi',
    'report_sub.logical_first_wednesday' => '1er mercredi',
    'report_sub.logical_first_thursday' => '1er jeudi',
    'report_sub.logical_first_friday' => '1er vendredi',
    'report_sub.logical_last_monday' => 'Dernier lundi',
    'report_sub.logical_last_friday' => 'Dernier vendredi',
    'report_sub.logical_last_day' => 'Dernier jour',
    'report_sub.report_cnp_ad_anomalies' => 'Anomalies AD (CNP)',
    'report_sub.report_cmdb_db_inventory' => 'Inventaire BDD (CMDB)',
    'report_sub.report_cnp_cmdb_sync' => 'Sync CMDB/Oracle (CNP)',
    'report_sub.subject_cnp_ad_anomalies' => 'Rapport : Anomalies AD',
    'report_sub.subject_cmdb_db_inventory' => 'Rapport : Inventaire des bases de données',
    'report_sub.subject_cnp_cmdb_sync' => 'Rapport : Synchronisation CMDB / Oracle',
    'report_sub.view_online' => 'Voir en ligne',
    'report_sub.total_databases' => 'Total bases',
    'report_sub.log_title' => 'Derniers envois',
    'report_sub.log_date' => 'Date',
    'report_sub.log_report' => 'Rapport',
    'report_sub.log_recipients' => 'Destinataires',
    'report_sub.log_status' => 'Statut',
    'report_sub.no_active_module' => 'Aucun rapport à proposer : tous dépendent de modules actuellement désactivés. Activez le module concerné pour retrouver sa planification et ses abonnés — ils sont conservés.',
    'settings.oauth_config' => 'Configuration OAuth',
    'settings.ldap_config' => 'Configuration LDAP',
    'settings.save' => 'Enregistrer',
    'settings.debug_mode' => 'Mode débogage',
    'settings.trace_mode' => 'Mode trace',
    'settings.session_section' => 'Session',
    'settings.session_lifetime' => 'Durée de la session',
    'settings.session_lifetime_unit' => 'secondes',
    'settings.session_lifetime_hint' => 'Entre 300 (5 min) et 86 400 (24 h). Par défaut : 3 600 (1 h).',
    'settings.enabled' => 'Activé',
    'settings.disabled' => 'Désactivé',
    'settings.client_id' => 'Client ID',
    'settings.client_secret' => 'Client Secret',
    'settings.redirect_uri' => 'URI de redirection',
    'settings.auth_url' => 'URL d\'autorisation',
    'settings.token_url' => 'URL du token',
    'settings.ldap_host' => 'Hôte LDAP',
    'settings.ldap_port' => 'Port LDAP',
    'settings.ldap_base_dn' => 'Base DN',
    'settings.ldap_bind_dn' => 'DN de connexion',
    'settings.ldap_bind_pass' => 'Mot de passe de connexion',
    'settings.ldap_user_dn_pattern' => 'Format du DN utilisateur',
    'settings.ldap_user_dn_pattern_hint' => 'Placeholders : {user}, {base_dn}, {domain}. Ex. OpenLDAP : uid={user},{base_dn} — AD UPN : {user}@{domain}',
    'settings.ldap_tls_insecure' => 'Ignorer la vérification du certificat TLS (LDAPS)',
    'settings.ldap_tls_insecure_hint' => 'À n\'utiliser que pour diagnostiquer ; en production, installer la CA dans le magasin de confiance du serveur web.',
    'settings.ldap_test_section' => 'Test de configuration',
    'settings.ldap_test_btn' => 'Tester la configuration',
    'settings.ldap_test_user' => 'Utilisateur de test',
    'settings.ldap_test_user_hint' => 'Optionnel — pour tester un bind utilisateur réel',
    'settings.ldap_test_pass' => 'Mot de passe de test',
    'settings.ldap_test_running' => 'Test en cours…',
    'settings.ldap_test_ok' => 'Configuration LDAP valide',
    'settings.ldap_test_ko' => 'Échec du test LDAP',
    'settings.ldap_test_step_ext_ko' => 'Extension PHP ldap absente — activez extension=ldap dans php.ini',
    'settings.ldap_test_step_ext_ok' => 'Extension PHP ldap chargée',
    'settings.ldap_test_step_host_ko' => 'Hôte LDAP non renseigné',
    'settings.ldap_test_step_connect_ko' => 'ldap_connect() a échoué — paramètres invalides',
    'settings.ldap_test_step_connect_ok' => 'Connexion initialisée (LDAPv3, timeout 5 s)',
    'settings.ldap_test_step_svc_ok' => 'Bind de service réussi',
    'settings.ldap_test_step_svc_ko' => 'Bind de service échoué',
    'settings.ldap_test_step_anon_ok' => 'Bind anonyme réussi',
    'settings.ldap_test_step_anon_warn' => 'Bind anonyme refusé (normal sur Active Directory)',
    'settings.ldap_test_step_user_ok' => 'Bind utilisateur réussi',
    'settings.ldap_test_step_user_ko' => 'Bind utilisateur échoué',
    'settings.ldap_test_step_user_no_base' => 'Base DN manquante — impossible de construire le DN utilisateur',
    'admin.title' => 'Administration',
    'admin.dashboard' => 'Tableau de bord',
    'admin.total_users' => 'Utilisateurs total',
    'admin.active_users' => 'Utilisateurs actifs',
    'admin.welcome' => 'Bienvenue dans le panneau d\'administration.',
    'msg.save' => 'Enregistrer',
    'msg.cancel' => 'Annuler',
    'msg.saved' => 'Modifications enregistrées avec succès.',
    'msg.error' => 'Une erreur est survenue.',
    'msg.warning' => 'Avertissement',
    'msg.deleted' => 'Suppression effectuée.',
    'msg.access_denied' => 'Accès refusé.',
    'msg.not_found' => 'Page introuvable.',
    'msg.server_error' => 'Erreur interne du serveur.',
    'msg.required_fields' => 'Veuillez remplir tous les champs obligatoires.',
    'msg.passwords_mismatch' => 'Les mots de passe ne correspondent pas.',
    'msg.password_changed' => 'Mot de passe modifié avec succès.',
    'msg.user_created' => 'Utilisateur créé avec succès.',
    'msg.user_updated' => 'Utilisateur modifié avec succès.',
    'msg.user_deleted' => 'Utilisateur supprimé.',
    'msg.username_taken' => 'Ce nom d\'utilisateur est déjà utilisé.',
    'msg.ldap_user_not_found' => 'Cet identifiant n\'existe pas dans l\'annuaire LDAP.',
    'module.title' => 'Modules',
    'module.list' => 'Liste des modules',
    'module.manage' => 'Gérer les modules',
    'module.name' => 'Module',
    'module.status' => 'Statut',
    'module.active' => 'Actif',
    'module.inactive' => 'Inactif',
    'module.active_count' => 'module(s) actif(s)',
    'module.enable' => 'Activer',
    'module.enable_required' => 'Activer {module} et ses dépendances',
    'module.enable_required_confirm' => 'Activer le module « {module} » et tous les modules dont il dépend ?',
    'module.enable_required_summary' => '{n} module(s) activé(s) : {list}.',
    'module.enable_required_none' => 'Le module et ses dépendances sont déjà actifs.',
    'module.enable_required_failed' => '{n} module(s) non activé(s) :',
    'module.disable' => 'Désactiver',
    'module.open' => 'Ouvrir',
    'module.roles' => 'Rôles',
    'module.depends_on' => 'Dépend de',
    'module.none_registered' => 'Aucun module enregistré.',
    'module.confirm_disable' => 'Désactiver le module « {label} » ?',
    'module.warn_users_linked' => '{n} utilisateur(s) actif(s) ont le rôle « {role} ». Ils ne pourront plus accéder au module.',
    'module.deps_missing' => 'Impossible d\'activer « {module} » : module(s) requis non actif(s) — {deps}',
    'module.deps_dependents' => 'Impossible de désactiver « {module} » : encore utilisé par {dependents}',
    'module.enable_failed' => 'L\'activation du module a échoué',
    'module.provision_summary' => '{created} utilisateur(s) créé(s), {roles} rôle(s) attribué(s).',
    'module.add_title' => 'Ajouter ou mettre à jour un module',
    'module.add_hint' => 'Téléversez une archive ZIP contenant un unique dossier de module (avec son module.php à la racine du dossier). Si le module n\'existe pas encore, il est ajouté désactivé ; s\'il existe déjà, il est mis à jour en place — ses rôles et leurs affectations aux utilisateurs, sa configuration et ses données sont conservés. La version précédente est sauvegardée avant remplacement.',
    'module.zip_label' => 'Archive ZIP du module',
    'module.add_apply' => 'Appliquer',
    'module.remove' => 'Supprimer',
    'module.confirm_delete' => 'Supprimer le module « {label} » et toutes ses données (rôles, config) ?',
    'module.cannot_delete_active' => 'Impossible de supprimer un module actif. Désactivez-le d\'abord.',
    'module.upload_error' => 'Erreur lors du téléversement du fichier.',
    'module.upload_invalid_zip' => 'Le fichier n\'est pas une archive ZIP valide.',
    'module.upload_bad_structure' => 'Le ZIP doit contenir un unique dossier de module à la racine.',
    'module.upload_no_descriptor' => 'Le ZIP ne contient pas de module.php à la racine du dossier de module.',
    'module.upload_exists' => 'Un module « {name} » existe déjà.',
    'module.upload_extract_failed' => 'Échec de l\'extraction du module.',
    'module.upload_success' => 'Module « {name} » ajouté (désactivé). Activez-le pour l\'utiliser.',
    'module.update_success' => 'Module « {name} » mis à jour (v{from} → v{to}). Ses rôles, sa configuration et ses données ont été conservés. Sauvegarde de la version précédente : {backup}',
    'module.update_failed' => 'La mise à jour du module « {name} » a échoué : le dossier existant n\'a pas pu être écarté. Rien n\'a été modifié.',
    'module.update_backup_failed' => 'La sauvegarde de la version installée a échoué. La mise à jour a été annulée, rien n\'a été modifié.',
    'module.update_rollback' => 'La mise à jour du module « {name} » a échoué ; la version précédente a été restaurée.',
    'module.update_rollback_failed' => 'La mise à jour du module « {name} » a échoué ET la version précédente n\'a pas pu être restaurée. L\'application reste en maintenance : restaurez la sauvegarde {backup} (téléversez-la ici), puis levez la maintenance.',
    'module.update_name_mismatch' => 'Archive incohérente : le dossier est « {name} » mais le descripteur déclare « {decl} ». Rien n\'a été modifié.',
    'module.update_on_enable_warn' => 'Module « {name} » mis à jour, mais son initialisation a signalé une erreur : {error}',
    'module.delete_success' => 'Module supprimé.',
    'module.delete_failed' => 'Le dossier du module « {name} » n\'a pas pu être entièrement supprimé.',
    'module.dev_php_env' => 'Environnement PHP',
    'module.dev_ini' => 'Configuration php.ini',
    'module.dev_session' => 'Session courante',
    'module.dev_extensions' => 'Extensions chargées',
    'module.dev_logs' => 'Journaux récents',
    'module.dev_no_logs' => 'Aucune entrée de journal.',
    'module.dev_db_file' => 'Base de données',
    'home.title' => 'Accueil',
    'home.logged_in' => 'Vous êtes connecté en tant que <strong>{username}</strong> ({role}).',
    'home.visitor' => 'Vous naviguez en tant que visiteur. <a href="/login.php">Connectez-vous</a> pour accéder à plus de fonctionnalités.',
    'admin.maintenance' => 'Maintenance',

    // ── Batchs / Ordonnancement ───────────────────────────────────────────
    'batch.title' => 'Batchs / Ordonnancement',
    'batch.card_desc' => 'Planification des tâches (crontab / planificateur Windows), état et journaux.',
    'batch.manage' => 'Gérer les batchs',
    'batch.schedule_title' => 'Planning proposé',
    'batch.schedule_intro' => 'Tâches planifiées de l\'application et leur fréquence.',
    'batch.col_job' => 'Tâche',
    'batch.col_schedule' => 'Planification (cron)',
    'batch.col_command' => 'Commande',
    'batch.col_state' => 'État',
    'batch.state_active' => 'Active',
    'batch.state_inactive' => 'Inactive',
    'batch.job_logrotate' => 'Rotation des logs',
    'batch.job_backup' => 'Sauvegarde',
    'batch.job_collect_ash' => 'Collecte ASH',
    'batch.job_collect_cmdb' => 'Collecte CMDB',
    'batch.job_collect_rman' => 'Collecte RMAN',
    'batch.job_collect_users' => 'Inventaire utilisateurs Oracle',
    'batch.job_schedule_reports' => 'Envoi des rapports planifiés',
    'batch.job_remediate' => 'Remédiation utilisateurs Oracle',
    'batch.job_provision' => 'Provisionnement utilisateurs Oracle',
    'batch.install' => 'Activer (installer la crontab)',
    'batch.uninstall' => 'Désactiver (retirer de la crontab)',
    'batch.confirm_install' => 'Installer les tâches dans la crontab de l\'utilisateur apache ?',
    'batch.confirm_uninstall' => 'Retirer les tâches de l\'application de la crontab ?',
    'batch.apache_note' => 'Opère sur la crontab de l\'utilisateur du serveur web (apache).',
    'batch.crontab_title' => 'Crontab courante',
    'batch.crontab_empty' => 'Aucune crontab pour l\'utilisateur courant.',
    'batch.windows_title' => 'Windows (planificateur de tâches)',
    'batch.windows_intro' => 'Commandes schtasks à exécuter dans une invite Administrateur (hôte Windows).',
    'batch.logs_title' => 'Dernières exécutions',
    'batch.logs_rman' => 'Collecte RMAN',
    'batch.logs_ash' => 'Collecte ASH',
    'batch.logs_backups' => 'Sauvegardes',
    'batch.logs_applog' => 'Journal applicatif',
    'batch.logs_none' => 'Aucune donnée.',
    'batch.col_when' => 'Le',
    'batch.col_result' => 'Résultat',
    'batch.col_source' => 'Source',
    'batch.col_day' => 'Jour',
    'batch.col_rows' => 'Lignes',
    'batch.failed' => 'Échec',
    'batch.shell_unavailable' => 'Exécution shell indisponible (crontab non gérable depuis le web).',
    'batch.already_installed' => 'Toutes les tâches sont déjà présentes dans la crontab.',
    'batch.install_ok' => '{n} tâche(s) ajoutée(s) à la crontab.',
    'batch.uninstall_ok' => 'Tâches de l\'application retirées de la crontab.',
    'batch.crontab_error' => 'Impossible de mettre à jour la crontab.',
    'backup.title' => 'Sauvegarde & Restauration',
    'backup.overview' => 'Métadonnées applicatives',
    'backup.overview_hint' => 'Contenu du répertoire sécurisé : base de données, clé de chiffrement, wallets Oracle Cloud.',
    'backup.files_count' => 'Fichiers',
    'backup.total_size' => 'Taille totale',
    'backup.create_title' => 'Créer une sauvegarde',
    'backup.create_hint' => 'Crée une archive ZIP de l\'intégralité du répertoire sécurisé (hors sauvegardes précédentes). La sauvegarde peut être stockée sur le serveur ou téléchargée.',
    'backup.save_local' => 'Sauvegarder sur le serveur',
    'backup.download' => 'Télécharger',
    'backup.created_ok' => 'Sauvegarde « %s » créée (%d fichiers).',
    'backup.restore_title' => 'Restaurer une sauvegarde',
    'backup.restore_hint' => 'Téléversez une archive ZIP créée par cette page pour restaurer les métadonnées. Une sauvegarde de l\'état actuel sera créée automatiquement avant la restauration.',
    'backup.restore_label' => 'Archive ZIP de sauvegarde',
    'backup.restore_apply' => 'Restaurer',
    'backup.restore_confirm' => 'Êtes-vous sûr de vouloir restaurer cette sauvegarde ? L\'état actuel sera sauvegardé au préalable.',
    'backup.restore_this' => 'Restaurer cette sauvegarde',
    'backup.restored_ok' => '%d fichier(s) restauré(s). Sauvegarde pré-restauration : %s',
    'backup.local_list' => 'Sauvegardes locales',
    'backup.no_backups' => 'Aucune sauvegarde locale.',
    'backup.col_name' => 'Fichier',
    'backup.col_size' => 'Taille',
    'backup.col_date' => 'Date',
    'backup.delete_confirm' => 'Supprimer la sauvegarde « %s » ?',
    'backup.deleted_ok' => 'Sauvegarde « %s » supprimée.',
    'backup.invalid_file' => 'Nom de fichier invalide.',
    'backup.securite_missing' => 'Le répertoire sécurisé n\'existe pas.',
    'backup.create_error' => 'Impossible de créer l\'archive ZIP.',
    'update.title' => 'Mise à jour',
    'update.current_version' => 'Version actuelle',
    'update.upload_title' => 'Téléverser une mise à jour',
    'update.upload_hint' => 'Sélectionnez une archive ZIP contenant les fichiers de mise à jour. La base de données et la clé de chiffrement ne seront pas écrasées.',
    'update.zip_label' => 'Archive ZIP de mise à jour',
    'update.apply' => 'Appliquer la mise à jour',
    'update.confirm' => 'Êtes-vous sûr de vouloir appliquer cette mise à jour ? Une sauvegarde sera créée automatiquement.',
    'update.upload_error' => 'Erreur lors du téléversement du fichier.',
    'update.invalid_zip' => 'Le fichier n\'est pas une archive ZIP valide.',
    'update.zip_ext_missing' => 'L\'extension PHP ZipArchive n\'est pas disponible sur ce serveur.',
    'update.empty_archive' => 'L\'archive ne contient aucun fichier à extraire (tous les fichiers sont protégés ou l\'archive est vide).',
    'update.success' => '%d fichier(s) mis à jour avec succès.',
    'update.backup_created' => 'Sauvegarde créée : %s',
    'update.deleted' => '%d élément(s) de l\'ancienne version supprimé(s).',
    'update.full_backup_created' => 'Sauvegarde complète : %s',
    'update.backup_failed' => 'Échec de la sauvegarde préalable — mise à jour annulée, aucun fichier supprimé.',
    'update.maintenance_failed' => 'Extraction incomplète : l\'application reste en mode maintenance. Restaurez la sauvegarde %s (Sauvegarde/Restauration) ou relancez la mise à jour.',
    'update.maintenance_active' => 'L\'application est actuellement en mode maintenance (visible des seuls administrateurs).',
    'update.clear_maintenance' => 'Sortir du mode maintenance',
    'update.maintenance_cleared' => 'Mode maintenance désactivé.',
    'update.danger_hint' => 'La mise à jour passe l\'application en maintenance, sauvegarde puis EFFACE l\'ancienne version (sauf securite/ et log/), puis extrait la nouvelle.',
    'update.pruned' => '%d ancienne(s) sauvegarde(s) purgée(s).',
    'update.restore_success' => 'Version restaurée depuis %s :',
    'update.backup_deleted' => 'Sauvegarde supprimée : %s',
    'update.backup_not_found' => 'Sauvegarde introuvable ou nom invalide.',
    'update.delete_failed' => 'Échec de la suppression de la sauvegarde.',
    'update.backups_title' => 'Versions précédentes (sauvegardes)',
    'update.backups_hint' => 'Les 3 dernières versions sont conservées automatiquement. Vous pouvez restaurer ou supprimer une version.',
    'update.backups_empty' => 'Aucune sauvegarde disponible.',
    'update.backup_latest' => 'dernière',
    'update.restore' => 'Restaurer',
    'update.restore_confirm' => 'Restaurer cette version remplacera la version actuelle (clean replace). Continuer ?',
    'update.delete_backup' => 'Supprimer',
    'update.delete_backup_confirm' => 'Supprimer définitivement cette sauvegarde ?',
    'update.protected_dirs' => 'Données et journaux toujours préservés',
    'update.git_kept' => 'Métadonnées git préservées (module Developer présent)',
    'update.git_removed' => 'Métadonnées git supprimées (instance packagée)',
    'update.partial_errors' => '%d fichier(s) n\'ont pas pu être extraits :',
    'update.skipped_files' => '%d fichier(s) protégé(s) ignoré(s) :',
    'update.protected_title' => 'Fichiers protégés',
    'update.protected_hint' => 'Les fichiers suivants ne seront jamais écrasés par une mise à jour, même s\'ils sont présents dans l\'archive :',
    'update.protected_db' => 'Base de données applicative',
    'update.protected_key' => 'Clé maître de chiffrement',
    'update.protected_wallets' => 'Wallets Oracle Cloud',
    'maintenance.title' => 'Maintenance en cours',
    'maintenance.message' => 'L\'application est temporairement indisponible pour maintenance. Merci de réessayer dans quelques instants.',
    'about.title' => 'À propos',
    'about.version' => 'Version',
    'about.libraries' => 'Bibliothèques tierces',
    'about.lib_name' => 'Bibliothèque',
    'about.lib_version' => 'Version',
    'about.lib_license' => 'Licence',
    'about.license_title' => 'Licence',
    'about.license_rights' => 'Tous droits réservés.',
    'about.license_grant' => 'Ce logiciel est mis à disposition sous licence propriétaire, non exclusive et incessible. L\'auteur accorde à l\'acquéreur un droit d\'utilisation du logiciel dans sa forme originale, sans transfert de propriété.',
    'about.license_conditions' => 'Sous réserve des conditions suivantes :',
    'about.license_cond_attribution' => '<strong>Attribution</strong> — L\'origine du logiciel et le nom de l\'auteur doivent être conservés dans le code source et la documentation technique. L\'interface présentée aux utilisateurs finaux peut, elle, être personnalisée (voir « Marque blanche »).',
    'about.license_cond_no_derivs' => '<strong>Pas de modification</strong> — Le code du logiciel ne peut être modifié, transformé ou utilisé comme base d\'une œuvre dérivée sans autorisation écrite préalable de l\'auteur, à l\'exception de la personnalisation de l\'identité visuelle (titre, logo, favicon, thème) prévue par l\'application.',
    'about.license_cond_commercial' => '<strong>Pas de cession — marque blanche autorisée</strong> — Le logiciel ne peut être cédé, revendu ni sous-licencié en tant que produit. L\'acquéreur peut en revanche l\'exploiter et le proposer à ses propres clients en marque blanche, sous sa propre identité visuelle, sans transfert de la propriété de la licence.',
    'about.license_disclaimer' => 'LE LOGICIEL EST FOURNI « EN L\'ÉTAT », SANS GARANTIE D\'AUCUNE SORTE, EXPRESSE OU IMPLICITE, Y COMPRIS MAIS SANS S\'Y LIMITER LES GARANTIES DE QUALITÉ MARCHANDE, D\'ADÉQUATION À UN USAGE PARTICULIER ET D\'ABSENCE DE CONTREFAÇON.',
    'about.license_compat' => 'Licence propriétaire et incessible : le logiciel peut être exploité en marque blanche mais ne peut être ni cédé ni revendu.',
    'backup.include_key' => 'Inclure la clé de chiffrement (master.key) — reprise complète',
    'backup.include_key_warn' => '⚠ Sans la clé, le backup ne suffit pas à déchiffrer les secrets : sauvegardez master.key séparément. Avec la clé, protégez le fichier (il contient TOUS les secrets).',
];
