You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

435 lines
22 KiB
TypeScript

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;