Bladeren bron

feat: translations (#3176)

crazywoola 1 jaar geleden
bovenliggende
commit
1382f10433
40 gewijzigde bestanden met toevoegingen van 2585 en 686 verwijderingen
  1. 27 12
      web/i18n/fr-FR/app-debug.ts
  2. 39 25
      web/i18n/fr-FR/app-log.ts
  3. 52 48
      web/i18n/fr-FR/app-overview.ts
  4. 58 22
      web/i18n/fr-FR/app.ts
  5. 5 0
      web/i18n/fr-FR/common.ts
  6. 1 1
      web/i18n/fr-FR/explore.ts
  7. 19 1
      web/i18n/fr-FR/run-log.ts
  8. 331 1
      web/i18n/fr-FR/workflow.ts
  9. 27 13
      web/i18n/ja-JP/app-debug.ts
  10. 27 13
      web/i18n/ja-JP/app-log.ts
  11. 53 49
      web/i18n/ja-JP/app-overview.ts
  12. 62 26
      web/i18n/ja-JP/app.ts
  13. 5 0
      web/i18n/ja-JP/common.ts
  14. 2 2
      web/i18n/ja-JP/explore.ts
  15. 19 1
      web/i18n/ja-JP/run-log.ts
  16. 329 1
      web/i18n/ja-JP/workflow.ts
  17. 17 3
      web/i18n/pt-BR/app-debug.ts
  18. 30 16
      web/i18n/pt-BR/app-log.ts
  19. 53 49
      web/i18n/pt-BR/app-overview.ts
  20. 55 27
      web/i18n/pt-BR/app.ts
  21. 4 0
      web/i18n/pt-BR/common.ts
  22. 1 1
      web/i18n/pt-BR/explore.ts
  23. 16 4
      web/i18n/pt-BR/run-log.ts
  24. 291 49
      web/i18n/pt-BR/workflow.ts
  25. 27 13
      web/i18n/uk-UA/app-debug.ts
  26. 58 44
      web/i18n/uk-UA/app-log.ts
  27. 81 77
      web/i18n/uk-UA/app-overview.ts
  28. 54 26
      web/i18n/uk-UA/app.ts
  29. 4 0
      web/i18n/uk-UA/common.ts
  30. 1 1
      web/i18n/uk-UA/explore.ts
  31. 17 5
      web/i18n/uk-UA/run-log.ts
  32. 292 50
      web/i18n/uk-UA/workflow.ts
  33. 27 12
      web/i18n/vi-VN/app-debug.ts
  34. 41 27
      web/i18n/vi-VN/app-log.ts
  35. 47 43
      web/i18n/vi-VN/app-overview.ts
  36. 57 21
      web/i18n/vi-VN/app.ts
  37. 5 0
      web/i18n/vi-VN/common.ts
  38. 1 1
      web/i18n/vi-VN/explore.ts
  39. 19 1
      web/i18n/vi-VN/run-log.ts
  40. 331 1
      web/i18n/vi-VN/workflow.ts

+ 27 - 12
web/i18n/fr-FR/app-debug.ts

@@ -266,18 +266,32 @@ const translation = {
     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',
+    'addModalTitle': 'Add Input Field',
+    'editModalTitle': 'Edit Input Field',
+    'description': 'Setting for variable {{varName}}',
+    'fieldType': 'Field type',
+    'string': 'Short Text',
+    'text-input': 'Short Text',
+    'paragraph': 'Paragraph',
+    'select': 'Select',
+    'number': 'Number',
+    'notSet': 'Not set, try typing {{input}} in the prefix prompt',
+    'stringTitle': 'Form text box options',
+    'maxLength': 'Max length',
+    'options': 'Options',
+    'addOption': 'Add option',
+    'apiBasedVar': 'API-based Variable',
+    'varName': 'Variable Name',
+    'labelName': 'Label Name',
+    'inputPlaceholder': 'Please input',
+    'required': 'Required',
+    'errorMsg': {
+      varNameRequired: 'Variable name is required',
+      labelNameRequired: 'Label name is required',
+      varNameCanBeRepeat: 'Variable name can not be repeated',
+      atLeastOneOption: 'At least one option is required',
+      optionRepeat: 'Has repeat options',
+    },
   },
   vision: {
     name: 'Vision',
@@ -348,6 +362,7 @@ const translation = {
   result: 'Texte de sortie',
   datasetConfig: {
     settingTitle: 'Paramètres de récupération',
+    knowledgeTip: 'Cliquez sur le bouton “+” pour ajouter des connaissances',
     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.',

+ 39 - 25
web/i18n/fr-FR/app-log.ts

@@ -1,17 +1,23 @@
 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',
+  description: 'Les journaux enregistrent l\'état d\'exécution de l\'application, y compris les entrées utilisateur et les réponses de l\'IA.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
   table: {
     header: {
-      time: 'Temps',
+      time: 'Heure',
       endUser: 'Utilisateur final',
       input: 'Entrée',
       output: 'Sortie',
       summary: 'Titre',
-      messageCount: 'Nombre de Messages',
-      userRate: 'Taux d\'utilisateur',
-      adminRate: 'Taux Op.',
+      messageCount: 'Nombre de messages',
+      userRate: 'Taux utilisateur',
+      adminRate: 'Taux op.',
+      startTime: 'HEURE DE DÉBUT',
+      status: 'STATUT',
+      runtime: 'TEMPS D\'EXÉCUTION',
+      tokens: 'JETONS',
+      user: 'UTILISATEUR FINAL',
+      version: 'VERSION',
     },
     pagination: {
       previous: 'Précédent',
@@ -21,49 +27,57 @@ const translation = {
       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 <shareLink>partager</shareLink> ou de <testLink>tester</testLink> l\'application Web',
+        title: 'Y a-t-il quelqu\'un ?',
+        content: 'Observez et annotez ici les interactions entre les utilisateurs finaux et les applications d\'IA pour améliorer en continu la précision de l\'IA. Vous pouvez essayer de <shareLink>partager</shareLink> ou de <testLink>tester</testLink> l\'application Web vous-même, puis revenir sur cette page.',
       },
     },
   },
   detail: {
-    time: 'Temps',
+    time: 'Heure',
     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"',
+    promptTemplate: 'Modèle de consigne',
+    promptTemplateBeforeChat: 'Modèle de consigne avant la conversation · En tant que message système',
+    annotationTip: 'Améliorations marquées par {{user}}',
+    timeConsuming: '',
+    second: 's',
     tokenCost: 'Jeton dépensé',
     loading: 'chargement',
     operation: {
-      like: 'comme',
-      dislike: 'déteste',
+      like: 'j\'aime',
+      dislike: 'je n\'aime pas',
       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.',
+      editAnnotation: 'Modifier une amélioration',
+      annotationPlaceholder: 'Entrez la réponse attendue que vous souhaitez que l\'IA donne, cela peut être utilisé pour le réglage 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',
+    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',
+      last7days: '7 derniers jours',
+      last4weeks: '4 dernières semaines',
+      last3months: '3 derniers mois',
+      last12months: '12 derniers mois',
       monthToDate: 'Mois à ce jour',
       quarterToDate: 'Trimestre à ce jour',
       yearToDate: 'Année à ce jour',
       allTime: 'Tout le temps',
     },
     annotation: {
-      all: 'Tout',
+      all: 'Tous',
       annotated: 'Améliorations annotées ({{count}} éléments)',
-      not_annotated: 'Non Annoté',
+      not_annotated: 'Non annoté',
     },
   },
+  workflowTitle: 'Journaux de workflow',
+  workflowSubtitle: 'Le journal enregistre l\'opération d\'Automate.',
+  runDetail: {
+    title: 'Journal de conversation',
+    workflowTitle: 'Détail du journal',
+  },
+  promptLog: 'Journal de consigne',
+  viewLog: 'Voir le journal',
 }
 
 export default translation

+ 52 - 48
web/i18n/fr-FR/app-overview.ts

@@ -1,18 +1,18 @@
 const translation = {
   welcome: {
     firstStepTip: 'Pour commencer,',
-    enterKeyTip: 'entrez votre clé API OpenAI ci-dessous',
+    enterKeyTip: 'saisissez 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)',
+    placeholder: 'Votre clé API OpenAI (ex. 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.',
+        description: 'Le quota d\'essai est fourni pour votre usage de test. Avant l\'épuisement des appels de quota d\'essai, 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.',
+        title: 'Votre quota d\'essai a été utilisé, veuillez configurer votre clé API.',
         description: 'Votre quota d\'essai a été épuisé. Veuillez configurer votre propre fournisseur de modèle ou acheter un quota supplémentaire.',
       },
     },
@@ -22,78 +22,78 @@ const translation = {
         row2: 'configurez d\'abord votre fournisseur de modèle.',
       },
     },
-    callTimes: 'Heures d\'appel',
-    usedToken: 'Token utilisé',
-    setAPIBtn: 'Allez configurer le fournisseur de modèle',
+    callTimes: 'Appels',
+    usedToken: 'Token utilisés',
+    setAPIBtn: 'Aller à la configuration du 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',
+      explanation: 'WebApp AI prête à l\'emploi',
       accessibleAddress: 'URL publique',
       preview: 'Aperçu',
-      regenerate: 'Régénérer',
+      regenerate: 'Regé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',
+        webDesc: 'Description de l\'application Web',
+        webDescTip: 'Ce texte sera affiché côté client, fournissant des directives de base sur la façon d\'utiliser l\'application',
+        webDescPlaceholder: 'Entrez la description de l\'application Web',
         language: 'Langue',
         more: {
-          entry: 'Montrer plus de paramètres',
-          copyright: 'Droit d\'auteur',
+          entry: 'Afficher plus de paramètres',
+          copyright: 'Droits d\'auteur',
           copyRightPlaceholder: 'Entrez le nom de l\'auteur ou de l\'organisation',
-          privacyPolicy: 'Politique de Confidentialité',
+          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 <privacyPolicyLink>Politique de Confidentialité</privacyPolicyLink> de Dify.',
+          privacyPolicyTip: 'Aide les visiteurs à comprendre les données collectées par l\'application, voir la <privacyPolicyLink>Politique de confidentialité</privacyPolicyLink> 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',
+        title: 'Intégrer sur un 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: 'Installer 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',
+        scan: 'Scanner et partager l\'application',
+        download: 'Télécharger le code QR',
       },
       customize: {
-        way: 'manière',
+        way: 'façon',
         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.',
+        title: 'Personnaliser l\'application Web AI',
+        explanation: 'Vous pouvez personnaliser l\'interface utilisateur de l\'application Web pour répondre à vos besoins 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',
+          name: 'Faire une copie du code client, le modifier et le déployer sur Vercel (recommandé)',
+          step1: 'Faire une copie du code client et le modifier',
+          step1Tip: 'Cliquez ici pour faire une copie du code source dans votre compte GitHub et le modifier',
+          step1Operation: 'Client-Web-Dify',
           step2: 'Déployer sur Vercel',
-          step2Tip: 'Cliquez ici pour importer le dépôt dans Vercel et déployer',
+          step2Tip: 'Cliquez ici pour importer le dépôt dans Vercel et le 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',
+          name: 'Écrire du code côté client pour appeler l\'API et le déployer sur un serveur',
           operation: 'Documentation',
         },
       },
     },
     apiInfo: {
-      title: 'API du service Backend',
+      title: 'API de service Backend',
       explanation: 'Facilement intégré dans votre application',
       accessibleAddress: 'Point de terminaison du service API',
-      doc: 'Référence API',
+      doc: 'Référence de l\'API',
     },
     status: {
       running: 'En service',
@@ -103,35 +103,39 @@ const translation = {
   analysis: {
     title: 'Analyse',
     ms: 'ms',
-    tokenPS: 'Jeton/s',
+    tokenPS: 'Token/s',
     totalMessages: {
-      title: 'Messages Totaux',
-      explanation: 'Nombre quotidien d\'interactions IA ; ingénierie/debuggage de prompt exclu.',
+      title: 'Total des messages',
+      explanation: 'Nombre d\'interactions quotidiennes avec l\'IA ; l\'ingénierie/le débogage des prompts sont exclus.',
     },
     activeUsers: {
-      title: 'Utilisateurs Actifs',
-      explanation: 'Utilisateurs uniques participant à des Q&A avec l\'IA ; l\'ingénierie/débogage de prompt exclu.',
+      title: 'Utilisateurs actifs',
+      explanation: 'Utilisateurs uniques engagés dans des Q&R avec l\'IA ; l\'ingénierie/le débogage des prompts sont exclus.',
     },
     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.',
+      title: 'Utilisation des tokens',
+      explanation: 'Reflet de l\'utilisation quotidienne des tokens du modèle de langue pour l\'application, utile pour le 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.',
+      title: 'Interactions moyennes par session',
+      explanation: 'Nombre de communications continu utilisateur-IA ; pour les applications basées sur la conversation.',
+    },
+    avgUserInteractions: {
+      title: 'Interactions moyennes par utilisateur',
+      explanation: 'Reflet de la fréquence d\'utilisation quotidienne des utilisateurs. Cette métrique reflète la fidélité des utilisateurs.',
     },
     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.',
+      title: 'Taux de satisfaction des utilisateurs',
+      explanation: 'Le nombre de likes parmi 1 000 messages. Cela indique la proportion de réponses avec lesquelles 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.',
+      explanation: 'Temps (ms) pour l\'IA pour traiter/répondre ; pour les applications basées sur du 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.',
+      title: 'Vitesse de sortie de token',
+      explanation: 'Mesurer les performances du LLM. Compter la vitesse de sortie des tokens du LLM depuis le début de la requête jusqu\'à l\'achèvement de la sortie.',
     },
   },
 }

+ 58 - 22
web/i18n/fr-FR/app.ts

@@ -1,38 +1,59 @@
 const translation = {
-  createApp: 'Créer une nouvelle application',
+  createApp: 'CRÉER UNE APPLICATION',
   types: {
     all: 'Tout',
-    assistant: 'Assistant',
-    completion: 'Complétion',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Flux de travail',
+    completion: 'Terminaison',
   },
-  modes: {
-    completion: 'Générateur de Texte',
-    chat: 'Assistant de Base',
-  },
-  createFromConfigFile: 'Créer une application à partir du fichier de configuration',
+  duplicate: 'Dupliquer',
+  duplicateTitle: 'Dupliquer l\'application',
+  export: 'Exporter DSL',
+  exportFailed: 'Échec de l\'exportation du DSL.',
+  importDSL: 'Importer le fichier DSL',
+  createFromConfigFile: 'Créer à partir du fichier DSL',
   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.',
+    '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é',
+  join: 'Rejoindre 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',
+    startFromBlank: 'Créer à partir de zéro',
+    startFromTemplate: 'Créer à partir d\'un modèle',
+    captionAppType: 'Quel type d\'application souhaitez-vous créer ?',
+    chatbotDescription: 'Construisez une application basée sur le chat. Cette application utilise un format question-réponse, permettant ainsi plusieurs tours de conversation continue.',
+    completionDescription: 'Construisez une application qui génère du texte de haute qualité en fonction des invites, telles que la génération d\'articles, de résumés, de traductions, et plus encore.',
+    completionWarning: 'Ce type d\'application ne sera plus pris en charge.',
+    agentDescription: 'Construisez un agent intelligent capable de choisir automatiquement les outils pour accomplir les tâches',
+    workflowDescription: 'Construisez une application qui génère du texte de haute qualité en fonction d\'un flux de travail avec un haut degré de personnalisation. Il convient aux utilisateurs expérimentés.',
+    workflowWarning: 'Actuellement en version bêta',
+    chatbotType: 'Méthode d\'orchestration du chatbot',
+    basic: 'Basique',
+    basicTip: 'Pour les débutants, peut passer à Chatflow plus tard',
+    basicFor: 'POUR LES DÉBUTANTS',
+    basicDescription: 'L\'orchestration de base permet d\'orchestrer une application Chatbot à l\'aide de paramètres simples, sans possibilité de modifier les invites intégrées. Il convient aux débutants.',
+    advanced: 'Chatflow',
+    advancedFor: 'Pour les utilisateurs avancés',
+    advancedDescription: 'L\'orchestration de flux de travail orchestre les Chatbots sous forme de workflows, offrant un haut degré de personnalisation, y compris la possibilité de modifier les invites intégrées. Il convient aux utilisateurs expérimentés.',
     captionName: 'Icône et nom de l\'application',
-    captionAppType: 'Quel type d\'application voulez-vous créer ?',
+    appNamePlaceholder: 'Donnez un nom à votre application',
+    captionDescription: 'Description',
+    appDescriptionPlaceholder: 'Entrez la description de l\'application',
+    useTemplate: 'Utiliser ce modèle',
     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',
+      'Je veux construire une application basée sur le chat. Cette application utilise un format question-réponse, 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',
+      'Je veux créer une application qui génère du texte de haute qualité en fonction des invites, telles que la génération d\'articles, de résumés, de traductions, et plus encore.',
+    showTemplates: 'Je veux choisir parmi un modèle',
     hideTemplates: 'Revenir à la sélection de mode',
     Create: 'Créer',
     Cancel: 'Annuler',
@@ -42,13 +63,28 @@ const translation = {
     appCreated: 'Application créée',
     appCreateFailed: 'Échec de la création de l\'application',
   },
-  editApp: {
-    startToEdit: 'Modifier l\'application',
-  },
+  editApp: 'Modifier les informations',
+  editAppTitle: 'Modifier les informations de l\'application',
+  editDone: 'Informations sur l\'application mises à jour',
+  editFailed: 'Échec de la mise à jour des informations de l\'application',
   emoji: {
-    ok: 'D\'accord',
+    ok: 'OK',
     cancel: 'Annuler',
   },
+  switch: 'Passer à l\'orchestration de flux de travail',
+  switchTipStart: 'Une nouvelle copie de l\'application sera créée pour vous, et la nouvelle copie passera à l\'orchestration de flux de travail. La nouvelle copie ne permettra pas le ',
+  switchTip: 'retour',
+  switchTipEnd: ' à l\'orchestration de base.',
+  switchLabel: 'La copie de l\'application à créer',
+  removeOriginal: 'Supprimer l\'application d\'origine',
+  switchStart: 'Commencer la commutation',
+  typeSelector: {
+    all: 'Tous Types',
+    chatbot: 'Chatbot',
+    agent: 'Agent',
+    workflow: 'Flux de travail',
+    completion: 'Terminaison',
+  },
 }
 
 export default translation

+ 5 - 0
web/i18n/fr-FR/common.ts

