const fr = { // Navigation 'nav.syntheses': 'Syntheses', 'nav.themes': 'Personnaliser les syntheses', 'nav.settings': 'Parametres', 'nav.admin': 'Administration', 'nav.logout': 'Deconnexion', 'nav.menu': 'Menu', 'nav.menuOpen': 'Ouvrir le menu', 'nav.menuClose': 'Fermer le menu', // Auth 'auth.loginTitle': 'AI Weekly Synth', 'auth.loginSubtitle': 'Votre synthese hebdomadaire des actualites IA', 'auth.emailLabel': 'Adresse email', 'auth.emailPlaceholder': 'adresse@email.com', 'auth.displayNameLabel': 'Nom (optionnel)', 'auth.displayNamePlaceholder': 'Votre nom', 'auth.requestLink': 'Recevoir un lien de connexion', 'auth.createAccountButton': 'Creer mon compte', 'auth.noAccount': 'Pas encore de compte ?', 'auth.createAccount': 'Creer un compte', 'auth.hasAccount': 'Deja un compte ?', 'auth.signIn': 'Se connecter', 'auth.checkInbox': 'Verifiez votre boite de reception', 'auth.linkSent': 'Un lien de connexion vous a ete envoye a {email}.', 'auth.linkSentDescription': 'Cliquez sur le lien dans l\'email pour vous connecter. Verifiez egalement votre dossier spam.', 'auth.resendLink': 'Renvoyer le lien', 'auth.resendIn': 'Renvoyer dans {seconds}s', 'auth.verifying': 'Verification en cours...', 'auth.verifySuccess': 'Connexion reussie ! Redirection...', 'auth.verifyError': 'Le lien est invalide ou a expire.', 'auth.verifyErrorDescription': 'Le lien que vous avez utilise est invalide ou a expire. Veuillez demander un nouveau lien de connexion.', 'auth.backToLogin': 'Retour a la connexion', 'auth.sessionExpired': 'Votre session a expire. Veuillez vous reconnecter.', 'auth.invalidEmail': 'Veuillez entrer une adresse email valide.', 'auth.turnstileRequired': 'Veuillez completer la verification.', 'auth.rateLimited': 'Trop de tentatives. Veuillez reessayer plus tard.', 'auth.registerTitle': 'Creer un compte', 'auth.registerSubtitle': 'Rejoignez AI Weekly Synth pour generer vos syntheses personnalisees.', // Home 'home.title': "Syntheses d'Actualites par IA", 'home.subtitle': 'Retrouvez ici toutes vos syntheses hebdomadaires generees automatiquement.', 'home.newSynthesis': 'Nouvelle Synthese', 'home.empty.title': 'Aucune synthese', 'home.empty.description': 'Commencez par generer votre premiere synthese hebdomadaire.', 'home.empty.action': 'Generer', 'home.comingSoon': 'Disponible prochainement', 'home.weekLabel': 'Semaine {week}', 'home.cardTitle': 'Synthese de la semaine', 'home.readLink': 'Lire la synthese', 'home.deleteConfirm': 'Confirmer', 'home.deleteTooltip': 'Supprimer', 'home.deleteConfirmTooltip': 'Cliquer a nouveau pour confirmer', 'home.noPreview': 'Aucune annonce majeure cette semaine.', 'home.previewCount': '{count} articles', 'home.loadError': 'Erreur lors du chargement des syntheses.', 'home.deleteError': 'Erreur lors de la suppression de la synthese.', 'home.generationInProgress': 'Une generation est en cours...', 'home.viewProgress': 'Voir la progression', // Generate 'generate.title': 'Generer la Synthese Hebdomadaire', 'generate.description': "Selectionnez un theme puis lancez la generation pour analyser les actualites via l'IA.", 'generate.note': 'Note : La generation peut prendre jusqu\'a 10 minutes.', 'generate.launch': 'Lancer la generation', 'generate.inProgress': 'Generation en cours...', 'generate.step.sources': 'Sources personnalisees', 'generate.step.websearch': 'Recherche web', 'generate.step.saving': 'Sauvegarde', 'generate.complete': 'Synthese generee avec succes ! Redirection...', 'generate.error': 'Une erreur est survenue lors de la generation.', 'generate.canLeave': 'Vous pouvez quitter cette page. La generation continuera en arriere-plan.', 'generate.retry': 'Reessayer', 'generate.alreadyInProgress': 'Une generation est deja en cours.', 'generate.provider': 'Fournisseur', 'generate.model': 'Modele', 'generate.noWebSearchWarning': 'Le fournisseur selectionne ne supporte pas la recherche web. Les resultats seront bases uniquement sur les connaissances du modele.', 'generate.selectTheme': 'Theme a generer', 'generate.noThemes': 'Aucun theme configure. Creez un theme pour pouvoir generer une synthese.', 'generate.createThemeLink': 'Creer un theme', // Synthesis Detail 'synthesis.title': 'Synthese de la Semaine {week}', 'synthesis.generatedAt': 'Generee le {date}', 'synthesis.backLink': 'Retour aux syntheses', 'synthesis.delete': 'Supprimer', 'synthesis.deleteConfirmMessage': 'Etes-vous sur de vouloir supprimer cette synthese definitivement ?', 'synthesis.deleteCancel': 'Annuler', 'synthesis.deleteConfirm': 'Confirmer la suppression', 'synthesis.notFound': 'Synthese introuvable.', 'synthesis.loadError': 'Erreur lors du chargement de la synthese.', 'synthesis.deleteError': 'Erreur lors de la suppression.', 'synthesis.backToHome': 'Retour a l\'accueil', 'synthesis.noSections': 'Aucune section trouvee dans cette synthese.', 'synthesis.displayCompact': 'Compact', 'synthesis.displayFull': 'Complet', // Synthesis - Email 'synthesis.email.title': 'Envoyer par email', 'synthesis.email.placeholder': 'adresse@email.com', 'synthesis.email.send': 'Envoyer par email', 'synthesis.email.sendSelf': 'S\'envoyer a soi-meme', 'synthesis.email.sending': 'Envoi en cours...', 'synthesis.email.success': 'L\'email a ete envoye avec succes !', 'synthesis.email.error': 'Erreur lors de l\'envoi de l\'email.', // Synthesis - Export 'synthesis.export.title': 'Exporter', 'synthesis.export.markdown': 'Exporter en Markdown', 'synthesis.export.pdf': 'Exporter en PDF', 'synthesis.export.downloading': 'Telechargement...', 'synthesis.export.error': 'Erreur lors de l\'export.', // Settings - Section headings 'settings.section.content': 'Contenu', 'settings.section.contentDesc': 'Definissez le theme, les categories et le format des syntheses.', 'settings.section.sources': 'Sources', 'settings.section.sourcesDesc': 'Configurez l\'extraction des articles depuis vos sources personnalisees.', 'settings.section.ai': 'Intelligence Artificielle', 'settings.section.aiDesc': 'Choisissez le fournisseur, les modeles et configurez vos cles API.', 'settings.section.performance': 'Performance', 'settings.section.performanceDesc': 'Parametres techniques pour optimiser la generation.', 'settings.section.importExport': 'Import / Export', 'settings.section.importExportDesc': 'Sauvegardez ou restaurez votre configuration.', 'settings.aiKeyConfigured': 'Cle configuree', 'settings.aiKeyNotConfigured': 'Cle non configuree', // Settings 'settings.title': 'Parametres de generation', 'settings.theme': 'Theme de la recherche', 'settings.themeHelp': "Le sujet principal pour la recherche d'actualites (ex: Intelligence Artificielle, Cybersecurite, etc.).", 'settings.maxAgeDays': 'Anciennete maximum (jours)', 'settings.maxItems': 'Actualites max par categorie', 'settings.maxArticlesPerSource': 'Articles max par source', 'settings.maxLinksPerSource': 'Liens max par source', 'settings.maxLinksPerSourceHelp': 'Nombre maximum de liens extraits de chaque source. Les premiers liens sont generalement les plus recents.', 'settings.searchBehavior': "Comportement de l'agent de recherche", 'settings.searchBehaviorHelp': "Personnalisez les instructions donnees a l'IA concernant sa methode de recherche.", 'settings.searchBehaviorPlaceholder': "Tu peux egalement utiliser d'autres sources pertinentes trouvees via la recherche Google.", 'settings.model': "Modele d'IA", 'settings.modelHelp': "Choisissez le modele d'IA utilise pour generer les syntheses. Le modele Pro est conseille pour des resultats plus pertinents et une meilleure analyse.", 'settings.categories': "Categories d'actualite", 'settings.addCategory': 'Ajouter', 'settings.newCategory': 'Nouvelle categorie', 'settings.removeCategory': 'Supprimer cette categorie', 'settings.save': 'Enregistrer les parametres', 'settings.saved': 'Parametres enregistres avec succes.', 'settings.saveError': "Erreur lors de l'enregistrement des parametres.", 'settings.loadError': 'Erreur lors du chargement des parametres.', 'settings.modelResearch': "Modele d'IA (Recherche et Extraction)", 'settings.modelResearchHelp': "Choisissez le modele d'IA utilise pour rechercher et extraire les informations.", 'settings.modelWebsearch': "Modele d'IA (Recherche Web)", 'settings.modelWebsearchHelp': "Choisissez le modele d'IA utilise pour la recherche web et la generation des syntheses.", 'settings.rateLimitSection': 'Limitation de taux', 'settings.rateLimitMaxRequests': 'Requetes maximum', 'settings.rateLimitTimeWindow': 'Fenetre de temps (secondes)', 'settings.rateLimitHelp': "Configurez le nombre maximum de requetes autorisees pendant la fenetre de temps specifiee. Laissez vide pour utiliser les valeurs par defaut de l'administrateur.", 'settings.rateLimitEffective': '{max} requetes / {window} secondes', 'settings.rateLimitReset': 'Reinitialiser', 'settings.useBraveSearch': 'Utiliser Brave Search pour la recherche web', 'settings.useBraveSearchHelp': "Remplace la recherche web par IA par l'API Brave Search pour des resultats plus precis.", 'settings.braveSearch': 'Brave Search', 'settings.braveSearchKey': 'Cle API Brave Search', 'settings.braveSearchKeyHelp': 'Obtenez une cle sur api-dashboard.search.brave.com. Le plan gratuit offre 2000 requetes/mois.', 'settings.braveSearchNotConfigured': 'Configurez une cle API Brave Search pour activer cette option.', 'settings.articleHistoryDays': 'Historique des articles (jours)', 'settings.batchSize': 'Taille du lot de traitement', 'settings.batchSizeHelp': 'Nombre d\'articles traites en parallele lors de la generation (defaut: 5).', 'settings.sourceExtractionWindow': 'Sources par vague d\'extraction', 'settings.sourceExtractionWindowHelp': 'Nombre de sources analysees en parallele a chaque vague. Reduit le nombre d\'appels IA quand peu de sources suffisent.', 'settings.summaryLength': 'Niveau de detail des resumes', 'settings.summaryLengthHelp': 'Controle la longueur des resumes generes pour chaque article.', 'settings.summaryShort': 'Court', 'settings.summaryMedium': 'Moyen', 'settings.summaryDetailed': 'Detaille', 'settings.export': 'Exporter', 'settings.import': 'Importer', 'settings.exportIncludeKeys': 'Inclure les cles API', 'settings.exportKeysWarning': 'Les cles API seront incluses en clair dans le fichier. Ne partagez pas ce fichier.', 'settings.importSuccess': "Configuration importee avec succes. N'oubliez pas d'enregistrer.", 'settings.importError': "Erreur lors de l'importation du fichier JSON.", // Sources 'sources.title': 'Sources Personnalisees', 'sources.subtitle': "Ajoutez des sites web ou des blogs que l'IA devra obligatoirement consulter lors de la generation de vos syntheses. Ces sources s'ajoutent aux sources par defaut.", 'sources.addTitle': 'Ajouter une source', 'sources.titleLabel': 'Titre', 'sources.titlePlaceholder': 'Nom de la source (ex: Blog de Yann LeCun)', 'sources.urlLabel': 'URL', 'sources.urlPlaceholder': 'https://...', 'sources.add': 'Ajouter', 'sources.csvSection': 'Import / Export CSV', 'sources.csvDescription': 'Sauvegardez vos sources ou importez-en de nouvelles depuis un fichier CSV.', 'sources.exportCsv': 'Exporter en CSV', 'sources.importCsv': 'Importer depuis un CSV', 'sources.bulkSection': 'Import en masse', 'sources.bulkDescription': "Ajoutez plusieurs sources d'un coup. Une source par ligne, au format :", 'sources.bulkFormat': 'Nom de la source;URL', 'sources.bulkPlaceholder': 'Blog IA;https://blog.ia.com\nNews Tech;https://tech.news.fr', 'sources.bulkImport': 'Importer les sources', 'sources.importing': 'Importation...', 'sources.empty': 'Aucune source personnalisee pour le moment.', 'sources.emptyHint': "L'ajout de sources permet a l'IA de consulter vos sites preferes en priorite.", 'sources.deleteTitle': 'Supprimer', 'sources.confirmDelete': 'Confirmer ?', 'sources.addError': "Erreur lors de l'ajout de la source.", 'sources.deleteError': 'Erreur lors de la suppression de la source.', 'sources.bulkImportError': "Aucune source valide trouvee. Verifiez le format (Nom;URL).", 'sources.csvImportError': "Erreur lors de l'importation du fichier CSV.", 'sources.csvNoValidSources': 'Aucune source valide trouvee dans le fichier CSV.', 'sources.exportError': "Erreur lors de l'export CSV.", 'sources.titleRequired': 'Le titre est requis.', 'sources.urlRequired': "L'URL est requise.", 'sources.urlInvalid': "L'URL n'est pas valide.", // Themes 'themes.title': 'Personnaliser les syntheses', 'themes.selectTheme': 'Choisir un theme', 'themes.createTheme': 'Creer un nouveau theme', 'themes.contentSection': 'Contenu', 'themes.name': 'Nom du theme', 'themes.searchTopic': 'Sujet de recherche', 'themes.searchTopicHelp': 'Le sujet que l\'IA utilisera pour rechercher des actualites.', 'themes.deleteTheme': 'Supprimer ce theme', 'themes.deleteConfirm': 'Les syntheses existantes seront conservees. Confirmer la suppression ?', 'themes.deleted': 'Theme supprime', 'themes.saved': 'Theme enregistre', 'themes.created': 'Theme cree', 'themes.noThemes': 'Aucun theme configure. Creez votre premier theme pour commencer.', // Settings - API Keys 'settings.apiKeys.title': 'Vos cles API', 'settings.apiKeys.description': 'Configurez vos cles API pour chaque fournisseur. Votre cle est chiffree et stockee de maniere securisee.', 'settings.apiKeys.configured': 'Configuree', 'settings.apiKeys.notConfigured': 'Non configuree', 'settings.apiKeys.keyPrefix': 'Cle : {prefix}', 'settings.apiKeys.inputLabel': 'Cle API', 'settings.apiKeys.inputPlaceholder': 'Entrez votre cle API pour {provider}', 'settings.apiKeys.showKey': 'Afficher la cle', 'settings.apiKeys.hideKey': 'Masquer la cle', 'settings.apiKeys.save': 'Enregistrer', 'settings.apiKeys.saving': 'Enregistrement...', 'settings.apiKeys.saved': 'Cle API enregistree avec succes.', 'settings.apiKeys.saveError': "Erreur lors de l'enregistrement de la cle API.", 'settings.apiKeys.update': 'Modifier', 'settings.apiKeys.test': 'Tester', 'settings.apiKeys.testing': 'Test en cours...', 'settings.apiKeys.testSuccess': 'Cle API valide. Connexion reussie.', 'settings.apiKeys.testFailure': 'Cle API invalide : {message}', 'settings.apiKeys.delete': 'Supprimer', 'settings.apiKeys.deleteConfirm': 'Etes-vous sur de vouloir supprimer cette cle API ? Vous ne pourrez plus generer de syntheses avec ce fournisseur.', 'settings.apiKeys.deleted': 'Cle API supprimee avec succes.', 'settings.apiKeys.deleteError': 'Erreur lors de la suppression de la cle API.', 'settings.apiKeys.loadError': 'Erreur lors du chargement des cles API.', 'settings.apiKeys.noWebSearch': 'Ce fournisseur ne supporte pas la recherche web native. Le scraping backend sera utilise.', // Settings - Provider 'settings.provider': "Fournisseur d'IA", 'settings.providerHelp': "Selectionnez le fournisseur d'IA pour generer les syntheses.", 'settings.providerPlaceholder': 'Selectionnez un fournisseur', 'settings.modelPlaceholder': 'Selectionnez un modele', 'settings.providerUnavailable': "Le fournisseur que vous utilisiez n'est plus disponible. Veuillez en selectionner un autre.", 'settings.provider.webSearchInfo': 'La recherche web en temps reel est disponible avec ce fournisseur.', 'settings.provider.noWebSearchInfo': 'Les resultats seront bases sur les connaissances du modele, sans recherche web.', 'settings.provider.geminiInfo': 'Google Gemini avec recherche Google integree.', 'settings.provider.openaiInfo': 'OpenAI avec recherche web integree.', 'settings.provider.anthropicInfo': 'Anthropic Claude avec recherche web integree.', 'settings.provider.webSearchBadge': 'Recherche web', 'settings.provider.noWebSearchBadge': 'Sans recherche web', // Admin - Navigation 'admin.title': 'Administration', 'admin.nav.providers': 'Fournisseurs', 'admin.nav.rateLimits': 'Limites', 'admin.nav.users': 'Utilisateurs', // Admin - Providers 'admin.providers.title': 'Configuration des fournisseurs LLM', 'admin.providers.subtitle': 'Gerez les fournisseurs et modeles disponibles pour les utilisateurs.', 'admin.providers.add': 'Ajouter un fournisseur', 'admin.providers.providerName': 'Identifiant du fournisseur', 'admin.providers.providerNamePlaceholder': 'ex: openai, anthropic, gemini', 'admin.providers.displayName': "Nom d'affichage", 'admin.providers.displayNamePlaceholder': 'ex: OpenAI, Google Gemini', 'admin.providers.models': 'Modeles disponibles', 'admin.providers.modelsScraping': 'Modeles (Extraction / Scraping)', 'admin.providers.modelsWebsearch': 'Modeles (Recherche Web)', 'admin.providers.modelId': 'Identifiant du modele', 'admin.providers.modelIdPlaceholder': 'ex: gpt-4o', 'admin.providers.modelDisplayName': "Nom d'affichage du modele", 'admin.providers.modelDisplayNamePlaceholder': 'ex: GPT-4o', 'admin.providers.defaultModel': 'Modele par defaut', 'admin.providers.enabled': 'Active', 'admin.providers.disabled': 'Desactive', 'admin.providers.addModel': 'Ajouter un modele', 'admin.providers.removeModel': 'Retirer ce modele', 'admin.providers.save': 'Enregistrer', 'admin.providers.delete': 'Supprimer le fournisseur', 'admin.providers.deleteConfirm': 'Etes-vous sur de vouloir supprimer ce fournisseur ? Cette action est irreversible.', 'admin.providers.saved': 'Fournisseur enregistre avec succes.', 'admin.providers.deleted': 'Fournisseur supprime avec succes.', 'admin.providers.saveError': "Erreur lors de l'enregistrement du fournisseur.", 'admin.providers.deleteError': 'Erreur lors de la suppression du fournisseur.', 'admin.providers.loadError': 'Erreur lors du chargement des fournisseurs.', 'admin.providers.empty': 'Aucun fournisseur configure.', 'admin.providers.emptyHint': 'Ajoutez un fournisseur LLM pour que les utilisateurs puissent generer des syntheses.', 'admin.providers.noModels': 'Aucun modele configure pour ce fournisseur.', 'admin.providers.created': 'Fournisseur cree avec succes.', 'admin.providers.createError': 'Erreur lors de la creation du fournisseur.', // Admin - Rate Limits 'admin.rateLimits.title': "Configuration des limites d'usage", 'admin.rateLimits.subtitle': 'Definissez les limites de requetes par fournisseur.', 'admin.rateLimits.maxRequests': 'Requetes maximum', 'admin.rateLimits.timeWindow': 'Fenetre de temps (secondes)', 'admin.rateLimits.effectiveRate': '{count} requetes / {seconds} secondes', 'admin.rateLimits.save': 'Enregistrer', 'admin.rateLimits.saved': 'Limites enregistrees avec succes.', 'admin.rateLimits.saveError': "Erreur lors de l'enregistrement des limites.", 'admin.rateLimits.loadError': 'Erreur lors du chargement des limites.', 'admin.rateLimits.empty': 'Aucune limite configuree.', 'admin.rateLimits.emptyHint': 'Les limites apparaitront automatiquement lorsque des fournisseurs seront configures.', // Admin - Users 'admin.users.title': 'Gestion des utilisateurs', 'admin.users.subtitle': 'Consultez et gerez les roles des utilisateurs.', 'admin.users.email': 'Email', 'admin.users.displayName': 'Nom', 'admin.users.role': 'Role', 'admin.users.createdAt': "Date d'inscription", 'admin.users.roleAdmin': 'Administrateur', 'admin.users.roleUser': 'Utilisateur', 'admin.users.changeRole': 'Modifier le role', 'admin.users.promoteConfirm': 'Etes-vous sur de vouloir promouvoir cet utilisateur en administrateur ?', 'admin.users.demoteConfirm': 'Etes-vous sur de vouloir retirer les droits administrateur de cet utilisateur ?', 'admin.users.roleUpdated': 'Role mis a jour avec succes.', 'admin.users.roleUpdateError': 'Erreur lors de la mise a jour du role.', 'admin.users.loadError': 'Erreur lors du chargement des utilisateurs.', 'admin.users.cannotDemoteSelf': 'Vous ne pouvez pas modifier votre propre role.', 'admin.users.empty': 'Aucun utilisateur enregistre.', 'admin.users.makeAdmin': 'Promouvoir admin', 'admin.users.makeUser': 'Retirer admin', // Article History 'articleHistory.title': 'Historique des articles', 'articleHistory.date': 'Date', 'articleHistory.articleTitle': 'Titre', 'articleHistory.url': 'URL', 'articleHistory.sourceType': 'Source', 'articleHistory.status': 'Statut', 'articleHistory.category': 'Categorie', 'articleHistory.synthesis': 'Synthese', 'articleHistory.empty': 'Aucun historique disponible.', 'articleHistory.filterStatus': 'Filtrer par statut', 'articleHistory.filterSourceType': 'Filtrer par type de source', 'articleHistory.all': 'Tous', 'articleHistory.statusUsed': 'Utilise', 'articleHistory.statusFiltered': 'Filtre', 'articleHistory.viewHistory': 'Historique des articles', 'articleHistory.provenance': 'Provenance', 'articleHistory.provenanceEmpty': 'Aucune donnee de provenance disponible pour cette synthese.', 'articleHistory.provenanceDescription': 'Articles candidats traites lors de la generation de cette synthese.', 'articleHistory.clearAll': 'Effacer l\'historique', 'articleHistory.clearConfirm': 'Etes-vous sur de vouloir effacer tout l\'historique des articles ? Cette action est irreversible.', 'articleHistory.cleared': 'Historique efface', // LLM Logs 'llmLogs.title': 'Logs des appels IA', 'llmLogs.callType': 'Type', 'llmLogs.model': 'Modele', 'llmLogs.duration': 'Duree', 'llmLogs.systemPrompt': 'Prompt systeme', 'llmLogs.userPrompt': 'Prompt utilisateur', 'llmLogs.response': 'Reponse', 'llmLogs.empty': 'Aucun log disponible pour cette synthese.', 'llmLogs.viewLogs': 'Voir les logs IA', 'llmLogs.seconds': 's', 'llmLogs.back': 'Retour', 'llmLogs.articleUrl': 'Article', // Common 'common.loading': 'Chargement...', 'common.error': 'Une erreur est survenue.', 'common.errorTitle': 'Erreur inattendue', 'common.errorDescription': "Une erreur inattendue s'est produite. Veuillez reessayer.", 'common.retry': 'Reessayer', 'common.confirm': 'Confirmer', 'common.cancel': 'Annuler', 'common.delete': 'Supprimer', 'common.save': 'Enregistrer', 'common.close': 'Fermer', } as const; export type TranslationKey = keyof typeof fr; export default fr;