diff --git a/web-app/src/containers/LanguageSwitcher.tsx b/web-app/src/containers/LanguageSwitcher.tsx index 70e595a5a2..5017dd70de 100644 --- a/web-app/src/containers/LanguageSwitcher.tsx +++ b/web-app/src/containers/LanguageSwitcher.tsx @@ -16,6 +16,7 @@ const LANGUAGES = [ { value: 'zh-CN', label: '简体中文' }, { value: 'zh-TW', label: '繁體中文' }, { value: 'de-DE', label: 'Deutsch' }, + { value: 'fr', label: 'Français' }, ] export default function LanguageSwitcher() { diff --git a/web-app/src/locales/fr/assistants.json b/web-app/src/locales/fr/assistants.json new file mode 100644 index 0000000000..0bc1703ade --- /dev/null +++ b/web-app/src/locales/fr/assistants.json @@ -0,0 +1,35 @@ +{ + "title": "Assistants", + "editAssistant": "Modifier l'assistant", + "deleteAssistant": "Supprimer l'assistant", + "deleteConfirmation": "Supprimer l'assistant", + "deleteConfirmationDesc": "Êtes-vous sûr de vouloir supprimer cet assistant ? Cette action est irréversible.", + "cancel": "Annuler", + "delete": "Supprimer", + "addAssistant": "Ajouter un assistant", + "emoji": "Emoji", + "name": "Nom", + "enterName": "Entrez le nom", + "nameRequired": "Le nom est requis", + "description": "Description (optionnel)", + "enterDescription": "Entrez la description", + "instructions": "Instructions", + "enterInstructions": "Entrez les instructions", + "predefinedParameters": "Paramètres prédéfinis", + "parameters": "Paramètres", + "key": "Clé", + "value": "Valeur", + "stringValue": "Chaîne", + "numberValue": "Nombre", + "booleanValue": "Booléen", + "jsonValue": "JSON", + "trueValue": "Vrai", + "falseValue": "Faux", + "jsonValuePlaceholder": "Valeur JSON", + "save": "Enregistrer", + "createNew": "Créer un nouvel assistant", + "personality": "Personnalité", + "capabilities": "Capacités", + "instructionsDateHint": "Astuce : utilisez {{current_date}} pour insérer la date d'aujourd'hui.", + "maxToolSteps": "Nombre maximal d'étapes d'outil" +} diff --git a/web-app/src/locales/fr/chat.json b/web-app/src/locales/fr/chat.json new file mode 100644 index 0000000000..87f22caa47 --- /dev/null +++ b/web-app/src/locales/fr/chat.json @@ -0,0 +1,12 @@ +{ + "welcome": "Salut, comment ça va ?", + "description": "Comment puis-je vous aider aujourd'hui ?", + "temporaryChat": "Conversation temporaire", + "temporaryChatDescription": "Démarrez une conversation temporaire qui ne sera pas sauvegardée dans votre historique.", + "status": { + "empty": "Aucune conversation trouvée" + }, + "sendMessage": "Envoyer le message", + "newConversation": "Nouvelle conversation", + "clearHistory": "Effacer l'historique" +} diff --git a/web-app/src/locales/fr/common.json b/web-app/src/locales/fr/common.json new file mode 100644 index 0000000000..addffb882d --- /dev/null +++ b/web-app/src/locales/fr/common.json @@ -0,0 +1,374 @@ +{ + "assistants": "Assistants", + "hardware": "Matériel", + "mcp-servers": "Serveurs MCP", + "local_api_server": "Serveur API local", + "https_proxy": "Proxy HTTPS", + "extensions": "Extensions", + "general": "Général", + "settings": "Paramètres", + "modelProviders": "Fournisseurs de modèles", + "appearance": "Apparence", + "privacy": "Confidentialité", + "keyboardShortcuts": "Raccourcis", + "newChat": "Nouveau chat", + "favorites": "Favoris", + "recents": "Récents", + "hub": "Hub", + "helpSupport": "Aide & Support", + "helpUsImproveJan": "Aidez-nous à améliorer Jan", + "unstarAll": "Retirer toutes les étoiles", + "unstar": "Retirer l'étoile", + "deleteAll": "Tout supprimer", + "star": "Ajouter aux favoris", + "rename": "Renommer", + "delete": "Supprimer", + "copied": "Copié !", + "dataFolder": "Dossier de données", + "others": "Autre", + "language": "Langue", + "login": "Se connecter", + "loginWith": "Se connecter avec {{provider}}", + "loginFailed": "Échec de la connexion", + "logout": "Se déconnecter", + "loggingOut": "Déconnexion en cours...", + "loggedOut": "Déconnecté avec succès", + "logoutFailed": "Échec de la déconnexion", + "profile": "Profil", + "reset": "Réinitialiser", + "search": "Rechercher", + "name": "Nom", + "cancel": "Annuler", + "create": "Créer", + "save": "Enregistrer", + "edit": "Modifier", + "copy": "Copier", + "back": "Retour", + "close": "Fermer", + "next": "Suivant", + "finish": "Terminer", + "skip": "Passer", + "allow": "Autoriser", + "deny": "Refuser", + "start": "Démarrer", + "stop": "Arrêter", + "preview": "Aperçu", + "compactWidth": "Largeur compacte", + "fullWidth": "Large largeur", + "dark": "Sombre", + "light": "Clair", + "system": "Système", + "auto": "Automatique", + "english": "Anglais", + "medium": "Moyen", + "newThread": "Nouveau fil", + "noResultsFound": "Aucun résultat trouvé", + "noThreadsYet": "Pas encore de fils", + "noThreadsYetDesc": "Démarrez une nouvelle conversation pour voir l'historique des fils ici.", + "downloads": "Téléchargements", + "downloading": "Téléchargement en cours", + "cancelDownload": "Annuler le téléchargement", + "downloadCancelled": "Téléchargement annulé", + "downloadComplete": "Téléchargement terminé", + "thinking": "Réflexion...", + "thought": "Pensée", + "callingTool": "Appel d'outil", + "completed": "Terminé", + "image": "Image", + "vision": "Vision", + "embeddings": "Embeddings", + "tools": "Outils", + "webSearch": "Recherche Web", + "reasoning": "Raisonnement", + "selectAModel": "Sélectionnez un modèle", + "noToolsAvailable": "Aucun outil disponible", + "noModelsFoundFor": "Aucun modèle trouvé pour \"{{searchValue}}\"", + "failedToLoadModels": "Échec du chargement des modèles", + "noModels": "Aucun modèle trouvé", + "customAvatar": "Avatar personnalisé", + "editAssistant": "Modifier l'assistant", + "jan": "Jan", + "metadata": "Métadonnées", + "regenerate": "Régénérer", + "threadImage": "Image du fil", + "editMessage": "Modifier le message", + "deleteMessage": "Supprimer le message", + "deleteThread": "Supprimer le fil", + "renameThread": "Renommer le fil", + "threadTitle": "Titre du fil", + "deleteAllThreads": "Supprimer tous les fils", + "allThreadsUnfavorited": "Tous les fils ont été retirés des favoris", + "deleteAllThreadsConfirm": "Êtes-vous sûr de vouloir supprimer tous les fils ? Cette action est irréversible.", + "addProvider": "Ajouter un fournisseur", + "addOpenAIProvider": "Ajouter un fournisseur OpenAI", + "enterNameForProvider": "Entrez un nom pour votre fournisseur", + "providerAlreadyExists": "Un fournisseur nommé \"{{name}}\" existe déjà. Veuillez choisir un autre nom.", + "adjustFontSize": "Ajuster la taille de la police", + "changeLanguage": "Changer la langue", + "editTheme": "Modifier le thème", + "editCodeBlockStyle": "Modifier le style des blocs de code", + "editServerHost": "Modifier l'hôte du serveur", + "pickColorWindowBackground": "Choisir la couleur du fond de la fenêtre", + "pickColorAppMainView": "Choisir la couleur de la vue principale", + "pickColorAppPrimary": "Choisir la couleur principale", + "pickColorAppAccent": "Choisir la couleur d'accent", + "pickColorAppDestructive": "Choisir la couleur des actions destructrices", + "apiKeyRequired": "La clé API est requise", + "enterTrustedHosts": "Entrez les hôtes de confiance", + "placeholder": { + "chatInput": "Demandez-moi n'importe quoi..." + }, + "confirm": "Confirmer", + "continue": "Continuer", + "loading": "Chargement...", + "error": "Erreur", + "success": "Succès", + "warning": "Avertissement", + "conversationNotAvailable": "Conversation non disponible", + "conversationNotAvailableDescription": "La conversation à laquelle vous tentez d'accéder n'est pas disponible ou a été supprimée.", + "temporaryChat": "Conversation temporaire", + "temporaryChatTooltip": "La conversation temporaire n'apparaîtra pas dans votre historique", + "noResultsFoundDesc": "Nous n'avons trouvé aucune conversation correspondant à votre recherche. Essayez un autre mot-clé.", + "searchModels": "Rechercher des modèles...", + "searchStyles": "Rechercher des styles...", + "createAssistant": "Créer un assistant", + "enterApiKey": "Entrez la clé API", + "scrollToBottom": "Aller en bas", + "generateAiResponse": "Générer la réponse IA", + "addModel": { + "title": "Ajouter un modèle", + "modelId": "ID du modèle", + "enterModelId": "Entrez l'ID du modèle", + "addModel": "Ajouter le modèle", + "description": "Ajouter un nouveau modèle au fournisseur", + "exploreModels": "Voir la liste des modèles du fournisseur" + }, + "mcpServers": { + "editServer": "Modifier le serveur", + "addServer": "Ajouter un serveur", + "serverName": "Nom du serveur", + "enterServerName": "Entrez le nom du serveur", + "command": "Commande", + "enterCommand": "Entrez la commande", + "arguments": "Arguments", + "argument": "Argument {{index}}", + "envVars": "Variables d'environnement", + "key": "Clé", + "value": "Valeur", + "save": "Enregistrer" + }, + "deleteServer": { + "title": "Supprimer le serveur", + "delete": "Supprimer" + }, + "editJson": { + "errorParse": "Échec de l'analyse JSON", + "errorPaste": "Échec du collage JSON", + "errorFormat": "Format JSON invalide", + "titleAll": "Modifier la configuration de tous les serveurs", + "placeholder": "Entrez la configuration JSON...", + "save": "Enregistrer" + }, + "editModel": { + "title": "Modifier le modèle : {{modelId}}", + "description": "Configurez les capacités du modèle en activant/désactivant les options ci-dessous.", + "capabilities": "Capacités", + "tools": "Outils", + "vision": "Vision", + "embeddings": "Embeddings", + "notAvailable": "Pas encore disponible" + }, + "outOfContextError": { + "truncateInput": "Tronquer l'entrée", + "title": "Erreur de dépassement de contexte", + "description": "Cette conversation atteint la limite de mémoire de l'IA, comme un tableau blanc qui se remplit. Nous pouvons augmenter la fenêtre de mémoire (appelée taille du contexte) pour qu'elle se souvienne de plus, mais cela peut utiliser davantage la mémoire de votre ordinateur. Nous pouvons aussi tronquer l'entrée, ce qui signifie qu'une partie de l'historique sera oubliée pour faire de la place aux nouveaux messages.", + "increaseContextSizeDescription": "Voulez-vous augmenter la taille du contexte ?", + "increaseContextSize": "Augmenter la taille du contexte" + }, + "toolApproval": { + "title": "Demande d'autorisation d'outil", + "description": "L'assistant souhaite utiliser {{toolName}}", + "securityNotice": "N'autorisez que les outils que vous jugez fiables. Les outils peuvent accéder à votre système et à vos données.", + "deny": "Refuser", + "allowOnce": "Autoriser une fois", + "alwaysAllow": "Toujours autoriser" + }, + "deleteModel": { + "title": "Supprimer le modèle : {{modelId}}", + "description": "Êtes-vous sûr de vouloir supprimer ce modèle ? Cette action est irréversible.", + "success": "Le modèle {{modelId}} a été supprimé définitivement.", + "cancel": "Annuler", + "delete": "Supprimer" + }, + "deleteProvider": { + "title": "Supprimer le fournisseur", + "description": "Supprimez ce fournisseur et tous ses modèles. Cette action est irréversible.", + "success": "Le fournisseur {{provider}} a été supprimé définitivement.", + "confirmTitle": "Supprimer le fournisseur : {{provider}}", + "confirmDescription": "Êtes-vous sûr de vouloir supprimer ce fournisseur ? Cette action est irréversible.", + "cancel": "Annuler", + "delete": "Supprimer" + }, + "modelSettings": { + "title": "Paramètres du modèle - {{modelId}}", + "description": "Configurez les paramètres du modèle pour optimiser les performances et le comportement." + }, + "dialogs": { + "changeDataFolder": { + "title": "Changer l'emplacement du dossier de données", + "description": "Êtes-vous sûr de vouloir changer l'emplacement du dossier de données ? Cela déplacera toutes vos données vers le nouvel emplacement et redémarrera l'application.", + "currentLocation": "Emplacement actuel :", + "newLocation": "Nouvel emplacement :", + "cancel": "Annuler", + "changeLocation": "Changer l'emplacement" + }, + "deleteAllThreads": { + "title": "Supprimer tous les fils", + "description": "Tous les fils seront supprimés. Cette action est irréversible." + }, + "deleteThread": { + "description": "Êtes-vous sûr de vouloir supprimer ce fil ? Cette action est irréversible." + }, + "editMessage": { + "title": "Modifier le message" + }, + "messageMetadata": { + "title": "Métadonnées du message" + } + }, + "projects": { + "title": "Projets", + "addProject": "Ajouter un projet", + "addToProject": "Ajouter au projet", + "removeFromProject": "Retirer du projet", + "createNewProject": "Créer un nouveau projet", + "editProject": "Modifier le projet", + "deleteProject": "Supprimer le projet", + "projectName": "Nom du projet", + "enterProjectName": "Entrez le nom du projet...", + "noProjectsAvailable": "Aucun projet disponible", + "noProjectsYet": "Pas encore de projets", + "noProjectsYetDesc": "Créez un nouveau projet en cliquant sur le bouton Ajouter un projet.", + "projectNotFound": "Projet introuvable", + "projectNotFoundDesc": "Le projet que vous recherchez n'existe pas ou a été supprimé.", + "deleteProjectDialog": { + "title": "Supprimer le projet", + "permanentDelete": "Ceci supprimera définitivement tous les fils.", + "permanentDeleteWarning": "Cette action supprimera définitivement TOUS les fils du projet !", + "deleteEmptyProject": "Cette action supprimera le projet \"{{projectName}}\".", + "saveThreadsAdvice": "Pour sauvegarder des fils, déplacez-les dans votre liste de fils ou dans un autre projet avant de supprimer.", + "starredWarning": "Vous avez encore des fils favoris dans le projet.", + "deleteButton": "Supprimer", + "successWithName": "Projet \"{{projectName}}\" supprimé avec succès", + "successWithoutName": "Projet supprimé avec succès", + "error": "Échec de la suppression du projet. Veuillez réessayer.", + "ariaLabel": "Supprimer {{projectName}}" + }, + "addProjectDialog": { + "createTitle": "Créer un nouveau projet", + "editTitle": "Modifier le projet", + "nameLabel": "Nom du projet", + "namePlaceholder": "Entrez le nom du projet...", + "createButton": "Créer", + "updateButton": "Mettre à jour", + "alreadyExists": "Le projet \"{{projectName}}\" existe déjà", + "createSuccess": "Projet \"{{projectName}}\" créé avec succès", + "renameSuccess": "Projet renommé de \"{{oldName}}\" en \"{{newName}}\"" + }, + "noConversationsIn": "Aucune conversation dans {{projectName}}", + "startNewConversation": "Commencez une nouvelle conversation avec {{projectName}} ci-dessous", + "conversationsIn": "Conversations dans {{projectName}}", + "conversationsDescription": "Cliquez sur une conversation pour continuer à discuter, ou en démarrez une nouvelle ci-dessous.", + "thread": "fil", + "threads": "fils", + "updated": "Mis à jour :", + "collapseProject": "Réduire le projet", + "expandProject": "Développer le projet", + "update": "Mettre à jour", + "searchProjects": "Rechercher des projets...", + "noProjectsFound": "Aucun projet trouvé", + "tryDifferentSearch": "Essayez un terme de recherche différent" + }, + "toast": { + "allThreadsUnfavorited": { + "title": "Tous les fils désélectionnés", + "description": "Tous les fils ont été retirés de vos favoris." + }, + "deleteAllThreads": { + "title": "Suppression de tous les fils", + "description": "Tous les fils ont été supprimés définitivement." + }, + "renameThread": { + "title": "Renommer le fil", + "description": "Le titre du fil a été renommé en '{{title}}'" + }, + "deleteThread": { + "title": "Supprimer le fil", + "description": "Ce fil a été supprimé définitivement." + }, + "editMessage": { + "title": "Modifier le message", + "description": "Message modifié avec succès. Veuillez attendre la réponse du modèle." + }, + "appUpdateDownloaded": { + "title": "Mise à jour de l'application téléchargée", + "description": "La mise à jour de l'application a été téléchargée avec succès." + }, + "appUpdateDownloadFailed": { + "title": "Échec du téléchargement de la mise à jour", + "description": "Échec du téléchargement de la mise à jour de l'application. Veuillez réessayer." + }, + "downloadComplete": { + "title": "Téléchargement terminé", + "description": "{{item}} a été téléchargé" + }, + "downloadCancelled": { + "title": "Téléchargement annulé", + "description": "Le processus de téléchargement a été annulé" + }, + "downloadFailed": { + "title": "Échec du téléchargement", + "description": "Le téléchargement de {{item}} a échoué" + }, + "modelValidationStarted": { + "title": "Validation du modèle", + "description": "Le modèle téléchargé \"{{modelId}}\" a été téléchargé avec succès. Vérification de l'intégrité..." + }, + "modelValidationFailed": { + "title": "Échec de la validation du modèle", + "description": "Le modèle téléchargé \"{{modelId}}\" a échoué à la vérification d'intégrité et a été supprimé. Le fichier peut être corrompu ou altéré." + }, + "downloadAndVerificationComplete": { + "title": "Téléchargement terminé", + "description": "Le modèle \"{{item}}\" a été téléchargé et vérifié avec succès" + }, + "projectCreated": { + "title": "Projet créé", + "description": "Le projet \"{{projectName}}\" a été créé avec succès" + }, + "projectRenamed": { + "title": "Projet renommé", + "description": "Le projet a été renommé de \"{{oldName}}\" en \"{{newName}}\"" + }, + "projectDeleted": { + "title": "Projet supprimé", + "description": "Le projet \"{{projectName}}\" a été supprimé avec succès" + }, + "projectAlreadyExists": { + "title": "Le projet existe déjà", + "description": "Le projet \"{{projectName}}\" existe déjà" + }, + "projectDeleteFailed": { + "title": "Échec de la suppression", + "description": "Échec de la suppression du projet. Veuillez réessayer." + }, + "threadAssignedToProject": { + "title": "Fil affecté", + "description": "Le fil a été affecté à \"{{projectName}}\" avec succès" + }, + "threadRemovedFromProject": { + "title": "Fil retiré", + "description": "Le fil a été retiré de \"{{projectName}}\" avec succès" + } + } +} diff --git a/web-app/src/locales/fr/hub.json b/web-app/src/locales/fr/hub.json new file mode 100644 index 0000000000..be6e611773 --- /dev/null +++ b/web-app/src/locales/fr/hub.json @@ -0,0 +1,31 @@ +{ + "sortNewest": "Les plus récents", + "sortMostDownloaded": "Les plus téléchargés", + "use": "Utiliser", + "download": "Télécharger", + "downloaded": "Téléchargé", + "loadingModels": "Chargement des modèles...", + "noModels": "Aucun modèle trouvé", + "by": "Par", + "downloads": "Téléchargements", + "variants": "Variantes", + "showVariants": "Afficher les variantes", + "useModel": "Utiliser ce modèle", + "downloadModel": "Télécharger le modèle", + "tools": "Outils", + "searchPlaceholder": "Rechercher des modèles sur Hugging Face...", + "joyride": { + "recommendedModelTitle": "Modèle recommandé", + "recommendedModelContent": "Parcourez et téléchargez des modèles d'IA puissants provenant de différents fournisseurs, le tout au même endroit. Nous suggérons de commencer par Jan-Nano - un modèle optimisé pour l'appel de fonctions, l'intégration d'outils et les capacités de recherche. Il est idéal pour créer des agents IA interactifs.", + "downloadInProgressTitle": "Téléchargement en cours", + "downloadInProgressContent": "Votre modèle est en cours de téléchargement. Suivez la progression ici - une fois terminé, il sera prêt à l'emploi.", + "downloadModelTitle": "Télécharger le modèle", + "downloadModelContent": "Cliquez sur le bouton Télécharger pour lancer le téléchargement du modèle.", + "back": "Retour", + "close": "Fermer", + "lastWithDownload": "Télécharger", + "last": "Terminer", + "next": "Suivant", + "skip": "Passer" + } +} diff --git a/web-app/src/locales/fr/logs.json b/web-app/src/locales/fr/logs.json new file mode 100644 index 0000000000..742b79da5d --- /dev/null +++ b/web-app/src/locales/fr/logs.json @@ -0,0 +1,3 @@ +{ + "noLogs": "Aucun journal disponible" +} diff --git a/web-app/src/locales/fr/mcp-servers.json b/web-app/src/locales/fr/mcp-servers.json new file mode 100644 index 0000000000..4b0344a789 --- /dev/null +++ b/web-app/src/locales/fr/mcp-servers.json @@ -0,0 +1,47 @@ +{ + "editServer": "Modifier le serveur MCP", + "addServer": "Ajouter un serveur MCP", + "serverName": "Nom du serveur", + "enterServerName": "Entrez le nom du serveur", + "command": "Commande", + "enterCommand": "Entrez la commande (uvx ou npx)", + "arguments": "Arguments", + "argument": "Argument {{index}}", + "envVars": "Variables d'environnement", + "key": "Clé", + "value": "Valeur", + "save": "Enregistrer", + "status": "Statut", + "connected": "Connecté", + "disconnected": "Déconnecté", + "deleteServer": { + "title": "Supprimer le serveur MCP", + "description": "Êtes-vous sûr de vouloir supprimer le serveur MCP {{serverName}} ? Cette action est irréversible.", + "delete": "Supprimer", + "success": "Le serveur MCP {{serverName}} a été supprimé avec succès" + }, + "editJson": { + "title": "Modifier le JSON pour le serveur MCP : {{serverName}}", + "titleAll": "Modifier le JSON de tous les serveurs MCP", + "placeholder": "Saisissez la configuration JSON", + "errorParse": "Échec de l'analyse des données initiales", + "errorPaste": "Format JSON invalide dans le contenu collé", + "errorFormat": "Format JSON invalide", + "errorServerName": "Le nom du serveur est requis et ne peut pas être vide", + "errorMissingServerNameKey": "Le JSON doit être structuré comme {\"serverName\": {config}} - clé du nom du serveur manquante", + "errorInvalidType": "Type invalide '{{type}}' pour le serveur '{{serverName}}'. Le type doit être 'stdio', 'http' ou 'sse'", + "save": "Enregistrer" + }, + "checkParams": "Veuillez vérifier les paramètres conformément au tutoriel.", + "title": "Serveurs MCP", + "experimental": "Expérimental", + "editAllJson": "Modifier le JSON de tous les serveurs", + "findMore": "Trouvez plus de serveurs MCP sur", + "allowPermissions": "Autoriser toutes les permissions des outils MCP", + "allowPermissionsDesc": "Une fois activé, tous les appels d'outils MCP seront automatiquement approuvés sans afficher de dialogues de permission. Ce paramètre s'applique globalement à toutes les conversations, y compris les nouveaux chats.", + "noServers": "Aucun serveur MCP trouvé", + "args": "Args", + "env": "Env", + "serverStatusActive": "Le serveur {{serverKey}} a été activé avec succès", + "serverStatusInactive": "Le serveur {{serverKey}} a été désactivé avec succès" +} diff --git a/web-app/src/locales/fr/model-errors.json b/web-app/src/locales/fr/model-errors.json new file mode 100644 index 0000000000..970a007708 --- /dev/null +++ b/web-app/src/locales/fr/model-errors.json @@ -0,0 +1,7 @@ +{ + "title": "Erreur de dépassement de contexte", + "description": "Cette conversation atteint la limite de mémoire de l'IA, comme un tableau blanc qui se remplit. Nous pouvons augmenter la fenêtre de mémoire (appelée taille du contexte) pour qu'elle se souvienne de plus, mais cela peut utiliser davantage la mémoire de votre ordinateur. Nous pouvons aussi tronquer l'entrée, ce qui signifie qu'une partie de l'historique sera oubliée pour faire de la place aux nouveaux messages.", + "increaseContextSizeDescription": "Voulez-vous augmenter la taille du contexte ?", + "truncateInput": "Tronquer l'entrée", + "increaseContextSize": "Augmenter la taille du contexte" +} diff --git a/web-app/src/locales/fr/provider.json b/web-app/src/locales/fr/provider.json new file mode 100644 index 0000000000..2670bc4463 --- /dev/null +++ b/web-app/src/locales/fr/provider.json @@ -0,0 +1,5 @@ +{ + "addProvider": "Ajouter un fournisseur", + "addOpenAIProvider": "Ajouter un fournisseur OpenAI", + "enterNameForProvider": "Entrez un nom pour le fournisseur" +} diff --git a/web-app/src/locales/fr/providers.json b/web-app/src/locales/fr/providers.json new file mode 100644 index 0000000000..1b5541ec1a --- /dev/null +++ b/web-app/src/locales/fr/providers.json @@ -0,0 +1,74 @@ +{ + "joyride": { + "chooseProviderTitle": "Choisir un fournisseur", + "chooseProviderContent": "Choisissez le fournisseur que vous souhaitez utiliser, assurez-vous d'avoir accès à une clé API pour celui-ci.", + "getApiKeyTitle": "Obtenez votre clé API", + "getApiKeyContent": "Connectez-vous au tableau de bord du fournisseur pour trouver ou générer votre clé API.", + "insertApiKeyTitle": "Insérez votre clé API", + "insertApiKeyContent": "Collez votre clé API ici pour connecter et activer le fournisseur.", + "back": "Retour", + "close": "Fermer", + "last": "Terminer", + "next": "Suivant", + "skip": "Passer" + }, + "refreshModelsError": "Le fournisseur doit avoir une URL de base et une clé API configurées pour récupérer les modèles.", + "refreshModelsSuccess": "Ajout de {{count}} nouveau(x) modèle(s) depuis {{provider}}.", + "noNewModels": "Aucun nouveau modèle trouvé. Tous les modèles disponibles sont déjà ajoutés.", + "refreshModelsFailed": "Échec de la récupération des modèles depuis {{provider}}. Veuillez vérifier votre clé API et l'URL de base.", + "models": "Modèles", + "refreshing": "Actualisation...", + "refresh": "Actualiser", + "import": "Importer", + "importModelSuccess": "Le modèle {{provider}} a été importé avec succès.", + "importModelError": "Échec de l'importation du modèle :", + "stop": "Arrêter", + "start": "Démarrer", + "noModelFound": "Aucun modèle trouvé", + "noModelFoundDesc": "Les modèles disponibles seront listés ici. Si vous n'en avez pas encore, visitez le Hub pour télécharger.", + "configuration": "Configuration", + "apiEndpoint": "Point de terminaison API", + "testConnection": "Tester la connexion", + "addModel": { + "title": "Ajouter un nouveau modèle", + "description": "Ajouter un nouveau modèle au fournisseur {{provider}}.", + "modelId": "ID du modèle", + "enterModelId": "Entrez l'ID du modèle", + "exploreModels": "Voir la liste des modèles de {{provider}}", + "addModel": "Ajouter le modèle", + "modelExists": "Le modèle existe déjà", + "modelExistsDesc": "Veuillez choisir un ID de modèle différent." + }, + "deleteModel": { + "title": "Supprimer le modèle : {{modelId}}", + "description": "Êtes-vous sûr de vouloir supprimer ce modèle ? Cette action est irréversible.", + "success": "Le modèle {{modelId}} a été supprimé définitivement.", + "cancel": "Annuler", + "delete": "Supprimer" + }, + "deleteProvider": { + "title": "Supprimer le fournisseur", + "description": "Supprimez ce fournisseur et tous ses modèles. Cette action est irréversible.", + "success": "Le fournisseur {{provider}} a été supprimé définitivement.", + "confirmTitle": "Supprimer le fournisseur : {{provider}}", + "confirmDescription": "Êtes-vous sûr de vouloir supprimer ce fournisseur ? Cette action est irréversible.", + "cancel": "Annuler", + "delete": "Supprimer" + }, + "editModel": { + "title": "Modifier le modèle : {{modelId}}", + "description": "Configurez les capacités du modèle en activant/désactivant les options ci-dessous.", + "capabilities": "Capacités", + "tools": "Outils", + "vision": "Vision", + "embeddings": "Embeddings", + "notAvailable": "Pas encore disponible", + "warning": { + "title": "Procédez avec prudence", + "description": "La modification des capacités du modèle peut affecter les performances et le fonctionnement. Des paramètres incorrects peuvent provoquer des comportements inattendus ou des erreurs." + } + }, + "addProvider": "Ajouter un fournisseur", + "addOpenAIProvider": "Ajouter un fournisseur OpenAI", + "enterNameForProvider": "Entrez un nom pour le fournisseur" +} diff --git a/web-app/src/locales/fr/settings.json b/web-app/src/locales/fr/settings.json new file mode 100644 index 0000000000..08a9a1b9ec --- /dev/null +++ b/web-app/src/locales/fr/settings.json @@ -0,0 +1,277 @@ +{ + "autoDownload": "Téléchargement automatique des nouvelles mises à jour", + "checkForUpdates": "Vérifier les mises à jour", + "checkForUpdatesDesc": "Vérifiez si une version plus récente de Jan est disponible.", + "checkingForUpdates": "Vérification des mises à jour...", + "noUpdateAvailable": "Vous utilisez la dernière version", + "devVersion": "Version de développement détectée", + "updateError": "Échec de la vérification des mises à jour", + "checkForBackendUpdates": "Vérifier les mises à jour de Llamacpp", + "checkForBackendUpdatesDesc": "Vérifiez si une version plus récente du backend Llamacpp est disponible.", + "checkingForBackendUpdates": "Vérification des mises à jour Llamacpp...", + "noBackendUpdateAvailable": "Vous utilisez la dernière version de Llamacpp", + "backendUpdateError": "Échec de la vérification des mises à jour de Llamacpp", + "changeLocation": "Changer l'emplacement", + "copied": "Copié", + "copyPath": "Copier le chemin", + "openLogs": "Ouvrir les journaux", + "revealLogs": "Afficher les journaux", + "showInFinder": "Afficher dans le Finder", + "showInFileExplorer": "Afficher dans l'explorateur de fichiers", + "openContainingFolder": "Ouvrir le dossier contenant", + "failedToRelocateDataFolder": "Échec du déplacement du dossier de données", + "failedToRelocateDataFolderDesc": "Échec du déplacement du dossier de données. Veuillez réessayer.", + "factoryResetTitle": "Réinitialiser les paramètres d'usine", + "factoryResetDesc": "Cela réinitialisera tous les paramètres de l'application à leurs valeurs par défaut. Cette action est irréversible. Nous ne recommandons cela que si l'application est corrompue.", + "cancel": "Annuler", + "reset": "Réinitialiser", + "resources": "Ressources", + "documentation": "Documentation", + "documentationDesc": "Apprenez à utiliser Jan et explorez ses fonctionnalités.", + "viewDocs": "Voir la documentation", + "releaseNotes": "Notes de version", + "releaseNotesDesc": "Découvrez les nouveautés de la dernière version de Jan.", + "viewReleases": "Voir les versions", + "community": "Communauté", + "github": "GitHub", + "githubDesc": "Contribuez au développement de Jan.", + "discord": "Discord", + "discordDesc": "Rejoignez notre communauté pour du support et des discussions.", + "support": "Support", + "reportAnIssue": "Signaler un problème", + "reportAnIssueDesc": "Vous avez trouvé un bug ? Aidez-nous en ouvrant un ticket sur GitHub.", + "reportIssue": "Signaler le problème", + "credits": "Crédits", + "creditsDesc1": "👋 Jan est construit avec ❤️ par l'équipe Menlo Research.", + "creditsDesc2": "Remerciements spéciaux à nos dépendances open-source—en particulier llama.cpp et Tauri—et à notre incroyable communauté IA.", + "appVersion": "Version de l'application", + "dataFolder": { + "appData": "Données de l'application", + "appDataDesc": "Emplacement par défaut pour les messages et autres données utilisateur.", + "appLogs": "Journaux de l'application", + "appLogsDesc": "Afficher les journaux détaillés de l'application." + }, + "others": { + "spellCheck": "Vérification orthographique", + "spellCheckDesc": "Activer la vérification orthographique pour vos fils.", + "resetFactory": "Réinitialiser aux paramètres d'usine", + "resetFactoryDesc": "Restaurer l'application à son état initial, effaçant tous les modèles et l'historique des discussions. Cette action est irréversible et recommandée uniquement si l'application est corrompue." + }, + "shortcuts": { + "application": "Application", + "newChat": "Nouveau chat", + "newChatDesc": "Créer un nouveau chat.", + "toggleSidebar": "Basculer la barre latérale", + "toggleSidebarDesc": "Afficher ou masquer la barre latérale.", + "zoomIn": "Zoom avant", + "zoomInDesc": "Augmenter le niveau de zoom.", + "zoomOut": "Zoom arrière", + "zoomOutDesc": "Diminuer le niveau de zoom.", + "chat": "Chat", + "sendMessage": "Envoyer le message", + "sendMessageDesc": "Envoyer le message en cours.", + "enter": "Entrée", + "newLine": "Nouvelle ligne", + "newLineDesc": "Insérer une nouvelle ligne.", + "shiftEnter": "Shift + Entrée", + "navigation": "Navigation", + "goToSettings": "Aller aux paramètres", + "goToSettingsDesc": "Ouvrir les paramètres." + }, + "appearance": { + "title": "Apparence", + "theme": "Thème", + "themeDesc": "Correspondre au thème du système.", + "fontSize": "Taille de la police", + "fontSizeDesc": "Ajuster la taille de la police de l'application.", + "windowBackground": "Fond de la fenêtre", + "windowBackgroundDesc": "Définir la couleur de fond de la fenêtre de l'application.", + "appMainView": "Vue principale de l'application", + "appMainViewDesc": "Définir la couleur de fond de la zone de contenu principale.", + "primary": "Primaire", + "primaryDesc": "Définir la couleur principale pour les composants UI.", + "accent": "Accent", + "accentDesc": "Définir la couleur d'accent pour les éléments mis en évidence.", + "destructive": "Destructif", + "destructiveDesc": "Définir la couleur pour les actions destructives.", + "resetToDefault": "Réinitialiser par défaut", + "resetToDefaultDesc": "Réinitialiser tous les paramètres d'apparence par défaut.", + "resetAppearanceSuccess": "Apparence réinitialisée avec succès", + "resetAppearanceSuccessDesc": "Tous les paramètres d'apparence ont été restaurés par défaut.", + "chatWidth": "Largeur du chat", + "chatWidthDesc": "Personnaliser la largeur de la vue de chat.", + "tokenCounterCompact": "Compteur de tokens compact", + "tokenCounterCompactDesc": "Afficher le compteur de tokens à l'intérieur du champ de saisie. Lorsqu'il est désactivé, le compteur apparaît sous le champ.", + "codeBlockTitle": "Bloc de code", + "codeBlockDesc": "Choisir un style de surlignage de syntaxe.", + "showLineNumbers": "Afficher les numéros de ligne", + "showLineNumbersDesc": "Afficher les numéros de ligne dans les blocs de code.", + "resetCodeBlockStyle": "Réinitialiser le style des blocs de code", + "resetCodeBlockStyleDesc": "Réinitialiser le style des blocs de code par défaut.", + "resetCodeBlockSuccess": "Style de bloc de code réinitialisé avec succès", + "resetCodeBlockSuccessDesc": "Le style des blocs de code a été restauré par défaut." + }, + "hardware": { + "os": "Système d'exploitation", + "name": "Nom", + "version": "Version", + "cpu": "CPU", + "model": "Modèle", + "architecture": "Architecture", + "cores": "Cœurs", + "instructions": "Instructions", + "usage": "Utilisation", + "memory": "Mémoire", + "totalRam": "RAM totale", + "availableRam": "RAM disponible", + "vulkan": "Vulkan", + "enableVulkan": "Activer Vulkan", + "enableVulkanDesc": "Utiliser l'API Vulkan pour l'accélération GPU. N'activez pas Vulkan si vous avez une carte NVIDIA car cela peut causer des problèmes de compatibilité.", + "gpus": "GPUs", + "noGpus": "Aucun GPU détecté", + "vram": "VRAM", + "freeOf": "libre sur", + "driverVersion": "Version du pilote", + "computeCapability": "Capacité de calcul", + "systemMonitor": "Moniteur système" + }, + "httpsProxy": { + "proxy": "Proxy", + "proxyUrl": "URL du proxy", + "proxyUrlDesc": "L'URL et le port de votre serveur proxy.", + "proxyUrlPlaceholder": "http://proxy.example.com:8080", + "authentication": "Authentification", + "authenticationDesc": "Identifiants pour le serveur proxy, si requis.", + "username": "Nom d'utilisateur", + "password": "Mot de passe", + "noProxy": "Pas de proxy", + "noProxyDesc": "Liste d'hôtes séparés par des virgules à ignorer pour le proxy.", + "noProxyPlaceholder": "localhost,127.0.0.1,.local", + "sslVerification": "Vérification SSL", + "ignoreSsl": "Ignorer les certificats SSL", + "ignoreSslDesc": "Autoriser les certificats auto-signés ou non vérifiés. Cela peut être nécessaire pour certains proxies mais réduit la sécurité. N'activez que si vous faites confiance à votre proxy.", + "proxySsl": "SSL du proxy", + "proxySslDesc": "Valider le certificat SSL lors de la connexion au proxy.", + "proxyHostSsl": "SSL de l'hôte du proxy", + "proxyHostSslDesc": "Valider le certificat SSL de l'hôte du proxy.", + "peerSsl": "SSL du pair", + "peerSslDesc": "Valider les certificats SSL des connexions pair.", + "hostSsl": "SSL de l'hôte", + "hostSslDesc": "Valider les certificats SSL des hôtes de destination." + }, + "localApiServer": { + "title": "Serveur API local", + "description": "Exécuter un serveur compatible OpenAI localement.", + "startServer": "Démarrer le serveur", + "loadingModel": "Chargement du modèle", + "startingServer": "Démarrage du serveur", + "stopServer": "Arrêter le serveur", + "serverLogs": "Journaux du serveur", + "serverLogsDesc": "Afficher les journaux détaillés du serveur API local.", + "openLogs": "Ouvrir les journaux", + "startupConfiguration": "Configuration de démarrage", + "runOnStartup": "Activer par défaut au démarrage", + "runOnStartupDesc": "Démarrer automatiquement le serveur API local au lancement de l'application.", + "serverConfiguration": "Configuration du serveur", + "serverHost": "Hôte du serveur", + "serverHostDesc": "Adresse réseau du serveur.", + "serverPort": "Port du serveur", + "serverPortDesc": "Numéro de port pour le serveur API.", + "apiPrefix": "Préfixe API", + "apiPrefixDesc": "Préfixe de chemin pour les points de terminaison API.", + "apiKey": "Clé API", + "apiKeyDesc": "Authentifier les requêtes avec une clé API.", + "trustedHosts": "Hôtes de confiance", + "trustedHostsDesc": "Hôtes autorisés à accéder au serveur, séparés par des virgules.", + "advancedSettings": "Paramètres avancés", + "cors": "Cross-Origin Resource Sharing (CORS)", + "corsDesc": "Autoriser les requêtes cross-origin vers le serveur API.", + "verboseLogs": "Journaux détaillés du serveur", + "verboseLogsDesc": "Activer les journaux détaillés du serveur pour le débogage.", + "proxyTimeout": "Délai d'attente des requêtes", + "proxyTimeoutDesc": "Temps d'attente pour une réponse du modèle local, en secondes." + }, + "privacy": { + "analytics": "Analyse", + "helpUsImprove": "Aidez-nous à améliorer", + "helpUsImproveDesc": "Pour nous aider à améliorer Jan, vous pouvez partager des données anonymes comme l'utilisation des fonctionnalités et le nombre d'utilisateurs. Nous ne collectons jamais vos conversations ni vos informations personnelles.", + "privacyPolicy": "Vous gardez le contrôle total sur vos données. En savoir plus dans notre politique de confidentialité.", + "analyticsDesc": "Pour améliorer Jan, nous devons comprendre comment il est utilisé—mais uniquement avec votre consentement. Vous pouvez modifier ce paramètre à tout moment.", + "privacyPromises": "Votre choix ici ne changera pas nos engagements de confidentialité :", + "promise1": "Vos conversations restent privées et sur votre appareil", + "promise2": "Nous ne collectons jamais vos informations personnelles ni le contenu des discussions", + "promise3": "Tous les partages de données sont anonymes et agrégés", + "promise4": "Vous pouvez vous désinscrire à tout moment sans perdre de fonctionnalités", + "promise5": "Nous sommes transparents sur ce que nous collectons et pourquoi" + }, + "general": { + "showInFinder": "Afficher dans le Finder", + "showInFileExplorer": "Afficher dans l'explorateur de fichiers", + "openContainingFolder": "Ouvrir le dossier contenant", + "failedToRelocateDataFolder": "Échec du déplacement du dossier de données", + "couldNotRelocateToRoot": "Impossible de déplacer le dossier de données vers le répertoire racine. Veuillez choisir un autre emplacement.", + "couldNotResetRootDirectory": "Impossible de réinitialiser le dossier de données lorsqu'il est défini sur un répertoire racine. Veuillez supprimer le dossier de données manuellement.", + "failedToRelocateDataFolderDesc": "Échec du déplacement du dossier de données. Veuillez réessayer.", + "devVersion": "Version de développement détectée", + "noUpdateAvailable": "Vous utilisez la dernière version", + "updateError": "Échec de la vérification des mises à jour", + "appVersion": "Version de l'application", + "checkForUpdates": "Vérifier les mises à jour", + "checkForUpdatesDesc": "Vérifiez si une version plus récente de Jan est disponible.", + "checkingForUpdates": "Vérification des mises à jour...", + "copied": "Copié", + "copyPath": "Copier le chemin", + "changeLocation": "Changer l'emplacement", + "openLogs": "Ouvrir les journaux", + "revealLogs": "Afficher les journaux", + "factoryResetTitle": "Réinitialiser les paramètres d'usine", + "factoryResetDesc": "Cela réinitialisera tous les paramètres de l'application à leurs valeurs par défaut. Cette action est irréversible. Nous ne recommandons cela que si l'application est corrompue.", + "cancel": "Annuler", + "reset": "Réinitialiser", + "huggingfaceToken": "Token HuggingFace", + "huggingfaceTokenDesc": "Votre token API HuggingFace pour accéder aux modèles.", + "resources": "Ressources", + "documentation": "Documentation", + "documentationDesc": "Apprenez à utiliser Jan et explorez ses fonctionnalités.", + "viewDocs": "Voir la documentation", + "releaseNotes": "Notes de version", + "releaseNotesDesc": "Découvrez les nouveautés de la dernière version de Jan.", + "viewReleases": "Voir les versions", + "community": "Communauté", + "github": "GitHub", + "githubDesc": "Contribuez au développement de Jan.", + "discord": "Discord", + "discordDesc": "Rejoignez notre communauté pour du support et des discussions.", + "support": "Support", + "reportAnIssue": "Signaler un problème", + "reportAnIssueDesc": "Vous avez trouvé un bug ? Aidez-nous en ouvrant un ticket sur GitHub.", + "reportIssue": "Signaler le problème", + "credits": "Crédits", + "creditsDesc1": "👋 Jan est construit avec ❤️ par l'équipe Menlo Research.", + "creditsDesc2": "Remerciements spéciaux à nos dépendances open-source—en particulier llama.cpp et Tauri—et à notre incroyable communauté IA." + }, + "extensions": { + "title": "Extensions" + }, + "dialogs": { + "changeDataFolder": { + "title": "Changer l'emplacement du dossier de données", + "description": "Êtes-vous sûr de vouloir changer l'emplacement du dossier de données ? Cela déplacera toutes vos données vers le nouvel emplacement et redémarrera l'application.", + "currentLocation": "Emplacement actuel :", + "newLocation": "Nouvel emplacement :", + "cancel": "Annuler", + "changeLocation": "Changer l'emplacement" + } + }, + "backendUpdater": { + "newBackendVersion": "Nouvelle version Llamacpp {{version}}", + "backendUpdateAvailable": "Mise à jour Llamacpp disponible", + "remindMeLater": "Me le rappeler plus tard", + "updating": "Mise à jour en cours...", + "updateNow": "Mettre à jour maintenant", + "updateSuccess": "Llamacpp mis à jour avec succès", + "updateError": "Échec de la mise à jour de Llamacpp" + }, + "backendInstallSuccess": "Backend installé avec succès", + "backendInstallError": "Échec de l'installation du backend" +} diff --git a/web-app/src/locales/fr/setup.json b/web-app/src/locales/fr/setup.json new file mode 100644 index 0000000000..6677550228 --- /dev/null +++ b/web-app/src/locales/fr/setup.json @@ -0,0 +1,6 @@ +{ + "welcome": "Bienvenue dans Jan", + "description": "Pour commencer, vous devez soit télécharger un modèle IA local, soit vous connecter à un modèle cloud en utilisant une clé API", + "localModel": "Configurer un modèle local", + "remoteProvider": "Configurer un fournisseur distant" +} diff --git a/web-app/src/locales/fr/system-monitor.json b/web-app/src/locales/fr/system-monitor.json new file mode 100644 index 0000000000..825de68b89 --- /dev/null +++ b/web-app/src/locales/fr/system-monitor.json @@ -0,0 +1,28 @@ +{ + "title": "Moniteur système", + "cpuUsage": "Utilisation du CPU", + "model": "Modèle", + "cores": "Cœurs", + "architecture": "Architecture", + "currentUsage": "Utilisation actuelle", + "memoryUsage": "Utilisation de la mémoire", + "totalRam": "RAM totale", + "availableRam": "RAM disponible", + "usedRam": "RAM utilisée", + "runningModels": "Modèles en cours d'exécution", + "noRunningModels": "Aucun modèle n'est actuellement en cours d'exécution", + "provider": "Fournisseur", + "uptime": "Temps d'activité", + "actions": "Actions", + "stop": "Arrêter", + "activeGpus": "GPUs actifs", + "noGpus": "Aucun GPU détecté", + "noActiveGpus": "Aucun GPU actif. Tous les GPU sont actuellement désactivés.", + "vramUsage": "Utilisation de la VRAM", + "driverVersion": "Version du pilote :", + "computeCapability": "Capacité de calcul :", + "active": "Actif", + "performance": "Performance", + "resources": "Ressources", + "refresh": "Actualiser" +} diff --git a/web-app/src/locales/fr/tool-approval.json b/web-app/src/locales/fr/tool-approval.json new file mode 100644 index 0000000000..5e468506fb --- /dev/null +++ b/web-app/src/locales/fr/tool-approval.json @@ -0,0 +1,12 @@ +{ + "title": "Demande d'appel d'outil", + "description": "L'assistant souhaite utiliser l'outil : {{toolName}}", + "securityNotice": "Avertissement de sécurité : Des outils malveillants ou un contenu de conversation pourraient potentiellement inciter l'assistant à tenter des actions dangereuses. Examinez chaque appel d'outil attentivement avant d'approuver.", + "deny": "Refuser", + "allowOnce": "Autoriser une fois", + "alwaysAllow": "Autoriser dans le fil", + "permissions": "Permissions", + "approve": "Approuver", + "reject": "Rejeter", + "parameters": "Paramètres de l'outil" +} diff --git a/web-app/src/locales/fr/tools.json b/web-app/src/locales/fr/tools.json new file mode 100644 index 0000000000..87b0ed309b --- /dev/null +++ b/web-app/src/locales/fr/tools.json @@ -0,0 +1,12 @@ +{ + "toolApproval": { + "title": "Autorisation d'outil requise", + "description": "L'assistant souhaite utiliser", + "securityNotice": "Des outils malveillants ou un contenu de conversation pourraient potentiellement inciter l'assistant à tenter des actions dangereuses. Examinez chaque appel d'outil attentivement avant d'approuver.", + "deny": "Refuser", + "allowOnce": "Autoriser une fois", + "alwaysAllow": "Autoriser dans le fil", + "parameters": "Paramètres de l'outil", + "permissionScope": "Les permissions accordées s'appliquent uniquement à cette conversation." + } +} diff --git a/web-app/src/locales/fr/updater.json b/web-app/src/locales/fr/updater.json new file mode 100644 index 0000000000..dbfcc2e08a --- /dev/null +++ b/web-app/src/locales/fr/updater.json @@ -0,0 +1,10 @@ +{ + "newVersion": "Nouvelle version {{version}}", + "updateAvailable": "Mise à jour disponible", + "nightlyBuild": "Build nocturne", + "showReleaseNotes": "Afficher les notes de version", + "hideReleaseNotes": "Masquer les notes de version", + "remindMeLater": "Me le rappeler plus tard", + "downloading": "Téléchargement...", + "updateNow": "Mettre à jour maintenant" +}