{ "dashboard": "Tableau de bord", "nav.pages": "Pages", "nav.messages": "Messages", "nav.news": "Actualités", "nav.events": "Événements", "nav.settings": "Paramètres", "nav.logout": "Déconnexion", "nav.collapse_sidebar": "Réduire", "nav.expand_sidebar": "Déployer", "nav.view_site": "Voir le site", "btn.load": "Charger", "btn.save": "Enregistrer", "btn.cancel": "Annuler", "btn.confirm": "Confirmer", "btn.close": "Fermer", "btn.back": "Retour", "btn.delete": "Supprimer", "btn.browse": "Parcourir", "btn.clear": "Effacer", "btn.refresh": "Actualiser", "btn.restore": "Restaurer", "btn.saving": "Enregistrement...", "btn.changing": "Modification...", "pages.title": "Pages", "pages.new_page": "+ Nouvelle page", "pages.trash": "Corbeille", "pages.col_title": "Titre", "pages.col_date": "Dernière modification", "pages.edit": "Modifier", "pages.view": "Voir", "pages.duplicate": "Dupliquer", "pages.create": "+ Créer", "pages.all_pages": "Toutes les pages", "pages.back_to_pages": "Retour aux pages", "trash.title": "Corbeille", "trash.col_page": "Page", "trash.col_deleted": "Supprimée le", "trash.col_actions": "Actions", "trash.empty": "La corbeille est vide.", "trash.empty_trash": "Vider la corbeille", "editor.title": "Éditeur de contenu", "editor.expand_all": "Tout déplier", "editor.collapse_all": "Tout replier", "editor.not_saved_yet": "Pas encore enregistré", "editor.last_saved": "Dernier enregistrement : {date}", "editor.move_to_trash": "Mettre à la corbeille", "editor.undo": "Annuler (⌘Z)", "editor.redo": "Rétablir (⇧⌘Z)", "editor.meta_page": "Page :", "editor.meta_lang": "Langue :", "editor.items": "{count} éléments", "editor.fields": "{count} champs", "editor.field_groups": "Field groups", "editor.field_groups_count": "{count} field groups", "editor.add_item": "+ Ajouter un élément", "editor.add_section": "Ajouter une nouvelle section :", "editor.no_sections": "No sections yet.", "editor.search_sections": "Rechercher des sections", "editor.filter_all_types": "Tous les types", "editor.compact_mode": "Compact", "editor.expand_section": "Déplier la section", "editor.collapse_section": "Replier la section", "editor.insert_section": "Insérer une section", "editor.insert_here": "Insérer ici", "editor.section_issues": "{count} remarques", "editor.section_issue": "{count} remarque", "editor.no_section_matches": "Aucune section correspondante.", "editor.drag_section": "Faire glisser la section", "editor.missing_media": "Chemin du média manquant", "editor.missing_alt": "Texte alternatif manquant", "editor.duplicate_h1": "Titre H1 supplémentaire", "editor.select_image": "Sélectionner une image", "editor.tab_content": "Content", "editor.sections": "Sections", "editor.page_settings": "Page Settings", "editor.meta_title": "Title", "editor.meta_description": "Description", "editor.nav_locations": "Navigation", "editor.nav_custom_hint": "Custom, e.g. sidebar", "editor.breadcrumb": "Breadcrumb", "editor.breadcrumb_label": "Label", "editor.breadcrumb_href": "Link (slug)", "editor.breadcrumb_add": "Add item", "editor.breadcrumb_hint": "Last item is the current page (no link needed).", "events.title": "Événements", "events.new_event": "+ Nouvel événement", "events.no_events": "Aucun événement pour le moment.", "events.start_date": "Date de début", "events.start_time": "Heure de début", "events.end_date": "Date de fin", "events.end_time": "Heure de fin", "events.url": "URL", "events.untitled": "(sans titre)", "events.save_events": "Enregistrer les événements", "events.col_date": "Date", "events.col_location": "Lieu", "events.col_status": "Statut", "events.status_upcoming": "À venir", "events.status_today": "Aujourd'hui", "events.status_past": "Passé", "events.status_draft": "Brouillon", "events.confirm_delete_permanent": "Supprimer définitivement l'événement « {title} » ? Cette action est irréversible.", "events.back_to_events": "Retour aux événements", "mails.title": "Messages de contact", "mails.source_hint": "Les envois du formulaire de contact apparaissent ici. Raiju les enregistre localement, même si aucune notification e-mail n’est envoyée.", "mails.all_forms": "Tous les formulaires", "mails.filter_form": "Filtrer par formulaire", "mails.col_form": "Formulaire", "mails.col_from": "Expéditeur", "mails.col_subject": "Objet", "mails.col_received": "Reçu", "mails.mark_all_read": "Tout marquer comme lu", "mails.no_messages": "Aucun message", "mails.detail_title": "Détails du message", "mails.date": "Date :", "mails.name": "Nom :", "mails.email": "E-mail :", "mails.phone": "Téléphone :", "mails.preferred_date": "Date souhaitée :", "mails.message": "Message :", "mails.form": "Formulaire :", "mails.form_fields": "Champs :", "mails.sort_read": "Trier par lu/non lu", "mails.sort_starred": "Trier par favori", "mails.mark_read": "Marquer comme lu", "mails.mark_unread": "Marquer comme non lu", "mails.star": "Ajouter aux favoris", "mails.unstar": "Retirer des favoris", "settings.title": "Paramètres", "settings.branding": "Identité visuelle", "settings.branding_desc": "Personnalisez le logo, le nom et la visibilité de la marque. Désactivez l'identité visuelle pour une utilisation en marque blanche.", "settings.logo": "Logo", "settings.logo_light": "Logo (light mode)", "settings.logo_dark": "Logo (dark mode)", "settings.logo_dark_hint": "Optional. Shown only in dark mode. Leave empty if the same logo works for both themes.", "settings.frontend_logos": "Frontend logos", "settings.frontend_logos_hint": "These logos appear only on the public site. Recommended size: SVG or PNG around 320 × 96 px.", "settings.favicon": "Favicon", "settings.favicon_hint": "Shown in the browser tab and the backend. Recommended: square SVG or 512 × 512 px PNG.", "settings.site_identity": "Identité du site", "settings.admin_interface": "Interface d'administration", "settings.header_display": "Affichage dans l'en-tête", "settings.header_display_hint": "Sans logo, afficher dans l'en-tête de la page :", "settings.logo_display": "Sans logo", "settings.logo_display_favicon": "Favicon", "settings.logo_display_text": "Nom du site", "settings.logo_display_both": "Favicon et nom du site", "settings.site_name": "Nom du site", "settings.site_name_hint": "Affiché dans l'onglet du navigateur, dans l'en-tête public si sélectionné ci-dessous, et dans l'interface d'administration.", "settings.site_name_placeholder": "Nom du site", "settings.show_branding": "Afficher l'identité dans l'admin", "settings.branding_hint": "Lorsque cette option est désactivée, le logo et le nom du site sont masqués dans la barre d'administration et sur la page de connexion.", "settings.save_branding": "Enregistrer l'identité visuelle", "settings.theme": "Thème", "settings.theme_desc": "Apparence de l'administration : thème, mode, couleur de base, police et densité.", "settings.admin_theme": "Thème de l'administration", "settings.theme_light": "Clair", "settings.theme_dark": "Sombre", "settings.theme_system": "Système", "settings.appearance": "Apparence", "settings.theme_preset": "Thème", "settings.theme_preset_hint": "Définit les surfaces, bordures, rayons, la barre latérale et la police assortie ; la police reste modifiable ci-dessous. Chaque thème a une variante claire et une sombre.", "settings.preset_soft": "Soft", "settings.preset_soft_desc": "Barre latérale teintée, cartes blanches, mesures de shadcn/ui.", "settings.preset_classic": "Classic", "settings.preset_classic_desc": "Barre latérale sombre, scène claire, plat – proche de WordPress.", "settings.preset_paper": "Paper", "settings.preset_paper_desc": "Blanc, filets seulement, beaucoup de calme.", "settings.preset_studio": "Studio", "settings.preset_studio_desc": "Monochrome comme Vercel : boutons noirs, filets fins, couleur de base en simple accent.", "settings.preset_console": "Console", "settings.preset_console_desc": "Monospace, capitales, sélection en réticule, un accent fort – comme un poste de contrôle.", "settings.preset_pop": "Pop", "settings.preset_pop_desc": "Barre latérale sombre en dégradé, libellés en pastilles colorées, cartes douces et arrondies – ludique et chaleureux.", "settings.theme_mode": "Mode", "settings.base_color": "Couleur de base", "settings.base_color_hint": "Boutons, liens, états actifs et teinte des surfaces dérivent de cette seule couleur. Le contraste est garanti automatiquement.", "settings.font": "Police", "settings.font_hint": "Chargée localement depuis le dossier admin. Aucune requête externe.", "settings.font_system": "Système (aucun fichier)", "settings.font_inter": "Inter", "settings.font_plex": "IBM Plex Sans", "settings.font_atkinson": "Atkinson Hyperlegible", "settings.font_public": "Public Sans", "settings.font_size": "Taille du texte", "settings.font_size_hint": "Modifie uniquement la typographie du tableau de bord, pas les espacements ni les éléments.", "settings.font_size_small": "Petite", "settings.font_size_default": "Standard", "settings.font_size_large": "Grande", "settings.font_geist_mono": "Geist Mono", "settings.density": "Densité", "settings.density_hint": "« Automatique » suit la largeur de la fenêtre : compact sur petit écran, plus aéré sur grand écran.", "settings.density_auto": "Automatique", "settings.density_compact": "Compact", "settings.density_comfortable": "Aéré", "settings.advanced": "Avancé", "settings.sidebar_bg_light": "Couleur de la barre latérale (clair)", "settings.sidebar_bg_dark": "Couleur de la barre latérale (sombre)", "forms.title": "Formulaires", "forms.desc": "Gérez des formulaires simples basés sur JSON. Cette vue sert aux petites modifications de formulaires existants : textes, champs obligatoires, options, largeurs de colonnes et notifications.", "forms.forms": "Formulaires", "forms.select_form": "Sélectionner un formulaire", "forms.new": "Nouveau", "forms.save": "Enregistrer le formulaire", "forms.base_data": "Données de base", "forms.form_id": "ID du formulaire", "forms.form_id_hint": "Utilisé pour l’intégration et les envois, par exemple contact ou proposer-evenement.", "forms.label": "Libellé", "forms.description": "Description", "forms.enabled": "Activé", "forms.store": "Enregistrer localement", "forms.email": "Envoyer un e-mail", "forms.subject": "Objet", "forms.success_text": "Message de réussite", "forms.fields": "Champs", "forms.add_field": "Ajouter un champ", "forms.type": "Type", "forms.key": "Clé", "forms.placeholder": "Placeholder", "forms.width": "Largeur", "forms.required": "Obligatoire", "forms.options": "Options", "forms.options_hint": "Pour les champs select et radio, saisissez une option par ligne. Utilisez value|Libellé uniquement si la valeur enregistrée doit différer du libellé visible.", "forms.empty": "Aucun formulaire pour le moment.", "forms.field_count": "{count} champs", "forms.new_field": "Nouveau champ", "forms.default_success": "Merci pour votre message.", "forms.contact_default": "Formulaire de contact", "forms.saved": "Formulaire enregistré.", "forms.load_error": "Impossible de charger le formulaire.", "forms.save_error": "Impossible d’enregistrer le formulaire.", "settings.theme_section_light": "Light Theme", "settings.theme_section_dark": "Dark Theme", "settings.dark_section_hint": "Leave fields empty to inherit values from the light theme. Click the ↺ icon to reset a field to auto.", "settings.primary_color": "Couleur principale", "settings.primary_color_hint": "Utilisée pour les boutons, les liens et les éléments interactifs.", "settings.accent_color": "Couleur d'accentuation", "settings.accent_color_hint": "Pour les mises en valeur et accents de marque. Laisser vide pour utiliser la couleur de base.", "settings.danger_color": "Couleur d'alerte (rouge)", "settings.warning_color": "Couleur d'avertissement (jaune)", "settings.success_color": "Couleur de succès (vert)", "settings.semantic_colors_hint": "Pour les erreurs, avertissements et confirmations. Laisser vide pour les couleurs par défaut ; le succès suit alors la couleur de base.", "settings.sidebar_bg": "Background (sidebar & topbar)", "settings.sidebar_bg_hint": "Dérivée de la couleur de base par le thème, mais peut être remplacée.", "settings.auto_badge": "Auto", "settings.reset_to_auto": "Reset to automatic value", "settings.reset_colors": "Rétablir les valeurs par défaut", "settings.button_style": "Style des boutons de l'éditeur", "settings.button_glow": "Effet de lueur", "settings.button_glow_hint": "Ajoute un effet de lueur aux boutons de l'éditeur.", "settings.button_radius": "Rayon des bordures", "settings.button_radius_hint": "Contrôle l'arrondi des boutons de l'éditeur (0 = carré, 24 = pilule).", "settings.preview_primary": "Bouton principal", "settings.preview_secondary": "Bouton secondaire", "settings.save_theme": "Enregistrer le thème", "settings.invalid_color": "Format de couleur invalide. Utilisez le format hexadécimal (#RRGGBB).", "settings.theme_color_adjusted": "{field} a été ajusté à {value} pour que l’interface reste lisible.", "settings.contrast_ok": "Contraste : {ratio}:1", "settings.contrast_error": "Contraste : {ratio}:1 - sous le minimum UI 3:1", "settings.text_contrast_ok": "Contraste avec le texte : {ratio}:1", "settings.text_contrast_error": "Contraste avec le texte : {ratio}:1 - sous le minimum UI 3:1", "settings.contrast_invalid": "Saisissez une couleur hexadécimale valide pour calculer le contraste.", "settings.language": "Langue", "settings.admin_language": "Langue de l'administration", "settings.admin_language_hint": "Langue de l'interface d'administration. Par défaut, elle suit la langue principale du site.", "settings.admin_language_default": "Par défaut ({lang})", "settings.save_language": "Enregistrer la langue", "settings.ai_label_artwork": "Étiquettes IA sur les images", "settings.ai_label_artwork_en": "Anglais – « AI generated » (par défaut)", "settings.ai_label_artwork_page": "Langue de la page – « KI generiert » sur les pages en allemand", "settings.ai_label_artwork_hint": "S’applique aux étiquettes des images générées ou modifiées par IA sur le site. Le texte alternatif pour les lecteurs d’écran suit toujours la langue de la page.", "editor.language_tabs": "Onglets de langue", "editor.translate_from_active": "Traduire depuis la langue active", "editor.translating": "Traduction...", "editor.translate_done": "Traduction terminée.", "editor.translate_no_source": "Aucun texte source à traduire.", "editor.translate_invalid_response": "Réponse de traduction invalide.", "settings.password": "Mot de passe", "settings.my_account": "Mon compte", "settings.change_password": "Changer le mot de passe", "settings.current_password": "Mot de passe actuel", "settings.new_password": "Nouveau mot de passe", "settings.confirm_password": "Confirmer le nouveau mot de passe", "settings.pw_requirements": "Exigences du mot de passe :", "settings.pw_length": "Au moins 8 caractères", "settings.pw_upper": "Lettre majuscule", "settings.pw_lower": "Lettre minuscule", "settings.pw_digit": "Chiffre", "settings.pw_special": "Caractère spécial", "settings.pw_match": "Les mots de passe correspondent", "settings.email": "E-mail", "settings.email_desc": "Configurez l'envoi des e-mails du formulaire de contact. Les messages sont toujours sauvegardés localement dans la boîte de réception de l'administration, même en cas d'échec de l'envoi.", "settings.email_method": "Méthode d'envoi", "settings.sendmail_hint": "Utilise la fonction d'envoi intégrée du serveur (PHP mail). Pour que les e-mails soient livrés de manière fiable, l'adresse IP du serveur doit être autorisée à envoyer des e-mails pour le domaine de l'expéditeur (enregistrement SPF). Cette méthode fonctionne sans identifiants, mais la livraison n'est pas garantie.", "settings.recipient_email": "E-mail du destinataire", "settings.recipient_email_hint": "Les messages du formulaire de contact sont envoyés à cette adresse. Séparez plusieurs adresses par des virgules.", "settings.bcc_email": "E-mail BCC", "settings.bcc_email_hint": "Destinataires optionnels en copie cachée. Séparez plusieurs adresses par des virgules.", "settings.from_email": "E-mail de l'expéditeur (De)", "settings.from_email_hint": "L'adresse « De » affichée au destinataire. Elle doit correspondre à votre compte SMTP ou à votre domaine.", "settings.from_name": "Nom de l'expéditeur", "settings.smtp_settings": "Serveur SMTP", "settings.smtp_host": "Hôte", "settings.smtp_port": "Port", "settings.smtp_encryption": "Chiffrement", "settings.smtp_encryption_none": "Aucun (non recommandé)", "settings.smtp_username": "Nom d'utilisateur", "settings.smtp_password": "Mot de passe", "settings.smtp_password_placeholder": "Saisir le mot de passe", "settings.smtp_password_hint": "Laissez vide pour conserver le mot de passe enregistré.", "settings.save_email": "Enregistrer les paramètres e-mail", "settings.test_email": "Envoyer un e-mail de test", "settings.testing_email": "Envoi en cours...", "settings.test_email_success": "E-mail de test envoyé avec succès ! Vérifiez votre boîte de réception.", "settings.test_email_error": "Échec de l'envoi de l'e-mail de test.", "settings.recipient_required": "Veuillez d'abord saisir une adresse e-mail de destinataire.", "toast.email_saved": "Paramètres e-mail enregistrés", "settings.danger_zone": "Zone de danger", "settings.danger_zone_desc": "Actions irréversibles. Procédez avec une extrême prudence.", "settings.total_reset": "Réinitialisation complète", "settings.total_reset_desc": "Réinitialise complètement l'installation à l'état d'usine. Supprime tout le contenu, les pages, les images, les actualités, les sauvegardes, les paramètres et la configuration. Après la réinitialisation, l'assistant de configuration apparaîtra comme si Raiju venait d'être installé.", "settings.total_reset_warning": "Cette action est irréversible. Toutes les données seront définitivement supprimées.", "settings.total_reset_confirm_label": "Tapez DELETE pour confirmer :", "settings.total_reset_confirm_placeholder": "DELETE", "settings.total_reset_btn": "Tout réinitialiser", "settings.total_reset_mismatch": "Veuillez taper DELETE exactement pour confirmer.", "toast.total_reset_success": "Installation réinitialisée. Redirection vers l'assistant de configuration...", "security.warning": "Avertissement de sécurité :", "security.weak_password": "Votre mot de passe actuel ne répond pas aux exigences minimales de sécurité (au moins 8 caractères avec un mélange de majuscules, minuscules, chiffres et caractères spéciaux).", "security.change_now": "Veuillez le changer immédiatement", "security.change_link": "Changer votre mot de passe dans les Paramètres", "backups.title": "Sauvegardes", "backups.no_backups": "Aucune sauvegarde disponible", "backups.view": "Voir", "backups.restore": "Restaurer", "backups.delete": "Supprimer", "toast.saved": "Enregistré avec succès !", "toast.page_duplicated": "Page dupliquée : {slug}", "toast.page_trashed": "Page mise à la corbeille", "toast.page_created": "Page créée : {title}", "toast.page_restored": "Page restaurée", "toast.page_deleted": "Page définitivement supprimée", "toast.trash_emptied": "Corbeille vidée", "toast.backup_restored": "Sauvegarde restaurée !", "toast.backup_deleted": "Sauvegarde supprimée", "toast.branding_saved": "Identité visuelle enregistrée", "toast.theme_saved": "Thème enregistré", "toast.password_changed": "Mot de passe modifié avec succès !", "toast.all_read": "Tous marqués comme lus", "toast.message_deleted": "Message supprimé", "toast.events_saved": "Événements enregistrés !", "toast.event_deleted": "Événement supprimé définitivement", "toast.event_trashed": "Événement déplacé dans la corbeille", "toast.event_restored": "Événement restauré", "toast.no_images": "Aucune image trouvée. Téléversez d'abord des images.", "toast.error_loading": "Erreur de chargement : {message}", "toast.error_saving": "Erreur d'enregistrement : {message}", "toast.error_generic": "Erreur : {message}", "toast.error_loading_images": "Erreur de chargement des images : {message}", "toast.error_loading_events": "Erreur de chargement des événements : {message}", "toast.error_loading_settings": "Erreur de chargement des paramètres : {message}", "toast.events_date_required": "La date et le titre sont requis", "toast.language_saved": "Langue enregistrée", "modal.new_page": "Nouvelle page", "modal.new_page_title": "Titre", "modal.new_page_title_placeholder": "Ma nouvelle page", "modal.new_page_slug": "Slug", "modal.new_page_slug_placeholder": "ma-nouvelle-page", "modal.new_page_slug_hint": "Minuscules et tirets uniquement. Généré automatiquement à partir du titre.", "modal.create_page": "Créer la page", "modal.delete_permanently": "Supprimer définitivement", "modal.delete_confirm": "Êtes-vous sûr de vouloir supprimer définitivement « {title} » ({page}) ? Cette action est irréversible.", "modal.empty_trash": "Vider la corbeille", "modal.empty_trash_confirm": "Êtes-vous sûr de vouloir supprimer définitivement toutes les pages de la corbeille ? Cette action est irréversible.", "modal.restore_backup": "Restaurer la sauvegarde", "modal.restore_backup_confirm": "Restaurer cette sauvegarde ? L'état actuel sera enregistré au préalable.", "modal.delete_backup": "Supprimer la sauvegarde", "modal.delete_backup_confirm": "Êtes-vous sûr de vouloir supprimer cette sauvegarde ? Cette action est irréversible.", "modal.delete_message": "Supprimer le message", "modal.delete_message_confirm": "Êtes-vous sûr de vouloir supprimer ce message ?", "modal.select_logo": "Sélectionner un logo", "login.title": "Connexion", "login.username": "Nom d'utilisateur", "login.password": "Mot de passe", "login.show_password": "Afficher le mot de passe", "login.hide_password": "Masquer le mot de passe", "login.button": "Se connecter", "login.back_to_site": "Retour au site", "login.error_locked": "Compte verrouillé suite à un trop grand nombre de tentatives échouées. Veuillez réessayer dans {time}.", "login.error_too_many": "Trop de tentatives échouées. Veuillez patienter avant de réessayer.", "login.error_wait": "Identifiants invalides. Veuillez patienter avant de réessayer.", "login.error_invalid": "Nom d'utilisateur ou mot de passe incorrect", "login.hour": "h", "login.minute": "min", "setup.page_title": "Installation - Raiju CMS", "setup.complete_title": "Installation terminée", "setup.complete_message": "Raiju CMS a été configuré avec succès.", "setup.complete_login_hint": "Vous pouvez maintenant vous connecter avec les identifiants que vous venez de créer.", "setup.go_to_login": "Aller à la connexion", "setup.title": "Installation", "setup.subtitle": "Configuration initiale", "setup.site_name": "Nom du site", "setup.site_name_placeholder": "Mon site web", "setup.primary_language": "Langue principale", "setup.primary_language_hint": "Les pages dans cette langue se trouvent à la racine de l'URL (sans préfixe).", "setup.additional_language": "Langue supplémentaire (optionnel)", "setup.additional_language_none": "— Aucune —", "setup.additional_language_hint": "Les pages dans cette langue seront sous /{code}/.", "setup.admin_username": "Nom d'utilisateur administrateur", "setup.password": "Mot de passe", "setup.generate": "Générer", "setup.confirm_password": "Confirmer le mot de passe", "setup.pw_length": "Au moins 8 caractères", "setup.pw_upper": "Lettre majuscule", "setup.pw_lower": "Lettre minuscule", "setup.pw_digit": "Chiffre", "setup.pw_special": "Caractère spécial", "setup.create_config": "Créer la configuration", "setup.error_site_name": "Veuillez saisir un nom de site.", "setup.error_username": "Veuillez saisir un nom d'utilisateur administrateur.", "setup.error_username_short": "Le nom d'utilisateur doit comporter au moins 3 caractères.", "setup.error_password": "Veuillez saisir un mot de passe.", "setup.error_password_mismatch": "Les mots de passe ne correspondent pas.", "setup.error_password_weak": "Le mot de passe ne répond pas aux exigences : au moins 8 caractères avec des majuscules, des minuscules, des chiffres et des caractères spéciaux.", "setup.error_write": "Impossible d'écrire config.php. Veuillez vérifier que le répertoire admin/ est accessible en écriture par le serveur web.", "setup.copied": "Copié !", "setup.copy": "Copier", "block.text": "Texte", "block.youtube": "YouTube", "block.soundcloud": "SoundCloud", "block.audio": "Audio", "block.card": "Carte", "block.heading": "Titre", "block.quote": "Citation", "block.image": "Image", "block.list": "Liste", "block.divider": "Séparateur", "block.spacer": "Espacement", "field.title": "Titre", "field.heading_level": "Niveau de titre", "field.content": "Contenu", "field.style": "Style", "field.video_id": "ID de la vidéo", "field.video_id_hint": "L'identifiant de la vidéo dans l'URL YouTube (après v=)", "field.track_id": "ID de la piste", "field.track_id_hint": "Trouvez l'identifiant de la piste dans l'URL d'intégration SoundCloud", "field.audio_file": "Fichier audio", "field.description": "Description", "field.heading_text": "Texte du titre", "field.level": "Niveau", "field.subtitle": "Sous-titre (optionnel)", "field.quote_text": "Texte de la citation", "field.attribution": "Attribution (optionnel)", "field.alt_text": "Texte alternatif", "field.caption": "Légende (optionnel)", "field.width": "Largeur", "field.title_optional": "Titre (optionnel)", "field.list_items": "Éléments de la liste", "field.height": "Hauteur", "option.default": "Par défaut", "option.highlight": "Mise en valeur", "option.large": "Grand", "option.h1_page_title": "H1 — Titre de page", "option.h2_section": "H2 — Section", "option.h3_subsection": "H3 — Sous-section", "option.h4_small": "H4 — Petit", "option.full_width": "Pleine largeur", "option.medium_75": "Moyen (75 %)", "option.small_50": "Petit (50 %)", "option.bullet_list": "Liste à puces", "option.numbered_list": "Liste numérotée", "option.small": "Petit", "option.medium": "Moyen", "option.extra_large": "Très grand", "news.title": "Actualités", "news.new_post": "+ Nouvel article", "news.no_posts": "Aucun article pour le moment.", "news.edit": "Modifier", "news.delete": "Supprimer l'article", "news.untitled": "(sans titre)", "news.save_posts": "Enregistrer", "news.post_title": "Titre", "news.post_slug": "Slug", "news.post_date": "Date", "news.post_author": "Auteur", "news.post_excerpt": "Extrait", "news.post_image": "Image de couverture", "news.post_content": "Contenu", "news.draft": "Brouillon", "news.published": "Publié", "news.post_language": "Langue", "news.publish": "Publier", "news.unpublish": "Dépublier", "news.view": "Voir", "news.all_posts": "Toutes les actualités", "news.read_more": "Lire la suite", "toast.news_saved": "Article enregistré !", "toast.news_deleted": "Article supprimé", "toast.news_created": "Article créé", "toast.error_loading_news": "Erreur de chargement des actualités : {message}", "toast.news_date_required": "La date et le titre sont requis", "modal.delete_post": "Supprimer l'article", "modal.delete_post_confirm": "Êtes-vous sûr de vouloir supprimer « {title} » ? Cette action est irréversible.", "settings.backup": "Sauvegarde", "settings.backup_desc": "Grâce à l'architecture flat-file de Raiju, les sauvegardes sont rapides et simples — téléchargez une copie complète de votre site incluant tout le contenu, les modèles, les images et la configuration.", "settings.backup_site": "Sauvegarde du site", "settings.backup_site_desc": "Crée une archive ZIP du répertoire complet du site. Les fichiers de développement (node_modules, .git, etc.) sont exclus.", "settings.backup_create": "Créer une sauvegarde", "settings.backup_creating": "Création de la sauvegarde…", "settings.backup_downloading": "Téléchargement…", "toast.backup_site_created": "Sauvegarde créée — téléchargement lancé.", "toast.backup_site_failed": "Échec de la sauvegarde : {message}", "settings.restore_title": "Restaurer depuis une sauvegarde", "settings.restore_desc": "Téléversez un fichier ZIP de sauvegarde Raiju précédemment téléchargé pour restaurer votre site.", "settings.restore_mode_prompt": "Type de restauration — choisissez une option", "settings.restore_full": "Restauration complète", "settings.restore_full_desc": "Remplace tout — fichiers CMS, contenu, images et configuration. Une sauvegarde de l'état actuel est créée automatiquement avant la restauration.", "settings.restore_content": "Contenu uniquement", "settings.restore_content_desc": "Remplace uniquement votre contenu, vos images, vos polices et vos modèles de pages. Les fichiers du CMS et les identifiants d'administration restent inchangés.", "settings.restore_select_file": "Sélectionner un fichier ZIP", "settings.restore_change_file": "Changer de fichier", "settings.restore_btn": "Restaurer", "settings.restore_uploading": "Téléversement et restauration…", "settings.restore_warning_full": "Cela remplacera l'intégralité de votre site par le contenu du fichier ZIP de sauvegarde. Une sauvegarde de l'état actuel sera créée au préalable. Cette action est difficilement réversible. Êtes-vous sûr ?", "settings.restore_warning_content": "Cela remplacera tout le contenu, les images, les polices et les modèles de pages par le contenu du fichier ZIP de sauvegarde. Les fichiers du CMS et vos identifiants de connexion ne seront pas affectés. Continuer ?", "settings.scheduled_backups": "Automated backups", "settings.scheduled_backups_desc": "Run periodic full-site backups via a server cron job or a secret web-cron URL. The retention rules below decide how many tiered copies to keep — tight enough for fast incident recovery, loose enough to surface issues that only show up months later.", "settings.scheduled_enabled": "Scheduled backups enabled", "settings.scheduled_enabled_hint": "When off, the server or web cron exits without doing anything. Manual backups via the button above still work.", "settings.cron_mode": "Execution", "settings.cron_mode_server": "Server cron", "settings.cron_mode_web": "Web cron", "settings.cron_mode_hint": "Server cron is more reliable. Web cron is meant for hosts that do not provide cron jobs.", "settings.retention_title": "Retention", "settings.retention_hint": "Backups are tagged daily, weekly, monthly, or yearly when they're created. The numbers below say how many of each tier to keep before the oldest of that tier is deleted.", "settings.retention_daily": "Daily", "settings.retention_weekly": "Weekly", "settings.retention_monthly": "Monthly", "settings.retention_yearly": "Yearly", "settings.storage_limit": "Storage limit (MB)", "settings.storage_limit_hint": "Hard cap on total backup storage. When reached, the oldest non-manual backups are deleted even if they're still within retention. 0 = no cap.", "settings.backup_settings_save": "Save backup settings", "settings.remote_backups": "Remote backup targets", "settings.remote_backups_hint": "After each scheduled backup, Raiju uploads the ZIP to every enabled target. Uploads are placed in a per-site subfolder below the configured remote path. Access tokens and passwords are saved in settings and hidden after saving.", "settings.remote_oauth_beta_note": "Beta note: Browser-based connections to Dropbox, Google Drive, and Microsoft OneDrive may be limited depending on the providers' approval status.", "settings.remote_add_target": "Add target", "settings.remote_empty": "No remote targets configured yet.", "settings.remote_test": "Test", "settings.remote_upload": "Upload remote", "settings.remote_uploading": "Uploading…", "settings.remote_files": "Remote files", "settings.remote_files_empty": "No remote backups found.", "settings.remote_import": "Import", "settings.remote_delete": "Delete remote backup", "settings.remote_delete_confirm": "Delete this backup from remote storage? The local copy is not affected.", "settings.remote_hint_sftp": "Requires an SSH/SFTP account and the PHP ssh2 extension on the Raiju server.", "settings.remote_hint_ftp": "Use this for classic FTP accounts such as Plesk FTP users. Enable FTPS when the server supports encrypted FTP.", "settings.remote_error_dropbox_access_token_missing": "Dropbox access token is missing.", "settings.remote_error_google_access_token_missing": "Google Drive access token is missing.", "settings.remote_error_onedrive_access_token_missing": "OneDrive access token is missing.", "settings.remote_error_ssh2_required": "PHP ssh2 extension is required for SFTP/SCP uploads.", "settings.remote_error_ftp_required": "PHP FTP extension is required for FTP/FTPS uploads.", "settings.remote_not_tested": "Not tested yet.", "settings.remote_last_upload": "Last upload: {date} — {message}", "settings.remote_placeholder_optional": "Optional", "settings.remote_connect_dropbox": "Connect Dropbox", "settings.remote_connect_google": "Connect Google", "settings.remote_connect_onedrive": "Connect OneDrive", "settings.remote_field_app_key": "App key", "settings.remote_field_client_id": "Client ID", "settings.remote_field_client_secret": "Client secret", "settings.remote_field_access_token": "Access token", "settings.remote_field_refresh_token": "Refresh token", "settings.remote_field_path": "Folder path", "settings.remote_field_folder_id": "Folder ID", "settings.remote_field_folder_path": "Folder path", "settings.remote_field_host": "Host", "settings.remote_field_port": "Port", "settings.remote_field_username": "Username", "settings.remote_field_password": "Password", "settings.remote_field_remote_path": "Remote path", "settings.remote_field_ssl": "Use FTPS", "settings.remote_field_passive": "Passive mode", "settings.remote_field_endpoint": "Endpoint", "settings.remote_field_region": "Region", "settings.remote_field_bucket": "Bucket", "settings.remote_field_prefix": "Prefix", "settings.remote_field_access_key": "Access key", "settings.remote_field_secret_key": "Secret key", "settings.remote_field_path_style": "Use path-style URLs", "settings.remote_field_url": "WebDAV URL", "settings.remote_field_bearer_token": "Bearer token", "settings.cron_setup": "Cron setup", "settings.cron_setup_hint": "Create a daily scheduled task at 03:00. In Plesk choose “Run a PHP script”, enter the script path, and set the arguments to --action=run. This avoids relying on a php command in Plesk's PATH. If you use “Run a command”, use the absolute path to the PHP CLI binary.", "settings.cron_script_path": "Script path", "settings.cron_arguments": "Arguments", "settings.cron_shell_command": "Command fallback", "settings.web_cron_url": "Web-cron URL", "settings.web_cron_hint": "If your host does not allow cron jobs, call this secret URL once per day through an external service such as cron-job.org or easycron.com. Anyone who knows this URL can start scheduled backups.", "settings.cron_copy": "Copy", "settings.cron_copied": "Copied", "settings.last_run": "Last run", "settings.last_run_never": "Never", "settings.last_run_warning": "Cron has not run in {days} days — verify the crontab is active.", "settings.last_run_ok": "Cron is running on schedule.", "settings.last_run_error": "Last run failed: {message}", "settings.storage_summary": "Storage in use", "settings.storage_count": "{count} backup(s), total {size}", "settings.storage_oldest": "Oldest: {date}", "settings.storage_newest": "Newest: {date}", "settings.backup_list_title": "Stored backups", "settings.backup_list_empty": "No backups stored yet. Run the cron job once or click \"Create backup now\" above.", "settings.backup_list_col_date": "Date", "settings.backup_list_col_tier": "Tier", "settings.backup_list_col_size": "Size", "settings.backup_list_col_actions": "Actions", "settings.backup_download": "Download", "settings.backup_restore_from_pool": "Restore", "settings.backup_delete": "Delete", "settings.backup_delete_confirm": "Delete this backup? This cannot be undone.", "settings.backup_restore_pool_warning_full": "This will replace your entire site with the contents of the selected backup. A new backup of the current state is created first. Continue?", "settings.backup_restore_pool_warning_content": "This will replace your content, images, fonts, and page templates with the contents of the selected backup. CMS core files and your login credentials are not affected. Continue?", "toast.scheduled_backup_settings_saved": "Backup settings saved.", "toast.scheduled_backup_settings_failed": "Failed to save backup settings: {message}", "toast.backup_delete_failed": "Failed to delete backup: {message}", "toast.remote_test_success": "Remote target test succeeded.", "toast.remote_test_failed": "Remote target test failed: {message}", "toast.remote_upload_success": "Remote upload complete.", "toast.remote_upload_failed": "Remote upload failed: {message}", "toast.remote_list_failed": "Failed to load remote backups: {message}", "toast.remote_import_success": "Remote backup imported locally.", "toast.remote_import_failed": "Failed to import remote backup: {message}", "toast.remote_delete_success": "Remote backup deleted.", "toast.remote_delete_failed": "Failed to delete remote backup: {message}", "toast.remote_no_enabled_targets": "No enabled remote targets configured.", "toast.remote_dropbox_connected": "Dropbox connected.", "toast.remote_oauth_connected": "Cloud storage connected.", "toast.remote_dropbox_app_key_missing": "Enter and save a Dropbox app key first.", "toast.remote_client_id_missing": "Enter and save a client ID first.", "toast.remote_dropbox_connect_failed": "Dropbox connection failed: {message}", "toast.remote_oauth_connect_failed": "Cloud storage connection failed: {message}", "toast.restore_success_full": "Restauration complète terminée — {extracted} fichiers restaurés.", "toast.restore_success_content": "Contenu restauré — {extracted} fichiers mis à jour.", "toast.restore_failed": "Échec de la restauration : {message}", "settings.users": "Utilisateurs", "settings.users_desc": "Gérez les comptes utilisateurs ayant accès au panneau d'administration.", "settings.email_missing_title": "Adresse e-mail manquante", "settings.email_missing_text": "Votre compte n'a pas d'adresse e-mail. Sans elle, la réinitialisation du mot de passe par e-mail ne fonctionnera pas.", "settings.email_missing_link": "Ajouter une adresse e-mail maintenant", "settings.add_user": "Ajouter un utilisateur", "settings.edit_user": "Modifier l'utilisateur", "settings.delete_user": "Supprimer l'utilisateur", "settings.delete_user_confirm": "Êtes-vous sûr de vouloir supprimer l'utilisateur « {username} » ? Cette action est irréversible.", "settings.user_username": "Nom d'utilisateur", "settings.user_email": "E-mail", "settings.user_role": "Rôle", "settings.user_last_login": "Dernière connexion", "settings.user_actions": "Actions", "settings.user_you": "vous", "settings.reset_password": "Réinitialiser le mot de passe", "settings.reset_password_prompt": "Saisissez le nouveau mot de passe pour {username} :", "toast.user_created": "Utilisateur créé", "toast.user_updated": "Utilisateur mis à jour", "toast.user_deleted": "Utilisateur supprimé", "settings.email_inactive": "Inactif", "settings.email_inactive_hint": "L'envoi d'e-mails est désactivé. Les soumissions du formulaire de contact seront enregistrées localement, mais aucun e-mail ne sera envoyé.", "settings.menus": "Menus", "settings.menus_desc": "Gérer l'ordre des pages dans chaque menu de navigation.", "settings.menu_select": "Sélectionner le menu", "settings.menu_order_empty": "Aucune page dans ce menu.", "settings.menu_order_saved": "Ordre du menu enregistré.", "setup.admin_email": "E-mail (optionnel)", "setup.admin_email_placeholder": "admin@example.com", "setup.admin_email_hint": "Utilisé pour la réinitialisation du mot de passe. Peut être ajouté ultérieurement dans les Paramètres.", "login.forgot_password": "Mot de passe oublié ?", "login.back_to_login": "Retour à la connexion", "login.reset_desc": "Saisissez votre adresse e-mail et nous vous enverrons un lien pour réinitialiser votre mot de passe.", "login.reset_email_label": "Adresse e-mail", "login.reset_send": "Envoyer le lien de réinitialisation", "login.reset_sent": "Si un compte avec cette adresse e-mail existe, un lien de réinitialisation a été envoyé.", "login.reset_rate_limit": "Trop de demandes. Veuillez réessayer plus tard.", "login.reset_invalid_token": "Ce lien de réinitialisation est invalide ou a expiré.", "login.reset_password_mismatch": "Les mots de passe ne correspondent pas.", "login.reset_password_weak": "Le mot de passe ne répond pas aux exigences.", "login.reset_new_password_desc": "Saisissez votre nouveau mot de passe.", "login.reset_set_password": "Définir le nouveau mot de passe", "login.reset_success": "Le mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter.", "login.reset_email_subject": "Réinitialisation du mot de passe", "login.reset_email_body": "Bonjour {username},\n\nVous avez demandé une réinitialisation de mot de passe. Cliquez sur le lien ci-dessous pour définir un nouveau mot de passe :\n\n{url}\n\nCe lien expire dans 1 heure.\n\nSi vous n'avez pas fait cette demande, vous pouvez ignorer cet e-mail.", "login.session_expired": "Votre session a expiré. Veuillez vous reconnecter.", "editor.nav_add_custom": "Add menu", "close": "Fermer", "banner.frontend_edit_title": "Édition en ligne ?", "banner.frontend_edit_text": "Vous venez d'une page publique. Vous pouvez l'éditer directement dans le frontend.", "banner.frontend_edit_cta": "Retour à cette page", "settings.frontend_login_redirect": "Après la connexion", "settings.frontend_login_redirect_hint": "Où rediriger un utilisateur qui se connecte via le double-clic sur l'année dans le pied de page.", "settings.frontend_login_redirect_auto": "Retour à la page d'origine (recommandé)", "settings.frontend_login_redirect_dashboard": "Toujours arriver dans le tableau de bord", "settings.login": "Connexion", "settings.login_visual": "Aspect de connexion", "settings.visual_brand_asset": "Élément de marque", "settings.visual_brand_none": "Aucun", "settings.visual_brand_favicon": "Favicon", "settings.visual_brand_logo": "Logo", "settings.visual_image": "Image", "settings.visual_image_hint": "Image optionnelle pour la zone de connexion.", "settings.visual_image_layout": "Disposition de l’image", "settings.visual_image_none": "Sans image", "settings.visual_image_left": "Image à gauche", "settings.visual_image_right": "Image à droite", "settings.visual_image_background": "Image d’arrière-plan", "settings.visual_overlay_color": "Couleur de superposition", "settings.visual_overlay_color_hint": "Utilisée lorsque l’image sert d’arrière-plan.", "settings.visual_login_box": "Bloc de connexion", "settings.visual_login_box_card": "Carte", "settings.visual_login_box_plain": "Simple", "settings.visual_box_color": "Couleur du bloc", "settings.visual_box_color_hint": "Arrière-plan du formulaire de connexion.", "settings.visual_box_text_color": "Couleur du texte du bloc", "settings.visual_box_text_color_hint": "Texte dans le formulaire de connexion.", "settings.save_login": "Enregistrer les paramètres de connexion", "toast.login_saved": "Paramètres de connexion enregistrés", "settings.save_menus": "Enregistrer les menus", "settings.favicon_png": "Fallback PNG", "settings.favicon_png_hint": "Icône PNG facultative pour les navigateurs, onglets épinglés et appareils tactiles qui préfèrent une image raster.", "settings.logo_size": "Taille du logo", "settings.logo_size_hint": "Contrôle la hauteur du logo dans l'en-tête public.", "settings.logo_size_small": "Petit", "settings.logo_size_medium": "Moyen", "settings.logo_size_large": "Grand", "settings.default_og_image": "Default Open Graph image", "settings.default_og_image_hint": "Used for sharing previews when a page has no custom Open Graph image. JPG/PNG only; recommended size: 1200 × 630 px.", "settings.admin_logo": "Logo admin", "settings.admin_logo_hint": "Logo facultatif pour la barre supérieure d'administration. Laisser vide pour utiliser le favicon.", "settings.reset_branding": "Réinitialiser la marque", "mails.delete_read": "Supprimer les lues", "mails.delete_read_count": "Supprimer les lues ({count})", "mails.open_email_settings": "Ouvrir les réglages email", "mails.email_inactive_title": "L'envoi d'emails est inactif:", "mails.email_inactive_text": "Les messages sont enregistrés localement, mais aucune notification email n’est envoyée. Activez SMTP ou Sendmail pour les notifications.", "mails.email_recipient_missing_title": "Adresse destinataire manquante:", "mails.email_recipient_missing_text": "Les messages sont enregistrés localement, mais aucune notification ne peut être envoyée sans adresse destinataire.", "toast.read_messages_deleted": "{count} messages lus supprimés", "modal.delete_read_messages": "Supprimer les messages lus", "modal.delete_read_messages_confirm": "Supprimer {count} messages lus ? Cette action est irréversible.", "nav.image_manager": "Gestionnaire d’images", "nav.media_library": "Media Library", "nav.icon_manager": "Icon Manager", "media_manager": "Media Library", "image_manager": "Image Manager", "image.formats_hint": "Supported image formats: JPG, PNG, WebP, GIF, SVG", "audio.formats_hint": "Supported audio formats: MP3, WAV, OGG, M4A, AAC, FLAC", "media.video_formats_hint": "Supported video formats: MP4, WebM, MOV, M4V", "media.document_formats_hint": "Supported documents: PDF, Office, text files", "media.type_all": "All", "media.type_images": "Images", "media.type_audio": "Audio", "media.type_video": "Video", "media.type_documents": "Documents", "media.no_files": "No files found.", "media.no_selection": "No file selected.", "media.selection_count": "{count} files selected", "media.file": "File", "media.open_file": "Open file", "media.folder": "Folder", "media.folders": "Folders", "media.folder_all": "All folders", "media.folder_root": "Main folder", "media.folder_create": "New folder", "media.folder_create_prompt": "Folder name (letters, numbers, hyphen, underscore, dot; one level only):", "media.download_file": "Download image", "media.folder_created": "Folder created", "media.folder_delete": "Delete folder", "media.folder_delete_confirm": "Delete the empty folder \"{folder}\"?", "media.folder_deleted": "Folder deleted", "media.move_file": "Move file", "media.move_file_prompt": "Move to folder. Leave empty for no folder. Available: {folders}", "media.file_moved": "File moved", "media.rename_file": "Rename file", "media.ai_label": "Étiquette IA", "media.ai_none": "Aucune étiquette", "media.ai_generated": "Généré par IA", "media.ai_generated_desc": "Créé avec l’IA, p. ex. avec un générateur d’images", "media.ai_modified": "Modifié par IA", "media.ai_modified_desc": "Photo réelle modifiée avec l’IA, p. ex. par remplissage ou extension génératifs", "media.ai_hint": "Selon l’article 50 du règlement européen sur l’IA, les images réalistes créées ou modifiées avec l’IA doivent être signalées. L’étiquette apparaît automatiquement sur le site.", "media.ai_saved": "Étiquette IA enregistrée", "media.ai_detected": "Origine IA détectée : l’image a été étiquetée.", "media.large_title": "Volumineux pour une page web ({size}). Mieux vaut intégrer une version plus petite.", "media.large_badge": "volumineux", "media.download_original": "Télécharger l’original ({size})", "media.original_title": "Original conservé : {size}, {width} × {height} px. Les pages utilisent la version web ; le téléchargement fournit l’original.", "media.original_badge": "Original", "media.original_copy_path": "Copier le chemin de l’original", "media.original_view": "Voir l’original", "media.original_hint": "Les pages intègrent la version web. L’original se trouve dans assets/images-originals/ pour le téléchargement et l’impression, pas pour l’intégration ; il suit le fichier lors du renommage, du déplacement et de la suppression.", "media.original_info": "{size}, {width} × {height} px (version web {web})", "media.original_dialog_title": "Fichier original", "media.web_version_created": "Version web créée : {width} × {height} px, {size}. L’original est conservé ; le badge « Original » sur le fichier l’ouvre.", "media.size_limit_error": "{name} est trop volumineux (max. {max} Mo).", "media.server_limit_error": "{name} est trop volumineux : le serveur accepte des envois jusqu’à {max} Mo (upload_max_filesize / post_max_size).", "media.server_limit": "limite du serveur {max} Mo", "media.upload_limit": "jusqu’à {max} Mo par fichier", "media.ai_badge": "IA", "media.rename_new_name": "New filename", "media.rename_scan_references": "Search JSON content for existing references first", "media.rename_extension_hint": "The file extension cannot be changed. .jpeg and .jpg count as equivalent.", "media.rename_references_found": "{count} reference(s) found in JSON content.", "media.rename_references_confirm": "If you rename the file anyway, existing pages may still point to the old path.", "media.rename_confirm_anyway": "Rename anyway", "media.file_renamed": "File renamed", "media.previous_image": "Previous image", "media.next_image": "Next image", "image.library": "Library", "image.no_selection": "No image selected.", "image.trash": "Trash", "image.search": "Search files", "image.grid_view": "Grid view", "image.list_view": "List view", "image.upload": "Upload", "image.drop_files": "Drop files here", "image.or": "or", "image.select": "Select", "image.empty_trash": "Empty trash", "image.col_filename": "Filename", "image.col_size": "Size", "image.col_date": "Date", "image.copy_path": "Copy path", "image.replace": "Replace", "image.restore": "Restore", "image.delete_permanently": "Delete permanently", "image.no_search_results": "No matching files.", "image.loading": "Loading...", "image.uploading": "Uploading...", "image.uploaded": "File uploaded", "image.trashed": "File moved to trash", "image.restored": "File restored", "image.replaced": "File replaced", "image.replacing": "Replacing...", "image.deleted_permanently": "File deleted permanently", "image.trash_emptied": "Trash emptied", "image.empty_trash_confirm": "Empty the media trash? This cannot be undone.", "image.delete_permanently_confirm": "Delete this file permanently? This cannot be undone.", "image.exists": "A file with this name already exists.", "image.overwrite_file": "Overwrite file", "image.overwrite_desc": "Replace the existing file with the uploaded file.", "image.save_new_name": "Save with new name", "image.save_new_desc": "Keep both files and save the upload with a new name.", "image.choose_file": "Choose file", "image.format_error": "This file type is not supported.", "image.size_error": "This file is too large.", "image.trash_hint": "Files in trash can be restored or deleted permanently.", "image_preview": "Image preview", "icons.title": "Icon Manager", "icons.add_icon": "Add Icon", "icons.edit_icon": "Edit Icon", "icons.delete_icon": "Delete Icon", "icons.empty": "No icons available.", "icons.path": "Icon set: {path}", "icons.filter": "Search icons", "icons.filter_placeholder": "Name, key, or tag", "icons.sort": "Sort order", "icons.sort_alpha": "Alphabetical", "icons.sort_newest": "Newest first", "icons.sort_oldest": "Oldest first", "icons.key": "Icon key", "icons.key_hint": "Renaming an icon key can break existing content that references the old key.", "icons.label": "Label", "icons.tags": "Tags", "icons.tags_hint": "Stored metadata for search and filtering in icon pickers; does not affect rendering.", "icons.viewbox": "ViewBox", "icons.svg": "SVG code", "icons.svg_hint": "Paste SVG inner markup or a full . Raiju stores only the inner markup and adds the outer with a 24x24 viewBox when rendering. Scripts, event handlers, external references, and unsupported tags are removed on save.", "icons.preview": "Preview", "icons.source_core": "Core default", "icons.source_custom": "Custom", "icons.rename_warning_title": "Icon key changed", "icons.rename_warning": "Existing JSON content may still reference the old icon key and will then fall back to the default icon.", "icons.rename_confirm": "Rename this icon key? Existing content may still reference the old key.", "icons.delete_confirm": "Delete icon \"{key}\"? Existing content that references this key will fall back to the default icon.", "icons.saved": "Icon saved.", "icons.deleted": "Icon deleted.", "icons.load_error": "Error loading icons: {message}", "icons.save_error": "Error saving icon: {message}", "icons.delete_error": "Error deleting icon: {message}", "icons.cleanup": "Clean up", "icons.current_color": "Use currentColor", "icons.cleanup_done": "SVG code cleaned up.", "icons.import_icon": "Import from Icon Library", "icons.icon_set": "Icon set", "icons.search": "Search", "icons.import": "Import", "icons.imported_short": "Imported", "icons.imported": "Icon imported.", "icons.import_empty": "No icons found.", "icons.import_loading": "Loading icons ...", "icons.import_error": "Error importing icon: {message}", "icons.import_query_short": "Enter at least 2 characters.", "icons.import_license_hint": "Searching {set} through Iconify. License: {license}. Imported icons are stored locally.", "icons.current_color_done": "Icon colors set to currentColor.", "settings.access": "Access", "settings.access_desc": "Control maintenance mode and preview bypass access.", "settings.maintenance": "Maintenance mode", "settings.maintenance_enabled": "Enable maintenance mode", "settings.maintenance_mode": "Mode", "settings.maintenance_mode_maintenance": "Maintenance", "settings.maintenance_mode_offline": "Back soon", "settings.maintenance_mode_launch": "Launch countdown", "settings.maintenance_title": "Title", "settings.maintenance_text": "Text", "settings.maintenance_default_title": "Maintenance", "settings.maintenance_default_text": "We will be back online shortly.", "settings.maintenance_until": "Unavailable until", "settings.maintenance_countdown": "Show countdown", "settings.access_bypass": "Bypass link", "settings.access_bypass_desc": "Ces liens gardent le site accessible malgré le mode maintenance. Un lien se compose de l'adresse du site, d'un point d'interrogation, du paramètre d'URL, d'un signe égal et de la clé. Créez plusieurs liens pour différentes personnes et révoquez chacun en le supprimant.", "settings.access_bypass_link": "Lien :", "settings.access_bypass_key_placeholder": "CLE", "settings.access_bypass_param": "URL parameter", "settings.access_bypass_key": "Clé", "settings.access_bypass_add": "Ajouter un lien", "settings.access_bypass_remove": "Supprimer le lien", "settings.group_site": "Site", "settings.group_features": "Features", "settings.group_users": "Users", "settings.group_system": "System", "settings.modules": "Dashboard modules", "settings.modules_nav": "Modules", "settings.modules_desc": "Control which dashboard feature areas are available in this installation.", "settings.modules_hint": "Disabled modules are hidden from dashboard navigation. When AI Features is off, AI tools and AI buttons are hidden throughout the admin UI. Existing content remains stored and can be re-enabled later.", "settings.media_web_quality": "Qualité WebP (50–95)", "settings.media_web_max_side": "Côté le plus long de la version web (px)", "settings.media_web_version_hint": "Les grandes images JPG, PNG et WebP sont réduites au côté le plus long et enregistrées en WebP à l’envoi ; les pages intègrent cette version. L’original reste sous assets/images-originals/ et peut être téléchargé depuis la médiathèque.", "settings.media_web_version": "Créer une version web à l’envoi", "settings.media_max_upload_hint": "S’applique à JPG, PNG, WebP, GIF et SVG. Le serveur limite aussi les envois (upload_max_filesize, post_max_size) ; l’état du système affiche les deux valeurs.", "settings.media_max_upload": "Limite d’envoi des images (Mo)", "settings.media_section": "Médiathèque", "settings.module_ai": "AI Features", "settings.module_news": "News", "settings.module_events": "Events", "settings.module_messages": "Messages", "settings.module_icon_manager": "Icon Manager", "settings.privacy": "Privacy", "settings.privacy_desc": "Control frontend privacy behavior and local browser storage.", "settings.email_obfuscation": "Obfuscate email addresses", "settings.email_obfuscation_hint": "Public pages replace email addresses with JavaScript-decoded placeholders.", "settings.remember_public_theme": "Remember public theme choice", "settings.remember_public_theme_hint": "Stores the visitor's light/dark preference in local browser storage. Disable for highly privacy-sensitive sites.", "settings.save_access": "Save Access Settings", "settings.save_modules": "Save Dashboard Modules", "settings.save_privacy": "Save Privacy Settings", "toast.access_saved": "Access settings saved.", "toast.modules_saved": "Dashboard modules saved.", "toast.privacy_saved": "Privacy settings saved.", "editor.visibility": "Visibility", "editor.visibility_public": "Public", "editor.visibility_private": "Private, password protected", "editor.visibility_password": "Page password", "editor.visibility_title": "Password page title", "editor.visibility_text": "Password page text", "editor.visibility_password_hint": "Required when switching the page to private.", "editor.visibility_password_set": "A password is already stored. Enter a new one only to replace it.", "editor.seo": "SEO / AEO", "editor.settings_basics": "Basics", "editor.settings_navigation": "Navigation", "editor.settings_access": "Access", "editor.seo_hint": "Search previews, answer summaries, sharing, and indexing.", "editor.ai_fill_seo": "Fill SEO fields with AI", "editor.ai_fill_field": "Fill this field with AI", "editor.ai_generating": "AI is generating...", "editor.ai_done": "AI suggestion inserted.", "editor.ai_unavailable": "AI text generation is not active.", "editor.seo_title": "SEO title (defaults to page title)", "editor.seo_description": "Meta description (defaults to page description)", "editor.seo_answer_summary": "Short answer / AI summary for answer engines", "editor.seo_canonical": "Canonical URL (optional)", "editor.seo_robots_index": "Index, follow", "editor.seo_robots_noindex": "Noindex, follow", "editor.seo_robots_private": "Noindex, nofollow", "editor.seo_og_title": "Open Graph title", "editor.seo_og_description": "Open Graph description", "editor.seo_og_image": "Open Graph image", "editor.seo_og_image_format": "Open Graph images must be JPG or PNG files from /assets/images/.", "editor.seo_sitemap": "Include in XML sitemap", "ai.title": "AI", "ai.settings": "AI Settings", "ai.settings_desc": "Configure an OpenAI-compatible AI provider, budgets, quotas, and enabled AI features.", "ai.open_settings": "AI Settings", "ai.not_configured_title": "AI is not configured", "ai.not_configured_text": "Add an API key or configure an explicitly allowed local provider before AI tools can be used.", "ai.module_disabled_status": "Les fonctions IA sont désactivées dans les modules.", "ai.dismiss_notice": "Fermer l’avis IA", "ai.disabled_status": "A provider is configured, but AI features are disabled.", "ai.configured_status": "AI is configured and enabled. Usage limits and audit logging are active.", "ai.assistant": "Assistant", "ai.assistant_placeholder": "Ask how to change settings, edit content, or use Raiju.", "ai.text_generator": "Text generator", "ai.text_placeholder": "Example: Write an SEO meta description for this page...", "ai.image_generator": "Image generator", "ai.image_prompt": "Image prompt", "ai.image_placeholder": "Describe the image to generate.", "ai.image_generator_disabled": "Le générateur d’images est désactivé dans les paramètres IA.", "ai.image_filename": "Filename", "ai.image_filename_placeholder": "e.g. homepage-hero", "ai.image_filename_hint": "Without file extension. The output format determines .png, .jpg, or .webp.", "ai.image_filename_suggest": "Suggest from prompt", "ai.send": "Send", "ai.chat_shortcuts": "Enter to send · Cmd/Ctrl+Enter for a line break.", "ai.chat_shortcuts_mac": "Enter to send · Cmd+Enter for a line break.", "ai.chat_shortcuts_ctrl": "Enter to send · Ctrl+Enter for a line break.", "ai.answering": "Generating answer...", "ai.generate_text": "Generate Text", "ai.generate_image": "Generate Image", "ai.generate_images": "Generate Images", "ai.generating": "Generating...", "ai.max_output_tokens": "Max output tokens", "ai.image_size": "Resolution / orientation", "ai.image_size_auto": "Auto", "ai.image_scale": "Resolution", "ai.image_cost_per_image": "Estimated cost per image: {cost}", "ai.image_size_note": "Computed image size: {size}.", "ai.image_size_note_auto": "Provider chooses the image size automatically.", "ai.image_orientation_square": "Square", "ai.image_orientation_landscape": "Landscape", "ai.image_orientation_portrait": "Portrait", "ai.image_format": "Format", "ai.image_quality": "Quality / detail level", "ai.image_auto": "Auto", "ai.image_quality_low": "Low", "ai.image_quality_medium": "Medium", "ai.image_quality_high": "High", "ai.image_background": "Background", "ai.image_background_opaque": "Opaque", "ai.image_background_transparent": "Transparent", "ai.image_moderation": "Sécurité du fournisseur", "ai.image_moderation_standard": "Standard", "ai.image_moderation_low": "Moins strict", "ai.image_compression": "Compression", "ai.image_count": "Images", "ai.image_count_increase": "Increase image count", "ai.image_count_decrease": "Decrease image count", "ai.image_reference": "Reference image", "ai.image_reference_upload": "Upload image", "ai.image_reference_library": "Media Library", "ai.image_reference_none": "No reference image", "ai.image_reference_count": "{count} of {max} reference images", "ai.image_reference_file": "Reference image", "ai.image_reference_remove": "Remove reference image", "ai.improve_prompt": "Improve prompt", "ai.improving_prompt": "Improving...", "ai.image_group_auto": "Auto", "ai.image_group_square": "Square", "ai.image_group_landscape": "Landscape", "ai.image_group_portrait": "Portrait", "ai.image_history_title": "Recent generations", "ai.image_history_hint": "Saved locally with prompt, model, options, status, and media links.", "ai.image_history_empty": "No image generations saved yet.", "ai.image_history_load_more": "Load more", "ai.image_history_clear": "Clear history", "ai.image_history_clear_confirm": "Clear the complete image generation history? Generated image files remain in the Media Library.", "ai.image_history_cleared": "Image generation history cleared.", "ai.image_history_use_prompt": "Use prompt", "ai.image_history_error": "No image", "ai.image_history_status_success": "Created", "ai.image_history_status_error": "Failed", "ai.image_job_queued": "La génération d’image a démarré en arrière-plan.", "ai.image_job_finished": "La génération d’image est terminée.", "ai.image_job_failed": "La génération d’image a échoué.", "ai.image_model_missing_note": "Add an image model in AI Settings before generating images.", "ai.image_anthropic_note": "Anthropic n’a pas d’API d’images. Choisis un service d’images pour que l’agent et les fonctions d’image puissent créer des images.", "ai.image_openrouter_note": "OpenRouter image generation uses compatible multimodal models such as Gemini; options may vary by model.", "ai.image_field_hint": "Need a new image for this field?", "ai.open_image_generator": "AI Image Generator", "ai.provider": "Provider", "ai.enable_ai": "Enable AI features", "ai.openai_compatible": "OpenAI-compatible", "ai.anthropic": "Anthropic (Claude)", "ai.openrouter": "OpenRouter", "ai.openrouter_image_gpt": "GPT Image 2", "ai.openai_image_gpt": "GPT Image 2", "ai.openrouter_image_gemini_flash": "Nano Banana 2", "ai.openrouter_image_gemini_pro": "Nano Banana Pro", "ai.openrouter_image_model_hint": "OpenRouter requires provider-prefixed model IDs; Raiju stores the selected ID automatically.", "ai.base_url": "Base URL", "ai.allow_local_provider": "Allow local/private provider URL", "ai.allow_local_provider_hint": "Required for Ollama, LM Studio, or self-hosted providers on localhost/private networks.", "ai.api_key": "API key", "ai.api_key_saved": "Clé API enregistrée. Laisse le champ inchangé pour la conserver.", "ai.api_key_missing": "No API key stored. Local providers may work without one.", "ai.clear_api_key": "Remove stored API key", "ai.organization": "ID d’organisation OpenAI (facultatif)", "ai.models": "Models", "ai.chat_model": "Chat model", "ai.text_model": "Text model", "ai.image_model": "Image model", "ai.features": "Features", "ai.feature_assistant": "Backend assistant", "ai.feature_seo": "SEO/text generation", "ai.feature_images": "Image generation", "ai.assistant_surface_visual_editor": "Show chatbot in Visual Editor", "ai.assistant_surface_dashboard": "Show chatbot in Dashboard", "ai.assistant_force_english": "Ignore dashboard language setting - always use English for the chatbot", "ai.assistant_force_english_hint": "When enabled, the AI Assistant answers in English even if the dashboard is shown in another language.", "ai.limits": "Limits", "ai.monthly_budget": "Monthly budget (cents)", "ai.daily_requests": "Daily requests", "ai.daily_text_requests": "Daily text requests", "ai.daily_image_requests": "Daily image requests", "ai.max_input_tokens": "Max input tokens", "ai.max_input_tokens_hint": "Recommandation : 64 000. Suffisant pour l’agent et les longues pages ; ne le baissez que pour de très petits sites afin d’économiser.", "ai.max_output_tokens_hint": "Recommandation : 16 000. Les modèles de raisonnement comptent leur réflexion dans cette limite ; une valeur basse peut tronquer les réponses. La limite plafonne une seule réponse ; vous payez ce qui est généré.", "ai.request_timeout": "Request timeout (sec.)", "ai.request_timeout_hint": "Recommandation : 300 secondes pour la génération d’images ; les requêtes texte finissent généralement plus vite.", "ai.pricing": "Cost estimates", "ai.input_price": "Input cents / 1M tokens", "ai.output_price": "Output cents / 1M tokens", "ai.image_price": "Prix par défaut par image (centimes)", "ai.save_settings": "Save AI Settings", "ai.test_connection": "Test Connection", "ai.testing": "Testing...", "ai.connection_ok": "AI connection works.", "ai.settings_saved": "AI settings saved.", "ai.audit_tab": "Content audit", "ai.audit_hint": "Scan all pages for missing or weak SEO descriptions and images without alt text. The scan itself is free; suggestions use the AI text model.", "ai.audit_run": "Run audit", "ai.audit_running": "Scanning pages...", "ai.audit_empty": "No pages found.", "ai.audit_col_page": "Page", "ai.audit_col_description": "SEO description", "ai.audit_col_alt": "Image alt texts", "ai.audit_status_missing": "Missing", "ai.audit_status_short": "Too short", "ai.audit_status_long": "Too long", "ai.audit_status_ok": "OK", "ai.audit_alt_missing": "{count} missing", "ai.audit_suggest": "Suggest description", "ai.audit_apply": "Apply", "ai.audit_applied": "Applied", "ai.audit_apply_confirm": "Save this description to \"{page}\"? A backup is created first.", "ai.usage_panel": "Usage this month", "ai.usage_requests_today": "Requests today", "ai.usage_text_image_split": "{text} text · {images} image", "ai.usage_cost_month": "Cost this month", "ai.usage_requests_month": "{requests} requests", "ai.usage_tokens_month": "Tokens this month", "ai.usage_tokens_split": "{input} in · {output} out", "ai.usage_budget": "Monthly budget", "ai.usage_budget_value": "{spent} of {budget} ({percent}%)", "ai.pricing_autofilled": "Pricing fields were filled from the OpenRouter model data. Review and save.", "ai.model_list_open": "Show model suggestions", "ai.usage_summary": "Today: {today} requests · Month: {cost}", "dashboard_home.title": "Dashboard", "dashboard_home.page_views_today": "Views today", "dashboard_home.page_views_30d": "Views in 30 days", "dashboard_home.visitors_30d": "Visitors in 30 days", "dashboard_home.visits_30d": "Visits in 30 days", "dashboard_home.bots_filtered": "Bots filtered", "dashboard_home.pages": "Pages", "dashboard_home.news": "News posts", "dashboard_home.top_pages": "Top pages", "dashboard_home.referrers": "Referrers", "dashboard_home.devices": "Devices", "dashboard_home.browsers_os": "Browsers / OS", "dashboard_home.no_views": "No page views recorded yet.", "dashboard_home.no_data": "No data yet.", "dashboard_home.views_detail": "{views} views · {visitors} visitors · {visits} visits", "dashboard_home.ai_status": "AI status", "dashboard_home.ai_tools": "AI tools", "dashboard_home.analytics": "Analytics", "dashboard_home.analytics_hint": "Visitor overview for the last 30 days with bot traffic filtered.", "dashboard_home.analytics_details": "Technology details", "dashboard_home.content_overview": "Content overview", "dashboard_home.traffic_curve": "Traffic trend", "dashboard_home.views_label": "views", "dashboard_home.analytics_range": "Analytics range", "dashboard_home.range_days": "30 days", "dashboard_home.range_months": "12 months", "dashboard_home.range_years": "Years", "dashboard_home.range_label_days": "last {count} days", "dashboard_home.range_label_months": "last {count} months", "dashboard_home.range_label_years": "all years", "dashboard_home.views_period": "Views in {period}", "dashboard_home.visitors_period": "Visitors in {period}", "dashboard_home.visits_period": "Visits in {period}", "dashboard_home.hourly_distribution": "Today by hour", "dashboard_home.today": "Today", "dashboard_home.site_status": "Site status", "dashboard_home.unread_messages": "Unread messages", "dashboard_home.backup_status": "Last backup", "dashboard_home.auto_backup": "Auto backup", "dashboard_home.no_backup": "No backup", "dashboard_home.active": "Active", "dashboard_home.inactive": "Inactive", "dashboard_home.recent_edit": "Last edited", "dashboard_home.current_user": "Signed in", "save": "Enregistrer", "saving": "Saving...", "cancel": "Annuler", "delete": "Supprimer", "edit": "Modifier", "logout": "Déconnexion", "show": "Voir", "hide": "Hide", "undo": "Annuler (⌘Z)", "redo": "Rétablir (⇧⌘Z)", "bold": "Bold", "italic": "Italic", "insert_link": "Insert link", "clean_formatting": "Clean formatting", "visual_editor": "Visual editor", "content_editor": "Content editor", "edit_block_title": "Edit block", "edit_mode_hint": "Edit mode is active.", "drag_reorder": "Drag to reorder", "search_blocks": "Search blocks", "add_block": "Add block", "cat.content": "Éditeur de contenu", "cat.media": "Media", "cat.embed": "Embed", "cat.cards": "Cards", "cat.layout": "Layout", "cat.interactive": "Interactive", "btn.move_up": "Move up", "btn.move_down": "Move down", "nav.edit_mode_active": "Edit mode active", "nav.unsaved_changes": "Unsaved changes", "link_internal": "Internal link", "link_external": "External link", "link_target": "Link target", "link_open_new_tab": "Open in new tab", "link_offer_download": "Offer as download", "footer.edit": "Edit footer", "footer.copyright": "Copyright", "footer.link_text": "Link text", "footer.link_url": "Link URL", "item.delete": "Delete item", "item.delete_confirm": "Delete this item?", "section.delete": "Delete section", "section.delete_confirm": "Delete this section?", "section.reload_hint": "Reload the page to see the updated section layout.", "image.col_actions": "Actions", "editor.change_image": "Sélectionner une image", "audio.manager": "Audio Library", "audio.upload": "Upload audio", "audio.select": "Select audio", "audio.search": "Search audio", "audio.no_files": "No audio files found.", "audio.loading": "Loading audio...", "audio.play": "Play audio", "audio.playing": "Playing audio", "audio.delete": "Delete audio", "audio.delete_confirm": "Delete this audio file?", "audio.uploaded": "Audio uploaded", "audio.trashed": "Audio moved to trash", "audio.trash_hint": "Audio files in trash can be restored or deleted permanently.", "audio.error_loading": "Error loading audio files.", "audio.format_error": "This audio format is not supported.", "audio.size_error": "This audio file is too large.", "event.new": "+ Nouvel événement", "event.edit": "Modifier", "event.delete": "Supprimer", "event.delete_confirm": "Delete this event? This cannot be undone.", "event.cannot_undo": "This cannot be undone.", "event.copy_to_all": "Copy to all languages", "event.date_required": "Date de début", "event.title": "Title", "event.location": "Lieu", "event.description": "Description", "event.admission": "Admission", "event.url": "URL", "event.image": "Logo", "event.start_date": "Date de début", "event.start_time": "Heure de début", "event.end_date": "Date de fin", "event.end_time": "Heure de fin", "history.title": "History", "history.empty": "No history entries yet.", "history.restore": "Restore", "history.restore_title": "Restore version", "history.restore_confirm": "Restore this version? Current unsaved changes will be lost.", "history.overwrite": "Overwrite current content", "history.overwrite_warning": "This will overwrite the current content.", "history.not_found": "History entry not found.", "history.clear": "Clear history", "history.clear_confirm": "Clear history? This cannot be undone.", "history.cleared": "History cleared.", "toast.error": "Something went wrong.", "toast.error_saving_short": "Could not save.", "toast.error_deleting": "Could not delete.", "toast.error_undo": "Could not undo.", "toast.upload_error": "Upload failed.", "toast.no_changes": "No changes to save.", "toast.copied": "Copied.", "toast.copied_to_empty": "Copied into empty field.", "toast.change_queued": "Change queued.", "toast.order_changed": "Order changed.", "toast.hidden": "Hidden.", "toast.visible": "Visible.", "toast.row_hidden": "Row hidden.", "toast.row_visible": "Row visible.", "toast.event_hidden": "Event hidden.", "toast.event_visible": "Event visible.", "toast.undone": "Change undone.", "toast.formatting_cleaned": "Formatting cleaned.", "toast.select_text_first": "Select text first.", "toast.sort_same_section": "Items can only be sorted within the same section.", "copilot.title": "AI Assistant", "copilot.type_page": "Standard page", "copilot.type_news": "News post", "copilot.type_event": "Event / appointment", "copilot.type_form": "Form", "copilot.subtitle": "Safe editor assistance", "copilot.close": "Close AI Assistant", "copilot.placeholder": "Ask how to change this page...", "copilot.ask": "Ask AI Assistant", "copilot.draft_changes": "Draft changes", "copilot.draft_content": "Draft content", "copilot.draft_image": "Image", "copilot.shortcut_needs_prompt": "Enter an instruction first.", "copilot.draft_changes_hint": "Open a guided dialog to prepare a reviewed page change.", "copilot.draft_content_hint": "Open a guided dialog to prepare a new page, news post, event, or appointment.", "copilot.draft_image_hint": "Open image options and enter or refine the image prompt.", "copilot.send": "Send", "copilot.not_ready": "AI is not ready yet. Check AI Settings in the dashboard.", "copilot.current_page": "current page", "copilot.field_hints": "{count} editable field hints found", "copilot.selected_field": "Selected field: {field}", "copilot.missing": "Missing: {fields}", "copilot.create_draft": "Create draft", "copilot.needs_details_hint": "Ask another message with the missing details before creating.", "copilot.complete_details": "Complete details", "copilot.complete_details_title": "Complete content details", "copilot.update_draft": "Update draft", "copilot.update_draft_instruction": "Update the content draft with the submitted form fields.", "copilot.content_draft_title": "{type} draft", "copilot.ready_to_create": "Ready to create", "copilot.needs_details": "Needs details", "copilot.private_draft": "Private draft", "copilot.hidden_draft": "Hidden draft", "copilot.draft_created": "Draft created", "copilot.open_dashboard": "Open in dashboard", "copilot.open_preview": "Open preview URL", "copilot.created_title": "{type} created", "copilot.last_change": "Last AI change applied", "copilot.undo": "Undo", "copilot.alt_text": "Alt text", "copilot.current": "Current", "copilot.draft": "Draft", "copilot.review_backup": "Review before applying. A backup is created server-side.", "copilot.apply": "Apply", "copilot.copy": "Copy", "copilot.copied_message": "Copied the draft value for {field}.", "copilot.copy_failed": "Could not copy the draft value.", "copilot.publish": "Publish", "copilot.publish_confirm": "Publish this draft now?", "copilot.published_message": "Published {type} \"{id}\".", "copilot.intro_message": "I can help with this page and explain how to edit or create content safely. Write what you want to change or create.", "copilot.no_response": "No response.", "copilot.suggestions_ready": "I drafted safe field-level suggestions. Review the preview cards below.", "copilot.no_safe_field": "I could not map that request to a safe editable field on this page yet.", "copilot.content_draft_ready_message": "I prepared a new {type} draft. Review the preview before creating it.", "copilot.content_draft_needs_details_message": "I prepared a draft, but it needs more details before it can be created.", "copilot.content_unavailable": "Content creation is not available for your role or this site configuration.", "copilot.image_unavailable": "Image generation is not available for your role, this page, or the current AI settings.", "copilot.no_image_field": "I could not find an editable image field on this page.", "copilot.choose_image_field": "Which image field should I use?", "copilot.image_options_title": "Image options", "copilot.image_options_hint": "Choose the target image and generation mode.", "copilot.image_mode_label": "Mode", "copilot.image_mode_generate": "From prompt", "copilot.image_mode_edit": "With reference image", "copilot.image_size": "Size", "copilot.image_size_auto": "Auto", "copilot.image_size_square": "Square", "copilot.image_size_landscape": "Landscape", "copilot.image_size_portrait": "Portrait", "copilot.image_count": "Images", "copilot.image_format": "Format", "copilot.image_quality": "Quality", "copilot.image_quality_auto": "Auto", "copilot.image_quality_low": "Low", "copilot.image_quality_medium": "Medium", "copilot.image_quality_high": "High", "copilot.image_generate_action": "Generate image", "copilot.image_options_ready": "Choose the image field and whether to generate a new image or edit the current one.", "copilot.image_job_queued": "La génération d’image s’exécute en arrière-plan. Vous pouvez continuer à travailler ; j’afficherai l’aperçu dès qu’il sera prêt.", "copilot.image_draft_ready": "Generated image ready. Review the preview card before applying it.", "copilot.image_no_proposal": "Image generation returned no preview.", "copilot.apply_confirm": "Apply this AI draft to \"{field}\"?", "copilot.applied_message": "Applied the draft to {field}. A backup was created before saving.", "copilot.undo_confirm": "Undo the last AI change on this page? The current state will be backed up first.", "copilot.undo_message": "Restored the page from the backup. Reloading the page now.", "copilot.create_confirm": "Create this {type} draft?", "copilot.created_message": "Created {type} draft \"{id}\". It is not published publicly by default.", "copilot.created_page_navigation_hint": "Open the page in the Content Editor and set Page Settings / Navigation if it should appear in a menu.", "copilot.navigation_manual_required": "No change was applied. I cannot safely change page navigation directly from chat yet. Open Page Settings / Navigation in the Content Editor and select the menus where this page should appear.", "copilot.image_request_failed": "Image generation failed.", "copilot.working_translate": "Translating the page content...", "copilot.translate_ready": "I drafted {target} translations. Review the preview cards below; applying saves them to the {target} page.", "copilot.translate_no_fields": "I could not draft translations for this page. Check that the target language page exists and has translatable fields.", "copilot.translate_unavailable": "Translation drafts are not available for your role or on this surface. Open the page in the Visual Editor to translate it.", "copilot.request_failed": "AI Assistant request failed.", "copilot.proposal_summary_title": "Planned changes", "copilot.proposal_summary_hint": "{count} changes will be reviewed together.", "copilot.apply_all": "Apply all", "copilot.apply_all_confirm_title": "Apply all AI drafts?", "copilot.apply_all_confirm_body": "Apply these {count} AI drafts? A backup is created for every changed page state.", "copilot.applied_all_message": "Applied {count} AI drafts. A backup was created before each save.", "copilot.apply_confirm_title": "Apply AI draft?", "copilot.confirm_title": "Confirm action", "copilot.modal_cancel": "Cancel", "copilot.modal_confirm": "Confirm", "copilot.enable_visual_editor_title": "Activate Visual Editor?", "copilot.enable_visual_editor_action": "Activate Visual Editor", "copilot.undo_confirm_title": "Undo last AI change?", "copilot.create_confirm_title": "Create draft?", "copilot.publish_confirm_title": "Publish draft?", "copilot.summary_hide": "Hide field", "copilot.summary_show": "Show field", "copilot.summary_image": "Replace image", "copilot.request_timeout": "AI Assistant request timed out. No change was applied.", "copilot.working": "AI Assistant is working...", "copilot.working_context": "Loading page context...", "copilot.working_chat": "Thinking about your question...", "copilot.working_draft": "Drafting a safe change...", "copilot.working_content": "Preparing a content draft...", "copilot.working_image": "Generating image...", "copilot.working_apply": "Applying the confirmed change...", "copilot.working_undo": "Restoring the previous version...", "copilot.working_create": "Creating the confirmed draft...", "copilot.working_publish": "Publishing the confirmed draft...", "copilot.enable_visual_editor_confirm": "The Visual Editor must be active before AI changes can be prepared on this page. Activate it now?", "copilot.visual_editor_required": "No change was made. Activate the Visual Editor first, then ask me to prepare the change again.", "copilot.visual_editor_enabled": "Visual Editor is active. I will prepare the change as a preview first.", "copilot.visual_editor_unavailable": "The Visual Editor is not available on this page, so I cannot safely prepare page changes here.", "copilot.use_current_image_confirm": "Use the current image as a reference for editing? Choose Cancel to generate a new image from the prompt only.", "copilot.maximize": "Maximize AI Assistant", "copilot.minimize": "Minimize AI Assistant", "copilot.no_pending_preview": "There is no reviewed AI preview waiting to apply. Ask for a change first, then use the preview card.", "copilot.image_prompt": "Prompt", "copilot.image_prompt_placeholder": "Describe the image to generate...", "copilot.image_prompt_required": "Add a prompt before generating an image.", "copilot.image_request_timeout": "Image generation timed out. No image preview was created.", "copilot.session_expired": "Your session expired. Please log in again in the dashboard, then reload this page.", "copilot.applied_image_message": "Applied the generated image to {field}. A backup was created before saving.", "copilot.generated_image": "Generated image", "copilot.generated_image_applied": "Generated image applied", "copilot.history": "Chat history", "copilot.history_loading": "Loading chat history...", "copilot.history_empty": "No archived chats yet.", "copilot.new_chat": "New chat", "copilot.delete_chat": "Delete chat", "copilot.delete_chat_title": "Delete chat?", "copilot.delete_chat_confirm": "Delete this AI Assistant chat history? This cannot be undone.", "copilot.untitled_chat": "Untitled chat", "copilot.dashboard_context": "Dashboard", "copilot.dashboard_hint": "General site and dashboard assistance", "copilot.undo_detail": "Changed: {field}", "copilot.unknown_field": "selected field", "copilot.section_field_label": "Section {section} {field}", "copilot.change_details_title": "Prepare change", "copilot.change_details_hint": "Describe the change. The Assistant will create a reviewable preview before anything is applied.", "copilot.target_field": "Target", "copilot.current_selection_none": "No field selected", "copilot.change_instruction": "Change instruction", "copilot.change_instruction_placeholder": "Describe what should change on this page...", "copilot.prepare_preview": "Prepare preview", "copilot.content_type": "Content type", "copilot.content_type_page": "Page", "copilot.content_type_news": "News post", "copilot.content_type_event": "Event / appointment", "copilot.choose_target_field": "Choose target field", "copilot.choose_target_field_placeholder": "Select a field...", "copilot.choose_target_field_hint": "You can also click an editable element on the page before opening this dialog.", "copilot.choose_target_required": "Choose the field you want to change first.", "copilot.current_field_content": "Current content", "copilot.current_field_empty": "This field is currently empty.", "copilot.current_field_select": "Choose a target field to preview its current content.", "copilot.dash_apply": "Appliquer", "copilot.dash_open_btn": "Ouvrir", "copilot.dash_dismiss": "Ignorer", "copilot.dash_applying": "En cours…", "copilot.dash_done": "Terminé.", "copilot.dash_failed": "Cela n’a pas fonctionné.", "copilot.dash_opened": "Ouvert.", "copilot.dash_language_reload": "Enregistré. Le tableau de bord se recharge dans la nouvelle langue.", "copilot.dash_adjusted": "Enregistré. La couleur a été légèrement ajustée pour rester lisible.", "copilot.dash_saved": "Enregistré.", "copilot.dash_open_title": "Ouvrir {target}", "copilot.dash_change_title": "Modifier {setting}", "copilot.dash_already": "{setting} est déjà {value}.", "copilot.dash_setting_adminTheme": "thème du tableau de bord", "copilot.dash_setting_primaryColor": "couleur principale du tableau de bord", "copilot.dash_setting_accentColor": "couleur d’accent du tableau de bord", "copilot.dash_setting_adminLanguage": "langue du tableau de bord", "copilot.dash_value_light": "Clair", "copilot.dash_value_dark": "Sombre", "copilot.dash_value_system": "Suivre l’appareil", "copilot.dash_actions_ready": "Je l’ai préparé pour vous. Vérifiez la carte et confirmez.", "copilot.dash_not_possible": "Je n’ai pas pu le préparer. Dites-moi ce que vous voulez modifier ou où vous voulez aller, et je vous montre le chemin.", "copilot.dash_open_new_tab": "Ouvrir dans un nouvel onglet", "copilot.dash_where_title": "Voici où le trouver : {name}", "copilot.dash_where_lead": "Je ne peux pas le faire à votre place ici, mais voici où le trouver :", "copilot.dash_admin_only": "Cela est réservé aux administrateurs. Voici où cela se trouve dans le tableau de bord :", "copilot.dash_module_off_title": "{target} est désactivé", "copilot.dash_value_unclear": "Je n’ai pas pu utiliser cette valeur. Vous pouvez la régler vous-même ici : {name}", "copilot.map_admin_only": "Cette action est réservée aux administrateurs.", "copilot.map_module_off": "Ce module est désactivé. Vous pouvez l’activer sous {path}.", "copilot.safety_blocked": "J’ai écarté cette suggestion : elle ressemblait à de la fraude, du phishing, un logiciel malveillant, de la haine ou un contenu adulte ou illégal.", "copilot.safety_note": "Avis de sécurité : ce texte demande des mots de passe ou des données de paiement, contient des liens à vérifier ou des instructions destinées à une IA. Relisez-le attentivement avant de l’appliquer.", "ai.image_jobs_title": "Tâches image", "ai.image_jobs_check": "Vérifier les tâches", "ai.image_jobs_idle": "Aucune tâche image ouverte.", "ai.image_jobs_open": "{count} tâche(s) image en file ou en cours.", "ai.image_jobs_finished": "La dernière tâche image est terminée.", "ai.image_jobs_failed": "La dernière tâche image a échoué.", "agent.title": "Agent IA", "agent.intro": "L’agent traite votre demande, prépare un lot de modifications et vous le présente. Rien n’est publié tant que vous ne l’appliquez pas.", "agent.mode_label": "Mode", "agent.mode_agent": "Agent", "agent.mode_agent_hint": "L’agent prépare un lot de modifications complet à relire.", "agent.mode_classic": "Classique", "agent.mode_classic_hint": "Posez des questions et préparez des modifications une par une.", "agent.placeholder": "Dites à l’agent quoi modifier, p. ex. « Ajoute une actualité sur … »", "agent.placeholder_busy": "L’agent travaille…", "agent.placeholder_answer": "Répondez à l’agent…", "agent.placeholder_changes": "Que faut-il changer dans le lot ?", "agent.status_thinking": "Réflexion…", "agent.status_waiting_image": "En attente de l’image…", "agent.status_ready": "Prêt", "agent.status_conflict": "Obsolète", "agent.status_check": "À vérifier", "agent.cancel": "Annuler", "agent.cancelling": "Annulation…", "agent.cancelled": "L’agent a été annulé. Rien n’a été modifié.", "agent.steps_title": "{count} étapes", "agent.step_failed": "n’a pas fonctionné", "agent.retry": "Recommencer", "agent.continue": "Continuer", "agent.busy": "L’agent travaille encore. Réessayez dans un instant.", "agent.error_generic": "L’agent n’a pas pu terminer.", "agent.error_connection": "La connexion a été interrompue.", "agent.step.unknown": "Travaille", "agent.step.get_site_overview": "Examine le site", "agent.step.get_page_capabilities": "Vérifie ce qui est modifiable sur {detail}", "agent.step.read_content": "Lit {detail}", "agent.step.list_content": "Liste {detail}", "agent.step.list_media": "Parcourt la médiathèque", "agent.step.list_run_media": "Vérifie les images jointes", "agent.step.search_stock_images": "Cherche des photos libres : {detail}", "agent.step.import_stock_image": "Télécharge une photo libre", "agent.step.generate_image": "Génère une image", "agent.step.search_web": "Recherche : {detail}", "agent.step.read_web_result": "Lit une source", "agent.step.stage_set_field": "Modifie {detail}", "agent.step.stage_set_image": "Place une image sur {detail}", "agent.step.stage_add_list_item": "Ajoute un élément à {detail}", "agent.step.stage_hide_list_item": "Masque ou affiche un élément sur {detail}", "agent.step.stage_remove_list_item": "Supprime un élément de {detail}", "agent.step.stage_move_list_item": "Déplace un élément sur {detail}", "agent.step.stage_add_section": "Ajoute une section à {detail}", "agent.step.stage_create_news": "Crée une actualité", "agent.step.stage_create_event": "Crée un événement", "agent.step.stage_create_page": "Crée une page", "agent.step.stage_set_page_menus": "Modifie les menus de {detail}", "agent.step.stage_revert_op": "Annule une modification", "agent.step.validate_changeset": "Vérifie le lot", "agent.step.ask_user": "Vous pose une question", "agent.step.present_changeset": "Prépare la relecture", "agent.package_title": "Lot de modifications", "agent.open_questions": "Questions ouvertes", "agent.target_page": "Page : {name}", "agent.target_news": "Actualité : {name}", "agent.target_event": "Événement : {name}", "agent.target_shared": "Contenu partagé : {name}", "agent.before": "Avant", "agent.after": "Après", "agent.empty_value": "(vide)", "agent.destructive": "Supprime du contenu", "agent.validation_ok": "Toutes les vérifications sont réussies", "agent.validation_errors": "Problèmes détectés", "agent.validation_warnings": "Remarques", "agent.where_title": "Où le trouver", "agent.step.find_in_dashboard": "Cherche où cela se trouve dans le tableau de bord", "agent.risk_title": "Contrôle de sécurité : regardez de près", "agent.risk_confirm_title": "Appliquer malgré les avertissements de sécurité ?", "agent.risk_confirm_body": "Le contrôle de sécurité a signalé ce paquet. N’appliquez-le que s’il correspond exactement à votre demande. Vous pourrez ensuite l’annuler.", "agent.risk_confirm_button": "Appliquer quand même", "agent.safety_confirm_needed": "Ce paquet comporte des avertissements de sécurité. Lisez-les dans la revue et confirmez-les pour l’appliquer.", "agent.safety.mass_removal": "Sur {total} éléments de {target}, {count} seraient supprimés, masqués ou vidés.", "agent.safety.list_emptied": "La liste « {list} » de {target} serait vide.", "agent.safety.large_text_loss": "Environ {percent} % du texte de {target} disparaîtrait.", "agent.safety.too_many_removals": "Ce paquet supprimerait, masquerait ou viderait {count} éléments du site.", "agent.safety.too_many_creations": "Ce paquet créerait {count} pages, actualités ou événements.", "agent.safety.menu_changes": "Ce paquet modifierait les menus de {count} pages.", "agent.safety.too_many_targets": "Ce paquet concerne {count} pages, actualités ou événements.", "agent.safety.contact_changed": "Une adresse e-mail, un numéro de téléphone ou une coordonnée bancaire de {target} serait remplacé par un autre.", "agent.safety.content_blocked": "Le nouveau texte de {target} ressemble à de la fraude, du phishing, un logiciel malveillant, de la haine ou un contenu adulte ou illégal ; il a été bloqué.", "agent.safety.content_caution": "Le nouveau texte de {target} demande aux visiteurs des mots de passe ou des données de paiement, ou contient des liens à vérifier.", "agent.safety.content_injection": "Le nouveau texte de {target} contient des instructions destinées à une IA. Cela peut indiquer une source manipulée.", "agent.safety_refuse.mass_delete": "Je ne vide pas une page ni ne supprime un site entier d’un seul coup. Dites-moi quelles sections ou quels éléments supprimer ou masquer, quelques-uns à la fois, et je le prépare pour votre relecture. Tout peut ensuite être annulé.", "agent.safety_refuse.hate": "Je ne peux pas vous aider pour cela : cela répandrait la haine ou inciterait à la violence contre des personnes.", "agent.safety_refuse.create_crime": "Je ne peux pas vous aider pour cela : cela créerait un contenu frauduleux, nuisible, pour adultes ou illégal.", "agent.render_failed": "Une page demande de l’attention", "agent.images": "Images", "agent.image_ai": "Générée par IA", "agent.image_stock": "Photo libre", "agent.image_generated": "Image générée", "agent.image_upload": "Votre fichier", "agent.sources": "Sources", "agent.source_warning": "Cette page contient du texte qui cherche à donner des instructions à une IA. Il a été ignoré.", "agent.conflict": "Le contenu a changé après le démarrage de l’agent. Revalidez le lot pour continuer.", "agent.revalidate": "Revalider", "agent.preview": "Aperçu", "agent.preview_hint": "Ouvre la page avec les modifications. Vous seul la voyez.", "agent.preview_page": "Aperçu : {name}", "agent.preview_banner": "Aperçu : ces modifications n'ont pas encore été appliquées. Vous seul voyez la page ainsi.", "agent.preview_back": "Retour à l'assistant", "agent.op.set_field": "Modifier « {field} »", "agent.op.set_image": "Définir l'image « {field} »", "agent.op.list_insert": "Ajouter un élément à « {field} »", "agent.op.list_hide": "Masquer l'élément {n} de « {field} »", "agent.op.list_show": "Afficher l'élément {n} de « {field} »", "agent.op.list_remove": "Supprimer l'élément {n} de « {field} »", "agent.op.list_move": "Déplacer l'élément {from} à la position {to} dans « {field} »", "agent.op.section_insert": "Ajouter une section de type {type}", "agent.op.create_news": "Créer un article d'actualité", "agent.op.create_event": "Créer un événement", "agent.op.create_page": "Créer une page", "agent.op.set_page_menus": "Modifier les menus de cette page", "agent.op.in_section": "{what} dans la section {n} ({type}) : « {title} »", "agent.op.in_section_untitled": "{what} dans la section {n} ({type})", "agent.op.item": "(élément {item})", "agent.field.content": "Texte", "agent.field.text": "Texte", "agent.field.title": "Titre", "agent.field.heading": "Intertitre", "agent.field.subtitle": "Sous-titre", "agent.field.description": "Description", "agent.field.caption": "Légende", "agent.field.image": "Image", "agent.field.items": "Éléments", "agent.field.alt": "Texte alternatif", "agent.apply": "Appliquer les modifications", "agent.apply_confirm_title": "Appliquer ce lot ?", "agent.apply_confirm_body": "{count} modifications seront enregistrées. Les modifications de contenus existants sont visibles tout de suite ; les nouveaux contenus restent masqués jusqu’à leur publication. Vous pourrez annuler le lot ensuite.", "agent.apply_confirm_body_live": "{count} modifications seront enregistrées et visibles tout de suite. Vous pourrez annuler le lot ensuite.", "agent.apply_confirm_button": "Appliquer", "agent.apply_failed": "Le lot n’a pas pu être appliqué. {message}", "agent.discard": "Rejeter", "agent.discard_confirm_title": "Rejeter ce lot ?", "agent.discard_confirm_body": "Les modifications et images préparées sont supprimées. Rien ne change sur votre site.", "agent.discard_confirm_button": "Rejeter", "agent.discarded": "Le lot a été rejeté. Rien n’a été modifié.", "agent.request_changes": "Demander des changements", "agent.applied_title": "Modifications appliquées", "agent.applied_note": "Une sauvegarde a été créée. Les modifications de contenus existants sont déjà visibles ; les nouveaux contenus restent masqués jusqu’à leur publication.", "agent.applied_note_live": "Une sauvegarde a été créée. Les modifications sont visibles. « Annuler » rétablit l’état précédent.", "agent.applied_summary": "Le lot précédent a été appliqué.", "agent.undo": "Annuler", "agent.undo_confirm_title": "Annuler ce lot ?", "agent.undo_confirm_body": "Les contenus concernés retrouvent leur état d’avant le lot.", "agent.undone": "Le lot a été annulé.", "agent.publish": "Publier", "agent.publish_confirm_title": "Publier cet élément ?", "agent.publish_confirm_body": "Il devient visible pour les visiteurs.", "agent.publish_not_allowed": "Pour publier, il faut un rôle disposant de ce droit.", "agent.published": "Publié", "agent.item_news": "Actualité", "agent.item_event": "Événement", "agent.item_page": "Page", "agent.item_section": "Section", "agent.item_list_item": "Élément de liste", "agent.reload": "Recharger la page", "agent.attach": "Joindre des images", "agent.attach_hint": "Joindre des images (JPEG, PNG ou WebP). L’agent peut les utiliser dans le lot.", "agent.attach_blocked": "Joignez les images avant d’envoyer la demande.", "agent.drop_hint": "Déposez les images ici pour les joindre", "agent.upload_busy": "Envoi…", "agent.upload_failed": "{name} : {message}", "agent.upload_limit": "Vous pouvez joindre jusqu’à {count} images à la fois.", "agent.upload_size": "{name} est trop volumineux (max. {size} Mo).", "agent.upload_type": "Seules les images JPEG, PNG et WebP peuvent être jointes.", "agent.chips_remove": "Retirer les images", "ai.agent_title": "Agent IA", "ai.agent_hint": "L’agent traite une demande de façon autonome, prépare un lot de modifications et attend votre confirmation. Il nécessite un fournisseur compatible avec les appels d’outils et utilise plusieurs requêtes IA par exécution.", "ai.agent_enable": "Activer l’agent IA", "ai.agent_status_ready": "L’agent est prêt.", "ai.agent_status_off": "L’agent est désactivé.", "ai.agent_status_ai_off": "Activez d’abord l’IA et ajoutez une clé API.", "ai.agent_status_no_tools": "Le fournisseur ou le modèle choisi ne prend pas en charge les appels d’outils ; l’agent reste donc indisponible.", "ai.agent_status_no_gd": "L’extension PHP GD est absente : les images ne peuvent pas être préparées.", "ai.agent_status_no_webp": "GD ne prend pas en charge WebP ; les images sont enregistrées en JPEG.", "ai.agent_status_limits": "Une exécution de l’agent nécessite plusieurs requêtes IA. Augmentez les limites quotidiennes (actuellement {requests} requêtes) et le nombre maximal de jetons en entrée (actuellement {tokens}) ; environ 300 requêtes par jour et 64 000 jetons constituent un bon début.", "ai.agent_limits": "Limites par exécution", "ai.agent_runs_per_hour": "Exécutions par heure et par utilisateur", "ai.agent_max_turns": "Tours du modèle par cycle", "ai.agent_max_tool_calls": "Appels d’outils par cycle", "ai.agent_max_cost": "Plafond de coût par exécution (centimes)", "ai.agent_max_runtime": "Durée maximale (minutes)", "ai.agent_uploads": "Envois d’images par 10 minutes", "ai.agent_roles": "Ce que les rédacteurs peuvent faire", "ai.agent_roles_hint": "Les administrateurs peuvent tout faire. Les rédacteurs peuvent toujours modifier les textes, images et liens existants.", "ai.agent_right_publish": "Publier de nouveaux contenus", "ai.agent_right_stockImages": "Utiliser des photos libres", "ai.agent_right_uploadImages": "Joindre leurs propres images", "ai.agent_right_generateImages": "Générer des images IA", "ai.agent_right_research": "Faire des recherches sur le web", "ai.agent_right_structural": "Ajouter, supprimer et déplacer des éléments et sections", "ai.agent_right_createPages": "Créer des pages", "ai.agent_right_createNews": "Créer des actualités", "ai.agent_right_createEvents": "Créer des événements", "ai.agent_right_editSharedContent": "Modifier les contenus partagés (pied de page, barre latérale)", "ai.agent_images": "Images", "ai.agent_media_folder": "Dossier média des images de l’agent", "ai.agent_media_folder_hint": "Lettres minuscules, chiffres, - et _. Les images apportées par l’agent sont enregistrées dans ce dossier de assets/images/.", "ai.agent_credit_in_news": "Ajouter les crédits photo aux actualités", "ai.agent_pexels_key": "Clé API Pexels (photos libres)", "ai.agent_research": "Recherche web", "ai.agent_brave_key": "Clé API Brave Search", "ai.agent_clear_key": "Supprimer la clé API enregistrée", "ai.agent_allow_domains": "Autoriser uniquement ces sites (un par ligne, facultatif)", "ai.agent_deny_domains": "Ne jamais lire ces sites (un par ligne)", "ai.agent_respect_robots": "Respecter le robots.txt des sites", "ai.agent_sources_in_news": "Ajouter une liste de sources aux actualités", "ai.agent_clear_cache": "Vider le cache d’analyse des pages", "ai.agent_cache_cleared": "Cache vidé ({count} fichiers).", "ai.agent_cache_hint": "L’agent analyse vos modèles de pages pour savoir ce qui est modifiable. Videz le cache après avoir modifié des modèles à la main.", "system.agent": "Agent IA", "system.agent_state": "Agent", "system.agent_on": "Activé", "system.agent_off": "Désactivé", "system.agent_tools": "Appels d’outils", "system.agent_gd": "Traitement d’images (GD)", "system.agent_webp": "Sortie WebP", "system.agent_research": "Clé de recherche web", "system.agent_stock": "Clé de photos libres", "system.agent_storage_note": "L’agent stocke ses données sous content/ ; le contrôle de sécurité ci-dessus montre que ce dossier n’est pas public.", "system.upload_note": "Si la limite PHP est inférieure à la limite des images, c’est la limite PHP qui s’applique. Elle se règle dans php.ini, .user.ini ou .htaccess (upload_max_filesize, post_max_size) ; le .htaccess contient un exemple.", "system.upload_no_webp": "Impossible : GD sans WebP", "system.upload_off": "Désactivée", "system.upload_on": "Active", "system.upload_unlimited": "Illimité", "system.upload_memory": "Mémoire (memory_limit)", "system.upload_web_version": "Version web à l’envoi", "system.upload_server_bound": "la limite PHP de {max} Mo s’applique", "system.upload_image_limit": "Limite des images de la médiathèque", "system.upload_server_limit": "Limite d’envoi PHP", "system.uploads": "Envois", "system.configured": "Configuré", "system.not_configured": "Non configuré", "agent.step.read_url": "Lit {detail}", "ai.agent_research_hint": "Sans clé Brave, l’agent peut quand même lire les adresses web que l’utilisateur écrit dans le chat.", "ai.models_loading": "Chargement des modèles de votre fournisseur…", "ai.models_loaded": "{count} modèles chargés depuis votre fournisseur.", "ai.models_failed": "La liste des modèles n’a pas pu être chargée ({message}). Vous pouvez quand même saisir un nom de modèle.", "ai.agent_recommended_limits": "Utiliser les limites recommandées", "ai.agent_recommended_limits_hint": "Relève les limites de jetons et de requêtes inférieures à ce dont l’agent a besoin (64 000 jetons en entrée, 16 000 en sortie, 300 requêtes par jour). Les valeurs plus élevées restent.", "ai.agent_limits_raised": "Limites relevées au niveau requis par l’agent. Enregistrez pour les conserver.", "ai.agent_limits_fine": "Vos limites sont déjà suffisantes.", "ai.limit_kind_month": "Budget mensuel de l’IA", "ai.limit_kind_requests": "Requêtes IA par jour", "ai.limit_kind_text": "Requêtes IA de texte par jour", "ai.limit_kind_images": "Requêtes IA d’image par jour", "ai.limit_warning": "{kind} : {used} sur {limit} utilisé ({percent} %). Relevez la limite à temps.", "ai.limit_reached": "{kind} : limite atteinte ({used} sur {limit}). Les nouvelles requêtes IA sont bloquées jusqu’à ce que la limite soit relevée ou que la période se termine.", "ai.limit_adjust": "Ajuster les limites", "ai.limit_raise": "Relever de 50 %", "ai.limit_raised": "Limites relevées de moitié. Enregistrez pour les conserver.", "ai.limit_ask_admin": "Demandez à un administrateur de relever la limite.", "ai.limit_dismiss": "Masquer", "ai.limits_hint": "Les limites sont des repères, pas des murs : une requête qui démarre sous la limite peut aller à son terme, et une exécution d’agent en cours peut consommer environ 10 % de plus avant d’être arrêtée. Les nouvelles requêtes sont bloquées dès qu’une limite est atteinte. La limite d’images est stricte.", "settings.search_engines": "Moteurs de recherche", "settings.noindex_site": "Bloquer ce site pour les moteurs de recherche (staging)", "settings.noindex_site_hint": "Bloque le site dans le robots.txt, dans la balise meta robots et dans l’X-Robots-Tag, et vide le sitemap. Prévu pour les sites de test et de staging. Désactivez le blocage dès que le site est en ligne.", "settings.site_url": "Adresse du site", "settings.site_url_hint": "L’adresse publique avec https://, par exemple https://www.example.com. Elle apparaît dans les liens canoniques et dans le sitemap. Laissez le champ vide pour utiliser l’adresse visitée. Mettez-la à jour lors du passage du staging au domaine définitif.", "system.badge": "Remarques : {count}", "seo_check.title": "Moteurs de recherche", "seo_check.running": "Vérification …", "seo_check.pending": "Pas encore vérifié", "seo_check.url": "Adresse :", "seo_check.expected": "Attendu pour un site en ligne :", "seo_check.allow": "Autoriser l’indexation", "seo_check.allowed": "Le blocage est levé. La vérification est relancée.", "seo_check.where_meta": "balise meta robots", "seo_check.where_header": "X-Robots-Tag", "seo_check.skipped_local": "Installation locale : vérifiée uniquement sous une adresse publique", "seo_check.skipped_dev_server": "Impossible sur le serveur de développement PHP", "seo_check.unknown_unreachable": "Vérification impossible : le serveur n’atteint pas sa propre adresse ({detail})", "seo_check.unknown_auth": "Vérification impossible : le site est protégé par un accès restreint (HTTP 401)", "seo_check.unknown_host": "Vérification impossible : l’adresse du site est inconnue", "seo_check.unknown_no_curl": "Vérification impossible : l’extension PHP curl est absente", "seo_check.unknown_fix": "Vérifiez depuis l’extérieur que l’adresse est accessible, par exemple avec : curl -I {url}", "seo_check.robots_txt": "robots.txt", "seo_check.robots_txt_ok": "Autorise les moteurs de recherche", "seo_check.robots_txt_blocked": "Bloque tous les moteurs de recherche (Disallow: /)", "seo_check.robots_txt_status": "Répond avec {detail}", "seo_check.robots_txt_sitemap_host": "Renvoie vers un sitemap à une autre adresse : {detail}", "seo_check.robots_txt_no_sitemap": "Ne contient aucune référence au sitemap", "seo_check.robots_txt_expected": "Pas de « Disallow: / » pour tous les moteurs de recherche et une référence au sitemap de ce site.", "seo_check.robots_txt_fix_blocked_setting": "Le blocage vient du réglage « Bloquer ce site pour les moteurs de recherche » (Paramètres → Identité visuelle → Moteurs de recherche). Si le site est en ligne, autorisez l’indexation avec le bouton ci-dessous ou désactivez le réglage.", "seo_check.robots_txt_fix_blocked_file": "Un fichier robots.txt dans le dossier principal du site remplace le robots.txt propre à Raiju. Si le site est en ligne, supprimez le fichier ou retirez-en la ligne « Disallow: / ». Raiju fournira alors lui-même le robots.txt.", "seo_check.robots_txt_fix_blocked_unknown": "Le blocage ne vient ni du réglage de Raiju ni d’un fichier du dossier principal. Vérifiez si une règle de l’hébergeur, un proxy ou un autre système remplace le robots.txt.", "seo_check.robots_txt_fix_status": "Le robots.txt n’est pas servi normalement. Vérifiez les redirections et les règles de l’hébergeur pour cette adresse.", "seo_check.robots_txt_fix_sitemap_host": "Le robots.txt mentionne le sitemap d’une autre adresse, en général le domaine de staging. Saisissez l’adresse correcte du site sous Paramètres → Identité visuelle → Moteurs de recherche, ou adaptez un robots.txt personnalisé dans le dossier principal.", "seo_check.robots_txt_fix_no_sitemap": "Ajoutez au robots.txt une ligne « Sitemap: https://votre-domaine/sitemap.xml », ou supprimez un robots.txt personnalisé du dossier principal pour que Raiju le génère.", "seo_check.page_robots": "Page d’accueil pour les moteurs de recherche", "seo_check.page_robots_ok": "Aucun noindex dans la balise meta robots ni dans l’X-Robots-Tag", "seo_check.page_robots_noindex": "noindex détecté : {where}", "seo_check.page_robots_redirect": "Redirige vers une autre adresse : {detail}", "seo_check.page_robots_status": "Répond avec {detail}", "seo_check.page_robots_expected": "Ni la balise meta robots ni l’X-Robots-Tag ne contiennent noindex, et l’adresse ne redirige pas vers un autre domaine.", "seo_check.page_robots_fix_noindex_setting": "Le blocage vient du réglage « Bloquer ce site pour les moteurs de recherche » (Paramètres → Identité visuelle → Moteurs de recherche). Si le site est en ligne, autorisez l’indexation avec le bouton ci-dessous ou désactivez le réglage.", "seo_check.page_robots_fix_noindex_other": "Le réglage « Bloquer ce site pour les moteurs de recherche » est désactivé, pourtant la page d’accueil envoie noindex. Vérifiez la page d’accueil (réglages SEO : Robots), les fichiers personnalisés comme includes/header.php, le .htaccess et les règles de l’hébergeur ou d’un proxy pour l’X-Robots-Tag.", "seo_check.page_robots_fix_redirect": "L’adresse redirige vers un autre domaine, par exemple le domaine de staging ou une page de parking. Vérifiez les redirections dans l’espace d’administration de l’hébergeur et dans le .htaccess.", "seo_check.page_robots_fix_status": "La page d’accueil n’est pas servie normalement. Vérifiez les redirections et les règles de l’hébergeur pour cette adresse.", "seo_check.sitemap": "sitemap.xml", "seo_check.sitemap_ok": "Valide, {count} adresses", "seo_check.sitemap_status": "Répond avec {detail}", "seo_check.sitemap_not_xml": "N’est pas un sitemap valide (pas du XML)", "seo_check.sitemap_empty": "Ne contient aucune page", "seo_check.sitemap_empty_blocked": "Vide parce que le site est bloqué", "seo_check.sitemap_host": "{count} adresses appartiennent à un autre domaine, par exemple {detail}", "seo_check.sitemap_http": "{count} adresses utilisent http://, par exemple {detail}", "seo_check.sitemap_expected": "XML valide avec les pages de ce site, toutes les adresses sur le même domaine et avec https://.", "seo_check.sitemap_fix_status": "Le sitemap.xml n’est pas servi normalement. Vérifiez les redirections et les règles de l’hébergeur pour cette adresse.", "seo_check.sitemap_fix_not_xml": "Il n’y a pas de sitemap à cette adresse, probablement une page d’erreur ou de maintenance, ou un fichier sitemap.xml défectueux dans le dossier principal. Supprimez le fichier personnalisé pour que Raiju génère le sitemap.", "seo_check.sitemap_fix_empty": "Toutes les pages sont exclues du sitemap (privées, noindex ou « ne pas inclure dans le sitemap »), ou il n’y a pas encore de pages publiques. Vérifiez les réglages SEO des pages.", "seo_check.sitemap_fix_empty_blocked": "Le sitemap reste vide tant que le site est bloqué. Il se remplit dès que l’indexation est autorisée.", "seo_check.sitemap_fix_host": "Le sitemap mentionne des adresses d’un autre domaine, en général celui de staging. Saisissez l’adresse correcte du site sous Paramètres → Identité visuelle → Moteurs de recherche. Si un sitemap.xml personnalisé se trouve dans le dossier principal, régénérez-le ou supprimez-le.", "seo_check.sitemap_fix_http": "Le sitemap mentionne des adresses en http:// alors que le site fonctionne en https://. Saisissez l’adresse avec https:// sous Paramètres → Identité visuelle → Moteurs de recherche. Derrière un proxy, il doit transmettre X-Forwarded-Proto.", "seo_check.site_url": "Adresse du site (réglage)", "seo_check.site_url_ok": "Correspond à l’adresse visitée", "seo_check.site_url_host": "Réglé sur {url}, mais visité sous {detail}", "seo_check.site_url_scheme": "Réglé sur {url}, mais le site fonctionne en https://", "seo_check.site_url_expected": "Le même domaine que l’adresse visitée, avec https://.", "seo_check.site_url_fix_host": "Cette adresse apparaît dans les liens canoniques, le hreflang et le sitemap. Après le passage du staging au domaine définitif, elle doit être mise à jour (Paramètres → Identité visuelle → Moteurs de recherche), sinon les moteurs de recherche pointent vers l’ancien domaine.", "seo_check.site_url_fix_scheme": "Saisissez l’adresse avec https:// sous Paramètres → Identité visuelle → Moteurs de recherche.", "seo_check.page_noindex": "Pages individuelles avec noindex", "seo_check.page_noindex_ok": "Aucune", "seo_check.page_noindex_note": "{count} pages publiques sur {total} sont réglées sur noindex", "seo_check.page_noindex_expected": "Uniquement les pages qui doivent rester hors des moteurs de recherche.", "seo_check.page_noindex_fix_note": "C’est correct si c’est voulu, par exemple pour des pages de remerciement. Sinon, modifiez le réglage « Robots » dans la zone SEO de la page (liste des pages).", "seo_check.maintenance": "Mode maintenance", "seo_check.maintenance_ok": "Désactivé", "seo_check.maintenance_warning": "Activé : les visiteurs et les moteurs de recherche reçoivent la page de maintenance (HTTP 503)", "seo_check.maintenance_expected": "Mode maintenance désactivé.", "seo_check.maintenance_fix_warning": "Désactivez le mode maintenance sous Paramètres → Access dès que le site est en ligne. Des réponses 503 prolongées font disparaître les pages de l’index de recherche.", "seo_check.banner_title": "Ce site est bloqué pour les moteurs de recherche", "seo_check.banner_text_setting": "Le réglage « Bloquer ce site pour les moteurs de recherche » est activé. Sur un site de staging ou de test, c’est correct. Une fois le site en ligne, il n’apparaîtra pas ainsi dans Google.", "seo_check.banner_text_other": "Bloqué via : {where}. Sur un site de staging ou de test, c’est correct. Une fois le site en ligne, il n’apparaîtra pas ainsi dans Google.", "ai.organization_hint": "Nécessaire uniquement si les requêtes API doivent être rattachées explicitement à une organisation OpenAI précise. Sinon, laisse vide.", "ai.budget_explanation": "Les coûts reposent sur le prix du modèle réellement utilisé (prix du catalogue ou prix personnalisé). La limite locale inclut l’utilisation terminée et les réservations en cours. Les frais réels du fournisseur peuvent différer ; consulte la facturation du fournisseur.", "ai.model_label": "Modèle", "ai.model_group_chat": "Chat/Agent", "ai.model_group_chat_hint": "Pour l’assistant, l’agent IA et les brouillons de contenu complets. La qualité compte ici.", "ai.model_group_text": "Texte/SEO", "ai.model_group_text_hint": "Pour les suggestions de champ, les courtes reformulations et les textes SEO. Peut être un modèle moins cher et plus rapide.", "ai.model_group_both": "Chat/Agent et Texte/SEO", "ai.reasoning_effort": "Effort de réflexion", "ai.reasoning_recommended_with": "Recommandé ({level})", "ai.reasoning_low": "Faible", "ai.reasoning_medium": "Moyen", "ai.reasoning_high": "Élevé", "ai.reasoning_legacy": "Comportement actuel (réglage par défaut du fournisseur)", "ai.reasoning_hint": "Un effort de réflexion plus élevé peut aider pour les tâches complexes, mais augmente souvent le temps de réponse et les coûts. Pour les tâches courantes, le réglage recommandé suffit.", "ai.reasoning_unknown": "Aucun niveau de réflexion n’est connu pour ce modèle. Le réglage par défaut du fournisseur s’applique.", "ai.reasoning_reset": "Le modèle ne prend pas en charge le niveau choisi. Retour à « Recommandé ».", "ai.pricing_hint": "Les prix s’appliquent par fournisseur et par modèle, en USD ou EUR pour 1 M de jetons. Sans prix personnalisé, le prix du catalogue est utilisé. Les lectures de cache et les jetons de réflexion sont comptés selon les indications du fournisseur ; l’effort de réflexion n’entraîne aucune majoration.", "ai.price_input": "Prix d’entrée (pour 1 M de jetons)", "ai.price_output": "Prix de sortie (pour 1 M de jetons)", "ai.price_currency": "Devise", "ai.price_remove": "Supprimer le prix personnalisé", "ai.price_unknown": "Prix non renseigné", "ai.price_unknown_notice": "Aucun prix n’est renseigné pour au moins un modèle. Sans prix, le budget mensuel ne peut pas être surveillé de façon fiable en argent ; seules les limites de requêtes s’appliquent. Saisis ci-dessous un prix personnalisé.", "ai.price_status_catalog": "Prix du catalogue : {input} / {output} USD pour 1 M de jetons (entrée / sortie), au {date}.", "ai.price_status_override": "Prix personnalisé : {input} / {output} {currency} pour 1 M de jetons (entrée / sortie).", "ai.price_status_migrated": "Estimation reprise : {input} / {output} {currency} pour 1 M de jetons (entrée / sortie). Tu peux la remplacer ou la supprimer.", "ai.price_tier_multiplier": "Au-delà de {tokens} jetons d’entrée, toute la requête est facturée ainsi : entrée ×{input}, sortie ×{output}.", "ai.price_tier_absolute": "Au-delà de {tokens} jetons d’entrée, toute la requête est facturée {input} / {output} USD.", "ai.fx_custom": "Taux de change personnalisé (USD pour 1 EUR)", "ai.fx_hint": "Actuellement : 1 EUR = {rate} USD (au {date}, {source}). Les prix en USD sont convertis en euros avec ce taux.", "ai.fx_own": "taux personnalisé", "ai.usage_unpriced": "{count} requêtes de ce mois n’ont pas de prix renseigné. Leur coût n’est pas inclus dans le total.", "ai.remove_key_title": "Supprimer la clé API", "ai.remove_key_confirm": "La clé enregistrée est supprimée immédiatement, indépendamment des autres modifications non enregistrées. Les fonctions concernées ne sont de nouveau disponibles qu’après l’enregistrement d’une nouvelle clé.", "ai.remove_key_button": "Supprimer la clé", "ai.key_removed": "La clé enregistrée a été supprimée.", "ai.agent_offer_title": "Activer l’agent IA ?", "ai.agent_offer_text": "L’agent IA fonctionne particulièrement bien avec {model}. Veux-tu l’activer maintenant ?", "ai.agent_offer_confirm": "Activer l’agent", "mails.storage_off_title": "Les nouveaux messages ne sont pas enregistrés ici", "mails.storage_off_text": "« Enregistrer localement » est désactivé pour tous les formulaires activés. Les messages reçus n’apparaissent donc pas dans cette liste et n’arrivent que par e-mail, si l’envoi est configuré.", "mails.forms_disabled_title": "Aucun formulaire n’est activé", "mails.forms_disabled_text": "Tant qu’aucun formulaire n’est activé, les visiteurs ne peuvent pas envoyer de messages et cette liste reste vide.", "mails.open_forms_settings": "Ouvrir les formulaires", "ai.agent_classic_mode": "Proposer le mode classique dans le chat", "ai.agent_classic_mode_hint": "Le chat permet de passer de l’agent à l’assistant classique. Le mode classique est plus rapide et moins cher pour les questions et les suggestions de texte isolées. Désactive-le si le chat ne doit montrer que l’agent.", "ai.images_section": "Images", "ai.images_section_hint": "Les images viennent d’un service à part, indépendant du fournisseur de chat. L’agent IA, l’assistant et le générateur d’images l’utilisent ensemble.", "ai.image_service": "Service d’images", "ai.image_service_inherit": "Comme le fournisseur de chat", "ai.image_service_openai": "OpenAI", "ai.image_service_openrouter": "OpenRouter", "ai.image_service_kie": "Kie.ai", "ai.image_service_fal": "fal.ai", "ai.image_service_comet": "Comet API", "ai.image_service_custom": "Personnalisé (compatible OpenAI)", "ai.image_service_inherit_hint": "Utilise les modèles d’images du fournisseur de chat (impossible avec Anthropic).", "ai.image_service_inherit_anthropic": "Anthropic n’a pas d’API d’images. Choisis un service d’images pour que l’agent et les fonctions d’image puissent créer des images.", "ai.image_service_key_own": "Clé propre enregistrée. Laisse le champ inchangé pour la conserver.", "ai.image_service_key_chat": "Pas de clé propre : la clé du fournisseur de chat du même nom est utilisée. Saisis ici une clé pour en utiliser une distincte.", "ai.image_service_key_none": "Aucune clé API enregistrée pour ce service.", "ai.image_service_unverified": "Les paramètres de ce modèle n’ont pas été vérifiés avec la documentation du fournisseur. Des valeurs par défaut sont utilisées ; ajoute ci-dessous des paramètres propres au modèle si nécessaire.", "ai.image_service_custom_base_url": "URL de base", "ai.image_service_custom_base_url_hint": "Adresse d’un service avec un point d’accès /images/generations compatible OpenAI, p. ex. https://api.example.com/v1. Les adresses locales nécessitent l’option « Autoriser l’URL de fournisseur locale/privée ».", "ai.image_service_custom_base_url_missing": "Saisis l’URL de base du service d’images.", "ai.image_service_size_mode": "Paramètre de taille", "ai.image_service_size_mode_size": "Taille en pixels (size: 1024x1024)", "ai.image_service_size_mode_aspect": "Rapport d’aspect (aspect_ratio: 16:9)", "ai.image_service_size_mode_none": "Ne pas envoyer de taille", "ai.image_service_auth_style": "Authentification", "ai.image_service_extra_params": "Paramètres personnalisés (JSON)", "ai.image_service_extra_params_hint": "Facultatif. Ajouté à chaque requête de ce service, p. ex. des options propres au modèle. N’y saisis pas de clés. prompt, model et n sont définis par Raiju.", "ai.image_price_model": "Prix de l’image", "ai.image_price_per_image": "Prix par image", "ai.image_price_status_override": "Prix personnalisé : {price} {currency} par image.", "ai.image_price_status_catalog": "Prix du catalogue : {price} {currency} par image, au {date}.", "ai.image_price_status_default": "Aucun prix n’est renseigné pour ce modèle : le prix par défaut de {cents} centimes par image s’applique.", "ai.usage_unpriced_images": "{count} requêtes d’images ce mois-ci n’ont pas de prix renseigné. Leur coût n’est pas inclus dans le total.", "ai.image_price_tables": "Prix par résolution et qualité (facultatif)", "ai.image_price_tables_hint": "Si le modèle facture différemment selon la résolution ou la qualité, saisis ici le prix par image de chacune. Une requête utilise le prix de sa résolution, puis celui de sa qualité, puis le prix par image ci-dessus. Les champs vides utilisent le prix par image.", "ai.image_price_status_tables": "Des prix par résolution ou qualité sont aussi renseignés.", "ai.image_price_status_tables_only": "Des prix par résolution ou qualité sont renseignés ; les requêtes sans correspondance utilisent le prix par défaut par image.", "ai.image_service_models_loaded": "{count} modèles chargés depuis le service. Tu peux toujours saisir n’importe quel ID de modèle.", "ai.image_service_unusable_key": "Le service d’images {service} n’a pas encore de clé API. Ajoutes-en une dans Paramètres IA → Images.", "ai.image_service_unusable_model": "Aucun modèle d’images n’est choisi pour {service}. Choisis-en un dans Paramètres IA → Images.", "ai.image_price_status_catalog_tables": "Prix du catalogue par résolution ou qualité, au {date}.", "settings.dashboard_design": "Design" }