@@ -400,6 +400,7 @@ const translation = {
     promptEng: 'Orchestrer',
     apiAccess: 'Accès API',
     logAndAnn: 'Journaux & Annonces.',
+    logs: 'Journaux',
   },
   environment: {
     testing: 'TESTER',
@@ -477,6 +478,10 @@ const translation = {
         title: 'Variables & Outils Externes',
         desc: 'Insérer des Variables & Outils Externes',
       },
+      outputToolDisabledItem: {
+        title: 'Variables',
+        desc: 'Insérer Variables',
+      },
       modal: {
         add: 'Nouvelle variable',
         addTool: 'Nouvel outil',

+ 1 - 1
web/i18n/fr-FR/explore.ts

@@ -18,7 +18,7 @@ const translation = {
   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',
+    allCategories: 'Recommandé',
   },
   appCard: {
     addToWorkspace: 'Ajouter à l\'espace de travail',

+ 19 - 1
web/i18n/fr-FR/run-log.ts

@@ -1,5 +1,23 @@
 const translation = {
-
+  input: 'ENTRÉE',
+  result: 'RÉSULTAT',
+  detail: 'DÉTAIL',
+  tracing: 'TRACE',
+  resultPanel: {
+    status: 'STATUT',
+    time: 'TEMPS ÉCOULÉ',
+    tokens: 'TOTAL DES JETONS',
+  },
+  meta: {
+    title: 'MÉTADONNÉES',
+    status: 'Statut',
+    version: 'Version',
+    executor: 'Exécuteur',
+    startTime: 'Heure de début',
+    time: 'Temps écoulé',
+    tokens: 'Total des jetons',
+    steps: 'Étapes d\'exécution',
+  },
 }
 
 export default translation

+ 331 - 1
web/i18n/fr-FR/workflow.ts

@@ -1,3 +1,333 @@
-const translation = {}
+const translation = {
+  common: {
+    editing: 'Édition',
+    autoSaved: 'Enregistré automatiquement',
+    unpublished: 'Non publié',
+    published: 'Publié',
+    publish: 'Publier',
+    update: 'Mettre à jour',
+    run: 'Exécuter',
+    running: 'En cours',
+    inRunMode: 'En mode exécution',
+    inPreview: 'En prévisualisation',
+    inPreviewMode: 'En mode prévisualisation',
+    preview: 'Aperçu',
+    viewRunHistory: 'Voir l\'historique d\'exécution',
+    runHistory: 'Historique d\'exécution',
+    goBackToEdit: 'Retourner à l\'éditeur',
+    conversationLog: 'Journal de conversation',
+    features: 'Fonctionnalités',
+    debugAndPreview: 'Déboguer et prévisualiser',
+    restart: 'Redémarrer',
+    currentDraft: 'Brouillon actuel',
+    currentDraftUnpublished: 'Brouillon actuel non publié',
+    latestPublished: 'Dernière publication',
+    publishedAt: 'Publié',
+    restore: 'Restaurer',
+    runApp: 'Exécuter l\'application',
+    batchRunApp: 'Exécuter l\'application en lot',
+    accessAPIReference: 'Accéder à la référence de l\'API',
+    embedIntoSite: 'Intégrer dans le site',
+    addTitle: 'Ajouter un titre...',
+    addDescription: 'Ajouter une description...',
+    noVar: 'Aucune variable',
+    searchVar: 'Rechercher une variable',
+    variableNamePlaceholder: 'Nom de la variable',
+    setVarValuePlaceholder: 'Définir la variable',
+    needConnecttip: 'Cette étape n\'est connectée à rien',
+    maxTreeDepth: 'Limite maximale de {{depth}} nœuds par branche',
+    needEndNode: 'Le bloc de fin doit être ajouté',
+    needAnswerNode: 'Le bloc de réponse doit être ajouté',
+    workflowProcess: 'Processus de workflow',
+    notRunning: 'Pas encore en cours d\'exécution',
+    previewPlaceholder: 'Saisissez du contenu dans la zone ci-dessous pour commencer le débogage du Chatbot',
+    effectVarConfirm: {
+      title: 'Supprimer la variable',
+      content: 'La variable est utilisée dans d\'autres nœuds. Voulez-vous toujours la supprimer ?',
+    },
+    insertVarTip: 'Appuyez sur la touche \'/\' pour insérer rapidement',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} est requis',
+    authRequired: 'L\'autorisation est requise',
+    invalidJson: '{{field}} est un JSON invalide',
+    fields: {
+      variable: 'Nom de la variable',
+      variableValue: 'Valeur de la variable',
+      code: 'Code',
+      model: 'Modèle',
+      rerankModel: 'Modèle de retrait',
+    },
+    invalidVariable: 'Variable invalide',
+  },
+  singleRun: {
+    testRun: 'Exécution de test ',
+    startRun: 'Démarrer l\'exécution',
+    running: 'En cours',
+  },
+  tabs: {
+    'searchBlock': 'Rechercher un bloc',
+    'blocks': 'Blocs',
+    'builtInTool': 'Outil intégré',
+    'customTool': 'Outil personnalisé',
+    'question-understand': 'Compréhension des questions',
+    'logic': 'Logique',
+    'transform': 'Transformer',
+    'utilities': 'Utilitaires',
+    'noResult': 'Aucune correspondance trouvée',
+  },
+  blocks: {
+    'start': 'Démarrer',
+    'end': 'Fin',
+    'answer': 'Réponse',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Récupération de connaissances',
+    'question-classifier': 'Classificateur de questions',
+    'if-else': 'SI/SINON',
+    'code': 'Code',
+    'template-transform': 'Modèle',
+    'http-request': 'Requête HTTP',
+    'variable-assigner': 'Assignateur de variables',
+  },
+  blocksAbout: {
+    'start': 'Définir les paramètres initiaux pour lancer un flux de travail',
+    'end': 'Définir la fin et le type de résultat d\'un flux de travail',
+    'answer': 'Définir le contenu de réponse d\'une conversation',
+    'llm': 'Appeler de grands modèles de langage pour répondre aux questions ou traiter le langage naturel',
+    'knowledge-retrieval': 'Vous permet de interroger le contenu textuel lié aux questions des utilisateurs à partir des connaissances',
+    'question-classifier': 'Définir les conditions de classification des questions des utilisateurs, LLM peut définir comment la conversation progresse en fonction de la description de la classification',
+    'if-else': 'Vous permet de diviser le flux de travail en deux branches en fonction de conditions SI/SINON',
+    'code': 'Exécuter un morceau de code Python ou NodeJS pour implémenter une logique personnalisée',
+    'template-transform': 'Convertir des données en chaîne à l\'aide de la syntaxe du modèle Jinja',
+    'http-request': 'Permet d\'envoyer des requêtes serveur via le protocole HTTP',
+    'variable-assigner': 'Attribuer des variables dans différentes branches à la même variable pour obtenir une configuration unifiée des post-nœuds',
+  },
+  operator: {
+    zoomIn: 'Zoomer',
+    zoomOut: 'Dézoomer',
+    zoomTo50: 'Zoom à 50%',
+    zoomTo100: 'Zoom à 100%',
+    zoomToFit: 'Ajuster à la fenêtre',
+  },
+  panel: {
+    userInputField: 'Champ de saisie utilisateur',
+    changeBlock: 'Changer de bloc',
+    helpLink: 'Lien d\'aide',
+    about: 'À propos',
+    createdBy: 'Créé par ',
+    nextStep: 'Étape suivante',
+    addNextStep: 'Ajouter le prochain bloc dans ce flux de travail',
+    selectNextStep: 'Sélectionner le bloc suivant',
+    runThisStep: 'Exécuter cette étape',
+    checklist: 'Liste de contrôle',
+    checklistTip: 'Assurez-vous que tous les problèmes sont résolus avant de publier',
+    checklistResolved: 'Tous les problèmes sont résolus',
+    organizeBlocks: 'Organiser les blocs',
+    change: 'Changer',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Variables de sortie',
+      insertVarTip: 'Insérer une variable',
+      memory: {
+        memory: 'Mémoire',
+        memoryTip: 'Paramètres de mémoire de chat',
+        windowSize: 'Taille de la fenêtre',
+        conversationRoleName: 'Nom du rôle de conversation',
+        user: 'Préfixe utilisateur',
+        assistant: 'Préfixe assistant',
+      },
+      memories: {
+        title: 'Mémoires',
+        tip: 'Mémoire de chat',
+        builtIn: 'Intégré',
+      },
+    },
+    start: {
+      required: 'requis',
+      inputField: 'Champ d\'entrée',
+      builtInVar: 'Variables intégrées',
+      outputVars: {
+        query: 'Entrée utilisateur',
+        memories: {
+          des: 'Historique de conversation',
+          type: 'type de message',
+          content: 'contenu du message',
+        },
+        files: 'Liste de fichiers',
+      },
+      noVarTip: 'Définissez les entrées pouvant être utilisées dans le flux de travail',
+    },
+    end: {
+      outputs: 'Sorties',
+      output: {
+        type: 'type de sortie',
+        variable: 'variable de sortie',
+      },
+      type: {
+        'none': 'Aucun',
+        'plain-text': 'Texte brut',
+        'structured': 'Structuré',
+      },
+    },
+    answer: {
+      answer: 'Réponse',
+      outputVars: 'Variables de sortie',
+    },
+    llm: {
+      model: 'modèle',
+      variables: 'variables',
+      context: 'contexte',
+      contextTooltip: 'Vous pouvez importer des connaissances comme contexte',
+      notSetContextInPromptTip: 'Pour activer la fonction de contexte, veuillez remplir la variable de contexte dans PROMPT.',
+      prompt: 'invite',
+      roleDescription: {
+        system: 'Donnez des instructions générales pour la conversation',
+        user: 'Fournir des instructions, des requêtes ou toute entrée basée sur du texte au modèle',
+        assistant: 'Les réponses du modèle basées sur les messages de l\'utilisateur',
+      },
+      addMessage: 'Ajouter un message',
+      vision: 'vision',
+      files: 'Fichiers',
+      resolution: {
+        name: 'Résolution',
+        high: 'Élevée',
+        low: 'Faible',
+      },
+      outputVars: {
+        output: 'Générer du contenu',
+        usage: 'Informations sur l\'utilisation du modèle',
+      },
+      singleRun: {
+        variable: 'Variable',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Variable de requête',
+      knowledge: 'Connaissances',
+      outputVars: {
+        output: 'Données segmentées de récupération',
+        content: 'Contenu segmenté',
+        title: 'Titre segmenté',
+        icon: 'Icône segmentée',
+        url: 'URL segmentée',
+        metadata: 'Autres métadonnées',
+      },
+    },
+    http: {
+      inputVars: 'Variables d\'entrée',
+      api: 'API',
+      apiPlaceholder: 'Saisissez l\'URL, tapez ‘/’ pour insérer une variable',
+      notStartWithHttp: 'L\'API doit commencer par http:// ou https://',
+      key: 'Clé',
+      value: 'Valeur',
+      bulkEdit: 'Édition en masse',
+      keyValueEdit: 'Édition clé-valeur',
+      headers: 'En-têtes',
+      params: 'Paramètres',
+      body: 'Corps',
+      outputVars: {
+        body: 'Contenu de la réponse',
+        statusCode: 'Code d\'état de la réponse',
+        headers: 'Liste d\'en-têtes de réponse JSON',
+        files: 'Liste de fichiers',
+      },
+      authorization: {
+        'authorization': 'Autorisation',
+        'authorizationType': 'Type d\'autorisation',
+        'no-auth': 'Aucune',
+        'api-key': 'Clé API',
+        'auth-type': 'Type d\'authentification',
+        'basic': 'De base',
+        'bearer': 'Porteur',
+        'custom': 'Personnalisé',
+        'api-key-title': 'Clé API',
+        'header': 'En-tête',
+      },
+      insertVarPlaceholder: 'tapez \'/\' pour insérer une variable',
+    },
+    code: {
+      inputVars: 'Variables d\'entrée',
+      outputVars: 'Variables de sortie',
+    },
+    templateTransform: {
+      inputVars: 'Variables d\'entrée',
+      code: 'Code',
+      codeSupportTip: 'Ne prend en charge que Jinja2',
+      outputVars: {
+        output: 'Contenu transformé',
+      },
+    },
+    ifElse: {
+      if: 'Si',
+      else: 'Sinon',
+      elseDescription: 'Utilisé pour définir la logique qui doit être exécutée lorsque la condition SI n\'est pas remplie.',
+      and: 'et',
+      or: 'ou',
+      operator: 'Opérateur',
+      notSetVariable: 'Veuillez d\'abord définir la variable',
+      comparisonOperator: {
+        'contains': 'contient',
+        'not contains': 'ne contient pas',
+        'start with': 'commence par',
+        'end with': 'se termine par',
+        'is': 'est',
+        'is not': 'n\'est pas',
+        'empty': 'est vide',
+        'not empty': 'n\'est pas vide',
+        'null': 'est nul',
+        'not null': 'n\'est pas nul',
+      },
+      enterValue: 'Entrer une valeur',
+      addCondition: 'Ajouter une condition',
+      conditionNotSetup: 'Condition NON configurée',
+    },
+    variableAssigner: {
+      title: 'Attribuer des variables',
+      outputType: 'Type de sortie',
+      outputVarType: 'Type de variable de sortie',
+      varNotSet: 'Variable non définie',
+      noVarTip: 'Ajoutez les variables à attribuer',
+      type: {
+        string: 'Chaîne',
+        number: 'Nombre',
+        object: 'Objet',
+        array: 'Tableau',
+      },
+      outputVars: {
+        output: 'Valeur de la variable attribuée',
+      },
+    },
+    tool: {
+      toAuthorize: 'Pour autoriser',
+      inputVars: 'Variables d\'entrée',
+      outputVars: {
+        text: 'contenu généré par l\'outil',
+        files: {
+          title: 'fichiers générés par l\'outil',
+          type: 'Type de support. Actuellement, seul le support de l\'image est pris en charge',
+          transfer_method: 'Méthode de transfert. La valeur est remote_url ou local_file',
+          url: 'URL de l\'image',
+          upload_file_id: 'ID du fichier téléchargé',
+        },
+      },
+    },
+    questionClassifiers: {
+      model: 'modèle',
+      inputVars: 'Variables d\'entrée',
+      class: 'Classe',
+      classNamePlaceholder: 'Écrivez votre nom de classe',
+      advancedSetting: 'Paramètre avancé',
+      topicName: 'Nom du sujet',
+      topicPlaceholder: 'Écrivez votre nom de sujet',
+      addClass: 'Ajouter une classe',
+      instruction: 'Instruction',
+      instructionPlaceholder: 'Écrivez votre instruction',
+    },
+  },
+  tracing: {
+    stopBy: 'Arrêté par {{user}}',
+  },
+}
 
 export default translation

+ 27 - 13
web/i18n/ja-JP/app-debug.ts

@@ -263,20 +263,33 @@ const translation = {
     queryNoBeEmpty: 'プロンプトにクエリを設定する必要があります',
   },
   variableConig: {
-    modalTitle: 'フィールド設定',
-    description: '変数 {{varName}} の設定',
-    fieldType: 'フィールドタイプ',
-    string: '短いテキスト',
-    paragraph: '段落',
-    select: '選択',
-    notSet: '未設定、接頭辞プロンプトに {{input}} を入力してみてください',
-    stringTitle: 'フォームテキストボックスのオプション',
-    maxLength: '最大長',
-    options: 'オプション',
-    addOption: 'オプションを追加',
-    apiBasedVar: 'APIベースの変数',
+    'addModalTitle': '入力フィールドを追加',
+    'editModalTitle': '入力フィールドを編集',
+    'description': '{{varName}} の変数設定',
+    'fieldType': 'フィールドタイプ',
+    'string': 'ショートテキスト',
+    'text-input': 'ショートテキスト',
+    'paragraph': '段落',
+    'select': '選択',
+    'number': '数値',
+    'notSet': '設定されていません。プレフィックスのプロンプトで {{input}} を入力してみてください。',
+    'stringTitle': 'フォームテキストボックスオプション',
+    'maxLength': '最大長',
+    'options': 'オプション',
+    'addOption': 'オプションを追加',
+    'apiBasedVar': 'APIベースの変数',
+    'varName': '変数名',
+    'labelName': 'ラベル名',
+    'inputPlaceholder': '入力してください',
+    'required': '必須',
+    'errorMsg': {
+      varNameRequired: '変数名は必須です',
+      labelNameRequired: 'ラベル名は必須です',
+      varNameCanBeRepeat: '変数名は繰り返すことができません',
+      atLeastOneOption: '少なくとも1つのオプションが必要です',
+      optionRepeat: '繰り返しオプションがあります',
+    },
   },
-
   vision: {
     name: 'ビジョン',
     description: 'ビジョンを有効にすると、モデルが画像を受け取り、それに関する質問に答えることができます。',
@@ -346,6 +359,7 @@ const translation = {
   result: '出力テキスト',
   datasetConfig: {
     settingTitle: 'リトリーバル設定',
+    knowledgeTip: 'ナレッジを追加するには「+」ボタンをクリックしてください',
     retrieveOneWay: {
       title: 'N-to-1 リトリーバル',
       description: 'ユーザーの意図とナレッジの説明に基づいて、エージェントが自律的に最適なナレッジを選択します。個々の、限られたナレッジを持つアプリケーションに最適です。',

+ 27 - 13
web/i18n/ja-JP/app-log.ts

@@ -10,19 +10,25 @@ const translation = {
       output: '出力',
       summary: 'タイトル',
       messageCount: 'メッセージ数',
-      userRate: 'ユーザー評価',
-      adminRate: 'オペレータ評価',
+      userRate: 'ユーザーレート',
+      adminRate: '操作レート',
+      startTime: '開始時間',
+      status: 'ステータス',
+      runtime: 'ランタイム',
+      tokens: 'トークン',
+      user: 'エンドユーザー',
+      version: 'バージョン',
     },
     pagination: {
       previous: '前へ',
       next: '次へ',
     },
     empty: {
-      noChat: 'まだ会話ありません',
-      noOutput: '出力なし',
+      noChat: 'まだ会話ありません',
+      noOutput: '出力がありません',
       element: {
         title: '誰かいますか?',
-        content: 'ここではエンドユーザーとAIアプリケーションの相互作用を観察し、注釈を付けることでAIの精度を継続的に向上させることができます。自分自身でWebアプリを<shareLink>共有</shareLink>したり<testLink>テスト</testLink>したりして、このページに戻ってください。',
+        content: 'ここではエンドユーザーとAIアプリケーションの相互作用を観察し、注釈を付けることで、AIの精度を継続的に向上させます。Webアプリを<shareLink>共有</shareLink>または<testLink>テスト</testLink>してみて、このページに戻ってください。',
       },
     },
   },
@@ -30,18 +36,18 @@ const translation = {
     time: '時間',
     conversationId: '会話ID',
     promptTemplate: 'プロンプトテンプレート',
-    promptTemplateBeforeChat: 'チャット前のプロンプトテンプレート · システムメッセージとして',
-    annotationTip: '{{user}}による改善',
+    promptTemplateBeforeChat: 'チャット前のプロンプトテンプレートシステムメッセージとして',
+    annotationTip: '{{user}} によってマークされた改善',
     timeConsuming: '',
     second: '秒',
     tokenCost: 'トークン消費',
     loading: '読み込み中',
     operation: {
       like: 'いいね',
-      dislike: 'いまいち',
+      dislike: 'いいね解除',
       addAnnotation: '改善を追加',
       editAnnotation: '改善を編集',
-      annotationPlaceholder: 'AIが返答することを期待する回答を入力してください。これはモデルの微調整やテキスト生成品質の継続的な改善に使用されます。',
+      annotationPlaceholder: '将来のモデルの微調整やテキスト生成品質の継続的改善のためにAIが返信することを期待する答えを入力してください。',
     },
     variables: '変数',
     uploadImages: 'アップロードされた画像',
@@ -53,17 +59,25 @@ const translation = {
       last4weeks: '過去4週間',
       last3months: '過去3ヶ月',
       last12months: '過去12ヶ月',
-      monthToDate: '月まで',
-      quarterToDate: '四半期まで',
-      yearToDate: '年まで',
+      monthToDate: '月初から今日まで',
+      quarterToDate: '四半期初から今日まで',
+      yearToDate: '年初から今日まで',
       allTime: 'すべての期間',
     },
     annotation: {
       all: 'すべて',
-      annotated: '注釈付きの改善({{count}}件)',
+      annotated: '注釈付きの改善 ({{count}} アイテム)',
       not_annotated: '注釈なし',
     },
   },
+  workflowTitle: 'ワークフローログ',
+  workflowSubtitle: 'このログは Automate の操作を記録しました。',
+  runDetail: {
+    title: '会話ログ',
+    workflowTitle: 'ログの詳細',
+  },
+  promptLog: 'プロンプトログ',
+  viewLog: 'ログを表示',
 }
 
 export default translation

+ 53 - 49
web/i18n/ja-JP/app-overview.ts

@@ -1,137 +1,141 @@
 const translation = {
   welcome: {
-    firstStepTip: 'めるには、',
+    firstStepTip: 'はじめるには、',
     enterKeyTip: '以下にOpenAI APIキーを入力してください',
     getKeyTip: 'OpenAIダッシュボードからAPIキーを取得してください',
-    placeholder: 'OpenAI APIキー(例:sk-xxxx)',
+    placeholder: 'あなたのOpenAI APIキー(例:sk-xxxx)',
   },
   apiKeyInfo: {
     cloud: {
       trial: {
-        title: '{{providerName}}のトライアルクオータを使用しています。',
-        description: 'トライアルクオータはテスト用に提供されています。トライアルクオータの使用回数が尽きる前に、独自のモデルプロバイダを設定するか、追加のクオータを購入してください。',
+        title: '{{providerName}}トライアルクォータを使用しています。',
+        description: 'トライアルクォータはテスト用に提供されます。トライアルクォータのコールが使い切られる前に、独自のモデルプロバイダを設定するか、追加のクォータを購入してください。',
       },
       exhausted: {
-        title: 'トライアルクオータが使い果たされました。APIキーを設定してください。',
-        description: 'トライアルクオータが使い果たされました。独自のモデルプロバイダを設定するか、追加のクオータを購入してください。',
+        title: 'トライアルクォータが使い切れました。APIキーを設定してください。',
+        description: 'トライアルクォータが使い切れました。独自のモデルプロバイダを設定するか、追加のクォータを購入してください。',
       },
     },
     selfHost: {
       title: {
-        row1: 'めるには、',
+        row1: 'はじめるには、',
         row2: 'まずモデルプロバイダを設定してください。',
       },
     },
-    callTimes: '呼び出し回数',
+    callTimes: 'コール回数',
     usedToken: '使用済みトークン',
     setAPIBtn: 'モデルプロバイダの設定へ',
-    tryCloud: 'または無料クオートでDifyのクラウドバージョンを試してみてください',
+    tryCloud: 'またはDifyのクラウドバージョンを無料見積もりでお試しください',
   },
   overview: {
     title: '概要',
     appInfo: {
-      explanation: '使いやすいAI Webアプリ',
+      explanation: '使いやすいAI WebApp',
       accessibleAddress: '公開URL',
       preview: 'プレビュー',
       regenerate: '再生成',
-      preUseReminder: '続行する前にWebアプリを有効にしてください。',
+      preUseReminder: '続行する前にWebAppを有効にしてください。',
       settings: {
         entry: '設定',
-        title: 'Webアプリの設定',
-        webName: 'Webアプリ名',
-        webDesc: 'Webアプリの説明',
-        webDescTip: 'このテキストはクライアント側に表示され、アプリの使用方法に関する基本的なガイダンスを提供します。',
-        webDescPlaceholder: 'Webアプリの説明を入力してください',
+        title: 'WebApp設定',
+        webName: 'WebApp名',
+        webDesc: 'WebAppの説明',
+        webDescTip: 'このテキストはクライアント側に表示され、アプリケーションの使用方法の基本的なガイダンスを提供します。',
+        webDescPlaceholder: 'WebAppの説明を入力してください',
         language: '言語',
         more: {
-          entry: '詳細設定を表示',
+          entry: 'その他の設定を表示',
           copyright: '著作権',
-          copyRightPlaceholder: '著作者または組織を入力してください',
+          copyRightPlaceholder: '著作者または組織名を入力してください',
           privacyPolicy: 'プライバシーポリシー',
           privacyPolicyPlaceholder: 'プライバシーポリシーリンクを入力してください',
-          privacyPolicyTip: '訪問者がアプリが収集するデータを理解するのに役立ちます。Difyの<privacyPolicyLink>プライバシーポリシー</privacyPolicyLink>を参照してください。',
+          privacyPolicyTip: '訪問者がアプリケーションが収集するデータを理解し、Difyの<privacyPolicyLink>プライバシーポリシー</privacyPolicyLink>を参照できるようにします。',
         },
       },
       embedded: {
         entry: '埋め込み',
         title: 'ウェブサイトに埋め込む',
-        explanation: 'チャットアプリをウェブサイトに埋め込む方法を選択してください。',
+        explanation: 'チャットアプリをウェブサイトに埋め込む方法を選択します。',
         iframe: 'ウェブサイトの任意の場所にチャットアプリを追加するには、このiframeをHTMLコードに追加してください。',
         scripts: 'ウェブサイトの右下にチャットアプリを追加するには、このコードをHTMLに追加してください。',
         chromePlugin: 'Dify Chatbot Chrome拡張機能をインストール',
-        copied: 'コピー済み',
+        copied: 'コピーしました',
         copy: 'コピー',
       },
       qrcode: {
         title: '共有用QRコード',
-        scan: 'アプリを共有するためにスキャン',
+        scan: 'アプリケーションの共有をスキャン',
         download: 'QRコードをダウンロード',
       },
       customize: {
         way: '方法',
         entry: 'カスタマイズ',
-        title: 'AI Webアプリのカスタマイズ',
-        explanation: 'シナリオとスタイルのニーズに合わせてWebアプリのフロントエンドをカスタマイズできます。',
+        title: 'AI WebAppのカスタマイズ',
+        explanation: 'シナリオとスタイルのニーズに合わせてWeb Appのフロントエンドをカスタマイズできます。',
         way1: {
-          name: 'クライアントコードをフォークして変更し、Vercelにデプロイする(推奨)',
-          step1: 'クライアントコードをフォークして変更する',
-          step1Tip: 'ここをクリックしてソースコードをGitHubアカウントにフォークし、コードを変更してください',
+          name: 'クライアントコードをフォークして修正し、Vercelにデプロイします(推奨)',
+          step1: 'クライアントコードをフォークして修正します',
+          step1Tip: 'ここをクリックしてソースコードをGitHubアカウントにフォークし、コードを修正します',
           step1Operation: 'Dify-WebClient',
-          step2: 'Vercelにデプロイす',
-          step2Tip: 'ここをクリックしてリポジトリをVercelにインポートし、デプロイしてください',
-          step2Operation: 'リポジトリインポート',
-          step3: '環境変数を設定す',
-          step3Tip: 'Vercelに以下の環境変数を追加してください',
+          step2: 'Vercelにデプロイします',
+          step2Tip: 'ここをクリックしてリポジトリをVercelにインポートし、デプロイします',
+          step2Operation: 'リポジトリインポート',
+          step3: '環境変数を設定します',
+          step3Tip: 'Vercelに次の環境変数を追加します',
         },
         way2: {
-          name: 'APIを呼び出すためのクライアントサイドコードを記述し、サーバーにデプロイす',
+          name: 'クライアントサイドコードを記述してAPIを呼び出し、サーバーにデプロイします',
           operation: 'ドキュメント',
         },
       },
     },
     apiInfo: {
       title: 'バックエンドサービスAPI',
-      explanation: 'アプリケーションに簡単に統合できます',
+      explanation: 'あなたのアプリケーションに簡単に統合できます',
       accessibleAddress: 'サービスAPIエンドポイント',
       doc: 'APIリファレンス',
     },
     status: {
-      running: 'サービス中',
-      disable: '無効',
+      running: '稼働中',
+      disable: '無効',
     },
   },
   analysis: {
     title: '分析',
-    ms: 'ミリ秒',
+    ms: 'ms',
     tokenPS: 'トークン/秒',
     totalMessages: {
-      title: 'メッセージ数',
-      explanation: 'AIとのやり取りのうち、プロンプトのエンジニアリングやデバッグを除いた日次の相互作用数です。',
+      title: 'トータルメッセージ数',
+      explanation: '日次AIインタラクション数;工学的/デバッグ目的のプロンプトは除外されます。',
     },
     activeUsers: {
-      title: 'アクティブユーザー',
-      explanation: 'AIとのQ&Aに参加しているユニークなユーザー数です。プロンプトのエンジニアリングやデバッグを除きます。',
+      title: 'アクティブユーザー',
+      explanation: 'AIとのQ&Aに参加しているユニークユーザー数;工学的/デバッグ目的のプロンプトは除外されます。',
     },
     tokenUsage: {
       title: 'トークン使用量',
-      explanation: 'アプリケーションの言語モデルの日次トークン使用量を反映し、コスト管理の目的に役立ちます。',
-      consumed: '使用済み',
+      explanation: 'アプリケーションの言語モデルの日次トークン使用量を反映し、コスト管理に役立ちます。',
+      consumed: '消費されたトークン',
     },
     avgSessionInteractions: {
-      title: '平均セッション相互作用数',
-      explanation: '会話ベースのアプリケーションの連続したユーザーとAIのコミュニケーション数です。',
+      title: '平均セッションインタラクション数',
+      explanation: 'ユーザーとAIの連続的なコミュニケーション数;対話型アプリケーション向け。',
+    },
+    avgUserInteractions: {
+      title: '平均ユーザーインタラクション数',
+      explanation: 'ユーザーの日次使用頻度を反映します。この指標はユーザーの定着度を反映しています。',
     },
     userSatisfactionRate: {
-      title: 'ユーザー満足率',
-      explanation: '1,000メッセージあたりの「いいね」の数です。これは、ユーザーが非常に満足している回答の割合を示します。',
+      title: 'ユーザー満足率',
+      explanation: '1,000件のメッセージあたりの「いいね」の数。これは、ユーザーが非常に満足している回答の割合を示します。',
     },
     avgResponseTime: {
       title: '平均応答時間',
-      explanation: 'AIの処理/応答にかかる時間(ミリ秒)です。テキストベースのアプリケーションに適しています。',
+      explanation: 'AIが処理/応答する時間(ミリ秒);テキストベースのアプリケーション向け。',
     },
     tps: {
       title: 'トークン出力速度',
-      explanation: 'LLMのパフォーマンスを測定します。リクエストの開始から出力の完了までのLLMのトークン出力速度をカウントします。',
+      explanation: 'LLMのパフォーマンスを測定します。リクエストの開始から出力の完了までのLLMのトークン出力速度を数えます。',
     },
   },
 }

+ 62 - 26
web/i18n/ja-JP/app.ts

@@ -1,54 +1,90 @@
 const translation = {
-  createApp: '新しいアプリを作成する',
+  createApp: 'アプリを作成する',
   types: {
-    all: 'すべて',
-    assistant: 'アシスタント',
-    completion: '補完',
+    all: '全て',
+    chatbot: 'チャットボット',
+    agent: 'エージェント',
+    workflow: 'ワークフロー',
+    completion: '完了',
   },
-  modes: {
-    completion: 'テキスト生成',
-    chat: '基本アシスタント',
-  },
-  createFromConfigFile: '設定ファイルからアプリを作成する',
+  duplicate: '複製',
+  duplicateTitle: 'アプリを複製する',
+  export: 'DSL をエクスポート',
+  exportFailed: 'DSL のエクスポートに失敗しました。',
+  importDSL: 'DSL ファイルをインポート',
+  createFromConfigFile: 'DSL ファイルから作成する',
   deleteAppConfirmTitle: 'このアプリを削除しますか?',
   deleteAppConfirmContent:
-    'アプリの削除は元に戻せません。ユーザーはアプリにアクセスできなくなり、プロンプトの設定とログは永久に削除されます。',
+    'アプリを削除すると、元に戻すことはできません。ユーザーはもはやあなたのアプリにアクセスできず、すべてのプロンプトの設定とログが永久に削除されます。',
   appDeleted: 'アプリが削除されました',
   appDeleteFailed: 'アプリの削除に失敗しました',
   join: 'コミュニティに参加する',
   communityIntro:
-    'チームメンバーや貢献者、開発者とさまざまなチャンネルでディスカッションを行います。',
+    'さまざまなチャンネルでチームメンバーや貢献者、開発者と議論します。',
   roadmap: 'ロードマップを見る',
-  appNamePlaceholder: 'アプリの名前を入力してください',
   newApp: {
-    startToCreate: '新しいアプリを作成しましょう',
-    captionName: 'アプリアイコンと名前',
+    startFromBlank: 'から作成',
+    startFromTemplate: 'テンプレートから作成',
     captionAppType: 'どのタイプのアプリを作成しますか?',
-    previewDemo: 'デモをプレビューする',
+    chatbotDescription: 'チャット形式のアプリケーションを構築します。このアプリは質問と回答の形式を使用し、複数のラウンドの継続的な会話を可能にします。',
+    completionDescription: 'プロンプトに基づいて高品質のテキストを生成するアプリケーションを構築します。記事、要約、翻訳などを生成します。',
+    completionWarning: 'この種類のアプリはもうサポートされなくなります。',
+    agentDescription: 'タスクを自動的に完了するためのツールを選択できるインテリジェント エージェントを構築します',
+    workflowDescription: '高度なカスタマイズが可能なワークフローに基づいて高品質のテキストを生成するアプリケーションを構築します。経験豊富なユーザー向けです。',
+    workflowWarning: '現在ベータ版です',
+    chatbotType: 'チャットボットのオーケストレーション方法',
+    basic: '基本',
+    basicTip: '初心者向け。後で Chatflow に切り替えることができます',
+    basicFor: '初心者向け',
+    basicDescription: '基本オーケストレートは、組み込みのプロンプトを変更する機能がなく、簡単な設定を使用してチャットボット アプリをオーケストレートします。初心者向けです。',
+    advanced: 'Chatflow',
+    advancedFor: '上級ユーザー向け',
+    advancedDescription: 'ワークフロー オーケストレートは、ワークフロー形式でチャットボットをオーケストレートし、組み込みのプロンプトを編集する機能を含む高度なカスタマイズを提供します。経験豊富なユーザー向けです。',
+    captionName: 'アプリのアイコンと名前',
+    appNamePlaceholder: 'アプリに名前を付ける',
+    captionDescription: '説明',
+    appDescriptionPlaceholder: 'アプリの説明を入力してください',
+    useTemplate: 'このテンプレートを使用する',
+    previewDemo: 'デモをプレビュー',
     chatApp: 'アシスタント',
     chatAppIntro:
-      'チャットベースのアプリケーションを構築したいです。このアプリは質問と回答の形式を使用し、複数のラウンドの連続した会話が可能です。',
-    agentAssistant: '新しいエージェントアシスタント',
-    completeApp: 'テキスト生成',
+      'チャット形式のアプリケーションを構築したい。このアプリは質問と回答の形式を使用し、複数のラウンドの継続的な会話を可能にします。',
+    agentAssistant: '新しいエージェント アシスタント',
+    completeApp: 'テキスト ジェネレーター',
     completeAppIntro:
-      'プロンプトに基づいて高品質のテキストを生成するアプリケーションを作成したいです。記事、要約、翻訳などの生成が可能です。',
-    showTemplates: 'テンプレートから選択したいです',
+      'プロンプトに基づいて高品質のテキストを生成するアプリケーションを作成したい。記事、要約、翻訳などを生成します。',
+    showTemplates: 'テンプレートから選択したい',
     hideTemplates: 'モード選択に戻る',
-    Create: '作成',
+    Create: '作成する',
     Cancel: 'キャンセル',
-    nameNotEmpty: '名前は空にできません',
+    nameNotEmpty: '名前を入力してください',
     appTemplateNotSelected: 'テンプレートを選択してください',
-    appTypeRequired: 'アプリのタイプを選択してください',
+    appTypeRequired: 'アプリの種類を選択してください',
     appCreated: 'アプリが作成されました',
     appCreateFailed: 'アプリの作成に失敗しました',
   },
-  editApp: {
-    startToEdit: 'アプリを編集する',
-  },
+  editApp: '情報を編集する',
+  editAppTitle: 'アプリ情報を編集する',
+  editDone: 'アプリ情報が更新されました',
+  editFailed: 'アプリ情報の更新に失敗しました',
   emoji: {
     ok: 'OK',
     cancel: 'キャンセル',
   },
+  switch: 'ワークフロー オーケストレートに切り替える',
+  switchTipStart: '新しいアプリのコピーが作成され、新しいコピーがワークフロー オーケストレートに切り替わります。新しいコピーは ',
+  switchTip: '切り替えを許可しません',
+  switchTipEnd: ' 基本的なオーケストレートに戻ることはできません。',
+  switchLabel: '作成されるアプリのコピー',
+  removeOriginal: '元のアプリを削除する',
+  switchStart: '切り替えを開始する',
+  typeSelector: {
+    all: 'すべてのタイプ',
+    chatbot: 'チャットボット',
+    agent: 'エージェント',
+    workflow: 'ワークフロー',
+    completion: '完了',
+  },
 }
 
 export default translation

+ 5 - 0
web/i18n/ja-JP/common.ts

@@ -351,6 +351,7 @@ const translation = {
     promptEng: 'Orchestrate',
     apiAccess: 'APIアクセス',
     logAndAnn: 'ログ&アナウンス',
+    logs: 'ログ',
   },
   environment: {
     testing: 'テスト',
@@ -428,6 +429,10 @@ const translation = {
         title: '変数&外部ツール',
         desc: '変数&外部ツールを挿入',
       },
+      outputToolDisabledItem: {
+        title: '変数',
+        desc: '変数を挿入',
+      },
       modal: {
         add: '新しい変数',
         addTool: '新しいツール',

+ 2 - 2
web/i18n/ja-JP/explore.ts

@@ -1,5 +1,5 @@
 const translation = {
-  title: '探索する',
+  title: '探索',
   sidebar: {
     discovery: '探索',
     chat: 'チャット',
@@ -18,7 +18,7 @@ const translation = {
   apps: {
     title: 'Difyによるアプリの探索',
     description: 'これらのテンプレートアプリを即座に使用するか、テンプレートに基づいて独自のアプリをカスタマイズしてください。',
-    allCategories: 'すべてのカテゴリ',
+    allCategories: 'おすすめ',
   },
   appCard: {
     addToWorkspace: 'ワークスペースに追加',

+ 19 - 1
web/i18n/ja-JP/run-log.ts

@@ -1,5 +1,23 @@
 const translation = {
-
+  input: '入力',
+  result: '結果',
+  detail: '詳細',
+  tracing: 'トレース',
+  resultPanel: {
+    status: 'ステータス',
+    time: '経過時間',
+    tokens: 'トークンの合計',
+  },
+  meta: {
+    title: 'メタデータ',
+    status: 'ステータス',
+    version: 'バージョン',
+    executor: '実行者',
+    startTime: '開始時間',
+    time: '経過時間',
+    tokens: 'トークンの合計',
+    steps: '実行ステップ',
+  },
 }
 
 export default translation

+ 329 - 1
web/i18n/ja-JP/workflow.ts

@@ -1,5 +1,333 @@
 const translation = {
-
+  common: {
+    editing: '編集中',
+    autoSaved: '自動保存済み',
+    unpublished: '未公開',
+    published: '公開済み',
+    publish: '公開する',
+    update: '更新',
+    run: '実行',
+    running: '実行中',
+    inRunMode: '実行モード中',
+    inPreview: 'プレビュー中',
+    inPreviewMode: 'プレビューモード中',
+    preview: 'プレビュー',
+    viewRunHistory: '実行履歴を表示',
+    runHistory: '実行履歴',
+    goBackToEdit: '編集に戻る',
+    conversationLog: '会話ログ',
+    features: '機能',
+    debugAndPreview: 'デバッグとプレビュー',
+    restart: '再起動',
+    currentDraft: '現在の下書き',
+    currentDraftUnpublished: '現在の下書き(未公開)',
+    latestPublished: '最新の公開済み',
+    publishedAt: '公開日時',
+    restore: '復元',
+    runApp: 'アプリを実行',
+    batchRunApp: 'バッチでアプリを実行',
+    accessAPIReference: 'APIリファレンスにアクセス',
+    embedIntoSite: 'サイトに埋め込む',
+    addTitle: 'タイトルを追加...',
+    addDescription: '説明を追加...',
+    noVar: '変数なし',
+    searchVar: '変数を検索',
+    variableNamePlaceholder: '変数名',
+    setVarValuePlaceholder: '変数を設定',
+    needConnecttip: 'このステップは何にも接続されていません',
+    maxTreeDepth: 'ブランチごとの最大制限は{{depth}}ノードです',
+    needEndNode: '終了ブロックを追加する必要があります',
+    needAnswerNode: '回答ブロックを追加する必要があります',
+    workflowProcess: 'ワークフロー処理',
+    notRunning: 'まだ実行されていません',
+    previewPlaceholder: 'チャットボットのデバッグを開始するには、以下のボックスにコンテンツを入力してください',
+    effectVarConfirm: {
+      title: '変数を削除',
+      content: '他のノードで変数が使用されています。それでも削除しますか?',
+    },
+    insertVarTip: 'クイック挿入のために\'/\'キーを押します',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}}は必須です',
+    authRequired: '認証が必要です',
+    invalidJson: '{{field}}は無効です',
+    fields: {
+      variable: '変数名',
+      variableValue: '変数値',
+      code: 'コード',
+      model: 'モデル',
+      rerankModel: '再ランクモデル',
+    },
+    invalidVariable: '無効な変数',
+  },
+  singleRun: {
+    testRun: 'テスト実行',
+    startRun: '実行を開始',
+    running: '実行中',
+  },
+  tabs: {
+    'searchBlock': 'ブロックを検索',
+    'blocks': 'ブロック',
+    'builtInTool': '組み込みツール',
+    'customTool': 'カスタムツール',
+    'question-understand': '質問の理解',
+    'logic': 'ロジック',
+    'transform': '変換',
+    'utilities': 'ユーティリティ',
+    'noResult': '一致するものが見つかりませんでした',
+  },
+  blocks: {
+    'start': '開始',
+    'end': '終了',
+    'answer': '回答',
+    'llm': 'LLM',
+    'knowledge-retrieval': '知識取得',
+    'question-classifier': '質問分類器',
+    'if-else': 'IF/ELSE',
+    'code': 'コード',
+    'template-transform': 'テンプレート',
+    'http-request': 'HTTPリクエスト',
+    'variable-assigner': '変数割り当て',
+  },
+  blocksAbout: {
+    'start': 'ワークフローの開始に必要なパラメータを定義します',
+    'end': 'ワークフローの終了と結果のタイプを定義します',
+    'answer': 'チャット会話の応答内容を定義します',
+    'llm': '大規模言語モデルを呼び出して質問に回答したり、自然言語を処理したりします',
+    'knowledge-retrieval': 'ユーザーの質問に関連するテキストコンテンツを知識からクエリできるようにします',
+    'question-classifier': 'ユーザーの質問の分類条件を定義し、LLMは分類記述に基づいて会話がどのように進行するかを定義できます',
+    'if-else': 'IF/ELSE条件に基づいてワークフローを2つのブランチに分割できます',
+    'code': 'カスタムロジックを実装するためにPythonまたはNodeJSコードを実行します',
+    'template-transform': 'Jinjaテンプレート構文を使用してデータを文字列に変換します',
+    'http-request': 'HTTPプロトコル経由でサーバーリクエストを送信できます',
+    'variable-assigner': '異なるブランチで同じ変数に変数を割り当てて、後続のノードの一元化された構成を実現できます',
+  },
+  operator: {
+    zoomIn: '拡大',
+    zoomOut: '縮小',
+    zoomTo50: '50%にズーム',
+    zoomTo100: '100%にズーム',
+    zoomToFit: 'フィットにズーム',
+  },
+  panel: {
+    userInputField: 'ユーザー入力フィールド',
+    changeBlock: 'ブロックを変更',
+    helpLink: 'ヘルプリンク',
+    about: '情報',
+    createdBy: '作成者 ',
+    nextStep: '次のステップ',
+    addNextStep: 'このワークフローで次のブロックを追加',
+    selectNextStep: '次のブロックを選択',
+    runThisStep: 'このステップを実行',
+    checklist: 'チェックリスト',
+    checklistTip: '公開する前にすべての問題が解決されていることを確認してください',
+    checklistResolved: 'すべての問題が解決されました',
+    organizeBlocks: 'ブロックを整理',
+    change: '変更',
+  },
+  nodes: {
+    common: {
+      outputVars: '出力変数',
+      insertVarTip: '変数を挿入',
+      memory: {
+        memory: 'メモリ',
+        memoryTip: 'チャットメモリ設定',
+        windowSize: 'ウィンドウサイズ',
+        conversationRoleName: '会話ロール名',
+        user: 'ユーザー接頭辞',
+        assistant: 'アシスタント接頭辞',
+      },
+      memories: {
+        title: 'メモリ',
+        tip: 'チャットメモリ',
+        builtIn: '組み込み',
+      },
+    },
+    start: {
+      required: '必須',
+      inputField: '入力フィールド',
+      builtInVar: '組み込み変数',
+      outputVars: {
+        query: 'ユーザー入力',
+        memories: {
+          des: '会話履歴',
+          type: 'メッセージタイプ',
+          content: 'メッセージ内容',
+        },
+        files: 'ファイルリスト',
+      },
+      noVarTip: 'ワークフローで使用できる入力を設定します',
+    },
+    end: {
+      outputs: '出力',
+      output: {
+        type: '出力タイプ',
+        variable: '出力変数',
+      },
+      type: {
+        'none': 'なし',
+        'plain-text': 'プレーンテキスト',
+        'structured': '構造化',
+      },
+    },
+    answer: {
+      answer: '回答',
+      outputVars: '出力変数',
+    },
+    llm: {
+      model: 'モデル',
+      variables: '変数',
+      context: 'コンテキスト',
+      contextTooltip: 'コンテキストとして知識をインポートできます',
+      notSetContextInPromptTip: 'コンテキスト機能を有効にするには、PROMPTにコンテキスト変数を記入してください。',
+      prompt: 'プロンプト',
+      roleDescription: {
+        system: '会話の高レベルな命令を与えます',
+        user: 'モデルへの指示、クエリ、またはテキストベースの入力を提供します',
+        assistant: 'ユーザーメッセージに基づいてモデルの応答',
+      },
+      addMessage: 'メッセージを追加',
+      vision: 'ビジョン',
+      files: 'ファイル',
+      resolution: {
+        name: '解像度',
+        high: '高い',
+        low: '低い',
+      },
+      outputVars: {
+        output: 'コンテンツを生成',
+        usage: 'モデルの使用情報',
+      },
+      singleRun: {
+        variable: '変数',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'クエリ変数',
+      knowledge: '知識',
+      outputVars: {
+        output: '検索されたセグメント化されたデータ',
+        content: 'セグメント化されたコンテンツ',
+        title: 'セグメント化されたタイトル',
+        icon: 'セグメント化されたアイコン',
+        url: 'セグメント化されたURL',
+        metadata: 'その他のメタデータ',
+      },
+    },
+    http: {
+      inputVars: '入力変数',
+      api: 'API',
+      apiPlaceholder: 'URLを入力、「/」を入力して変数を挿入',
+      notStartWithHttp: 'APIはhttp://またはhttps://で始まる必要があります',
+      key: 'キー',
+      value: '値',
+      bulkEdit: '一括編集',
+      keyValueEdit: 'キー-値の編集',
+      headers: 'ヘッダー',
+      params: 'パラメータ',
+      body: 'ボディ',
+      outputVars: {
+        body: 'レスポンスコンテンツ',
+        statusCode: 'レスポンスステータスコード',
+        headers: 'レスポンスヘッダーリストJSON',
+        files: 'ファイルリスト',
+      },
+      authorization: {
+        'authorization': '認証',
+        'authorizationType': '認証タイプ',
+        'no-auth': 'なし',
+        'api-key': 'APIキー',
+        'auth-type': '認証タイプ',
+        'basic': '基本',
+        'bearer': 'Bearer',
+        'custom': 'カスタム',
+        'api-key-title': 'APIキー',
+        'header': 'ヘッダー',
+      },
+      insertVarPlaceholder: '変数を挿入するには\'/\'を入力してください',
+    },
+    code: {
+      inputVars: '入力変数',
+      outputVars: '出力変数',
+    },
+    templateTransform: {
+      inputVars: '入力変数',
+      code: 'コード',
+      codeSupportTip: 'Jinja2のみをサポートしています',
+      outputVars: {
+        output: '変換されたコンテンツ',
+      },
+    },
+    ifElse: {
+      if: 'もし',
+      else: 'それ以外',
+      elseDescription: 'IF条件が満たされない場合に実行するロジックを定義します。',
+      and: 'かつ',
+      or: 'または',
+      operator: '演算子',
+      notSetVariable: 'まず変数を設定してください',
+      comparisonOperator: {
+        'contains': '含む',
+        'not contains': '含まない',
+        'start with': 'で始まる',
+        'end with': 'で終わる',
+        'is': 'である',
+        'is not': 'でない',
+        'empty': '空',
+        'not empty': '空でない',
+        'null': 'null',
+        'not null': 'nullでない',
+      },
+      enterValue: '値を入力',
+      addCondition: '条件を追加',
+      conditionNotSetup: '条件が設定されていません',
+    },
+    variableAssigner: {
+      title: '変数を割り当てる',
+      outputType: '出力タイプ',
+      outputVarType: '出力変数のタイプ',
+      varNotSet: '変数が設定されていません',
+      noVarTip: '割り当てる変数を追加してください',
+      type: {
+        string: '文字列',
+        number: '数値',
+        object: 'オブジェクト',
+        array: '配列',
+      },
+      outputVars: {
+        output: '割り当てられた変数の値',
+      },
+    },
+    tool: {
+      toAuthorize: '承認するには',
+      inputVars: '入力変数',
+      outputVars: {
+        text: 'ツールが生成したコンテンツ',
+        files: {
+          title: 'ツールが生成したファイル',
+          type: 'サポートタイプ。現在は画像のみサポートされています',
+          transfer_method: '転送方法。値はremote_urlまたはlocal_fileです',
+          url: '画像URL',
+          upload_file_id: 'アップロードファイルID',
+        },
+      },
+    },
+    questionClassifiers: {
+      model: 'モデル',
+      inputVars: '入力変数',
+      class: 'クラス',
+      classNamePlaceholder: 'クラス名を入力してください',
+      advancedSetting: '高度な設定',
+      topicName: 'トピック名',
+      topicPlaceholder: 'トピック名を入力してください',
+      addClass: 'クラスを追加',
+      instruction: '指示',
+      instructionPlaceholder: '指示を入力してください',
+    },
+  },
+  tracing: {
+    stopBy: '{{user}}によって停止',
+  },
 }
 
 export default translation

+ 17 - 3
web/i18n/pt-BR/app-debug.ts

@@ -266,19 +266,32 @@ const translation = {
     queryNoBeEmpty: 'A consulta deve ser definida na solicitação',
   },
   variableConig: {
-    'addModalTitle': 'Configurações do Campo',
+    'addModalTitle': 'Adicionar Campo de Entrada',
+    'editModalTitle': 'Editar Campo de Entrada',
     'description': 'Configuração para a variável {{varName}}',
     'fieldType': 'Tipo de Campo',
     'string': 'Texto Curto',
     'text-input': 'Texto Curto',
     'paragraph': 'Parágrafo',
     'select': 'Selecionar',
-    'notSet': 'Não definido, tente digitar {{input}} na solicitação',
-    'stringTitle': 'Opções da Caixa de Texto do Formulário',
+    'number': 'Número',
+    'notSet': 'Não definido, tente digitar {{input}} no prompt de prefixo',
+    'stringTitle': 'Opções da caixa de texto do formulário',
     'maxLength': 'Comprimento Máximo',
     'options': 'Opções',
     'addOption': 'Adicionar opção',
     'apiBasedVar': 'Variável Baseada em API',
+    'varName': 'Nome da Variável',
+    'labelName': 'Nome do Rótulo',
+    'inputPlaceholder': 'Por favor, insira',
+    'required': 'Obrigatório',
+    'errorMsg': {
+      varNameRequired: 'O nome da variável é obrigatório',
+      labelNameRequired: 'O nome do rótulo é obrigatório',
+      varNameCanBeRepeat: 'O nome da variável não pode ser repetido',
+      atLeastOneOption: 'Pelo menos uma opção é obrigatória',
+      optionRepeat: 'Tem opções repetidas',
+    },
   },
   vision: {
     name: 'Visão',
@@ -349,6 +362,7 @@ const translation = {
   result: 'Texto de Saída',
   datasetConfig: {
     settingTitle: 'Configurações de Recuperação',
+    knowledgeTip: 'Clique no botão “+” para adicionar conhecimento',
     retrieveOneWay: {
       title: 'Recuperação N-para-1',
       description: 'Com base na intenção do usuário e nas descrições do Conhecimento, o Agente seleciona autonomamente o melhor Conhecimento para consulta. Melhor para aplicativos com Conhecimento distinto e limitado.',

+ 30 - 16
web/i18n/pt-BR/app-log.ts

@@ -1,10 +1,10 @@
 const translation = {
   title: 'Registros',
-  description: 'Os registros registram o status de execução do aplicativo, incluindo as entradas do usuário e as respostas da IA.',
+  description: 'Os registros registram o status de execução do aplicativo, incluindo entradas do usuário e respostas do AI.',
   dateTimeFormat: 'MM/DD/YYYY hh:mm A',
   table: {
     header: {
-      time: 'Tempo',
+      time: 'Hora',
       endUser: 'Usuário Final',
       input: 'Entrada',
       output: 'Saída',
@@ -12,58 +12,72 @@ const translation = {
       messageCount: 'Contagem de Mensagens',
       userRate: 'Taxa de Usuário',
       adminRate: 'Taxa de Op.',
+      startTime: 'HORA DE INÍCIO',
+      status: 'STATUS',
+      runtime: 'TEMPO DE EXECUÇÃO',
+      tokens: 'TOKENS',
+      user: 'USUÁRIO FINAL',
+      version: 'VERSÃO',
     },
     pagination: {
       previous: 'Anterior',
       next: 'Próximo',
     },
     empty: {
-      noChat: 'Nenhuma conversa ainda',
-      noOutput: 'Nenhuma saída',
+      noChat: 'Ainda não há conversas',
+      noOutput: 'Sem saída',
       element: {
         title: 'Tem alguém aí?',
-        content: 'Observe e anote as interações entre usuários finais e aplicativos de IA aqui para melhorar continuamente a precisão da IA. Você pode tentar <shareLink>compartilhar</shareLink> ou <testLink>testar</testLink> o aplicativo da Web você mesmo e depois voltar para esta página.',
+        content: 'Observe e anote as interações entre os usuários finais e os aplicativos de IA aqui para melhorar continuamente a precisão da IA. Você pode tentar <shareLink>compartilhar</shareLink> ou <testLink>testar</testLink> o aplicativo da Web você mesmo, e depois voltar para esta página.',
       },
     },
   },
   detail: {
-    time: 'Tempo',
+    time: 'Hora',
     conversationId: 'ID da Conversa',
     promptTemplate: 'Modelo de Prompt',
-    promptTemplateBeforeChat: 'Modelo de Prompt Antes da Conversa · Como Mensagem do Sistema',
+    promptTemplateBeforeChat: 'Modelo de Prompt Antes do Chat · Como Mensagem do Sistema',
     annotationTip: 'Melhorias Marcadas por {{user}}',
     timeConsuming: '',
     second: 's',
-    tokenCost: 'Tokens gastos',
+    tokenCost: 'Token gasto',
     loading: 'carregando',
     operation: {
       like: 'curtir',
       dislike: 'não curtir',
       addAnnotation: 'Adicionar Melhoria',
       editAnnotation: 'Editar Melhoria',
-      annotationPlaceholder: 'Digite a resposta esperada que você deseja que a IA responda, que pode ser usada para ajustar o modelo e melhorar continuamente a qualidade da geração de texto no futuro.',
+      annotationPlaceholder: 'Digite a resposta esperada que você deseja que o AI responda, o que pode ser usado para ajustar o modelo e melhorar continuamente a qualidade da geração de texto no futuro.',
     },
     variables: 'Variáveis',
-    uploadImages: 'Imagens Enviadas',
+    uploadImages: 'Imagens Carregadas',
   },
   filter: {
     period: {
       today: 'Hoje',
-      last7days: 'Últimos 7 Dias',
+      last7days: 'Últimos 7 dias',
       last4weeks: 'Últimas 4 semanas',
       last3months: 'Últimos 3 meses',
       last12months: 'Últimos 12 meses',
-      monthToDate: 'Mês até a data',
-      quarterToDate: 'Trimestre até a data',
-      yearToDate: 'Ano até a data',
+      monthToDate: 'Mês até hoje',
+      quarterToDate: 'Trimestre até hoje',
+      yearToDate: 'Ano até hoje',
       allTime: 'Todo o tempo',
     },
     annotation: {
-      all: 'Todos',
+      all: 'Tudo',
       annotated: 'Melhorias Anotadas ({{count}} itens)',
-      not_annotated: 'Não Anotadas',
+      not_annotated: 'Não Anotado',
     },
   },
+  workflowTitle: 'Registros de Fluxo de Trabalho',
+  workflowSubtitle: 'O registro registrou a operação do Automate.',
+  runDetail: {
+    title: 'Registro de Conversa',
+    workflowTitle: 'Detalhes do Registro',
+  },
+  promptLog: 'Registro de Prompt',
+  viewLog: 'Ver Registro',
 }
 
 export default translation

+ 53 - 49
web/i18n/pt-BR/app-overview.ts

@@ -1,47 +1,47 @@
 const translation = {
   welcome: {
     firstStepTip: 'Para começar,',
-    enterKeyTip: 'insira sua chave de API do OpenAI abaixo',
-    getKeyTip: 'Obtenha sua chave de API no painel do OpenAI',
-    placeholder: 'Sua chave de API do OpenAI (por exemplo, sk-xxxx)',
+    enterKeyTip: 'insira sua chave de API OpenAI abaixo',
+    getKeyTip: 'Obtenha sua chave de API no painel da OpenAI',
+    placeholder: 'Sua chave de API OpenAI (ex. sk-xxxx)',
   },
   apiKeyInfo: {
     cloud: {
       trial: {
-        title: 'Você está usando a cota de teste do {{providerName}}.',
-        description: 'A cota de teste é fornecida para uso de teste. Antes que as chamadas da cota de teste se esgotem, configure seu próprio provedor de modelo ou compre uma cota adicional.',
+        title: 'Você está usando a cota de teste da {{providerName}}.',
+        description: 'A cota de teste é fornecida para seu uso de teste. Antes que as chamadas de cota de teste se esgotem, configure seu próprio provedor de modelo ou compre cota adicional.',
       },
       exhausted: {
-        title: 'Sua cota de teste foi esgotada, configure sua chave de API.',
-        description: 'Sua cota de teste foi esgotada. Configure seu próprio provedor de modelo ou compre uma cota adicional.',
+        title: 'Sua cota de teste foi usada, configure sua chave de API.',
+        description: 'Sua cota de teste foi esgotada. Configure seu próprio provedor de modelo ou compre cota adicional.',
       },
     },
     selfHost: {
       title: {
         row1: 'Para começar,',
-        row2: 'configure seu próprio provedor de modelo primeiro.',
+        row2: 'configure primeiro seu provedor de modelo.',
       },
     },
     callTimes: 'Número de chamadas',
     usedToken: 'Tokens usados',
-    setAPIBtn: 'Ir para configurar provedor de modelo',
+    setAPIBtn: 'Ir para configurar o provedor de modelo',
     tryCloud: 'Ou experimente a versão em nuvem do Dify com cota gratuita',
   },
   overview: {
-    title: 'Visão geral',
+    title: 'Visão Geral',
     appInfo: {
-      explanation: 'Aplicativo Web de IA pronto para uso',
-      accessibleAddress: 'URL pública',
+      explanation: 'WebApp de IA Pronta para Uso',
+      accessibleAddress: 'URL Pública',
       preview: 'Visualização',
       regenerate: 'Regenerar',
-      preUseReminder: 'Ative o aplicativo da Web antes de continuar.',
+      preUseReminder: 'Por favor, ative o WebApp antes de continuar.',
       settings: {
         entry: 'Configurações',
-        title: 'Configurações do aplicativo da Web',
-        webName: 'Nome do aplicativo da Web',
-        webDesc: 'Descrição do aplicativo da Web',
+        title: 'Configurações do WebApp',
+        webName: 'Nome do WebApp',
+        webDesc: 'Descrição do WebApp',
         webDescTip: 'Este texto será exibido no lado do cliente, fornecendo orientações básicas sobre como usar o aplicativo',
-        webDescPlaceholder: 'Insira a descrição do aplicativo da Web',
+        webDescPlaceholder: 'Insira a descrição do WebApp',
         language: 'Idioma',
         more: {
           entry: 'Mostrar mais configurações',
@@ -49,55 +49,55 @@ const translation = {
           copyRightPlaceholder: 'Insira o nome do autor ou organização',
           privacyPolicy: 'Política de Privacidade',
           privacyPolicyPlaceholder: 'Insira o link da política de privacidade',
-          privacyPolicyTip: 'Ajuda os visitantes a entender os dados que o aplicativo coleta, consulte a <privacyPolicyLink>Política de Privacidade</privacyPolicyLink> do Dify.',
+          privacyPolicyTip: 'Ajuda os visitantes a entender os dados coletados pelo aplicativo, consulte a <privacyPolicyLink>Política de Privacidade</privacyPolicyLink> do Dify.',
         },
       },
       embedded: {
         entry: 'Embutido',
         title: 'Incorporar no site',
-        explanation: 'Escolha a maneira de incorporar o aplicativo de bate-papo ao seu site',
-        iframe: 'Para adicionar o aplicativo de bate-papo em qualquer lugar do seu site, adicione este iframe ao seu código HTML.',
-        scripts: 'Para adicionar um aplicativo de bate-papo na parte inferior direita do seu site, adicione este código ao seu HTML.',
-        chromePlugin: 'Instalar Extensão do Chatbot Dify para o Chrome',
+        explanation: 'Escolha a maneira de incorporar o aplicativo de chat ao seu site',
+        iframe: 'Para adicionar o aplicativo de chat em qualquer lugar do seu site, adicione este iframe ao seu código HTML.',
+        scripts: 'Para adicionar um aplicativo de chat no canto inferior direito do seu site, adicione este código ao seu HTML.',
+        chromePlugin: 'Instalar a Extensão do Chrome Dify Chatbot',
         copied: 'Copiado',
         copy: 'Copiar',
       },
       qrcode: {
         title: 'Código QR para compartilhar',
-        scan: 'Digitalizar para compartilhar o aplicativo',
+        scan: 'Digitalizar e compartilhar o aplicativo',
         download: 'Baixar código QR',
       },
       customize: {
-        way: 'maneira',
+        way: 'modo',
         entry: 'Personalizar',
-        title: 'Personalizar aplicativo Web de IA',
-        explanation: 'Você pode personalizar a interface do usuário do aplicativo Web para se adequar ao seu cenário e necessidades de estilo.',
+        title: 'Personalizar WebApp de IA',
+        explanation: 'Você pode personalizar a interface do usuário do Web App para atender às suas necessidades de cenário e estilo.',
         way1: {
-          name: 'Fork do código do cliente, modifique-o e implante no Vercel (recomendado)',
-          step1: 'Fork do código do cliente e modifique-o',
-          step1Tip: 'Clique aqui para fazer um fork do código-fonte em sua conta do GitHub e modificar o código',
-          step1Operation: 'Dify-WebClient',
+          name: 'Faça um fork do código do cliente, modifique-o e implante-o no Vercel (recomendado)',
+          step1: 'Faça um fork do código do cliente e modifique-o',
+          step1Tip: 'Clique aqui para fazer um fork do código-fonte na sua conta GitHub e modificar o código',
+          step1Operation: 'Cliente-Web-Dify',
           step2: 'Implantar no Vercel',
           step2Tip: 'Clique aqui para importar o repositório no Vercel e implantar',
           step2Operation: 'Importar repositório',
-          step3: 'Configurar variáveis de ambiente',
+          step3: 'Configurar as variáveis de ambiente',
           step3Tip: 'Adicione as seguintes variáveis de ambiente no Vercel',
         },
         way2: {
-          name: 'Escrever código do lado do cliente para chamar a API e implantá-lo em um servidor',
+          name: 'Escreva código do lado do cliente para chamar a API e implante-o em um servidor',
           operation: 'Documentação',
         },
       },
     },
     apiInfo: {
-      title: 'API do serviço de backend',
-      explanation: 'Integração fácil em seu aplicativo',
-      accessibleAddress: 'Endpoint da API de serviço',
+      title: 'API de Serviço de Back-end',
+      explanation: 'Facilmente integrado em sua aplicação',
+      accessibleAddress: 'Endpoint do Serviço API',
       doc: 'Referência da API',
     },
     status: {
       running: 'Em serviço',
-      disable: 'Desativar',
+      disable: 'Desabilitar',
     },
   },
   analysis: {
@@ -105,32 +105,36 @@ const translation = {
     ms: 'ms',
     tokenPS: 'Token/s',
     totalMessages: {
-      title: 'Total de mensagens',
-      explanation: 'Contagem diária de interações de IA; engenharia de prompt/depuração excluída.',
+      title: 'Total de Mensagens',
+      explanation: 'Contagem diária de interações AI; engenharia/de depuração excluída.',
     },
     activeUsers: {
-      title: 'Usuários ativos',
-      explanation: 'Usuários únicos envolvidos em perguntas e respostas com IA; engenharia de prompt/depuração excluída.',
+      title: 'Usuários Ativos',
+      explanation: 'Usuários únicos engajando em Q&A com AI; engenharia/de depuração excluída.',
     },
     tokenUsage: {
-      title: 'Uso de tokens',
-      explanation: 'Reflete o uso diário de tokens do modelo de linguagem para o aplicativo, útil para fins de controle de custos.',
-      consumed: 'Consumidos',
+      title: 'Uso de Token',
+      explanation: 'Reflete o uso diário do token do modelo de linguagem para o aplicativo, útil para fins de controle de custos.',
+      consumed: 'Consumido',
     },
     avgSessionInteractions: {
-      title: 'Média de interações por sessão',
-      explanation: 'Contagem contínua de comunicação usuário-IA; para aplicativos baseados em conversas.',
+      title: 'Média de Interações por Sessão',
+      explanation: 'Contagem de comunicação contínua entre usuário e AI; para aplicativos baseados em conversação.',
+    },
+    avgUserInteractions: {
+      title: 'Média de Interações por Usuário',
+      explanation: 'Reflete a frequência de uso diário dos usuários. Essa métrica reflete a fidelidade do usuário.',
     },
     userSatisfactionRate: {
-      title: 'Taxa de satisfação do usuário',
+      title: 'Taxa de Satisfação do Usuário',
       explanation: 'O número de curtidas por 1.000 mensagens. Isso indica a proporção de respostas com as quais os usuários estão altamente satisfeitos.',
     },
     avgResponseTime: {
-      title: 'Tempo médio de resposta',
-      explanation: 'Tempo (ms) para o processamento/resposta da IA; para aplicativos baseados em texto.',
+      title: 'Tempo Médio de Resposta',
+      explanation: 'Tempo (ms) para o AI processar/responder; para aplicativos baseados em texto.',
     },
     tps: {
-      title: 'Velocidade de saída de tokens',
+      title: 'Velocidade de Saída do Token',
       explanation: 'Mede o desempenho do LLM. Conta a velocidade de saída de tokens do LLM desde o início da solicitação até a conclusão da saída.',
     },
   },

+ 55 - 27
web/i18n/pt-BR/app.ts

@@ -1,62 +1,90 @@
 const translation = {
-  createApp: 'Criar aplicativo',
+  createApp: 'CRIAR APLICATIVO',
   types: {
-    all: 'Tudo',
+    all: 'Todos',
     chatbot: 'Chatbot',
     agent: 'Agente',
     workflow: 'Fluxo de trabalho',
-    completion: 'Gerador de Texto',
+    completion: 'Conclusão',
   },
   duplicate: 'Duplicar',
-  duplicateTitle: 'Duplicate aplicativo',
+  duplicateTitle: 'Duplicar Aplicativo',
   export: 'Exportar DSL',
-  createFromConfigFile: 'Criar através do arquivo DSL',
+  exportFailed: 'Falha ao exportar DSL.',
+  importDSL: 'Importar arquivo DSL',
+  createFromConfigFile: 'Criar a partir do arquivo DSL',
   deleteAppConfirmTitle: 'Excluir este aplicativo?',
   deleteAppConfirmContent:
-    'A exclusão do aplicativo é irreversível. Os usuários não poderão mais acessar seu aplicativo e todas as configurações de prompt e logs serão excluídas permanentemente.',
+    'A exclusão do aplicativo é irreversível. Os usuários não poderão mais acessar seu aplicativo e todas as configurações de prompt e logs serão permanentemente excluídas.',
   appDeleted: 'Aplicativo excluído',
-  appDeleteFailed: 'Falha ao excluir o aplicativo',
+  appDeleteFailed: 'Falha ao excluir aplicativo',
   join: 'Participe da comunidade',
   communityIntro:
     'Discuta com membros da equipe, colaboradores e desenvolvedores em diferentes canais.',
   roadmap: 'Veja nosso roteiro',
   newApp: {
-    startFromBlank: 'Começar de um aplicativo em branco',
-    startFromTemplate: 'Começar a partir de um modelo',
-    captionAppType: 'Que tipo de aplicativo você deseja?',
-    chatbotDescription: 'Construir um assistente baseado em chat usando um Modelo de Linguagem de Grande Escala',
-    agentDescription: 'Construir um Agente inteligente que pode escolher autonomamente ferramentas para completar as tarefas',
-    workflowDescription: 'Description text here',
-    captionName: 'Dê um nome ao seu aplicativo',
-    appNamePlaceholder: 'Dê um nome ao seu aplicativo',
+    startFromBlank: 'Criar do zero',
+    startFromTemplate: 'Criar do modelo',
+    captionAppType: 'Que tipo de aplicativo você deseja criar?',
+    chatbotDescription: 'Construa um aplicativo baseado em chat. Este aplicativo usa um formato de pergunta e resposta, permitindo várias rodadas de conversa contínua.',
+    completionDescription: 'Construa um aplicativo que gera texto de alta qualidade com base em prompts, como geração de artigos, resumos, traduções e muito mais.',
+    completionWarning: 'Este tipo de aplicativo não será mais suportado.',
+    agentDescription: 'Construa um Agente inteligente que pode escolher ferramentas para completar as tarefas autonomamente',
+    workflowDescription: 'Construa um aplicativo que gera texto de alta qualidade com base em fluxo de trabalho com alto grau de personalização. É adequado para usuários experientes.',
+    workflowWarning: 'Atualmente em beta',
+    chatbotType: 'Método de orquestração do Chatbot',
+    basic: 'Básico',
+    basicTip: 'Para iniciantes, pode mudar para o Chatflow mais tarde',
+    basicFor: 'PARA INICIANTES',
+    basicDescription: 'A Orquestração Básica permite orquestrar um aplicativo Chatbot usando configurações simples, sem a capacidade de modificar prompts integrados. É adequado para iniciantes.',
+    advanced: 'Chatflow',
+    advancedFor: 'Para usuários avançados',
+    advancedDescription: 'A Orquestração de Fluxo de Trabalho orquestra Chatbots na forma de fluxos de trabalho, oferecendo um alto grau de personalização, incluindo a capacidade de editar prompts integrados. É adequado para usuários experientes.',
+    captionName: 'Ícone e nome do aplicativo',
+    appNamePlaceholder: 'Dê um nome para o seu aplicativo',
     captionDescription: 'Descrição',
-    appDescriptionPlaceholder: 'Enter the description of the app',
-    useTemplate: 'Insira a descrição do aplicativo',
+    appDescriptionPlaceholder: 'Digite a descrição do aplicativo',
+    useTemplate: 'Usar este modelo',
     previewDemo: 'Visualizar demonstração',
-    chatApp: 'Usar este modelo',
+    chatApp: 'Assistente',
     chatAppIntro:
-      'Quero construir um aplicativo baseado em chat. Este aplicativo usa um formato de pergunta e resposta, permitindo várias rodadas de conversa contínua.',
-    agentAssistant: 'Assistente de novo agente',
+      'Eu quero construir um aplicativo baseado em chat. Este aplicativo usa um formato de pergunta e resposta, permitindo várias rodadas de conversa contínua.',
+    agentAssistant: 'Novo Assistente de Agente',
     completeApp: 'Gerador de Texto',
     completeAppIntro:
-      'Quero criar um aplicativo que gera texto de alta qualidade com base em prompts, como geração de artigos, resumos, traduções e muito mais.',
-    showTemplates: 'Quero escolher um modelo',
-    hideTemplates: 'Voltar para seleção de modo',
+      'Eu quero criar um aplicativo que gera texto de alta qualidade com base em prompts, como geração de artigos, resumos, traduções e muito mais.',
+    showTemplates: 'Quero escolher a partir de um modelo',
+    hideTemplates: 'Voltar para a seleção de modo',
     Create: 'Criar',
     Cancel: 'Cancelar',
     nameNotEmpty: 'O nome não pode estar vazio',
     appTemplateNotSelected: 'Por favor, selecione um modelo',
     appTypeRequired: 'Por favor, selecione um tipo de aplicativo',
     appCreated: 'Aplicativo criado',
-    appCreateFailed: 'Falha ao criar o aplicativo',
-  },
-  editApp: {
-    startToEdit: 'Editar Aplicativo',
+    appCreateFailed: 'Falha ao criar aplicativo',
   },
+  editApp: 'Editar Informações',
+  editAppTitle: 'Editar Informações do Aplicativo',
+  editDone: 'Informações do aplicativo atualizadas',
+  editFailed: 'Falha ao atualizar informações do aplicativo',
   emoji: {
     ok: 'OK',
     cancel: 'Cancelar',
   },
+  switch: 'Mudar para Orquestração de Fluxo de Trabalho',
+  switchTipStart: 'Será criada uma nova cópia do aplicativo para você e a nova cópia mudará para Orquestração de Fluxo de Trabalho. A nova cópia não permitirá a ',
+  switchTip: 'volta',
+  switchTipEnd: ' para Orquestração Básica.',
+  switchLabel: 'A cópia do aplicativo a ser criada',
+  removeOriginal: 'Excluir o aplicativo original',
+  switchStart: 'Iniciar mudança',
+  typeSelector: {
+    all: 'Todos os Tipos',
+    chatbot: 'Chatbot',
+    agent: 'Agente',
+    workflow: 'Fluxo de trabalho',
+    completion: 'Conclusão',
+  },
 }
 
 export default translation

+ 4 - 0
web/i18n/pt-BR/common.ts

@@ -478,6 +478,10 @@ const translation = {
         title: 'Variáveis e Ferramentas Externas',
         desc: 'Inserir Variáveis e Ferramentas Externas',
       },
+      outputToolDisabledItem: {
+        title: 'Variáveis',
+        desc: 'Inserir variáveis',
+      },
       modal: {
         add: 'Nova variável',
         addTool: 'Nova ferramenta',

+ 1 - 1
web/i18n/pt-BR/explore.ts

@@ -18,7 +18,7 @@ const translation = {
   apps: {
     title: 'Explorar Aplicações por Dify',
     description: 'Use esses aplicativos modelo instantaneamente ou personalize seus próprios aplicativos com base nos modelos.',
-    allCategories: 'Todas as Categorias',
+    allCategories: 'Recomendado',
   },
   appCard: {
     addToWorkspace: 'Adicionar ao Espaço de Trabalho',

+ 16 - 4
web/i18n/pt-BR/run-log.ts

@@ -1,10 +1,22 @@
 const translation = {
-  result: 'RESULT',
-  tracing: 'TRACING',
+  input: 'ENTRADA',
+  result: 'RESULTADO',
+  detail: 'DETALHE',
+  tracing: 'RASTREIO',
   resultPanel: {
     status: 'STATUS',
-    time: 'ELAPSED TIME',
-    tokens: 'TOTAL TOKENS',
+    time: 'TEMPO DECORRIDO',
+    tokens: 'TOTAL DE TOKENS',
+  },
+  meta: {
+    title: 'METADADOS',
+    status: 'Status',
+    version: 'Versão',
+    executor: 'Executor',
+    startTime: 'Hora de Início',
+    time: 'Tempo Decorrido',
+    tokens: 'Total de Tokens',
+    steps: 'Passos de Execução',
   },
 }
 

+ 291 - 49
web/i18n/pt-BR/workflow.ts

@@ -1,90 +1,332 @@
 const translation = {
+  common: {
+    editing: 'Editando',
+    autoSaved: 'Auto-salvo',
+    unpublished: 'Não publicado',
+    published: 'Publicado',
+    publish: 'Publicar',
+    update: 'Atualizar',
+    run: 'Executar',
+    running: 'Executando',
+    inRunMode: 'No modo de execução',
+    inPreview: 'Na prévia',
+    inPreviewMode: 'No modo de prévia',
+    preview: 'Prévia',
+    viewRunHistory: 'Ver histórico de execução',
+    runHistory: 'Histórico de execução',
+    goBackToEdit: 'Voltar para a edição',
+    conversationLog: 'Registro de conversa',
+    features: 'Recursos',
+    debugAndPreview: 'Depurar e pré-visualizar',
+    restart: 'Reiniciar',
+    currentDraft: 'Rascunho atual',
+    currentDraftUnpublished: 'Rascunho atual não publicado',
+    latestPublished: 'Último publicado',
+    publishedAt: 'Publicado em',
+    restore: 'Restaurar',
+    runApp: 'Executar aplicativo',
+    batchRunApp: 'Executar aplicativo em lote',
+    accessAPIReference: 'Acessar referência da API',
+    embedIntoSite: 'Incorporar no site',
+    addTitle: 'Adicionar título...',
+    addDescription: 'Adicionar descrição...',
+    noVar: 'Sem variável',
+    searchVar: 'Buscar variável',
+    variableNamePlaceholder: 'Nome da variável',
+    setVarValuePlaceholder: 'Definir variável',
+    needConnecttip: 'Esta etapa não está conectada a nada',
+    maxTreeDepth: 'Limite máximo de {{depth}} nós por ramificação',
+    needEndNode: 'O bloco de fim deve ser adicionado',
+    needAnswerNode: 'O bloco de resposta deve ser adicionado',
+    workflowProcess: 'Processo de fluxo de trabalho',
+    notRunning: 'Ainda não em execução',
+    previewPlaceholder: 'Digite o conteúdo na caixa abaixo para iniciar a depuração do Chatbot',
+    effectVarConfirm: {
+      title: 'Remover variável',
+      content: 'A variável está sendo usada em outros nós. Deseja removê-la mesmo assim?',
+    },
+    insertVarTip: 'Pressione a tecla \'/\' para inserir rapidamente',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} é obrigatório',
+    authRequired: 'Autorização é necessária',
+    invalidJson: '{{field}} é JSON inválido',
+    fields: {
+      variable: 'Nome da Variável',
+      variableValue: 'Valor da Variável',
+      code: 'Código',
+      model: 'Modelo',
+      rerankModel: 'Modelo de Re-ordenação',
+    },
+    invalidVariable: 'Variável inválida',
+  },
+  singleRun: {
+    testRun: 'Execução de teste ',
+    startRun: 'Iniciar execução',
+    running: 'Executando',
+  },
+  tabs: {
+    'searchBlock': 'Buscar bloco',
+    'blocks': 'Blocos',
+    'builtInTool': 'Ferramenta incorporada',
+    'customTool': 'Ferramenta personalizada',
+    'question-understand': 'Entendimento da pergunta',
+    'logic': 'Lógica',
+    'transform': 'Transformar',
+    'utilities': 'Utilitários',
+    'noResult': 'Nenhum resultado encontrado',
+  },
+  blocks: {
+    'start': 'Início',
+    'end': 'Fim',
+    'answer': 'Resposta',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Recuperação de conhecimento',
+    'question-classifier': 'Classificador de perguntas',
+    'if-else': 'Se/Senão',
+    'code': 'Código',
+    'template-transform': 'Modelo',
+    'http-request': 'Requisição HTTP',
+    'variable-assigner': 'Atribuidor de variáveis',
+  },
+  blocksAbout: {
+    'start': 'Defina os parâmetros iniciais para iniciar um fluxo de trabalho',
+    'end': 'Defina o final e o tipo de resultado de um fluxo de trabalho',
+    'answer': 'Defina o conteúdo da resposta de uma conversa no chat',
+    'llm': 'Invocar grandes modelos de linguagem para responder perguntas ou processar linguagem natural',
+    'knowledge-retrieval': 'Permite consultar conteúdo de texto relacionado a perguntas de usuário do conhecimento',
+    'question-classifier': 'Define as condições de classificação de perguntas do usuário, LLM pode definir como a conversa progride com base na descrição da classificação',
+    'if-else': 'Permite dividir o fluxo de trabalho em dois ramos com base em condições if/else',
+    'code': 'Execute um trecho de código Python ou NodeJS para implementar lógica personalizada',
+    'template-transform': 'Converta dados em string usando a sintaxe do modelo Jinja',
+    'http-request': 'Permite enviar solicitações de servidor sobre o protocolo HTTP',
+    'variable-assigner': 'Atribua variáveis em diferentes ramos à mesma variável para alcançar uma configuração unificada de pós-nós',
+  },
+  operator: {
+    zoomIn: 'Aumentar zoom',
+    zoomOut: 'Diminuir zoom',
+    zoomTo50: 'Zoom para 50%',
+    zoomTo100: 'Zoom para 100%',
+    zoomToFit: 'Zoom para ajustar',
+  },
+  panel: {
+    userInputField: 'Campo de entrada do usuário',
+    changeBlock: 'Mudar bloco',
+    helpLink: 'Link de ajuda',
+    about: 'Sobre',
+    createdBy: 'Criado por ',
+    nextStep: 'Próximo passo',
+    addNextStep: 'Adicionar o próximo bloco neste fluxo de trabalho',
+    selectNextStep: 'Selecionar próximo bloco',
+    runThisStep: 'Executar este passo',
+    checklist: 'Lista de verificação',
+    checklistTip: 'Certifique-se de resolver todos os problemas antes de publicar',
+    checklistResolved: 'Todos os problemas estão resolvidos',
+    organizeBlocks: 'Organizar blocos',
+    change: 'Mudar',
+  },
   nodes: {
     common: {
-      outputVars: 'Output Variables',
-      insertVarTip: 'Insert Variable',
+      outputVars: 'Variáveis de saída',
+      insertVarTip: 'Pressione a tecla \'/\' para inserir',
+      memory: {
+        memory: 'Memória',
+        memoryTip: 'Configurações de memória do chat',
+        windowSize: 'Tamanho da janela',
+        conversationRoleName: 'Nome do papel na conversa',
+        user: 'Prefixo do usuário',
+        assistant: 'Prefixo do assistente',
+      },
+      memories: {
+        title: 'Memórias',
+        tip: 'Memória do chat',
+        builtIn: 'Incorporada',
+      },
     },
     start: {
-      required: 'required',
-      inputField: 'Input Field',
-      builtInVar: 'Built-in Variables',
+      required: 'obrigatório',
+      inputField: 'Campo de entrada',
+      builtInVar: 'Variáveis incorporadas',
       outputVars: {
-        query: 'User input',
+        query: 'Entrada do usuário',
         memories: {
-          des: 'Conversation history',
-          type: 'message type',
-          content: 'message content',
+          des: 'Histórico da conversa',
+          type: 'Tipo de mensagem',
+          content: 'Conteúdo da mensagem',
         },
-        files: 'File list',
+        files: 'Lista de arquivos',
       },
+      noVarTip: 'Defina as entradas que podem ser usadas no fluxo de trabalho',
     },
     end: {
-      outputs: 'Outputs',
+      outputs: 'Saídas',
+      output: {
+        type: 'Tipo de saída',
+        variable: 'Variável de saída',
+      },
       type: {
-        'none': 'None',
-        'plain-text': 'Plain Text',
-        'structured': 'Structured',
+        'none': 'Nenhum',
+        'plain-text': 'Texto simples',
+        'structured': 'Estruturado',
       },
     },
     answer: {
-      answer: 'Answer',
-      inputVars: 'Input Variables',
+      answer: 'Resposta',
+      outputVars: 'Variáveis de saída',
     },
     llm: {
-      model: 'model',
-      variables: 'variables',
-      context: 'context',
+      model: 'modelo',
+      variables: 'variáveis',
+      context: 'contexto',
+      contextTooltip: 'Você pode importar conhecimento como contexto',
+      notSetContextInPromptTip: 'Para habilitar o recurso de contexto, preencha a variável de contexto em PROMPT.',
       prompt: 'prompt',
-      vision: 'vision',
+      roleDescription: {
+        system: 'Dar instruções de alto nível para a conversa',
+        user: 'Fornecer instruções, consultas ou qualquer entrada baseada em texto para o modelo',
+        assistant: 'Respostas do modelo com base nas mensagens do usuário',
+      },
+      addMessage: 'Adicionar mensagem',
+      vision: 'visão',
+      files: 'Arquivos',
+      resolution: {
+        name: 'Resolução',
+        high: 'Alta',
+        low: 'Baixa',
+      },
       outputVars: {
-        output: 'Generate content',
-        usage: 'Model Usage Information',
+        output: 'Gerar conteúdo',
+        usage: 'Informações de uso do modelo',
+      },
+      singleRun: {
+        variable: 'Variável',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Variável de consulta',
+      knowledge: 'Conhecimento',
+      outputVars: {
+        output: 'Dados segmentados de recuperação',
+        content: 'Conteúdo segmentado',
+        title: 'Título segmentado',
+        icon: 'Ícone segmentado',
+        url: 'URL segmentada',
+        metadata: 'Outros metadados',
       },
     },
     http: {
-      inputVars: 'Input Variables',
+      inputVars: 'Variáveis de entrada',
       api: 'API',
-      headers: 'Headers',
-      params: 'Params',
-      body: 'Body',
+      apiPlaceholder: 'Insira o URL, digite \'/\' para inserir a variável',
+      notStartWithHttp: 'A API deve começar com http:// ou https://',
+      key: 'Chave',
+      value: 'Valor',
+      bulkEdit: 'Editar em massa',
+      keyValueEdit: 'Edição de chave-valor',
+      headers: 'Cabeçalhos',
+      params: 'Parâmetros',
+      body: 'Corpo',
       outputVars: {
-        body: 'Response Content',
-        statusCode: 'Response Status Code',
-        headers: 'Response Header List JSON',
+        body: 'Conteúdo da resposta',
+        statusCode: 'Código de status da resposta',
+        headers: 'Lista de cabeçalhos de resposta JSON',
+        files: 'Lista de arquivos',
       },
+      authorization: {
+        'authorization': 'Autorização',
+        'authorizationType': 'Tipo de autorização',
+        'no-auth': 'Nenhum',
+        'api-key': 'Chave da API',
+        'auth-type': 'Tipo de autenticação',
+        'basic': 'Básica',
+        'bearer': 'Bearer',
+        'custom': 'Personalizada',
+        'api-key-title': 'Chave da API',
+        'header': 'Cabeçalho',
+      },
+      insertVarPlaceholder: 'digite \'/\' para inserir variável',
     },
     code: {
-      inputVars: 'Input Variables',
-      outputVars: 'Output Variables',
+      inputVars: 'Variáveis de entrada',
+      outputVars: 'Variáveis de saída',
     },
     templateTransform: {
-      inputVars: 'Input Variables',
-      code: 'Code',
-      codeSupportTip: 'Only supports Jinja2',
+      inputVars: 'Variáveis de entrada',
+      code: 'Código',
+      codeSupportTip: 'Suporta apenas Jinja2',
       outputVars: {
-        output: 'Transformed content',
+        output: 'Conteúdo transformado',
       },
     },
     ifElse: {
-      conditions: 'Conditions',
-      and: 'and',
-      or: 'or',
+      if: 'Se',
+      else: 'Senão',
+      elseDescription: 'Usado para definir a lógica que deve ser executada quando a condição if não é atendida.',
+      and: 'e',
+      or: 'ou',
+      operator: 'Operador',
+      notSetVariable: 'Por favor, defina a variável primeiro',
       comparisonOperator: {
-        'contains': 'contains',
-        'not contains': 'not contains',
-        'start with': 'start with',
-        'end with': 'end with',
-        'is': 'is',
-        'is not': 'is not',
-        'empty': 'empty',
-        'not empty': 'not empty',
-        'null': 'is null',
-        'not null': 'is not null',
+        'contains': 'contém',
+        'not contains': 'não contém',
+        'start with': 'começa com',
+        'end with': 'termina com',
+        'is': 'é',
+        'is not': 'não é',
+        'empty': 'vazio',
+        'not empty': 'não está vazio',
+        'null': 'nulo',
+        'not null': 'não é nulo',
       },
+      enterValue: 'Digite o valor',
+      addCondition: 'Adicionar condição',
+      conditionNotSetup: 'Condição NÃO configurada',
     },
     variableAssigner: {
-      title: 'Assign variables',
+      title: 'Atribuir variáveis',
+      outputType: 'Tipo de saída',
+      outputVarType: 'Tipo de variável de saída',
+      varNotSet: 'Variável não definida',
+      noVarTip: 'Adicione as variáveis a serem atribuídas',
+      type: {
+        string: 'String',
+        number: 'Número',
+        object: 'Objeto',
+        array: 'Array',
+      },
+      outputVars: {
+        output: 'Valor da variável atribuída',
+      },
     },
+    tool: {
+      toAuthorize: 'Para autorizar',
+      inputVars: 'Variáveis de entrada',
+      outputVars: {
+        text: 'conteúdo gerado pela ferramenta',
+        files: {
+          title: 'arquivos gerados pela ferramenta',
+          type: 'Tipo de suporte. Agora apenas suporte a imagem',
+          transfer_method: 'Método de transferência. O valor é remote_url ou local_file',
+          url: 'URL da imagem',
+          upload_file_id: 'ID de upload do arquivo',
+        },
+      },
+    },
+    questionClassifiers: {
+      model: 'modelo',
+      inputVars: 'Variáveis de entrada',
+      class: 'Classe',
+      classNamePlaceholder: 'Escreva o nome da classe',
+      advancedSetting: 'Configuração avançada',
+      topicName: 'Nome do tópico',
+      topicPlaceholder: 'Escreva o nome do tópico',
+      addClass: 'Adicionar classe',
+      instruction: 'Instrução',
+      instructionPlaceholder: 'Escreva sua instrução',
+    },
+  },
+  tracing: {
+    stopBy: 'Parado por {{user}}',
   },
 }
 

+ 27 - 13
web/i18n/uk-UA/app-debug.ts

@@ -260,19 +260,32 @@ const translation = {
     queryNoBeEmpty: 'Запит має бути встановлений у підказці', // Query must be set in the prompt
   },
   variableConig: {
-    'addModalTitle': 'Налаштування поля', // Field settings
-    'description': 'Налаштування для змінної {{varName}}', // Setting for variable {{varName}}
-    'fieldType': 'Тип поля', // Field type
-    'string': 'Короткий текст', // Short Text
-    'text-input': 'Короткий текст', // Short Text
-    'paragraph': 'Абзац', // Paragraph
-    'select': 'Вибрати', // Select
-    'notSet': 'Не налаштовано, спробуйте ввести {{input}} у префіксну підказку', // Not set, try typing {{input}} in the prefix prompt
-    'stringTitle': 'Опції текстового поля форми', // Form text box options
-    'maxLength': 'Максимальна довжина', // Max length
-    'options': 'Опції', // Options
-    'addOption': 'Додати опцію', // Add option
-    'apiBasedVar': 'Змінна на основі API', // API-based Variable
+    'addModalTitle': 'Додати Поле Введення',
+    'editModalTitle': 'Редагувати Поле Введення',
+    'description': 'Налаштування для змінної {{varName}}',
+    'fieldType': 'Тип поля',
+    'string': 'Короткий текст',
+    'text-input': 'Короткий текст',
+    'paragraph': 'Параграф',
+    'select': 'Вибрати',
+    'number': 'Число',
+    'notSet': 'Не встановлено, спробуйте ввести {{input}} у префіксній підказці',
+    'stringTitle': 'Параметри поля введення форми',
+    'maxLength': 'Максимальна довжина',
+    'options': 'Опції',
+    'addOption': 'Додати опцію',
+    'apiBasedVar': 'Змінна на основі API',
+    'varName': 'Назва змінної',
+    'labelName': 'Назва мітки',
+    'inputPlaceholder': 'Будь ласка, введіть',
+    'required': 'Обов\'язково',
+    'errorMsg': {
+      varNameRequired: 'Потрібно вказати назву змінної',
+      labelNameRequired: 'Потрібно вказати назву мітки',
+      varNameCanBeRepeat: 'Назва змінної не може повторюватися',
+      atLeastOneOption: 'Потрібно щонайменше одну опцію',
+      optionRepeat: 'Є повторні опції',
+    },
   },
   vision: {
     name: 'Зображення', // Vision
@@ -340,6 +353,7 @@ const translation = {
   result: 'Вихідний текст', // Output Text
   datasetConfig: {
     settingTitle: 'Налаштування пошуку', // Retrieval settings
+    knowledgeTip: 'Клацніть кнопку “+”, щоб додати знання',
     retrieveOneWay: {
       title: 'Односторонній пошук', // N-to-1 retrieval
       description: 'На основі намірів користувача та описів Знань Агент самостійно вибирає найкращі Знання для запитів. Найкраще підходить для застосунків з окремими, обмеженими Знаннями.',

+ 58 - 44
web/i18n/uk-UA/app-log.ts

@@ -1,69 +1,83 @@
 const translation = {
-  title: 'Журнали', // Logs
-  description: 'Журнали фіксують стан роботи застосунку, включаючи введення користувача та відповіді ШІ.', // The logs record...
-  dateTimeFormat: 'MM/DD/YYYY hh:mm A', // (Keep date format as is)
+  title: 'Журнали',
+  description: 'Журнали фіксують робочий статус додатка, включаючи введення користувачів та відповіді штучного інтелекту.',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
   table: {
     header: {
-      time: 'Час', // Time
-      endUser: 'Кінцевий користувач', // End User
-      input: 'Введення', // Input
-      output: 'Виведення', // Output
-      summary: 'Заголовок', // Title
-      messageCount: 'Кількість повідомлень', // Message Count
-      userRate: 'Оцінка користувача', // User Rate
-      adminRate: 'Оцінка адміністратора', // Op. Rate
+      time: 'Час',
+      endUser: 'Кінцевий Користувач',
+      input: 'Введення',
+      output: 'Виведення',
+      summary: 'Заголовок',
+      messageCount: 'Кількість Повідомлень',
+      userRate: 'Рейтинг Користувача',
+      adminRate: 'Рейтинг Оператора',
+      startTime: 'ЧАС ПОЧАТКУ',
+      status: 'СТАТУС',
+      runtime: 'ЧАС ВИКОНАННЯ',
+      tokens: 'ТОКЕНИ',
+      user: 'КІНЦЕВИЙ КОРИСТУВАЧ',
+      version: 'ВЕРСІЯ',
     },
     pagination: {
-      previous: 'Назад', // Prev
-      next: 'Далі', // Next
+      previous: 'Попередня',
+      next: 'Наступна',
     },
     empty: {
-      noChat: 'Ще немає розмови', // No conversation yet
-      noOutput: 'Відповіді немає', // No output
+      noChat: 'Ще немає розмов',
+      noOutput: 'Немає виводу',
       element: {
-        title: 'Хто-небудь тут є?', // Is anyone there?
-        content: 'Спостерігайте й коментуйте взаємодію між кінцевими користувачами та програмами штучного інтелекту, щоб постійно покращувати точність ШІ. Ви можете спробувати <shareLink>поділитися</shareLink> або <testLink>тестувати</testLink> веб-програму самостійно, а потім повернутися на цю сторінку.',
+        title: 'Хтось тут?',
+        content: 'Спостерігайте та анотуйте взаємодії між кінцевими користувачами та додатками штучного інтелекту тут, щоб постійно покращувати точність штучного інтелекту. Ви можете спробувати <shareLink>поділитися</shareLink> або <testLink>протестувати</testLink> веб-додаток самостійно, а потім повернутися на цю сторінку.',
       },
     },
   },
   detail: {
-    time: 'Час', // Time
-    conversationId: 'Ідентифікатор розмови', // Conversation ID
-    promptTemplate: 'Шаблон підказки', // Prompt Template
-    promptTemplateBeforeChat: 'Шаблон підказки перед чатом · як системне повідомлення', // Prompt Template Before Chat...
-    annotationTip: 'Покращення, позначені {{user}}', // Improvements Marked by {{user}}
+    time: 'Час',
+    conversationId: 'ID Розмови',
+    promptTemplate: 'Шаблон Запитання',
+    promptTemplateBeforeChat: 'Шаблон Запитання Перед Чатом · Як Системне Повідомлення',
+    annotationTip: 'Покращення Позначені Користувачем {{user}}',
     timeConsuming: '',
-    second: 'с', // s (seconds)
-    tokenCost: 'Витрачені токени', // Token spent
-    loading: 'Завантаження', // loading
+    second: 'с',
+    tokenCost: 'Витрати Токенів',
+    loading: 'завантаження',
     operation: {
-      like: 'Вподобати', // like
-      dislike: 'Не вподобати', // dislike
-      addAnnotation: 'Додати покращення', // Add Improvement
-      editAnnotation: 'Редагувати покращення', // Edit Improvement
-      annotationPlaceholder: 'Введіть очікувану відповідь, яку ви хочете, щоб відповів ШІ. ',
+      like: 'подобається',
+      dislike: 'не подобається',
+      addAnnotation: 'Додати Покращення',
+      editAnnotation: 'Редагувати Покращення',
+      annotationPlaceholder: 'Введіть очікувану відповідь, яку ви хочете, щоб штучний інтелект повертав, це може бути використано для налаштування моделі та постійного покращення якості генерації тексту в майбутньому.',
     },
-    variables: 'Змінні', // Variables
-    uploadImages: 'Завантажені зображення', // Uploaded Images
+    variables: 'Змінні',
+    uploadImages: 'Завантажені Зображення',
   },
   filter: {
     period: {
-      today: 'Сьогодні', // Today
-      last7days: 'Останні 7 днів', // Last 7 Days
-      last4weeks: 'Останні 4 тижні', // Last 4 weeks
-      last3months: 'Останні 3 місяці', // Last 3 months
-      last12months: 'Останні 12 місяців', // Last 12 months
-      monthToDate: 'Місяць до дати', // Month to date
-      quarterToDate: 'Квартал до дати', // Quarter to date
-      yearToDate: 'Рік до дати', // Year to date
-      allTime: 'Увесь час', // All time
+      today: 'Сьогодні',
+      last7days: 'Останні 7 днів',
+      last4weeks: 'Останні 4 тижні',
+      last3months: 'Останні 3 місяці',
+      last12months: 'Останні 12 місяців',
+      monthToDate: 'Місяць до сьогодні',
+      quarterToDate: 'Квартал до сьогодні',
+      yearToDate: 'Рік до сьогодні',
+      allTime: 'За весь час',
     },
     annotation: {
-      all: 'Усі', // All
-      annotated: 'Анотовані покращення ({{count}} елементів)', // Annotated Improvements...
-      not_annotated: 'Не анотований', // Not Annotated
+      all: 'Всі',
+      annotated: 'Покращення з Анотацією ({{count}} елементів)',
+      not_annotated: 'Без Анотації',
     },
   },
+  workflowTitle: 'Журнали Робочого Процесу',
+  workflowSubtitle: 'Журнал зареєстрував роботу Автоматизації.',
+  runDetail: {
+    title: 'Журнал Розмови',
+    workflowTitle: 'Деталі Журналу',
+  },
+  promptLog: 'Журнал Запитань',
+  viewLog: 'Переглянути Журнал',
 }
 
 export default translation

+ 81 - 77
web/i18n/uk-UA/app-overview.ts

@@ -1,137 +1,141 @@
 const translation = {
   welcome: {
-    firstStepTip: 'Щоб розпочати,',
+    firstStepTip: 'Для початку,',
     enterKeyTip: 'введіть свій ключ API OpenAI нижче',
-    getKeyTip: 'Отримайте свій ключ API з панелі керування OpenAI',
-    placeholder: 'Ваш ключ API OpenAI (наприклад, sk-xxxx)',
+    getKeyTip: 'Отримайте свій ключ API з панелі OpenAI',
+    placeholder: 'Ваш ключ API OpenAI (напр. sk-xxxx)',
   },
   apiKeyInfo: {
     cloud: {
       trial: {
-        title: 'Ви використовуєте пробну квоту {{providerName}}.', // You are using...
-        description: 'Пробна квота надається для використання під час тестування. Перш ніж вичерпається пробна квота, будь ласка, налаштуйте свого постачальника моделі або придбайте додаткову квоту.',
+        title: 'Ви використовуєте квоту пробного періоду {{providerName}}.',
+        description: 'Квота пробного періоду надається для вашого тестувального використання. Перш ніж будуть вичерпані виклики квоти пробного періоду, налаштуйте свого власного постачальника моделей або придбайте додаткову квоту.',
       },
       exhausted: {
-        title: 'Ваша пробна квота використана, будь ласка, налаштуйте свій APIKey.',
-        description: 'Ваша пробна квота вичерпана. Будь ласка, налаштуйте свого постачальника моделі або придбайте додаткову квоту.',
+        title: 'Вашу квоту пробного періоду вичерпано, налаштуйте свій ключ API.',
+        description: 'Вашу квоту пробного періоду вичерпано. Налаштуйте свого власного постачальника моделей або придбайте додаткову квоту.',
       },
     },
     selfHost: {
       title: {
-        row1: 'Щоб розпочати,',
-        row2: 'спочатку налаштуйте свого постачальника моделі.',
+        row1: 'Для початку,',
+        row2: 'спочатку налаштуйте постачальника моделей.',
       },
     },
-    callTimes: 'Кількість викликів', // Call times
-    usedToken: 'Використано токенів', // Used token
-    setAPIBtn: 'Перейти до налаштування постачальника моделі', // Go to setup model provider
-    tryCloud: 'Або спробуйте хмарну версію Dify з безкоштовною квотою', // Or try the cloud version ...
+    callTimes: 'Кількість викликів',
+    usedToken: 'Використані токени',
+    setAPIBtn: 'Перейти до налаштування постачальника моделей',
+    tryCloud: 'Або спробуйте хмарну версію Dify з безкоштовним цитатою',
   },
   overview: {
-    title: 'Огляд', // Overview
+    title: 'Огляд',
     appInfo: {
-      explanation: 'Готовий до використання AI WebApp',
-      accessibleAddress: 'Публічна URL-адреса', // Public URL
-      preview: 'Попередній перегляд', // Preview
-      regenerate: 'Регенерувати', // Regenerate
-      preUseReminder: 'Будь ласка, увімкніть WebApp, перш ніж продовжувати.', // Please enable WebApp...
+      explanation: 'Готовий до використання веб-додаток зі штучним інтелектом',
+      accessibleAddress: 'Публічний URL',
+      preview: 'Попередній перегляд',
+      regenerate: 'Відновити',
+      preUseReminder: 'Будь ласка, активуйте веб-додаток перед продовженням.',
       settings: {
-        entry: 'Налаштування', // Settings
-        title: 'Налаштування веб-програми', // WebApp Settings
-        webName: 'Ім’я веб-програми', // WebApp Name
-        webDesc: 'Опис веб-програми', // WebApp Description
-        webDescTip: 'Цей текст відображатиметься на стороні клієнта, надаючи базові вказівки щодо використання програми',
-        webDescPlaceholder: 'Введіть опис WebApp',
-        language: 'Мова', // Language
+        entry: 'Налаштування',
+        title: 'Налаштування веб-додатку',
+        webName: 'Назва веб-додатку',
+        webDesc: 'Опис веб-додатку',
+        webDescTip: 'Цей текст буде відображений на клієнтському боці, надаючи базові вказівки щодо використання додатка',
+        webDescPlaceholder: 'Введіть опис веб-додатку',
+        language: 'Мова',
         more: {
-          entry: 'Показати більше налаштувань', // Show more settings
-          copyright: 'Авторські права', // Copyright
-          copyRightPlaceholder: 'Введіть імя автора або організації',
-          privacyPolicy: 'Політика конфіденційності', // Privacy Policy
+          entry: 'Показати додаткові налаштування',
+          copyright: 'Авторське право',
+          copyRightPlaceholder: 'Введіть ім\'я автора або організації',
+          privacyPolicy: 'Політика конфіденційності',
           privacyPolicyPlaceholder: 'Введіть посилання на політику конфіденційності',
-          privacyPolicyTip: 'Допомагає відвідувачам зрозуміти, які дані збирає програма. Дивіться <privacyPolicyLink>Політику конфіденційності</privacyPolicyLink> Dify.',
+          privacyPolicyTip: 'Допомагає відвідувачам зрозуміти дані, зібрані додатком, див. <privacyPolicyLink>Політику конфіденційності</privacyPolicyLink> Dify.',
         },
       },
       embedded: {
-        entry: 'Вбудований', // Embedded
-        title: 'Вбудувати на веб-сайт', // Embed on website
-        explanation: 'Виберіть спосіб вбудувати чат-програму на свій веб-сайт',
-        iframe: 'Щоб додати чат-програму будь-де на своєму веб-сайті, додайте цей iframe у свій код html.',
-        scripts: 'Щоб додати програму чату у правий нижній кут свого веб-сайту, додайте цей код до свого html.',
-        chromePlugin: 'Встановити розширення Dify Chatbot для Chrome',
-        copied: 'Скопійовано', // Copied
-        copy: 'Копіювати', // Copy
+        entry: 'Вбудоване',
+        title: 'Вбудувати на веб-сайт',
+        explanation: 'Виберіть спосіб вбудування чат-додатка на ваш веб-сайт',
+        iframe: 'Для додавання чат-додатка в будь-яке місце на вашому веб-сайті, додайте цей iframe до вашого HTML-коду.',
+        scripts: 'Для додавання чат-додатка в правий нижній кут вашого веб-сайту додайте цей код до вашого HTML.',
+        chromePlugin: 'Встановити розширення Chrome Dify Chatbot',
+        copied: 'Скопійовано',
+        copy: 'Скопіювати',
       },
       qrcode: {
-        title: 'QR-код для спільного доступу',
-        scan: 'Відсканувати програму спільного доступу',
+        title: 'QR-код для обміну',
+        scan: 'Сканувати та обмінюватися додатком',
         download: 'Завантажити QR-код',
       },
       customize: {
-        way: 'спосіб', // way
-        entry: 'Налаштувати', // Customize
-        title: 'Налаштувати веб-додаток AI',
-        explanation: 'Ви можете налаштувати зовнішній вигляд WebApp відповідно до вашого сценарію та стилю.',
+        way: 'спосіб',
+        entry: 'Налаштувати',
+        title: 'Налаштування веб-додатку зі штучним інтелектом',
+        explanation: 'Ви можете налаштувати інтерфейс користувача веб-додатка, щоб він відповідав вашим потребам у сценаріях та стилі.',
         way1: {
-          name: 'Розгалужити код клієнта, змінити його та розгорнути у Vercel (рекомендовано)',
-          step1: 'Розгалужити код клієнта та модифікувати його',
-          step1Tip: 'Натисніть тут, щоб розгалужити вихідний код у свій обліковий запис GitHub і змінити код',
-          step1Operation: 'Dify-WebClient',
-          step2: 'Розгорнути у Vercel',
-          step2Tip: 'Натисніть тут, щоб імпортувати репозиторій до Vercel та виконати розгортання',
-          step2Operation: 'Імпортувати репозиторій',
-          step3: 'Налаштувати змінні середовища',
-          step3Tip: 'Додайте такі змінні середовища у Vercel',
+          name: 'Склонуйте клієнтський код, відредагуйте його та розгорніть на Vercel (рекомендовано)',
+          step1: 'Склонуйте клієнтський код та відредагуйте його',
+          step1Tip: 'Натисніть тут, щоб склонувати вихідний код у ваш обліковий запис GitHub та відредагувати код',
+          step1Operation: 'Клієнт-Web-Dify',
+          step2: 'Розгорніть на Vercel',
+          step2Tip: 'Натисніть тут, щоб імпортувати репозиторій у Vercel та розгорнути',
+          step2Operation: 'Імпорт репозиторію',
+          step3: 'Налаштуйте змінні середовища',
+          step3Tip: 'Додайте наступні змінні середовища у Vercel',
         },
         way2: {
-          name: 'Напишіть код на клієнтській стороні, щоб викликати API та розгорнути його на сервері',
+          name: 'Напишіть клієнтський код для виклику API та розгорніть його на сервері',
           operation: 'Документація',
         },
       },
     },
     apiInfo: {
-      title: 'API бекенд-сервісу', // Backend service API
-      explanation: 'Легко інтегрується в вашу програму',
-      accessibleAddress: 'Кінцевий ресурс сервісу API', // Service API Endpoint
-      doc: 'API довідка', // API Reference
+      title: 'API сервісу Backend',
+      explanation: 'Легко інтегрований у вашу програму',
+      accessibleAddress: 'Кінцева точка API сервісу',
+      doc: 'Довідка з API',
     },
     status: {
-      running: 'Працює', // In service
-      disable: 'Вимкнути', // Disable
+      running: 'У роботі',
+      disable: 'Вимкнути',
     },
   },
   analysis: {
-    title: 'Аналіз', // Analysis
-    ms: 'мс', // ms
-    tokenPS: 'Токен/с', // Token/s
+    title: 'Аналіз',
+    ms: 'мс',
+    tokenPS: 'Токени/с',
     totalMessages: {
-      title: 'Загалом повідомлень', // Total Messages
-      explanation: 'Щоденна кількість взаємодій зі ШІ; виключено проектування запитань або налагодження.',
+      title: 'Загальна кількість повідомлень',
+      explanation: 'Щоденна кількість взаємодій з штучним інтелектом; інженерія/налагодження запитів виключено.',
     },
     activeUsers: {
-      title: 'Активні користувачі', // Active Users
-      explanation: 'Унікальні користувачі, які беруть участь у запитах/відповідях зі ШІ; виключено інженерію запитань або налагодження.',
+      title: 'Активні користувачі',
+      explanation: 'Унікальні користувачі, які взаємодіють з AI; інженерія/налагодження запитів виключено.',
     },
     tokenUsage: {
-      title: 'Використання токенів', // Token Usage
-      explanation: 'Відображає щоденне використання токенів мовної моделі для програми, корисно для контролю витрат.',
-      consumed: 'Спожито', // Consumed
+      title: 'Використання токенів',
+      explanation: 'Відображає щоденне використання токенів мовної моделі для додатка, корисно для контролю витрат.',
+      consumed: 'Спожито',
     },
     avgSessionInteractions: {
-      title: 'Середня кількість взаємодій під час сеансу', // Avg. Session Interactions
-      explanation: 'Кількість безперервних комунікацій між користувачем і ШІ; для програм, що базуються на розмовах.',
+      title: 'Середня кількість взаємодій за сесію',
+      explanation: 'Кількість продовжуючихся спілкувань користувача з AI; для програм, що базуються на розмові.',
+    },
+    avgUserInteractions: {
+      title: 'Середня кількість взаємодій на користувача',
+      explanation: 'Відображає щоденну частоту використання користувачами. Ця метрика відображає лояльність користувачів.',
     },
     userSatisfactionRate: {
-      title: 'Рівень задоволеності користувачів',
-      explanation: 'Кількість лайків на 1000 повідомлень. Це означає частку відповідей, якими користувачі дуже задоволені.',
+      title: 'Показник задоволення користувача',
+      explanation: 'Кількість лайків на 1000 повідомлень. Це вказує на те, наскільки задоволені користувачі відповідями.',
     },
     avgResponseTime: {
       title: 'Середній час відповіді',
-      explanation: 'Час (мс) для обробки/відповіді ШІ; для текстових програм.',
+      explanation: 'Час (мс) для обробки/відповіді AI; для текстових програм.',
     },
     tps: {
       title: 'Швидкість виведення токенів',
-      explanation: 'Виміряйте продуктивність LLM. Підрахуйте швидкість виведення токенів LLM від початку запиту до завершення виведення.',
+      explanation: 'Вимірює продуктивність LLM. Підраховує швидкість виведення токенів LLM від початку запиту до завершення виведення.',
     },
   },
 }

+ 54 - 26
web/i18n/uk-UA/app.ts

@@ -1,62 +1,90 @@
-const translation = { // Add the Ukrainian translation object
+const translation = {
   createApp: 'Створити додаток',
   types: {
-    all: 'Все',
+    all: 'Усе',
     chatbot: 'Чатбот',
     agent: 'Агент',
-    workflow: 'Робочий Процес',
-    completion: 'Автодоповнення',
+    workflow: 'Робочий процес',
+    completion: 'Завершення',
   },
   duplicate: 'Дублювати',
   duplicateTitle: 'Дублювати додаток',
   export: 'Експортувати DSL',
-  createFromConfigFile: 'Створити через файл DSL',
+  exportFailed: 'Не вдалося експортувати DSL.',
+  importDSL: 'Імпортувати файл DSL',
+  createFromConfigFile: 'Створити з файлу DSL',
   deleteAppConfirmTitle: 'Видалити цей додаток?',
   deleteAppConfirmContent:
-      'Видалення додатка є незворотнім. Користувачі більше не матимуть доступ до вашого додатка, всі конфігурації підказок та журнали будуть видалені назавжди.',
+    'Видалення додатка незворотнє. Користувачі більше не зможуть отримати доступ до вашого додатка, і всі налаштування запитів та журнали будуть остаточно видалені.',
   appDeleted: 'Додаток видалено',
   appDeleteFailed: 'Не вдалося видалити додаток',
   join: 'Приєднуйтесь до спільноти',
   communityIntro:
-      'Обговорюйте різні питання з членами команди, учасниками та розробниками на різних каналах.',
-  roadmap: 'Ознайомтеся з нашою дорожньою картою',
+    'Обговорюйте з членами команди, співавторами та розробниками на різних каналах.',
+  roadmap: 'Переглянути наш план розвитку',
   newApp: {
-    startFromBlank: 'Розпочати з порожнього додатку',
-    startFromTemplate: 'Розпочати з шаблону',
-    captionAppType: 'Який тип додатка Ви бажаєте створити?',
-    chatbotDescription: 'Побудувати чат-асистента, використовуючи Модель Великої Мови',
-    agentDescription: 'Побудувати розумного Агента, який може автономно обирати інструменти для виконання завдань',
-    workflowDescription: 'Description text here',
-    captionName: 'Значок та назва додатка',
-    appNamePlaceholder: 'Назвіть свій додаток',
+    startFromBlank: 'Створити з нуля',
+    startFromTemplate: 'Створити з шаблону',
+    captionAppType: 'Який тип додатка ви хочете створити?',
+    chatbotDescription: 'Побудуйте додаток на основі чату. Цей додаток використовує формат запитань та відповідей, що дозволяє проводити кілька раундів безперервного спілкування.',
+    completionDescription: 'Побудуйте додаток, який генерує текст високої якості на основі підказок, таких як генерація статей, резюме, перекладів тощо.',
+    completionWarning: 'Цей тип додатка більше не буде підтримуватися.',
+    agentDescription: 'Побудуйте інтелектуального агента, який може автономно обирати інструменти для виконання завдань',
+    workflowDescription: 'Побудуйте додаток, який генерує текст високої якості на основі робочого процесу з високим рівнем настроювання. Він підходить для досвідчених користувачів.',
+    workflowWarning: 'Наразі в бета-версії',
+    chatbotType: 'Метод оркестрації чатботу',
+    basic: 'Базовий',
+    basicTip: 'Для початківців, можна перейти до Chatflow пізніше',
+    basicFor: 'ДЛЯ ПОЧАТКІВЦІВ',
+    basicDescription: 'Базовий оркестр дозволяє оркеструвати додаток чатбота за допомогою простих налаштувань, без можливості змінювати вбудовані підказки. Він підходить для початківців.',
+    advanced: 'Chatflow',
+    advancedFor: 'Для досвідчених користувачів',
+    advancedDescription: 'Оркестрування робочого процесу оркеструє чатботи у формі робочих процесів, пропонуючи високий рівень настроювання, включаючи можливість редагувати вбудовані підказки. Він підходить для досвідчених користувачів.',
+    captionName: 'Іконка та назва додатка',
+    appNamePlaceholder: 'Дайте назву вашому додатку',
     captionDescription: 'Опис',
-    appDescriptionPlaceholder: 'Введіть опис додатку',
-    useTemplate: 'Використати цей шаблон',
-    previewDemo: 'Попередній перегляд демо',
+    appDescriptionPlaceholder: 'Введіть опис додатка',
+    useTemplate: 'Використовуйте цей шаблон',
+    previewDemo: 'Попередній перегляд демонстрації',
     chatApp: 'Асистент',
     chatAppIntro:
-        'Я хочу створити чат-додаток. Цей додаток використовує формат запитань та відповідей, що дозволяє проводити кілька раундів безперервної розмови.',
-    agentAssistant: 'Новий агент-асистент',
+      'Я хочу побудувати додаток на основі чату. Цей додаток використовує формат запитань та відповідей, що дозволяє проводити кілька раундів безперервного спілкування.',
+    agentAssistant: 'Новий помічник агента',
     completeApp: 'Генератор тексту',
     completeAppIntro:
-        'Я хочу створити додаток, який генерує високоякісний текст на основі підказок, наприклад, створення статей, резюме, перекладів тощо.',
+      'Я хочу створити додаток, який генерує текст високої якості на основі підказок, таких як генерація статей, резюме, перекладів тощо.',
     showTemplates: 'Я хочу вибрати з шаблону',
     hideTemplates: 'Повернутися до вибору режиму',
     Create: 'Створити',
     Cancel: 'Скасувати',
-    nameNotEmpty: 'Назва не може бути пустою',
+    nameNotEmpty: 'Назва не може бути порожньою',
     appTemplateNotSelected: 'Будь ласка, виберіть шаблон',
     appTypeRequired: 'Будь ласка, виберіть тип додатка',
     appCreated: 'Додаток створено',
     appCreateFailed: 'Не вдалося створити додаток',
   },
-  editApp: {
-    startToEdit: 'Редагувати додаток',
-  },
+  editApp: 'Редагувати інформацію',
+  editAppTitle: 'Редагувати інформацію про додаток',
+  editDone: 'Інформація про додаток оновлена',
+  editFailed: 'Не вдалося оновити інформацію про додаток',
   emoji: {
     ok: 'OK',
     cancel: 'Скасувати',
   },
+  switch: 'Перейти до оркестрації робочого процесу',
+  switchTipStart: 'Для вас буде створена нова копія додатка, і нова копія перейде до оркестрації робочого процесу. Нова копія не дозволить ',
+  switchTip: 'повернутися',
+  switchTipEnd: ' до базової оркестрації.',
+  switchLabel: 'Копія додатка, яка буде створена',
+  removeOriginal: 'Видалити початковий додаток',
+  switchStart: 'Почати перемикання',
+  typeSelector: {
+    all: 'Усі типи',
+    chatbot: 'Чатбот',
+    agent: 'Агент',
+    workflow: 'Робочий процес',
+    completion: 'Завершення',
+  },
 }
 
 export default translation

+ 4 - 0
web/i18n/uk-UA/common.ts

@@ -478,6 +478,10 @@ const translation = {
         title: 'Змінні та зовнішні інструменти',
         desc: 'Вставити змінні та зовнішні інструменти',
       },
+      outputToolDisabledItem: {
+        title: 'Змінні',
+        desc: 'Вставити змінні',
+      },
       modal: {
         add: 'Нова змінна',
         addTool: 'Новий інструмент',

+ 1 - 1
web/i18n/uk-UA/explore.ts

@@ -18,7 +18,7 @@ const translation = {
   apps: {
     title: 'Вивчайте програми від Dify',
     description: 'Використовуйте ці шаблони миттєво або налаштуйте власні програми на основі шаблонів.',
-    allCategories: 'Усі категорії',
+    allCategories: 'Рекомендовані',
   },
   appCard: {
     addToWorkspace: 'Додати до робочого простору',

+ 17 - 5
web/i18n/uk-UA/run-log.ts

@@ -1,10 +1,22 @@
 const translation = {
-  result: 'RESULT',
-  tracing: 'TRACING',
+  input: 'ВВЕДЕННЯ',
+  result: 'РЕЗУЛЬТАТ',
+  detail: 'ДЕТАЛІ',
+  tracing: 'ВІДСЛІДКУВАННЯ',
   resultPanel: {
-    status: 'STATUS',
-    time: 'ELAPSED TIME',
-    tokens: 'TOTAL TOKENS',
+    status: 'СТАТУС',
+    time: 'ЧАС ВИКОНАННЯ',
+    tokens: 'ЗАГАЛЬНА КІЛЬКІСТЬ ТОКЕНІВ',
+  },
+  meta: {
+    title: 'МЕТАДАНІ',
+    status: 'Статус',
+    version: 'Версія',
+    executor: 'Виконавець',
+    startTime: 'Час початку',
+    time: 'Час виконання',
+    tokens: 'Загальна кількість токенів',
+    steps: 'Кроки виконання',
   },
 }
 

+ 292 - 50
web/i18n/uk-UA/workflow.ts

@@ -1,90 +1,332 @@
 const translation = {
+  common: {
+    editing: 'Редагування',
+    autoSaved: 'Автоматично збережено',
+    unpublished: 'Неопубліковано',
+    published: 'Опубліковано',
+    publish: 'Опублікувати',
+    update: 'Оновити',
+    run: 'Запустити',
+    running: 'Виконується',
+    inRunMode: 'У режимі виконання',
+    inPreview: 'У попередньому перегляді',
+    inPreviewMode: 'У режимі попереднього перегляду',
+    preview: 'Попередній перегляд',
+    viewRunHistory: 'Переглянути історію запусків',
+    runHistory: 'Історія запусків',
+    goBackToEdit: 'Повернутися до редагування',
+    conversationLog: 'Журнал розмов',
+    features: 'Функції',
+    debugAndPreview: 'Налагодження і попередній перегляд',
+    restart: 'Перезапустити',
+    currentDraft: 'Поточний чернетка',
+    currentDraftUnpublished: 'Поточний чернетка не опубліковано',
+    latestPublished: 'Остання опублікована',
+    publishedAt: 'Опубліковано',
+    restore: 'Відновити',
+    runApp: 'Запустити додаток',
+    batchRunApp: 'Пакетний запуск додатку',
+    accessAPIReference: 'Доступ до посилання на API',
+    embedIntoSite: 'Вбудувати в сайт',
+    addTitle: 'Додати назву...',
+    addDescription: 'Додати опис...',
+    noVar: 'Немає змінної',
+    searchVar: 'Пошук змінної',
+    variableNamePlaceholder: 'Назва змінної',
+    setVarValuePlaceholder: 'Встановити змінну',
+    needConnecttip: 'Цей крок не підключено до чогось',
+    maxTreeDepth: 'Максимальний ліміт {{depth}} вузлів на гілку',
+    needEndNode: 'Необхідно додати блок "Кінець"',
+    needAnswerNode: 'Необхідно додати блок "Відповідь"',
+    workflowProcess: 'Процес робочого процесу',
+    notRunning: 'Ще не запущено',
+    previewPlaceholder: 'Введіть вміст у полі нижче, щоб розпочати налагодження чат-бота',
+    effectVarConfirm: {
+      title: 'Видалити змінну',
+      content: 'Цю змінну використовується в інших вузлах. Ви все ще хочете її видалити?',
+    },
+    insertVarTip: 'Натисніть клавішу "/" для швидкого вставлення',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} є обов\'язковим',
+    authRequired: 'Потрібна авторизація',
+    invalidJson: '{{field}} недійсний JSON',
+    fields: {
+      variable: 'Назва змінної',
+      variableValue: 'Значення змінної',
+      code: 'Код',
+      model: 'Модель',
+      rerankModel: 'Модель пересортування',
+    },
+    invalidVariable: 'Недійсна змінна',
+  },
+  singleRun: {
+    testRun: 'Тестовий запуск ',
+    startRun: 'Почати запуск',
+    running: 'Виконується',
+  },
+  tabs: {
+    'searchBlock': 'Пошук блоку',
+    'blocks': 'Блоки',
+    'builtInTool': 'Вбудований інструмент',
+    'customTool': 'Спеціальний інструмент',
+    'question-understand': 'Розуміння питань',
+    'logic': 'Логіка',
+    'transform': 'Трансформація',
+    'utilities': 'Утиліти',
+    'noResult': 'Співпадінь не знайдено',
+  },
+  blocks: {
+    'start': 'Початок',
+    'end': 'Кінець',
+    'answer': 'Відповідь',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Пошук знань',
+    'question-classifier': 'Класифікатор питань',
+    'if-else': 'Якщо / Інакше',
+    'code': 'Код',
+    'template-transform': 'Шаблон',
+    'http-request': 'HTTP-запит',
+    'variable-assigner': 'Призначення змінних',
+  },
+  blocksAbout: {
+    'start': 'Визначте початкові параметри для запуску робочого процесу',
+    'end': 'Визначте кінець і тип результату робочого процесу',
+    'answer': 'Визначте вміст відповіді чат-розмови',
+    'llm': 'Виклик великих мовних моделей для відповіді на питання або обробки природної мови',
+    'knowledge-retrieval': 'Дозволяє вам запитувати текстовий вміст, що стосується питань користувача, знань',
+    'question-classifier': 'Визначте умови класифікації користувачів, LLM може визначити, як прогресує розмова на основі опису класифікації',
+    'if-else': 'Дозволяє вам розгалужувати робочий процес на дві гілки на основі умов if / else',
+    'code': 'Виконати фрагмент коду Python або NodeJS для реалізації власної логіки',
+    'template-transform': 'Перетворити дані в рядок, використовуючи синтаксис шаблону Jinja',
+    'http-request': 'Дозволяє відправляти серверні запити через протокол HTTP',
+    'variable-assigner': 'Призначте змінні в різних гілках тієї самої змінної, щоб забезпечити єдину конфігурацію після-вузлів',
+  },
+  operator: {
+    zoomIn: 'Збільшити',
+    zoomOut: 'Зменшити',
+    zoomTo50: 'Масштабувати до 50%',
+    zoomTo100: 'Масштабувати до 100%',
+    zoomToFit: 'Підігнати по ширині',
+  },
+  panel: {
+    userInputField: 'Поле введення користувача',
+    changeBlock: 'Змінити блок',
+    helpLink: 'Посилання на довідку',
+    about: 'Про',
+    createdBy: 'Створено ',
+    nextStep: 'Наступний крок',
+    addNextStep: 'Додати наступний блок у цей робочий процес',
+    selectNextStep: 'Виберіть наступний блок',
+    runThisStep: 'Запустити цей крок',
+    checklist: 'Перелік',
+    checklistTip: 'Переконайтеся, що всі питання вирішено перед публікацією',
+    checklistResolved: 'Всі питання вирішено',
+    organizeBlocks: 'Організувати блоки',
+    change: 'Змінити',
+  },
   nodes: {
     common: {
-      outputVars: 'Output Variables',
-      insertVarTip: 'Insert Variable',
+      outputVars: 'Вихідні змінні',
+      insertVarTip: 'Вставити змінну',
+      memory: {
+        memory: 'Пам\'ять',
+        memoryTip: 'Налаштування чат-пам\'яті',
+        windowSize: 'Розмір вікна',
+        conversationRoleName: 'Назва ролі розмови',
+        user: 'Префікс користувача',
+        assistant: 'Префікс помічника',
+      },
+      memories: {
+        title: 'Пам\'яті',
+        tip: 'Чат-пам\'ять',
+        builtIn: 'Вбудований',
+      },
     },
     start: {
-      required: 'required',
-      inputField: 'Input Field',
-      builtInVar: 'Built-in Variables',
+      required: 'обов\'язково',
+      inputField: 'Поле введення',
+      builtInVar: 'Вбудовані змінні',
       outputVars: {
-        query: 'User input',
+        query: 'Вхід користувача',
         memories: {
-          des: 'Conversation history',
-          type: 'message type',
-          content: 'message content',
+          des: 'Історія розмов',
+          type: 'тип повідомлення',
+          content: 'вміст повідомлення',
         },
-        files: 'File list',
+        files: 'Список файлів',
       },
+      noVarTip: 'Встановіть вхідні дані, які можна використовувати в робочому процесі',
     },
     end: {
-      outputs: 'Outputs',
+      outputs: 'Вихідні дані',
+      output: {
+        type: 'тип виходу',
+        variable: 'вихідна змінна',
+      },
       type: {
-        'none': 'None',
-        'plain-text': 'Plain Text',
-        'structured': 'Structured',
+        'none': 'Нічого',
+        'plain-text': 'Звичайний текст',
+        'structured': 'Структурований',
       },
     },
     answer: {
-      answer: 'Answer',
-      inputVars: 'Input Variables',
+      answer: 'Відповідь',
+      outputVars: 'Вихідні змінні',
     },
     llm: {
-      model: 'model',
-      variables: 'variables',
-      context: 'context',
-      prompt: 'prompt',
-      vision: 'vision',
+      model: 'модель',
+      variables: 'змінні',
+      context: 'контекст',
+      contextTooltip: 'Ви можете імпортувати знання як контекст',
+      notSetContextInPromptTip: 'Щоб увімкнути функцію контексту, будь ласка, заповніть змінну контексту в PROMPT.',
+      prompt: 'підказка',
+      roleDescription: {
+        system: 'Надати високорівневі інструкції для розмови',
+        user: 'Надати інструкції, запити або будь-який текстовий ввід для моделі',
+        assistant: 'Відповіді моделі на основі повідомлень користувача',
+      },
+      addMessage: 'Додати повідомлення',
+      vision: 'візія',
+      files: 'Файли',
+      resolution: {
+        name: 'Роздільна здатність',
+        high: 'Висока',
+        low: 'Низька',
+      },
       outputVars: {
-        output: 'Generate content',
-        usage: 'Model Usage Information',
+        output: 'Створення вмісту',
+        usage: 'Інформація про використання моделі',
+      },
+      singleRun: {
+        variable: 'Змінна',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Запит змінної',
+      knowledge: 'Знання',
+      outputVars: {
+        output: 'Вилучені сегментовані дані',
+        content: 'Сегментований вміст',
+        title: 'Сегментований заголовок',
+        icon: 'Сегментована іконка',
+        url: 'Сегментований URL',
+        metadata: 'Інша метадані',
       },
     },
     http: {
-      inputVars: 'Input Variables',
+      inputVars: 'Вхідні змінні',
       api: 'API',
-      headers: 'Headers',
-      params: 'Params',
-      body: 'Body',
+      apiPlaceholder: 'Введіть URL, наберіть «/» для вставки змінної',
+      notStartWithHttp: 'API повинно починатися з http:// або https://',
+      key: 'Ключ',
+      value: 'Значення',
+      bulkEdit: 'Масове редагування',
+      keyValueEdit: 'Редагування Ключ-Значення',
+      headers: 'Заголовки',
+      params: 'Параметри',
+      body: 'Тіло',
       outputVars: {
-        body: 'Response Content',
-        statusCode: 'Response Status Code',
-        headers: 'Response Header List JSON',
+        body: 'Вміст відповіді',
+        statusCode: 'Код статусу відповіді',
+        headers: 'Список заголовків відповіді JSON',
+        files: 'Список файлів',
       },
+      authorization: {
+        'authorization': 'Авторизація',
+        'authorizationType': 'Тип авторизації',
+        'no-auth': 'Немає',
+        'api-key': 'API-Key',
+        'auth-type': 'Тип авторизації',
+        'basic': 'Базова',
+        'bearer': 'Bearer',
+        'custom': 'Користувацька',
+        'api-key-title': 'Ключ API',
+        'header': 'Заголовок',
+      },
+      insertVarPlaceholder: 'наберіть \'/\' для вставки змінної',
     },
     code: {
-      inputVars: 'Input Variables',
-      outputVars: 'Output Variables',
+      inputVars: 'Вхідні змінні',
+      outputVars: 'Вихідні змінні',
     },
     templateTransform: {
-      inputVars: 'Input Variables',
-      code: 'Code',
-      codeSupportTip: 'Only supports Jinja2',
+      inputVars: 'Вхідні змінні',
+      code: 'Код',
+      codeSupportTip: 'Підтримується лише Jinja2',
       outputVars: {
-        output: 'Transformed content',
+        output: 'Перетворений вміст',
       },
     },
     ifElse: {
-      conditions: 'Conditions',
-      and: 'and',
-      or: 'or',
+      if: 'Якщо',
+      else: 'Інакше',
+      elseDescription: 'Використовується для визначення логіки, яка має виконуватися, коли умова if не виконується.',
+      and: 'і',
+      or: 'або',
+      operator: 'Оператор',
+      notSetVariable: 'Спочатку встановіть змінну',
       comparisonOperator: {
-        'contains': 'contains',
-        'not contains': 'not contains',
-        'start with': 'start with',
-        'end with': 'end with',
-        'is': 'is',
-        'is not': 'is not',
-        'empty': 'empty',
-        'not empty': 'not empty',
-        'null': 'is null',
-        'not null': 'is not null',
+        'contains': 'містить',
+        'not contains': 'не містить',
+        'start with': 'починається з',
+        'end with': 'закінчується на',
+        'is': 'є',
+        'is not': 'не є',
+        'empty': 'порожній',
+        'not empty': 'не порожній',
+        'null': 'нуль',
+        'not null': 'не нуль',
       },
+      enterValue: 'Введіть значення',
+      addCondition: 'Додати умову',
+      conditionNotSetup: 'Умова НЕ налаштована',
     },
     variableAssigner: {
-      title: 'Assign variables',
+      title: 'Призначення змінних',
+      outputType: 'Тип виходу',
+      outputVarType: 'Тип вихідної змінної',
+      varNotSet: 'Змінна не встановлена',
+      noVarTip: 'Додайте змінні для призначення',
+      type: {
+        string: 'Рядок',
+        number: 'Число',
+        object: 'Об’єкт',
+        array: 'Масив',
+      },
+      outputVars: {
+        output: 'Значення призначеної змінної',
+      },
     },
+    tool: {
+      toAuthorize: 'Авторизуватися',
+      inputVars: 'Вхідні змінні',
+      outputVars: {
+        text: 'вміст, згенерований інструментом',
+        files: {
+          title: 'файли, згенеровані інструментом',
+          type: 'Тип підтримки. Тепер підтримується лише зображення',
+          transfer_method: 'Метод передачі. Значення - віддалений URL або локальний файл',
+          url: 'URL зображення',
+          upload_file_id: 'Ідентифікатор завантаженого файлу',
+        },
+      },
+    },
+    questionClassifiers: {
+      model: 'модель',
+      inputVars: 'Вхідні змінні',
+      class: 'Клас',
+      classNamePlaceholder: 'Напишіть назву вашого класу',
+      advancedSetting: 'Розширена настройка',
+      topicName: 'Назва теми',
+      topicPlaceholder: 'Напишіть назву вашої теми',
+      addClass: 'Додати клас',
+      instruction: 'Інструкція',
+      instructionPlaceholder: 'Напишіть вашу інструкцію',
+    },
+  },
+  tracing: {
+    stopBy: 'Зупинено користувачем {{user}}',
   },
 }
 

+ 27 - 12
web/i18n/vi-VN/app-debug.ts

@@ -266,18 +266,32 @@ const translation = {
     queryNoBeEmpty: 'Truy vấn phải được thiết lập trong lời nhắc',
   },
   variableConig: {
-    modalTitle: 'Thiết lập trường',
-    description: 'Thiết lập cho biến {{varName}}',
-    fieldType: 'Loại Trường',
-    string: 'Văn Bản Ngắn',
-    paragraph: 'Đoạn Văn',
-    select: 'Chọn',
-    notSet: 'Không được thiết lập, hãy thử nhập {{input}} vào lời nhắc tiền.',
-    stringTitle: 'Tùy chọn hộp văn bản biểu mẫu',
-    maxLength: 'Độ dài Tối đa',
-    options: 'Tùy chọn',
-    addOption: 'Thêm tùy chọn',
-    apiBasedVar: 'Biến Dựa trên API',
+    'addModalTitle': 'Thêm Trường Nhập',
+    'editModalTitle': 'Chỉnh Sửa Trường Nhập',
+    'description': 'Cài đặt cho biến {{varName}}',
+    'fieldType': 'Loại Trường',
+    'string': 'Văn bản ngắn',
+    'text-input': 'Văn bản ngắn',
+    'paragraph': 'Đoạn văn',
+    'select': 'Chọn',
+    'number': 'Số',
+    'notSet': 'Không thiết lập, hãy thử nhập {{input}} trong gợi ý tiền tố',
+    'stringTitle': 'Tùy chọn hộp văn bản biểu mẫu',
+    'maxLength': 'Độ dài tối đa',
+    'options': 'Tùy chọn',
+    'addOption': 'Thêm tùy chọn',
+    'apiBasedVar': 'Biến Dựa trên API',
+    'varName': 'Tên Biến',
+    'labelName': 'Tên Nhãn',
+    'inputPlaceholder': 'Vui lòng nhập',
+    'required': 'Bắt buộc',
+    'errorMsg': {
+      varNameRequired: 'Tên biến là bắt buộc',
+      labelNameRequired: 'Tên nhãn là bắt buộc',
+      varNameCanBeRepeat: 'Tên biến không được lặp lại',
+      atLeastOneOption: 'Ít nhất một tùy chọn là bắt buộc',
+      optionRepeat: 'Có các tùy chọn trùng lặp',
+    },
   },
   vision: {
     name: 'Tầm nhìn',
@@ -348,6 +362,7 @@ const translation = {
   result: 'Văn bản Đầu Ra',
   datasetConfig: {
     settingTitle: 'Cài đặt Truy xuất',
+    knowledgeTip: 'Nhấn vào nút “+” để thêm kiến thức',
     retrieveOneWay: {
       title: 'N-to-1 Truy xuất',
       description: 'Dựa trên ý định của người dùng và mô tả Kiến thức, Agent tự động chọn Kiến thức tốt nhất để truy vấn. Tốt nhất cho các ứng dụng có Kiến thức cụ thể, giới hạn.',

+ 41 - 27
web/i18n/vi-VN/app-log.ts

@@ -5,13 +5,19 @@ const translation = {
   table: {
     header: {
       time: 'Thời gian',
-      endUser: 'Người dùng cuối',
-      input: 'Đầu vào',
-      output: 'Đầu ra',
-      summary: 'Tiêu đề',
-      messageCount: 'Số lượng tin nhắn',
-      userRate: 'Tỷ lệ người dùng',
-      adminRate: 'Tỷ lệ quản trị',
+      endUser: 'Người Dùng Cuối',
+      input: 'Đầu Vào',
+      output: 'Đầu Ra',
+      summary: 'Tiêu Đề',
+      messageCount: 'Số Lượng Tin Nhắn',
+      userRate: 'Tỷ Lệ Người Dùng',
+      adminRate: 'Tỷ Lệ Quản Trị',
+      startTime: 'THỜI GIAN BẮT ĐẦU',
+      status: 'TRẠNG THÁI',
+      runtime: 'THỜI GIAN CHẠY',
+      tokens: 'MÃ',
+      user: 'NGƯỜI DÙNG CUỐI',
+      version: 'PHIÊN BẢN',
     },
     pagination: {
       previous: 'Trước',
@@ -21,49 +27,57 @@ const translation = {
       noChat: 'Chưa có cuộc trò chuyện',
       noOutput: 'Không có đầu ra',
       element: {
-        title: 'Có ai ở đó không?',
-        content: 'Quan sát và ghi chú các tương tác giữa người dùng cuối và ứng dụng trí tuệ nhân tạo ở đây để liên tục cải thiện độ chính xác của trí tuệ nhân tạo. Bạn có thể thử <shareLink>chia sẻ</shareLink> hoặc <testLink>kiểm tra</testLink> ứng dụng Web của mình, sau đó quay lại trang này.',
+        title: 'Có ai đó ở đó không?',
+        content: 'Quan sát và chú thích các tương tác giữa người dùng cuối và ứng dụng trí tuệ nhân tạo ở đây để liên tục cải thiện độ chính xác của trí tuệ nhân tạo. Bạn có thể thử <shareLink>chia sẻ</shareLink> hoặc <testLink>kiểm tra</testLink> ứng dụng Web một cách tự nhiên, sau đó quay lại trang này.',
       },
     },
   },
   detail: {
     time: 'Thời gian',
-    conversationId: 'ID Cuộc trò chuyện',
-    promptTemplate: 'Mẫu Nhắc nhở',
-    promptTemplateBeforeChat: 'Mẫu Nhắc nhở Trước Cuộc trò chuyện · Như Tin nhắn Hệ thống',
-    annotationTip: 'Cải thiện Được Đánh Dấu bởi {{user}}',
+    conversationId: 'ID Cuộc Trò Chuyện',
+    promptTemplate: 'Mẫu Nhắc Nhở',
+    promptTemplateBeforeChat: 'Mẫu Nhắc Nhở Trước Trò Chuyện · Như Tin Nhắn Hệ Thống',
+    annotationTip: 'Cải Thiện Được Đánh Dấu bởi {{user}}',
     timeConsuming: '',
     second: 'giây',
-    tokenCost: 'Token đã tiêu',
+    tokenCost: 'Chi Phí Mã',
     loading: 'đang tải',
     operation: {
       like: 'thích',
       dislike: 'không thích',
-      addAnnotation: 'Thêm Cải thiện',
-      editAnnotation: 'Chỉnh sửa Cải thiện',
-      annotationPlaceholder: 'Nhập câu trả lời mong muốn mà bạn muốn trí tuệ nhân tạo trả lời, có thể được sử dụng cho việc điều chỉnh mô hình và cải thiện liên tục chất lượng tạo văn bản trong tương lai.',
+      addAnnotation: 'Thêm Cải Thiện',
+      editAnnotation: 'Chỉnh Sửa Cải Thiện',
+      annotationPlaceholder: 'Nhập câu trả lời mong muốn mà bạn muốn trí tuệ nhân tạo trả lời, điều này có thể được sử dụng để điều chỉnh mô hình và cải thiện liên tục chất lượng sinh văn bản trong tương lai.',
     },
     variables: 'Biến',
-    uploadImages: 'Ảnh đã tải lên',
+    uploadImages: 'Ảnh Đã Tải Lên',
   },
   filter: {
     period: {
       today: 'Hôm nay',
-      last7days: '7 Ngày qua',
-      last4weeks: '4 Tuần qua',
-      last3months: '3 Tháng qua',
-      last12months: '12 Tháng qua',
-      monthToDate: 'Từ Đầu tháng đến nay',
-      quarterToDate: 'Từ Đầu quý đến nay',
-      yearToDate: 'Từ Đầu năm đến nay',
-      allTime: 'Tất cả thời gian',
+      last7days: '7 Ngày Qua',
+      last4weeks: '4 Tuần Qua',
+      last3months: '3 Tháng Qua',
+      last12months: '12 Tháng Qua',
+      monthToDate: 'Tháng Đến Hiện Tại',
+      quarterToDate: 'Quý Đến Hiện Tại',
+      yearToDate: 'Năm Đến Hiện Tại',
+      allTime: 'Tất Cả Thời Gian',
     },
     annotation: {
       all: 'Tất cả',
-      annotated: 'Cải thiện Đã Đánh Dấu ({{count}} mục)',
+      annotated: 'Cải Thiện Đã Đánh Dấu ({{count}} mục)',
       not_annotated: 'Chưa Đánh Dấu',
     },
   },
+  workflowTitle: 'Nhật Ký Quy Trình Làm Việc',
+  workflowSubtitle: 'Nhật ký ghi lại hoạt động của Tự Động Hóa.',
+  runDetail: {
+    title: 'Nhật Ký Cuộc Trò Chuyện',
+    workflowTitle: 'Chi Tiết Nhật Ký',
+  },
+  promptLog: 'Nhật Ký Nhắc Nhở',
+  viewLog: 'Xem Nhật Ký',
 }
 
 export default translation

+ 47 - 43
web/i18n/vi-VN/app-overview.ts

@@ -2,14 +2,14 @@ const translation = {
   welcome: {
     firstStepTip: 'Để bắt đầu,',
     enterKeyTip: 'nhập khóa API OpenAI của bạn bên dưới',
-    getKeyTip: 'Lấy khóa API của bạn từ bảng điều khiển OpenAI',
-    placeholder: 'Khóa API OpenAI của bạn (ví dụ: sk-xxxx)',
+    getKeyTip: 'Lấy API Key của bạn từ bảng điều khiển OpenAI',
+    placeholder: 'Khóa API OpenAI của bạn (vd. sk-xxxx)',
   },
   apiKeyInfo: {
     cloud: {
       trial: {
         title: 'Bạn đang sử dụng hạn mức thử nghiệm của {{providerName}}.',
-        description: 'Hạn mức thử nghiệm được cung cấp cho việc thử nghiệm của bạn. Trước khi hạn mức cuộc gọi thử nghiệm được sử dụng hết, vui lòng thiết lập nhà cung cấp mô hình của riêng bạn hoặc mua thêm hạn mức.',
+        description: 'Hạn mức thử nghiệm được cung cấp cho việc kiểm tra của bạn. Trước khi hết lượt gọi hạn mức thử nghiệm, vui lòng thiết lập nhà cung cấp mô hình của riêng bạn hoặc mua thêm hạn mức.',
       },
       exhausted: {
         title: 'Hạn mức thử nghiệm của bạn đã được sử dụng hết, vui lòng thiết lập APIKey của bạn.',
@@ -25,66 +25,66 @@ const translation = {
     callTimes: 'Số lần gọi',
     usedToken: 'Token đã sử dụng',
     setAPIBtn: 'Đi đến thiết lập nhà cung cấp mô hình',
-    tryCloud: 'Hoặc thử phiên bản đám mây của Dify với báo giá miễn phí',
+    tryCloud: 'Hoặc thử phiên bản điện toán đám mây của Dify với báo giá miễn phí',
   },
   overview: {
     title: 'Tổng quan',
     appInfo: {
-      explanation: 'WebApp Trí tuệ nhân tạo Sẵn sàng sử dụng',
-      accessibleAddress: 'URL Công cộng',
+      explanation: 'Ứng dụng web AI sẵn sàng sử dụng',
+      accessibleAddress: 'Địa chỉ công cộng',
       preview: 'Xem trước',
       regenerate: 'Tạo lại',
-      preUseReminder: 'Vui lòng kích hoạt WebApp trước khi tiếp tục.',
+      preUseReminder: 'Vui lòng kích hoạt ứng dụng web trước khi tiếp tục.',
       settings: {
         entry: 'Cài đặt',
-        title: 'Cài đặt WebApp',
-        webName: 'Tên WebApp',
-        webDesc: 'Mô tả WebApp',
-        webDescTip: 'Văn bản này sẽ được hiển thị trên phía máy khách, cung cấp hướng dẫn cơ bản về cách sử dụng ứng dụng',
-        webDescPlaceholder: 'Nhập mô tả của WebApp',
+        title: 'Cài đặt ứng dụng web',
+        webName: 'Tên ứng dụng web',
+        webDesc: 'Mô tả ứng dụng web',
+        webDescTip: 'Văn bản này sẽ được hiển thị  phía máy khách, cung cấp hướng dẫn cơ bản về cách sử dụng ứng dụng',
+        webDescPlaceholder: 'Nhập mô tả của ứng dụng web',
         language: 'Ngôn ngữ',
         more: {
           entry: 'Hiển thị thêm cài đặt',
           copyright: 'Bản quyền',
           copyRightPlaceholder: 'Nhập tên tác giả hoặc tổ chức',
-          privacyPolicy: 'Chính sách Bảo mật',
+          privacyPolicy: 'Chính sách bảo mật',
           privacyPolicyPlaceholder: 'Nhập liên kết chính sách bảo mật',
-          privacyPolicyTip: 'Giúp người truy cập hiểu về dữ liệu mà ứng dụng thu thập, xem <privacyPolicyLink>Chính sách Bảo mật</privacyPolicyLink> của Dify.',
+          privacyPolicyTip: 'Giúp khách truy cập hiểu được dữ liệu mà ứng dụng thu thập, xem <privacyPolicyLink>Chính sách bảo mật</privacyPolicyLink> của Dify.',
         },
       },
       embedded: {
         entry: 'Nhúng',
         title: 'Nhúng vào trang web',
         explanation: 'Chọn cách nhúng ứng dụng trò chuyện vào trang web của bạn',
-        iframe: 'Để thêm ứng dụng trò chuyện ở bất kỳ đâu trên trang web của bạn, thêm iframe này vào mã html của bạn.',
-        scripts: 'Để thêm ứng dụng trò chuyện vào phía dưới bên phải của trang web của bạn, thêm mã này vào mã html của bạn.',
-        chromePlugin: 'Cài đặt Phần mở rộng Chrome Dify Chatbot',
+        iframe: 'Để thêm ứng dụng trò chuyện ở bất kỳ đâu trên trang web của bạn, hãy thêm iframe này vào mã HTML của bạn.',
+        scripts: 'Để thêm ứng dụng trò chuyện vào góc dưới bên phải của trang web của bạn, thêm mã này vào mã HTML của bạn.',
+        chromePlugin: 'Cài đặt Tiện ích Mở rộng Dify Chatbot cho Chrome',
         copied: 'Đã sao chép',
         copy: 'Sao chép',
       },
       qrcode: {
         title: 'Mã QR để chia sẻ',
-        scan: 'Quét để chia sẻ ứng dụng',
-        download: 'Tải về Mã QR',
+        scan: 'Quét và Chia sẻ Ứng dụng',
+        download: 'Tải xuống Mã QR',
       },
       customize: {
         way: 'cách',
         entry: 'Tùy chỉnh',
-        title: 'Tùy chỉnh WebApp Trí tuệ nhân tạo',
-        explanation: 'Bạn có thể tùy chỉnh giao diện trước của ứng dụng Web để phù hợp với kịch bản và nhu cầu phong cách của bạn.',
+        title: 'Tùy chỉnh ứng dụng web AI',
+        explanation: 'Bạn có thể tùy chỉnh giao diện phía trước của Ứng dụng Web để phù hợp với kịch bản và nhu cầu phong cách của mình.',
         way1: {
-          name: 'Fork mã nguồn máy khách, chỉnh sửa và triển khai lên Vercel (được khuyến nghị)',
-          step1: 'Fork mã nguồn máy khách và chỉnh sửa',
-          step1Tip: 'Nhấn vào đây để fork mã nguồn vào tài khoản GitHub của bạn và chỉnh sửa mã',
+          name: 'Fork mã nguồn của máy khách, sửa đổi và triển khai lên Vercel (được khuyến nghị)',
+          step1: 'Fork mã nguồn của máy khách và sửa đổi',
+          step1Tip: 'Nhấp vào đây để fork mã nguồn vào tài khoản GitHub của bạn và sửa đổi mã',
           step1Operation: 'Dify-WebClient',
           step2: 'Triển khai lên Vercel',
-          step2Tip: 'Nhấn vào đây để nhập kho vào Vercel và triển khai',
+          step2Tip: 'Nhấp vào đây để nhập kho vào Vercel và triển khai',
           step2Operation: 'Nhập kho',
           step3: 'Cấu hình biến môi trường',
           step3Tip: 'Thêm các biến môi trường sau vào Vercel',
         },
         way2: {
-          name: 'Viết mã phía máy khách để gọi API và triển khai lên máy chủ',
+          name: 'Viết mã phía máy khách để gọi API và triển khai lên một máy chủ',
           operation: 'Tài liệu',
         },
       },
@@ -92,8 +92,8 @@ const translation = {
     apiInfo: {
       title: 'API Dịch vụ Backend',
       explanation: 'Dễ dàng tích hợp vào ứng dụng của bạn',
-      accessibleAddress: 'Điểm cuối API Dịch vụ',
-      doc: 'Tài liệu Tham khảo API',
+      accessibleAddress: 'Điểm cuối Dịch vụ API',
+      doc: 'Tài liệu tham khảo API',
     },
     status: {
       running: 'Đang hoạt động',
@@ -105,33 +105,37 @@ const translation = {
     ms: 'ms',
     tokenPS: 'Token/s',
     totalMessages: {
-      title: 'Tổng số tin nhắn',
-      explanation: 'Số lượt tương tác AI hàng ngày; không bao gồm kỹ thuật kịch bản / gỡ lỗi.',
+      title: 'Tổng Số Tin Nhắn',
+      explanation: 'Số lần tương tác AI hàng ngày; không tính việc kỹ thuật hóa/nhái lại câu hỏi.',
     },
     activeUsers: {
-      title: 'Người dùng hoạt động',
-      explanation: 'Người dùng duy nhất tham gia trò chuyện với AI; không bao gồm kỹ thuật kịch bản / gỡ lỗi.',
+      title: 'Người Dùng Hoạt Động',
+      explanation: 'Người dùng duy nhất tham gia trò chuyện với AI; không tính việc kỹ thuật hóa/nhái lại câu hỏi.',
     },
     tokenUsage: {
-      title: 'Sử dụng Token',
-      explanation: 'Phản ánh việc sử dụng token hàng ngày của mô hình ngôn ngữ cho ứng dụng, hữu ích cho mục đích kiểm soát chi phí.',
-      consumed: 'Đã tiêu',
+      title: 'Sử Dụng Token',
+      explanation: 'Phản ánh việc sử dụng hàng ngày của mô hình ngôn ngữ cho ứng dụng, hữu ích cho mục đích kiểm soát chi phí.',
+      consumed: 'Đã Sử Dụng',
     },
     avgSessionInteractions: {
-      title: 'Trung bình Tương tác trong phiên',
-      explanation: 'Số lượt giao tiếp giữa người dùng và AI liên tục; cho các ứng dụng dựa trên cuộc trò chuyện.',
+      title: 'Trung Bình Tương Tác Phiên',
+      explanation: 'Số lần giao tiếp liên tục giữa người dùng và AI; cho các ứng dụng dựa trên cuộc trò chuyện.',
+    },
+    avgUserInteractions: {
+      title: 'Trung Bình Tương Tác Người Dùng',
+      explanation: 'Phản ánh tần suất sử dụng hàng ngày của người dùng. Số liệu này phản ánh sự kết dính của người dùng.',
     },
     userSatisfactionRate: {
-      title: 'Tỷ lệ Hài lòng của Người dùng',
-      explanation: 'Số lượng thích cho mỗi 1.000 tin nhắn. Điều này cho thấy tỷ lệ phản hồi mà người dùng rất hài lòng.',
+      title: 'Tỷ Lệ Hài Lòng của Người Dùng',
+      explanation: 'Số lượt thích trên mỗi 1.000 tin nhắn. Điều này cho biết tỷ lệ câu trả lời mà người dùng rất hài lòng.',
     },
     avgResponseTime: {
-      title: 'Trung bình Thời gian Phản hồi',
-      explanation: 'Thời gian (ms) để AI xử lý / phản hồi; cho các ứng dụng dựa trên văn bản.',
+      title: 'Thời Gian Trả Lời Trung Bình',
+      explanation: 'Thời gian (ms) để AI xử lý/phản hồi; cho các ứng dụng dựa trên văn bản.',
     },
     tps: {
-      title: 'Tốc độ Đầu ra Token',
-      explanation: 'Đo hiệu suất của LLM. Đếm tốc độ đầu ra Token của LLM từ khi bắt đầu yêu cầu cho đến khi hoàn thành đầu ra.',
+      title: 'Tốc Độ Đầu Ra Token',
+      explanation: 'Đo lường hiệu suất của LLM. Đếm tốc độ đầu ra Token của LLM từ khi bắt đầu yêu cầu đến khi hoàn thành đầu ra.',
     },
   },
 }

+ 57 - 21
web/i18n/vi-VN/app.ts

@@ -1,39 +1,60 @@
 const translation = {
-  createApp: 'Tạo ứng dụng mới',
+  createApp: 'TẠO ỨNG DỤNG',
   types: {
     all: 'Tất cả',
-    assistant: 'Trợ lý',
+    chatbot: 'Chatbot',
+    agent: 'Đại lý',
+    workflow: 'Quy trình',
     completion: 'Hoàn thành',
   },
-  modes: {
-    completion: 'Máy tạo văn bản',
-    chat: 'Trợ lý Cơ bản',
-  },
-  createFromConfigFile: 'Tạo ứng dụng từ tệp cấu hình',
+  duplicate: 'Sao chép',
+  duplicateTitle: 'Sao chép Ứng dụng',
+  export: 'Xuất DSL',
+  exportFailed: 'Xuất DSL thất bại.',
+  importDSL: 'Nhập tệp DSL',
+  createFromConfigFile: 'Tạo từ tệp DSL',
   deleteAppConfirmTitle: 'Xóa ứng dụng này?',
   deleteAppConfirmContent:
-    'Việc xóa ứng dụng là không thể đảo ngược. Người dùng sẽ không thể truy cập vào ứng dụng của bạn nữa, và tất cả cấu hình và nhật ký mẫu sẽ bị xóa vĩnh viễn.',
+    'Việc xóa ứng dụng là không thể đảo ngược. Người dùng sẽ không thể truy cập vào ứng dụng của bạn nữa và tất cả cấu hình và nhật ký nhắc sẽ bị xóa vĩnh viễn.',
   appDeleted: 'Ứng dụng đã bị xóa',
-  appDeleteFailed: 'Xóa ứng dụng thất bại',
+  appDeleteFailed: 'Không thể xóa ứng dụng',
   join: 'Tham gia cộng đồng',
   communityIntro:
     'Thảo luận với các thành viên nhóm, người đóng góp và nhà phát triển trên các kênh khác nhau.',
   roadmap: 'Xem lộ trình của chúng tôi',
-  appNamePlaceholder: 'Vui lòng nhập tên của ứng dụng',
   newApp: {
-    startToCreate: 'Hãy bắt đầu với ứng dụng mới của bạn',
-    captionName: 'Biểu tượng & tên ứng dụng',
-    captionAppType: 'Bạn muốn tạo loại ứng dụng nào?',
+    startFromBlank: 'Tạo từ Trắng',
+    startFromTemplate: 'Tạo từ Mẫu',
+    captionAppType: 'Loại ứng dụng bạn muốn tạo?',
+    chatbotDescription: 'Xây dựng một ứng dụng dựa trên trò chuyện. Ứng dụng này sử dụng định dạng câu hỏi và trả lời, cho phép nhiều vòng trò chuyện liên tục.',
+    completionDescription: 'Xây dựng một ứng dụng tạo văn bản chất lượng cao dựa trên các gợi ý, như tạo bài báo, tóm tắt, dịch và nhiều hơn nữa.',
+    completionWarning: 'Loại ứng dụng này sẽ không được hỗ trợ nữa.',
+    agentDescription: 'Xây dựng một Đại lý thông minh có thể tự động chọn công cụ để hoàn thành các nhiệm vụ',
+    workflowDescription: 'Xây dựng một ứng dụng tạo văn bản chất lượng cao dựa trên quy trình làm việc với mức độ tùy chỉnh cao. Nó phù hợp cho người dùng có kinh nghiệm.',
+    workflowWarning: 'Hiện đang trong phiên bản beta',
+    chatbotType: 'Phương pháp quản lý Chatbot',
+    basic: 'Cơ bản',
+    basicTip: 'Dành cho người mới bắt đầu, có thể chuyển sang Chatflow sau này',
+    basicFor: 'DÀNH CHO NGƯỜI MỚI BẮT ĐẦU',
+    basicDescription: 'Quản lý Cơ bản cho phép quản lý ứng dụng Chatbot bằng cách sử dụng các cài đặt đơn giản, mà không cần phải sửa đổi các nhắc nhở tích hợp sẵn. Nó phù hợp cho người mới bắt đầu.',
+    advanced: 'Chatflow',
+    advancedFor: 'Dành cho người dùng có kinh nghiệm',
+    advancedDescription: 'Quản lý Quy trình quản lý Chatbot dưới dạng các quy trình làm việc, cung cấp mức độ tùy chỉnh cao, bao gồm khả năng chỉnh sửa các nhắc nhở tích hợp sẵn. Nó phù hợp cho người dùng có kinh nghiệm.',
+    captionName: 'Biểu tượng và tên ứng dụng',
+    appNamePlaceholder: 'Đặt tên cho ứng dụng của bạn',
+    captionDescription: 'Mô tả',
+    appDescriptionPlaceholder: 'Nhập mô tả của ứng dụng',
+    useTemplate: 'Sử dụng mẫu này',
     previewDemo: 'Xem trước demo',
     chatApp: 'Trợ lý',
     chatAppIntro:
       'Tôi muốn xây dựng một ứng dụng dựa trên trò chuyện. Ứng dụng này sử dụng định dạng câu hỏi và trả lời, cho phép nhiều vòng trò chuyện liên tục.',
-    agentAssistant: 'Trợ lý Mới cho Đại lý',
-    completeApp: 'Máy Tạo Văn Bản',
+    agentAssistant: 'Trợ lý Đại lý mới',
+    completeApp: 'Máy tạo văn bản',
     completeAppIntro:
-      'Tôi muốn tạo một ứng dụng tạo ra văn bản chất lượng cao dựa trên các mẫu, như việc tạo bài viết, tóm tắt, dịch thuật và nhiều hơn nữa.',
-    showTemplates: 'Tôi muốn chọn từ một mẫu',
-    hideTemplates: 'Quay lại lựa chọn chế độ',
+      'Tôi muốn tạo một ứng dụng tạo văn bản chất lượng cao dựa trên các gợi ý, như tạo bài báo, tóm tắt, dịch và nhiều hơn nữa.',
+    showTemplates: 'Tôi muốn chọn từ mẫu',
+    hideTemplates: 'Quay lại chế độ lựa chọn',
     Create: 'Tạo',
     Cancel: 'Hủy',
     nameNotEmpty: 'Tên không được để trống',
@@ -42,13 +63,28 @@ const translation = {
     appCreated: 'Ứng dụng đã được tạo',
     appCreateFailed: 'Không thể tạo ứng dụng',
   },
-  editApp: {
-    startToEdit: 'Chỉnh sửa ứng dụng',
-  },
+  editApp: 'Chỉnh sửa Thông tin',
+  editAppTitle: 'Chỉnh sửa Thông tin Ứng dụng',
+  editDone: 'Thông tin ứng dụng đã được cập nhật',
+  editFailed: 'Không thể cập nhật thông tin ứng dụng',
   emoji: {
     ok: 'Đồng ý',
     cancel: 'Hủy',
   },
+  switch: 'Chuyển sang Quy trình Quản lý',
+  switchTipStart: 'Một bản sao ứng dụng mới sẽ được tạo cho bạn và bản sao mới sẽ chuyển sang Quy trình Quản lý. Bản sao mới sẽ ',
+  switchTip: 'không cho phép',
+  switchTipEnd: ' chuyển lại Cơ bản Quản lý.',
+  switchLabel: 'Bản sao ứng dụng sẽ được tạo',
+  removeOriginal: 'Xóa ứng dụng gốc',
+  switchStart: 'Bắt đầu chuyển',
+  typeSelector: {
+    all: 'TẤT CẢ Loại',
+    chatbot: 'Chatbot',
+    agent: 'Đại lý',
+    workflow: 'Quy trình',
+    completion: 'Hoàn thành',
+  },
 }
 
 export default translation

+ 5 - 0
web/i18n/vi-VN/common.ts

@@ -400,6 +400,7 @@ const translation = {
     promptEng: 'Orchestrate',
     apiAccess: 'Truy cập API',
     logAndAnn: 'Nhật ký & Thông báo',
+    logs: 'Nhật ký',
   },
   environment: {
     testing: 'TESTING',
@@ -477,6 +478,10 @@ const translation = {
         title: 'Biến & Công cụ Bên ngoài',
         desc: 'Chèn Biến & Công cụ Bên ngoài',
       },
+      outputToolDisabledItem: {
+        title: 'Công cụ Bên ngoài',
+        desc: 'Công cụ Bên ngoài không thể chèn vào đây',
+      },
       modal: {
         add: 'Biến mới',
         addTool: 'Công cụ mới',

+ 1 - 1
web/i18n/vi-VN/explore.ts

@@ -18,7 +18,7 @@ const translation = {
   apps: {
     title: 'Khám phá Ứng dụng bởi Dify',
     description: 'Sử dụng ngay các ứng dụng mẫu này hoặc tùy chỉnh các ứng dụng của bạn dựa trên các mẫu.',
-    allCategories: 'Tất cả Danh mục',
+    allCategories: 'Tất cả danh mục',
   },
   appCard: {
     addToWorkspace: 'Thêm vào Kho lưu trữ',

+ 19 - 1
web/i18n/vi-VN/run-log.ts

@@ -1,5 +1,23 @@
 const translation = {
-
+  input: 'NHẬP',
+  result: 'KẾT QUẢ',
+  detail: 'CHI TIẾT',
+  tracing: 'THEO DÕI',
+  resultPanel: {
+    status: 'TRẠNG THÁI',
+    time: 'THỜI GIAN',
+    tokens: 'TỔNG SỐ TOKEN',
+  },
+  meta: {
+    title: 'DỮ LIỆU META',
+    status: 'Trạng thái',
+    version: 'Phiên bản',
+    executor: 'Người thực thi',
+    startTime: 'Thời gian bắt đầu',
+    time: 'Thời gian đã trôi qua',
+    tokens: 'Tổng số token',
+    steps: 'Các bước chạy',
+  },
 }
 
 export default translation

+ 331 - 1
web/i18n/vi-VN/workflow.ts

@@ -1,3 +1,333 @@
-const translation = {}
+const translation = {
+  common: {
+    editing: 'Chỉnh sửa',
+    autoSaved: 'Tự động lưu',
+    unpublished: 'Chưa xuất bản',
+    published: 'Đã xuất bản',
+    publish: 'Xuất bản',
+    update: 'Cập nhật',
+    run: 'Chạy',
+    running: 'Đang chạy',
+    inRunMode: 'Ở Chế độ chạy',
+    inPreview: 'Ở Chế độ xem trước',
+    inPreviewMode: 'Ở Chế độ xem trước',
+    preview: 'Xem trước',
+    viewRunHistory: 'Xem lịch sử chạy',
+    runHistory: 'Lịch sử chạy',
+    goBackToEdit: 'Quay lại trình soạn thảo',
+    conversationLog: 'Nhật ký cuộc trò chuyện',
+    features: 'Tính năng',
+    debugAndPreview: 'Debug và Xem trước',
+    restart: 'Khởi động lại',
+    currentDraft: 'Bản nháp hiện tại',
+    currentDraftUnpublished: 'Bản nháp hiện tại chưa xuất bản',
+    latestPublished: 'Bản xuất bản mới nhất',
+    publishedAt: 'Đã xuất bản lúc',
+    restore: 'Khôi phục',
+    runApp: 'Chạy ứng dụng',
+    batchRunApp: 'Chạy ứng dụng hàng loạt',
+    accessAPIReference: 'Truy cập Tài liệu API',
+    embedIntoSite: 'Nhúng vào trang web',
+    addTitle: 'Thêm tiêu đề...',
+    addDescription: 'Thêm mô tả...',
+    noVar: 'Không có biến',
+    searchVar: 'Tìm kiếm biến',
+    variableNamePlaceholder: 'Tên biến',
+    setVarValuePlaceholder: 'Đặt giá trị biến',
+    needConnecttip: 'Bước này chưa kết nối với bất kỳ điều gì',
+    maxTreeDepth: 'Giới hạn tối đa của {{depth}} nút mỗi nhánh',
+    needEndNode: 'Khối Kết thúc phải được thêm vào',
+    needAnswerNode: 'Khối Trả lời phải được thêm vào',
+    workflowProcess: 'Quy trình làm việc',
+    notRunning: 'Chưa chạy',
+    previewPlaceholder: 'Nhập nội dung vào ô dưới đây để bắt đầu gỡ lỗi Chatbot',
+    effectVarConfirm: {
+      title: 'Xóa biến',
+      content: 'Biến được sử dụng trong các nút khác. Bạn vẫn muốn xóa nó?',
+    },
+    insertVarTip: 'Nhấn phím \'/\' để chèn nhanh',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} là bắt buộc',
+    authRequired: 'Yêu cầu xác thực',
+    invalidJson: '{{field}} không hợp lệ',
+    fields: {
+      variable: 'Tên Biến',
+      variableValue: 'Giá trị Biến',
+      code: 'Mã',
+      model: 'Mô hình',
+      rerankModel: 'Mô hình Rerank',
+    },
+    invalidVariable: 'Biến không hợp lệ',
+  },
+  singleRun: {
+    testRun: 'Chạy thử ',
+    startRun: 'Bắt đầu chạy',
+    running: 'Đang chạy',
+  },
+  tabs: {
+    'searchBlock': 'Tìm kiếm khối',
+    'blocks': 'Khối',
+    'builtInTool': 'Công cụ tích hợp',
+    'customTool': 'Công cụ tùy chỉnh',
+    'question-understand': 'Hiểu câu hỏi',
+    'logic': 'Logic',
+    'transform': 'Chuyển đổi',
+    'utilities': 'Tiện ích',
+    'noResult': 'Không tìm thấy kết quả',
+  },
+  blocks: {
+    'start': 'Bắt đầu',
+    'end': 'Kết thúc',
+    'answer': 'Trả lời',
+    'llm': 'LLM',
+    'knowledge-retrieval': 'Truy xuất Kiến thức',
+    'question-classifier': 'Bộ phân loại Câu hỏi',
+    'if-else': 'NẾU/NGƯỢC LẠI',
+    'code': 'Mã',
+    'template-transform': 'Mẫu',
+    'http-request': 'Yêu cầu HTTP',
+    'variable-assigner': 'Bộ gán biến',
+  },
+  blocksAbout: {
+    'start': 'Xác định các tham số ban đầu cho việc khởi chạy một quy trình',
+    'end': 'Xác định kết thúc và loại kết quả của một quy trình',
+    'answer': 'Xác định nội dung trả lời của một cuộc trò chuyện chat',
+    'llm': 'Gọi các mô hình ngôn ngữ lớn để trả lời câu hỏi hoặc xử lý ngôn ngữ tự nhiên',
+    'knowledge-retrieval': 'Cho phép bạn truy vấn nội dung văn bản liên quan đến các câu hỏi của người dùng từ Kiến thức',
+    'question-classifier': 'Xác định các điều kiện phân loại của các câu hỏi của người dùng, LLM có thể xác định cách cuộc trò chuyện tiến triển dựa trên mô tả phân loại',
+    'if-else': 'Cho phép bạn chia quy trình thành hai nhánh dựa trên các điều kiện if/else',
+    'code': 'Thực thi một đoạn mã Python hoặc NodeJS để thực hiện logic tùy chỉnh',
+    'template-transform': 'Chuyển đổi dữ liệu thành chuỗi sử dụng cú pháp mẫu Jinja',
+    'http-request': 'Cho phép gửi các yêu cầu máy chủ qua giao thức HTTP',
+    'variable-assigner': 'Gán biến trong các nhánh khác nhau vào cùng một biến để đạt được cấu hình thống nhất của các nút sau',
+  },
+  operator: {
+    zoomIn: 'Phóng to',
+    zoomOut: 'Thu nhỏ',
+    zoomTo50: 'Thu phóng đến 50%',
+    zoomTo100: 'Thu phóng đến 100%',
+    zoomToFit: 'Thu phóng vừa với cửa sổ',
+  },
+  panel: {
+    userInputField: 'Trường nhập của người dùng',
+    changeBlock: 'Thay đổi Khối',
+    helpLink: 'Liên kết Trợ giúp',
+    about: 'Về',
+    createdBy: 'Được tạo bởi ',
+    nextStep: 'Bước tiếp theo',
+    addNextStep: 'Thêm khối tiếp theo trong quy trình làm việc này',
+    selectNextStep: 'Chọn Khối Tiếp theo',
+    runThisStep: 'Chạy bước này',
+    checklist: 'Danh sách kiểm tra',
+    checklistTip: 'Đảm bảo tất cả các vấn đề được giải quyết trước khi xuất bản',
+    checklistResolved: 'Tất cả các vấn đề đã được giải quyết',
+    organizeBlocks: 'Sắp xếp các khối',
+    change: 'Thay đổi',
+  },
+  nodes: {
+    common: {
+      outputVars: 'Biến đầu ra',
+      insertVarTip: 'Chèn Biến',
+      memory: {
+        memory: 'Bộ nhớ',
+        memoryTip: 'Cài đặt bộ nhớ trò chuyện',
+        windowSize: 'Kích thước cửa sổ',
+        conversationRoleName: 'Tên vai trò cuộc trò chuyện',
+        user: 'Tiền tố người dùng',
+        assistant: 'Tiền tố trợ lý',
+      },
+      memories: {
+        title: 'Các ký ức',
+        tip: 'Bộ nhớ trò chuyện',
+        builtIn: 'Tích hợp sẵn',
+      },
+    },
+    start: {
+      required: 'bắt buộc',
+      inputField: 'Trường nhập',
+      builtInVar: 'Biến tích hợp sẵn',
+      outputVars: {
+        query: 'Đầu vào người dùng',
+        memories: {
+          des: 'Lịch sử cuộc trò chuyện',
+          type: 'loại tin nhắn',
+          content: 'nội dung tin nhắn',
+        },
+        files: 'Danh sách tệp',
+      },
+      noVarTip: 'Thiết lập các đầu vào có thể được sử dụng trong Quy trình làm việc',
+    },
+    end: {
+      outputs: 'Đầu ra',
+      output: {
+        type: 'loại đầu ra',
+        variable: 'biến đầu ra',
+      },
+      type: {
+        'none': 'Không',
+        'plain-text': 'Văn bản thuần',
+        'structured': 'Cấu trúc',
+      },
+    },
+    answer: {
+      answer: 'Trả lời',
+      outputVars: 'Biến đầu ra',
+    },
+    llm: {
+      model: 'mô hình',
+      variables: 'biến',
+      context: 'bối cảnh',
+      contextTooltip: 'Bạn có thể nhập Kiến thức dưới dạng bối cảnh',
+      notSetContextInPromptTip: 'Để bật tính năng bối cảnh, vui lòng điền vào biến ngữ cảnh trong PROMPT.',
+      prompt: 'nhắc nhở',
+      roleDescription: {
+        system: 'Đưa ra chỉ thị cấp cao cho cuộc trò chuyện',
+        user: 'Cung cấp chỉ thị, truy vấn hoặc bất kỳ đầu vào dựa trên văn bản nào cho mô hình',
+        assistant: 'Các phản hồi của mô hình dựa trên các tin nhắn của người dùng',
+      },
+      addMessage: 'Thêm Tin nhắn',
+      vision: 'tầm nhìn',
+      files: 'Tệp',
+      resolution: {
+        name: 'Độ phân giải',
+        high: 'Cao',
+        low: 'Thấp',
+      },
+      outputVars: {
+        output: 'Tạo nội dung',
+        usage: 'Thông tin Sử dụng Mô hình',
+      },
+      singleRun: {
+        variable: 'Biến',
+      },
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'Biến Truy vấn',
+      knowledge: 'Kiến thức',
+      outputVars: {
+        output: 'Dữ liệu phân đoạn truy xuất',
+        content: 'Nội dung phân đoạn',
+        title: 'Tiêu đề phân đoạn',
+        icon: 'Biểu tượng phân đoạn',
+        url: 'URL phân đoạn',
+        metadata: 'Các siêu dữ liệu khác',
+      },
+    },
+    http: {
+      inputVars: 'Biến đầu vào',
+      api: 'API',
+      apiPlaceholder: 'Nhập URL, nhập ‘/’ chèn biến',
+      notStartWithHttp: 'API phải bắt đầu bằng http:// hoặc https://',
+      key: 'Khóa',
+      value: 'Giá trị',
+      bulkEdit: 'Chỉnh sửa hàng loạt',
+      keyValueEdit: 'Chỉnh sửa Khóa-Giá trị',
+      headers: 'Tiêu đề',
+      params: 'Tham số',
+      body: 'Nội dung',
+      outputVars: {
+        body: 'Nội dung Phản hồi',
+        statusCode: 'Mã trạng thái Phản hồi',
+        headers: 'Danh sách Tiêu đề Phản hồi JSON',
+        files: 'Danh sách Tệp',
+      },
+      authorization: {
+        'authorization': 'Xác thực',
+        'authorizationType': 'Loại Xác thực',
+        'no-auth': 'Không',
+        'api-key': 'Khóa API',
+        'auth-type': 'Loại Xác thực',
+        'basic': 'Cơ bản',
+        'bearer': 'Bearer',
+        'custom': 'Tùy chỉnh',
+        'api-key-title': 'Khóa API',
+        'header': 'Tiêu đề',
+      },
+      insertVarPlaceholder: 'nhập \'/\' để chèn biến',
+    },
+    code: {
+      inputVars: 'Biến đầu vào',
+      outputVars: 'Biến đầu ra',
+    },
+    templateTransform: {
+      inputVars: 'Biến đầu vào',
+      code: 'Mã',
+      codeSupportTip: 'Chỉ hỗ trợ Jinja2',
+      outputVars: {
+        output: 'Nội dung đã chuyển đổi',
+      },
+    },
+    ifElse: {
+      if: 'Nếu',
+      else: 'Ngược lại',
+      elseDescription: 'Được sử dụng để xác định logic sẽ được thực hiện khi điều kiện if không được đáp ứng.',
+      and: 'và',
+      or: 'hoặc',
+      operator: 'Toán tử',
+      notSetVariable: 'Vui lòng thiết lập biến trước',
+      comparisonOperator: {
+        'contains': 'chứa',
+        'not contains': 'không chứa',
+        'start with': 'bắt đầu bằng',
+        'end with': 'kết thúc bằng',
+        'is': 'là',
+        'is not': 'không phải là',
+        'empty': 'trống',
+        'not empty': 'không trống',
+        'null': 'null',
+        'not null': 'không null',
+      },
+      enterValue: 'Nhập giá trị',
+      addCondition: 'Thêm Điều kiện',
+      conditionNotSetup: 'Điều kiện CHƯA được thiết lập',
+    },
+    variableAssigner: {
+      title: 'Gán biến',
+      outputType: 'Loại đầu ra',
+      outputVarType: 'Loại Biến đầu ra',
+      varNotSet: 'Biến không được thiết lập',
+      noVarTip: 'Thêm các biến cần gán',
+      type: {
+        string: 'Chuỗi',
+        number: 'Số',
+        object: 'Đối tượng',
+        array: 'Mảng',
+      },
+      outputVars: {
+        output: 'Giá trị biến được gán',
+      },
+    },
+    tool: {
+      toAuthorize: 'Để ủy quyền',
+      inputVars: 'Biến đầu vào',
+      outputVars: {
+        text: 'nội dung được tạo ra bởi công cụ',
+        files: {
+          title: 'tệp được tạo ra bởi công cụ',
+          type: 'Loại hỗ trợ. Hiện chỉ hỗ trợ hình ảnh',
+          transfer_method: 'Phương pháp chuyển. Giá trị là remote_url hoặc local_file',
+          url: 'URL Hình ảnh',
+          upload_file_id: 'ID tệp tải lên',
+        },
+      },
+    },
+    questionClassifiers: {
+      model: 'mô hình',
+      inputVars: 'Biến đầu vào',
+      class: 'Lớp',
+      classNamePlaceholder: 'Viết tên lớp của bạn',
+      advancedSetting: 'Cài đặt Nâng cao',
+      topicName: 'Tên Chủ đề',
+      topicPlaceholder: 'Viết tên chủ đề của bạn',
+      addClass: 'Thêm Lớp',
+      instruction: 'Hướng dẫn',
+      instructionPlaceholder: 'Viết hướng dẫn của bạn',
+    },
+  },
+  tracing: {
+    stopBy: 'Dừng lại bởi {{user}}',
+  },
+}
 
 export default translation