Browse Source

Add support for Traditional Chinese language (#3899)

Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com>
Co-authored-by: crazywoola <427733928@qq.com>
yongjer 1 năm trước cách đây
mục cha
commit
3b5b4d628b

+ 2 - 1
api/constants/languages.py

@@ -1,10 +1,11 @@
 
 
-languages = ['en-US', 'zh-Hans', 'pt-BR', 'es-ES', 'fr-FR', 'de-DE', 'ja-JP', 'ko-KR', 'ru-RU', 'it-IT', 'uk-UA', 'vi-VN']
+languages = ['en-US', 'zh-Hans', 'zh-Hant', 'pt-BR', 'es-ES', 'fr-FR', 'de-DE', 'ja-JP', 'ko-KR', 'ru-RU', 'it-IT', 'uk-UA', 'vi-VN']
 
 language_timezone_mapping = {
     'en-US': 'America/New_York',
     'zh-Hans': 'Asia/Shanghai',
+    'zh-Hant': 'Asia/Taipei',
     'pt-BR': 'America/Sao_Paulo',
     'es-ES': 'Europe/Madrid',
     'fr-FR': 'Europe/Paris',

+ 7 - 0
web/i18n/language.ts

@@ -18,6 +18,7 @@ export type I18nText = {
   'uk-UA': string
   'vi-VN': string
   'de_DE': string
+  'zh_Hant': string
 }
 
 export const languages = [
@@ -33,6 +34,12 @@ export const languages = [
     example: '你好,Dify!',
     supported: true,
   },
+  {
+    value: 'zh-Hant',
+    name: '繁體中文',
+    example: '你好,Dify!',
+    supported: true,
+  },
   {
     value: 'pt-BR',
     name: 'Português (Brasil)',

+ 1 - 1
web/i18n/script.js

@@ -4,7 +4,7 @@ const path = require('node:path')
 const transpile = require('typescript').transpile
 
 const targetLanguage = 'en-US'
-const languages = ['zh-Hans', 'fr-FR', 'ja-JP', 'pt-BR', 'uk-UA', 'vi-VN']
+const languages = ['zh-Hans', 'fr-FR', 'ja-JP', 'pt-BR', 'uk-UA', 'vi-VN', 'zh-Hant']
 
 async function getKeysFromLanuage(language) {
   return new Promise((resolve, reject) => {

+ 90 - 0
web/i18n/zh-Hant/app-annotation.ts

@@ -0,0 +1,90 @@
+const translation = {
+  title: '標註',
+  name: '標註回覆',
+  editBy: '{{author}}編輯的答案',
+  noData: {
+    title: '沒有標註',
+    description: '你可以在應用會話除錯中編輯標註,也可以在此批次匯入標註用於高質量回復。',
+  },
+  table: {
+    header: {
+      question: '提問',
+      match: '匹配',
+      response: '回覆',
+      answer: '答案',
+      createdAt: '建立時間',
+      hits: '命中次數',
+      actions: '操作',
+      addAnnotation: '新增標註',
+      bulkImport: '批次匯入',
+      bulkExport: '批次匯出',
+      clearAll: '刪除所有標註',
+    },
+  },
+  editModal: {
+    title: '編輯標註回覆',
+    queryName: '使用者提問',
+    answerName: '機器回覆',
+    yourAnswer: '您的回覆',
+    answerPlaceholder: '在這裡輸入您的回覆',
+    yourQuery: '您的提問',
+    queryPlaceholder: '在這裡輸入您的提問',
+    removeThisCache: '刪除此標註',
+    createdAt: '創建於',
+  },
+  addModal: {
+    title: '新增標註回覆',
+    queryName: '提問',
+    answerName: '回覆',
+    answerPlaceholder: '輸入回覆',
+    queryPlaceholder: '輸入提問',
+    createNext: '新增下一個標註回覆',
+  },
+  batchModal: {
+    title: '批次匯入',
+    csvUploadTitle: '將您的 CSV 檔案拖放到此處,或',
+    browse: '選擇檔案',
+    tip: 'CSV 檔案必須符合以下結構:',
+    question: '問題',
+    answer: '回答',
+    contentTitle: '分段內容',
+    content: '內容',
+    template: '下載模板',
+    cancel: '取消',
+    run: '匯入',
+    runError: '批次匯入失敗',
+    processing: '批次處理中',
+    completed: '匯入完成',
+    error: '匯入出錯',
+    ok: '確定',
+  },
+  errorMessage: {
+    answerRequired: '回覆不能為空',
+    queryRequired: '提問不能為空',
+  },
+  viewModal: {
+    annotatedResponse: '標註回覆',
+    hitHistory: '命中歷史',
+    hit: '次命中',
+    hits: '次命中',
+    noHitHistory: '沒有命中歷史',
+  },
+  hitHistoryTable: {
+    question: '問題',
+    query: '提問',
+    match: '匹配',
+    response: '回覆',
+    source: '來源',
+    score: '分數',
+    time: '時間',
+  },
+  initSetup: {
+    title: '標註回覆初始設定',
+    configTitle: '標註回覆設定',
+    confirmBtn: '儲存並啟用',
+    configConfirmBtn: '儲存',
+  },
+  embeddingModelSwitchTip: '標註文字向量化模型,切換模型會重新嵌入,產生額外費用消耗',
+}
+
+export default translation

+ 83 - 0
web/i18n/zh-Hant/app-api.ts

@@ -0,0 +1,83 @@
+const translation = {
+  apiServer: 'API 伺服器',
+  apiKey: 'API 金鑰',
+  status: '狀態',
+  disabled: '已停用',
+  ok: '執行中',
+  copy: '複製',
+  copied: '已複製',
+  play: '播放',
+  pause: '暫停',
+  playing: '播放中',
+  loading: '載入中',
+  merMaind: {
+    rerender: '重新渲染',
+  },
+  never: '從未',
+  apiKeyModal: {
+    apiSecretKey: 'API 金鑰',
+    apiSecretKeyTips: '如果不想你的 API 被濫用,請保護好你的 API Key :) 最佳實踐是避免在前端程式碼中明文引用。',
+    createNewSecretKey: '建立金鑰',
+    secretKey: '金鑰',
+    created: '建立時間',
+    lastUsed: '最後使用',
+    generateTips: '請將此金鑰儲存在安全且可訪問的地方。',
+  },
+  actionMsg: {
+    deleteConfirmTitle: '刪除此金鑰?',
+    deleteConfirmTips: '刪除金鑰無法撤銷,正在使用中的應用會受影響。',
+    ok: '好的',
+  },
+  completionMode: {
+    title: '文字生成型應用 API',
+    info: '可用於生成高質量文字的應用,例如生成文章、摘要、翻譯等,透過呼叫 completion-messages 介面,傳送使用者輸入得到生成文字結果。用於生成文字的模型引數和提示詞模版取決於開發者在 Dify 提示詞編排頁的設定。',
+    createCompletionApi: '建立文字補全訊息',
+    createCompletionApiTip: '建立文字補全訊息,支援一問一答模式。',
+    inputsTips: '(選填)以鍵值對方式提供使用者輸入欄位,與提示詞編排中的變數對應。Key 為變數名稱,Value 是引數值。如果欄位型別為 Select,傳入的 Value 需為預設選項之一。',
+    queryTips: '使用者輸入的文字正文。',
+    blocking: 'blocking 阻塞型,等待執行完畢後返回結果。(請求若流程較長可能會被中斷)',
+    streaming: 'streaming 流式返回。基於 SSE(**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**)實現流式返回。',
+    messageFeedbackApi: '訊息反饋(點贊)',
+    messageFeedbackApiTip: '代表終端使用者對返回訊息進行評價,可以點贊與點踩,該資料將在“日誌與標註”頁中可見,並用於後續的模型微調。',
+    messageIDTip: '訊息 ID',
+    ratingTip: 'like 或 dislike, 空值為撤銷',
+    parametersApi: '獲取應用配置資訊',
+    parametersApiTip: '獲取已配置的 Input 引數,包括變數名、欄位名稱、型別與預設值。通常用於客戶端載入後顯示這些欄位的表單或填入預設值。',
+  },
+  chatMode: {
+    title: '對話型應用 API',
+    info: '可用於大部分場景的對話型應用,採用一問一答模式與使用者持續對話。要開始一個對話請呼叫 chat-messages 介面,透過繼續傳入返回的 conversation_id 可持續保持該會話。',
+    createChatApi: '傳送對話訊息',
+    createChatApiTip: '建立會話訊息,或基於此前的對話繼續傳送訊息。',
+    inputsTips: '(選填)以鍵值對方式提供使用者輸入欄位,與提示詞編排中的變數對應。Key 為變數名稱,Value 是引數值。如果欄位型別為 Select,傳入的 Value 需為預設選項之一。',
+    queryTips: ' 使用者輸入/提問內容',
+    blocking: 'blocking 阻塞型,等待執行完畢後返回結果。(請求若流程較長可能會被中斷)',
+    streaming: 'streaming 流式返回。基於 SSE(**[Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events/Using_server-sent_events)**)實現流式返回。',
+    conversationIdTip: '(選填)會話識別符號,首次對話可為空,如果要繼續對話請傳入上下文返回的 conversation_id',
+    messageFeedbackApi: '訊息反饋(點贊)',
+    messageFeedbackApiTip: '代表終端使用者對返回訊息進行評價,可以點贊與點踩,該資料將在“日誌與標註”頁中可見,並用於後續的模型微調。',
+    messageIDTip: '訊息 ID',
+    ratingTip: 'like 或 dislike, 空值為撤銷',
+    chatMsgHistoryApi: '獲取會話歷史訊息',
+    chatMsgHistoryApiTip: '滾動載入形式返回歷史聊天記錄,第一頁返回最新 `limit` 條,即:倒序返回。',
+    chatMsgHistoryConversationIdTip: '會話 ID',
+    chatMsgHistoryFirstId: '當前頁第一條聊天記錄的 ID,預設 none',
+    chatMsgHistoryLimit: '一次請求返回多少條聊天記錄',
+    conversationsListApi: '獲取會話列表',
+    conversationsListApiTip: '獲取當前使用者的會話列表,預設返回最近的 20 條。',
+    conversationsListFirstIdTip: ' 當前頁最前面一條記錄的 ID,預設 none',
+    conversationsListLimitTip: '一次請求返回多少條記錄',
+    conversationRenamingApi: '會話重新命名',
+    conversationRenamingApiTip: '對會話進行重新命名,會話名稱用於顯示在支援多會話的客戶端上。',
+    conversationRenamingNameTip: '新的名稱',
+    parametersApi: '獲取應用配置資訊',
+    parametersApiTip: '獲取已配置的 Input 引數,包括變數名、欄位名稱、型別與預設值。通常用於客戶端載入後顯示這些欄位的表單或填入預設值。',
+  },
+  develop: {
+    requestBody: 'Request Body',
+    pathParams: 'Path Params',
+    query: 'Query',
+  },
+}
+
+export default translation

+ 418 - 0
web/i18n/zh-Hant/app-debug.ts

@@ -0,0 +1,418 @@
+const translation = {
+  pageTitle: {
+    line1: '提示詞',
+    line2: '編排',
+  },
+  orchestrate: '編排',
+  promptMode: {
+    simple: '切換到專家模式以編輯完整的提示詞',
+    advanced: '專家模式',
+    switchBack: '返回簡易模式',
+    advancedWarning: {
+      title: '您已切換到專家模式,一旦修改提示詞,將無法返回簡易模式。',
+      description: '在專家模式下,您可以編輯完整的提示詞。',
+      learnMore: '瞭解更多',
+      ok: '確定',
+    },
+    operation: {
+      addMessage: '新增訊息',
+    },
+    contextMissing: '上下文內容塊缺失,提示詞的有效性可能不好。',
+  },
+  operation: {
+    applyConfig: '釋出',
+    resetConfig: '重置',
+    debugConfig: '除錯',
+    addFeature: '新增功能',
+    automatic: '自動編排',
+    stopResponding: '停止響應',
+    agree: '贊同',
+    disagree: '反對',
+    cancelAgree: '取消贊同',
+    cancelDisagree: '取消反對',
+    userAction: '使用者表示',
+  },
+  notSetAPIKey: {
+    title: 'LLM 提供者的金鑰未設定',
+    trailFinished: '試用已結束',
+    description: '在除錯之前需要設定 LLM 提供者的金鑰。',
+    settingBtn: '去設定',
+  },
+  trailUseGPT4Info: {
+    title: '當前不支援使用 gpt-4',
+    description: '使用 gpt-4,請設定 API Key',
+  },
+  feature: {
+    groupChat: {
+      title: '聊天增強',
+      description: '為聊天型應用新增預對話設定,可以提升使用者體驗。',
+    },
+    groupExperience: {
+      title: '體驗增強',
+    },
+    conversationOpener: {
+      title: '對話開場白',
+      description: '在對話型應用中,讓 AI 主動說第一段話可以拉近與使用者間的距離。',
+    },
+    suggestedQuestionsAfterAnswer: {
+      title: '下一步問題建議',
+      description: '設定下一步問題建議可以讓使用者更好的對話。',
+      resDes: '回答結束後系統會給出 3 個建議',
+      tryToAsk: '試著問問',
+    },
+    moreLikeThis: {
+      title: '更多類似的',
+      description: '一次生成多條文字,可在此基礎上編輯並繼續生成',
+      generateNumTip: '每次生成數',
+      tip: '使用此功能將會額外消耗 tokens',
+    },
+    speechToText: {
+      title: '語音轉文字',
+      description: '啟用後,您可以使用語音輸入。',
+      resDes: '語音輸入已啟用',
+    },
+    textToSpeech: {
+      title: '文字轉語音',
+      description: '啟用後,文字可以轉換成語音。',
+      resDes: '文字轉音訊已啟用',
+    },
+    citation: {
+      title: '引用和歸屬',
+      description: '啟用後,顯示源文件和生成內容的歸屬部分。',
+      resDes: '引用和歸屬已啟用',
+    },
+    annotation: {
+      title: '標註回覆',
+      description: '啟用後,將標註使用者的回覆,以便在使用者重複提問時快速響應。',
+      resDes: '標註回覆已啟用',
+      scoreThreshold: {
+        title: '分數閾值',
+        description: '用於設定標註回覆的匹配相似度閾值。',
+        easyMatch: '容易匹配',
+        accurateMatch: '精準匹配',
+      },
+      matchVariable: {
+        title: '匹配變數',
+        choosePlaceholder: '請選擇變數',
+      },
+      cacheManagement: '標註管理',
+      cached: '已標註',
+      remove: '移除',
+      removeConfirm: '刪除這個標註?',
+      add: '新增標註',
+      edit: '編輯標註',
+    },
+    dataSet: {
+      title: '上下文',
+      noData: '您可以匯入知識庫作為上下文',
+      words: '詞',
+      textBlocks: '文字塊',
+      selectTitle: '選擇引用知識庫',
+      selected: '個知識庫被選中',
+      noDataSet: '未找到知識庫',
+      toCreate: '去建立',
+      notSupportSelectMulti: '目前只支援引用一個知識庫',
+      queryVariable: {
+        title: '查詢變數',
+        tip: '該變數將用作上下文檢索的查詢輸入,獲取與該變數的輸入相關的上下文資訊。',
+        choosePlaceholder: '請選擇變數',
+        noVar: '沒有變數',
+        noVarTip: '請建立變數',
+        unableToQueryDataSet: '無法查詢知識庫',
+        unableToQueryDataSetTip: '無法成功查詢知識庫,請在上下文部分選擇一個上下文查詢變數。',
+        ok: '好的',
+        contextVarNotEmpty: '上下文查詢變數不能為空',
+        deleteContextVarTitle: '刪除變數“{{varName}}”?',
+        deleteContextVarTip: '該變數已被設定為上下文查詢變數,刪除該變數將影響知識庫的正常使用。 如果您仍需要刪除它,請在上下文部分中重新選擇它。',
+      },
+    },
+    tools: {
+      title: '工具',
+      tips: '工具提供了一個標準的 API 呼叫方式,將使用者輸入或變數作為 API 的請求引數,用於查詢外部資料作為上下文。',
+      toolsInUse: '{{count}} 工具使用中',
+      modal: {
+        title: '工具',
+        toolType: {
+          title: '工具型別',
+          placeholder: '請選擇工具型別',
+        },
+        name: {
+          title: '名稱',
+          placeholder: '請填寫名稱',
+        },
+        variableName: {
+          title: '變數名稱',
+          placeholder: '請填寫變數名稱',
+        },
+      },
+    },
+    conversationHistory: {
+      title: '對話歷史',
+      description: '設定對話角色的字首名稱',
+      tip: '對話歷史未啟用,請在上面的提示中新增<histories>。',
+      learnMore: '瞭解更多',
+      editModal: {
+        title: '編輯對話角色名稱',
+        userPrefix: '使用者字首',
+        assistantPrefix: '助手字首',
+      },
+    },
+    toolbox: {
+      title: '工具箱',
+    },
+    moderation: {
+      title: '內容審查',
+      description: '您可以呼叫審查 API 或者維護敏感詞庫來使模型更安全地輸出。',
+      allEnabled: '審查輸入/審查輸出 內容已啟用',
+      inputEnabled: '審查輸入內容已啟用',
+      outputEnabled: '審查輸出內容已啟用',
+      modal: {
+        title: '內容審查設定',
+        provider: {
+          title: '類別',
+          openai: 'OpenAI Moderation',
+          openaiTip: {
+            prefix: 'OpenAI Moderation 需要在',
+            suffix: '中配置 OpenAI API 金鑰。',
+          },
+          keywords: '關鍵詞',
+        },
+        keywords: {
+          tip: '每行一個,用換行符分隔。每行最多 100 個字元。',
+          placeholder: '每行一個,用換行符分隔',
+          line: '行',
+        },
+        content: {
+          input: '審查輸入內容',
+          output: '審查輸出內容',
+          preset: '預設回覆',
+          placeholder: '這裡預設回覆內容',
+          condition: '審查輸入內容和審查輸出內容至少啟用一項',
+          fromApi: '預設回覆透過 API 返回',
+          errorMessage: '預設回覆不能為空',
+          supportMarkdown: '支援 Markdown',
+        },
+        openaiNotConfig: {
+          before: 'OpenAI 內容審查需要在',
+          after: '中配置 OpenAI API 金鑰。',
+        },
+      },
+    },
+  },
+  automatic: {
+    title: '自動編排',
+    description: '描述您的場景,Dify 將為您編排一個應用。',
+    intendedAudience: '目標使用者是誰?',
+    intendedAudiencePlaceHolder: '例如:學生',
+    solveProblem: '希望 AI 為他們解決什麼問題?',
+    solveProblemPlaceHolder: '例如:評估學業水平',
+    generate: '生成',
+    audiencesRequired: '目標使用者必填',
+    problemRequired: '解決問題必填',
+    resTitle: '我們為您編排了以下應用程式',
+    apply: '應用',
+    noData: '在左側描述您的用例,編排預覽將在此處顯示。',
+    loading: '為您編排應用程式中…',
+    overwriteTitle: '覆蓋現有配置?',
+    overwriteMessage: '應用此編排將覆蓋現有配置。',
+  },
+  resetConfig: {
+    title: '確認重置?',
+    message: '重置將丟失當前頁面所有修改,恢復至上次釋出時的配置',
+  },
+  errorMessage: {
+    nameOfKeyRequired: '變數 {{key}} 對應的名稱必填',
+    valueOfVarRequired: '{{key}}必填',
+    queryRequired: '主要文字必填',
+    waitForResponse: '請等待上條資訊響應完成',
+    waitForBatchResponse: '請等待批次任務完成',
+    notSelectModel: '請選擇模型',
+    waitForImgUpload: '請等待圖片上傳完成',
+  },
+  chatSubTitle: '提示詞',
+  completionSubTitle: '字首提示詞',
+  promptTip:
+    '提示詞用於對 AI 的回覆做出一系列指令和約束。可插入表單變數,例如 {{input}}。這段提示詞不會被終端使用者所看到。',
+  formattingChangedTitle: '編排已改變',
+  formattingChangedText: '修改編排將重置除錯區域,確定嗎?',
+  variableTitle: '變數',
+  notSetVar: '變數能使使用者輸入表單引入提示詞或開場白,你可以試試在提示詞中輸入 {{input}}',
+  variableTip:
+    '變數將以表單形式讓使用者在對話前填寫,使用者填寫的表單內容將自動替換提示詞中的變數。',
+  autoAddVar: '提示詞中引用了未定義的變數,是否自動新增到使用者輸入表單中?',
+  variableTable: {
+    key: '變數 Key',
+    name: '欄位名稱',
+    optional: '可選',
+    type: '型別',
+    action: '操作',
+    typeString: '文字',
+    typeSelect: '下拉選項',
+  },
+  varKeyError: {
+    canNoBeEmpty: '變數不能為空',
+    tooLong: '變數: {{key}} 長度太長。不能超過 30 個字元',
+    notValid: '變數: {{key}} 非法。只能包含英文字元,數字和下劃線',
+    notStartWithNumber: '變數: {{key}} 不能以數字開頭',
+    keyAlreadyExists: '變數:{{key}} 已存在',
+  },
+  otherError: {
+    promptNoBeEmpty: '提示詞不能為空',
+    historyNoBeEmpty: '提示詞中必須設定對話歷史',
+    queryNoBeEmpty: '提示詞中必須設定查詢內容',
+  },
+  variableConig: {
+    'addModalTitle': '新增變數',
+    'editModalTitle': '編輯變數',
+    'description': '設定變數 {{varName}}',
+    'fieldType': '欄位型別',
+    'string': '文字',
+    'text-input': '文字',
+    'paragraph': '段落',
+    'select': '下拉選項',
+    'number': '數字',
+    'notSet': '未設定,在 Prompt 中輸入 {{input}} 試試',
+    'stringTitle': '文字框設定',
+    'maxLength': '最大長度',
+    'options': '選項',
+    'addOption': '新增選項',
+    'apiBasedVar': '基於 API 的變數',
+    'varName': '變數名稱',
+    'inputPlaceholder': '請輸入',
+    'labelName': '顯示名稱',
+    'required': '必填',
+    'errorMsg': {
+      varNameRequired: '變數名稱必填',
+      labelNameRequired: '顯示名稱必填',
+      varNameCanBeRepeat: '變數名稱不能重複',
+      atLeastOneOption: '至少需要一個選項',
+      optionRepeat: '選項不能重複',
+    },
+  },
+  vision: {
+    name: '視覺',
+    description: '開啟視覺功能將允許模型輸入圖片,並根據影象內容的理解回答使用者問題',
+    settings: '設定',
+    visionSettings: {
+      title: '視覺設定',
+      resolution: '解析度',
+      resolutionTooltip: `低解析度模式將使模型接收影象的低解析度版本,尺寸為512 x 512,並使用65 Tokens 來表示影象。這樣可以使API更快地返回響應,並在不需要高細節的用例中消耗更少的輸入。
+      \n
+      高解析度模式將首先允許模型檢視低解析度影象,然後根據輸入影象的大小建立512畫素的詳細裁剪影象。每個詳細裁剪影象使用兩倍的預算總共為129 Tokens。`,
+      high: '高',
+      low: '低',
+      uploadMethod: '上傳方式',
+      both: '兩者',
+      localUpload: '本地上傳',
+      url: 'URL',
+      uploadLimit: '上傳數量限制',
+    },
+  },
+  voice: {
+    name: '音色',
+    defaultDisplay: '預設音色',
+    description: '文字轉語音音色設定',
+    settings: '設定',
+    voiceSettings: {
+      title: '音色設定',
+      language: '語言',
+      resolutionTooltip: '文字轉語音音色支援語言。',
+      voice: '音色',
+    },
+  },
+  openingStatement: {
+    title: '對話開場白',
+    add: '新增開場白',
+    writeOpner: '編寫開場白',
+    placeholder: '在這裡寫下你的開場白,你可以使用變數,嘗試輸入 {{variable}}。',
+    openingQuestion: '開場問題',
+    noDataPlaceHolder:
+      '在對話型應用中,讓 AI 主動說第一段話可以拉近與使用者間的距離。',
+    varTip: '你可以使用變數, 試試輸入 {{variable}}',
+    tooShort: '對話前提示詞至少 20 字才能生成開場白',
+    notIncludeKey: '字首提示詞中不包含變數 {{key}}。請在字首提示詞中新增該變數',
+  },
+  modelConfig: {
+    model: '語言模型',
+    setTone: '模型設定',
+    title: '模型及引數',
+    modeType: {
+      chat: '對話型',
+      completion: '補全型',
+    },
+  },
+  inputs: {
+    title: '除錯與預覽',
+    noPrompt: '嘗試在對話前提示框中編寫一些提示詞',
+    userInputField: '使用者輸入',
+    noVar: '填入變數的值,每次啟動新會話時該變數將自動替換提示詞中的變數。',
+    chatVarTip: '填入變數的值,該值將在每次開啟一個新會話時自動替換到提示詞中',
+    completionVarTip: '填入變數的值,該值將在每次提交問題時自動替換到提示詞中',
+    previewTitle: '提示詞預覽',
+    queryTitle: '查詢內容',
+    queryPlaceholder: '請輸入文字內容',
+    run: '執行',
+  },
+  result: '結果',
+  datasetConfig: {
+    settingTitle: '召回設定',
+    knowledgeTip: '點選 “+” 按鈕新增知識庫',
+    retrieveOneWay: {
+      title: 'N選1召回',
+      description: '根據使用者意圖和知識庫描述,由 Agent 自主判斷選擇最匹配的單個知識庫來查詢相關文字,適合知識庫區分度大且知識庫數量偏少的應用。',
+    },
+    retrieveMultiWay: {
+      title: '多路召回',
+      description: '根據使用者意圖同時匹配所有知識庫,從多路知識庫查詢相關文字片段,經過重排序步驟,從多路查詢結果中選擇匹配使用者問題的最佳結果,需配置 Rerank 模型 API。',
+    },
+    rerankModelRequired: '請選擇 Rerank 模型',
+    params: '引數設定',
+    top_k: 'Top K',
+    top_kTip: '用於篩選與使用者問題相似度最高的文字片段。系統同時會根據選用模型上下文視窗大小動態調整分段數量。',
+    score_threshold: 'Score 閾值',
+    score_thresholdTip: '用於設定文字片段篩選的相似度閾值。',
+    retrieveChangeTip: '修改索引模式和檢索模式可能會影響與該知識庫關聯的應用程式。',
+  },
+  debugAsSingleModel: '單一模型進行除錯',
+  debugAsMultipleModel: '多個模型進行除錯',
+  duplicateModel: '複製模型',
+  publishAs: '釋出為',
+  assistantType: {
+    name: '助手型別',
+    chatAssistant: {
+      name: '基礎助手',
+      description: '基於 LLM 構建一個聊天型助手',
+    },
+    agentAssistant: {
+      name: '智慧助手',
+      description: '構建一個智慧助手,他可以自主選擇工具完成你設定的任務',
+    },
+  },
+  agent: {
+    agentMode: 'Agent Mode',
+    agentModeDes: '設定代理的推理模式型別',
+    agentModeType: {
+      ReACT: 'ReAct',
+      functionCall: 'Function Calling',
+    },
+    setting: {
+      name: 'Agent 設定',
+      description: '智慧助手設定允許設定代理模式和內建提示等高階功能,僅在代理型別中可用。',
+      maximumIterations: {
+        name: '最大迭代次數',
+        description: '限制代理型助手執行迭代的次數',
+      },
+    },
+    buildInPrompt: '內建提示詞',
+    firstPrompt: '第一次提示詞',
+    nextIteration: '下一次迭代',
+    promptPlaceholder: '在這裡寫下您的提示詞',
+    tools: {
+      name: '工具',
+      description: '使用工具可以擴充套件代理的能力,比如搜尋網際網路或科學計算',
+      enabled: '啟用',
+    },
+  },
+}
+
+export default translation

+ 91 - 0
web/i18n/zh-Hant/app-log.ts

@@ -0,0 +1,91 @@
+const translation = {
+  title: '日誌',
+  description: '日誌記錄了應用的執行情況,包括使用者的輸入和 AI 的回覆。',
+  dateTimeFormat: 'YYYY-MM-DD HH:mm',
+  table: {
+    header: {
+      time: '時間',
+      endUser: '使用者',
+      input: '輸入',
+      output: '輸出',
+      summary: '標題',
+      messageCount: '訊息數',
+      userRate: '使用者反饋',
+      adminRate: '管理員反饋',
+      startTime: '開始時間',
+      status: '狀態',
+      runtime: '執行時間',
+      tokens: 'TOKENS',
+      user: '使用者',
+      version: '版本',
+    },
+    pagination: {
+      previous: '上一頁',
+      next: '下一頁',
+    },
+    empty: {
+      noChat: '未開始的對話',
+      noOutput: '無輸出',
+      element: {
+        title: '這裡有人嗎',
+        content: '在這裡觀測和標註終端使用者和 AI 應用程式之間的互動,以不斷提高 AI 的準確性。您可以<testLink>試試</testLink> WebApp 或<shareLink>分享</shareLink>出去,然後返回此頁面。',
+      },
+    },
+  },
+  detail: {
+    time: '時間',
+    conversationId: '對話 ID',
+    promptTemplate: '字首提示詞',
+    promptTemplateBeforeChat: '對話前提示詞 · 以系統訊息提交',
+    annotationTip: '{{user}} 標記的改進回覆',
+    timeConsuming: '耗時',
+    second: ' 秒',
+    tokenCost: '花費 Token',
+    loading: '載入中',
+    operation: {
+      like: '贊同',
+      dislike: '反對',
+      addAnnotation: '標記改進回覆',
+      editAnnotation: '編輯改進回覆',
+      annotationPlaceholder: '輸入你希望 AI 回覆的預期答案,這在今後可用於模型微調,持續改進文字生成質量。',
+    },
+    variables: '變數',
+    uploadImages: '上傳的圖片',
+  },
+  filter: {
+    period: {
+      today: '今天',
+      last7days: '過去 7 天',
+      last4weeks: '過去 4 周',
+      last3months: '過去 3 月',
+      last12months: '過去 12 月',
+      monthToDate: '本月至今',
+      quarterToDate: '本季度至今',
+      yearToDate: '本年至今',
+      allTime: '所有時間',
+    },
+    annotation: {
+      all: '全部',
+      annotated: '已標註改進({{count}} 項)',
+      not_annotated: '未標註',
+    },
+  },
+  workflowTitle: '日誌',
+  workflowSubtitle: '日誌記錄了應用的執行情況',
+  runDetail: {
+    title: '對話日誌',
+    workflowTitle: '日誌詳情',
+  },
+  promptLog: 'Prompt 日誌',
+  agentLog: 'Agent 日誌',
+  viewLog: '檢視日誌',
+  agentLogDetail: {
+    agentMode: 'Agent 模式',
+    toolUsed: '使用工具',
+    iterations: '迭代次數',
+    iteration: '迭代',
+    finalProcessing: '最終處理',
+  },
+}
+
+export default translation

+ 143 - 0
web/i18n/zh-Hant/app-overview.ts

@@ -0,0 +1,143 @@
+const translation = {
+  welcome: {
+    firstStepTip: '開始之前,',
+    enterKeyTip: '請先在下方輸入你的 OpenAI API Key',
+    getKeyTip: '從 OpenAI 獲取你的 API Key',
+    placeholder: '你的 OpenAI API Key(例如 sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: '您正在使用 {{providerName}} 的試用配額。',
+        description: '試用配額僅供您測試使用。 在試用配額用完之前,請自行設定模型提供商或購買額外配額。',
+      },
+      exhausted: {
+        title: '您的試用額度已用完,請設定您的APIKey。',
+        description: '您的試用配額已用完。 請設定您自己的模型提供商或購買額外配額。',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: '首先,',
+        row2: '設定您的模型提供商。',
+      },
+    },
+    callTimes: '呼叫次數',
+    usedToken: '使用 Tokens',
+    setAPIBtn: '設定模型提供商',
+    tryCloud: '或者嘗試使用 Dify 的雲版本並使用試用配額',
+  },
+  overview: {
+    title: '概覽',
+    appInfo: {
+      explanation: '開箱即用的 AI WebApp',
+      accessibleAddress: '公開訪問 URL',
+      preview: '預覽',
+      regenerate: '重新生成',
+      preUseReminder: '使用前請先開啟開關',
+      settings: {
+        entry: '設定',
+        title: 'WebApp 設定',
+        webName: 'WebApp 名稱',
+        webDesc: 'WebApp 描述',
+        webDescTip: '以下文字將展示在客戶端中,對應用進行說明和使用上的基本引導',
+        webDescPlaceholder: '請輸入 WebApp 的描述',
+        language: '語言',
+        more: {
+          entry: '展示更多設定',
+          copyright: '版權',
+          copyRightPlaceholder: '請輸入作者或組織名稱',
+          privacyPolicy: '隱私政策',
+          privacyPolicyPlaceholder: '請輸入隱私政策連結',
+          privacyPolicyTip: '幫助訪問者瞭解該應用收集的資料,可參考 Dify 的<privacyPolicyLink>隱私政策</privacyPolicyLink>。',
+        },
+      },
+      embedded: {
+        entry: '嵌入',
+        title: '嵌入到網站中',
+        explanation: '選擇一種方式將聊天應用嵌入到你的網站中',
+        iframe: '將以下 iframe 嵌入到你的網站中的目標位置',
+        scripts: '將以下程式碼嵌入到你的網站中',
+        chromePlugin: '安裝 Dify Chrome 瀏覽器擴充套件',
+        copied: '已複製',
+        copy: '複製',
+      },
+      qrcode: {
+        title: '二維碼分享',
+        scan: '掃碼分享應用',
+        download: '下載二維碼',
+      },
+      customize: {
+        way: '方法',
+        entry: '定製化',
+        title: '定製化 AI WebApp',
+        explanation: '你可以定製化 Web App 前端以符合你的情景與風格需求',
+        way1: {
+          name: 'Fork 客戶端程式碼修改後部署到 Vercel(推薦)',
+          step1: 'Fork 客戶端程式碼並修改',
+          step1Tip: '點選此處 Fork 原始碼到你的 GitHub 中,然後修改程式碼',
+          step1Operation: 'Dify-WebClient',
+          step2: '部署到 Vercel 中',
+          step2Tip: '點選此處將倉庫匯入到 Vercel 中部署',
+          step2Operation: '匯入倉庫',
+          step3: '配置環境變數',
+          step3Tip: '在 Vecel 環境變數中新增以下環境變數',
+        },
+        way2: {
+          name: '編寫客戶端呼叫 API 並部署到伺服器中',
+          operation: '檢視文件',
+        },
+      },
+    },
+    apiInfo: {
+      title: '後端服務 API',
+      explanation: '可整合至你的應用的後端即服務',
+      accessibleAddress: 'API 訪問憑據',
+      doc: '查閱 API 文件',
+    },
+    status: {
+      running: '執行中',
+      disable: '已停用',
+    },
+  },
+  analysis: {
+    title: '分析',
+    ms: '毫秒',
+    tokenPS: 'Token/秒',
+    totalMessages: {
+      title: '全部訊息數',
+      explanation: '反映 AI 每天的互動總次數,每回答使用者一個問題算一條 Message。提示詞編排和除錯的訊息不計入。',
+    },
+    activeUsers: {
+      title: '活躍使用者數',
+      explanation: '與 AI 有效互動,即有一問一答以上的唯一使用者數。提示詞編排和除錯的會話不計入。',
+    },
+    tokenUsage: {
+      title: '費用消耗',
+      explanation: '反映每日該應用請求語言模型的 Tokens 花費,用於成本控制。',
+      consumed: '耗費',
+    },
+    avgSessionInteractions: {
+      title: '平均會話互動數',
+      explanation: '反應每個會話使用者的持續溝通次數,如果使用者與 AI 問答了 10 輪,即為 10。該指標反映了使用者粘性。僅在對話型應用提供。',
+    },
+    avgUserInteractions: {
+      title: '平均使用者呼叫次數',
+      explanation: '反應每天使用者的使用次數。該指標反映了使用者粘性。',
+    },
+    userSatisfactionRate: {
+      title: '使用者滿意度',
+      explanation: '每 1000 條訊息的點贊數。反應了使用者對回答十分滿意的比例。',
+    },
+    avgResponseTime: {
+      title: '平均響應時間',
+      explanation: '衡量 AI 應用處理和回覆使用者請求所花費的平均時間,單位為毫秒,反映效能和使用者體驗。僅在文字型應用提供。',
+    },
+    tps: {
+      title: 'Token 輸出速度',
+      explanation: '衡量 LLM 的效能。統計 LLM 從請求開始到輸出完畢這段期間的 Tokens 輸出速度。',
+    },
+  },
+}
+
+export default translation

+ 89 - 0
web/i18n/zh-Hant/app.ts

@@ -0,0 +1,89 @@
+const translation = {
+  createApp: '建立應用',
+  types: {
+    all: '全部',
+    chatbot: '聊天助手',
+    agent: 'Agent',
+    workflow: '工作流',
+    completion: '文字生成',
+  },
+  duplicate: '複製',
+  duplicateTitle: '複製應用',
+  export: '匯出 DSL',
+  exportFailed: '匯出 DSL 失敗',
+  importDSL: '匯入 DSL 檔案',
+  createFromConfigFile: '透過 DSL 檔案建立',
+  deleteAppConfirmTitle: '確認刪除應用?',
+  deleteAppConfirmContent:
+    '刪除應用將無法撤銷。使用者將不能訪問你的應用,所有 Prompt 編排配置和日誌均將一併被刪除。',
+  appDeleted: '應用已刪除',
+  appDeleteFailed: '應用刪除失敗',
+  join: '參與社群',
+  communityIntro: '與團隊成員、貢獻者和開發者在不同頻道中交流',
+  roadmap: '產品路線圖',
+  newApp: {
+    startFromBlank: '建立空白應用',
+    startFromTemplate: '從應用模版建立',
+    captionAppType: '想要哪種應用型別?',
+    chatbotDescription: '使用大型語言模型構建基於聊天的助手',
+    completionDescription: '構建一個根據提示生成高質量文字的應用程式,例如生成文章、摘要、翻譯等。',
+    completionWarning: '該型別不久後將不再支援建立',
+    agentDescription: '構建一個智慧Agent,可以自主選擇工具來完成任務',
+    workflowDescription: '以工作流的形式編排生成型應用,提供更多的自定義能力。 它適合有經驗的使用者。',
+    workflowWarning: '正在進行 Beta 測試',
+    chatbotType: '聊天助手編排方法',
+    basic: '基礎編排',
+    basicTip: '新手適用,可以切換成工作流編排',
+    basicFor: '新手適用',
+    basicDescription: '基本編排允許使用簡單的設定編排聊天機器人應用程式,而無需修改內建提示。 它適合初學者。',
+    advanced: '工作流編排',
+    advancedFor: '進階使用者適用',
+    advancedDescription: '工作流編排以工作流的形式編排聊天機器人,提供高度的自定義,包括編輯內建提示的能力。 它適合有經驗的使用者。',
+    captionName: '圖示 & 名稱',
+    appNamePlaceholder: '給你的應用起個名字',
+    captionDescription: '描述',
+    appDescriptionPlaceholder: '輸入應用的描述',
+    useTemplate: '使用該模板',
+    previewDemo: '預覽 Demo',
+    chatApp: '助手',
+    chatAppIntro:
+      '我要構建一個聊天場景的應用。該應用採用一問一答模式與使用者持續對話。',
+    agentAssistant: '新的智慧助手',
+    completeApp: '文字生成應用',
+    completeAppIntro:
+      '我要構建一個根據提示生成高質量文字的應用,例如生成文章、摘要、翻譯等',
+    showTemplates: '我想從範例模板中選擇',
+    hideTemplates: '返回應用型別選擇',
+    Create: '建立',
+    Cancel: '取消',
+    nameNotEmpty: '名稱不能為空',
+    appTemplateNotSelected: '請選擇應用模版',
+    appTypeRequired: '請選擇應用型別',
+    appCreated: '應用已建立',
+    appCreateFailed: '應用建立失敗',
+  },
+  editApp: '編輯資訊',
+  editAppTitle: '編輯應用資訊',
+  editDone: '應用資訊已更新',
+  editFailed: '更新應用資訊失敗',
+  emoji: {
+    ok: '確認',
+    cancel: '取消',
+  },
+  switch: '遷移為工作流編排',
+  switchTipStart: '將為您建立一個使用工作流編排的新應用。新應用將',
+  switchTip: '不能夠',
+  switchTipEnd: '遷移回基礎編排',
+  switchLabel: '新應用建立為',
+  removeOriginal: '刪除原應用',
+  switchStart: '開始遷移',
+  typeSelector: {
+    all: '所有型別',
+    chatbot: '聊天助手',
+    agent: 'Agent',
+    workflow: '工作流',
+    completion: '文字生成',
+  },
+}
+
+export default translation

+ 115 - 0
web/i18n/zh-Hant/billing.ts

@@ -0,0 +1,115 @@
+const translation = {
+  currentPlan: '當前套餐',
+  upgradeBtn: {
+    plain: '升級套餐',
+    encourage: '立即升級',
+    encourageShort: '升級',
+  },
+  viewBilling: '管理賬單及訂閱',
+  buyPermissionDeniedTip: '請聯絡企業管理員訂閱',
+  plansCommon: {
+    title: '選擇適合您的套餐',
+    yearlyTip: '訂閱年度計劃可免費獲得 2個月!',
+    mostPopular: '最受歡迎',
+    planRange: {
+      monthly: '按月',
+      yearly: '按年',
+    },
+    month: '月',
+    year: '年',
+    save: '節省',
+    currentPlan: '當前計劃',
+    contractSales: '聯絡銷售',
+    contractOwner: '聯絡團隊管理員',
+    free: '免費',
+    startForFree: '免費開始',
+    getStartedWith: '開始使用',
+    contactSales: '聯絡銷售',
+    talkToSales: '聯絡銷售',
+    modelProviders: '支援的模型提供商',
+    teamMembers: '團隊成員',
+    buildApps: '構建應用程式數',
+    vectorSpace: '向量空間',
+    vectorSpaceTooltip: '向量空間是 LLMs 理解您的資料所需的長期記憶系統。',
+    vectorSpaceBillingTooltip: '向量儲存是將知識庫向量化處理後為讓 LLMs 理解資料而使用的長期記憶儲存,1MB 大約能滿足1.2 million character 的向量化後資料儲存(以 OpenAI Embedding 模型估算,不同模型計算方式有差異)。在向量化過程中,實際的壓縮或尺寸減小取決於內容的複雜性和冗餘性。',
+    documentsUploadQuota: '文件上傳配額',
+    documentProcessingPriority: '文件處理優先順序',
+    documentProcessingPriorityTip: '如需更高的文件處理優先順序,請升級您的套餐',
+    documentProcessingPriorityUpgrade: '以更快的速度、更高的精度處理更多的資料。',
+    priority: {
+      'standard': '標準',
+      'priority': '優先',
+      'top-priority': '最高優先順序',
+    },
+    logsHistory: '日誌歷史',
+    customTools: '自定義工具',
+    unavailable: '不可用',
+    days: '天',
+    unlimited: '無限制',
+    support: '支援',
+    supportItems: {
+      communityForums: '社群論壇',
+      emailSupport: '電子郵件支援',
+      priorityEmail: '優先電子郵件和聊天支援',
+      logoChange: 'Logo更改',
+      SSOAuthentication: 'SSO 認證',
+      personalizedSupport: '個性化支援',
+      dedicatedAPISupport: '專用 API 支援',
+      customIntegration: '自定義整合和支援',
+      ragAPIRequest: 'RAG API 請求',
+      bulkUpload: '批次上傳文件',
+      agentMode: '代理模式',
+      workflow: '工作流',
+    },
+    comingSoon: '即將推出',
+    member: '成員',
+    memberAfter: '個成員',
+    messageRequest: {
+      title: '訊息額度',
+      tooltip: '為不同方案提供基於 OpenAI 模型的訊息響應額度。',
+    },
+    annotatedResponse: {
+      title: '標註回覆數',
+      tooltip: '標註回覆功能透過人工編輯標註為應用提供了可定製的高質量問答回覆能力',
+    },
+    ragAPIRequestTooltip: '指單獨呼叫 Dify 知識庫資料處理能力的 API。',
+    receiptInfo: '只有團隊所有者和團隊管理員才能訂閱和檢視賬單資訊',
+  },
+  plans: {
+    sandbox: {
+      name: 'Sandbox',
+      description: '200次 GPT 免費試用',
+      includesTitle: '包括:',
+    },
+    professional: {
+      name: 'Professional',
+      description: '讓個人和小團隊能夠以經濟實惠的方式釋放更多能力。',
+      includesTitle: 'Sandbox 計劃中的一切,加上:',
+    },
+    team: {
+      name: 'Team',
+      description: '協作無限制並享受頂級效能。',
+      includesTitle: 'Professional 計劃中的一切,加上:',
+    },
+    enterprise: {
+      name: 'Enterprise',
+      description: '獲得大規模關鍵任務系統的完整功能和支援。',
+      includesTitle: 'Team 計劃中的一切,加上:',
+    },
+  },
+  vectorSpace: {
+    fullTip: '向量空間已滿。',
+    fullSolution: '升級您的套餐以獲得更多空間。',
+  },
+  apps: {
+    fullTipLine1: '升級您的套餐以',
+    fullTipLine2: '構建更多的程式。',
+  },
+  annotatedResponse: {
+    fullTipLine1: '升級您的套餐以',
+    fullTipLine2: '標註更多對話。',
+    quotaTitle: '標註的配額',
+  },
+}
+
+export default translation

+ 527 - 0
web/i18n/zh-Hant/common.ts

@@ -0,0 +1,527 @@
+const translation = {
+  api: {
+    success: '成功',
+    actionSuccess: '操作成功',
+    saved: '已儲存',
+    create: '已建立',
+    remove: '已移除',
+  },
+  operation: {
+    create: '建立',
+    confirm: '確認',
+    cancel: '取消',
+    clear: '清空',
+    save: '儲存',
+    edit: '編輯',
+    add: '新增',
+    added: '已新增',
+    refresh: '重新開始',
+    reset: '重置',
+    search: '搜尋',
+    change: '更改',
+    remove: '移除',
+    send: '傳送',
+    copy: '複製',
+    lineBreak: '換行',
+    sure: '我確定',
+    download: '下載',
+    delete: '刪除',
+    settings: '設定',
+    setup: '設定',
+    getForFree: '免費獲取',
+    reload: '重新整理',
+    ok: '好的',
+    log: '日誌',
+    learnMore: '瞭解更多',
+    params: '引數設定',
+    duplicate: '複製',
+    rename: '重新命名',
+  },
+  placeholder: {
+    input: '請輸入',
+    select: '請選擇',
+  },
+  voice: {
+    language: {
+      zhHans: '中文',
+      enUS: '英語',
+      deDE: '德語',
+      frFR: '法語',
+      esES: '西班牙語',
+      itIT: '義大利語',
+      thTH: '泰語',
+      idID: '印尼語',
+      jaJP: '日語',
+      koKR: '韓語',
+      ptBR: '葡萄牙語',
+      ruRU: '俄語',
+      ukUA: '烏克蘭語',
+    },
+  },
+  unit: {
+    char: '個字元',
+  },
+  actionMsg: {
+    noModification: '暫無修改',
+    modifiedSuccessfully: '修改成功',
+    modifiedUnsuccessfully: '修改失敗',
+    copySuccessfully: '複製成功',
+    generatedSuccessfully: '已重新生成',
+    generatedUnsuccessfully: '生成失敗',
+    paySucceeded: '已支付成功',
+    payCancelled: '已取消支付',
+  },
+  model: {
+    params: {
+      temperature: '隨機性 temperature',
+      temperatureTip:
+        '控制回覆的隨機性。\n值越大,回覆越隨機。\n值越小,回覆越確定或一致。',
+      top_p: '核取樣 top_p',
+      top_pTip:
+        '控制生成多樣性。\n值越大,輸出會包括更多的單詞選項。\n值越小,模型會更集中在高機率的單詞上,輸出更確定但可能缺乏多樣性。\n核取樣和隨機性不建議同時修改。',
+      presence_penalty: '話題新鮮度 presence_penalty',
+      presence_penaltyTip:
+        '控制生成時對上文已存在的話題的偏好程度。\n值越大,越可能使用到新的話題。',
+      frequency_penalty: '頻率懲罰度 frequency_penalty',
+      frequency_penaltyTip:
+        '影響常見與罕見詞彙使用。\n值較大時,傾向於生成不常見的詞彙和表達方式。\n值越小,更傾向於使用常見和普遍接受的詞彙或短語。',
+      max_tokens: '單次回覆限制 max_tokens',
+      max_tokensTip:
+        '用於限制回覆的最大長度,以 token 為單位。\n較大的值可能會限制給提示詞、聊天記錄和知識庫留出的空間。\n建議將其設定在三分之二以下。\ngpt-4-1106-preview、gpt-4-vision-preview 最大長度 (輸入128k,輸出4k)',
+      maxTokenSettingTip: '您設定的最大 tokens 數較大,可能會導致 prompt、使用者問題、知識庫內容沒有 token 空間進行處理,建議設定到 2/3 以下。',
+      setToCurrentModelMaxTokenTip: '最大令牌數更新為當前模型最大的令牌數 {{maxToken}} 的 80%。',
+      stop_sequences: '停止序列 stop_sequences',
+      stop_sequencesTip: '最多四個序列,API 將停止生成更多的 token。返回的文字將不包含停止序列。',
+      stop_sequencesPlaceholder: '輸入序列並按 Tab 鍵',
+    },
+    tone: {
+      Creative: '創意',
+      Balanced: '平衡',
+      Precise: '精確',
+      Custom: '自定義',
+    },
+    addMoreModel: '新增更多模型',
+  },
+  menus: {
+    status: 'beta',
+    explore: '探索',
+    apps: '工作室',
+    plugins: '外掛',
+    pluginsTips: '整合第三方外掛或建立與 ChatGPT 相容的 AI 外掛。',
+    datasets: '知識庫',
+    datasetsTips: '即將到來: 上傳自己的長文字資料,或透過 Webhook 整合自己的資料來源',
+    newApp: '建立應用',
+    newDataset: '建立知識庫',
+    tools: '工具',
+  },
+  userProfile: {
+    settings: '設定',
+    workspace: '工作空間',
+    createWorkspace: '建立工作空間',
+    helpCenter: '幫助文件',
+    roadmapAndFeedback: '使用者反饋',
+    community: '社群',
+    about: '關於',
+    logout: '登出',
+  },
+  settings: {
+    accountGroup: '賬戶',
+    workplaceGroup: '工作空間',
+    account: '我的賬戶',
+    members: '成員',
+    billing: '賬單',
+    integrations: '整合',
+    language: '語言',
+    provider: '模型供應商',
+    dataSource: '資料來源',
+    plugin: '外掛',
+    apiBasedExtension: 'API 擴充套件',
+  },
+  account: {
+    avatar: '頭像',
+    name: '使用者名稱',
+    email: '郵箱',
+    password: '密碼',
+    passwordTip: '如果您不想使用驗證碼登入,可以設定永久密碼',
+    setPassword: '設定密碼',
+    resetPassword: '重置密碼',
+    currentPassword: '原密碼',
+    newPassword: '新密碼',
+    notEqual: '兩個密碼不相同',
+    confirmPassword: '確認密碼',
+    langGeniusAccount: 'Dify 賬號',
+    langGeniusAccountTip: '您的 Dify 賬號和相關的使用者資料。',
+    editName: '編輯名字',
+    showAppLength: '顯示 {{length}} 個應用',
+  },
+  members: {
+    team: '團隊',
+    invite: '新增',
+    name: '姓名',
+    lastActive: '上次活動時間',
+    role: '角色',
+    pending: '待定...',
+    owner: '所有者',
+    admin: '管理員',
+    adminTip: '能夠建立應用程式和管理團隊設定',
+    normal: '成員',
+    normalTip: '只能使用應用程式,不能建立應用程式',
+    inviteTeamMember: '新增團隊成員',
+    inviteTeamMemberTip: '對方在登入後可以訪問你的團隊資料。',
+    email: '郵箱',
+    emailInvalid: '郵箱格式無效',
+    emailPlaceholder: '輸入郵箱',
+    sendInvite: '傳送邀請',
+    invitedAsRole: '邀請為{{role}}使用者',
+    invitationSent: '邀請已傳送',
+    invitationSentTip: '邀請已傳送,對方登入 Dify 後即可訪問你的團隊資料。',
+    invitationLink: '邀請連結',
+    failedinvitationEmails: '邀請以下郵箱失敗',
+    ok: '好的',
+    removeFromTeam: '移除團隊',
+    removeFromTeamTip: '將取消團隊訪問',
+    setAdmin: '設為管理員',
+    setMember: '設為普通成員',
+    disinvite: '取消邀請',
+    deleteMember: '刪除成員',
+    you: '(你)',
+  },
+  integrations: {
+    connected: '登入方式',
+    google: 'Google',
+    googleAccount: 'Google 賬號登入',
+    github: 'GitHub',
+    githubAccount: 'GitHub 賬號登入',
+    connect: '繫結',
+  },
+  language: {
+    displayLanguage: '介面語言',
+    timezone: '時區',
+  },
+  provider: {
+    apiKey: 'API 金鑰',
+    enterYourKey: '輸入你的 API 金鑰',
+    invalidKey: '無效的 OpenAI API 金鑰',
+    validatedError: '校驗失敗:',
+    validating: '驗證金鑰中...',
+    saveFailed: 'API 金鑰儲存失敗',
+    apiKeyExceedBill: '此 API KEY 已沒有可用配額,請閱讀',
+    addKey: '新增 金鑰',
+    comingSoon: '即將推出',
+    editKey: '編輯',
+    invalidApiKey: '無效的 API 金鑰',
+    azure: {
+      apiBase: 'API Base',
+      apiBasePlaceholder: '輸入您的 Azure OpenAI API Base 地址',
+      apiKey: 'API Key',
+      apiKeyPlaceholder: '輸入你的 API 金鑰',
+      helpTip: '瞭解 Azure OpenAI Service',
+    },
+    openaiHosted: {
+      openaiHosted: '託管 OpenAI',
+      onTrial: '體驗',
+      exhausted: '超出限額',
+      desc: '託管 OpenAI 由 Dify 提供的託管 OpenAI 服務,你可以使用 GPT-3.5 等模型,在體驗額度消耗完畢前你需要設定其它模型供應商。',
+      callTimes: '呼叫次數',
+      usedUp: '試用額度已用完,請在下方新增自己的模型供應商',
+      useYourModel: '當前正在使用你自己的模型供應商。',
+      close: '關閉',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Anthropic Claude',
+      onTrial: '體驗',
+      exhausted: '超出限額',
+      desc: '功能強大的模型,擅長執行從複雜對話和創意內容生成到詳細指導的各種任務。',
+      callTimes: '呼叫次數',
+      usedUp: '試用額度已用完,請在下方新增自己的模型供應商',
+      useYourModel: '當前正在使用你自己的模型供應商。',
+      close: '關閉',
+    },
+    anthropic: {
+      using: '嵌入能力正在使用',
+      enableTip: '要啟用 Anthropic 模型,您需要先繫結 OpenAI 或 Azure OpenAI 服務。',
+      notEnabled: '未啟用',
+      keyFrom: '從 Anthropic 獲取您的 API 金鑰',
+    },
+    encrypted: {
+      front: '金鑰將使用 ',
+      back: ' 技術進行加密和儲存。',
+    },
+  },
+  modelProvider: {
+    notConfigured: '系統模型尚未完全配置,部分功能可能無法使用。',
+    systemModelSettings: '系統模型設定',
+    systemModelSettingsLink: '為什麼需要設定系統模型?',
+    selectModel: '選擇您的模型',
+    setupModelFirst: '請先設定您的模型',
+    systemReasoningModel: {
+      key: '系統推理模型',
+      tip: '設定建立應用使用的預設推理模型,以及對話名稱生成、下一步問題建議等功能也會使用該預設推理模型。',
+    },
+    embeddingModel: {
+      key: 'Embedding 模型',
+      tip: '設定知識庫文件嵌入處理的預設模型,檢索和匯入知識庫均使用該Embedding模型進行向量化處理,切換後將導致已匯入的知識庫與問題之間的向量維度不一致,從而導致檢索失敗。為避免檢索失敗,請勿隨意切換該模型。',
+      required: '請選擇 Embedding 模型',
+    },
+    speechToTextModel: {
+      key: '語音轉文字模型',
+      tip: '設定對話中語音轉文字輸入的預設使用模型。',
+    },
+    ttsModel: {
+      key: '文字轉語音模型',
+      tip: '設定對話中文字轉語音輸出的預設使用模型。',
+    },
+    rerankModel: {
+      key: 'Rerank 模型',
+      tip: '重排序模型將根據候選文件列表與使用者問題語義匹配度進行重新排序,從而改進語義排序的結果',
+    },
+    quota: '額度',
+    searchModel: '搜尋模型',
+    noModelFound: '找不到模型 {{model}}',
+    models: '模型列表',
+    showMoreModelProvider: '顯示更多模型提供商',
+    selector: {
+      tip: '該模型已被刪除。請添模型或選擇其他模型。',
+      emptyTip: '無可用模型',
+      emptySetting: '請前往設定進行配置',
+      rerankTip: '請設定 Rerank 模型',
+    },
+    card: {
+      quota: '額度',
+      onTrial: '試用中',
+      paid: '已購買',
+      quotaExhausted: '配額已用完',
+      callTimes: '呼叫次數',
+      tokens: 'Tokens',
+      buyQuota: '購買額度',
+      priorityUse: '優先使用',
+      removeKey: '刪除 API 金鑰',
+      tip: '已付費額度將優先考慮。 試用額度將在付費額度用完後使用。',
+    },
+    item: {
+      deleteDesc: '{{modelName}} 被用作系統推理模型。刪除後部分功能將無法使用。請確認。',
+      freeQuota: '免費額度',
+    },
+    addApiKey: '新增您的 API 金鑰',
+    invalidApiKey: 'Invalid API key',
+    encrypted: {
+      front: '您的金鑰將使用',
+      back: '技術進行加密和儲存。',
+    },
+    freeQuota: {
+      howToEarn: '如何獲取',
+    },
+    addMoreModelProvider: '新增更多模型提供商',
+    addModel: '新增模型',
+    modelsNum: '{{num}} 個模型',
+    showModels: '顯示模型',
+    showModelsNum: '顯示 {{num}} 個模型',
+    collapse: '收起',
+    config: '配置',
+    modelAndParameters: '模型及引數',
+    model: '模型',
+    featureSupported: '支援 {{feature}} 功能',
+    callTimes: '呼叫次數',
+    credits: '訊息額度',
+    buyQuota: '購買額度',
+    getFreeTokens: '獲得免費 Tokens',
+    priorityUsing: '優先使用',
+    deprecated: '已棄用',
+    confirmDelete: '確認刪除?',
+    quotaTip: '剩餘免費額度',
+    loadPresets: '載入預設',
+    parameters: '引數',
+  },
+  dataSource: {
+    add: '新增資料來源',
+    connect: '繫結',
+    notion: {
+      title: 'Notion',
+      description: '使用 Notion 作為知識庫的資料來源。',
+      connectedWorkspace: '已繫結工作空間',
+      addWorkspace: '新增工作空間',
+      connected: '已繫結',
+      disconnected: '未繫結',
+      changeAuthorizedPages: '更改授權頁面',
+      pagesAuthorized: '已授權頁面',
+      sync: '同步',
+      remove: '刪除',
+      selector: {
+        pageSelected: '已選頁面',
+        searchPages: '搜尋頁面...',
+        noSearchResult: '無搜尋結果',
+        addPages: '新增頁面',
+        preview: '預覽',
+      },
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'API Key',
+      apiKeyPlaceholder: '輸入你的 API 金鑰',
+      keyFrom: '從 SerpAPI 帳戶頁面獲取您的 SerpAPI 金鑰',
+    },
+  },
+  apiBasedExtension: {
+    title: 'API 擴充套件提供了一個集中式的 API 管理,在此統一新增 API 配置後,方便在 Dify 上的各類應用中直接使用。',
+    link: '瞭解如何開發您自己的 API 擴充套件。',
+    linkUrl: 'https://docs.dify.ai/v/zh-hans/advanced/api_based_extension',
+    add: '新增 API 擴充套件',
+    selector: {
+      title: 'API 擴充套件',
+      placeholder: '請選擇 API 擴充套件',
+      manage: '管理 API 擴充套件',
+    },
+    modal: {
+      title: '新增 API 擴充套件',
+      editTitle: '編輯 API 擴充套件',
+      name: {
+        title: '名稱',
+        placeholder: '請輸入名稱',
+      },
+      apiEndpoint: {
+        title: 'API Endpoint',
+        placeholder: '請輸入 API endpoint',
+      },
+      apiKey: {
+        title: 'API-key',
+        placeholder: '請輸入 API-key',
+        lengthError: 'API-key 不能少於 5 位',
+      },
+    },
+    type: '型別',
+  },
+  about: {
+    changeLog: '更新日誌',
+    updateNow: '現在更新',
+    nowAvailable: 'Dify {{version}} 現已可用。',
+    latestAvailable: 'Dify {{version}} 已是最新版本。',
+  },
+  appMenus: {
+    overview: '概覽',
+    promptEng: '編排',
+    apiAccess: '訪問 API',
+    logAndAnn: '日誌與標註',
+    logs: '日誌',
+  },
+  environment: {
+    testing: '測試環境',
+    development: '開發環境',
+  },
+  appModes: {
+    completionApp: '文字生成型應用',
+    chatApp: '對話型應用',
+  },
+  datasetMenus: {
+    documents: '文件',
+    hitTesting: '召回測試',
+    settings: '設定',
+    emptyTip: ' 知識庫尚未關聯,請前往應用程式或外掛完成關聯。',
+    viewDoc: '檢視文件',
+    relatedApp: '個關聯應用',
+  },
+  voiceInput: {
+    speaking: '現在講...',
+    converting: '正在轉換為文字...',
+    notAllow: '麥克風未授權',
+  },
+  modelName: {
+    'gpt-3.5-turbo': 'GPT-3.5-Turbo',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
+    'gpt-4': 'GPT-4',
+    'gpt-4-32k': 'GPT-4-32K',
+    'text-davinci-003': 'Text-Davinci-003',
+    'text-embedding-ada-002': 'Text-Embedding-Ada-002',
+    'whisper-1': 'Whisper-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2',
+  },
+  chat: {
+    renameConversation: '重新命名會話',
+    conversationName: '會話名稱',
+    conversationNamePlaceholder: '請輸入會話名稱',
+    conversationNameCanNotEmpty: '會話名稱必填',
+    citation: {
+      title: '引用',
+      linkToDataset: '跳轉至知識庫',
+      characters: '字元:',
+      hitCount: '召回次數:',
+      vectorHash: '向量雜湊:',
+      hitScore: '召回得分:',
+    },
+  },
+  promptEditor: {
+    placeholder: '在這裡寫你的提示詞,輸入\'{\' 插入變數、輸入\'/\' 插入提示內容塊',
+    context: {
+      item: {
+        title: '上下文',
+        desc: '插入上下文模板',
+      },
+      modal: {
+        title: '有 {{num}} 個知識庫在上下文中',
+        add: '新增上下文',
+        footer: '您可以在下面的“上下文”部分中管理上下文。',
+      },
+    },
+    history: {
+      item: {
+        title: '會話歷史',
+        desc: '插入歷史訊息模板',
+      },
+      modal: {
+        title: '示例',
+        user: '你好',
+        assistant: '你好!今天我能為您提供什麼幫助?',
+        edit: '編輯對話角色名稱',
+      },
+    },
+    variable: {
+      item: {
+        title: '變數 & 外部工具',
+        desc: '插入變數和外部工具',
+      },
+      outputToolDisabledItem: {
+        title: '變數',
+        desc: '插入變數',
+      },
+      modal: {
+        add: '新增新變數',
+        addTool: '新增工具',
+      },
+    },
+    query: {
+      item: {
+        title: '查詢內容',
+        desc: '插入使用者查詢模板',
+      },
+    },
+    existed: 'Prompt 中已存在',
+  },
+  imageUploader: {
+    uploadFromComputer: '從本地上傳',
+    uploadFromComputerReadError: '圖片讀取失敗,請重新選擇。',
+    uploadFromComputerUploadError: '圖片上傳失敗,請重新上傳。',
+    uploadFromComputerLimit: '上傳圖片不能超過 {{size}} MB',
+    pasteImageLink: '貼上圖片連結',
+    pasteImageLinkInputPlaceholder: '將影象連結貼上到此處',
+    pasteImageLinkInvalid: '圖片連結無效',
+    imageUpload: '圖片上傳',
+  },
+  tag: {
+    placeholder: '全部標籤',
+    addNew: '建立新標籤',
+    noTag: '沒有標籤',
+    noTagYet: '還沒有標籤',
+    addTag: '新增標籤',
+    editTag: '修改標籤',
+    manageTags: '管理標籤',
+    selectorPlaceholder: '搜尋或者建立',
+    create: '建立',
+    delete: '刪除標籤',
+    deleteTip: '標籤正在使用中,是否刪除?',
+    created: '標籤建立成功',
+    failed: '標籤建立失敗',
+  },
+}
+
+export default translation

+ 30 - 0
web/i18n/zh-Hant/custom.ts

@@ -0,0 +1,30 @@
+const translation = {
+  custom: '定製',
+  upgradeTip: {
+    prefix: '升級您的計劃以',
+    suffix: '定製您的品牌。',
+  },
+  webapp: {
+    title: '定製 WebApp 品牌',
+    removeBrand: '移除 Powered by Dify',
+    changeLogo: '更改 Powered by Brand 圖片',
+    changeLogoTip: 'SVG 或 PNG 格式,最小尺寸為 40x40px',
+  },
+  app: {
+    title: '定製應用品牌',
+    changeLogoTip: 'SVG 或 PNG 格式,最小尺寸為 80x80px',
+  },
+  upload: '上傳',
+  uploading: '上傳中',
+  uploadedFail: '圖片上傳失敗,請重新上傳。',
+  change: '更改',
+  apply: '應用',
+  restore: '恢復預設',
+  customize: {
+    contactUs: '聯絡我們',
+    prefix: '如需在 Dify 內自定義品牌圖示,請',
+    suffix: '升級至企業版。',
+  },
+}
+
+export default translation

+ 130 - 0
web/i18n/zh-Hant/dataset-creation.ts

@@ -0,0 +1,130 @@
+const translation = {
+  steps: {
+    header: {
+      creation: '建立知識庫',
+      update: '上傳檔案',
+    },
+    one: '選擇資料來源',
+    two: '文字分段與清洗',
+    three: '處理並完成',
+  },
+  error: {
+    unavailable: '該知識庫不可用',
+  },
+  stepOne: {
+    filePreview: '檔案預覽',
+    pagePreview: '頁面預覽',
+    dataSourceType: {
+      file: '匯入已有文字',
+      notion: '同步自 Notion 內容',
+      web: '同步自 Web 站點',
+    },
+    uploader: {
+      title: '上傳文字檔案',
+      button: '拖拽檔案至此,或者',
+      browse: '選擇檔案',
+      tip: '已支援 {{supportTypes}},每個檔案不超過 {{size}}MB。',
+      validation: {
+        typeError: '檔案型別不支援',
+        size: '檔案太大了,不能超過 {{size}}MB',
+        count: '暫不支援多個檔案',
+        filesNumber: '批次上傳限制 {{filesNumber}}。',
+      },
+      cancel: '取消',
+      change: '更改檔案',
+      failed: '上傳失敗',
+    },
+    notionSyncTitle: 'Notion 未繫結',
+    notionSyncTip: '同步 Notion 內容前,須先繫結 Notion 空間',
+    connect: '去繫結',
+    button: '下一步',
+    emptyDatasetCreation: '建立一個空知識庫',
+    modal: {
+      title: '建立空知識庫',
+      tip: '空知識庫中還沒有文件,你可以在今後任何時候上傳文件至該知識庫。',
+      input: '知識庫名稱',
+      placeholder: '請輸入知識庫名稱',
+      nameNotEmpty: '名稱不能為空',
+      nameLengthInvaild: '名稱長度不能超過 40 個字元',
+      cancelButton: '取消',
+      confirmButton: '建立',
+      failed: '建立失敗',
+    },
+  },
+  stepTwo: {
+    segmentation: '分段設定',
+    auto: '自動分段與清洗',
+    autoDescription: '自動設定分段規則與預處理規則,如果不瞭解這些引數建議選擇此項',
+    custom: '自定義',
+    customDescription: '自定義分段規則、分段長度以及預處理規則等引數',
+    separator: '分段識別符號',
+    separatorPlaceholder: '例如換行符(\n)或特定的分隔符(如 "***")',
+    maxLength: '分段最大長度',
+    overlap: '分段重疊長度',
+    overlapTip: '設定分段之間的重疊長度可以保留分段之間的語義關係,提升召回效果。建議設定為最大分段長度的10%-25%',
+    overlapCheck: '分段重疊長度不能大於分段最大長度',
+    rules: '文字預處理規則',
+    removeExtraSpaces: '替換掉連續的空格、換行符和製表符',
+    removeUrlEmails: '刪除所有 URL 和電子郵件地址',
+    removeStopwords: '去除停用詞,例如 “a”,“an”,“the” 等',
+    preview: '確認並預覽',
+    reset: '重置',
+    indexMode: '索引方式',
+    qualified: '高質量',
+    recommend: '推薦',
+    qualifiedTip: '呼叫系統預設的嵌入介面進行處理,以在使用者查詢時提供更高的準確度',
+    warning: '請先完成模型供應商的 API KEY 設定。.',
+    click: '前往設定',
+    economical: '經濟',
+    economicalTip: '使用離線的向量引擎、關鍵詞索引等方式,降低了準確度但無需花費 Token',
+    QATitle: '採用 Q&A 分段模式',
+    QATip: '開啟後將會消耗額外的 token',
+    QALanguage: '分段使用',
+    emstimateCost: '執行嵌入預估消耗',
+    emstimateSegment: '預估分段數',
+    segmentCount: '段',
+    calculating: '計算中...',
+    fileSource: '預處理文件',
+    notionSource: '預處理頁面',
+    other: '和其他 ',
+    fileUnit: ' 個檔案',
+    notionUnit: ' 個頁面',
+    previousStep: '上一步',
+    nextStep: '儲存並處理',
+    save: '儲存並處理',
+    cancel: '取消',
+    sideTipTitle: '為什麼要分段和預處理?',
+    sideTipP1: '在處理文字資料時,分段和清洗是兩個重要的預處理步驟。',
+    sideTipP2: '分段的目的是將長文字拆分成較小的段落,以便模型更有效地處理和理解。這有助於提高模型生成的結果的質量和相關性。',
+    sideTipP3: '清洗則是對文字進行預處理,刪除不必要的字元、符號或格式,使知識庫更加乾淨、整潔,便於模型解析。',
+    sideTipP4: '透過對知識庫進行適當的分段和清洗,可以提高模型在實際應用中的表現,從而為使用者提供更準確、更有價值的結果。',
+    previewTitle: '分段預覽',
+    previewTitleButton: '預覽',
+    previewButton: '切換至 Q&A 形式',
+    previewSwitchTipStart: '當前分段預覽是文字模式,切換到 Q&A 模式將會',
+    previewSwitchTipEnd: '消耗額外的 token',
+    characters: '字元',
+    indexSettedTip: '要更改索引方法,請轉到',
+    retrivalSettedTip: '要更改檢索方法,請轉到',
+    datasetSettingLink: '知識庫設定。',
+  },
+  stepThree: {
+    creationTitle: '🎉 知識庫已建立',
+    creationContent: '我們自動為該知識庫起了個名稱,您也可以隨時修改',
+    label: '知識庫名稱',
+    additionTitle: '🎉 文件已上傳',
+    additionP1: '文件已上傳至知識庫:',
+    additionP2: ',你可以在知識庫的文件列表中找到它。',
+    stop: '停止處理',
+    resume: '恢復處理',
+    navTo: '前往文件',
+    sideTipTitle: '接下來做什麼',
+    sideTipContent: '當文件完成索引處理後,知識庫即可整合至應用內作為上下文使用,你可以在提示詞編排頁找到上下文設定。你也可以建立成可獨立使用的 ChatGPT 索引外掛釋出。',
+    modelTitle: '確認停止索引過程嗎?',
+    modelContent: '如果您需要稍後恢復處理,則從停止處繼續。',
+    modelButtonConfirm: '確認停止',
+    modelButtonCancel: '取消',
+  },
+}
+
+export default translation

+ 348 - 0
web/i18n/zh-Hant/dataset-documents.ts

@@ -0,0 +1,348 @@
+const translation = {
+  list: {
+    title: '文件',
+    desc: '知識庫的所有檔案都在這裡顯示,整個知識庫都可以連結到 Dify 引用或透過 Chat 外掛進行索引。',
+    addFile: '新增檔案',
+    addPages: '新增頁面',
+    table: {
+      header: {
+        fileName: '檔名',
+        words: '字元數',
+        hitCount: '召回次數',
+        uploadTime: '上傳時間',
+        status: '狀態',
+        action: '操作',
+      },
+    },
+    action: {
+      uploadFile: '上傳新檔案',
+      settings: '分段設定',
+      addButton: '新增分段',
+      add: '新增新分段',
+      batchAdd: '批次新增',
+      archive: '歸檔',
+      unarchive: '撤銷歸檔',
+      delete: '刪除',
+      enableWarning: '歸檔的檔案無法啟用',
+      sync: '同步',
+    },
+    index: {
+      enable: '啟用中',
+      disable: '禁用中',
+      all: '全部',
+      enableTip: '該檔案可以被索引',
+      disableTip: '該檔案無法被索引',
+    },
+    status: {
+      queuing: '排隊中',
+      indexing: '索引中',
+      paused: '已暫停',
+      error: '錯誤',
+      available: '可用',
+      enabled: '已啟用',
+      disabled: '已禁用',
+      archived: '已歸檔',
+    },
+    empty: {
+      title: '還沒有文件',
+      upload: {
+        tip: '您可以上傳檔案,從網站同步,或者從網路應用程式(如概念、GitHub 等)同步。',
+      },
+      sync: {
+        tip: 'Dify 會定期從您的 Notion 中下載檔案並完成處理。',
+      },
+    },
+    delete: {
+      title: '確定刪除嗎?',
+      content: '如果您需要稍後恢復處理,您將從您離開的地方繼續',
+    },
+    batchModal: {
+      title: '批次新增分段',
+      csvUploadTitle: '將您的 CSV 檔案拖放到此處,或',
+      browse: '選擇檔案',
+      tip: 'CSV 檔案必須符合以下結構:',
+      question: '問題',
+      answer: '回答',
+      contentTitle: '分段內容',
+      content: '內容',
+      template: '下載模板',
+      cancel: '取消',
+      run: '匯入',
+      runError: '批次匯入失敗',
+      processing: '批次處理中',
+      completed: '匯入完成',
+      error: '匯入出錯',
+      ok: '確定',
+    },
+  },
+  metadata: {
+    title: '元資料',
+    desc: '標記文件的元資料允許 AI 及時訪問它們併為使用者公開參考來源。',
+    dateTimeFormat: 'YYYY-MM-DD HH:mm',
+    docTypeSelectTitle: '請選擇一種文件型別',
+    docTypeChangeTitle: '更換文件型別',
+    docTypeSelectWarning: '如果更改文件型別,將不再保留現在填充的元資料',
+    firstMetaAction: '開始',
+    placeholder: {
+      add: '輸入',
+      select: '選擇',
+    },
+    source: {
+      upload_file: '檔案上傳',
+      notion: '從 Notion 同步的文件',
+      github: '從 Github 同步的程式碼',
+    },
+    type: {
+      book: '書籍',
+      webPage: '網頁',
+      paper: '論文',
+      socialMediaPost: '社交媒體帖子',
+      personalDocument: '個人文件',
+      businessDocument: '商務文件',
+      IMChat: 'IM 聊天記錄',
+      wikipediaEntry: '維基百科條目',
+      notion: '從 Notion 同步的文件',
+      github: '從 Github 同步的程式碼',
+      technicalParameters: '技術引數',
+    },
+    field: {
+      processRule: {
+        processDoc: '預處理文件',
+        segmentRule: '分段規則',
+        segmentLength: '分段長度',
+        processClean: '文字預處理與清洗',
+      },
+      book: {
+        title: '標題',
+        language: '語言',
+        author: '作者',
+        publisher: '出版商',
+        publicationDate: '出版日期',
+        ISBN: 'ISBN',
+        category: '類別',
+      },
+      webPage: {
+        title: '標題',
+        url: '網址',
+        language: '語言',
+        authorPublisher: '作者/出版商',
+        publishDate: '釋出日期',
+        topicsKeywords: '主題/關鍵詞',
+        description: '描述',
+      },
+      paper: {
+        title: '標題',
+        language: '語言',
+        author: '作者',
+        publishDate: '釋出日期',
+        journalConferenceName: '期刊/會議名稱',
+        volumeIssuePage: '卷/期/頁碼',
+        DOI: 'DOI',
+        topicsKeywords: '主題/關鍵詞',
+        abstract: '摘要',
+      },
+      socialMediaPost: {
+        platform: '平臺',
+        authorUsername: '作者/使用者名稱',
+        publishDate: '釋出日期',
+        postURL: '帖子網址',
+        topicsTags: '主題/標籤',
+      },
+      personalDocument: {
+        title: '標題',
+        author: '作者',
+        creationDate: '建立日期',
+        lastModifiedDate: '最後修改日期',
+        documentType: '文件型別',
+        tagsCategory: '標籤/類別',
+      },
+      businessDocument: {
+        title: '標題',
+        author: '作者',
+        creationDate: '建立日期',
+        lastModifiedDate: '最後修改日期',
+        documentType: '文件型別',
+        departmentTeam: '部門/團隊',
+      },
+      IMChat: {
+        chatPlatform: '聊天平臺',
+        chatPartiesGroupName: '聊天參與方/群組名稱',
+        participants: '參與者',
+        startDate: '開始日期',
+        endDate: '結束日期',
+        topicsKeywords: '主題/關鍵詞',
+        fileType: '檔案型別',
+      },
+      wikipediaEntry: {
+        title: '標題',
+        language: '語言',
+        webpageURL: '網頁網址',
+        editorContributor: '編輯/貢獻者',
+        lastEditDate: '最後編輯日期',
+        summaryIntroduction: '摘要/介紹',
+      },
+      notion: {
+        title: '標題',
+        language: '語言',
+        author: '作者',
+        createdTime: '建立時間',
+        lastModifiedTime: '最後修改時間',
+        url: '網址',
+        tag: '標籤',
+        description: '描述',
+      },
+      github: {
+        repoName: '倉庫名',
+        repoDesc: '倉庫描述',
+        repoOwner: '倉庫所有者',
+        fileName: '檔名',
+        filePath: '檔案路徑',
+        programmingLang: '程式語言',
+        url: '網址',
+        license: '許可證',
+        lastCommitTime: '最後提交時間',
+        lastCommitAuthor: '最後提交者',
+      },
+      originInfo: {
+        originalFilename: '原始檔名稱',
+        originalFileSize: '原始檔案大小',
+        uploadDate: '上傳日期',
+        lastUpdateDate: '最後更新日期',
+        source: '來源',
+      },
+      technicalParameters: {
+        segmentSpecification: '分段規則',
+        segmentLength: '段落長度',
+        avgParagraphLength: '平均段落長度',
+        paragraphs: '段落數量',
+        hitCount: '召回次數',
+        embeddingTime: '嵌入時間',
+        embeddedSpend: '嵌入花費',
+      },
+    },
+    languageMap: {
+      zh: '中文',
+      en: '英文',
+      es: '西班牙語',
+      fr: '法語',
+      de: '德語',
+      ja: '日語',
+      ko: '韓語',
+      ru: '俄語',
+      ar: '阿拉伯語',
+      pt: '葡萄牙語',
+      it: '義大利語',
+      nl: '荷蘭語',
+      pl: '波蘭語',
+      sv: '瑞典語',
+      tr: '土耳其語',
+      he: '希伯來語',
+      hi: '印地語',
+      da: '丹麥語',
+      fi: '芬蘭語',
+      no: '挪威語',
+      hu: '匈牙利語',
+      el: '希臘語',
+      cs: '捷克語',
+      th: '泰語',
+      id: '印度尼西亞語',
+    },
+    categoryMap: {
+      book: {
+        fiction: '小說',
+        biography: '傳記',
+        history: '歷史',
+        science: '科學',
+        technology: '技術',
+        education: '教育',
+        philosophy: '哲學',
+        religion: '宗教',
+        socialSciences: '社會科學',
+        art: '藝術',
+        travel: '旅行',
+        health: '健康',
+        selfHelp: '自助',
+        businessEconomics: '商業/經濟',
+        cooking: '烹飪',
+        childrenYoungAdults: '兒童/青少年',
+        comicsGraphicNovels: '漫畫/圖形小說',
+        poetry: '詩歌',
+        drama: '戲劇',
+        other: '其他',
+      },
+      personalDoc: {
+        notes: '筆記',
+        blogDraft: '部落格草稿',
+        diary: '日記',
+        researchReport: '研究報告',
+        bookExcerpt: '書籍摘錄',
+        schedule: '日程安排',
+        list: '列表',
+        projectOverview: '專案概述',
+        photoCollection: '照片集',
+        creativeWriting: '創意寫作',
+        codeSnippet: '程式碼片段',
+        designDraft: '設計草稿',
+        personalResume: '個人簡歷',
+        other: '其他',
+      },
+      businessDoc: {
+        meetingMinutes: '會議紀要',
+        researchReport: '研究報告',
+        proposal: '提案',
+        employeeHandbook: '員工手冊',
+        trainingMaterials: '培訓材料',
+        requirementsDocument: '需求文件',
+        designDocument: '設計文件',
+        productSpecification: '產品規格',
+        financialReport: '財務報告',
+        marketAnalysis: '市場分析',
+        projectPlan: '專案計劃',
+        teamStructure: '團隊結構',
+        policiesProcedures: '政策和流程',
+        contractsAgreements: '合同和協議',
+        emailCorrespondence: '郵件往來',
+        other: '其他',
+      },
+    },
+  },
+  embedding: {
+    processing: '嵌入處理中...',
+    paused: '嵌入已停止',
+    completed: '嵌入已完成',
+    error: '嵌入發生錯誤',
+    docName: '預處理文件',
+    mode: '分段規則',
+    segmentLength: '分段長度',
+    textCleaning: '文字預定義與清洗',
+    segments: '段落',
+    highQuality: '高質量模式',
+    economy: '經濟模式',
+    estimate: '預估消耗',
+    stop: '停止處理',
+    resume: '恢復處理',
+    automatic: '自動',
+    custom: '自定義',
+    previewTip: '段落預覽將在嵌入完成後可用',
+  },
+  segment: {
+    paragraphs: '段落',
+    keywords: '關鍵詞',
+    addKeyWord: '新增關鍵詞',
+    keywordError: '關鍵詞最大長度為 20',
+    characters: '字元',
+    hitCount: '召回次數',
+    vectorHash: '向量雜湊:',
+    questionPlaceholder: '在這裡新增問題',
+    questionEmpty: '問題不能為空',
+    answerPlaceholder: '在這裡新增答案',
+    answerEmpty: '答案不能為空',
+    contentPlaceholder: '在這裡新增內容',
+    contentEmpty: '內容不能為空',
+    newTextSegment: '新文字分段',
+    newQaSegment: '新問答分段',
+    delete: '刪除這個分段?',
+  },
+}
+
+export default translation

+ 28 - 0
web/i18n/zh-Hant/dataset-hit-testing.ts

@@ -0,0 +1,28 @@
+const translation = {
+  title: '召回測試',
+  desc: '基於給定的查詢文字測試知識庫的召回效果。',
+  dateTimeFormat: 'YYYY-MM-DD HH:mm',
+  recents: '最近查詢',
+  table: {
+    header: {
+      source: '資料來源',
+      text: '文字',
+      time: '時間',
+    },
+  },
+  input: {
+    title: '源文字',
+    placeholder: '請輸入文字,建議使用簡短的陳述句。',
+    countWarning: '不超過 200 個字元',
+    indexWarning: '僅支援高質量模式知識庫',
+    testing: '測試',
+  },
+  hit: {
+    title: '召回段落',
+    emptyTip: '召回測試結果將展示在這裡',
+  },
+  noRecentTip: '最近無查詢結果',
+  viewChart: '查看向量圖表',
+}
+
+export default translation

+ 33 - 0
web/i18n/zh-Hant/dataset-settings.ts

@@ -0,0 +1,33 @@
+const translation = {
+  title: '知識庫設定',
+  desc: '在這裡您可以修改知識庫的工作方式以及其它設定。',
+  form: {
+    name: '知識庫名稱',
+    namePlaceholder: '請輸入知識庫名稱',
+    nameError: '名稱不能為空',
+    desc: '知識庫描述',
+    descInfo: '請寫出清楚的文字描述來概述知識庫的內容。當從多個知識庫中進行選擇匹配時,該描述將用作匹配的基礎。',
+    descPlaceholder: '描述這個知識庫中的內容。詳細的描述可以讓 AI 及時訪問知識庫的內容。如果為空,Dify 將使用預設的命中策略。',
+    descWrite: '瞭解如何編寫更好的知識庫描述。',
+    permissions: '可見許可權',
+    permissionsOnlyMe: '只有我',
+    permissionsAllMember: '所有團隊成員',
+    indexMethod: '索引模式',
+    indexMethodHighQuality: '高質量',
+    indexMethodHighQualityTip: '呼叫 OpenAI 的嵌入介面進行處理,以在使用者查詢時提供更高的準確度',
+    indexMethodEconomy: '經濟',
+    indexMethodEconomyTip: '使用離線的向量引擎、關鍵詞索引等方式,降低了準確度但無需花費 Token',
+    embeddingModel: 'Embedding 模型',
+    embeddingModelTip: '修改 Embedding 模型,請去',
+    embeddingModelTipLink: '設定',
+    retrievalSetting: {
+      title: '檢索設定',
+      learnMore: '瞭解更多',
+      description: '關於檢索方法。',
+      longDescription: '關於檢索方法,您可以隨時在知識庫設定中更改此設定。',
+    },
+    save: '儲存',
+  },
+}
+
+export default translation

+ 49 - 0
web/i18n/zh-Hant/dataset.ts

@@ -0,0 +1,49 @@
+const translation = {
+  knowledge: '知識庫',
+  documentCount: ' 文件',
+  wordCount: ' 千字元',
+  appCount: ' 關聯應用',
+  createDataset: '建立知識庫',
+  createDatasetIntro: '匯入您自己的文字資料或透過 Webhook 實時寫入資料以增強 LLM 的上下文。',
+  deleteDatasetConfirmTitle: '要刪除知識庫嗎?',
+  deleteDatasetConfirmContent:
+    '刪除知識庫是不可逆的。使用者將無法再訪問您的知識庫,所有的提示配置和日誌將被永久刪除。',
+  datasetDeleted: '知識庫已刪除',
+  datasetDeleteFailed: '刪除知識庫失敗',
+  didYouKnow: '你知道嗎?',
+  intro1: '知識庫可以被整合到 Dify 應用中',
+  intro2: '作為上下文',
+  intro3: ',',
+  intro4: '或可以',
+  intro5: '建立',
+  intro6: '為獨立的 ChatGPT 外掛釋出使用',
+  unavailable: '不可用',
+  unavailableTip: '由於 embedding 模型不可用,需要配置預設 embedding 模型',
+  datasets: '知識庫',
+  datasetsApi: 'API',
+  retrieval: {
+    semantic_search: {
+      title: '向量檢索',
+      description: '透過生成查詢嵌入並查詢與其向量表示最相似的文字分段',
+    },
+    full_text_search: {
+      title: '全文檢索',
+      description: '索引文件中的所有詞彙,從而允許使用者查詢任意詞彙,並返回包含這些詞彙的文字片段',
+    },
+    hybrid_search: {
+      title: '混合檢索',
+      description: '同時執行全文檢索和向量檢索,並應用重排序步驟,從兩類查詢結果中選擇匹配使用者問題的最佳結果,需配置 Rerank 模型 API',
+      recommend: '推薦',
+    },
+    invertedIndex: {
+      title: '倒排索引',
+      description: '倒排索引是一種用於高效檢索的結構。按術語組織,每個術語指向包含它的文件或網頁',
+    },
+    change: '更改',
+    changeRetrievalMethod: '更改檢索方法',
+  },
+  docsFailedNotice: '文件無法被索引',
+  retry: '重試',
+}
+
+export default translation

+ 41 - 0
web/i18n/zh-Hant/explore.ts

@@ -0,0 +1,41 @@
+const translation = {
+  title: '探索',
+  sidebar: {
+    discovery: '發現',
+    chat: '智聊',
+    workspace: '工作區',
+    action: {
+      pin: '置頂',
+      unpin: '取消置頂',
+      rename: '重新命名',
+      delete: '刪除',
+    },
+    delete: {
+      title: '刪除程式',
+      content: '您確定要刪除此程式嗎?',
+    },
+  },
+  apps: {
+    title: '探索 Dify 的應用',
+    description: '使用這些模板應用程式,或根據模板自定義您自己的應用程式。',
+    allCategories: '推薦',
+  },
+  appCard: {
+    addToWorkspace: '新增到工作區',
+    customize: '自定義',
+  },
+  appCustomize: {
+    title: '從 {{name}} 建立應用程式',
+    subTitle: '應用程式圖示和名稱',
+    nameRequired: '應用程式名稱不能為空',
+  },
+  category: {
+    Assistant: '助手',
+    Writing: '寫作',
+    Translate: '翻譯',
+    Programming: '程式設計',
+    HR: '人力資源',
+  },
+}
+
+export default translation

+ 4 - 0
web/i18n/zh-Hant/layout.ts

@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation

+ 59 - 0
web/i18n/zh-Hant/login.ts

@@ -0,0 +1,59 @@
+const translation = {
+  pageTitle: '嗨,近來可好 👋',
+  welcome: '歡迎來到 Dify, 登入以繼續',
+  email: '郵箱',
+  emailPlaceholder: '輸入郵箱地址',
+  password: '密碼',
+  passwordPlaceholder: '輸入密碼',
+  name: '使用者名稱',
+  namePlaceholder: '輸入使用者名稱',
+  forget: '忘記密碼?',
+  signBtn: '登入',
+  installBtn: '設定',
+  setAdminAccount: '設定管理員賬戶',
+  setAdminAccountDesc: '管理員擁有的最大許可權,可用於建立應用和管理 LLM 供應商等。',
+  createAndSignIn: '建立賬戶',
+  oneMoreStep: '還差一步',
+  createSample: '基於這些資訊,我們將為您建立一個示例應用',
+  invitationCode: '邀請碼',
+  invitationCodePlaceholder: '輸入邀請碼',
+  interfaceLanguage: '介面語言',
+  timezone: '時區',
+  go: '跳轉至 Dify',
+  sendUsMail: '發封郵件介紹你自己,我們會盡快處理。',
+  acceptPP: '我已閱讀並接受隱私政策',
+  reset: '請執行以下命令重置密碼',
+  withGitHub: '使用 GitHub 登入',
+  withGoogle: '使用 Google 登入',
+  rightTitle: '釋放大型語言模型的全部潛能',
+  rightDesc: '簡單構建視覺化、可運營、可改進的 AI 應用',
+  tos: '使用協議',
+  pp: '隱私政策',
+  tosDesc: '使用即代表你並同意我們的',
+  donthave: '還沒有邀請碼?',
+  invalidInvitationCode: '無效的邀請碼',
+  accountAlreadyInited: '賬戶已經初始化',
+  error: {
+    emailEmpty: '郵箱不能為空',
+    emailInValid: '請輸入有效的郵箱地址',
+    nameEmpty: '使用者名稱不能為空',
+    passwordEmpty: '密碼不能為空',
+    passwordInvalid: '密碼必須包含字母和數字,且長度不小於8位',
+  },
+  license: {
+    tip: '啟動 Dify 社群版之前, 請閱讀 GitHub 上的',
+    link: '開源協議',
+  },
+  join: '加入',
+  joinTipStart: '邀請你加入',
+  joinTipEnd: '團隊',
+  invalid: '連結已失效',
+  explore: '探索 Dify',
+  activatedTipStart: '您已加入',
+  activatedTipEnd: '團隊',
+  activated: '現在登入',
+  adminInitPassword: '管理員初始化密碼',
+  validate: '驗證',
+}
+
+export default translation

+ 4 - 0
web/i18n/zh-Hant/register.ts

@@ -0,0 +1,4 @@
+const translation = {
+}
+
+export default translation

+ 23 - 0
web/i18n/zh-Hant/run-log.ts

@@ -0,0 +1,23 @@
+const translation = {
+  input: '輸入',
+  result: '結果',
+  detail: '詳情',
+  tracing: '追蹤',
+  resultPanel: {
+    status: '狀態',
+    time: '執行時間',
+    tokens: '總 token 數',
+  },
+  meta: {
+    title: '元資料',
+    status: '狀態',
+    version: '版本',
+    executor: '執行人',
+    startTime: '開始時間',
+    time: '執行時間',
+    tokens: '總 token 數',
+    steps: '執行步數',
+  },
+}
+
+export default translation

+ 71 - 0
web/i18n/zh-Hant/share-app.ts

@@ -0,0 +1,71 @@
+const translation = {
+  common: {
+    welcome: '歡迎使用',
+    appUnavailable: '應用不可用',
+    appUnkonwError: '應用不可用',
+  },
+  chat: {
+    newChat: '新對話',
+    pinnedTitle: '已置頂',
+    unpinnedTitle: '對話列表',
+    newChatDefaultName: '新的對話',
+    resetChat: '重置對話',
+    powerBy: 'Powered by',
+    prompt: '提示詞',
+    privatePromptConfigTitle: '對話設定',
+    publicPromptConfigTitle: '對話前提示詞',
+    configStatusDes: '開始前,您可以修改對話設定',
+    configDisabled: '此次會話已使用上次會話表單',
+    startChat: '開始對話',
+    privacyPolicyLeft: '請閱讀由該應用開發者提供的',
+    privacyPolicyMiddle: '隱私政策',
+    privacyPolicyRight: '。',
+    deleteConversation: {
+      title: '刪除對話',
+      content: '您確定要刪除此對話嗎?',
+    },
+    tryToSolve: '嘗試解決',
+    temporarySystemIssue: '抱歉,臨時系統問題。',
+  },
+  generation: {
+    tabs: {
+      create: '執行一次',
+      batch: '批次執行',
+      saved: '已儲存',
+
+    },
+    savedNoData: {
+      title: '您還沒有儲存結果!',
+      description: '開始生成內容,您可以在這裡找到儲存的結果。',
+      startCreateContent: '開始生成內容',
+    },
+    title: 'AI 智慧書寫',
+    queryTitle: '查詢內容',
+    completionResult: '生成結果',
+    queryPlaceholder: '請輸入文字內容',
+    run: '執行',
+    copy: '複製',
+    resultTitle: 'AI 書寫',
+    noData: 'AI 會在這裡給你驚喜。',
+    csvUploadTitle: '將您的 CSV 檔案拖放到此處,或',
+    browse: '瀏覽',
+    csvStructureTitle: 'CSV 檔案必須符合以下結構:',
+    downloadTemplate: '下載模板',
+    field: '',
+    batchFailed: {
+      info: '{{num}} 次執行失敗',
+      retry: '重試',
+      outputPlaceholder: '無輸出內容',
+    },
+    errorMsg: {
+      empty: '上傳檔案的內容不能為空',
+      fileStructNotMatch: '上傳檔案的內容與結構不匹配',
+      emptyLine: '第 {{rowIndex}} 行的內容為空',
+      invalidLine: '第 {{rowIndex}} 行: {{varName}}值必填',
+      moreThanMaxLengthLine: '第 {{rowIndex}} 行: {{varName}}值超過最大長度 {{maxLength}}',
+      atLeastOne: '上傳檔案的內容不能少於一條',
+    },
+  },
+}
+
+export default translation

+ 115 - 0
web/i18n/zh-Hant/tools.ts

@@ -0,0 +1,115 @@
+const translation = {
+  title: '工具',
+  createCustomTool: '建立自定義工具',
+  type: {
+    all: '全部',
+    builtIn: '內建',
+    custom: '自定義',
+  },
+  contribute: {
+    line1: '我有興趣為 ',
+    line2: 'Dify 貢獻工具。',
+    viewGuide: '檢視指南',
+  },
+  author: '作者',
+  auth: {
+    unauthorized: '去授權',
+    authorized: '已授權',
+    setup: '要使用請先授權',
+    setupModalTitle: '設定授權',
+    setupModalTitleDescription: '配置憑據後,工作區中的所有成員都可以在編排應用程式時使用此工具。',
+  },
+  includeToolNum: '包含 {{num}} 個工具',
+  addTool: '新增工具',
+  createTool: {
+    title: '建立自定義工具',
+    editAction: '編輯',
+    editTitle: '編輯自定義工具',
+    name: '名稱',
+    toolNamePlaceHolder: '輸入工具名稱',
+    schema: 'Schema',
+    schemaPlaceHolder: '在此處輸入您的 OpenAPI schema',
+    viewSchemaSpec: '檢視 OpenAPI-Swagger 規範',
+    importFromUrl: '從 URL 中匯入',
+    importFromUrlPlaceHolder: 'https://...',
+    urlError: '請輸入有效的 URL',
+    examples: '例子',
+    exampleOptions: {
+      json: '天氣(JSON)',
+      yaml: '寵物商店(YAML)',
+      blankTemplate: '空白模版',
+    },
+    availableTools: {
+      title: '可用工具',
+      name: '名稱',
+      description: '描述',
+      method: '方法',
+      path: '路徑',
+      action: '操作',
+      test: '測試',
+    },
+    authMethod: {
+      title: '鑑權方法',
+      type: '鑑權型別',
+      keyTooltip: 'HTTP 頭部名稱,如果你不知道是什麼,可以將其保留為 Authorization 或設定為自定義值',
+      types: {
+        none: '無',
+        api_key: 'API Key',
+        apiKeyPlaceholder: 'HTTP 頭部名稱,用於傳遞 API Key',
+        apiValuePlaceholder: '輸入 API Key',
+      },
+      key: '鍵',
+      value: '值',
+    },
+    authHeaderPrefix: {
+      title: '鑑權頭部字首',
+      types: {
+        basic: 'Basic',
+        bearer: 'Bearer',
+        custom: 'Custom',
+      },
+    },
+    privacyPolicy: '隱私協議',
+    privacyPolicyPlaceholder: '請輸入隱私協議',
+  },
+  test: {
+    title: '測試',
+    parametersValue: '引數和值',
+    parameters: '引數',
+    value: '值',
+    testResult: '測試結果',
+    testResultPlaceholder: '測試結果將顯示在這裡',
+  },
+  thought: {
+    using: '正在使用',
+    used: '已使用',
+    requestTitle: '請求來自',
+    responseTitle: '響應來自',
+  },
+  setBuiltInTools: {
+    info: '資訊',
+    setting: '設定',
+    toolDescription: '工具描述',
+    parameters: '引數',
+    string: '字串',
+    number: '數字',
+    required: '必填',
+    infoAndSetting: '資訊和設定',
+  },
+  noCustomTool: {
+    title: '沒有自定義工具!',
+    content: '在此統一新增和管理你的自定義工具,方便構建應用時使用。',
+    createTool: '建立工具',
+  },
+  noSearchRes: {
+    title: '抱歉,沒有結果!',
+    content: '我們找不到任何與您的搜尋相匹配的工具。',
+    reset: '重置搜尋',
+  },
+  builtInPromptTitle: '提示詞',
+  toolRemoved: '工具已被移除',
+  notAuthorized: '工具未授權',
+  howToGet: '如何獲取',
+}
+
+export default translation

+ 337 - 0
web/i18n/zh-Hant/workflow.ts

@@ -0,0 +1,337 @@
+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: '沒有變數',
+    variableNamePlaceholder: '變數名',
+    searchVar: '搜尋變數',
+    setVarValuePlaceholder: '設定變數值',
+    needConnecttip: '此節點尚未連線到其他節點',
+    maxTreeDepth: '每個分支最大限制 {{depth}} 個節點',
+    needEndNode: '必須新增結束節點',
+    needAnswerNode: '必須新增直接回復節點',
+    workflowProcess: '工作流',
+    notRunning: '尚未執行',
+    previewPlaceholder: '在下面的框中輸入內容開始除錯聊天機器人',
+    effectVarConfirm: {
+      title: '移除變數',
+      content: '該變數在其他節點中使用。您是否仍要刪除它?',
+    },
+    insertVarTip: '按 \'/\' 鍵快速插入',
+    processData: '資料處理',
+    input: '輸入',
+    output: '輸出',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} 不能為空',
+    authRequired: '請先授權',
+    invalidJson: '{{field}} 是非法的 JSON',
+    fields: {
+      variable: '變數名',
+      variableValue: '變數值',
+      code: '程式碼',
+      model: '模型',
+      rerankModel: 'Rerank 模型',
+    },
+    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': '定義一個 workflow 流程啟動的初始引數',
+    'end': '定義一個 workflow 流程的結束和結果型別',
+    'answer': '定義一個聊天對話的回覆內容',
+    'llm': '呼叫大語言模型回答問題或者對自然語言進行處理',
+    'knowledge-retrieval': '允許你從知識庫中查詢與使用者問題相關的文字內容',
+    'question-classifier': '定義使用者問題的分類條件,LLM 能夠根據分類描述定義對話的進展方式',
+    'if-else': '允許你根據 if/else 條件將 workflow 拆分成兩個分支',
+    '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: '提示詞',
+      addMessage: '新增訊息',
+      roleDescription: {
+        system: '為對話提供高層指導',
+        user: '向模型提供指令、查詢或任何基於文字的輸入',
+        assistant: '基於使用者訊息的模型回覆',
+      },
+      vision: '視覺',
+      files: '檔案',
+      resolution: {
+        name: '解析度',
+        high: '高',
+        low: '低',
+      },
+      outputVars: {
+        output: '生成內容',
+        usage: '模型用量資訊',
+      },
+      singleRun: {
+        variable: '變數',
+      },
+      sysQueryInUser: 'user message 中必須包含 sys.query',
+    },
+    knowledgeRetrieval: {
+      queryVariable: '查詢變數',
+      knowledge: '知識庫',
+      outputVars: {
+        output: '召回的分段',
+        content: '分段內容',
+        title: '分段標題',
+        icon: '分段圖示',
+        url: '分段連結',
+        metadata: '其他元資料',
+      },
+    },
+    http: {
+      inputVars: '輸入變數',
+      api: 'API',
+      apiPlaceholder: '輸入 URL,輸入變數時請鍵入‘/’',
+      notStartWithHttp: 'API 應該以 http:// 或 https:// 開頭',
+      key: '鍵',
+      value: '值',
+      bulkEdit: '批次編輯',
+      keyValueEdit: '鍵值編輯',
+      headers: 'Headers',
+      params: 'Params',
+      body: 'Body',
+      outputVars: {
+        body: '響應內容',
+        statusCode: '響應狀態碼',
+        headers: '響應頭列表 JSON',
+        files: '檔案列表',
+      },
+      authorization: {
+        'authorization': '鑑權',
+        'authorizationType': '鑑權型別',
+        'no-auth': '無',
+        'api-key': 'API-Key',
+        'auth-type': 'API 鑑權型別',
+        'basic': '基礎',
+        'bearer': 'Bearer',
+        'custom': '自定義',
+        'api-key-title': 'API Key',
+        'header': 'Header',
+      },
+      insertVarPlaceholder: '鍵入 \'/\' 鍵快速插入變數',
+    },
+    code: {
+      inputVars: '輸入變數',
+      outputVars: '輸出變數',
+    },
+    templateTransform: {
+      inputVars: '輸入變數',
+      code: '程式碼',
+      codeSupportTip: '只支援 Jinja2',
+      outputVars: {
+        output: '轉換後內容',
+      },
+    },
+    ifElse: {
+      if: 'If',
+      else: 'Else',
+      elseDescription: '用於定義當 if 條件不滿足時應執行的邏輯。',
+      and: 'and',
+      or: 'or',
+      operator: '運算子',
+      notSetVariable: '請先設定變數',
+      comparisonOperator: {
+        'contains': '包含',
+        'not contains': '不包含',
+        'start with': '開始是',
+        'end with': '結束是',
+        'is': '是',
+        'is not': '不是',
+        'empty': '為空',
+        'not empty': '不為空',
+        'null': '空',
+        'not null': '不為空',
+      },
+      enterValue: '輸入值',
+      addCondition: '新增條件',
+      conditionNotSetup: '條件未設定',
+    },
+    variableAssigner: {
+      title: '變數賦值',
+      outputType: '輸出型別',
+      outputVarType: '輸出變數型別',
+      varNotSet: '未設定變數',
+      noVarTip: '新增需要賦值的變數',
+      type: {
+        string: 'String',
+        number: 'Number',
+        object: 'Object',
+        array: 'Array',
+      },
+      outputVars: {
+        output: '指派的變數值',
+      },
+    },
+    tool: {
+      toAuthorize: '授權',
+      inputVars: '輸入變數',
+      outputVars: {
+        text: '工具生成的內容',
+        files: {
+          title: '工具生成的檔案',
+          type: '支援型別。現在只支援圖片',
+          transfer_method: '傳輸方式。值為 remote_url 或 local_file',
+          url: '圖片連結',
+          upload_file_id: '上傳檔案ID',
+        },
+      },
+    },
+    questionClassifiers: {
+      model: '模型',
+      inputVars: '輸入變數',
+      class: '分類',
+      classNamePlaceholder: '輸入你的分類名稱',
+      advancedSetting: '高階設定',
+      topicName: '主題內容',
+      topicPlaceholder: '在這裡輸入你的主題內容',
+      addClass: '新增分類',
+      instruction: '指令',
+      instructionPlaceholder: '在這裡輸入你的指令',
+    },
+  },
+  tracing: {
+    stopBy: '由{{user}}終止',
+  },
+}
+
+export default translation