From 849dc0560b7058456a8e0f4a651880832d538474 Mon Sep 17 00:00:00 2001 From: Laurent Magnien Date: Wed, 13 Mar 2024 11:20:55 +0100 Subject: [PATCH] feat: add French fr-FR (#2810) Co-authored-by: Laurent Magnien --- web/i18n/fr-FR/app-annotation.ts | 87 +++++ web/i18n/fr-FR/app-api.ts | 82 +++++ web/i18n/fr-FR/app-debug.ts | 409 +++++++++++++++++++++ web/i18n/fr-FR/app-log.ts | 69 ++++ web/i18n/fr-FR/app-overview.ts | 139 +++++++ web/i18n/fr-FR/app.ts | 54 +++ web/i18n/fr-FR/billing.ts | 115 ++++++ web/i18n/fr-FR/common.ts | 505 ++++++++++++++++++++++++++ web/i18n/fr-FR/custom.ts | 30 ++ web/i18n/fr-FR/dataset-creation.ts | 130 +++++++ web/i18n/fr-FR/dataset-documents.ts | 349 ++++++++++++++++++ web/i18n/fr-FR/dataset-hit-testing.ts | 28 ++ web/i18n/fr-FR/dataset-settings.ts | 33 ++ web/i18n/fr-FR/dataset.ts | 47 +++ web/i18n/fr-FR/explore.ts | 41 +++ web/i18n/fr-FR/layout.ts | 4 + web/i18n/fr-FR/login.ts | 59 +++ web/i18n/fr-FR/register.ts | 4 + web/i18n/fr-FR/share-app.ts | 74 ++++ web/i18n/fr-FR/tools.ts | 115 ++++++ web/i18n/language.ts | 2 +- 21 files changed, 2375 insertions(+), 1 deletion(-) create mode 100644 web/i18n/fr-FR/app-annotation.ts create mode 100644 web/i18n/fr-FR/app-api.ts create mode 100644 web/i18n/fr-FR/app-debug.ts create mode 100644 web/i18n/fr-FR/app-log.ts create mode 100644 web/i18n/fr-FR/app-overview.ts create mode 100644 web/i18n/fr-FR/app.ts create mode 100644 web/i18n/fr-FR/billing.ts create mode 100644 web/i18n/fr-FR/common.ts create mode 100644 web/i18n/fr-FR/custom.ts create mode 100644 web/i18n/fr-FR/dataset-creation.ts create mode 100644 web/i18n/fr-FR/dataset-documents.ts create mode 100644 web/i18n/fr-FR/dataset-hit-testing.ts create mode 100644 web/i18n/fr-FR/dataset-settings.ts create mode 100644 web/i18n/fr-FR/dataset.ts create mode 100644 web/i18n/fr-FR/explore.ts create mode 100644 web/i18n/fr-FR/layout.ts create mode 100644 web/i18n/fr-FR/login.ts create mode 100644 web/i18n/fr-FR/register.ts create mode 100644 web/i18n/fr-FR/share-app.ts create mode 100644 web/i18n/fr-FR/tools.ts diff --git a/web/i18n/fr-FR/app-annotation.ts b/web/i18n/fr-FR/app-annotation.ts new file mode 100644 index 00000000000000..3926fe5e2683ed --- /dev/null +++ b/web/i18n/fr-FR/app-annotation.ts @@ -0,0 +1,87 @@ +const translation = { + title: 'Annotations', + name: 'Réponse à l\'Annotation', + editBy: 'Réponse éditée par {{author}}', + noData: { + title: 'Aucune annotation', + description: 'Vous pouvez modifier les annotations en déboguant l\'application, ou importer des annotations en masse ici pour une réponse de haute qualité.', + }, + table: { + header: { + question: 'question', + answer: 'réponse', + createdAt: 'créé à', + hits: 'clics', + actions: 'actions', + addAnnotation: 'Ajouter une Annotation', + bulkImport: 'Importation en Vrac', + bulkExport: 'Exportation en Vrac', + clearAll: 'Effacer toutes les annotations', + }, + }, + editModal: { + title: 'Modifier la réponse à l\'annotation', + queryName: 'Requête de l\'utilisateur', + answerName: 'Bot conteur', + yourAnswer: 'Votre réponse', + answerPlaceholder: 'Tapez votre réponse ici', + yourQuery: 'Votre requête', + queryPlaceholder: 'Tapez votre requête ici', + removeThisCache: 'Supprimez cette Annotation', + createdAt: 'Créé à', + }, + addModal: { + title: 'Ajouter une réponse d\'annotation', + queryName: 'Question', + answerName: 'Réponse', + answerPlaceholder: 'Tapez la réponse ici', + queryPlaceholder: 'Tapez la requête ici', + createNext: 'Ajoutez une autre réponse annotée', + }, + batchModal: { + title: 'Importation en masse', + csvUploadTitle: 'Glissez et déposez votre fichier CSV ici, ou', + browse: 'parcourir', + tip: 'Le fichier CSV doit se conformer à la structure suivante :', + question: 'question', + answer: 'réponse', + contentTitle: 'contenu du bloc', + content: 'contenu', + template: 'Téléchargez le modèle ici', + cancel: 'Annuler', + run: 'Exécuter le lot', + runError: 'L\'exécution du lot a échoué', + processing: 'Dans le traitement par lots', + completed: 'Importation terminée', + error: 'Erreur d\'Importation', + ok: 'D\'accord', + }, + errorMessage: { + answerRequired: 'Une réponse est requise', + queryRequired: 'La question est requise', + }, + viewModal: { + annotatedResponse: 'Réponse à l\'annotation', + hitHistory: 'Historique des coups', + hit: 'Clic', + hits: 'Clics', + noHitHistory: 'Aucun historique de recherche', + }, + hitHistoryTable: { + query: 'Requête', + match: 'Correspondance', + response: 'Réponse', + source: 'Source', + score: 'Score', + time: 'Temps', + }, + initSetup: { + title: 'Réponse d\'Annotation Configuration Initiale', + configTitle: 'Configuration de la Réponse d\'Annotation', + confirmBtn: 'Enregistrer & Activer', + configConfirmBtn: 'Enregistrer', + }, + embeddingModelSwitchTip: 'Modèle de vectorisation de texte d\'annotation, changer de modèles entraînera une ré-intégration, ce qui entraînera des coûts supplémentaires.', +} + +export default translation diff --git a/web/i18n/fr-FR/app-api.ts b/web/i18n/fr-FR/app-api.ts new file mode 100644 index 00000000000000..c214e0a9c9324f --- /dev/null +++ b/web/i18n/fr-FR/app-api.ts @@ -0,0 +1,82 @@ +const translation = { + apiServer: 'Serveur API', + apiKey: 'Clé API', + status: 'Statut', + disabled: 'Désactivé', + ok: 'En Service', + copy: 'Copier', + copied: 'Copié', + play: 'Jouer', + pause: 'Pause', + playing: 'Jouant', + merMaind: { + rerender: 'Refaire Rerendu', + }, + never: 'Jamais', + apiKeyModal: { + apiSecretKey: 'Clé secrète de l\'API', + apiSecretKeyTips: 'Pour prévenir l\'abus de l\'API, protégez votre clé API. Évitez de l\'utiliser comme du texte brut dans le code front-end. :)', + createNewSecretKey: 'Créer une nouvelle clé secrète', + secretKey: 'Clé Secrète', + created: 'CRÉÉ', + lastUsed: 'DERNIÈRE UTILISATION', + generateTips: 'Gardez cette clé dans un endroit sûr et accessible.', + }, + actionMsg: { + deleteConfirmTitle: 'Supprimer cette clé secrète ?', + deleteConfirmTips: 'Cette action ne peut pas être annulée.', + ok: 'D\'accord', + }, + completionMode: { + title: 'API de l\'application Completion', + info: 'Pour une génération de texte de haute qualité, telle que des articles, des résumés et des traductions, utilisez l\'API completion-messages avec l\'entrée de l\'utilisateur. La génération de texte repose sur les paramètres du modèle et les modèles de prompt définis dans', + createCompletionApi: 'Créer un Message de Fin', + createCompletionApiTip: 'Créez un message de fin pour soutenir le mode question-réponse.', + inputsTips: '(Facultatif) Fournissez des champs de saisie utilisateur sous forme de paires clé-valeur, correspondant aux variables dans Prompt Eng. La clé est le nom de la variable, la valeur est la valeur du paramètre. Si le type de champ est Sélection, la valeur sou', + queryTips: 'Contenu du texte saisi par l\'utilisateur.', + blocking: 'Type de blocage, en attente de l\'exécution pour terminer et renvoyer les résultats. (Les demandes peuvent être interrompues si le processus est long)', + streaming: 'retours en continu. Mise en œuvre de retours en continu basée sur SSE (Server-Sent Events).', + messageFeedbackApi: 'Retour de message (j\'aime)', + messageFeedbackApiTip: 'Évaluez les messages reçus au nom des utilisateurs finaux avec des likes ou des dislikes. Ces données sont visibles sur la page Logs & Annotations et sont utilisées pour le réglage fin des modèles futurs.', + messageIDTip: 'ID de message', + ratingTip: 'aimer ou ne pas aimer, null est annuler', + parametersApi: 'Obtenir des informations sur les paramètres de l\'application', + parametersApiTip: 'Récupérer les paramètres d\'entrée configurés, y compris les noms de variables, les noms de champs, les types et les valeurs par défaut. Généralement utilisé pour afficher ces champs dans un formulaire ou pour remplir les valeurs par défaut après le charg', + }, + chatMode: { + title: 'API de l\'application de chat', + info: 'Pour des applications conversationnelles polyvalentes utilisant un format Q&R, appelez l\'API de chat-messages pour initier le dialogue. Maintenez les conversations en cours en passant l\'ID de conversation retourné. Les paramètres de réponse et les modèles dépendent des paramètres de', + createChatApi: 'Créer un message de chat', + createChatApiTip: 'Créez un nouveau message de conversation ou continuez un dialogue existant.', + inputsTips: '(Facultatif) Fournir des champs de saisie utilisateur sous forme de paires clé-valeur, correspondant aux variables dans Prompt Eng. La clé est le nom de la variable, la valeur est la valeur du paramètre. Si le type de champ est Sélection, la valeur soumise', + queryTips: 'Contenu de la question/saisie de l\'utilisateur', + blocking: 'Type de blocage, en attente de l\'exécution pour terminer et renvoyer les résultats. (Les demandes peuvent être interrompues si le processus est long)', + streaming: 'retours en continu. Mise en œuvre de retours en continu basée sur SSE (Server-Sent Events).', + conversationIdTip: '(Optional) Conversation ID: leave empty for first-time conversation; pass conversation_id from context to continue dialogue.', + messageFeedbackApi: 'Message de retour d\'information de l\'utilisateur du terminal, comme', + messageFeedbackApiTip: 'Évaluez les messages reçus au nom des utilisateurs finaux avec des likes ou des dislikes. Ces données sont visibles sur la page Logs & Annotations et sont utilisées pour l\'ajustement futur du modèle.', + messageIDTip: 'ID de message', + ratingTip: 'aimer ou ne pas aimer, null est annuler', + chatMsgHistoryApi: 'Obtenez le message de l\'historique de chat', + chatMsgHistoryApiTip: 'La première page renvoie la dernière `limit` bar, qui est en ordre inverse.', + chatMsgHistoryConversationIdTip: 'ID de conversation', + chatMsgHistoryFirstId: 'ID du premier enregistrement de chat sur la page actuelle. La valeur par défaut est aucune.', + chatMsgHistoryLimit: 'Combien de chats sont renvoyés en une seule demande', + conversationsListApi: 'Obtenir la liste des conversations', + conversationsListApiTip: 'Obtient la liste des sessions de l\'utilisateur actuel. Par défaut, les 20 dernières sessions sont renvoyées.', + conversationsListFirstIdTip: 'L\'ID du dernier enregistrement sur la page actuelle, par défaut aucun.', + conversationsListLimitTip: 'Combien de chats sont renvoyés dans une seule requête', + conversationRenamingApi: 'Renommage de la conversation', + conversationRenamingApiTip: 'Renommez les conversations ; le nom est affiché dans les interfaces client multi-session.', + conversationRenamingNameTip: 'Nouveau nom', + parametersApi: 'Obtenir des informations sur les paramètres de l\'application', + parametersApiTip: 'Récupérer les paramètres d\'entrée configurés, y compris les noms de variables, les noms de champs, les types et les valeurs par défaut. Typiquement utilisé pour afficher ces champs dans un formulaire ou pour remplir les valeurs par défaut après le chargement du', + }, + develop: { + requestBody: 'Corps de la Requête', + pathParams: 'Params de chemin', + query: 'Requête', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/app-debug.ts b/web/i18n/fr-FR/app-debug.ts new file mode 100644 index 00000000000000..adda4c9475071d --- /dev/null +++ b/web/i18n/fr-FR/app-debug.ts @@ -0,0 +1,409 @@ +const translation = { + pageTitle: { + line1: 'INVITATION', + line2: 'Ingénierie', + }, + orchestrate: 'Orchestrer', + promptMode: { + simple: 'Passez en Mode Expert pour modifier l\'intégralité du PROMPT', + advanced: 'Mode Expert', + switchBack: 'Revenir en arrière', + advancedWarning: { + title: 'Vous êtes passé en Mode Expert, et une fois que vous modifiez le PROMPT, vous NE POUVEZ PAS revenir au mode basique.', + description: 'En mode Expert, vous pouvez modifier l\'intégralité du PROMPT.', + learnMore: 'En savoir plus', + ok: 'D\'accord', + }, + operation: { + addMessage: 'Ajouter un message', + }, + contextMissing: 'Le composant de contexte est manquant, l\'efficacité de la suggestion peut ne pas être bonne.', + }, + operation: { + applyConfig: 'Publier', + resetConfig: 'Réinitialiser', + debugConfig: 'Déboguer', + addFeature: 'Ajouter une fonctionnalité', + automatic: 'Automatique', + stopResponding: 'Arrêtez de répondre', + agree: 'comme', + disagree: 'déteste', + cancelAgree: 'Annuler comme', + cancelDisagree: 'Annuler le dislike', + userAction: 'Utilisateur', + }, + notSetAPIKey: { + title: 'La clé du fournisseur LLM n\'a pas été définie', + trailFinished: 'Parcours terminé', + description: 'La clé du fournisseur LLM n\'a pas été définie, et elle doit être définie avant le débogage.', + settingBtn: 'Aller aux paramètres', + }, + trailUseGPT4Info: { + title: 'Ne prend pas en charge gpt-4 pour le moment', + description: 'Utilisez gpt-4, veuillez définir la clé API.', + }, + feature: { + groupChat: { + title: 'Amélioration de chat', + description: 'Ajouter des paramètres de pré-conversation pour les applications peut améliorer l\'expérience utilisateur.', + }, + groupExperience: { + title: 'Amélioration de l\'expérience', + }, + conversationOpener: { + title: 'Convertisseurs de conversation', + description: 'Dans une application de chat, la première phrase que l\'IA prononce activement à l\'utilisateur est généralement utilisée comme message de bienvenue.', + }, + suggestedQuestionsAfterAnswer: { + title: 'Suivi', + description: 'La configuration de la suggestion des prochaines questions peut offrir aux utilisateurs une meilleure discussion.', + resDes: '3 suggestions pour la prochaine question de l\'utilisateur.', + tryToAsk: 'Essayez de demander', + }, + moreLikeThis: { + title: 'Plus comme ça', + description: 'Générez plusieurs textes à la fois, puis modifiez et continuez à générer', + generateNumTip: 'Nombre de chaque temps généré', + tip: 'L\'utilisation de cette fonctionnalité entraînera un surcoût de tokens supplémentaires', + }, + speechToText: { + title: 'Discours en Texte', + description: 'Une fois activé, vous pouvez utiliser l\'entrée vocale.', + resDes: 'La saisie vocale est activée', + }, + textToSpeech: { + title: 'Texte à la parole', + description: 'Une fois activé, le texte peut être converti en parole.', + resDes: 'La Texte à Audio est activée', + }, + citation: { + title: 'Citations et Attributions', + description: 'Une fois activé, affichez le document source et la section attribuée du contenu généré.', + resDes: 'Les citations et attributions sont activées', + }, + annotation: { + title: 'Réponse d\'Annotation', + description: 'Vous pouvez manuellement ajouter une réponse de haute qualité au cache pour une correspondance prioritaire avec des questions d\'utilisateur similaires.', + resDes: 'La réponse d\'annotation est activée', + scoreThreshold: { + title: 'Seuil de Score', + description: 'Utilisé pour définir le seuil de similarité pour la réponse d\'annotation.', + easyMatch: 'Correspondance Facile', + accurateMatch: 'Correspondance précise', + }, + matchVariable: { + title: 'Correspondance de Variable', + choosePlaceholder: 'Choisissez la variable correspondante', + }, + cacheManagement: 'Annotations', + cached: 'Annoté', + remove: 'Supprimer', + removeConfirm: 'Supprimer cette annotation ?', + add: 'Ajouter une annotation', + edit: 'Modifier l\'annotation', + }, + dataSet: { + title: 'Contexte', + noData: 'Vous pouvez importer des Connaissances comme contexte', + words: 'Mots', + textBlocks: 'Blocs de texte', + selectTitle: 'Sélectionnez la connaissance de référence', + selected: 'Connaissance sélectionnée', + noDataSet: 'Aucune connaissance trouvée', + toCreate: 'Aller à créer', + notSupportSelectMulti: 'Actuellement, ne prend en charge qu\'une seule Connaissance', + queryVariable: { + title: 'Variable de requête', + tip: 'Cette variable sera utilisée comme entrée de requête pour la récupération du contexte, obtenant des informations contextuelles liées à l\'entrée de cette variable.', + choosePlaceholder: 'Choisissez la variable de requête', + noVar: 'Aucune variable', + noVarTip: 'veuillez créer une variable sous la section Variables', + unableToQueryDataSet: 'Impossible de questionner la Connaissance', + unableToQueryDataSetTip: 'Impossible d\'interroger la Connaissance avec succès, veuillez choisir une variable de requête de contexte dans la section contexte.', + ok: 'D\'accord', + contextVarNotEmpty: 'la variable de requête de contexte ne peut pas être vide', + deleteContextVarTitle: 'Supprimer la variable "{{varName}}" ?', + deleteContextVarTip: 'Cette variable a été définie comme une variable de requête de contexte, et sa suppression affectera l\'utilisation normale de la Connaissance. Si vous devez toujours la supprimer, veuillez la re-sélectionner dans la section contexte.', + }, + }, + tools: { + title: 'Outils', + tips: 'Les outils fournissent une méthode d\'appel API standard, prenant en compte les entrées de l\'utilisateur ou des variables comme paramètres de requête pour interroger des données externes en tant que contexte.', + toolsInUse: '{{count}} outils en usage', + modal: { + title: 'Outil', + toolType: { + title: 'Type d\'outil', + placeholder: 'Veuillez sélectionner le type d\'outil', + }, + name: { + title: 'Nom', + placeholder: 'Veuillez entrer le nom', + }, + variableName: { + title: 'Nom de la Variable', + placeholder: 'Veuillez entrer le nom de la variable', + }, + }, + }, + conversationHistory: { + title: 'Historique de Conversation', + description: 'Définir les noms de préfixe pour les rôles de conversation', + tip: 'L\'historique de conversation n\'est pas activé, veuillez ajouter dans le prompt ci-dessus.', + learnMore: 'En savoir plus', + editModal: { + title: 'Modifier les noms de rôles de conversation', + userPrefix: 'Préfixe utilisateur', + assistantPrefix: 'Préfixe de l\'assistant', + }, + }, + toolbox: { + title: 'BOÎTE À OUTILS', + }, + moderation: { + title: 'Modération de contenu', + description: 'Sécurisez la sortie du modèle en utilisant l\'API de modération ou en conservant une liste de mots sensibles.', + allEnabled: 'Contenu Entrant/Sortant Activé', + inputEnabled: 'Contenu Activé', + outputEnabled: 'Contenu de SORTIE activé', + modal: { + title: 'Paramètres de modération de contenu', + provider: { + title: 'Fournisseur', + openai: 'Modération OpenAI', + openaiTip: { + prefix: 'La modération d\'OpenAI nécessite une clé API OpenAI configurée dans le', + suffix: '.', + }, + keywords: 'Mots-clés', + }, + keywords: { + tip: 'Un par ligne, séparés par des sauts de ligne. Jusqu\'à 100 caractères par ligne.', + placeholder: 'Un par ligne, séparé par des sauts de ligne', + line: 'Ligne', + }, + content: { + input: 'Modérer le contenu INPUT', + output: 'Modérer le contenu de SORTIE', + preset: 'Réponses préétablies', + placeholder: 'Contenu des réponses prédéfinies ici', + condition: 'Contenu MODÉRÉ pour INPUT et OUTPUT activé au moins une fois', + fromApi: 'Les réponses prédéfinies sont renvoyées par l\'API', + errorMessage: 'Les réponses prédéfinies ne peuvent pas être vides', + supportMarkdown: 'Prise en charge de Markdown', + }, + openaiNotConfig: { + before: 'La modération d\'OpenAI nécessite une clé API OpenAI configurée dans le', + after: 'Sorry, but you didn\'t provide a text to translate. Could you please provide the text?', + }, + }, + }, + }, + automatic: { + title: 'Orchestration automatique d\'application', + description: 'Décrivez votre scénario, Dify orchestrera une application pour vous.', + intendedAudience: 'Qui est le public cible ?', + intendedAudiencePlaceHolder: 'par exemple. Étudiant', + solveProblem: 'Quels problèmes espèrent-ils que l\'IA peut résoudre pour eux ?', + solveProblemPlaceHolder: 'par exemple, Évaluation des performances académiques', + generate: 'Générer', + audiencesRequired: 'Audiences requises', + problemRequired: 'Problème requis', + resTitle: 'Nous avons orchestré l\'application suivante pour vous.', + apply: 'Appliquez cette orchestration', + noData: 'Décrivez votre cas d\'utilisation sur la gauche, l\'aperçu de l\'orchestration s\'affichera ici.', + loading: 'Orchestration de l\'application pour vous...', + overwriteTitle: 'Remplacer la configuration existante ?', + overwriteMessage: 'L\'application de cette orchestration remplacera la configuration existante.', + }, + resetConfig: { + title: 'Confirmer la réinitialisation ?', + message: + 'Réinitialiser supprime les modifications, en restaurant la dernière configuration publiée.', + }, + errorMessage: { + nameOfKeyRequired: 'name of the key: {{key}} required', + valueOfVarRequired: 'La valeur de {{key}} ne peut pas être vide', + queryRequired: 'Le texte de la requête est requis.', + waitForResponse: + 'Veuillez attendre que la réponse au message précédent soit terminée.', + waitForBatchResponse: + 'Veuillez attendre que la réponse à la tâche en lot soit terminée.', + notSelectModel: 'Veuillez choisir un modèle', + waitForImgUpload: 'Veuillez attendre que l\'image soit téléchargée', + }, + chatSubTitle: 'Instructions', + completionSubTitle: 'Indicatif de Prompt', + promptTip: + 'Les prompts guident les réponses de l\'IA avec des instructions et des contraintes. Insérez des variables comme {{input}}. Ce prompt ne sera pas visible pour les utilisateurs.', + formattingChangedTitle: 'Formatage modifié', + formattingChangedText: + 'La modification du formatage réinitialisera la zone de débogage, êtes-vous sûr ?', + variableTitle: 'Variables', + variableTip: + 'Les utilisateurs remplissent des variables dans un formulaire, remplaçant automatiquement les variables dans le prompt.', + notSetVar: 'Les variables permettent aux utilisateurs d\'introduire des mots de prompt ou des remarques d\'ouverture lors du remplissage des formulaires. Vous pouvez essayer de saisir "{{input}}" dans les mots de prompt.', + autoAddVar: 'Des variables indéfinies référencées dans le pre-prompt, voulez-vous les ajouter dans le formulaire d\'entrée de l\'utilisateur ?', + variableTable: { + key: 'Clé Variable', + name: 'Nom du champ d\'entrée de l\'utilisateur', + optional: 'Facultatif', + type: 'Type d\'Entrée', + action: 'Actions', + typeString: 'Chaîne', + typeSelect: 'Sélectionner', + }, + varKeyError: { + canNoBeEmpty: 'La clé variable ne peut pas être vide', + tooLong: 'Variable key: {{key}} too length. Can not be longer then 30 characters', + notValid: 'Variable key: {{key}} is invalid. Can only contain letters, numbers, and underscores', + notStartWithNumber: 'Variable key: {{key}} can not start with a number', + keyAlreadyExists: 'Variable key: :{{key}} already exists', + }, + otherError: { + promptNoBeEmpty: 'Le prompt ne peut pas être vide', + historyNoBeEmpty: 'L\'historique de la conversation doit être défini dans le prompt', + queryNoBeEmpty: 'La requête doit être définie dans le prompt', + }, + variableConig: { + modalTitle: 'Paramètres du champ', + description: 'Paramètre pour la variable {{varName}}', + fieldType: 'Type de champ', + string: 'Texte Court', + paragraph: 'Paragraphe', + select: 'Sélectionner', + notSet: 'Non défini, essayez de taper {{input}} dans l\'invite de préfixe', + stringTitle: 'Options de la boîte de texte du formulaire', + maxLength: 'Longueur maximale', + options: 'Options', + addOption: 'Ajouter une option', + apiBasedVar: 'Variable basée sur l\'API', + }, + vision: { + name: 'Vision', + description: 'Enable Vision permettra au modèle de prendre des images et de répondre à des questions à leur sujet.', + settings: 'Paramètres', + visionSettings: { + title: 'Paramètres de Vision', + resolution: 'Résolution', + resolutionTooltip: `low res will allow model receive a low-res 512 x 512 version of the image, and represent the image with a budget of 65 tokens. This allows the API to return faster responses and consume fewer input tokens for use cases that do not require high detail. + \n + high res will first allows the model to see the low res image and then creates detailed crops of input images as 512px squares based on the input image size. Each of the detailed crops uses twice the token budget for a total of 129 tokens.`, + high: 'Élevé', + low: 'Faible', + uploadMethod: 'Méthode de Téléchargement', + both: 'Les deux', + localUpload: 'Téléchargement Local', + url: 'URL', + uploadLimit: 'Limite de téléchargement', + }, + }, + voice: { + name: 'Voix', + defaultDisplay: 'Voix par défaut', + description: 'Paramètres de la voix de synthèse vocale', + settings: 'Paramètres', + voiceSettings: { + title: 'Paramètres de voix', + language: 'Langue', + resolutionTooltip: 'Support de la langue pour la voix de synthèse de texte.', + voice: 'Voix', + }, + }, + openingStatement: { + title: 'Ouverture de Conversation', + add: 'Ajouter', + writeOpner: 'Écrire l\'introduction', + placeholder: 'Rédigez votre message d\'ouverture ici, vous pouvez utiliser des variables, essayez de taper {{variable}}.', + openingQuestion: 'Questions d\'ouverture', + noDataPlaceHolder: + 'Commencer la conversation avec l\'utilisateur peut aider l\'IA à établir une connexion plus proche avec eux dans les applications conversationnelles.', + varTip: 'Vous pouvez utiliser des variables, essayez de taper {{variable}}', + tooShort: 'Au moins 20 mots de l\'invite initiale sont requis pour générer des remarques d\'ouverture pour la conversation.', + notIncludeKey: 'The initial prompt does not include the variable: {{key}}. Please add it to the initial prompt.', + }, + modelConfig: { + model: 'Modèle', + setTone: 'Définir le ton des réponses', + title: 'Modèle et Paramètres', + modeType: { + chat: 'Discussion', + completion: 'Complet', + }, + }, + inputs: { + title: 'Déboguer et Aperçu', + noPrompt: 'Essayez d\'écrire une proposition dans l\'entrée pré-proposition', + userInputField: 'Champ de saisie utilisateur', + noVar: 'Remplissez la valeur de la variable, qui sera automatiquement remplacée dans le mot d\'invite chaque fois qu\'une nouvelle session est démarrée.', + chatVarTip: + 'Remplissez la valeur de la variable, qui sera automatiquement remplacée dans le mot d\'invite chaque fois qu\'une nouvelle session est démarrée', + completionVarTip: + 'Remplissez la valeur de la variable, qui sera automatiquement remplacée dans les mots de l\'invite chaque fois qu\'une question est soumise.', + previewTitle: 'Aperçu de la prompte', + queryTitle: 'Contenu de la requête', + queryPlaceholder: 'Veuillez entrer le texte de la demande.', + run: 'EXÉCUTER', + }, + result: 'Texte de sortie', + datasetConfig: { + settingTitle: 'Paramètres de récupération', + retrieveOneWay: { + title: 'Récupération N-vers-1', + description: 'En fonction de l\'intention de l\'utilisateur et des descriptions de Connaissance, l\'Agent sélectionne de manière autonome la meilleure Connaissance pour interroger. Idéal pour les applications avec une Connaissance distincte et limitée.', + }, + retrieveMultiWay: { + title: 'Récupération multi-chemins', + description: 'En fonction de l\'intention de l\'utilisateur, interroge toutes les connaissances, récupère le texte pertinent de plusieurs sources et sélectionne les meilleurs résultats correspondant à la requête de l\'utilisateur après réordonnancement. La configuration de l\'API du modèle de réordonnancement est requise', + }, + rerankModelRequired: 'Un modèle de réorganisation est nécessaire', + params: 'Paramètres', + top_k: 'Top K', + top_kTip: 'Utilisé pour filtrer les morceaux qui sont les plus similaires aux questions de l\'utilisateur. Le système ajustera également dynamiquement la valeur de Top K, selon max_tokens du modèle sélectionné.', + score_threshold: 'Seuil de Score', + score_thresholdTip: 'Utilisé pour définir le seuil de similarité pour le filtrage des morceaux.', + retrieveChangeTip: 'La modification du mode d\'indexation et du mode de récupération peut affecter les applications associées à cette Connaissance.', + }, + debugAsSingleModel: 'Déboguer comme Modèle Unique', + debugAsMultipleModel: 'Déboguer en tant que Modèles Multiples', + duplicateModel: 'Dupliquer', + publishAs: 'Publier comme', + assistantType: { + name: 'Type d\'Assistant', + chatAssistant: { + name: 'Assistant de Base', + description: 'Construisez un assistant basé sur le chat en utilisant un grand modèle de langage', + }, + agentAssistant: { + name: 'Assistant Agent', + description: 'Construisez un Agent intelligent qui peut choisir de manière autonome des outils pour accomplir les tâches', + }, + }, + agent: { + agentMode: 'Mode Agent', + agentModeDes: 'Définissez le type de mode d\'inférence pour l\'agent', + agentModeType: { + ReACT: 'RéAgir', + functionCall: 'Appel de fonction', + }, + setting: { + name: 'Paramètres de l\'Agent', + description: 'Les paramètres de l\'Assistant Agent permettent de définir le mode de l\'agent et des fonctionnalités avancées comme les prompts intégrés, uniquement disponibles dans le type Agent.', + maximumIterations: { + name: 'Nombre Maximum d\'Itérations', + description: 'Limiter le nombre d\'itérations qu\'un assistant agent peut exécuter', + }, + }, + buildInPrompt: 'Prompt Intégré', + firstPrompt: 'Première Prompte', + nextIteration: 'Prochaine Itération', + promptPlaceholder: 'Écrivez votre prompt ici', + tools: { + name: 'Outils', + description: 'L\'utilisation d\'outils peut étendre les capacités des LLM, comme la recherche sur internet ou l\'exécution de calculs scientifiques.', + enabled: 'Activé', + }, + }, +} + +export default translation diff --git a/web/i18n/fr-FR/app-log.ts b/web/i18n/fr-FR/app-log.ts new file mode 100644 index 00000000000000..4ff1985869de6d --- /dev/null +++ b/web/i18n/fr-FR/app-log.ts @@ -0,0 +1,69 @@ +const translation = { + title: 'Journaux', + description: 'Les journaux enregistrent l\'état de fonctionnement de l\'application, y compris les entrées de l\'utilisateur et les réponses de l\'IA.', + dateTimeFormat: 'JJ/MM/AAAA hh:mm A', + table: { + header: { + time: 'Temps', + endUser: 'Utilisateur final', + input: 'Entrée', + output: 'Sortie', + summary: 'Titre', + messageCount: 'Nombre de Messages', + userRate: 'Taux d\'utilisateur', + adminRate: 'Taux Op.', + }, + pagination: { + previous: 'Précédent', + next: 'Suivant', + }, + empty: { + noChat: 'Aucune conversation pour le moment', + noOutput: 'Aucune sortie', + element: { + title: 'Quelqu\'un est là ?', + content: 'Observez et annotez les interactions entre les utilisateurs finaux et les applications IA ici pour améliorer continuellement la précision de l\'IA. Vous pouvez essayer de partager ou de tester l\'application Web', + }, + }, + }, + detail: { + time: 'Temps', + conversationId: 'ID de conversation', + promptTemplate: 'Modèle de Prompt', + promptTemplateBeforeChat: 'Modèle de Prompt Avant le Chat · En Tant que Message Système', + annotationTip: 'Améliorations Marquées par {{user}}', + timeConsuming: 'Apologies, but you haven\'t provided any text to translate. Could you please provide the text so I can help you with the translation?', + second: '"s"', + tokenCost: 'Jeton dépensé', + loading: 'chargement', + operation: { + like: 'comme', + dislike: 'déteste', + addAnnotation: 'Ajouter une amélioration', + editAnnotation: 'Amélioration de l\'édition', + annotationPlaceholder: 'Entrez la réponse attendue que vous souhaitez que l\'IA donne, qui peut être utilisée pour l\'ajustement fin du modèle et l\'amélioration continue de la qualité de génération de texte à l\'avenir.', + }, + variables: 'Variables', + uploadImages: 'Images Téléchargées', + }, + filter: { + period: { + today: 'Aujourd\'hui', + last7days: 'Les 7 Derniers Jours', + last4weeks: 'Les 4 dernières semaines', + last3months: 'Les 3 derniers mois', + last12months: 'Les 12 derniers mois', + monthToDate: 'Mois à ce jour', + quarterToDate: 'Trimestre à ce jour', + yearToDate: 'Année à ce jour', + allTime: 'Tout le temps', + }, + annotation: { + all: 'Tout', + annotated: 'Améliorations annotées ({{count}} éléments)', + not_annotated: 'Non Annoté', + }, + }, +} + +export default translation diff --git a/web/i18n/fr-FR/app-overview.ts b/web/i18n/fr-FR/app-overview.ts new file mode 100644 index 00000000000000..faad0e66ffd98e --- /dev/null +++ b/web/i18n/fr-FR/app-overview.ts @@ -0,0 +1,139 @@ +const translation = { + welcome: { + firstStepTip: 'Pour commencer,', + enterKeyTip: 'entrez votre clé API OpenAI ci-dessous', + getKeyTip: 'Obtenez votre clé API depuis le tableau de bord OpenAI', + placeholder: 'Votre clé API OpenAI (par exemple, sk-xxxx)', + }, + apiKeyInfo: { + cloud: { + trial: { + title: 'Vous utilisez le quota d\'essai de {{providerName}}.', + description: 'Le quota d\'essai est fourni pour votre utilisation de test. Avant que les appels de quota d\'essai ne soient épuisés, veuillez configurer votre propre fournisseur de modèle ou acheter un quota supplémentaire.', + }, + exhausted: { + title: 'Votre quota d\'essai a été utilisé, veuillez configurer votre APIKey.', + description: 'Votre quota d\'essai a été épuisé. Veuillez configurer votre propre fournisseur de modèle ou acheter un quota supplémentaire.', + }, + }, + selfHost: { + title: { + row1: 'Pour commencer,', + row2: 'configurez d\'abord votre fournisseur de modèle.', + }, + }, + callTimes: 'Heures d\'appel', + usedToken: 'Token utilisé', + setAPIBtn: 'Allez configurer le fournisseur de modèle', + tryCloud: 'Ou essayez la version cloud de Dify avec un devis gratuit', + }, + overview: { + title: 'Aperçu', + appInfo: { + explanation: 'WebApp IA prête à l\'emploi', + accessibleAddress: 'URL publique', + preview: 'Aperçu', + regenerate: 'Régénérer', + preUseReminder: 'Veuillez activer WebApp avant de continuer.', + settings: { + entry: 'Paramètres', + title: 'Paramètres de l\'application Web', + webName: 'Nom de l\'application Web', + webDesc: 'Description de l\'application web', + webDescTip: 'Ce texte sera affiché du côté du client, fournissant des indications de base sur comment utiliser l\'application', + webDescPlaceholder: 'Entrez la description de la WebApp', + language: 'Langue', + more: { + entry: 'Montrer plus de paramètres', + copyright: 'Droit d\'auteur', + copyRightPlaceholder: 'Entrez le nom de l\'auteur ou de l\'organisation', + privacyPolicy: 'Politique de Confidentialité', + privacyPolicyPlaceholder: 'Entrez le lien de la politique de confidentialité', + privacyPolicyTip: 'Aide les visiteurs à comprendre les données que l\'application collecte, voir la Politique de Confidentialité de Dify.', + }, + }, + embedded: { + entry: 'Intégré', + title: 'Intégrer sur le site web', + explanation: 'Choisissez la manière d\'intégrer l\'application de chat à votre site web', + iframe: 'Pour ajouter l\'application de chat n\'importe où sur votre site web, ajoutez cette iframe à votre code html.', + scripts: 'Pour ajouter une application de chat en bas à droite de votre site web, ajoutez ce code à votre html.', + chromePlugin: 'Installez l\'extension Chrome Dify Chatbot', + copied: 'Copié', + copy: 'Copier', + }, + qrcode: { + title: 'QR code à partager', + scan: 'Application de Partage de Scan', + download: 'Télécharger le Code QR', + }, + customize: { + way: 'manière', + entry: 'Personnaliser', + title: 'Personnaliser l\'WebApp IA', + explanation: 'Vous pouvez personnaliser l\'interface utilisateur de l\'application Web pour répondre à vos besoins en termes de scénario et de style.', + way1: { + name: 'Faites une fourchette du code client, modifiez-le et déployez-le sur Vercel (recommandé)', + step1: 'Faites une fourchette du code client et modifiez-le', + step1Tip: 'Cliquez ici pour bifurquer le code source dans votre compte GitHub et modifier le code', + step1Operation: 'Dify-WebClient', + step2: 'Déployer sur Vercel', + step2Tip: 'Cliquez ici pour importer le dépôt dans Vercel et déployer', + step2Operation: 'Importer le dépôt', + step3: 'Configurer les variables d\'environnement', + step3Tip: 'Ajoutez les variables d\'environnement suivantes dans Vercel', + }, + way2: { + name: 'Écrivez du code côté client pour appeler l\'API et déployez-le sur un serveur', + operation: 'Documentation', + }, + }, + }, + apiInfo: { + title: 'API du service Backend', + explanation: 'Facilement intégré dans votre application', + accessibleAddress: 'Point de terminaison du service API', + doc: 'Référence API', + }, + status: { + running: 'En service', + disable: 'Désactiver', + }, + }, + analysis: { + title: 'Analyse', + ms: 'ms', + tokenPS: 'Jeton/s', + totalMessages: { + title: 'Messages Totaux', + explanation: 'Nombre quotidien d\'interactions IA ; ingénierie/debuggage de prompt exclu.', + }, + activeUsers: { + title: 'Utilisateurs Actifs', + explanation: 'Utilisateurs uniques participant à des Q&A avec l\'IA ; l\'ingénierie/débogage de prompt exclu.', + }, + tokenUsage: { + title: 'Utilisation de Token', + explanation: 'Reflet de l\'utilisation quotidienne des jetons du modèle de langage pour l\'application, utile à des fins de contrôle des coûts.', + consumed: 'Consommé', + }, + avgSessionInteractions: { + title: 'Interactions Moyennes par Session', + explanation: 'Comptage continu de la communication utilisateur-IA ; pour les applications basées sur la conversation.', + }, + userSatisfactionRate: { + title: 'Taux de Satisfaction de l\'Utilisateur', + explanation: 'Le nombre de "j\'aime" par 1 000 messages. Cela indique la proportion de réponses dont les utilisateurs sont très satisfaits.', + }, + avgResponseTime: { + title: 'Temps de réponse moyen', + explanation: 'Temps (ms) pour que l\'IA traite/réponde; pour les applications basées sur le texte.', + }, + tps: { + title: 'Vitesse de Sortie des Tokens', + explanation: 'Mesurez la performance du LLM. Comptez la vitesse de sortie des Tokens du LLM depuis le début de la demande jusqu\'à l\'achèvement de la sortie.', + }, + }, +} + +export default translation diff --git a/web/i18n/fr-FR/app.ts b/web/i18n/fr-FR/app.ts new file mode 100644 index 00000000000000..f8a6f721bc9f9d --- /dev/null +++ b/web/i18n/fr-FR/app.ts @@ -0,0 +1,54 @@ +const translation = { + createApp: 'Créer une nouvelle application', + types: { + all: 'Tout', + assistant: 'Assistant', + completion: 'Complétion', + }, + modes: { + completion: 'Générateur de Texte', + chat: 'Assistant de Base', + }, + createFromConfigFile: 'Créer une application à partir du fichier de configuration', + deleteAppConfirmTitle: 'Supprimer cette application ?', + deleteAppConfirmContent: + 'La suppression de l\'application est irréversible. Les utilisateurs ne pourront plus accéder à votre application, et toutes les configurations de prompt et les journaux seront définitivement supprimés.', + appDeleted: 'Application supprimée', + appDeleteFailed: 'Échec de la suppression de l\'application', + join: 'Rejoignez la communauté', + communityIntro: + 'Discutez avec les membres de l\'équipe, les contributeurs et les développeurs sur différents canaux.', + roadmap: 'Voir notre feuille de route', + appNamePlaceholder: 'Veuillez entrer le nom de l\'application', + newApp: { + startToCreate: 'Commençons avec votre nouvelle application', + captionName: 'Icône et nom de l\'application', + captionAppType: 'Quel type d\'application voulez-vous créer ?', + previewDemo: 'Aperçu de la démo', + chatApp: 'Assistant', + chatAppIntro: + 'Je veux construire une application basée sur le chat. Cette application utilise un format de questions-réponses, permettant plusieurs tours de conversation continue.', + agentAssistant: 'Nouvel Assistant Agent', + completeApp: 'Générateur de Texte', + completeAppIntro: + 'Je veux créer une application qui génère du texte de haute qualité basé sur des prompts, tels que la génération d\'articles, de résumés, de traductions, et plus encore.', + showTemplates: 'Je veux choisir à partir d\'un modèle', + hideTemplates: 'Revenir à la sélection de mode', + Create: 'Créer', + Cancel: 'Annuler', + nameNotEmpty: 'Le nom ne peut pas être vide', + appTemplateNotSelected: 'Veuillez sélectionner un modèle', + appTypeRequired: 'Veuillez sélectionner un type d\'application', + appCreated: 'Application créée', + appCreateFailed: 'Échec de la création de l\'application', + }, + editApp: { + startToEdit: 'Modifier l\'application', + }, + emoji: { + ok: 'D\'accord', + cancel: 'Annuler', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/billing.ts b/web/i18n/fr-FR/billing.ts new file mode 100644 index 00000000000000..09c8ca43a8982f --- /dev/null +++ b/web/i18n/fr-FR/billing.ts @@ -0,0 +1,115 @@ +const translation = { + currentPlan: 'Plan Actuel', + upgradeBtn: { + plain: 'Mettre à jour le plan', + encourage: 'Mettre à niveau maintenant', + encourageShort: 'Mise à niveau', + }, + viewBilling: 'Gérer la facturation et les abonnements', + buyPermissionDeniedTip: 'Veuillez contacter votre administrateur d\'entreprise pour vous abonner', + plansCommon: { + title: 'Choisissez un plan qui vous convient', + yearlyTip: 'Obtenez 2 mois gratuitement en vous abonnant annuellement !', + mostPopular: 'Le Plus Populaire', + planRange: { + monthly: 'Mensuel', + yearly: 'Annuel', + }, + month: 'mois', + year: 'année', + save: 'Enregistrer', + free: 'Gratuit', + currentPlan: 'Plan Actuel', + contractSales: 'Contactez les ventes', + contractOwner: 'Contacter le chef d\'équipe', + startForFree: 'Commencez gratuitement', + getStartedWith: 'Commencez avec', + contactSales: 'Contacter les ventes', + talkToSales: 'Parlez aux Ventes', + modelProviders: 'Fournisseurs de Modèles', + teamMembers: 'Membres de l\'équipe', + buildApps: 'Construire des Applications', + vectorSpace: 'Espace Vectoriel', + vectorSpaceBillingTooltip: 'Chaque 1MB peut stocker environ 1,2 million de caractères de données vectorisées (estimé en utilisant les embeddings OpenAI, varie selon les modèles).', + vectorSpaceTooltip: 'L\'espace vectoriel est le système de mémoire à long terme nécessaire pour que les LLMs comprennent vos données.', + documentsUploadQuota: 'Quota de téléchargement de documents', + documentProcessingPriority: 'Priorité de Traitement de Document', + documentProcessingPriorityTip: 'Pour une priorité de traitement de documents plus élevée, veuillez mettre à niveau votre plan.', + documentProcessingPriorityUpgrade: 'Traitez plus de données avec une précision plus élevée à des vitesses plus rapides.', + priority: { + 'standard': 'Standard', + 'priority': 'Priorité', + 'top-priority': 'Priorité Maximale', + }, + logsHistory: 'Historique des logs', + customTools: 'Outils personnalisés', + unavailable: 'Indisponible', + days: 'jours', + unlimited: 'Illimité', + support: 'Assistance', + supportItems: { + communityForums: 'Forums communautaires', + emailSupport: 'Support par email', + priorityEmail: 'Support prioritaire par email et chat', + logoChange: 'Changement de logo', + SSOAuthentication: 'Authentification SSO', + personalizedSupport: 'Soutien personnalisé', + dedicatedAPISupport: 'Support dédié pour l\'API', + customIntegration: 'Intégration personnalisée et support', + ragAPIRequest: 'Requêtes API RAG', + bulkUpload: 'Téléchargement en masse de documents', + agentMode: 'Mode Agent', + workflow: 'Flux de travail', + }, + comingSoon: 'Bientôt disponible', + member: 'Membre', + memberAfter: 'Membre', + messageRequest: { + title: 'Crédits de message', + tooltip: 'Quotas d\'invocation de messages pour divers plans utilisant les modèles OpenAI (sauf gpt4). Les messages dépassant la limite utiliseront votre clé API OpenAI.', + }, + annotatedResponse: { + title: 'Limites de quota d\'annotation', + tooltip: 'L\'édition manuelle et l\'annotation des réponses fournissent des capacités de réponse aux questions de haute qualité personnalisables pour les applications. (Applicable uniquement dans les applications de chat)', + }, + ragAPIRequestTooltip: 'Fait référence au nombre d\'appels API invoquant uniquement les capacités de traitement de la base de connaissances de Dify.', + receiptInfo: 'Seuls le propriétaire de l\'équipe et l\'administrateur de l\'équipe peuvent s\'abonner et consulter les informations de facturation', + }, + plans: { + sandbox: { + name: 'Bac à sable', + description: '200 essais gratuits de GPT', + includesTitle: 'Inclus :', + }, + professional: { + name: 'Professionnel', + description: 'Pour les individus et les petites équipes afin de débloquer plus de puissance à un prix abordable.', + includesTitle: 'Tout ce qui est dans le plan gratuit, plus :', + }, + team: { + name: 'Équipe', + description: 'Collaborez sans limites et profitez d\'une performance de premier ordre.', + includesTitle: 'Tout ce qui est inclus dans le plan Professionnel, plus :', + }, + enterprise: { + name: 'Entreprise', + description: 'Obtenez toutes les capacités et le support pour les systèmes à grande échelle et critiques pour la mission.', + includesTitle: 'Tout ce qui est inclus dans le plan Équipe, plus :', + }, + }, + vectorSpace: { + fullTip: 'L\'espace vectoriel est plein.', + fullSolution: 'Mettez à niveau votre plan pour obtenir plus d\'espace.', + }, + apps: { + fullTipLine1: 'Mettez à jour votre plan pour', + fullTipLine2: 'construire plus d\'applications.', + }, + annotatedResponse: { + fullTipLine1: 'Mettez à niveau votre plan pour', + fullTipLine2: 'annotez plus de conversations.', + quotaTitle: 'Quota de Réponse d\'Annotation', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/common.ts b/web/i18n/fr-FR/common.ts new file mode 100644 index 00000000000000..fdbfd5be7e1633 --- /dev/null +++ b/web/i18n/fr-FR/common.ts @@ -0,0 +1,505 @@ +const translation = { + api: { + success: 'Succès', + actionSuccess: 'Action réussie', + saved: 'Sauvegardé', + create: 'Créé', + remove: 'Supprimé', + }, + operation: { + create: 'Créer', + confirm: 'Confirmer', + cancel: 'Annuler', + clear: 'Clair', + save: 'Enregistrer', + edit: 'Modifier', + add: 'Ajouter', + added: 'Ajouté', + refresh: 'Redémarrer', + reset: 'Réinitialiser', + search: 'Recherche', + change: 'Changer', + remove: 'Supprimer', + send: 'Envoyer', + copy: 'Copier', + lineBreak: 'Saut de ligne', + sure: 'Je suis sûr', + download: 'Télécharger', + delete: 'Supprimer', + settings: 'Paramètres', + setup: 'Configuration', + getForFree: 'Obtenez gratuitement', + reload: 'Recharger', + ok: 'D\'accord', + log: 'Journal', + learnMore: 'En savoir plus', + params: 'Paramètres', + }, + placeholder: { + input: 'Veuillez entrer', + select: 'Veuillez sélectionner', + }, + voice: { + language: { + zhHans: 'Chinois', + enUS: 'Anglais', + deDE: 'Allemand', + frFR: 'Français', + esES: 'Espagnol', + itIT: 'Italien', + thTH: 'Thaï.', + idID: 'Indonésien', + jaJP: 'Japonais', + koKR: 'Coréen', + ptBR: 'Portugais', + ruRU: 'Russe', + ukUA: 'Ukrainien', + }, + }, + unit: { + char: 'caractères', + }, + actionMsg: { + noModification: 'Aucune modification pour le moment.', + modifiedSuccessfully: 'Modifié avec succès', + modifiedUnsuccessfully: 'Modifié sans succès', + copySuccessfully: 'Copié avec succès', + paySucceeded: 'Paiement réussi', + payCancelled: 'Paiement annulé', + generatedSuccessfully: 'Généré avec succès', + generatedUnsuccessfully: 'Généré sans succès', + }, + model: { + params: { + temperature: 'Température', + temperatureTip: + 'Controls randomness: Lowering results in less random completions. As the temperature approaches zero, the model will become deterministic and repetitive.', + top_p: 'Haut P', + top_pTip: + 'Controls diversity via nucleus sampling: 0.5 means half of all likelihood-weighted options are considered.', + presence_penalty: 'Pénalité de présence', + presence_penaltyTip: + 'Combien pénaliser les nouveaux tokens en fonction de leur apparition dans le texte jusqu\'à présent. Augmente la probabilité du modèle de parler de nouveaux sujets.', + frequency_penalty: 'Pénalité de fréquence', + frequency_penaltyTip: + 'Combien pénaliser les nouveaux tokens en fonction de leur fréquence existante dans le texte jusqu\'à présent. Réduit la probabilité du modèle de répéter la même ligne mot pour mot.', + max_tokens: 'Max jeton', + max_tokensTip: + 'Utilisé pour limiter la longueur maximale de la réponse, en jetons. \nDes valeurs plus grandes peuvent limiter l\'espace restant pour les mots de prompt, les journaux de chat, et la Connaissance. \nIl est recommandé de le régler en dessous des', + maxTokenSettingTip: 'Votre réglage de max token est élevé, limitant potentiellement l\'espace pour les prompts, les requêtes et les données. Envisagez de le définir en dessous de 2/3.', + setToCurrentModelMaxTokenTip: 'Le max token est mis à jour à 80% du max token du modèle actuel {{maxToken}}.', + stop_sequences: 'Séquences d\'arrêt', + stop_sequencesTip: 'Jusqu\'à quatre séquences où l\'API arrêtera de générer d\'autres tokens. Le texte renvoyé ne contiendra pas la séquence d\'arrêt.', + stop_sequencesPlaceholder: 'Entrez la séquence et appuyez sur Tab', + }, + tone: { + Creative: 'Créatif', + Balanced: 'Équilibré', + Precise: 'Précis', + Custom: 'Personnalisé', + }, + addMoreModel: 'Allez dans les paramètres pour ajouter plus de modèles', + }, + menus: { + status: 'bêta', + explore: 'Explorer', + apps: 'Studio', + plugins: 'Plugins', + pluginsTips: 'Intégrez des plugins tiers ou créez des AI-Plugins compatibles avec ChatGPT.', + datasets: 'Connaissance', + datasetsTips: 'COMING SOON: Import your own text data or write data in real-time via Webhook for LLM context enhancement.', + newApp: 'Nouvelle Application', + newDataset: 'Créer des Connaissances', + tools: 'Outils', + }, + userProfile: { + settings: 'Paramètres', + workspace: 'Espace de travail', + createWorkspace: 'Créer un Espace de Travail', + helpCenter: 'Aide', + roadmapAndFeedback: 'Feuille de route & Retour d\'information', + community: 'Communauté', + about: 'À propos', + logout: 'Se déconnecter', + }, + settings: { + accountGroup: 'COMPTE', + workplaceGroup: 'ESPACE DE TRAVAIL', + account: 'Mon compte', + members: 'Membres', + billing: 'Facturation', + integrations: 'Intégrations', + language: 'Langue', + provider: 'Fournisseur de Modèle', + dataSource: 'Source de Données', + plugin: 'Plugins', + apiBasedExtension: 'Extension API', + }, + account: { + avatar: 'Avatar', + name: 'Nom', + email: 'Courriel', + password: 'Mot de passe', + passwordTip: 'Vous pouvez définir un mot de passe permanent si vous ne souhaitez pas utiliser des codes de connexion temporaires.', + setPassword: 'Définir un mot de passe', + resetPassword: 'Réinitialiser le mot de passe', + currentPassword: 'Mot de passe actuel', + newPassword: 'Nouveau mot de passe', + confirmPassword: 'Confirmer le mot de passe', + notEqual: 'Les deux mots de passe sont différents.', + langGeniusAccount: 'Compte Dify', + langGeniusAccountTip: 'Votre compte Dify et les données utilisateur associées.', + editName: 'Modifier le nom', + showAppLength: 'Afficher {{length}} applications', + }, + members: { + team: 'Équipe', + invite: 'Ajouter', + name: 'NOM', + lastActive: 'DERNIÈRE ACTIVITÉ', + role: 'RÔLES', + pending: 'En attente...', + owner: 'Propriétaire', + admin: 'Administrateur', + adminTip: 'Peut construire des applications & gérer les paramètres de l\'équipe', + normal: 'Normal', + normalTip: 'Peut seulement utiliser des applications, ne peut pas construire des applications', + inviteTeamMember: 'Ajouter un membre de l\'équipe', + inviteTeamMemberTip: 'Ils peuvent accéder directement à vos données d\'équipe après s\'être connectés.', + email: 'Courrier électronique', + emailInvalid: 'Format de courriel invalide', + emailPlaceholder: 'Veuillez entrer des emails', + sendInvite: 'Envoyer une invitation', + invitedAsRole: 'Invité en tant qu\'utilisateur {{role}}', + invitationSent: 'Invitation envoyée', + invitationSentTip: 'Invitation envoyée, et ils peuvent se connecter à Dify pour accéder aux données de votre équipe.', + invitationLink: 'Lien d\'invitation', + failedinvitationEmails: 'Les utilisateurs ci-dessous n\'ont pas été invités avec succès', + ok: 'D\'accord', + removeFromTeam: 'Retirer de l\'équipe', + removeFromTeamTip: 'Supprimera l\'accès de l\'équipe', + setAdmin: 'Définir comme administrateur', + setMember: 'Définir en tant que membre ordinaire', + disinvite: 'Annuler l\'invitation', + deleteMember: 'Supprimer Membre', + you: '(Vous)', + }, + integrations: { + connected: 'Connecté', + google: 'Google', + googleAccount: 'Connectez-vous avec un compte Google', + github: 'GitHub', + githubAccount: 'Connectez-vous avec un compte GitHub', + connect: 'Connecter', + }, + language: { + displayLanguage: 'Langue d\'affichage', + timezone: 'Fuseau horaire', + }, + provider: { + apiKey: 'Clé API', + enterYourKey: 'Entrez votre clé API ici', + invalidKey: 'Clé API OpenAI invalide', + validatedError: 'Validation failed: ', + validating: 'Validation de la clé...', + saveFailed: 'La sauvegarde de la clé API a échoué', + apiKeyExceedBill: 'Cette clé API n\'a pas de quota disponible, veuillez lire', + addKey: 'Ajouter une clé', + comingSoon: 'Bientôt disponible', + editKey: 'Modifier', + invalidApiKey: 'Clé API invalide', + azure: { + apiBase: 'Base de l\'API', + apiBasePlaceholder: 'L\'URL de base de l\'API de votre point de terminaison Azure OpenAI.', + apiKey: 'Clé API', + apiKeyPlaceholder: 'Entrez votre clé API ici', + helpTip: 'Apprenez le service OpenAI Azure', + }, + openaiHosted: { + openaiHosted: 'OpenAI Hébergé', + onTrial: 'EN ESSAI', + exhausted: 'QUOTA ÉPUISÉ', + desc: 'Le service d\'hébergement OpenAI fourni par Dify vous permet d\'utiliser des modèles tels que GPT-3.5. Avant que votre quota d\'essai ne soit épuisé, vous devez configurer d\'autres fournisseurs de modèles.', + callTimes: 'Temps d\'appel', + usedUp: 'Quota d\'essai épuisé. Ajoutez votre propre fournisseur de modèle.', + useYourModel: 'Utilise actuellement son propre fournisseur de modèle.', + close: 'Fermer', + }, + anthropicHosted: { + anthropicHosted: 'Anthropic Claude', + onTrial: 'EN ESSAI', + exhausted: 'QUOTA ÉPUISÉ', + desc: 'Modèle puissant, qui excelle dans une large gamme de tâches allant du dialogue sophistiqué et de la génération de contenu créatif à l\'instruction détaillée.', + callTimes: 'Temps d\'appel', + usedUp: 'Quota d\'essai épuisé. Ajoutez votre propre fournisseur de modèle.', + useYourModel: 'Utilise actuellement son propre fournisseur de modèle.', + close: 'Fermer', + }, + anthropic: { + using: 'La capacité d\'embedding est utilisée', + enableTip: 'Pour activer le modèle Anthropic, vous devez d\'abord vous lier à OpenAI ou au service Azure OpenAI.', + notEnabled: 'Non activé', + keyFrom: 'Obtenez votre clé API de chez Anthropic', + }, + encrypted: { + front: 'Votre clé API sera chiffrée et stockée en utilisant', + back: 'technologie.', + }, + }, + modelProvider: { + notConfigured: 'Le modèle du système n\'a pas encore été entièrement configuré, et certaines fonctions peuvent être indisponibles.', + systemModelSettings: 'Paramètres du Modèle Système', + systemModelSettingsLink: 'Pourquoi est-il nécessaire de mettre en place un modèle de système ?', + selectModel: 'Sélectionnez votre modèle', + setupModelFirst: 'Veuillez d\'abord configurer votre modèle', + systemReasoningModel: { + key: 'Modèle de Raisonnement du Système', + tip: 'Définissez le modèle d\'inférence par défaut à utiliser pour la création d\'applications, ainsi que des fonctionnalités telles que la génération de noms de dialogue et la suggestion de la prochaine question utiliseront également le modèle d\'inférence par défaut.', + }, + embeddingModel: { + key: 'Modèle d\'Embedding', + tip: 'Définissez le modèle par défaut pour le traitement d\'incorporation de documents de la Connaissance, à la fois la récupération et l\'importation de la Connaissance utilisent ce modèle d\'Embedding pour le traitement de vectorisation. Si vous changez de modèle, la dimension du vecteur entre la connaissance importée et la question ne sera pas cohérente, ce qui entraînera un échec de la recherche. Pour éviter les échecs de recherche, veuillez ne pas changer de modèle à volonté.', + required: 'Le modèle d\'embedding est requis', + }, + speechToTextModel: { + key: 'Modèle de Texte-à-Parole', + tip: 'Définissez le modèle par défaut pour l\'entrée de texte par la parole dans la conversation.', + }, + ttsModel: { + key: 'Modèle de Texte-à-Parole', + tip: 'Définissez le modèle par défaut pour l\'entrée de texte à la parole dans une conversation.', + }, + rerankModel: { + key: 'Modèle de Réorganisation', + tip: 'Le modèle de réorganisation réorganisera la liste des documents candidats en fonction de la correspondance sémantique avec la requête de l\'utilisateur, améliorant ainsi les résultats du classement sémantique.', + }, + quota: 'Quota', + searchModel: 'Modèle de recherche', + noModelFound: 'Aucun modèle trouvé pour {{model}}', + models: 'Modèles', + showMoreModelProvider: 'Montrer plus de fournisseur de modèle', + selector: { + tip: 'Ce modèle a été supprimé. Veuillez ajouter un modèle ou sélectionner un autre modèle.', + emptyTip: 'Aucun modèle disponible', + emptySetting: 'Veuillez aller dans les paramètres pour configurer', + rerankTip: 'Veuillez configurer le modèle Rerank', + }, + card: { + quota: 'QUOTA', + onTrial: 'En Essai', + paid: 'Payé', + quotaExhausted: 'Quota épuisé', + callTimes: 'Temps d\'appel', + tokens: 'Jetons', + buyQuota: 'Acheter Quota', + priorityUse: 'Utilisation prioritaire', + removeKey: 'Supprimer la clé API', + tip: 'La priorité sera donnée au quota payant. Le quota d\'essai sera utilisé après épuisement du quota payant.', + }, + item: { + deleteDesc: '{{modelName}} sont utilisés comme modèles de raisonnement système. Certaines fonctions ne seront pas disponibles après la suppression. Veuillez confirmer.', + freeQuota: 'QUOTA GRATUIT', + }, + addApiKey: 'Ajoutez votre clé API', + invalidApiKey: 'Clé API invalide', + encrypted: { + front: 'Votre clé API sera cryptée et stockée en utilisant', + back: 'technologie.', + }, + freeQuota: { + howToEarn: 'Comment gagner', + }, + addMoreModelProvider: 'AJOUTER PLUS DE FOURNISSEUR DE MODÈLE', + addModel: 'Ajouter un modèle', + modelsNum: '{{num}} Modèles', + showModels: 'Montrer les modèles', + showModelsNum: 'Afficher {{num}} Modèles', + collapse: 'Effondrer', + config: 'Configuration', + modelAndParameters: 'Modèle et Paramètres', + model: 'Modèle', + featureSupported: '{{feature}} pris en charge', + callTimes: 'Temps d\'appel', + credits: 'Crédits de Messages', + buyQuota: 'Acheter Quota', + getFreeTokens: 'Obtenez des Tokens gratuits', + priorityUsing: 'Prioriser l\'utilisation', + deprecated: 'Obsolète', + confirmDelete: 'confirmer la suppression?', + quotaTip: 'Tokens gratuits restants disponibles', + loadPresets: 'Charger les Présents', + parameters: 'PARAMÈTRES', + }, + dataSource: { + add: 'Ajouter une source de données', + connect: 'Connecter', + notion: { + title: 'Notion', + description: 'Utiliser Notion comme source de données pour la Connaissance.', + connectedWorkspace: 'Espace de travail connecté', + addWorkspace: 'Ajouter un espace de travail', + connected: 'Connecté', + disconnected: 'Déconnecté', + changeAuthorizedPages: 'Modifier les pages autorisées', + pagesAuthorized: 'Pages autorisées', + sync: 'Synchronisation', + remove: 'Supprimer', + selector: { + pageSelected: 'Pages Sélectionnées', + searchPages: 'Rechercher des pages...', + noSearchResult: 'Aucun résultat de recherche', + addPages: 'Ajouter des pages', + preview: 'APERÇU', + }, + }, + }, + plugin: { + serpapi: { + apiKey: 'Clé API', + apiKeyPlaceholder: 'Entrez votre clé API', + keyFrom: 'Obtenez votre clé SerpAPI depuis la page de compte SerpAPI', + }, + }, + apiBasedExtension: { + title: 'Les extensions API fournissent une gestion centralisée des API, simplifiant la configuration pour une utilisation facile à travers les applications de Dify.', + link: 'Apprenez comment développer votre propre Extension API.', + linkUrl: 'https://docs.dify.ai/fonctionnalites/extension/extension_basee_sur_api', + add: 'Ajouter l\'extension API', + selector: { + title: 'Extension de l\'API', + placeholder: 'Veuillez sélectionner l\'extension API', + manage: 'Gérer l\'extension API', + }, + modal: { + title: 'Ajouter une extension API', + editTitle: 'Modifier l\'extension API', + name: { + title: 'Nom', + placeholder: 'Veuillez entrer le nom', + }, + apiEndpoint: { + title: 'Point de terminaison API', + placeholder: 'Veuillez entrer le point de terminaison de l\'API', + }, + apiKey: { + title: 'clé API', + placeholder: 'Veuillez entrer la clé API', + lengthError: 'La longueur de la clé API ne peut pas être inférieure à 5 caractères', + }, + }, + type: 'Tapez', + }, + about: { + changeLog: 'Journal des modifications', + updateNow: 'Mettre à jour maintenant', + nowAvailable: 'Dify {{version}} est maintenant disponible.', + latestAvailable: 'Dify {{version}} est la dernière version disponible.', + }, + appMenus: { + overview: 'Aperçu', + promptEng: 'Orchestrer', + apiAccess: 'Accès API', + logAndAnn: 'Journaux & Annonces.', + }, + environment: { + testing: 'TESTER', + development: 'DÉVELOPPEMENT', + }, + appModes: { + completionApp: 'Générateur de Texte', + chatApp: 'Appli de Chat', + }, + datasetMenus: { + documents: 'Documents', + hitTesting: 'Test de Récupération', + settings: 'Paramètres', + emptyTip: 'La Connaissance n\'a pas été associée, veuillez aller à l\'application ou au plug-in pour compléter l\'association.', + viewDoc: 'Voir la documentation', + relatedApp: 'applications liées', + }, + voiceInput: { + speaking: 'Parle maintenant...', + converting: 'Conversion en texte...', + notAllow: 'microphone non autorisé', + }, + modelName: { + 'gpt-3.5-turbo': 'GPT-3.5-Turbo', + 'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K', + 'gpt-4': 'GPT-4', + 'gpt-4-32k': 'GPT-4-32K', + 'text-davinci-003': 'Texte-Davinci-003', + 'text-embedding-ada-002': 'Texte-Intégration-Ada-002', + 'whisper-1': 'Whisper-1', + 'claude-instant-1': 'Claude-Instant', + 'claude-2': 'Claude-2', + }, + chat: { + renameConversation: 'Renommer la conversation', + conversationName: 'Nom de la conversation', + conversationNamePlaceholder: 'Veuillez entrer le nom de la conversation', + conversationNameCanNotEmpty: 'Nom de la conversation requis', + citation: { + title: 'CITATIONS', + linkToDataset: 'Lien vers la Connaissance', + characters: 'Personnages :', + hitCount: 'Nombre de récupérations :', + vectorHash: 'Hachage vectoriel:', + hitScore: 'Score de Récupération:', + }, + }, + promptEditor: { + placeholder: 'Écrivez votre mot d\'invite ici, entrez \'{\' pour insérer une variable, entrez \'/\' pour insérer un bloc de contenu d\'invite', + context: { + item: { + title: 'Contexte', + desc: 'Insérez le modèle de contexte', + }, + modal: { + title: '{{num}} Connaissance en Contexte', + add: 'Ajouter Contexte', + footer: 'Vous pouvez gérer les contextes dans la section Contexte ci-dessous.', + }, + }, + history: { + item: { + title: 'Historique des conversations', + desc: 'Insérer le modèle de message historique', + }, + modal: { + title: 'EXEMPLE', + user: 'Bonjour', + assistant: 'Bonjour ! Comment puis-je vous aider aujourd\'hui ?', + edit: 'Modifier les Noms des Rôles de Conversation', + }, + }, + variable: { + item: { + title: 'Variables & Outils Externes', + desc: 'Insérer des Variables & Outils Externes', + }, + modal: { + add: 'Nouvelle variable', + addTool: 'Nouvel outil', + }, + }, + query: { + item: { + title: 'Requête', + desc: 'Insérez le modèle de requête utilisateur', + }, + }, + existed: 'Existe déjà dans le prompt', + }, + imageUploader: { + uploadFromComputer: 'Télécharger depuis l\'ordinateur', + uploadFromComputerReadError: 'La lecture de l\'image a échoué, veuillez réessayer.', + uploadFromComputerUploadError: 'Le téléchargement de l\'image a échoué, veuillez télécharger à nouveau.', + uploadFromComputerLimit: 'Le téléchargement d\'images ne peut pas dépasser {{size}} MB', + pasteImageLink: 'Collez le lien de l\'image', + pasteImageLinkInputPlaceholder: 'Collez le lien de l\'image ici', + pasteImageLinkInvalid: 'Lien d\'image invalide', + imageUpload: 'Téléchargement d\'image', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/custom.ts b/web/i18n/fr-FR/custom.ts new file mode 100644 index 00000000000000..c0c651cdb7261c --- /dev/null +++ b/web/i18n/fr-FR/custom.ts @@ -0,0 +1,30 @@ +const translation = { + custom: 'Personnalisation', + upgradeTip: { + prefix: 'Mettez à niveau votre plan pour', + suffix: 'personnalisez votre marque.', + }, + webapp: { + title: 'Personnalisez la marque WebApp', + removeBrand: 'Supprimer Propulsé par Dify', + changeLogo: 'Changer Propulsé par l\'Image de Marque', + changeLogoTip: 'Format SVG ou PNG avec une taille minimum de 40x40px', + }, + app: { + title: 'Personnaliser la marque de l\'en-tête de l\'application', + changeLogoTip: 'Format SVG ou PNG avec une taille minimale de 80x80px', + }, + upload: 'Télécharger', + uploading: 'Téléchargement', + uploadedFail: 'Le téléchargement de l\'image a échoué, veuillez la télécharger à nouveau.', + change: 'Changer', + apply: 'Appliquer', + restore: 'Rétablir les paramètres par défaut', + customize: { + contactUs: 'Contactez-nous', + prefix: 'Pour personnaliser le logo de la marque dans l\'application, s\'il vous plaît', + suffix: 'pour passer à l\'édition Enterprise.', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/dataset-creation.ts b/web/i18n/fr-FR/dataset-creation.ts new file mode 100644 index 00000000000000..da3ac8d476280b --- /dev/null +++ b/web/i18n/fr-FR/dataset-creation.ts @@ -0,0 +1,130 @@ +const translation = { + steps: { + header: { + creation: 'Créer des Connaissances', + update: 'Ajouter des données', + }, + one: 'Choisissez la source de données', + two: 'Prétraitement et Nettoyage du Texte', + three: 'Exécutez et terminez', + }, + error: { + unavailable: 'Cette connaissance n\'est pas disponible', + }, + stepOne: { + filePreview: 'Aperçu du fichier', + pagePreview: 'Aperçu de la page', + dataSourceType: { + file: 'Importer à partir d\'un fichier texte', + notion: 'Synchroniser depuis Notion', + web: 'Synchroniser depuis le site web', + }, + uploader: { + title: 'Télécharger le fichier texte', + button: 'Glisser et déposer le fichier, ou', + browse: 'Parcourir', + tip: 'Prend en charge {{supportTypes}}. Max {{size}}MB chacun.', + validation: { + typeError: 'Type de fichier non pris en charge', + size: 'Fichier trop volumineux. Le maximum est de {{size}}MB', + count: 'Plusieurs fichiers non pris en charge', + filesNumber: 'Vous avez atteint la limite de téléchargement par lot de {{filesNumber}}.', + }, + cancel: 'Annuler', + change: 'Changer', + failed: 'Le téléchargement a échoué', + }, + notionSyncTitle: 'Notion n\'est pas connecté', + notionSyncTip: 'Pour synchroniser avec Notion, une connexion à Notion doit d\'abord être établie.', + connect: 'Aller à connecter', + button: 'suivant', + emptyDatasetCreation: 'Je veux créer un Savoir vide', + modal: { + title: 'Créer une Connaissance vide', + tip: 'Une Connaissance vide ne contiendra aucun document, et vous pouvez télécharger des documents à tout moment.', + input: 'Nom de la connaissance', + placeholder: 'Veuillez entrer', + nameNotEmpty: 'Le nom ne peut pas être vide', + nameLengthInvaild: 'Le nom doit comporter entre 1 et 40 caractères.', + cancelButton: 'Annuler', + confirmButton: 'Créer', + failed: 'Création échouée', + }, + }, + stepTwo: { + segmentation: 'Paramètres de bloc', + auto: 'Automatique', + autoDescription: 'Définir automatiquement les règles de découpage et de prétraitement. Il est recommandé aux utilisateurs non familiers de sélectionner ceci.', + custom: 'Personnalisé', + customDescription: 'Personnalisez les règles de morceaux, la longueur des morceaux et les règles de prétraitement, etc.', + separator: 'Identifiant de segment', + separatorPlaceholder: 'Par exemple, nouvelle ligne (\\\\n) ou séparateur spécial (tel que "***")', + maxLength: 'Longueur maximale du morceau', + overlap: 'Chevauchement de morceaux', + overlapTip: 'La définition d\'un chevauchement de morceaux peut maintenir la pertinence sémantique entre eux, améliorant ainsi l\'effet de récupération. Il est recommandé de définir 10%-25% de la taille maximale du morceau.', + overlapCheck: 'le chevauchement de morceaux ne doit pas être plus grand que la longueur maximale de morceau', + rules: 'Règles de prétraitement du texte', + removeExtraSpaces: 'Remplacer les espaces consécutifs, les sauts de ligne et les tabulations', + removeUrlEmails: 'Supprimez toutes les URL et adresses e-mail', + removeStopwords: 'Supprimez les mots vides tels que "a", "an", "the"', + preview: 'Confirmer & Aperçu', + reset: 'Réinitialiser', + indexMode: 'Mode d\'index', + qualified: 'Haute Qualité', + recommend: 'Recommander', + qualifiedTip: 'Appelez l\'interface d\'embedding système par défaut pour le traitement afin de fournir une précision plus élevée lorsque les utilisateurs font une requête.', + warning: 'Veuillez d\'abord configurer la clé API du fournisseur de modèle.', + click: 'Aller aux paramètres', + economical: 'Économique', + economicalTip: 'Utilisez des moteurs vectoriels hors ligne, des index de mots-clés, etc. pour réduire la précision sans dépenser de jetons', + QATitle: 'Segmentation en format Question & Réponse', + QATip: 'Activer cette option consommera plus de jetons', + QALanguage: 'Segmenter en utilisant', + emstimateCost: 'Estimation', + emstimateSegment: 'Morceaux estimés', + segmentCount: 'morceaux', + calculating: 'En calcul...', + fileSource: 'Prétraiter les documents', + notionSource: 'Prétraiter les pages', + other: 'et autres', + fileUnit: 'fichiers', + notionUnit: 'pages', + previousStep: 'Étape précédente', + nextStep: 'Enregistrer & Traiter', + save: 'Enregistrer & Traiter', + cancel: 'Annuler', + sideTipTitle: 'Pourquoi découper et prétraiter ?', + sideTipP1: 'Lors du traitement des données textuelles, le découpage et le nettoyage sont deux étapes importantes de la prétraitement.', + sideTipP2: 'La segmentation divise les longs textes en paragraphes afin que les modèles puissent mieux comprendre. Cela améliore la qualité et la pertinence des résultats du modèle.', + sideTipP3: 'Le nettoyage élimine les caractères et les formats inutiles, rendant le Savoir plus propre et plus facile à analyser.', + sideTipP4: 'Un bon découpage et nettoyage améliorent les performances du modèle, fournissant des résultats plus précis et précieux.', + previewTitle: 'Aperçu', + previewTitleButton: 'Aperçu', + previewButton: 'Passage au format Q&R', + previewSwitchTipStart: 'L\'aperçu actuel du morceau est en format texte, passer à un aperçu en format de questions-réponses va', + previewSwitchTipEnd: 'consommer des tokens supplémentaires', + characters: 'personnages', + indexSettedTip: 'Pour changer la méthode d\'index, veuillez aller à la', + retrivalSettedTip: 'Pour changer la méthode d\'index, veuillez aller à la', + datasetSettingLink: 'Paramètres de connaissance.', + }, + stepThree: { + creationTitle: '🎉 Connaissance créée', + creationContent: 'Nous avons automatiquement nommé le Savoir, vous pouvez le modifier à tout moment', + label: 'Nom de la connaissance', + additionTitle: '🎉 Document téléchargé', + additionP1: 'Le document a été téléchargé dans la Connaissance', + additionP2: ', vous pouvez le trouver dans la liste des documents de la Connaissance.', + stop: 'Arrêter le traitement', + resume: 'Reprendre le traitement', + navTo: 'Aller au document', + sideTipTitle: 'Qu\'est-ce qui suit ?', + sideTipContent: 'Après l\'indexation du document, la Connaissance peut être intégrée dans l\'application en tant que contexte, vous pouvez trouver le paramètre de contexte sur la page d\'orchestration de prompt. Vous pouvez également le créer en tant que plugin d\'indexation ChatGPT ind', + modelTitle: 'Êtes-vous sûr de vouloir arrêter l\'embedding ?', + modelContent: 'Si vous devez reprendre le traitement plus tard, vous continuerez à partir de l\'endroit où vous vous êtes arrêté.', + modelButtonConfirm: 'Confirmer', + modelButtonCancel: 'Annuler', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/dataset-documents.ts b/web/i18n/fr-FR/dataset-documents.ts new file mode 100644 index 00000000000000..c6b0fca1df3cf2 --- /dev/null +++ b/web/i18n/fr-FR/dataset-documents.ts @@ -0,0 +1,349 @@ +const translation = { + list: { + title: 'Documents', + desc: 'Tous les fichiers de la Connaissance sont affichés ici, et l\'ensemble de la Connaissance peut être lié aux citations Dify ou indexé via le plugin Chat.', + addFile: 'ajouter un fichier', + addPages: 'Ajouter des Pages', + table: { + header: { + fileName: 'NOM DU FICHIER', + words: 'MOTS', + hitCount: 'NOMBRE DE RÉCUPÉRATIONS', + uploadTime: 'TEMPS DE TÉLÉCHARGEMENT', + status: 'STATUT', + action: 'ACTION', + }, + }, + action: { + uploadFile: 'Télécharger un nouveau fichier', + settings: 'Paramètres de segment', + addButton: 'Ajouter un morceau', + add: 'Ajouter un morceau', + batchAdd: 'Ajout en lot', + archive: 'Archive', + unarchive: 'Décompresser', + delete: 'Supprimer', + enableWarning: 'Le fichier archivé ne peut pas être activé', + sync: 'Synchroniser', + }, + index: { + enable: 'Activer', + disable: 'Désactiver', + all: 'Tout', + enableTip: 'Le fichier peut être indexé', + disableTip: 'Le fichier ne peut pas être indexé', + }, + status: { + queuing: 'Mise en file d\'attente', + indexing: 'Indexation', + paused: 'En pause', + error: 'Erreur', + available: 'Disponible', + enabled: 'Activé', + disabled: 'Désactivé', + archived: 'Archivé', + }, + empty: { + title: 'Il n\'y a pas encore de documentation', + upload: { + tip: 'Vous pouvez télécharger des fichiers, synchroniser à partir du site web, ou à partir d\'applications web comme Notion, GitHub, etc.', + }, + sync: { + tip: 'Dify téléchargera périodiquement des fichiers de votre Notion et terminera le traitement.', + }, + }, + delete: { + title: 'Êtes-vous sûr de vouloir supprimer ?', + content: 'Si vous avez besoin de reprendre le traitement plus tard, vous continuerez à partir de l\'endroit où vous vous êtes arrêté', + }, + batchModal: { + title: 'Ajouter des lots de segments', + csvUploadTitle: 'Faites glisser et déposez votre fichier CSV ici, ou', + browse: 'parcourir', + tip: 'Le fichier CSV doit se conformer à la structure suivante :', + question: 'question', + answer: 'réponse', + contentTitle: 'contenu du bloc', + content: 'contenu', + template: 'Téléchargez le modèle ici', + cancel: 'Annuler', + run: 'Exécuter le lot', + runError: 'L\'exécution du lot a échoué', + processing: 'Dans le traitement par lots', + completed: 'Importation terminée', + error: 'Erreur d\'Importation', + ok: 'D\'accord', + }, + }, + metadata: { + title: 'Métadonnées', + desc: 'L\'étiquetage des métadonnées pour les documents permet à l\'IA d\'y accéder en temps opportun et expose la source des références pour les utilisateurs.', + dateTimeFormat: 'MMMM D, YYYY hh:mm A', + docTypeSelectTitle: 'Veuillez sélectionner un type de document', + docTypeChangeTitle: 'Changer le type de document', + docTypeSelectWarning: + 'Si le type de document est modifié, les métadonnées actuellement remplies ne seront plus conservées', + firstMetaAction: 'Allons-y', + placeholder: { + add: 'Ajouter', + select: 'Sélectionner', + }, + source: { + upload_file: 'Télécharger le fichier', + notion: 'Synchroniser le formulaire depuis Notion', + github: 'Synchroniser à partir de Github', + }, + type: { + book: 'Livre', + webPage: 'Page Web', + paper: 'Papier', + socialMediaPost: 'Publication sur les Réseaux Sociaux', + personalDocument: 'Document Personnel', + businessDocument: 'Document Commercial', + IMChat: 'Chat IM', + wikipediaEntry: 'Entrée Wikipédia', + notion: 'Synchroniser depuis Notion', + github: 'Synchroniser depuis Github', + technicalParameters: 'Paramètres Techniques', + }, + field: { + processRule: { + processDoc: 'Document de Processus', + segmentRule: 'Règle de Segment', + segmentLength: 'Longueur des Morceaux', + processClean: 'Processus de Nettoyage du Texte', + }, + book: { + title: 'Titre', + language: 'Langue', + author: 'Auteur', + publisher: 'Éditeur', + publicationDate: 'Date de publication', + ISBN: 'ISBN', + category: 'Catégorie', + }, + webPage: { + title: 'Titre', + url: 'URL', + language: 'Langue', + authorPublisher: 'Auteur/Éditeur', + publishDate: 'Date de publication', + topicsKeywords: 'Sujets/Mots-clés', + description: 'Description', + }, + paper: { + title: 'Titre', + language: 'Langue', + author: 'Auteur', + publishDate: 'Date de publication', + journalConferenceName: 'Nom du Journal/Conférence', + volumeIssuePage: 'Volume/Numéro/Page', + DOI: 'DOI', + topicsKeywords: 'Sujets/Mots-clés', + abstract: 'Résumé', + }, + socialMediaPost: { + platform: 'Plateforme', + authorUsername: 'Auteur/Nom d\'utilisateur', + publishDate: 'Date de publication', + postURL: 'URL de publication', + topicsTags: 'Sujets/Tags', + }, + personalDocument: { + title: 'Titre', + author: 'Auteur', + creationDate: 'Date de Création', + lastModifiedDate: 'Date de Dernière Modification', + documentType: 'Type de Document', + tagsCategory: 'Tags/Catégorie', + }, + businessDocument: { + title: 'Titre', + author: 'Auteur', + creationDate: 'Date de création', + lastModifiedDate: 'Date de Dernière Modification', + documentType: 'Type de Document', + departmentTeam: 'Département/Équipe', + }, + IMChat: { + chatPlatform: 'Plateforme de Chat', + chatPartiesGroupName: 'Nom du groupe/Parties de discussion', + participants: 'Participants', + startDate: 'Date de Début', + endDate: 'Date de fin', + topicsKeywords: 'Sujets/Mots-clés', + fileType: 'Type de fichier', + }, + wikipediaEntry: { + title: 'Titre', + language: 'Langue', + webpageURL: 'URL de la page web', + editorContributor: 'Éditeur/Contributeur', + lastEditDate: 'Date de dernière modification', + summaryIntroduction: 'Résumé/Introduction', + }, + notion: { + title: 'Titre', + language: 'Langue', + author: 'Auteur', + createdTime: 'Heure de création', + lastModifiedTime: 'Dernière Modification', + url: 'URL', + tag: 'Étiquette', + description: 'Description', + }, + github: { + repoName: 'Nom du dépôt', + repoDesc: 'Description du dépôt', + repoOwner: 'Propriétaire du dépôt', + fileName: 'Nom du Fichier', + filePath: 'Chemin du fichier', + programmingLang: 'Langage de programmation', + url: 'URL', + license: 'Licence', + lastCommitTime: 'Heure du dernier commit', + lastCommitAuthor: 'Auteur du dernier commit', + }, + originInfo: { + originalFilename: 'Nom de fichier original', + originalFileSize: 'Taille originale du fichier', + uploadDate: 'Date de téléchargement', + lastUpdateDate: 'Date de dernière mise à jour', + source: 'Source', + }, + technicalParameters: { + segmentSpecification: 'Spécification des morceaux', + segmentLength: 'Longueur des morceaux', + avgParagraphLength: 'Longueur moyenne de paragraphe', + paragraphs: 'Paragraphes', + hitCount: 'Nombre de récupérations', + embeddingTime: 'Temps d\'incorporation', + embeddedSpend: 'Dépenses intégrées', + }, + }, + languageMap: { + zh: 'Chinois', + en: 'Anglais', + es: 'Espagnol', + fr: 'Français', + de: 'Allemand', + ja: 'Japonais', + ko: 'Coréen', + ru: 'Russe', + ar: 'Arabe', + pt: 'Portugais', + it: 'Italien', + nl: 'Néerlandais', + pl: 'Polonais', + sv: 'Suédois', + tr: 'Turc', + he: 'Hébreu', + hi: 'Hindi', + da: 'Danois', + fi: 'Finlandais', + no: 'Norvégien', + hu: 'Hongrois', + el: 'Grec', + cs: 'Tchèque', + th: 'Thaï', + id: 'Indonésien', + }, + categoryMap: { + book: { + fiction: 'Fiction', + biography: 'Biographie', + history: 'Histoire', + science: 'Science', + technology: 'Technologie', + education: 'Éducation', + philosophy: 'Philosophie', + religion: 'Religion', + socialSciences: 'Sciences Sociales', + art: 'Art', + travel: 'Voyage', + health: 'Santé', + selfHelp: 'AutoAssistance', + businessEconomics: 'Économie d\'entreprise', + cooking: 'Cuisson', + childrenYoungAdults: 'EnfantsJeunesAdultes', + comicsGraphicNovels: 'BandesDessinéesRomansGraphiques', + poetry: 'Poésie', + drama: 'Drame', + other: 'Autre', + }, + personalDoc: { + notes: 'Notes', + blogDraft: 'Brouillon de Blog', + diary: 'Journal', + researchReport: 'Rapport de Recherche', + bookExcerpt: 'Extrait de livre', + schedule: 'Programme', + list: 'Liste', + projectOverview: 'Aperçu du Projet', + photoCollection: 'Collection de Photos', + creativeWriting: 'Écriture Créative', + codeSnippet: 'Extrait de Code', + designDraft: 'Projet de Conception', + personalResume: 'Curriculum Vitae Personnel', + other: 'Autre', + }, + businessDoc: { + meetingMinutes: 'Compte-rendu de Réunion', + researchReport: 'Rapport de Recherche', + proposal: 'Proposition', + employeeHandbook: 'Manuel de l\'employé', + trainingMaterials: 'Matériaux de Formation', + requirementsDocument: 'Document de Spécifications', + designDocument: 'Document de Conception', + productSpecification: 'Spécification du produit', + financialReport: 'Rapport Financier', + marketAnalysis: 'Analyse de marché', + projectPlan: 'Plan de Projet', + teamStructure: 'Structure de l\'équipe', + policiesProcedures: 'Politiques & Procédures', + contractsAgreements: 'Contrats & Accords', + emailCorrespondence: 'Correspondance par Email', + other: 'Autre', + }, + }, + }, + embedding: { + processing: 'Traitement des embeddings...', + paused: 'Intégration en pause', + completed: 'Intégration terminée', + error: 'Erreur d\'embedding', + docName: 'Prétraitement du document', + mode: 'Règle de segmentation', + segmentLength: 'Longueur des morceaux', + textCleaning: 'Pré-définition du texte et nettoyage', + segments: 'Paragraphes', + highQuality: 'Mode haute qualité', + economy: 'Mode économique', + estimate: 'Consommation estimée', + stop: 'Arrêtez le traitement', + resume: 'Reprendre le traitement', + automatic: 'Automatique', + custom: 'Personnalisé', + previewTip: 'L\'aperçu du paragraphe sera disponible après la fin de l\'embedding.', + }, + segment: { + paragraphs: 'Paragraphes', + keywords: 'Mots Clés', + addKeyWord: 'Ajouter un mot-clé', + keywordError: 'La longueur maximale du mot-clé est de 20', + characters: 'personnages', + hitCount: 'Nombre de récupérations', + vectorHash: 'Vector hash: ', + questionPlaceholder: 'ajoutez la question ici', + questionEmpty: 'La question ne peut pas être vide', + answerPlaceholder: 'ajoutez une réponse ici', + answerEmpty: 'La réponse ne peut pas être vide', + contentPlaceholder: 'ajoutez du contenu ici', + contentEmpty: 'Le contenu ne peut pas être vide', + newTextSegment: 'Nouveau Segment de Texte', + newQaSegment: 'Nouveau Segment Q&R', + delete: 'Supprimer ce morceau ?', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/dataset-hit-testing.ts b/web/i18n/fr-FR/dataset-hit-testing.ts new file mode 100644 index 00000000000000..1e527bcf245b5a --- /dev/null +++ b/web/i18n/fr-FR/dataset-hit-testing.ts @@ -0,0 +1,28 @@ +const translation = { + title: 'Test de Récupération', + desc: 'Testez l\'effet d\'impact de la Connaissance basée sur le texte de la requête donnée.', + dateTimeFormat: 'JJ/MM/AAAA hh:mm A', + recents: 'Récents', + table: { + header: { + source: 'Source', + text: 'Texte', + time: 'Temps', + }, + }, + input: { + title: 'Texte source', + placeholder: 'Veuillez entrer un texte, une phrase déclarative courte est recommandée.', + countWarning: 'Jusqu\'à 200 caractères.', + indexWarning: 'Connaissances de haute qualité uniquement.', + testing: 'Test', + }, + hit: { + title: 'PARAGRAPHES DE RÉCUPÉRATION', + emptyTip: 'Les résultats des tests de récupération s\'afficheront ici', + }, + noRecentTip: 'Aucun résultat de requête récent ici', + viewChart: 'Voir GRAPHIQUE VECTORIEL', +} + +export default translation diff --git a/web/i18n/fr-FR/dataset-settings.ts b/web/i18n/fr-FR/dataset-settings.ts new file mode 100644 index 00000000000000..731013738a8bd9 --- /dev/null +++ b/web/i18n/fr-FR/dataset-settings.ts @@ -0,0 +1,33 @@ +const translation = { + title: 'Paramètres de connaissance', + desc: 'Ici, vous pouvez modifier les propriétés et les méthodes de fonctionnement de la Connaissance.', + form: { + name: 'Nom de la Connaissance', + namePlaceholder: 'Veuillez entrer le nom de la Connaissance', + nameError: 'Le nom ne peut pas être vide', + desc: 'Description des connaissances', + descInfo: 'Veuillez rédiger une description textuelle claire pour décrire le contenu de la Connaissance. Cette description sera utilisée comme base pour la correspondance lors de la sélection parmi plusieurs Connaissances pour l\'inférence.', + descPlaceholder: 'Décrivez ce qui se trouve dans cette Connaissance. Une description détaillée permet à l\'IA d\'accéder au contenu de la Connaissance en temps opportun. Si vide, Dify utilisera la stratégie de hit par défaut.', + descWrite: 'Apprenez comment rédiger une bonne description de connaissance.', + permissions: 'Autorisations', + permissionsOnlyMe: 'Seulement moi', + permissionsAllMember: 'Tous les membres de l\'équipe', + indexMethod: 'Méthode d\'Indexation', + indexMethodHighQuality: 'Haute Qualité', + indexMethodHighQualityTip: 'Appelez l\'interface d\'embedding d\'OpenAI pour le traitement afin de fournir une précision plus élevée lorsque les utilisateurs font une requête.', + indexMethodEconomy: 'Économique', + indexMethodEconomyTip: 'Utilisez des moteurs vectoriels hors ligne, des index de mots-clés, etc. pour réduire la précision sans dépenser de jetons', + embeddingModel: 'Modèle d\'Embedding', + embeddingModelTip: 'Changez le modèle intégré, veuillez aller à', + embeddingModelTipLink: 'Paramètres', + retrievalSetting: { + title: 'Paramètre de récupération', + learnMore: 'En savoir plus', + description: 'à propos de la méthode de récupération.', + longDescription: 'À propos de la méthode de récupération, vous pouvez la modifier à tout moment dans les paramètres de Connaissance.', + }, + save: 'Enregistrer', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/dataset.ts b/web/i18n/fr-FR/dataset.ts new file mode 100644 index 00000000000000..2d649d914b7e84 --- /dev/null +++ b/web/i18n/fr-FR/dataset.ts @@ -0,0 +1,47 @@ +const translation = { + knowledge: 'Connaissance', + documentCount: ' documents', + wordCount: 'k mots', + appCount: ' applications liées', + createDataset: 'Créer des Connaissances', + createDatasetIntro: 'Importez vos propres données textuelles ou écrivez des données en temps réel via Webhook pour l\'amélioration du contexte LLM.', + deleteDatasetConfirmTitle: 'Supprimer cette Connaissance ?', + deleteDatasetConfirmContent: + 'La suppression de la Connaissance est irréversible. Les utilisateurs ne pourront plus accéder à votre Savoir, et toutes les configurations de prompt et les journaux seront supprimés de façon permanente.', + datasetDeleted: 'Connaissance supprimée', + datasetDeleteFailed: 'Échec de la suppression de la Connaissance', + didYouKnow: 'Saviez-vous ?', + intro1: 'La Connaissance peut être intégrée dans l\'application Dify', + intro2: 'comme un contexte', + intro3: ',', + intro4: 'ou ça ', + intro5: 'peut être créé', + intro6: 'comme un plug-in d\'index ChatGPT autonome à publier', + unavailable: 'Indisponible', + unavailableTip: 'Le modèle d\'embedding n\'est pas disponible, le modèle d\'embedding par défaut doit être configuré', + datasets: 'CONNAISSANCE', + datasetsApi: 'API', + retrieval: { + semantic_search: { + title: 'Recherche Vectorielle', + description: 'Générez des embeddings de requête et recherchez le morceau de texte le plus similaire à sa représentation vectorielle.', + }, + full_text_search: { + title: 'Recherche en Texte Intégral', + description: 'Indexez tous les termes dans le document, permettant aux utilisateurs de rechercher n\'importe quel terme et de récupérer le fragment de texte pertinent contenant ces termes.', + }, + hybrid_search: { + title: 'Recherche Hybride', + description: 'Exécutez une recherche en texte intégral et des recherches vectorielles en même temps, réorganisez pour sélectionner la meilleure correspondance pour la requête de l\'utilisateur. La configuration de l\'API du modèle de réorganisation est nécessaire.', + recommend: 'Recommander', + }, + invertedIndex: { + title: 'Index inversé', + description: 'L\'Index inversé est une structure utilisée pour une récupération efficace. Organisé par termes, chaque terme pointe vers des documents ou des pages web le contenant.', + }, + change: 'Changer', + changeRetrievalMethod: 'Changer la méthode de récupération', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/explore.ts b/web/i18n/fr-FR/explore.ts new file mode 100644 index 00000000000000..77d17b3f03ad2f --- /dev/null +++ b/web/i18n/fr-FR/explore.ts @@ -0,0 +1,41 @@ +const translation = { + title: 'Explorer', + sidebar: { + discovery: 'Découverte', + chat: 'Discussion', + workspace: 'Espace de travail', + action: { + pin: 'Épingle', + unpin: 'Détacher', + rename: 'Renommer', + delete: 'Supprimer', + }, + delete: { + title: 'Supprimer l\'application', + content: 'Êtes-vous sûr de vouloir supprimer cette application ?', + }, + }, + apps: { + title: 'Explorez les applications par Dify', + description: 'Utilisez ces applications modèles instantanément ou personnalisez vos propres applications basées sur les modèles.', + allCategories: 'Toutes les catégories', + }, + appCard: { + addToWorkspace: 'Ajouter à l\'espace de travail', + customize: 'Personnaliser', + }, + appCustomize: { + title: 'Créer une application à partir de {{name}}', + subTitle: 'Icône de l\'application & nom', + nameRequired: 'Le nom de l\'application est requis', + }, + category: { + Assistant: 'Assistant', + Writing: 'Écriture', + Translate: 'Traduire', + Programming: 'Programmation', + HR: 'RH', + }, +} + +export default translation diff --git a/web/i18n/fr-FR/layout.ts b/web/i18n/fr-FR/layout.ts new file mode 100644 index 00000000000000..928649474b4dcd --- /dev/null +++ b/web/i18n/fr-FR/layout.ts @@ -0,0 +1,4 @@ +const translation = { +} + +export default translation diff --git a/web/i18n/fr-FR/login.ts b/web/i18n/fr-FR/login.ts new file mode 100644 index 00000000000000..38e4da2b188100 --- /dev/null +++ b/web/i18n/fr-FR/login.ts @@ -0,0 +1,59 @@ +const translation = { + pageTitle: 'Salut, commençons !👋', + welcome: 'Bienvenue sur Dify, veuillez vous connecter pour continuer.', + email: 'Adresse e-mail', + emailPlaceholder: 'Votre email', + password: 'Mot de passe', + passwordPlaceholder: 'Votre mot de passe', + name: 'Nom d\'utilisateur', + namePlaceholder: 'Votre nom d\'utilisateur', + forget: 'Mot de passe oublié ?', + signBtn: 'Se connecter', + installBtn: 'Mettre en place', + setAdminAccount: 'Configuration d\'un compte administrateur', + setAdminAccountDesc: 'Privilèges maximum pour le compte administrateur, qui peut être utilisé pour créer des applications et gérer les fournisseurs de LLM, etc.', + createAndSignIn: 'Créer et se connecter', + oneMoreStep: 'Une étape de plus', + createSample: 'Sur la base de ces informations, nous créerons une application exemple pour vous', + invitationCode: 'Code d\'invitation', + invitationCodePlaceholder: 'Votre code d\'invitation', + interfaceLanguage: 'Langue de l\'interface', + timezone: 'Fuseau horaire', + go: 'Aller à Dify', + sendUsMail: 'Envoyez-nous votre introduction, et nous nous occuperons de la demande d\'invitation.', + acceptPP: 'J\'ai lu et j\'accepte la politique de confidentialité', + reset: 'Veuillez exécuter la commande suivante pour réinitialiser votre mot de passe', + withGitHub: 'Continuer avec GitHub', + withGoogle: 'Continuer avec Google', + rightTitle: 'Débloquez le plein potentiel des LLM', + rightDesc: 'Construisez sans effort des applications IA visuellement captivantes, opérationnelles et améliorables.', + tos: 'Conditions de Service', + pp: 'Politique de Confidentialité', + tosDesc: 'En vous inscrivant, vous acceptez nos', + donthave: 'Vous n\'avez pas ?', + invalidInvitationCode: 'Code d\'invitation invalide', + accountAlreadyInited: 'Compte déjà initialisé', + error: { + emailEmpty: 'Une adresse e-mail est requise', + emailInValid: 'Veuillez entrer une adresse email valide', + nameEmpty: 'Le nom est requis', + passwordEmpty: 'Un mot de passe est requis', + passwordInvalid: 'Le mot de passe doit contenir des lettres et des chiffres, et la longueur doit être supérieure à 8.', + }, + license: { + tip: 'Avant de commencer Dify Community Edition, lisez le GitHub', + link: 'Licence Open-source', + }, + join: 'Rejoindre', + joinTipStart: 'Je vous invite à rejoindre', + joinTipEnd: 'équipe sur Dify', + invalid: 'Le lien a expiré', + explore: 'Explorez Dify', + activatedTipStart: 'Vous avez rejoint le', + activatedTipEnd: 'équipe', + activated: 'Connectez-vous maintenant', + adminInitPassword: 'Mot de passe d\'initialisation de l\'administrateur', + validate: 'Valider', +} + +export default translation diff --git a/web/i18n/fr-FR/register.ts b/web/i18n/fr-FR/register.ts new file mode 100644 index 00000000000000..928649474b4dcd --- /dev/null +++ b/web/i18n/fr-FR/register.ts @@ -0,0 +1,4 @@ +const translation = { +} + +export default translation diff --git a/web/i18n/fr-FR/share-app.ts b/web/i18n/fr-FR/share-app.ts new file mode 100644 index 00000000000000..97f0d992e044f4 --- /dev/null +++ b/web/i18n/fr-FR/share-app.ts @@ -0,0 +1,74 @@ +const translation = { + common: { + welcome: 'Bienvenue à l\'utilisation', + appUnavailable: 'L\'application n\'est pas disponible', + appUnkonwError: 'L\'application n\'est pas disponible', + }, + chat: { + newChat: 'Nouveau chat', + pinnedTitle: 'Épinglé', + unpinnedTitle: 'Discussions', + newChatDefaultName: 'Nouvelle conversation', + resetChat: 'Réinitialiser la conversation', + powerBy: 'Propulsé par', + prompt: 'Prompt', + privatePromptConfigTitle: 'Paramètres de conversation', + publicPromptConfigTitle: 'Prompt Initial', + configStatusDes: 'Avant de commencer, vous pouvez modifier les paramètres de conversation', + configDisabled: + 'Les paramètres de la session précédente ont été utilisés pour cette session.', + startChat: 'Commencer le Chat', + privacyPolicyLeft: + 'Veuillez lire', + privacyPolicyMiddle: + 'politique de confidentialité', + privacyPolicyRight: + 'fourni par le développeur de l\'application.', + deleteConversation: { + title: 'Supprimer la conversation', + content: 'Êtes-vous sûr de vouloir supprimer cette conversation ?', + }, + tryToSolve: 'Essayez de résoudre', + temporarySystemIssue: 'Désolé, problème temporaire du système.', + }, + generation: { + tabs: { + create: 'Exécuter une fois', + batch: 'Exécuter le lot', + saved: 'Enregistré', + }, + savedNoData: { + title: 'Vous n\'avez pas encore enregistré de résultat !', + description: 'Commencez à générer du contenu et retrouvez vos résultats sauvegardés ici.', + startCreateContent: 'Commencez à créer du contenu', + }, + title: 'Complétion IA', + queryTitle: 'Contenu de la requête', + completionResult: 'Résultat de la complétion', + queryPlaceholder: 'Rédigez le contenu de votre requête...', + run: 'Exécuter', + copy: 'Copier', + resultTitle: 'Complétion IA', + noData: 'L\'IA vous donnera ce que vous voulez ici.', + csvUploadTitle: 'Faites glisser et déposez votre fichier CSV ici, ou', + browse: 'parcourir', + csvStructureTitle: 'Le fichier CSV doit se conformer à la structure suivante :', + downloadTemplate: 'Téléchargez le modèle ici', + field: 'Champ', + batchFailed: { + info: '{{num}} exécutions échouées', + retry: 'Réessayer', + outputPlaceholder: 'Aucun contenu de sortie', + }, + errorMsg: { + empty: 'Veuillez entrer le contenu dans le fichier téléchargé.', + fileStructNotMatch: 'Le fichier CSV téléchargé ne correspond pas à la structure.', + emptyLine: 'La ligne {{rowIndex}} est vide', + invalidLine: 'Row {{rowIndex}}: {{varName}} value can not be empty', + moreThanMaxLengthLine: 'Row {{rowIndex}}: {{varName}} value can not be more than {{maxLength}} characters', + atLeastOne: 'Veuillez entrer au moins une ligne dans le fichier téléchargé.', + }, + }, +} + +export default translation diff --git a/web/i18n/fr-FR/tools.ts b/web/i18n/fr-FR/tools.ts new file mode 100644 index 00000000000000..f0819a201a91f7 --- /dev/null +++ b/web/i18n/fr-FR/tools.ts @@ -0,0 +1,115 @@ +const translation = { + title: 'Outils', + createCustomTool: 'Créer un Outil Personnalisé', + type: { + all: 'Tout', + builtIn: 'Intégré', + custom: 'Personnalisé', + }, + contribute: { + line1: 'Je suis intéressé par', + line2: 'contribuer des outils à Dify.', + viewGuide: 'Voir le guide', + }, + author: 'Par', + auth: { + unauthorized: 'Pour Autoriser', + authorized: 'Autorisé', + setup: 'Mettez en place l\'autorisation à utiliser', + setupModalTitle: 'Configurer l\'Autorisation', + setupModalTitleDescription: 'Après avoir configuré les identifiants, tous les membres de l\'espace de travail peuvent utiliser cet outil lors de l\'orchestration des applications.', + }, + includeToolNum: '{{num}} outils inclus', + addTool: 'Ajouter un outil', + createTool: { + title: 'Créer un Outil Personnalisé', + editAction: 'Configurer', + editTitle: 'Modifier l\'Outil Personnalisé', + name: 'Nom', + toolNamePlaceHolder: 'Entrez le nom de l\'outil', + schema: 'Schéma', + schemaPlaceHolder: 'Entrez votre schéma OpenAPI ici', + viewSchemaSpec: 'Voir la spécification OpenAPI-Swagger', + importFromUrl: 'Importer depuis l\'URL', + importFromUrlPlaceHolder: 'https://...', + urlError: 'Veuillez entrer une URL valide', + examples: 'Exemples', + exampleOptions: { + json: 'Météo(JSON)', + yaml: 'Animalerie (YAML)', + blankTemplate: 'Modèle Vierge', + }, + availableTools: { + title: 'Outils Disponibles', + name: 'Nom', + description: 'Description', + method: 'Méthode', + path: 'Chemin', + action: 'Actions', + test: 'Test', + }, + authMethod: { + title: 'Méthode d\'autorisation', + type: 'Type d\'autorisation', + keyTooltip: 'Clé de l\'en-tête HTTP. Vous pouvez la laisser telle quelle avec "Autorisation" si vous n\'avez aucune idée de ce que c\'est, ou la définir sur une valeur personnalisée.', + types: { + none: 'Aucun', + api_key: 'Clé API', + apiKeyPlaceholder: 'Nom de l\'en-tête HTTP pour la clé API', + apiValuePlaceholder: 'Entrez la clé API', + }, + key: 'Clé', + value: 'Valeur', + }, + authHeaderPrefix: { + title: 'Type d\'Authentification', + types: { + basic: 'Basique', + bearer: 'Porteur', + custom: 'Personnalisé', + }, + }, + privacyPolicy: 'Politique de confidentialité', + privacyPolicyPlaceholder: 'Veuillez entrer la politique de confidentialité', + }, + test: { + title: 'Test', + parametersValue: 'Paramètres & Valeur', + parameters: 'Paramètres', + value: 'Valeur', + testResult: 'Résultats du Test', + testResultPlaceholder: 'Le résultat du test s\'affichera ici', + }, + thought: { + using: 'Utilisation', + used: 'Utilisé', + requestTitle: 'Demande à', + responseTitle: 'Réponse de', + }, + setBuiltInTools: { + info: 'Infos', + setting: 'Paramètres', + toolDescription: 'Description de l\'outil', + parameters: 'paramètres', + string: 'chaîne', + number: 'nombre', + required: 'Requis', + infoAndSetting: 'Infos & Paramètres', + }, + noCustomTool: { + title: 'Pas d\'outils personnalisés !', + content: 'Ajoutez et gérez vos outils personnalisés ici pour construire des applications IA.', + createTool: 'Créer un outil', + }, + noSearchRes: { + title: 'Désolé, aucun résultat !', + content: 'Nous n\'avons trouvé aucun outil correspondant à votre recherche.', + reset: 'Réinitialiser la recherche', + }, + builtInPromptTitle: 'Invite', + toolRemoved: 'Outil supprimé', + notAuthorized: 'Outil non autorisé', + howToGet: 'Comment obtenir', +} + +export default translation diff --git a/web/i18n/language.ts b/web/i18n/language.ts index c72717dc84fd8e..f885289e07931f 100644 --- a/web/i18n/language.ts +++ b/web/i18n/language.ts @@ -48,7 +48,7 @@ export const languages = [ value: 'fr-FR', name: 'Français(France)', example: 'Bonjour, Dify!', - supported: false, + supported: true, }, { value: 'de-DE',