Browse Source

chore: add Thai GUI (#11201)

Yi Xiao 4 months ago
parent
commit
e3119112a6

+ 1 - 0
api/constants/languages.py

@@ -18,6 +18,7 @@ language_timezone_mapping = {
     "tr-TR": "Europe/Istanbul",
     "fa-IR": "Asia/Tehran",
     "sl-SI": "Europe/Ljubljana",
+    "th-TH": "Asia/Bangkok",
 }
 
 languages = list(language_timezone_mapping.keys())

+ 4 - 0
web/i18n/language.ts

@@ -25,6 +25,7 @@ export type I18nText = {
   'hi-IN': string
   'fa-IR': string
   'sl-SI': string
+  'th-TH': string
 }
 
 export const languages = data.languages
@@ -55,6 +56,7 @@ export const NOTICE_I18N = {
     it_IT: 'Avviso Importante',
     fa_IR: 'هشدار مهم',
     sl_SI: 'Pomembno obvestilo',
+    th_TH: 'ประกาศสำคัญ',
   },
   desc: {
     en_US:
@@ -87,6 +89,8 @@ export const NOTICE_I18N = {
       'سیستم ما از ساعت 19:00 تا 24:00 UTC در تاریخ 28 اوت برای ارتقاء در دسترس نخواهد بود. برای سؤالات، لطفاً با تیم پشتیبانی ما (support@dify.ai) تماس بگیرید. ما برای صبر شما ارزش قائلیم.',
     sl_SI:
       'Naš sistem ne bo na voljo od 19:00 do 24:00 UTC 28. avgusta zaradi nadgradnje. Za vprašanja se obrnite na našo skupino za podporo (support@dify.ai). Cenimo vašo potrpežljivost.',
+    th_TH:
+      'ระบบของเราจะไม่สามารถใช้งานได้ตั้งแต่เวลา 19:00 ถึง 24:00 UTC ในวันที่ 28 สิงหาคม เพื่อทำการอัปเกรด หากมีคำถามใดๆ กรุณาติดต่อทีมสนับสนุนของเรา (support@dify.ai) เราขอขอบคุณในความอดทนของท่าน',
   },
   href: '#',
 }

+ 1 - 1
web/i18n/languages.json

@@ -82,7 +82,7 @@
       "name": "ไทย (ประเทศไทย)",
       "prompt_name": "Thai",
       "example": "สวัสดี Dify!",
-      "supported": false
+      "supported": true
     },
     {
       "value": "id-ID",

+ 87 - 0
web/i18n/th-TH/app-annotation.ts

@@ -0,0 +1,87 @@
+const translation = {
+  title: 'คำ อธิบาย',
+  name: 'คําอธิบายประกอบ ตอบกลับ',
+  editBy: 'ตอบแก้ไขโดย {{author}}',
+  noData: {
+    title: 'ไม่มีคําอธิบายประกอบ',
+    description: 'คุณสามารถแก้ไขคําอธิบายประกอบระหว่างการดีบักแอปหรือนําเข้าคําอธิบายประกอบจํานวนมากได้ที่นี่เพื่อการตอบกลับคุณภาพสูง',
+  },
+  table: {
+    header: {
+      question: 'ปัญหา',
+      answer: 'ตอบ',
+      createdAt: 'สร้างเมื่อ',
+      hits: 'ฮิต',
+      actions: 'การกระทํา',
+      addAnnotation: 'เพิ่มคําอธิบายประกอบ',
+      bulkImport: 'นําเข้าจํานวนมาก',
+      bulkExport: 'ส่งออกจํานวนมาก',
+      clearAll: 'ล้างคําอธิบายประกอบทั้งหมด',
+    },
+  },
+  editModal: {
+    title: 'แก้ไขคําอธิบายประกอบ ตอบกลับ',
+    queryName: 'การสอบถามของผู้ใช้',
+    answerName: 'บอทนักเล่าเรื่อง',
+    yourAnswer: 'คําตอบของคุณ',
+    answerPlaceholder: 'พิมพ์คําตอบของคุณที่นี่',
+    yourQuery: 'คําถามของคุณ',
+    queryPlaceholder: 'พิมพ์แบบสอบถามของคุณที่นี่',
+    removeThisCache: 'ลบคําอธิบายประกอบนี้',
+    createdAt: 'สร้างที่',
+  },
+  addModal: {
+    title: 'เพิ่มคําอธิบายประกอบตอบกลับ',
+    queryName: 'ปัญหา',
+    answerName: 'ตอบ',
+    answerPlaceholder: 'พิมพ์คําตอบที่นี่',
+    queryPlaceholder: 'พิมพ์ query ที่นี่',
+    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: {
+    query: 'สอบถาม',
+    match: 'ไม้ขีดไฟ',
+    response: 'การตอบสนอง',
+    source: 'ที่มา',
+    score: 'คะแนน',
+    time: 'เวลา',
+  },
+  initSetup: {
+    title: 'คําอธิบายประกอบตอบกลับการตั้งค่าเริ่มต้น',
+    configTitle: 'การตั้งค่าการตอบกลับคําอธิบายประกอบ',
+    confirmBtn: 'บันทึกและเปิดใช้งาน',
+    configConfirmBtn: 'ประหยัด',
+  },
+  embeddingModelSwitchTip: 'โมเดลเวกเตอร์ข้อความคําอธิบายประกอบ โมเดลการสลับจะถูกฝังใหม่ส่งผลให้มีค่าใช้จ่ายเพิ่มเติม',
+}
+
+export default translation

+ 85 - 0
web/i18n/th-TH/app-api.ts

@@ -0,0 +1,85 @@
+const translation = {
+  apiServer: 'เซิร์ฟเวอร์ API',
+  apiKey: 'คีย์ API',
+  status: 'สถานะ',
+  disabled: 'พิการ',
+  ok: 'ให้บริการ',
+  copy: 'ลอก',
+  copied: 'คัด ลอก',
+  regenerate: 'สร้างใหม่',
+  play: 'เล่น',
+  pause: 'หยุด',
+  playing: 'เล่น',
+  loading: 'การโหลด',
+  merMaid: {
+    rerender: 'ทําซ้ํา Rerender',
+  },
+  never: 'ไม่เคย',
+  apiKeyModal: {
+    apiSecretKey: 'คีย์ลับ API',
+    apiSecretKeyTips: 'เพื่อป้องกันการละเมิด API ให้ปกป้องคีย์ API ของคุณ หลีกเลี่ยงการใช้เป็นข้อความธรรมดาในโค้ดส่วนหน้า :)',
+    createNewSecretKey: 'สร้างคีย์ลับใหม่',
+    secretKey: 'กุญแจลับ',
+    created: 'สร้าง',
+    lastUsed: 'ใช้ล่าสุด',
+    generateTips: 'เก็บกุญแจนี้ไว้ในที่ปลอดภัยและเข้าถึงได้',
+  },
+  actionMsg: {
+    deleteConfirmTitle: 'ลบคีย์ลับนี้?',
+    deleteConfirmTips: 'การดําเนินการนี้ไม่สามารถยกเลิกได้',
+    ok: 'ตกลง, ได้',
+  },
+  completionMode: {
+    title: 'API แอปที่สมบูรณ์',
+    info: 'สําหรับการสร้างข้อความคุณภาพสูง เช่น บทความ บทสรุป และการแปล ให้ใช้ API ข้อความที่สมบูรณ์กับการป้อนข้อมูลของผู้ใช้ การสร้างข้อความอาศัยพารามิเตอร์โมเดลและเทมเพลตพร้อมท์ที่ตั้งค่าไว้ใน Dify Prompt Engineering',
+    createCompletionApi: 'สร้างข้อความเสร็จสมบูรณ์',
+    createCompletionApiTip: 'สร้างข้อความเสร็จสิ้นเพื่อรองรับโหมดคําถามและคําตอบ',
+    inputsTips: '(ไม่บังคับ) ระบุฟิลด์อินพุตของผู้ใช้เป็นคู่คีย์-ค่า ซึ่งสอดคล้องกับตัวแปรใน Prompt Eng คีย์คือชื่อตัวแปร ค่าคือค่าพารามิเตอร์ ถ้าชนิดฟิลด์เป็น เลือก ค่าที่ส่งจะต้องเป็นหนึ่งในตัวเลือกที่ตั้งไว้ล่วงหน้า',
+    queryTips: 'เนื้อหาข้อความที่ผู้ใช้ป้อน',
+    blocking: 'ประเภทการบล็อก รอให้การดําเนินการเสร็จสมบูรณ์และส่งคืนผลลัพธ์ (คําขออาจถูกขัดจังหวะหากกระบวนการใช้เวลานาน)',
+    streaming: 'การสตรีมกลับมา การใช้งานการส่งคืนการสตรีมตาม SSE (เหตุการณ์ที่ส่งโดยเซิร์ฟเวอร์)',
+    messageFeedbackApi: 'ข้อความแสดงความคิดเห็น (ชอบ)',
+    messageFeedbackApiTip: 'ให้คะแนนข้อความที่ได้รับในนามของผู้ใช้ปลายทางที่มีการชอบหรือไม่ชอบ ข้อมูลนี้สามารถมองเห็นได้ในหน้า Logs & Annotations และใช้สําหรับการปรับแต่งโมเดลในอนาคต',
+    messageIDTip: 'รหัสข้อความ',
+    ratingTip: 'ชอบหรือไม่ชอบ null คือเลิกทํา',
+    parametersApi: 'รับข้อมูลพารามิเตอร์แอปพลิเคชัน',
+    parametersApiTip: 'ดึงพารามิเตอร์อินพุตที่กําหนดค่าไว้ รวมถึงชื่อตัวแปร ชื่อฟิลด์ ชนิด และค่าเริ่มต้น โดยทั่วไปจะใช้สําหรับแสดงฟิลด์เหล่านี้ในฟอร์มหรือกรอกค่าเริ่มต้นหลังจากโหลดไคลเอ็นต์',
+  },
+  chatMode: {
+    title: 'API แอปแชท',
+    info: 'สําหรับแอปการสนทนาอเนกประสงค์ที่ใช้รูปแบบ Q&A ให้เรียก API ข้อความแชทเพื่อเริ่มการสนทนา รักษาการสนทนาอย่างต่อเนื่องโดยส่ง conversation_id ที่ส่งคืน พารามิเตอร์การตอบสนองและเทมเพลตขึ้นอยู่กับ Dify Prompt Eng การตั้งค่า',
+    createChatApi: 'สร้างข้อความแชท',
+    createChatApiTip: 'สร้างข้อความการสนทนาใหม่หรือดําเนินการต่อในการสนทนาที่มีอยู่',
+    inputsTips: '(ไม่บังคับ) ระบุฟิลด์อินพุตของผู้ใช้เป็นคู่คีย์-ค่า ซึ่งสอดคล้องกับตัวแปรใน Prompt Eng คีย์คือชื่อตัวแปร ค่าคือค่าพารามิเตอร์ ถ้าชนิดฟิลด์เป็น เลือก ค่าที่ส่งจะต้องเป็นหนึ่งในตัวเลือกที่ตั้งไว้ล่วงหน้า',
+    queryTips: 'เนื้อหาการป้อนข้อมูล/คําถามของผู้ใช้',
+    blocking: 'ประเภทการบล็อก รอให้การดําเนินการเสร็จสมบูรณ์และส่งคืนผลลัพธ์ (คําขออาจถูกขัดจังหวะหากกระบวนการใช้เวลานาน)',
+    streaming: 'การสตรีมกลับมา การใช้งานการส่งคืนการสตรีมตาม SSE (เหตุการณ์ที่ส่งโดยเซิร์ฟเวอร์)',
+    conversationIdTip: '(ไม่บังคับ) รหัสการสนทนา: เว้นว่างไว้สําหรับการสนทนาครั้งแรก ส่ง conversation_id จากบริบทเพื่อสนทนาต่อ',
+    messageFeedbackApi: 'ข้อความความคิดเห็นของผู้ใช้เทอร์มินัล เช่น',
+    messageFeedbackApiTip: 'ให้คะแนนข้อความที่ได้รับในนามของผู้ใช้ปลายทางที่มีการชอบหรือไม่ชอบ ข้อมูลนี้สามารถมองเห็นได้ในหน้า Logs & Annotations และใช้สําหรับการปรับแต่งโมเดลในอนาคต',
+    messageIDTip: 'รหัสข้อความ',
+    ratingTip: 'ชอบหรือไม่ชอบ null คือเลิกทํา',
+    chatMsgHistoryApi: 'รับข้อความประวัติการแชท',
+    chatMsgHistoryApiTip: 'หน้าแรกส่งคืนแถบ \'ขีดจํากัด\' ล่าสุด ซึ่งอยู่ในลําดับที่กลับกัน',
+    chatMsgHistoryConversationIdTip: 'รหัสการสนทนา',
+    chatMsgHistoryFirstId: 'ID ของเรกคอร์ดแชทแรกบนหน้าปัจจุบัน ค่าเริ่มต้นคือไม่มี',
+    chatMsgHistoryLimit: 'จํานวนแชทที่ส่งคืนในคําขอเดียว',
+    conversationsListApi: 'รับรายการการสนทนา',
+    conversationsListApiTip: 'รับรายการเซสชันของผู้ใช้ปัจจุบัน โดยค่าเริ่มต้น 20 เซสชันล่าสุดจะถูกส่งคืน',
+    conversationsListFirstIdTip: 'รหัสของเรกคอร์ดสุดท้ายบนหน้าปัจจุบัน ค่าเริ่มต้นไม่มี',
+    conversationsListLimitTip: 'จํานวนแชทที่ส่งคืนในคําขอเดียว',
+    conversationRenamingApi: 'การเปลี่ยนชื่อการสนทนา',
+    conversationRenamingApiTip: 'เปลี่ยนชื่อการสนทนา ชื่อจะแสดงในอินเทอร์เฟซไคลเอ็นต์แบบหลายเซสชัน',
+    conversationRenamingNameTip: 'ชื่อใหม่',
+    parametersApi: 'รับข้อมูลพารามิเตอร์แอปพลิเคชัน',
+    parametersApiTip: 'ดึงพารามิเตอร์อินพุตที่กําหนดค่าไว้ รวมถึงชื่อตัวแปร ชื่อฟิลด์ ชนิด และค่าเริ่มต้น โดยทั่วไปจะใช้สําหรับแสดงฟิลด์เหล่านี้ในฟอร์มหรือกรอกค่าเริ่มต้นหลังจากโหลดไคลเอ็นต์',
+  },
+  develop: {
+    requestBody: 'เนื้อหาคําขอ',
+    pathParams: 'พารามิเตอร์เส้นทาง',
+    query: 'สอบถาม',
+    toc: 'เนื้อหา',
+  },
+}
+
+export default translation

+ 0 - 0
web/i18n/th-TH/app-debug.ts


+ 94 - 0
web/i18n/th-TH/app-log.ts

@@ -0,0 +1,94 @@
+const translation = {
+  title: 'บันทึก',
+  description: 'บันทึกบันทึกสถานะการทํางานของแอปพลิเคชัน รวมถึงการป้อนข้อมูลของผู้ใช้และการตอบกลับ AI',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  table: {
+    header: {
+      updatedTime: 'อัพเดทเวลา',
+      time: 'เวลาที่สร้าง',
+      endUser: 'ผู้ใช้ปลายทางหรือบัญชี',
+      input: 'อินพุต',
+      output: 'ผลิตภัณฑ์',
+      summary: 'ชื่อเรื่อง',
+      messageCount: 'จํานวนข้อความ',
+      userRate: 'อัตราผู้ใช้',
+      adminRate: 'Op. อัตรา',
+      startTime: 'เวลาเริ่มต้น',
+      status: 'สถานะ',
+      runtime: 'เวลาทํางาน',
+      tokens: 'โท เค็น',
+      user: 'ผู้ใช้ปลายทางหรือบัญชี',
+      version: 'เวอร์ชัน',
+    },
+    pagination: {
+      previous: 'ก่อนหน้า',
+      next: 'ต่อไป',
+    },
+    empty: {
+      noChat: 'ยังไม่มีการสนทนา',
+      noOutput: 'ไม่มีเอาต์พุต',
+      element: {
+        title: 'มีใครอยู่ที่นั่นไหม?',
+        content: 'สังเกตและใส่คําอธิบายประกอบการโต้ตอบระหว่างผู้ใช้ปลายทางและแอปพลิเคชัน AI ที่นี่เพื่อปรับปรุงความแม่นยําของ AI อย่างต่อเนื่อง คุณสามารถลอง<shareLink>แชร์</shareLink>หรือ<testLink>ทดสอบเว็บ</testLink>แอปด้วยตัวคุณเอง แล้วกลับไปที่หน้านี้',
+      },
+    },
+  },
+  detail: {
+    time: 'เวลา',
+    conversationId: 'รหัสการสนทนา',
+    promptTemplate: 'เทมเพลตพร้อมท์',
+    promptTemplateBeforeChat: 'เทมเพลตพร้อมท์ก่อนแชท · เป็นข้อความของระบบ',
+    annotationTip: 'การปรับปรุงที่ทําเครื่องหมายโดย {{user}}',
+    second: 's',
+    tokenCost: 'โทเค็นที่ใช้ไป',
+    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: 'ไม่มีคําอธิบายประกอบ',
+    },
+    sortBy: 'เมืองสีดํา:',
+    descending: 'จากมากไปหาน้อย',
+    ascending: 'จากน้อยไปมาก',
+  },
+  workflowTitle: 'บันทึกเวิร์กโฟลว์',
+  workflowSubtitle: 'บันทึกบันทึกการทํางานของ Automate',
+  runDetail: {
+    title: 'บันทึกการสนทนา',
+    workflowTitle: 'รายละเอียดบันทึก',
+  },
+  promptLog: 'บันทึกพร้อมท์',
+  agentLog: 'บันทึกตัวแทน',
+  viewLog: 'ดูบันทึก',
+  agentLogDetail: {
+    agentMode: 'โหมดตัวแทน',
+    toolUsed: 'เครื่องมือที่ใช้',
+    iterations: 'เกิด ซ้ำ',
+    iteration: 'เกิด ซ้ำ',
+    finalProcessing: 'การประมวลผลขั้นสุดท้าย',
+  },
+}
+
+export default translation

+ 168 - 0
web/i18n/th-TH/app-overview.ts

@@ -0,0 +1,168 @@
+const translation = {
+  welcome: {
+    firstStepTip: 'ในการเริ่มต้น',
+    enterKeyTip: 'ป้อนคีย์ OpenAI API ของคุณด้านล่าง',
+    getKeyTip: 'รับคีย์ API ของคุณจากแดชบอร์ด OpenAI',
+    placeholder: 'คีย์ API OpenAI ของคุณ (เช่น sk-xxxx)',
+  },
+  apiKeyInfo: {
+    cloud: {
+      trial: {
+        title: 'คุณกําลังใช้โควต้าทดลองใช้ {{providerName}}',
+        description: 'โควต้าทดลองใช้มีไว้เพื่อวัตถุประสงค์ในการทดสอบของคุณ ก่อนที่โควต้าทดลองใช้จะหมด โปรดตั้งค่าผู้ให้บริการโมเดลของคุณเองหรือซื้อโควต้าเพิ่มเติม',
+      },
+      exhausted: {
+        title: 'โควต้าทดลองใช้ของคุณหมดแล้ว โปรดตั้งค่า APIKey ของคุณ',
+        description: 'คุณใช้โควต้าทดลองใช้หมดแล้ว โปรดตั้งค่าผู้ให้บริการโมเดลของคุณเองหรือซื้อโควต้าเพิ่มเติม',
+      },
+    },
+    selfHost: {
+      title: {
+        row1: 'ในการเริ่มต้น',
+        row2: 'ตั้งค่าผู้ให้บริการโมเดลของคุณก่อน',
+      },
+    },
+    callTimes: 'เวลาโทร',
+    usedToken: 'โทเค็นที่ใช้',
+    setAPIBtn: 'ไปที่ผู้ให้บริการโมเดลการตั้งค่า',
+    tryCloud: 'หรือลองใช้ Dify เวอร์ชันคลาวด์พร้อมใบเสนอราคาฟรี',
+  },
+  overview: {
+    title: 'ภาพรวม',
+    appInfo: {
+      explanation: 'AI WebApp พร้อมใช้งาน',
+      accessibleAddress: 'URL สาธารณะ',
+      preview: 'ดูตัวอย่าง',
+      regenerate: 'สร้างใหม่',
+      regenerateNotice: 'คุณต้องการสร้าง URL สาธารณะใหม่หรือไม่',
+      preUseReminder: 'โปรดเปิดใช้งาน WebApp ก่อนดําเนินการต่อ',
+      settings: {
+        entry: 'การตั้งค่า',
+        title: 'การตั้งค่าเว็บแอป',
+        webName: 'ชื่อเว็บแอป',
+        webDesc: 'คําอธิบาย WebApp',
+        webDescTip: 'ข้อความนี้จะแสดงที่ฝั่งไคลเอ็นต์ โดยให้คําแนะนําพื้นฐานเกี่ยวกับวิธีการใช้แอปพลิเคชัน',
+        webDescPlaceholder: 'ป้อนคําอธิบายของ WebApp',
+        language: 'ภาษา',
+        workflow: {
+          title: 'เวิร์กโฟลว์',
+          subTitle: 'รายละเอียดเวิร์กโฟลว์',
+          show: 'แสดง',
+          hide: 'ซ่อน',
+          showDesc: 'แสดงหรือซ่อนรายละเอียดเวิร์กโฟลว์ใน WebApp',
+        },
+        chatColorTheme: 'ธีมสีแชท',
+        chatColorThemeDesc: 'กําหนดธีมสีของแชทบอท',
+        chatColorThemeInverted: 'คว่ำ',
+        invalidHexMessage: 'ค่าฐานสิบหกไม่ถูกต้อง',
+        sso: {
+          label: 'การรับรองความถูกต้องของ SSO',
+          title: 'เว็บแอป SSO',
+          description: 'ผู้ใช้ทุกคนต้องเข้าสู่ระบบด้วย SSO ก่อนใช้ WebApp',
+          tooltip: 'ติดต่อผู้ดูแลระบบเพื่อเปิดใช้ WebApp SSO',
+        },
+        more: {
+          entry: 'แสดงการตั้งค่าเพิ่มเติม',
+          copyright: 'ลิขสิทธิ์',
+          copyRightPlaceholder: 'ป้อนชื่อผู้เขียนหรือองค์กร',
+          privacyPolicy: 'นโยบายความเป็นส่วนตัว',
+          privacyPolicyPlaceholder: 'ป้อนลิงก์นโยบายความเป็นส่วนตัว',
+          privacyPolicyTip: 'ช่วยให้ผู้เยี่ยมชมเข้าใจข้อมูลที่แอปพลิเคชันรวบรวม โปรดดูนโยบาย<privacyPolicyLink>ความเป็นส่วนตัว</privacyPolicyLink>ของ Dify',
+          customDisclaimer: 'ข้อจํากัดความรับผิดชอบที่กําหนดเอง',
+          customDisclaimerPlaceholder: 'ป้อนข้อความข้อจํากัดความรับผิดชอบที่กําหนดเอง',
+          customDisclaimerTip: 'ข้อความปฏิเสธความรับผิดชอบที่กําหนดเองจะแสดงที่ฝั่งไคลเอ็นต์ โดยให้ข้อมูลเพิ่มเติมเกี่ยวกับแอปพลิเคชัน',
+        },
+      },
+      embedded: {
+        entry: 'ฝัง ตัว',
+        title: 'ฝังบนเว็บไซต์',
+        explanation: 'เลือกวิธีฝังแอปแชทลงในเว็บไซต์ของคุณ',
+        iframe: 'หากต้องการเพิ่มแอปแชทที่ใดก็ได้บนเว็บไซต์ของคุณ ให้เพิ่ม iframe นี้ลงในโค้ด html ของคุณ',
+        scripts: 'หากต้องการเพิ่มแอปแชทที่ด้านขวาล่างของเว็บไซต์ ให้เพิ่มโค้ดนี้ลงใน html ของคุณ',
+        chromePlugin: 'ติดตั้งส่วนขยาย Dify Chatbot Chrome',
+        copied: 'คัด ลอก',
+        copy: 'ลอก',
+      },
+      qrcode: {
+        title: 'เชื่อมโยงรหัส QR',
+        scan: 'สแกนเพื่อแบ่งปัน',
+        download: 'ดาวน์โหลด QR Code',
+      },
+      customize: {
+        way: 'วิธี',
+        entry: 'ปรับแต่ง',
+        title: 'ปรับแต่ง AI WebApp',
+        explanation: 'คุณสามารถปรับแต่งส่วนหน้าของ Web App ให้เหมาะกับสถานการณ์และความต้องการสไตล์ของคุณได้',
+        way1: {
+          name: 'แยกรหัสไคลเอ็นต์ แก้ไข และปรับใช้กับ Vercel (แนะนํา)',
+          step1: 'แยกรหัสไคลเอ็นต์และแก้ไข',
+          step1Tip: 'คลิกที่นี่เพื่อแยกซอร์สโค้ดลงในบัญชี GitHub ของคุณและแก้ไขโค้ด',
+          step1Operation: 'Dify-Web ไคลเอ็นต์',
+          step2: 'ปรับใช้กับ Vercel',
+          step2Tip: 'คลิกที่นี่เพื่อนําเข้าที่เก็บไปยัง Vercel และปรับใช้',
+          step2Operation: 'นําเข้าที่เก็บข้อมูล',
+          step3: 'กําหนดค่าตัวแปรสภาพแวดล้อม',
+          step3Tip: 'เพิ่มตัวแปรสภาพแวดล้อมต่อไปนี้ใน Vercel',
+        },
+        way2: {
+          name: 'เขียนโค้ดฝั่งไคลเอ็นต์เพื่อเรียกใช้ API และปรับใช้กับเซิร์ฟเวอร์',
+          operation: 'เอกสาร',
+        },
+      },
+    },
+    apiInfo: {
+      title: 'API บริการแบ็กเอนด์',
+      explanation: 'ผสานรวมเข้ากับแอปพลิเคชันของคุณได้อย่างง่ายดาย',
+      accessibleAddress: 'ปลายทาง API บริการ',
+      doc: 'การอ้างอิง API',
+    },
+    status: {
+      running: 'ให้บริการ',
+      disable: 'พิการ',
+    },
+  },
+  analysis: {
+    title: 'การวิเคราะห์',
+    ms: 'นางสาว',
+    tokenPS: 'โทเค็น/วินาที',
+    totalMessages: {
+      title: 'ข้อความทั้งหมด',
+      explanation: 'การโต้ตอบ AI รายวันนับ',
+    },
+    totalConversations: {
+      title: 'การสนทนาทั้งหมด',
+      explanation: 'การสนทนา AI รายวันนับ ไม่รวมวิศวกรรม/ดีบักพร้อมท์',
+    },
+    activeUsers: {
+      title: 'ผู้ใช้ที่ใช้งานอยู่',
+      explanation: 'ผู้ใช้ที่ไม่ซ้ํากันมีส่วนร่วมในการถามตอบกับ AI ไม่รวมวิศวกรรม/ดีบักพร้อมท์',
+    },
+    tokenUsage: {
+      title: 'การใช้โทเค็น',
+      explanation: 'สะท้อนถึงการใช้โทเค็นรายวันของโมเดลภาษาสําหรับแอปพลิเคชัน ซึ่งมีประโยชน์สําหรับวัตถุประสงค์ในการควบคุมต้นทุน',
+      consumed: 'ใช้',
+    },
+    avgSessionInteractions: {
+      title: 'การโต้ตอบเซสชันโดยเฉลี่ย',
+      explanation: 'จํานวนการสื่อสารระหว่างผู้ใช้และ AI อย่างต่อเนื่อง สําหรับแอปที่ใช้การสนทนา',
+    },
+    avgUserInteractions: {
+      title: 'การโต้ตอบของผู้ใช้โดยเฉลี่ย',
+      explanation: 'สะท้อนถึงความถี่ในการใช้งานรายวันของผู้ใช้ เมตริกนี้สะท้อนถึงความเหนียวแน่นของผู้ใช้',
+    },
+    userSatisfactionRate: {
+      title: 'อัตราความพึงพอใจของผู้ใช้',
+      explanation: 'จํานวนไลค์ต่อ 1,000 ข้อความ สิ่งนี้บ่งชี้ถึงสัดส่วนของคําตอบที่ผู้ใช้พึงพอใจอย่างมาก',
+    },
+    avgResponseTime: {
+      title: 'เวลาตอบสนองเฉลี่ย',
+      explanation: 'เวลา (มิลลิวินาที) สําหรับ AI ในการประมวลผล/ตอบสนอง สําหรับแอปที่ใช้ข้อความ',
+    },
+    tps: {
+      title: 'ความเร็วในการส่งออกโทเค็น',
+      explanation: 'วัดประสิทธิภาพของ LLM นับความเร็วในการส่งออกโทเค็นของ LLM ตั้งแต่เริ่มต้นคําขอจนถึงเสร็จสิ้นเอาต์พุต',
+    },
+  },
+}
+
+export default translation

+ 142 - 0
web/i18n/th-TH/app.ts

@@ -0,0 +1,142 @@
+const translation = {
+  createApp: 'สร้างแอพ',
+  types: {
+    all: 'ทั้งหมด',
+    chatbot: 'แชทบอท',
+    agent: 'ตัวแทน',
+    workflow: 'เวิร์กโฟลว์',
+    completion: 'เสร็จ สมบูรณ์',
+  },
+  duplicate: 'สำเนา',
+  duplicateTitle: 'แอปที่ซ้ํากัน',
+  export: 'ส่งออก DSL',
+  exportFailed: 'ส่งออก DSL ล้มเหลว',
+  importDSL: 'นําเข้าไฟล์ DSL',
+  createFromConfigFile: 'สร้างจากไฟล์ DSL',
+  importFromDSL: 'นําเข้าจาก DSL',
+  importFromDSLFile: 'จากไฟล์ DSL',
+  importFromDSLUrl: 'จาก URL',
+  importFromDSLUrlPlaceholder: 'วางลิงค์ DSL ที่นี่',
+  deleteAppConfirmTitle: 'ลบแอพนี้?',
+  deleteAppConfirmContent: 'การลบแอปนั้นไม่สามารถย้อนกลับได้ ผู้ใช้จะไม่สามารถเข้าถึงแอปของคุณอีกต่อไป และการกําหนดค่าพร้อมท์และบันทึกทั้งหมดจะถูกลบอย่างถาวร',
+  appDeleted: 'แอพถูกลบ',
+  appDeleteFailed: 'ลบแอปไม่สําเร็จ',
+  join: 'เข้าร่วมชุมชน',
+  communityIntro: 'พูดคุยกับสมาชิกในทีม ผู้ร่วมให้ข้อมูล และนักพัฒนาในช่องทางต่างๆ',
+  roadmap: 'ดูแผนงานของเรา',
+  newApp: {
+    startFromBlank: 'สร้างจากช่องว่าง',
+    startFromTemplate: 'สร้างจากเทมเพลต',
+    captionAppType: 'คุณต้องการสร้างแอปประเภทใด',
+    chatbotDescription: 'สร้างแอปพลิเคชันที่ใช้การแชท แอพนี้ใช้รูปแบบคําถามและคําตอบ ทําให้สามารถสนทนาต่อเนื่องได้หลายรอบ',
+    completionDescription: 'สร้างแอปพลิเคชันที่สร้างข้อความคุณภาพสูงตามข้อความแจ้ง เช่น การสร้างบทความ สรุป การแปล และอื่นๆ',
+    completionWarning: 'แอปประเภทนี้จะไม่รองรับอีกต่อไป',
+    agentDescription: 'สร้างตัวแทนอัจฉริยะที่สามารถเลือกเครื่องมือเพื่อทํางานให้เสร็จได้โดยอัตโนมัติ',
+    workflowDescription: 'สร้างแอปพลิเคชันที่สร้างข้อความคุณภาพสูงตามการประสานเวิร์กโฟลว์ที่มีการปรับแต่งในระดับสูง เหมาะสําหรับผู้ใช้ที่มีประสบการณ์',
+    workflowWarning: 'ขณะนี้อยู่ในช่วงเบต้า',
+    chatbotType: 'วิธีการประสานแชทบอท',
+    basic: 'พื้นฐาน',
+    basicTip: 'สําหรับผู้เริ่มต้นสามารถเปลี่ยนไปใช้ Chatflow ได้ในภายหลัง',
+    basicFor: 'สําหรับผู้เริ่มต้น',
+    basicDescription: 'Basic Orchestrate ช่วยให้สามารถประสานแอปแชทบอทโดยใช้การตั้งค่าง่ายๆ โดยไม่สามารถแก้ไขข้อความแจ้งในตัวได้ เหมาะสําหรับผู้เริ่มต้น',
+    advanced: 'แชทโฟลว์',
+    advancedFor: 'สําหรับผู้ใช้ขั้นสูง',
+    advancedDescription: 'Workflow Orchestrate ประสานงาน Chatbots ในรูปแบบของเวิร์กโฟลว์ โดยนําเสนอการปรับแต่งในระดับสูง รวมถึงความสามารถในการแก้ไขข้อความแจ้งในตัว เหมาะสําหรับผู้ใช้ที่มีประสบการณ์',
+    captionName: 'ไอคอนและชื่อแอป',
+    appNamePlaceholder: 'ตั้งชื่อแอปของคุณ',
+    captionDescription: 'คำอธิบาย',
+    appDescriptionPlaceholder: 'ป้อนคําอธิบายของแอป',
+    useTemplate: 'ใช้เทมเพลตนี้',
+    previewDemo: 'ตัวอย่างการสาธิต',
+    chatApp: 'ผู้ช่วย',
+    chatAppIntro: 'ฉันต้องการสร้างแอปพลิเคชันที่ใช้การแชท แอพนี้ใช้รูปแบบคําถามและคําตอบ ทําให้สามารถสนทนาต่อเนื่องได้หลายรอบ',
+    agentAssistant: 'ผู้ช่วยตัวแทนใหม่',
+    completeApp: 'เครื่องกําเนิดข้อความ',
+    completeAppIntro: 'ฉันต้องการสร้างแอปพลิเคชันที่สร้างข้อความคุณภาพสูงตามข้อความแจ้ง เช่น การสร้างบทความ สรุป การแปล และอื่นๆ',
+    showTemplates: 'ฉันต้องการเลือกจากเทมเพลต',
+    hideTemplates: 'กลับไปที่การเลือกโหมด',
+    Create: 'สร้าง',
+    Cancel: 'ยกเลิก',
+    Confirm: 'ยืนยัน',
+    nameNotEmpty: 'ชื่อต้องไม่ว่างเปล่า',
+    appTemplateNotSelected: 'โปรดเลือกเทมเพลต',
+    appTypeRequired: 'โปรดเลือกประเภทแอป',
+    appCreated: 'สร้างแอป',
+    caution: 'ความระมัดระวัง',
+    appCreateDSLWarning: 'ข้อควรระวัง: ความแตกต่างของเวอร์ชัน DSL อาจส่งผลต่อคุณสมบัติบางอย่าง',
+    appCreateDSLErrorTitle: 'ความเข้ากันไม่ได้ของเวอร์ชัน',
+    appCreateDSLErrorPart1: 'ตรวจพบความแตกต่างอย่างมีนัยสําคัญในเวอร์ชัน DSL การบังคับนําเข้าอาจทําให้แอปพลิเคชันทํางานผิดปกติ',
+    appCreateDSLErrorPart2: 'คุณต้องการดําเนินการต่อหรือไม่?',
+    appCreateDSLErrorPart3: 'เวอร์ชัน DSL ของแอปพลิเคชันปัจจุบัน:',
+    appCreateDSLErrorPart4: 'เวอร์ชัน DSL ที่ระบบรองรับ:',
+    appCreateFailed: 'สร้างแอปไม่สําเร็จ',
+  },
+  editApp: 'แก้ไขข้อมูล',
+  editAppTitle: 'แก้ไขข้อมูลแอป',
+  editDone: 'อัปเดตข้อมูลแอป',
+  editFailed: 'อัปเดตข้อมูลแอปไม่สําเร็จ',
+  iconPicker: {
+    ok: 'ตกลง, ได้',
+    cancel: 'ยกเลิก',
+    emoji: 'อิโมจิ',
+    image: 'ภาพ',
+  },
+  answerIcon: {
+    title: 'ใช้ไอคอน WebApp เพื่อแทนที่ 🤖',
+    description: 'จะใช้ไอคอน WebApp เพื่อแทนที่🤖ในแอปพลิเคชันที่ใช้ร่วมกันหรือไม่',
+    descriptionInExplore: 'จะใช้ไอคอน WebApp เพื่อแทนที่🤖ใน Explore หรือไม่',
+  },
+  switch: 'เปลี่ยนไปใช้ Workflow Orchestrate',
+  switchTipStart: 'สําเนาแอปใหม่จะถูกสร้างขึ้นสําหรับคุณ และสําเนาใหม่จะเปลี่ยนเป็น Workflow Orchestration สําเนาใหม่จะ',
+  switchTip: 'ไม่อนุญาต',
+  switchTipEnd: 'เปลี่ยนกลับเป็น Basic Orchestrate',
+  switchLabel: 'สําเนาแอปที่จะสร้าง',
+  removeOriginal: 'ลบแอปเดิม',
+  switchStart: 'สวิตช์สตาร์ท',
+  typeSelector: {
+    all: 'ทุกประเภท',
+    chatbot: 'แชทบอท',
+    agent: 'ตัวแทน',
+    workflow: 'เวิร์กโฟลว์',
+    completion: 'เสร็จ สมบูรณ์',
+  },
+  tracing: {
+    title: 'การติดตามประสิทธิภาพของแอป',
+    description: 'การกําหนดค่าผู้ให้บริการ LLMOps บุคคลที่สามและประสิทธิภาพของแอปติดตาม',
+    config: 'กําหนดค่า',
+    view: 'ทิวทัศน์',
+    collapse: 'ทรุด',
+    expand: 'ขยาย',
+    tracing: 'ติดตาม',
+    disabled: 'พิการ',
+    disabledTip: 'โปรดกําหนดค่าผู้ให้บริการก่อน',
+    enabled: 'ให้บริการ',
+    tracingDescription: 'บันทึกบริบททั้งหมดของการดําเนินการแอป รวมถึงการเรียก LLM บริบท พรอมต์ คําขอ HTTP และอื่นๆ ไปยังแพลตฟอร์มการติดตามของบุคคลที่สาม',
+    configProviderTitle: {
+      configured: 'กําหนดค่าแล้ว',
+      notConfigured: 'ผู้ให้บริการกําหนดค่าเพื่อเปิดใช้งานการติดตาม',
+      moreProvider: 'ผู้ให้บริการเพิ่มเติม',
+    },
+    langsmith: {
+      title: 'แลงสมิธ',
+      description: 'แพลตฟอร์มนักพัฒนาแบบครบวงจรสําหรับทุกขั้นตอนของวงจรชีวิตแอปพลิเคชันที่ขับเคลื่อนด้วย LLM',
+    },
+    langfuse: {
+      title: 'แลงฟิวส์',
+      description: 'การติดตาม การประเมิน การจัดการพร้อมท์ และเมตริกเพื่อแก้ไขข้อบกพร่องและปรับปรุงแอปพลิเคชัน LLM ของคุณ',
+    },
+    inUse: 'ใช้งาน',
+    configProvider: {
+      title: 'กําหนดค่า',
+      placeholder: 'ป้อน {{key}} ของคุณ',
+      project: 'โครงการ',
+      publicKey: 'กุญแจสาธารณะ',
+      secretKey: 'กุญแจลับ',
+      viewDocsLink: 'ดูเอกสาร {{key}}',
+      removeConfirmTitle: 'ลบการกําหนดค่า {{key}} หรือไม่?',
+      removeConfirmContent: 'การกําหนดค่าปัจจุบันกําลังใช้งาน การลบออกจะเป็นการปิดคุณสมบัติการติดตาม',
+    },
+  },
+}
+
+export default translation

+ 118 - 0
web/i18n/th-TH/billing.ts

@@ -0,0 +1,118 @@
+const translation = {
+  currentPlan: 'แผนปัจจุบัน',
+  upgradeBtn: {
+    plain: 'แผนการอัปเกรด',
+    encourage: 'อัปเกรดเดี๋ยวนี้',
+    encourageShort: 'อัพ เกรด',
+  },
+  viewBilling: 'จัดการการเรียกเก็บเงินและการสมัครใช้งาน',
+  buyPermissionDeniedTip: 'โปรดติดต่อผู้ดูแลระบบองค์กรของคุณเพื่อสมัครสมาชิก',
+  plansCommon: {
+    title: 'เลือกแผนบริการที่เหมาะกับคุณ',
+    yearlyTip: 'รับฟรี 2 เดือนโดยสมัครสมาชิกรายปี!',
+    mostPopular: 'แห่ง',
+    planRange: {
+      monthly: 'รายเดือน',
+      yearly: 'รายปี',
+    },
+    month: 'เดือน',
+    year: 'ปี',
+    save: 'ประหยัด',
+    free: 'ฟรี',
+    currentPlan: 'แผนปัจจุบัน',
+    contractSales: 'ติดต่อฝ่ายขาย',
+    contractOwner: 'ติดต่อผู้จัดการทีม',
+    startForFree: 'เริ่มฟรี',
+    getStartedWith: 'เริ่มต้นใช้งาน',
+    contactSales: 'ติดต่อฝ่ายขาย',
+    talkToSales: 'พูดคุยกับฝ่ายขาย',
+    modelProviders: 'ผู้ให้บริการโมเดล',
+    teamMembers: 'สมาชิกในทีม',
+    annotationQuota: 'โควต้าคําอธิบายประกอบ',
+    buildApps: 'สร้างแอพ',
+    vectorSpace: 'พื้นที่เวกเตอร์',
+    vectorSpaceBillingTooltip: 'แต่ละ 1MB สามารถจัดเก็บข้อมูลแบบเวกเตอร์ได้ประมาณ 1.2 ล้านอักขระ (โดยประมาณโดยใช้ OpenAI Embeddings แตกต่างกันไปตามรุ่น)',
+    vectorSpaceTooltip: 'Vector Space เป็นระบบหน่วยความจําระยะยาวที่จําเป็นสําหรับ LLM ในการทําความเข้าใจข้อมูลของคุณ',
+    documentsUploadQuota: 'โควต้าการอัปโหลดเอกสาร',
+    documentProcessingPriority: 'ลําดับความสําคัญในการประมวลผลเอกสาร',
+    documentProcessingPriorityTip: 'สําหรับลําดับความสําคัญในการประมวลผลเอกสารที่สูงขึ้น โปรดอัปเกรดแผนของคุณ',
+    documentProcessingPriorityUpgrade: 'ประมวลผลข้อมูลได้มากขึ้นด้วยความแม่นยําที่สูงขึ้นด้วยความเร็วที่เร็วขึ้น',
+    priority: {
+      'standard': 'มาตรฐาน',
+      'priority': 'สำคัญ',
+      'top-priority': 'ลําดับความสําคัญสูงสุด',
+    },
+    logsHistory: 'ประวัติการบันทึก',
+    customTools: 'เครื่องมือที่กําหนดเอง',
+    unavailable: 'ไม่',
+    days: 'วัน',
+    unlimited: 'จำกัด',
+    support: 'สนับสนุน',
+    supportItems: {
+      communityForums: 'ฟอรัมชุมชน',
+      emailSupport: 'การสนับสนุนทางอีเมล',
+      priorityEmail: 'การสนับสนุนทางอีเมลและแชทลําดับความสําคัญ',
+      logoChange: 'การเปลี่ยนโลโก้',
+      SSOAuthentication: 'การตรวจสอบสิทธิ์ SSO',
+      personalizedSupport: 'การสนับสนุนส่วนบุคคล',
+      dedicatedAPISupport: 'รองรับ API เฉพาะ',
+      customIntegration: 'การผสานรวมและการสนับสนุนแบบกําหนดเอง',
+      ragAPIRequest: 'คําขอ RAG API',
+      bulkUpload: 'อัปโหลดเอกสารจํานวนมาก',
+      agentMode: 'โหมดตัวแทน',
+      workflow: 'เวิร์กโฟลว์',
+      llmLoadingBalancing: 'โหลดบาลานซ์ LLM',
+      llmLoadingBalancingTooltip: 'เพิ่มคีย์ API หลายคีย์ให้กับโมเดล โดยข้ามขีดจํากัดอัตรา API ได้อย่างมีประสิทธิภาพ',
+    },
+    comingSoon: 'เร็ว ๆ นี้',
+    member: 'สมาชิก',
+    memberAfter: 'สมาชิก',
+    messageRequest: {
+      title: 'เครดิตข้อความ',
+      tooltip: 'โควต้าการเรียกใช้ข้อความสําหรับแผนต่างๆ โดยใช้โมเดล OpenAI (ยกเว้น gpt4) ข้อความที่เกินขีดจํากัดจะใช้คีย์ OpenAI API ของคุณ',
+    },
+    annotatedResponse: {
+      title: 'ขีดจํากัดโควต้าคําอธิบายประกอบ',
+      tooltip: 'การแก้ไขและคําอธิบายประกอบการตอบกลับด้วยตนเองให้ความสามารถในการตอบคําถามคุณภาพสูงที่ปรับแต่งได้สําหรับแอป (ใช้ได้เฉพาะในแอปแชท)',
+    },
+    ragAPIRequestTooltip: 'หมายถึงจํานวนการเรียก API ที่เรียกใช้เฉพาะความสามารถในการประมวลผลฐานความรู้ของ Dify',
+    receiptInfo: 'เฉพาะเจ้าของทีมและผู้ดูแลทีมเท่านั้นที่สามารถสมัครสมาชิกและดูข้อมูลการเรียกเก็บเงินได้',
+  },
+  plans: {
+    sandbox: {
+      name: 'กระบะทราย',
+      description: 'ทดลองใช้ GPT ฟรี 200 ครั้ง',
+      includesTitle: 'มี:',
+    },
+    professional: {
+      name: 'มืออาชีพ',
+      description: 'สําหรับบุคคลและทีมขนาดเล็กเพื่อปลดล็อกพลังงานมากขึ้นในราคาย่อมเยา',
+      includesTitle: 'ทุกอย่างในแผนฟรี รวมถึง:',
+    },
+    team: {
+      name: 'ทีม',
+      description: 'ทํางานร่วมกันอย่างไร้ขีดจํากัดและเพลิดเพลินไปกับประสิทธิภาพระดับสูงสุด',
+      includesTitle: 'ทุกอย่างในแผน Professional รวมถึง:',
+    },
+    enterprise: {
+      name: 'กิจการ',
+      description: 'รับความสามารถและการสนับสนุนเต็มรูปแบบสําหรับระบบที่สําคัญต่อภารกิจขนาดใหญ่',
+      includesTitle: 'ทุกอย่างในแผนทีม รวมถึง:',
+    },
+  },
+  vectorSpace: {
+    fullTip: 'เวกเตอร์สเปซเต็ม',
+    fullSolution: 'อัปเกรดแผนของคุณเพื่อเพิ่มพื้นที่',
+  },
+  apps: {
+    fullTipLine1: 'อัปเกรดแผนของคุณเป็น',
+    fullTipLine2: 'สร้างแอปเพิ่มเติม',
+  },
+  annotatedResponse: {
+    fullTipLine1: 'อัปเกรดแผนของคุณเป็น',
+    fullTipLine2: 'ใส่คําอธิบายประกอบการสนทนาเพิ่มเติม',
+    quotaTitle: 'โควต้าตอบกลับคําอธิบายประกอบ',
+  },
+}
+
+export default translation

+ 598 - 0
web/i18n/th-TH/common.ts

@@ -0,0 +1,598 @@
+const translation = {
+  api: {
+    success: 'ความสําเร็จ',
+    actionSuccess: 'การดําเนินการสําเร็จ',
+    saved: 'บันทึก',
+    create: 'สร้าง',
+    remove: 'ถูก เอา ออก',
+  },
+  operation: {
+    create: 'สร้าง',
+    confirm: 'ยืนยัน',
+    cancel: 'ยกเลิก',
+    clear: 'ใส',
+    save: 'ประหยัด',
+    saveAndEnable: 'บันทึกและเปิดใช้งาน',
+    edit: 'แก้ไข',
+    add: 'เพิ่ม',
+    added: 'เพิ่ม',
+    refresh: 'เริ่มใหม่',
+    reset: 'รี เซ็ต',
+    search: 'ค้น',
+    change: 'เปลี่ยน',
+    remove: 'ถอด',
+    send: 'ส่ง',
+    copy: 'ลอก',
+    lineBreak: 'ตัวแบ่งบรรทัด',
+    sure: 'ฉันแน่ใจ',
+    download: 'ดาวน์โหลด',
+    delete: 'ลบ',
+    settings: 'การตั้งค่า',
+    setup: 'ตั้ง ค่า',
+    getForFree: 'รับฟรี',
+    reload: 'โหลด',
+    ok: 'ตกลง, ได้',
+    log: 'ซุง',
+    learnMore: 'ศึกษาเพิ่มเติม',
+    params: 'พารามิเตอร์',
+    duplicate: 'สำเนา',
+    rename: 'ตั้งชื่อใหม่',
+    audioSourceUnavailable: 'AudioSource ไม่พร้อมใช้งาน',
+    copyImage: 'คัดลอกรูปภาพ',
+    zoomOut: 'ซูมออก',
+    zoomIn: 'ซูมเข้า',
+    openInNewTab: 'เปิดในแท็บใหม่',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} เป็นสิ่งจําเป็น',
+    urlError: 'url ควรขึ้นต้นด้วย http:// หรือ https://',
+  },
+  placeholder: {
+    input: 'กรุณากรอก',
+    select: 'กรุณาเลือก',
+  },
+  voice: {
+    language: {
+      zhHans: 'จีน',
+      zhHant: 'ภาษาจีนตัวเต็ม',
+      enUS: 'อังกฤษ',
+      deDE: 'เยอรมัน',
+      frFR: 'ฝรั่งเศส',
+      esES: 'สเปน',
+      itIT: 'อิตาลี',
+      thTH: 'ไทย',
+      idID: 'อินโดนีเซีย',
+      jaJP: 'ญี่ปุ่น',
+      koKR: 'เกาหลี',
+      ptBR: 'โปรตุเกส',
+      ruRU: 'รัสเซีย',
+      ukUA: 'ยูเครน',
+      viVN: 'เวียดนาม',
+      plPL: 'โปแลนด์',
+      roRO: 'โรมาเนีย',
+      hiIN: 'ฮินดี',
+      trTR: 'ตุรกี',
+      faIR: 'ภาษาเปอร์เซีย',
+    },
+  },
+  unit: {
+    char: 'รถ ถัง',
+  },
+  actionMsg: {
+    noModification: 'ไม่มีการดัดแปลงในขณะนี้',
+    modifiedSuccessfully: 'แก้ไขสําเร็จแล้ว',
+    modifiedUnsuccessfully: 'แก้ไขไม่สําเร็จ',
+    copySuccessfully: 'คัดลอกสําเร็จแล้ว',
+    paySucceeded: 'การชําระเงินสําเร็จ',
+    payCancelled: 'ยกเลิกการชําระเงิน',
+    generatedSuccessfully: 'สร้างสําเร็จ',
+    generatedUnsuccessfully: 'สร้างไม่สําเร็จ',
+  },
+  model: {
+    params: {
+      temperature: 'อุณหภูมิ',
+      temperatureTip: 'ควบคุมการสุ่ม: การลดระดับส่งผลให้การสุ่มเสร็จน้อยลง เมื่ออุณหภูมิเข้าใกล้ศูนย์แบบจําลองจะกลายเป็นการกําหนดและซ้ําซาก',
+      top_p: 'ท็อป P',
+      top_pTip: 'ควบคุมความหลากหลายผ่านการสุ่มตัวอย่างนิวเคลียส: 0.5 หมายถึงครึ่งหนึ่งของตัวเลือกที่ถ่วงน้ําหนักความน่าจะเป็นทั้งหมดได้รับการพิจารณา',
+      presence_penalty: 'บทลงโทษการแสดงตน',
+      presence_penaltyTip: 'จะลงโทษโทเค็นใหม่เท่าใดโดยพิจารณาจากว่าโทเค็นเหล่านั้นปรากฏในข้อความหรือไม่\nเพิ่มโอกาสของโมเดลในการพูดคุยเกี่ยวกับหัวข้อใหม่',
+      frequency_penalty: 'บทลงโทษความถี่',
+      frequency_penaltyTip: 'จะลงโทษโทเค็นใหม่เท่าใดตามความถี่ที่มีอยู่ในข้อความจนถึงตอนนี้\nลดโอกาสของโมเดลที่จะทําซ้ําบรรทัดเดิมแบบคําต่อคํา',
+      max_tokens: 'โทเค็นสูงสุด',
+      max_tokensTip: 'ใช้เพื่อจํากัดความยาวสูงสุดของการตอบกลับเป็นโทเค็น \nค่าที่ใหญ่ขึ้นอาจจํากัดพื้นที่ที่เหลือสําหรับคําพร้อมท์ บันทึกการแชท และความรู้ \nขอแนะนําให้ตั้งค่าต่ํากว่าสองในสาม\nGPT-4-1106-preview, GPT-4-Vision-Preview โทเค็นสูงสุด (อินพุต 128K เอาต์พุต 4K)',
+      maxTokenSettingTip: 'การตั้งค่าโทเค็นสูงสุดของคุณสูง ซึ่งอาจจํากัดพื้นที่สําหรับข้อความแจ้ง แบบสอบถาม และข้อมูล พิจารณาตั้งค่าให้ต่ํากว่า 2/3',
+      setToCurrentModelMaxTokenTip: 'โทเค็นสูงสุดได้รับการอัปเดตเป็นโทเค็นสูงสุด 80% ของรุ่นปัจจุบัน {{maxToken}}',
+      stop_sequences: 'หยุดลําดับ',
+      stop_sequencesTip: 'สูงสุดสี่ลําดับที่ API จะหยุดสร้างโทเค็นเพิ่มเติม ข้อความที่ส่งคืนจะไม่มีลําดับการหยุด',
+      stop_sequencesPlaceholder: 'ป้อนลําดับแล้วกด Tab',
+    },
+    tone: {
+      Creative: 'สร้างสรรค์',
+      Balanced: 'สมดุล',
+      Precise: 'ถูกต้อง',
+      Custom: 'ธรรมเนียม',
+    },
+    addMoreModel: 'ไปที่การตั้งค่าเพื่อเพิ่มรุ่นเพิ่มเติม',
+  },
+  menus: {
+    status: 'Beta',
+    explore: 'สํารวจ',
+    apps: 'เรียน',
+    plugins: 'ปลั๊กอิน',
+    pluginsTips: 'รวมปลั๊กอินของบุคคลที่สามหรือสร้างปลั๊กอิน AI ที่เข้ากันได้กับ ChatGPT',
+    datasets: 'ความรู้',
+    datasetsTips: 'เร็ว ๆ นี้: นําเข้าข้อมูลข้อความของคุณเองหรือเขียนข้อมูลแบบเรียลไทม์ผ่าน Webhook เพื่อปรับปรุงบริบท LLM',
+    newApp: 'แอพใหม่',
+    newDataset: 'สร้างความรู้',
+    tools: 'เครื่อง มือ',
+  },
+  userProfile: {
+    settings: 'การตั้งค่า',
+    emailSupport: 'การสนับสนุนทางอีเมล',
+    workspace: 'พื้นที่',
+    createWorkspace: 'สร้างพื้นที่ทํางาน',
+    helpCenter: 'วิธีใช้',
+    communityFeedback: 'การตอบสนอง',
+    roadmap: 'แผนงาน',
+    community: 'ชุมชน',
+    about: 'ประมาณ',
+    logout: 'ออกจากระบบ',
+  },
+  settings: {
+    accountGroup: 'ทั่วไป',
+    workplaceGroup: 'พื้นที่',
+    account: 'บัญชีของฉัน',
+    members: 'สมาชิก',
+    billing: 'เรียก เก็บ เงิน',
+    integrations: 'บูรณาการ',
+    language: 'ภาษา',
+    provider: 'ผู้ให้บริการโมเดล',
+    dataSource: 'แหล่งข้อมูล',
+    plugin: 'ปลั๊กอิน',
+    apiBasedExtension: 'ส่วนขยาย API',
+  },
+  account: {
+    account: 'บัญชี',
+    myAccount: 'บัญชีของฉัน',
+    studio: 'Dify สตูดิโอ',
+    avatar: 'อวตาร',
+    name: 'ชื่อ',
+    email: 'อีเมล',
+    password: 'รหัสผ่าน',
+    passwordTip: 'คุณสามารถตั้งรหัสผ่านถาวรได้หากคุณไม่ต้องการใช้รหัสเข้าสู่ระบบชั่วคราว',
+    setPassword: 'ตั้งรหัสผ่าน',
+    resetPassword: 'รีเซ็ตรหัสผ่าน',
+    currentPassword: 'รหัสผ่านปัจจุบัน',
+    newPassword: 'รหัสผ่านใหม่',
+    confirmPassword: 'ยืนยันรหัสผ่าน',
+    notEqual: 'รหัสผ่านสองรหัสผ่านแตกต่างกัน',
+    langGeniusAccount: 'บัญชี Dify',
+    langGeniusAccountTip: 'บัญชี Dify และข้อมูลผู้ใช้ที่เกี่ยวข้อง',
+    editName: 'แก้ไขชื่อ',
+    showAppLength: 'แสดง {{length}} แอป',
+    delete: 'ลบบัญชี',
+    deleteTip: 'การลบบัญชีของคุณจะเป็นการลบข้อมูลทั้งหมดของคุณอย่างถาวรและไม่สามารถกู้คืนได้',
+    deleteConfirmTip: 'เพื่อยืนยัน โปรดส่งข้อมูลต่อไปนี้จากอีเมลที่ลงทะเบียนไว้ที่',
+  },
+  members: {
+    team: 'ทีม',
+    invite: 'เพิ่ม',
+    name: 'ชื่อ',
+    lastActive: 'ใช้งานล่าสุด',
+    role: 'บทบาท',
+    pending: 'รอ   ',
+    owner: 'เจ้าของ',
+    admin: 'ผู้ดูแลระบบ',
+    adminTip: 'สามารถสร้างแอพและจัดการการตั้งค่าทีมได้',
+    normal: 'ปกติ',
+    normalTip: 'ใช้ได้เฉพาะแอพ สร้างแอพไม่ได้',
+    builder: 'ผู้สร้าง',
+    builderTip: 'สามารถสร้างและแก้ไขแอปของตัวเองได้',
+    editor: 'บรรณาธิการ',
+    editorTip: 'สามารถสร้างและแก้ไขแอปได้',
+    datasetOperator: 'ผู้ดูแลระบบความรู้',
+    datasetOperatorTip: 'สามารถจัดการฐานความรู้ได้เท่านั้น',
+    inviteTeamMember: 'เพิ่มสมาชิกในทีม',
+    inviteTeamMemberTip: 'พวกเขาสามารถเข้าถึงข้อมูลทีมของคุณได้โดยตรงหลังจากลงชื่อเข้าใช้',
+    email: 'อีเมล',
+    emailInvalid: 'รูปแบบอีเมลไม่ถูกต้อง',
+    emailPlaceholder: 'กรุณากรอกอีเมล',
+    sendInvite: 'ส่งคําเชิญ',
+    invitedAsRole: 'ได้รับเชิญให้เป็นผู้ใช้ {{role}}',
+    invitationSent: 'ส่งคําเชิญแล้ว',
+    invitationSentTip: 'ส่งคําเชิญแล้ว และพวกเขาสามารถลงชื่อเข้าใช้ Dify เพื่อเข้าถึงข้อมูลทีมของคุณได้',
+    invitationLink: 'ลิงค์คําเชิญ',
+    failedInvitationEmails: 'ผู้ใช้ด้านล่างไม่ได้รับเชิญสําเร็จ',
+    ok: 'ตกลง, ได้',
+    removeFromTeam: 'ลบออกจากทีม',
+    removeFromTeamTip: 'จะลบการเข้าถึงของทีม',
+    setAdmin: 'ตั้งเป็นผู้ดูแลระบบ',
+    setMember: 'ตั้งเป็นสมาชิกสามัญ',
+    setBuilder: 'ตั้งเป็นผู้สร้าง',
+    setEditor: 'ตั้งค่าเป็นตัวแก้ไข',
+    disInvite: 'ยกเลิกคําเชิญ',
+    deleteMember: 'ลบสมาชิก',
+    you: '(คุณ)',
+  },
+  integrations: {
+    connected: 'เชื่อม ต่อ',
+    google: 'กูเกิล',
+    googleAccount: 'เข้าสู่ระบบด้วยบัญชี Google',
+    github: 'เกวบ',
+    githubAccount: 'เข้าสู่ระบบด้วยบัญชี GitHub',
+    connect: 'ติด',
+  },
+  language: {
+    displayLanguage: 'ภาษาที่แสดง',
+    timezone: 'เขตเวลา',
+  },
+  provider: {
+    apiKey: 'คีย์ API',
+    enterYourKey: 'ป้อนคีย์ API ของคุณที่นี่',
+    invalidKey: 'คีย์ OpenAI API ไม่ถูกต้อง',
+    validatedError: 'การตรวจสอบล้มเหลว:',
+    validating: 'กําลังตรวจสอบความถูกต้องของคีย์...',
+    saveFailed: 'บันทึกคีย์ API ล้มเหลว',
+    apiKeyExceedBill: 'คีย์ API นี้ไม่มีโควต้า โปรดอ่าน',
+    addKey: 'เพิ่มคีย์',
+    comingSoon: 'เร็ว ๆ นี้',
+    editKey: 'แก้ไข',
+    invalidApiKey: 'คีย์ API ไม่ถูกต้อง',
+    azure: {
+      apiBase: 'ฐาน API',
+      apiBasePlaceholder: 'URL ฐาน API ของปลายทาง Azure OpenAI ของคุณ',
+      apiKey: 'คีย์ API',
+      apiKeyPlaceholder: 'ป้อนคีย์ API ของคุณที่นี่',
+      helpTip: 'เรียนรู้บริการ Azure OpenAI',
+    },
+    openaiHosted: {
+      openaiHosted: 'โฮสต์ OpenAI',
+      onTrial: 'ทดลองใช้',
+      exhausted: 'โควต้าหมด',
+      desc: 'บริการโฮสติ้ง OpenAI ที่ให้บริการโดย Dify ช่วยให้คุณใช้โมเดลต่างๆ เช่น GPT-3.5 ก่อนที่โควต้าการทดลองใช้ของคุณจะหมด คุณจําเป็นต้องตั้งค่าผู้ให้บริการรุ่นอื่นๆ',
+      callTimes: 'เวลาโทร',
+      usedUp: 'โควต้าทดลองใช้หมด เพิ่มผู้ให้บริการโมเดลของตัวเอง',
+      useYourModel: 'ปัจจุบันใช้ผู้ให้บริการโมเดลของตัวเอง',
+      close: 'ปิด',
+    },
+    anthropicHosted: {
+      anthropicHosted: 'Claude มานุษยวิทยา',
+      onTrial: 'ทดลองใช้',
+      exhausted: 'โควต้าหมด',
+      desc: 'โมเดลที่ทรงพลังซึ่งเก่งในงานที่หลากหลายตั้งแต่บทสนทนาที่ซับซ้อนและการสร้างเนื้อหาที่สร้างสรรค์ไปจนถึงคําแนะนําโดยละเอียด',
+      callTimes: 'เวลาโทร',
+      usedUp: 'โควต้าทดลองใช้หมด เพิ่มผู้ให้บริการโมเดลของตัวเอง',
+      useYourModel: 'ปัจจุบันใช้ผู้ให้บริการโมเดลของตัวเอง',
+      close: 'ปิด',
+    },
+    anthropic: {
+      using: 'ความสามารถในการฝังกําลังใช้',
+      enableTip: 'ในการเปิดใช้งานโมเดล Anthropic คุณต้องผูกกับ OpenAI หรือ Azure OpenAI Service ก่อน',
+      notEnabled: 'ไม่ได้เปิดใช้งาน',
+      keyFrom: 'รับคีย์ API ของคุณจาก Anthropic',
+    },
+    encrypted: {
+      front: 'คีย์ API ของคุณจะถูกเข้ารหัสและจัดเก็บโดยใช้',
+      back: 'เทคโนโลยี ',
+    },
+  },
+  modelProvider: {
+    notConfigured: 'โมเดลระบบยังไม่ได้รับการกําหนดค่าอย่างสมบูรณ์ และฟังก์ชันบางอย่างอาจไม่พร้อมใช้งาน',
+    systemModelSettings: 'การตั้งค่ารุ่นระบบ',
+    systemModelSettingsLink: 'เหตุใดจึงจําเป็นต้องตั้งค่าโมเดลระบบ',
+    selectModel: 'เลือกรุ่นของคุณ',
+    setupModelFirst: 'โปรดตั้งค่าโมเดลของคุณก่อน',
+    systemReasoningModel: {
+      key: 'แบบจําลองการให้เหตุผลของระบบ',
+      tip: 'ตั้งค่าโมเดลการอนุมานเริ่มต้นที่จะใช้สําหรับการสร้างแอปพลิเคชัน ตลอดจนคุณลักษณะต่างๆ เช่น การสร้างชื่อบทสนทนาและคําแนะนําคําถามถัดไปจะใช้โมเดลการอนุมานเริ่มต้นด้วย',
+    },
+    embeddingModel: {
+      key: 'โมเดลการฝัง',
+      tip: 'ตั้งค่าโมเดลเริ่มต้นสําหรับการประมวลผลการฝังเอกสารของความรู้ ทั้งการดึงข้อมูลและการนําเข้าความรู้ใช้โมเดลการฝังนี้สําหรับการประมวลผลแบบเวกเตอร์ การสลับจะทําให้มิติเวกเตอร์ระหว่างความรู้ที่นําเข้าและคําถามไม่สอดคล้องกัน เพื่อหลีกเลี่ยงความล้มเหลวในการดึงข้อมูล โปรดอย่าเปลี่ยนรุ่นนี้ตามต้องการ',
+      required: 'จําเป็นต้องมีแบบจําลองการฝัง',
+    },
+    speechToTextModel: {
+      key: 'โมเดลคําพูดเป็นข้อความ',
+      tip: 'ตั้งค่าโมเดลเริ่มต้นสําหรับการป้อนข้อมูลคําพูดเป็นข้อความในการสนทนา',
+    },
+    ttsModel: {
+      key: 'โมเดลการแปลงข้อความเป็นคําพูด',
+      tip: 'ตั้งค่าโมเดลเริ่มต้นสําหรับการป้อนข้อมูลเป็นข้อความเป็นคําพูดในการสนทนา',
+    },
+    rerankModel: {
+      key: 'จัดอันดับโมเดลใหม่',
+      tip: 'โมเดล Rerank จะจัดลําดับรายการเอกสารผู้สมัครใหม่ตามการจับคู่ความหมายกับการสืบค้นของผู้ใช้ ซึ่งช่วยปรับปรุงผลลัพธ์ของการจัดอันดับความหมาย',
+    },
+    apiKey: 'คีย์ API',
+    quota: 'โควตา',
+    searchModel: 'ค้นหารุ่น',
+    noModelFound: 'ไม่พบแบบจําลองสําหรับ {{model}}',
+    models: 'รุ่น',
+    showMoreModelProvider: 'แสดงผู้ให้บริการรุ่นเพิ่มเติม',
+    selector: {
+      tip: 'รุ่นนี้ถูกลบออกแล้ว โปรดเพิ่มรุ่นหรือเลือกรุ่นอื่น',
+      emptyTip: 'ไม่มีรุ่นที่พร้อมใช้งาน',
+      emptySetting: 'โปรดไปที่การตั้งค่าเพื่อกําหนดค่า',
+      rerankTip: 'โปรดตั้งค่าโมเดล Rerank',
+    },
+    card: {
+      quota: 'โควตา',
+      onTrial: 'ทดลองใช้',
+      paid: 'จ่าย',
+      quotaExhausted: 'โควต้าหมด',
+      callTimes: 'เวลาโทร',
+      tokens: 'โท เค็น',
+      buyQuota: 'ซื้อโควต้า',
+      priorityUse: 'ลําดับความสําคัญในการใช้งาน',
+      removeKey: 'ลบคีย์ API',
+      tip: 'ลําดับความสําคัญจะได้รับจากโควต้าที่จ่าย โควต้าทดลองใช้จะถูกใช้หลังจากโควต้าที่จ่ายหมด',
+    },
+    item: {
+      deleteDesc: '{{modelName}} ถูกใช้เป็นแบบจําลองการให้เหตุผลของระบบ ฟังก์ชันบางอย่างจะไม่สามารถใช้งานได้หลังจากการลบออก กรุณายืนยัน',
+      freeQuota: 'โควต้าฟรี',
+    },
+    addApiKey: 'เพิ่มคีย์ API ของคุณ',
+    invalidApiKey: 'คีย์ API ไม่ถูกต้อง',
+    encrypted: {
+      front: 'คีย์ API ของคุณจะถูกเข้ารหัสและจัดเก็บโดยใช้',
+      back: 'เทคโนโลยี ',
+    },
+    freeQuota: {
+      howToEarn: 'วิธีรับ',
+    },
+    addMoreModelProvider: 'เพิ่มผู้ให้บริการโมเดลเพิ่มเติม',
+    addModel: 'เพิ่มรุ่น',
+    modelsNum: '{{num}} รุ่น',
+    showModels: 'แสดงโมเดล',
+    showModelsNum: 'แสดง {{num}} โมเดล',
+    collapse: 'ทรุด',
+    config: 'กําหนดค่า',
+    modelAndParameters: 'รุ่นและพารามิเตอร์',
+    model: 'แบบ',
+    featureSupported: 'รองรับ {{feature}}',
+    callTimes: 'เวลาโทร',
+    credits: 'เครดิตข้อความ',
+    buyQuota: 'ซื้อโควต้า',
+    getFreeTokens: 'รับโทเค็นฟรี',
+    priorityUsing: 'จัดลําดับความสําคัญของการใช้',
+    deprecated: 'เลิกใช้งานแล้ว',
+    confirmDelete: 'ยืนยันการลบ?',
+    quotaTip: 'โทเค็นฟรีที่เหลืออยู่',
+    loadPresets: 'โหลดค่าที่ตั้งไว้ล่วงหน้า',
+    parameters: 'พารามิเตอร์',
+    loadBalancing: 'โหลดบาลานซ์',
+    loadBalancingDescription: 'ลดแรงกดดันด้วยข้อมูลประจําตัวหลายชุด',
+    loadBalancingHeadline: 'โหลดบาลานซ์',
+    configLoadBalancing: 'กําหนดค่าโหลดบาลานซ์',
+    modelHasBeenDeprecated: 'โมเดลนี้เลิกใช้แล้ว',
+    providerManaged: 'จัดการผู้ให้บริการ',
+    providerManagedDescription: 'ใช้ข้อมูลประจําตัวชุดเดียวที่ผู้ให้บริการโมเดลให้มา',
+    defaultConfig: 'การกําหนดค่าเริ่มต้น',
+    apiKeyStatusNormal: 'สถานะ APIKey เป็นปกติ',
+    apiKeyRateLimit: 'ถึงขีดจํากัดอัตราแล้ว พร้อมใช้งานหลังจาก {{seconds}}s',
+    addConfig: 'เพิ่มการกําหนดค่า',
+    editConfig: 'แก้ไขการกําหนดค่า',
+    loadBalancingLeastKeyWarning: 'หากต้องการเปิดใช้งานการปรับสมดุลโหลด ต้องเปิดใช้งานคีย์อย่างน้อย 2 ปุ่ม',
+    loadBalancingInfo: 'ตามค่าเริ่มต้น การปรับสมดุลภาระงานจะใช้กลยุทธ์แบบ Round-robin หากเปิดใช้งานการจํากัดอัตรา จะมีการใช้ระยะเวลาคูลดาวน์ 1 นาที',
+    upgradeForLoadBalancing: 'อัปเกรดแผนของคุณเพื่อเปิดใช้งานการปรับสมดุลโหลด',
+  },
+  dataSource: {
+    add: 'เพิ่มแหล่งข้อมูล',
+    connect: 'ติด',
+    configure: 'กําหนดค่า',
+    notion: {
+      title: 'แนวคิด',
+      description: 'การใช้ Notion เป็นแหล่งข้อมูลสําหรับความรู้',
+      connectedWorkspace: 'พื้นที่ทํางานที่เชื่อมต่อ',
+      addWorkspace: 'เพิ่มพื้นที่ทํางาน',
+      connected: 'เชื่อม ต่อ',
+      disconnected: 'เชื่อม ต่อ',
+      changeAuthorizedPages: 'เปลี่ยนหน้าที่ได้รับอนุญาต',
+      pagesAuthorized: 'เพจที่ได้รับอนุญาต',
+      sync: 'ซิงค์',
+      remove: 'ถอด',
+      selector: {
+        pageSelected: 'หน้าที่เลือก',
+        searchPages: 'หน้าค้นหา...',
+        noSearchResult: 'ไม่มีผลการค้นหา',
+        addPages: 'เพิ่มหน้า',
+        preview: 'ดูตัวอย่าง',
+      },
+    },
+    website: {
+      title: 'เว็บไซต์',
+      description: 'นําเข้าเนื้อหาจากเว็บไซต์โดยใช้โปรแกรมรวบรวมข้อมูลเว็บ',
+      with: 'กับ',
+      configuredCrawlers: 'โปรแกรมรวบรวมข้อมูลที่กําหนดค่าไว้',
+      active: 'กระปรี้กระเปร่า',
+      inactive: 'เกียจคร้าน',
+    },
+  },
+  plugin: {
+    serpapi: {
+      apiKey: 'คีย์ API',
+      apiKeyPlaceholder: 'ป้อนคีย์ API ของคุณ',
+      keyFrom: 'รับคีย์ SerpAPI ของคุณจากหน้าบัญชี SerpAPI',
+    },
+  },
+  apiBasedExtension: {
+    title: 'ส่วนขยาย API ให้การจัดการ API แบบรวมศูนย์ ทําให้การกําหนดค่าง่ายขึ้นเพื่อให้ใช้งานได้ง่ายในแอปพลิเคชันของ Dify',
+    link: 'เรียนรู้วิธีพัฒนาส่วนขยาย API ของคุณเอง',
+    linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension',
+    add: 'เพิ่มส่วนขยาย API',
+    selector: {
+      title: 'ส่วนขยาย API',
+      placeholder: 'โปรดเลือกส่วนขยาย API',
+      manage: 'จัดการส่วนขยาย API',
+    },
+    modal: {
+      title: 'เพิ่มส่วนขยาย API',
+      editTitle: 'แก้ไขส่วนขยาย API',
+      name: {
+        title: 'ชื่อ',
+        placeholder: 'กรุณากรอกชื่อ',
+      },
+      apiEndpoint: {
+        title: 'ปลายทาง API',
+        placeholder: 'โปรดป้อนปลายทาง API',
+      },
+      apiKey: {
+        title: 'คีย์ API',
+        placeholder: 'กรุณาป้อนคีย์ API',
+        lengthError: 'ความยาวคีย์ API ต้องไม่น้อยกว่า 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-เทอร์โบ',
+    'gpt-3.5-turbo-16k': 'GPT-3.5-เทอร์โบ-16K',
+    'gpt-4': 'จีพีที-4',
+    'gpt-4-32k': 'จีทีพี-4-32 เค',
+    'text-davinci-003': 'ข้อความ-Davinci-003',
+    'text-embedding-ada-002': 'การฝังข้อความ-ADA-002',
+    'whisper-1': 'กระซิบ-1',
+    'claude-instant-1': 'Claude-Instant',
+    'claude-2': 'Claude-2 (โคลด-2)',
+  },
+  chat: {
+    renameConversation: 'เปลี่ยนชื่อการสนทนา',
+    conversationName: 'ชื่อการสนทนา',
+    conversationNamePlaceholder: 'กรุณากรอกชื่อการสนทนา',
+    conversationNameCanNotEmpty: 'ต้องมีชื่อการสนทนา',
+    citation: {
+      title: 'อ้าง อิง',
+      linkToDataset: 'ลิงค์สู่ความรู้',
+      characters: 'อักขระ:',
+      hitCount: 'จํานวนการดึงข้อมูล:',
+      vectorHash: 'แฮชเวกเตอร์:',
+      hitScore: 'คะแนนการดึงข้อมูล:',
+    },
+    inputPlaceholder: 'พูดคุยกับบอท',
+  },
+  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: 'มีอยู่แล้วในพรอมต์',
+  },
+  imageUploader: {
+    uploadFromComputer: 'อัปโหลดจากคอมพิวเตอร์',
+    uploadFromComputerReadError: 'การอ่านภาพล้มเหลว โปรดลองอีกครั้ง',
+    uploadFromComputerUploadError: 'อัปโหลดรูปภาพล้มเหลว โปรดอัปโหลดอีกครั้ง',
+    uploadFromComputerLimit: 'อัปโหลดรูปภาพต้องไม่เกิน {{size}} MB',
+    pasteImageLink: 'วางลิงก์รูปภาพ',
+    pasteImageLinkInputPlaceholder: 'วางลิงค์รูปภาพที่นี่',
+    pasteImageLinkInvalid: 'ลิงก์รูปภาพไม่ถูกต้อง',
+    imageUpload: 'อัปโหลดรูปภาพ',
+  },
+  fileUploader: {
+    uploadFromComputer: 'อัปโหลดในเครื่อง',
+    pasteFileLink: 'วางลิงค์ไฟล์',
+    pasteFileLinkInputPlaceholder: 'ป้อน URL...',
+    uploadFromComputerReadError: 'การอ่านไฟล์ล้มเหลว โปรดลองอีกครั้ง',
+    uploadFromComputerUploadError: 'อัปโหลดไฟล์ล้มเหลว โปรดอัปโหลดอีกครั้ง',
+    uploadFromComputerLimit: 'อัปโหลด {{type}} ต้องไม่เกิน {{size}}',
+    pasteFileLinkInvalid: 'ลิงก์ไฟล์ไม่ถูกต้อง',
+    fileExtensionNotSupport: 'ไม่รองรับนามสกุลไฟล์',
+  },
+  tag: {
+    placeholder: 'แท็กทั้งหมด',
+    addNew: 'เพิ่มแท็กใหม่',
+    noTag: 'ไม่มีแท็ก',
+    noTagYet: 'ยังไม่มีแท็ก',
+    addTag: 'เพิ่มแท็ก',
+    editTag: 'แก้ไขแท็ก',
+    manageTags: 'จัดการแท็ก',
+    selectorPlaceholder: 'พิมพ์เพื่อค้นหาหรือสร้าง',
+    create: 'สร้าง',
+    delete: 'ลบแท็ก',
+    deleteTip: 'แท็กกําลังถูกใช้ลบออก?',
+    created: 'สร้างแท็กสําเร็จ',
+    failed: 'การสร้างแท็กล้มเหลว',
+  },
+  license: {
+    expiring: 'หมดอายุในหนึ่งวัน',
+    expiring_plural: 'หมดอายุใน {{count}} วัน',
+  },
+  pagination: {
+    perPage: 'รายการต่อหน้า',
+  },
+}
+
+export default translation

+ 30 - 0
web/i18n/th-TH/custom.ts

@@ -0,0 +1,30 @@
+const translation = {
+  custom: 'กำหนด เอง',
+  upgradeTip: {
+    prefix: 'อัปเกรดแผนของคุณเป็น',
+    suffix: 'ปรับแต่งแบรนด์ของคุณ',
+  },
+  webapp: {
+    title: 'ปรับแต่งแบรนด์ WebApp',
+    removeBrand: 'ลบ ขับเคลื่อนโดย Dify',
+    changeLogo: 'การเปลี่ยนแปลงที่ขับเคลื่อนโดยภาพลักษณ์ของแบรนด์',
+    changeLogoTip: 'รูปแบบ SVG หรือ PNG ที่มีขนาดขั้นต่ํา 40x40px',
+  },
+  app: {
+    title: 'ปรับแต่งแบรนด์ส่วนหัวของแอป',
+    changeLogoTip: 'รูปแบบ SVG หรือ PNG ที่มีขนาดขั้นต่ํา 80x80px',
+  },
+  upload: 'อัปโหลด',
+  uploading: 'อัป โหลด',
+  uploadedFail: 'อัปโหลดรูปภาพล้มเหลวโปรดอัปโหลดใหม่',
+  change: 'เปลี่ยน',
+  apply: 'ใช้',
+  restore: 'คืนค่าเริ่มต้น',
+  customize: {
+    contactUs: 'ติดต่อเรา',
+    prefix: 'หากต้องการปรับแต่งโลโก้แบรนด์ภายในแอพ โปรด',
+    suffix: 'เพื่ออัปเกรดเป็นรุ่น Enterprise',
+  },
+}
+
+export default translation

+ 176 - 0
web/i18n/th-TH/dataset-creation.ts

@@ -0,0 +1,176 @@
+const translation = {
+  steps: {
+    header: {
+      creation: 'สร้างความรู้',
+      update: 'เพิ่มข้อมูล',
+    },
+    one: 'เลือกแหล่งข้อมูล',
+    two: 'การประมวลผลและการทําความสะอาดข้อความล่วงหน้า',
+    three: 'ดําเนินการและเสร็จสิ้น',
+  },
+  error: {
+    unavailable: 'ความรู้นี้ไม่มี',
+  },
+  firecrawl: {
+    configFirecrawl: 'กําหนดค่า 🔥Firecrawl',
+    apiKeyPlaceholder: 'คีย์ API จาก firecrawl.dev',
+    getApiKeyLinkText: 'รับคีย์ API ของคุณจาก firecrawl.dev',
+  },
+  jinaReader: {
+    configJinaReader: 'กําหนดค่า Jina Reader',
+    apiKeyPlaceholder: 'คีย์ API จาก jina.ai',
+    getApiKeyLinkText: 'รับคีย์ API ฟรีได้ที่ jina.ai',
+  },
+  stepOne: {
+    filePreview: 'ตัวอย่างไฟล์',
+    pagePreview: 'ตัวอย่างหน้า',
+    dataSourceType: {
+      file: 'นําเข้าจากไฟล์',
+      notion: 'ซิงค์จาก Notion',
+      web: 'ซิงค์จากเว็บไซต์',
+    },
+    uploader: {
+      title: 'อัปโหลดไฟล์',
+      button: 'ลากและวางไฟล์ หรือ',
+      browse: 'เล็ม',
+      tip: 'รองรับ {{supportTypes}} สูงสุด {{size}}MB แต่ละตัว',
+      validation: {
+        typeError: 'ไม่รองรับประเภทไฟล์',
+        size: 'ไฟล์ใหญ่เกินไป สูงสุดคือ {{size}}MB',
+        count: 'ไม่รองรับหลายไฟล์',
+        filesNumber: 'คุณถึงขีดจํากัดการอัปโหลดเป็นชุดของ {{filesNumber}} แล้ว',
+      },
+      cancel: 'ยกเลิก',
+      change: 'เปลี่ยน',
+      failed: 'อัปโหลดล้มเหลว',
+    },
+    notionSyncTitle: 'ความคิดไม่เชื่อมต่อ',
+    notionSyncTip: 'ในการซิงค์กับ Notion ต้องสร้างการเชื่อมต่อกับ Notion ก่อน',
+    connect: 'ไปที่เชื่อมต่อ',
+    button: 'ต่อไป',
+    emptyDatasetCreation: 'ฉันต้องการสร้างความรู้ที่ว่างเปล่า',
+    modal: {
+      title: 'สร้างความรู้ที่ว่างเปล่า',
+      tip: 'ความรู้ที่ว่างเปล่าจะไม่มีเอกสาร และคุณสามารถอัปโหลดเอกสารได้ตลอดเวลา',
+      input: 'ชื่อความรู้',
+      placeholder: 'กรุณาป้อน',
+      nameNotEmpty: 'ชื่อต้องไม่ว่างเปล่า',
+      nameLengthInvalid: 'ชื่อต้องมีอักขระระหว่าง 1 ถึง 40 ตัว',
+      cancelButton: 'ยกเลิก',
+      confirmButton: 'สร้าง',
+      failed: 'การสร้างล้มเหลว',
+    },
+    website: {
+      chooseProvider: 'เลือกผู้ให้บริการ',
+      fireCrawlNotConfigured: 'ไม่ได้กําหนดค่า Firecrawl',
+      fireCrawlNotConfiguredDescription: 'กําหนดค่า Firecrawl ด้วยคีย์ API เพื่อใช้งาน',
+      jinaReaderNotConfigured: 'ไม่ได้กําหนดค่า Jina Reader',
+      jinaReaderNotConfiguredDescription: 'ตั้งค่า Jina Reader โดยป้อนคีย์ API ฟรีเพื่อเข้าถึง',
+      configure: 'กําหนดค่า',
+      run: 'วิ่ง',
+      firecrawlTitle: 'แยกเนื้อหาเว็บด้วย 🔥Firecrawl',
+      firecrawlDoc: 'เอกสาร Firecrawl',
+      firecrawlDocLink: 'https://docs.dify.ai/guides/knowledge-base/sync-from-website',
+      jinaReaderTitle: 'แปลงทั้งไซต์เป็น Markdown',
+      jinaReaderDoc: 'เรียนรู้เพิ่มเติมเกี่ยวกับ Jina Reader',
+      jinaReaderDocLink: 'https://jina.ai/reader',
+      useSitemap: 'ใช้แผนผังเว็บไซต์',
+      useSitemapTooltip: 'ทําตามแผนผังเว็บไซต์เพื่อรวบรวมข้อมูลเว็บไซต์ หากไม่เป็นเช่นนั้น Jina Reader จะรวบรวมข้อมูลซ้ําๆ ตามความเกี่ยวข้องของหน้า โดยให้หน้าเว็บน้อยลงแต่มีคุณภาพสูงกว่า',
+      options: 'ตัวเลือก',
+      crawlSubPage: 'รวบรวมข้อมูลหน้าย่อย',
+      limit: 'เขต',
+      maxDepth: 'ความลึกสูงสุด',
+      excludePaths: 'ยกเว้นเส้นทาง',
+      includeOnlyPaths: 'รวมเฉพาะเส้นทาง',
+      extractOnlyMainContent: 'แยกเฉพาะเนื้อหาหลัก (ไม่มีส่วนหัว การนําทาง ส่วนท้าย ฯลฯ)',
+      exceptionErrorTitle: 'มีข้อยกเว้นเกิดขึ้นขณะรันงานการรวบรวมข้อมูล:',
+      unknownError: 'ข้อผิดพลาดที่ไม่รู้จัก',
+      totalPageScraped: 'จํานวนหน้าที่ขูด:',
+      selectAll: 'เลือกทั้งหมด',
+      resetAll: 'รีเซ็ตทั้งหมด',
+      scrapTimeInfo: 'ขูด {{total}} หน้าทั้งหมดภายใน {{time}}s',
+      preview: 'ดูตัวอย่าง',
+      maxDepthTooltip: 'ความลึกสูงสุดในการรวบรวมข้อมูลเมื่อเทียบกับ URL ที่ป้อน ความลึก 0 เพียงแค่ขูดหน้าของ URL ที่ป้อนความลึก 1 ขูด url และทุกอย่างหลังจาก enteredURL + หนึ่ง / เป็นต้น',
+    },
+  },
+  stepTwo: {
+    segmentation: 'การตั้งค่าก้อน',
+    auto: 'อัตโนมัติ',
+    autoDescription: 'ตั้งค่ากฎการแบ่งกลุ่มและการประมวลผลล่วงหน้าโดยอัตโนมัติ ขอแนะนําให้ผู้ใช้ที่ไม่คุ้นเคยเลือกสิ่งนี้',
+    custom: 'ธรรมเนียม',
+    customDescription: 'ปรับแต่งกฎของกลุ่ม ความยาวของกลุ่ม และกฎการประมวลผลล่วงหน้า ฯลฯ',
+    separator: 'ตัวคั่น',
+    separatorTip: 'ตัวคั่นคืออักขระที่ใช้ในการแยกข้อความ \\n\\n และ \\n เป็นตัวคั่นที่ใช้กันทั่วไปสําหรับการแยกย่อหน้าและบรรทัด เมื่อรวมกับเครื่องหมายจุลภาค (\\n\\n,\\n) ย่อหน้าจะถูกแบ่งตามบรรทัดเมื่อเกินความยาวของก้อนสูงสุด คุณยังสามารถใช้ตัวคั่นพิเศษที่กําหนดโดยตัวคุณเอง (เช่น ***)',
+    separatorPlaceholder: '\\n\\n สําหรับแยกย่อหน้า \\n สําหรับแยกเส้น',
+    maxLength: 'ความยาวก้อนสูงสุด',
+    maxLengthCheck: 'ความยาวก้อนสูงสุดควรน้อยกว่า 4000',
+    overlap: 'การทับซ้อนกันของก้อน',
+    overlapTip: 'การตั้งค่าการทับซ้อนกันของกลุ่มสามารถรักษาความเกี่ยวข้องทางความหมายระหว่างกันได้ ขอแนะนําให้ตั้งค่า 10%-25% ของขนาดก้อนสูงสุด',
+    overlapCheck: 'การทับซ้อนกันของก้อนไม่ควรใหญ่กว่าความยาวของก้อนสูงสุด',
+    rules: 'กฎการประมวลผลข้อความล่วงหน้า',
+    removeExtraSpaces: 'แทนที่ช่องว่างบรรทัดใหม่และแท็บที่ต่อเนื่องกัน',
+    removeUrlEmails: 'ลบ URL และที่อยู่อีเมลทั้งหมด',
+    removeStopwords: 'ลบคําหยุด เช่น "a", "an", "the"',
+    preview: 'ยืนยันและดูตัวอย่าง',
+    reset: 'รี เซ็ต',
+    indexMode: 'โหมดดัชนี',
+    qualified: 'คุณภาพสูง',
+    recommend: 'แนะนำ',
+    qualifiedTip: 'เรียกใช้อินเทอร์เฟซการฝังระบบเริ่มต้นสําหรับการประมวลผลเพื่อให้มีความแม่นยําสูงขึ้นเมื่อผู้ใช้สืบค้น',
+    warning: 'โปรดตั้งค่าคีย์ API ของผู้ให้บริการโมเดลก่อน',
+    click: 'ไปที่การตั้งค่า',
+    economical: 'ประหยัด',
+    economicalTip: 'ใช้เอ็นจิ้นเวกเตอร์ออฟไลน์ ดัชนีคําหลัก ฯลฯ เพื่อลดความแม่นยําโดยไม่ต้องใช้โทเค็น',
+    QATitle: 'การแบ่งกลุ่มในรูปแบบคําถามและคําตอบ',
+    QATip: 'การเปิดใช้งานตัวเลือกนี้จะใช้โทเค็นมากขึ้น',
+    QALanguage: 'แบ่งกลุ่มโดยใช้',
+    estimateCost: 'กะ',
+    estimateSegment: 'ก้อนโดยประมาณ',
+    segmentCount: 'ก้อน',
+    calculating: 'คำนวณ   ',
+    fileSource: 'เตรียมเอกสารล่วงหน้า',
+    notionSource: 'หน้าประมวลผลล่วงหน้า',
+    websiteSource: 'เว็บไซต์ Preprocess',
+    other: 'และอื่น ๆ',
+    fileUnit: 'แฟ้ม',
+    notionUnit: 'หน้า',
+    webpageUnit: 'หน้า',
+    previousStep: 'ขั้นตอนก่อนหน้า',
+    nextStep: 'บันทึกและประมวลผล',
+    save: 'บันทึกและประมวลผล',
+    cancel: 'ยกเลิก',
+    sideTipTitle: 'ทําไมต้องแบ่งกลุ่มและเตรียมกระบวนการล่วงหน้า?',
+    sideTipP1: 'เมื่อประมวลผลข้อมูลข้อความ การแบ่งกลุ่มและการทําความสะอาดเป็นขั้นตอนการประมวลผลล่วงหน้าที่สําคัญสองขั้นตอน',
+    sideTipP2: 'การแบ่งส่วนจะแบ่งข้อความยาวออกเป็นย่อหน้าเพื่อให้โมเดลเข้าใจได้ดีขึ้น สิ่งนี้ช่วยปรับปรุงคุณภาพและความเกี่ยวข้องของผลลัพธ์ของแบบจําลอง',
+    sideTipP3: 'การทําความสะอาดจะลบอักขระและรูปแบบที่ไม่จําเป็น ทําให้ความรู้สะอาดขึ้นและง่ายต่อการแยกวิเคราะห์',
+    sideTipP4: 'การแบ่งส่วนและการทําความสะอาดที่เหมาะสมช่วยปรับปรุงประสิทธิภาพของโมเดล ให้ผลลัพธ์ที่แม่นยําและมีคุณค่ามากขึ้น',
+    previewTitle: 'ดูตัวอย่าง',
+    previewTitleButton: 'ดูตัวอย่าง',
+    previewButton: 'การเปลี่ยนไปใช้รูปแบบ Q&A',
+    previewSwitchTipStart: 'การแสดงตัวอย่างส่วนปัจจุบันอยู่ในรูปแบบข้อความ การเปลี่ยนไปใช้ตัวอย่างรูปแบบคําถามและคําตอบจะ',
+    previewSwitchTipEnd: 'ใช้โทเค็นเพิ่มเติม',
+    characters: 'อักขระ',
+    indexSettingTip: 'หากต้องการเปลี่ยนวิธีการจัดทําดัชนีและรูปแบบการฝัง โปรดไปที่',
+    retrievalSettingTip: 'หากต้องการเปลี่ยนการตั้งค่าการดึงข้อมูล โปรดไปที่',
+    datasetSettingLink: 'การตั้งค่าความรู้',
+  },
+  stepThree: {
+    creationTitle: '🎉 สร้างความรู้',
+    creationContent: 'เราตั้งชื่อความรู้โดยอัตโนมัติ คุณสามารถแก้ไขได้ตลอดเวลา',
+    label: 'ชื่อความรู้',
+    additionTitle: '🎉 อัปโหลดเอกสาร',
+    additionP1: 'เอกสารถูกอัปโหลดไปยังความรู้แล้ว',
+    additionP2: 'คุณสามารถค้นหาได้ในรายการเอกสารของความรู้',
+    stop: 'หยุดการประมวลผล',
+    resume: 'ดําเนินการต่อ',
+    navTo: 'ไปที่เอกสาร',
+    sideTipTitle: 'อะไรต่อไป',
+    sideTipContent: 'หลังจากที่เอกสารเสร็จสิ้นการจัดทําดัชนี ความรู้สามารถรวมเข้ากับแอปพลิเคชันเป็นบริบท คุณสามารถค้นหาการตั้งค่าบริบทในหน้าการประสานงานพร้อมท์ คุณยังสามารถสร้างเป็นปลั๊กอินการจัดทําดัชนี ChatGPT อิสระสําหรับการเผยแพร่',
+    modelTitle: 'คุณแน่ใจหรือว่าจะหยุดฝัง?',
+    modelContent: 'หากคุณต้องการดําเนินการต่อในภายหลัง คุณจะดําเนินการต่อจากจุดที่คุณค้างไว้',
+    modelButtonConfirm: 'ยืนยัน',
+    modelButtonCancel: 'ยกเลิก',
+  },
+}
+
+export default translation

+ 351 - 0
web/i18n/th-TH/dataset-documents.ts

@@ -0,0 +1,351 @@
+const translation = {
+  list: {
+    title: 'เอกสาร',
+    desc: 'ไฟล์ทั้งหมดของความรู้จะแสดงที่นี่ และความรู้ทั้งหมดสามารถเชื่อมโยงกับการอ้างอิง Dify หรือจัดทําดัชนีผ่านปลั๊กอินแชท',
+    addFile: 'เพิ่มไฟล์',
+    addPages: 'เพิ่มหน้า',
+    addUrl: 'เพิ่ม URL',
+    table: {
+      header: {
+        fileName: 'ชื่อไฟล์',
+        words: 'นิรุกติ',
+        hitCount: 'จํานวนการดึงข้อมูล',
+        uploadTime: 'เวลาอัปโหลด',
+        status: 'สถานะ',
+        action: 'การเคลื่อนไหว',
+      },
+      rename: 'ตั้งชื่อใหม่',
+      name: 'ชื่อ',
+    },
+    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: 'คุณสามารถอัปโหลดไฟล์ ซิงค์จากเว็บไซต์ หรือจากแอป webb เช่น Notion, 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: 'มมมม ด, ป hh:mm A',
+    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: 'ไอเอส',
+        category: 'ประเภท',
+      },
+      webPage: {
+        title: 'ชื่อเรื่อง',
+        url: 'URL',
+        language: 'ภาษา',
+        authorPublisher: 'ผู้เขียน/สํานักพิมพ์',
+        publishDate: 'วันที่เผยแพร่',
+        topicsKeywords: 'หัวข้อ/คําสําคัญ',
+        description: 'คำอธิบาย',
+      },
+      paper: {
+        title: 'ชื่อเรื่อง',
+        language: 'ภาษา',
+        author: 'ผู้แต่ง',
+        publishDate: 'วันที่เผยแพร่',
+        journalConferenceName: 'ชื่อวารสาร/การประชุม',
+        volumeIssuePage: 'ปริมาณ/ฉบับ/หน้า',
+        DOI: 'ดอย',
+        topicsKeywords: 'หัวข้อ/คําสําคัญ',
+        abstract: 'นามธรรม',
+      },
+      socialMediaPost: {
+        platform: 'แท่น',
+        authorUsername: 'ผู้เขียน/ชื่อผู้ใช้',
+        publishDate: 'วันที่เผยแพร่',
+        postURL: 'URL โพสต์',
+        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: 'URL ของหน้าเว็บ',
+        editorContributor: 'บรรณาธิการ/ผู้ร่วมให้ข้อมูล',
+        lastEditDate: 'วันที่แก้ไขล่าสุด',
+        summaryIntroduction: 'สรุป/บทนํา',
+      },
+      notion: {
+        title: 'ชื่อเรื่อง',
+        language: 'ภาษา',
+        author: 'ผู้แต่ง',
+        createdTime: 'เวลาที่สร้างขึ้น',
+        lastModifiedTime: 'เวลาแก้ไขล่าสุด',
+        url: 'URL',
+        tag: 'ฉลาก',
+        description: 'คำอธิบาย',
+      },
+      github: {
+        repoName: 'ชื่อ Repo',
+        repoDesc: 'คําอธิบาย Repo',
+        repoOwner: 'เจ้าของ Repo',
+        fileName: 'ชื่อไฟล์',
+        filePath: 'เส้นทางไฟล์',
+        programmingLang: 'ภาษาโปรแกรม',
+        url: '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

+ 30 - 0
web/i18n/th-TH/dataset-hit-testing.ts

@@ -0,0 +1,30 @@
+const translation = {
+  title: 'การทดสอบการดึงข้อมูล',
+  settingTitle: 'การตั้งค่าการดึงข้อมูล',
+  desc: 'ทดสอบเอฟเฟกต์การตีของความรู้ตามข้อความแบบสอบถามที่กําหนด',
+  dateTimeFormat: 'MM/DD/YYYY hh:mm A',
+  recents: 'ล่าสุด',
+  table: {
+    header: {
+      source: 'ที่มา',
+      text: 'ข้อความ',
+      time: 'เวลา',
+    },
+  },
+  input: {
+    title: 'ข้อความต้นฉบับ',
+    placeholder: 'กรุณาป้อนข้อความแนะนําให้ใช้ประโยคประกาศสั้น ๆ',
+    countWarning: 'สูงสุด 200 อักขระ',
+    indexWarning: 'ความรู้คุณภาพสูงเท่านั้น',
+    testing: 'การทดสอบ',
+  },
+  hit: {
+    title: 'ย่อหน้าดึงข้อมูล',
+    emptyTip: 'ผลการทดสอบการดึงข้อมูลจะแสดงที่นี่',
+  },
+  noRecentTip: 'ไม่มีผลการค้นหาล่าสุดที่นี่',
+  viewChart: 'ดูแผนภูมิเวกเตอร์',
+  viewDetail: 'ดูรายละเอียด',
+}
+
+export default translation

+ 38 - 0
web/i18n/th-TH/dataset-settings.ts

@@ -0,0 +1,38 @@
+const translation = {
+  title: 'การตั้งค่าความรู้',
+  desc: 'ที่นี่คุณสามารถแก้ไขคุณสมบัติและการตั้งค่าการดึงข้อมูลของความรู้นี้',
+  form: {
+    name: 'ชื่อความรู้',
+    namePlaceholder: 'กรุณากรอกชื่อความรู้',
+    nameError: 'ชื่อต้องไม่ว่างเปล่า',
+    desc: 'คําอธิบายความรู้',
+    descInfo: 'โปรดเขียนคําอธิบายข้อความที่ชัดเจนเพื่อร่างเนื้อหาของความรู้ คําอธิบายนี้จะใช้เป็นพื้นฐานสําหรับการจับคู่เมื่อเลือกจากความรู้หลายรายการเพื่อการอนุมาน',
+    descPlaceholder: 'อธิบายสิ่งที่อยู่ในความรู้นี้ (ไม่บังคับ)',
+    descWrite: 'เรียนรู้วิธีเขียนคําอธิบายความรู้ที่ดี',
+    permissions: 'สิทธิ์',
+    permissionsOnlyMe: 'ฉันเท่านั้น',
+    permissionsAllMember: 'สมาชิกในทีมทุกคน',
+    permissionsInvitedMembers: 'สมาชิกในทีมบางส่วน',
+    me: '(คุณ)',
+    indexMethod: 'วิธีการจัดทําดัชนี',
+    indexMethodHighQuality: 'คุณภาพสูง',
+    indexMethodHighQualityTip: 'เรียกใช้แบบจําลองการฝังตัวสําหรับการประมวลผลเพื่อให้มีความแม่นยําสูงขึ้นเมื่อผู้ใช้สืบค้น',
+    indexMethodEconomy: 'ประหยัด',
+    indexMethodEconomyTip: 'ใช้เอ็นจิ้นเวกเตอร์ออฟไลน์ ดัชนีคําหลัก ฯลฯ เพื่อลดความแม่นยําโดยไม่ต้องใช้โทเค็น',
+    embeddingModel: 'โมเดลการฝัง',
+    embeddingModelTip: 'เปลี่ยนรุ่นที่ฝังไว้ โปรดไปที่',
+    embeddingModelTipLink: 'การตั้งค่า',
+    retrievalSetting: {
+      title: 'การตั้งค่าการดึงข้อมูล',
+      learnMore: 'ศึกษาเพิ่มเติม',
+      description: 'เกี่ยวกับวิธีการดึงข้อมูล',
+      longDescription: 'เกี่ยวกับวิธีการดึงข้อมูล คุณสามารถเปลี่ยนแปลงได้ตลอดเวลาในการตั้งค่าความรู้',
+    },
+    externalKnowledgeAPI: 'API ความรู้ภายนอก',
+    externalKnowledgeID: 'ID ความรู้ภายนอก',
+    retrievalSettings: 'การตั้งค่าการดึงข้อมูล',
+    save: 'ประหยัด',
+  },
+}
+
+export default translation

+ 150 - 0
web/i18n/th-TH/dataset.ts

@@ -0,0 +1,150 @@
+const translation = {
+  knowledge: 'ความรู้',
+  externalTag: 'ภายนอก',
+  externalAPI: 'API ภายนอก',
+  externalAPIPanelTitle: 'API ความรู้ภายนอก',
+  externalKnowledgeId: 'ID ความรู้ภายนอก',
+  externalKnowledgeName: 'ชื่อความรู้ภายนอก',
+  externalKnowledgeDescription: 'คําอธิบายความรู้',
+  externalKnowledgeIdPlaceholder: 'โปรดป้อน Knowledge ID',
+  externalKnowledgeNamePlaceholder: 'โปรดป้อนชื่อฐานความรู้',
+  externalKnowledgeDescriptionPlaceholder: 'อธิบายสิ่งที่อยู่ในฐานความรู้นี้ (ไม่บังคับ)',
+  learnHowToWriteGoodKnowledgeDescription: 'เรียนรู้วิธีการเขียนคําอธิบายความรู้ที่ดี',
+  externalAPIPanelDescription: 'API ความรู้ภายนอกใช้เพื่อเชื่อมต่อกับฐานความรู้ภายนอก Dify และดึงความรู้จากฐานความรู้นั้น',
+  externalAPIPanelDocumentation: 'เรียนรู้วิธีสร้าง API ความรู้ภายนอก',
+  documentCount: 'เอกสาร',
+  wordCount: 'คํา k',
+  appCount: 'แอปที่เชื่อมโยง',
+  createDataset: 'สร้างความรู้',
+  createNewExternalAPI: 'สร้าง API ความรู้ภายนอกใหม่',
+  noExternalKnowledge: 'ยังไม่มี External Knowledge API คลิกที่นี่เพื่อสร้าง',
+  createExternalAPI: 'เพิ่ม API ความรู้ภายนอก',
+  editExternalAPIFormTitle: 'แก้ไข API ความรู้ภายนอก',
+  editExternalAPITooltipTitle: 'ความรู้ที่เชื่อมโยง',
+  editExternalAPIConfirmWarningContent: {
+    front: 'API ความรู้ภายนอกนี้เชื่อมโยงกับ',
+    end: 'ความรู้ภายนอกและการปรับเปลี่ยนนี้จะนําไปใช้กับพวกเขาทั้งหมด คุณแน่ใจหรือไม่ว่าต้องการบันทึกการเปลี่ยนแปลงนี้?',
+  },
+  editExternalAPIFormWarning: {
+    front: 'API ภายนอกนี้เชื่อมโยงกับ',
+    end: 'ความรู้ภายนอก',
+  },
+  deleteExternalAPIConfirmWarningContent: {
+    title: {
+      front: 'ลบ',
+      end: '?',
+    },
+    content: {
+      front: 'API ความรู้ภายนอกนี้เชื่อมโยงกับ',
+      end: 'ความรู้ภายนอก การลบ API นี้จะทําให้ API ทั้งหมดเป็นโมฆะ คุณแน่ใจหรือไม่ว่าต้องการลบ API นี้?',
+    },
+    noConnectionContent: 'คุณแน่ใจว่าจะลบ API นี้หรือไม่',
+  },
+  selectExternalKnowledgeAPI: {
+    placeholder: 'เลือก API ความรู้ภายนอก',
+  },
+  connectDataset: 'เชื่อมต่อกับฐานความรู้ภายนอก',
+  connectDatasetIntro: {
+    title: 'วิธีการเชื่อมต่อกับฐานความรู้ภายนอก',
+    content: {
+      front: 'เมื่อต้องการเชื่อมต่อกับฐานความรู้ภายนอก คุณต้องสร้าง API ภายนอกก่อน โปรดอ่านอย่างละเอียดและอ้างอิง',
+      link: 'ดูวิธีสร้าง API ภายนอก',
+      end: '. จากนั้นค้นหา Knowledge ID ที่เกี่ยวข้องและกรอกข้อมูลในแบบฟอร์มทางด้านซ้าย หากข้อมูลทั้งหมดถูกต้อง ข้อมูลจะข้ามไปยังการทดสอบการดึงข้อมูลในฐานความรู้โดยอัตโนมัติหลังจากคลิกปุ่มเชื่อมต่อ',
+    },
+    learnMore: 'ศึกษาเพิ่มเติม',
+  },
+  connectHelper: {
+    helper1: 'เชื่อมต่อกับฐานความรู้ภายนอกผ่าน API และ ID ฐานความรู้ ปัจจุบัน',
+    helper2: 'รองรับเฉพาะฟังก์ชันการดึงข้อมูล',
+    helper3: '. เราขอแนะนําให้คุณ',
+    helper4: 'อ่านเอกสารวิธีใช้',
+    helper5: 'ระมัดระวังก่อนใช้คุณสมบัตินี้',
+  },
+  createDatasetIntro: 'นําเข้าข้อมูลข้อความของคุณเองหรือเขียนข้อมูลแบบเรียลไทม์ผ่าน Webhook เพื่อปรับปรุงบริบท LLM',
+  deleteDatasetConfirmTitle: 'ลบความรู้นี้?',
+  deleteDatasetConfirmContent: 'การลบความรู้นั้นไม่สามารถย้อนกลับได้ ผู้ใช้จะไม่สามารถเข้าถึงความรู้ของคุณอีกต่อไป และการกําหนดค่าพร้อมท์และบันทึกทั้งหมดจะถูกลบอย่างถาวร',
+  datasetUsedByApp: 'ความรู้นี้ถูกใช้โดยบางแอป แอปจะไม่สามารถใช้ความรู้นี้ได้อีกต่อไป และการกําหนดค่าพร้อมท์และบันทึกทั้งหมดจะถูกลบอย่างถาวร',
+  datasetDeleted: 'ลบความรู้',
+  datasetDeleteFailed: 'ลบความรู้ไม่สําเร็จ',
+  didYouKnow: 'คุณรู้หรือไม่?',
+  intro1: 'ความรู้สามารถรวมเข้ากับแอปพลิเคชัน Dify ได้',
+  intro2: 'ตามบริบท',
+  intro3: ',',
+  intro4: 'หรือมัน',
+  intro5: 'สามารถสร้างได้',
+  intro6: 'เป็นปลั๊กอินดัชนี ChatGPT แบบสแตนด์อโลนเพื่อเผยแพร่',
+  unavailable: 'ไม่',
+  unavailableTip: 'โมเดลการฝังไม่พร้อมใช้งาน จําเป็นต้องกําหนดค่าโมเดลการฝังเริ่มต้น',
+  datasets: 'ความรู้',
+  datasetsApi: 'การเข้าถึง API',
+  externalKnowledgeForm: {
+    connect: 'ติด',
+    cancel: 'ยกเลิก',
+  },
+  externalAPIForm: {
+    name: 'ชื่อ',
+    endpoint: 'ปลายทาง API',
+    apiKey: 'คีย์ API',
+    save: 'ประหยัด',
+    cancel: 'ยกเลิก',
+    edit: 'แก้ไข',
+    encrypted: {
+      front: 'โทเค็น API ของคุณจะถูกเข้ารหัสและจัดเก็บโดยใช้',
+      end: 'เทคโนโลยี ',
+    },
+  },
+  retrieval: {
+    semantic_search: {
+      title: 'การค้นหาเวกเตอร์',
+      description: 'สร้างการฝังแบบสอบถามและค้นหาส่วนข้อความที่คล้ายกับการแสดงเวกเตอร์มากที่สุด',
+    },
+    full_text_search: {
+      title: 'การค้นหาข้อความแบบเต็ม',
+      description: 'จัดทําดัชนีคําศัพท์ทั้งหมดในเอกสาร เพื่อให้ผู้ใช้สามารถค้นหาคําศัพท์ใดก็ได้และดึงข้อความที่เกี่ยวข้องที่มีคําเหล่านั้น',
+    },
+    hybrid_search: {
+      title: 'การค้นหาแบบไฮบริด',
+      description: 'ดําเนินการค้นหาข้อความแบบเต็มและการค้นหาแบบเวกเตอร์พร้อมกันจัดอันดับใหม่เพื่อเลือกการจับคู่ที่ดีที่สุดสําหรับคําค้นหาของผู้ใช้ ผู้ใช้สามารถเลือกที่จะตั้งค่าน้ําหนักหรือกําหนดค่าเป็นโมเดล Rerank',
+      recommend: 'แนะนำ',
+    },
+    invertedIndex: {
+      title: 'ดัชนีกลับด้าน',
+      description: 'Inverted Index เป็นโครงสร้างที่ใช้สําหรับการดึงข้อมูลอย่างมีประสิทธิภาพ จัดเรียงตามคําศัพท์ แต่ละคําชี้ไปที่เอกสารหรือหน้าเว็บที่มีคําดังกล่าว',
+    },
+    change: 'เปลี่ยน',
+    changeRetrievalMethod: 'วิธีการเรียกดูการเปลี่ยนแปลง',
+  },
+  docsFailedNotice: 'เอกสารไม่สามารถจัดทําดัชนีได้',
+  retry: 'ลอง',
+  indexingTechnique: {
+    high_quality: 'สํานักงานใหญ่',
+    economy: 'อีโค',
+  },
+  indexingMethod: {
+    semantic_search: 'เวกเตอร์',
+    full_text_search: 'ข้อความฉบับเต็ม',
+    hybrid_search: 'พันธุ์ผสม',
+    invertedIndex: 'คว่ำ',
+  },
+  defaultRetrievalTip: 'การดึงข้อมูลหลายเส้นทางจะถูกใช้โดยค่าเริ่มต้น ความรู้จะถูกดึงมาจากฐานความรู้หลายแห่งแล้วจัดอันดับใหม่',
+  mixtureHighQualityAndEconomicTip: 'โมเดล Rerank จําเป็นสําหรับการผสมผสานระหว่างฐานความรู้คุณภาพสูงและประหยัด',
+  inconsistentEmbeddingModelTip: 'จําเป็นต้องมีแบบจําลอง Rerank หากแบบจําลองการฝังของฐานความรู้ที่เลือกไม่สอดคล้องกัน',
+  mixtureInternalAndExternalTip: 'โมเดล Rerank จําเป็นสําหรับการผสมผสานระหว่างความรู้ภายในและภายนอก',
+  allExternalTip: 'เมื่อใช้ความรู้ภายนอกเท่านั้น ผู้ใช้สามารถเลือกได้ว่าจะเปิดใช้งานโมเดล Rerank หรือไม่ หากไม่ได้เปิดใช้งาน ก้อนที่ดึงมาจะถูกจัดเรียงตามคะแนน เมื่อกลยุทธ์การดึงข้อมูลของฐานความรู้ที่แตกต่างกันไม่สอดคล้องกัน ก็จะไม่ถูกต้อง',
+  retrievalSettings: 'การตั้งค่าการดึงข้อมูล',
+  rerankSettings: 'การตั้งค่ารีไลน์',
+  weightedScore: {
+    title: 'คะแนนถ่วงน้ําหนัก',
+    description: 'กลยุทธ์การจัดอันดับใหม่นี้จะกําหนดว่าควรจัดลําดับความสําคัญของการจับคู่ความหมายหรือคีย์เวิร์ด',
+    semanticFirst: 'ความหมายก่อน',
+    keywordFirst: 'คีย์เวิร์ดก่อน',
+    customized: 'กำหนด เอง',
+    semantic: 'ความหมาย',
+    keyword: 'คำ',
+  },
+  nTo1RetrievalLegacy: 'การดึงข้อมูล N-to-1 จะเลิกใช้อย่างเป็นทางการตั้งแต่เดือนกันยายน ขอแนะนําให้ใช้การดึงข้อมูลหลายเส้นทางล่าสุดเพื่อให้ได้ผลลัพธ์ที่ดีขึ้น',
+  nTo1RetrievalLegacyLink: 'ศึกษาเพิ่มเติม',
+  nTo1RetrievalLegacyLinkText: 'การดึงข้อมูล N-to-1 จะเลิกใช้อย่างเป็นทางการในเดือนกันยายน',
+}
+
+export default translation

+ 41 - 0
web/i18n/th-TH/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

+ 3 - 0
web/i18n/th-TH/layout.ts

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

+ 109 - 0
web/i18n/th-TH/login.ts

@@ -0,0 +1,109 @@
+const translation = {
+  pageTitle: 'เฮ้ มาเริ่มกันเลย!',
+  welcome: '👋 ยินดีต้อนรับสู่ Dify โปรดเข้าสู่ระบบเพื่อดําเนินการต่อ',
+  email: 'ที่อยู่อีเมล',
+  emailPlaceholder: 'อีเมลของคุณ',
+  password: 'รหัสผ่าน',
+  passwordPlaceholder: 'รหัสผ่านของคุณ',
+  name: 'ชื่อผู้ใช้',
+  namePlaceholder: 'ชื่อผู้ใช้ของคุณ',
+  forget: 'ลืมรหัสผ่านใช่ไหม',
+  signBtn: 'เข้าสู่ระบบ',
+  continueWithCode: 'ดําเนินการต่อด้วยรหัส',
+  sendVerificationCode: 'ส่งรหัสยืนยัน',
+  usePassword: 'ใช้รหัสผ่าน',
+  useVerificationCode: 'ใช้รหัสยืนยัน',
+  or: 'หรือ',
+  installBtn: 'สถาปนา',
+  setAdminAccount: 'การตั้งค่าบัญชีผู้ดูแลระบบ',
+  setAdminAccountDesc: 'สิทธิ์สูงสุดสําหรับบัญชีผู้ดูแลระบบ ซึ่งสามารถใช้สร้างแอปพลิเคชันและจัดการผู้ให้บริการ LLM เป็นต้น',
+  createAndSignIn: 'สร้างและลงชื่อเข้าใช้',
+  oneMoreStep: 'อีกหนึ่งขั้นตอน',
+  createSample: 'จากข้อมูลนี้ เราจะสร้างแอปพลิเคชันตัวอย่างสําหรับคุณ',
+  invitationCode: 'รหัสเชิญ',
+  invitationCodePlaceholder: 'รหัสเชิญของคุณ',
+  interfaceLanguage: 'ภาษาอินเทอร์เฟซ',
+  timezone: 'เขตเวลา',
+  go: 'ไปที่ Dify',
+  sendUsMail: 'ส่งอีเมลถึงเรา แล้วเราจะจัดการกับคําขอเชิญ',
+  acceptPP: 'ฉันได้อ่านและยอมรับนโยบายความเป็นส่วนตัวแล้ว',
+  reset: 'โปรดเรียกใช้คําสั่งต่อไปนี้เพื่อรีเซ็ตรหัสผ่านของคุณ',
+  withGitHub: 'ดําเนินการต่อด้วย GitHub',
+  withGoogle: 'ดําเนินการต่อกับ Google',
+  withSSO: 'ดําเนินการต่อด้วย SSO',
+  rightTitle: 'ปลดล็อกศักยภาพของ LLM อย่างเต็มที่',
+  rightDesc: 'สร้างแอปพลิเคชัน AI ที่ดึงดูดสายตา ใช้งานได้ และปรับปรุงได้อย่างง่ายดาย',
+  tos: 'ข้อกําหนดในการให้บริการ',
+  pp: 'นโยบายความเป็นส่วนตัว',
+  tosDesc: 'การลงทะเบียนแสดงว่าคุณยอมรับ',
+  goToInit: 'หากคุณยังไม่ได้เริ่มต้นบัญชี โปรดไปที่หน้าการเริ่มต้น',
+  dontHave: 'ไม่มี?',
+  invalidInvitationCode: 'รหัสเชิญไม่ถูกต้อง',
+  accountAlreadyInited: 'บัญชีเริ่มต้นแล้ว',
+  forgotPassword: 'ลืมรหัสผ่านใช่ไหม',
+  resetLinkSent: 'รีเซ็ตลิงก์ที่ส่ง',
+  sendResetLink: 'ส่งลิงก์รีเซ็ต',
+  backToSignIn: 'กลับไปที่การลงชื่อเข้าใช้',
+  forgotPasswordDesc: 'โปรดป้อนที่อยู่อีเมลของคุณเพื่อรีเซ็ตรหัสผ่านของคุณ เราจะส่งอีเมลพร้อมคําแนะนําเกี่ยวกับวิธีการรีเซ็ตรหัสผ่านของคุณ',
+  checkEmailForResetLink: 'โปรดตรวจสอบอีเมลของคุณเพื่อหาลิงก์สําหรับรีเซ็ตรหัสผ่านของคุณ หากไม่ปรากฏขึ้นภายใน 2-3 นาที โปรดตรวจสอบโฟลเดอร์สแปมของคุณ',
+  passwordChanged: 'ลงชื่อเข้าใช้ตอนนี้',
+  changePassword: 'ตั้งรหัสผ่าน',
+  changePasswordTip: 'โปรดป้อนรหัสผ่านใหม่สําหรับบัญชีของคุณ',
+  changePasswordBtn: 'ตั้งรหัสผ่าน',
+  invalidToken: 'โทเค็นไม่ถูกต้องหรือหมดอายุ',
+  confirmPassword: 'ยืนยันรหัสผ่าน',
+  confirmPasswordPlaceholder: 'ยืนยันรหัสผ่านใหม่ของคุณ',
+  passwordChangedTip: 'เปลี่ยนรหัสผ่านของคุณเรียบร้อยแล้ว',
+  error: {
+    emailEmpty: 'ต้องระบุที่อยู่อีเมล',
+    emailInValid: 'โปรดป้อนที่อยู่อีเมลที่ถูกต้อง',
+    nameEmpty: 'ต้องระบุชื่อ',
+    passwordEmpty: 'ต้องใช้รหัสผ่าน',
+    passwordLengthInValid: 'รหัสผ่านต้องมีอย่างน้อย 8 อักขระ',
+    passwordInvalid: 'รหัสผ่านต้องมีตัวอักษรและตัวเลข และความยาวต้องมากกว่า 8',
+    registrationNotAllowed: 'ไม่พบบัญชี โปรดติดต่อผู้ดูแลระบบเพื่อลงทะเบียน',
+  },
+  license: {
+    tip: 'ก่อนเริ่ม Dify Community Edition โปรดอ่าน GitHub',
+    link: 'ใบอนุญาตโอเพ่นซอร์ส',
+  },
+  join: 'ต่อ',
+  joinTipStart: 'เชิญคุณเข้าร่วม',
+  joinTipEnd: 'ทีมงานใน Dify',
+  invalid: 'ลิงก์หมดอายุ',
+  explore: 'สํารวจ Dify',
+  activatedTipStart: 'คุณได้เข้าร่วม',
+  activatedTipEnd: 'ทีม',
+  activated: 'ลงชื่อเข้าใช้ตอนนี้',
+  adminInitPassword: 'รหัสผ่านเริ่มต้นผู้ดูแลระบบ',
+  validate: 'ตรวจ สอบ',
+  checkCode: {
+    checkYourEmail: 'ตรวจสอบอีเมลของคุณ',
+    tips: 'เราส่งรหัสยืนยันไปที่ <strong>{{email}}</strong>',
+    validTime: 'โปรดทราบว่ารหัสนี้ใช้ได้นาน 5 นาที',
+    verificationCode: 'รหัสยืนยัน',
+    verificationCodePlaceholder: 'ป้อนรหัส 6 หลัก',
+    verify: 'ตรวจสอบ',
+    didNotReceiveCode: 'ไม่ได้รับรหัสใช่ไหม',
+    resend: 'ส่ง',
+    useAnotherMethod: 'ใช้วิธีอื่น',
+    emptyCode: 'ต้องใช้รหัส',
+    invalidCode: 'รหัสไม่ถูกต้อง',
+  },
+  resetPassword: 'รีเซ็ตรหัสผ่าน',
+  resetPasswordDesc: 'พิมพ์อีเมลที่คุณใช้ลงทะเบียนบน Dify แล้วเราจะส่งอีเมลรีเซ็ตรหัสผ่านให้คุณ',
+  backToLogin: 'กลับไปที่เข้าสู่ระบบ',
+  setYourAccount: 'ตั้งค่าบัญชีของคุณ',
+  enterYourName: 'โปรดป้อนชื่อผู้ใช้ของคุณ',
+  back: 'ย้อนกลับ',
+  noLoginMethod: 'ไม่ได้กําหนดค่าวิธีการตรวจสอบสิทธิ์',
+  noLoginMethodTip: 'โปรดติดต่อผู้ดูแลระบบเพื่อเพิ่มวิธีการรับรองความถูกต้อง',
+  licenseExpired: 'ใบอนุญาตหมดอายุ',
+  licenseExpiredTip: 'สิทธิ์การใช้งาน Dify Enterprise สําหรับพื้นที่ทํางานของคุณหมดอายุแล้ว โปรดติดต่อผู้ดูแลระบบของคุณเพื่อใช้ Dify ต่อไป',
+  licenseLost: 'ใบอนุญาตสูญหาย',
+  licenseLostTip: 'เชื่อมต่อเซิร์ฟเวอร์ใบอนุญาต Dify ไม่สําเร็จ โปรดติดต่อผู้ดูแลระบบของคุณเพื่อใช้ Dify ต่อไป',
+  licenseInactive: 'ใบอนุญาตไม่ใช้งาน',
+  licenseInactiveTip: 'สิทธิ์การใช้งาน Dify Enterprise สําหรับพื้นที่ทํางานของคุณไม่ได้ใช้งาน โปรดติดต่อผู้ดูแลระบบของคุณเพื่อใช้ Dify ต่อไป',
+}
+
+export default translation

+ 3 - 0
web/i18n/th-TH/register.ts

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

+ 29 - 0
web/i18n/th-TH/run-log.ts

@@ -0,0 +1,29 @@
+const translation = {
+  input: 'อินพุต',
+  result: 'ผล',
+  detail: 'รายละเอียด',
+  tracing: 'ติดตาม',
+  resultPanel: {
+    status: 'สถานะ',
+    time: 'เวลาที่ผ่านไป',
+    tokens: 'โทเค็นทั้งหมด',
+  },
+  meta: {
+    title: 'ข้อมูลเมตา',
+    status: 'สถานะ',
+    version: 'เวอร์ชัน',
+    executor: 'ผู้ปฏิบัติการ',
+    startTime: 'เวลาเริ่มต้น',
+    time: 'เวลาที่ผ่านไป',
+    tokens: 'โทเค็นทั้งหมด',
+    steps: 'เรียกใช้ขั้นตอน',
+  },
+  resultEmpty: {
+    title: 'เรียกใช้เฉพาะรูปแบบ JSON เอาต์พุต',
+    tipLeft: 'กรุณาไปที่',
+    link: 'แผงรายละเอียด',
+    tipRight: 'ดูมัน',
+  },
+}
+
+export default translation

+ 69 - 0
web/i18n/th-TH/share-app.ts

@@ -0,0 +1,69 @@
+const translation = {
+  common: {
+    appUnavailable: 'แอพไม่พร้อมใช้งาน',
+    appUnknownError: 'แอพไม่พร้อมใช้งาน',
+  },
+  chat: {
+    newChat: 'แชทใหม่',
+    pinnedTitle: 'ปัก หมุด',
+    unpinnedTitle: 'แมว',
+    newChatDefaultName: 'การสนทนาใหม่',
+    resetChat: 'รีเซ็ตการสนทนา',
+    poweredBy: 'รับพลังมาจาก',
+    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: 'ไฟล์ CSV ที่อัปโหลดไม่ตรงกับโครงสร้าง',
+      emptyLine: 'แถว {{rowIndex}} ว่างเปล่า',
+      invalidLine: 'แถว {{rowIndex}}: ค่า {{varName}} ต้องว่างเปล่าไม่ได้',
+      moreThanMaxLengthLine: 'แถว {{rowIndex}}: ค่า {{varName}} ต้องไม่เกิน {{maxLength}} อักขระ',
+      atLeastOne: 'โปรดป้อนอย่างน้อยหนึ่งแถวในไฟล์ที่อัปโหลด',
+    },
+  },
+}
+
+export default translation

+ 153 - 0
web/i18n/th-TH/tools.ts

@@ -0,0 +1,153 @@
+const translation = {
+  title: 'เครื่อง มือ',
+  createCustomTool: 'สร้างเครื่องมือที่กําหนดเอง',
+  customToolTip: 'เรียนรู้เพิ่มเติมเกี่ยวกับเครื่องมือแบบกําหนดเองของ Dify',
+  type: {
+    all: 'ทั้งหมด',
+    builtIn: 'ในตัว',
+    custom: 'ธรรมเนียม',
+    workflow: 'เวิร์กโฟลว์',
+  },
+  contribute: {
+    line1: 'ฉันสนใจใน',
+    line2: 'เครื่องมือที่มีส่วนร่วมใน Dify',
+    viewGuide: 'ดูคู่มือ',
+  },
+  author: 'โดย',
+  auth: {
+    unauthorized: 'การอนุญาต',
+    authorized: 'อนุญาต',
+    setup: 'ตั้งค่าการให้สิทธิ์เพื่อใช้',
+    setupModalTitle: 'ตั้งค่าการให้สิทธิ์',
+    setupModalTitleDescription: 'หลังจากกําหนดค่าข้อมูลประจําตัวแล้ว สมาชิกทั้งหมดภายในพื้นที่ทํางานสามารถใช้เครื่องมือนี้เมื่อประสานงานแอปพลิเคชันได้',
+  },
+  includeToolNum: '{{num}} รวมเครื่องมือ',
+  addTool: 'เพิ่มเครื่องมือ',
+  addToolModal: {
+    type: 'ประเภท',
+    category: 'ประเภท',
+    add: 'เพิ่ม',
+    added: 'เพิ่ม',
+    manageInTools: 'จัดการในเครื่องมือ',
+    emptyTitle: 'ไม่มีเครื่องมือเวิร์กโฟลว์',
+    emptyTip: 'ไปที่ "เวิร์กโฟลว์ -> เผยแพร่เป็นเครื่องมือ"',
+  },
+  createTool: {
+    title: 'สร้างเครื่องมือที่กําหนดเอง',
+    editAction: 'กําหนดค่า',
+    editTitle: 'แก้ไขเครื่องมือที่กําหนดเอง',
+    name: 'ชื่อ',
+    toolNamePlaceHolder: 'ป้อนชื่อเครื่องมือ',
+    nameForToolCall: 'ชื่อการเรียกเครื่องมือ',
+    nameForToolCallPlaceHolder: 'ใช้สําหรับจดจําเครื่อง เช่น getCurrentWeather list_pets',
+    nameForToolCallTip: 'รองรับเฉพาะตัวเลข ตัวอักษร และขีดล่างเท่านั้น',
+    description: 'คำอธิบาย',
+    descriptionPlaceholder: 'คําอธิบายสั้น ๆ เกี่ยวกับวัตถุประสงค์ของเครื่องมือ เช่น รับอุณหภูมิสําหรับตําแหน่งเฉพาะ',
+    schema: 'แผนการ',
+    schemaPlaceHolder: 'ป้อนสคีมา OpenAPI ของคุณที่นี่',
+    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 Header Key คุณสามารถปล่อยให้เป็น "การอนุญาต" ได้หากคุณไม่รู้ว่ามันคืออะไรหรือตั้งค่าเป็นค่าที่กําหนดเอง',
+      types: {
+        none: 'ไม่มีใคร',
+        api_key: 'คีย์ API',
+        apiKeyPlaceholder: 'ชื่อส่วนหัว HTTP สําหรับคีย์ API',
+        apiValuePlaceholder: 'ป้อนคีย์ API',
+      },
+      key: 'กุญแจ',
+      value: 'ค่า',
+    },
+    authHeaderPrefix: {
+      title: 'ประเภทการรับรองความถูกต้อง',
+      types: {
+        basic: 'พื้นฐาน',
+        bearer: 'ผู้ถือ',
+        custom: 'ธรรมเนียม',
+      },
+    },
+    privacyPolicy: 'นโยบายความเป็นส่วนตัว',
+    privacyPolicyPlaceholder: 'กรุณากรอกนโยบายความเป็นส่วนตัว',
+    toolInput: {
+      title: 'อินพุตเครื่องมือ',
+      name: 'ชื่อ',
+      required: 'ต้องระบุ',
+      method: 'วิธี',
+      methodSetting: 'ฉาก',
+      methodSettingTip: 'ผู้ใช้กรอกข้อมูลในการกําหนดค่าเครื่องมือ',
+      methodParameter: 'พารามิเตอร์',
+      methodParameterTip: 'การเติม LLM ระหว่างการอนุมาน',
+      label: 'ในตอนกลางวัน',
+      labelPlaceholder: 'เลือกแท็ก (ไม่บังคับ)',
+      description: 'คำอธิบาย',
+      descriptionPlaceholder: 'คําอธิบายความหมายของพารามิเตอร์',
+    },
+    customDisclaimer: 'ข้อจํากัดความรับผิดชอบที่กําหนดเอง',
+    customDisclaimerPlaceholder: 'โปรดป้อนข้อจํากัดความรับผิดชอบที่กําหนดเอง',
+    confirmTitle: 'ยืนยันการบันทึก ?',
+    confirmTip: 'แอปที่ใช้เครื่องมือนี้จะได้รับผลกระทบ',
+    deleteToolConfirmTitle: 'ลบเครื่องมือนี้?',
+    deleteToolConfirmContent: 'การลบเครื่องมือนั้นไม่สามารถย้อนกลับได้ ผู้ใช้จะไม่สามารถเข้าถึงเครื่องมือของคุณได้อีกต่อไป',
+  },
+  test: {
+    title: 'ทดสอบ',
+    parametersValue: 'พารามิเตอร์และค่า',
+    parameters: 'พารามิเตอร์',
+    value: 'ค่า',
+    testResult: 'ผลการทดสอบ',
+    testResultPlaceholder: 'ผลการทดสอบจะแสดงที่นี่',
+  },
+  thought: {
+    using: 'ใช้',
+    used: 'ใช้แล้ว',
+    requestTitle: 'ขอร้อง',
+    responseTitle: 'การตอบสนอง',
+  },
+  setBuiltInTools: {
+    info: 'ข้อมูล',
+    setting: 'ฉาก',
+    toolDescription: 'คําอธิบายเครื่องมือ',
+    parameters: 'พารามิเตอร์',
+    string: 'เชือก',
+    number: 'เลข',
+    required: 'ต้องระบุ',
+    infoAndSetting: 'ข้อมูลและการตั้งค่า',
+  },
+  noCustomTool: {
+    title: 'ไม่มีเครื่องมือที่กําหนดเอง!',
+    content: 'เพิ่มและจัดการเครื่องมือที่กําหนดเองของคุณที่นี่สําหรับการสร้างแอป AI',
+    createTool: 'สร้างเครื่องมือ',
+  },
+  noSearchRes: {
+    title: 'ขออภัย ไม่มีผลลัพธ์!',
+    content: 'เราไม่พบเครื่องมือที่ตรงกับการค้นหาของคุณ',
+    reset: 'รีเซ็ตการค้นหา',
+  },
+  builtInPromptTitle: 'พร้อมท์',
+  toolRemoved: 'เครื่องมือถูกลบออก',
+  notAuthorized: 'เครื่องมือไม่ได้รับอนุญาต',
+  howToGet: 'วิธีรับ',
+  openInStudio: 'เปิดในสตูดิโอ',
+  toolNameUsageTip: 'ชื่อการเรียกเครื่องมือสําหรับการใช้เหตุผลและการแจ้งเตือนของตัวแทน',
+}
+
+export default translation

+ 635 - 0
web/i18n/th-TH/workflow.ts

@@ -0,0 +1,635 @@
+const translation = {
+  common: {
+    undo: 'แก้',
+    redo: 'พร้อม',
+    editing: 'แก้ไข',
+    autoSaved: 'บันทึกอัตโนมัติ',
+    unpublished: 'ไม่ได้เผยแพร่',
+    published: 'เผย แพร่',
+    publish: 'ตีพิมพ์',
+    update: 'อัพเดต',
+    run: 'วิ่ง',
+    running: 'กำลัง เรียก ใช้',
+    inRunMode: 'ในโหมดเรียกใช้',
+    inPreview: 'ในการแสดงตัวอย่าง',
+    inPreviewMode: 'ในโหมดแสดงตัวอย่าง',
+    preview: 'ดูตัวอย่าง',
+    viewRunHistory: 'ดูประวัติการวิ่ง',
+    runHistory: 'ประวัติการวิ่ง',
+    goBackToEdit: 'กลับไปที่ตัวแก้ไข',
+    conversationLog: 'บันทึกการสนทนา',
+    features: 'หน้าตา',
+    featuresDescription: 'ปรับปรุงประสบการณ์ผู้ใช้เว็บแอป',
+    ImageUploadLegacyTip: 'ตอนนี้คุณสามารถสร้างตัวแปรชนิดไฟล์ในฟอร์มเริ่มต้นได้แล้ว เราจะไม่รองรับฟีเจอร์การอัปโหลดรูปภาพอีกต่อไปในอนาคต',
+    fileUploadTip: 'ฟีเจอร์การอัปโหลดรูปภาพได้รับการอัปเกรดเป็นการอัปโหลดไฟล์',
+    featuresDocLink: 'ศึกษาเพิ่มเติม',
+    debugAndPreview: 'ดูตัวอย่าง',
+    restart: 'เริ่มใหม่',
+    currentDraft: 'ร่างปัจจุบัน',
+    currentDraftUnpublished: 'ร่างปัจจุบันที่ไม่ได้เผยแพร่',
+    latestPublished: 'เผยแพร่ล่าสุด',
+    publishedAt: 'เผย แพร่',
+    restore: 'ซ่อมแซม',
+    runApp: 'เรียกใช้แอพ',
+    batchRunApp: 'แอป Batch Run',
+    accessAPIReference: 'การอ้างอิง API การเข้าถึง',
+    embedIntoSite: 'ฝังลงในไซต์',
+    addTitle: 'เพิ่มชื่อเรื่อง...',
+    addDescription: 'เพิ่มคําอธิบาย...',
+    noVar: 'ไม่มีตัวแปร',
+    searchVar: 'ตัวแปรการค้นหา',
+    variableNamePlaceholder: 'ชื่อตัวแปร',
+    setVarValuePlaceholder: 'ตั้งค่าตัวแปร',
+    needConnectTip: 'ขั้นตอนนี้ไม่ได้เชื่อมต่อกับสิ่งใด',
+    maxTreeDepth: 'ขีดจํากัดสูงสุดของ {{depth}} โหนดต่อสาขา',
+    needEndNode: 'ต้องเพิ่มบล็อก End',
+    needAnswerNode: 'ต้องเพิ่มบล็อกคําตอบ',
+    workflowProcess: 'กระบวนการเวิร์กโฟลว์',
+    notRunning: 'ยังไม่ได้ทํางาน',
+    previewPlaceholder: 'ป้อนเนื้อหาในช่องด้านล่างเพื่อเริ่มแก้ไขข้อบกพร่องของแชทบอท',
+    effectVarConfirm: {
+      title: 'ลบตัวแปร',
+      content: 'ตัวแปรนี้ใช้ในโหนดอื่น คุณยังต้องการลบออกหรือไม่?',
+    },
+    insertVarTip: 'กดปุ่ม \'/\' เพื่อแทรกอย่างรวดเร็ว',
+    processData: 'ประมวลผลข้อมูล',
+    input: 'อินพุต',
+    output: 'ผลิตภัณฑ์',
+    jinjaEditorPlaceholder: 'พิมพ์ \'/\' หรือ \'{\' เพื่อแทรกตัวแปร',
+    viewOnly: 'ดูเท่านั้น',
+    showRunHistory: 'แสดงประวัติการวิ่ง',
+    enableJinja: 'เปิดใช้งานการสนับสนุนเทมเพลต Jinja',
+    learnMore: 'ศึกษาเพิ่มเติม',
+    copy: 'ลอก',
+    duplicate: 'สำเนา',
+    addBlock: 'เพิ่มบล็อก',
+    pasteHere: 'วางที่นี่',
+    pointerMode: 'โหมดตัวชี้',
+    handMode: 'โหมดมือ',
+    model: 'แบบ',
+    workflowAsTool: 'เวิร์กโฟลว์เป็นเครื่องมือ',
+    configureRequired: 'กําหนดค่าที่จําเป็น',
+    configure: 'กําหนดค่า',
+    manageInTools: 'จัดการในเครื่องมือ',
+    workflowAsToolTip: 'จําเป็นต้องมีการกําหนดค่าเครื่องมือใหม่หลังจากการอัปเดตเวิร์กโฟลว์',
+    viewDetailInTracingPanel: 'ดูรายละเอียด',
+    syncingData: 'ซิงค์ข้อมูลเพียงไม่กี่วินาที',
+    importDSL: 'นําเข้า DSL',
+    importDSLTip: 'ร่างปัจจุบันจะถูกเขียนทับ\nส่งออกเวิร์กโฟลว์เป็นข้อมูลสํารองก่อนนําเข้า',
+    backupCurrentDraft: 'สํารองร่างปัจจุบัน',
+    chooseDSL: 'เลือกไฟล์ DSL',
+    overwriteAndImport: 'เขียนทับและนําเข้า',
+    importFailure: 'นําเข้าล้มเหลว',
+    importWarning: 'ความระมัดระวัง',
+    importWarningDetails: 'ความแตกต่างของเวอร์ชัน DSL อาจส่งผลต่อคุณสมบัติบางอย่าง',
+    importSuccess: 'นําเข้าสําเร็จ',
+    parallelRun: 'วิ่งแบบขนาน',
+    parallelTip: {
+      click: {
+        title: 'คลิก',
+        desc: 'เพื่อเพิ่ม',
+      },
+      drag: {
+        title: 'ลาก',
+        desc: 'เพื่อเชื่อมต่อ',
+      },
+      limit: 'ความขนานถูกจํากัดไว้ที่ {{num}} สาขา',
+      depthLimit: 'ขีดจํากัดเลเยอร์ซ้อนแบบขนานของ {{num}} เลเยอร์',
+    },
+    disconnect: 'ยก เลิก',
+    jumpToNode: 'ข้ามไปยังโหนดนี้',
+    addParallelNode: 'เพิ่มโหนดขนาน',
+    parallel: 'ขนาน',
+    branch: 'กิ่ง',
+  },
+  env: {
+    envPanelTitle: 'ตัวแปรสภาพแวดล้อม',
+    envDescription: 'ตัวแปรสภาพแวดล้อมสามารถใช้เพื่อจัดเก็บข้อมูลส่วนตัวและข้อมูลประจําตัวได้ เป็นแบบอ่านอย่างเดียวและสามารถแยกออกจากไฟล์ DSL ระหว่างการส่งออก',
+    envPanelButton: 'เพิ่มตัวแปร',
+    modal: {
+      title: 'เพิ่มตัวแปรสภาพแวดล้อม',
+      editTitle: 'แก้ไขตัวแปรสภาพแวดล้อม',
+      type: 'ประเภท',
+      name: 'ชื่อ',
+      namePlaceholder: 'ชื่อ env',
+      value: 'ค่า',
+      valuePlaceholder: 'ค่า env',
+      secretTip: 'ใช้เพื่อกําหนดข้อมูลหรือข้อมูลที่ละเอียดอ่อน โดยมีการตั้งค่า DSL ที่กําหนดค่าไว้เพื่อป้องกันการรั่วไหล',
+    },
+    export: {
+      title: 'ส่งออกตัวแปรสภาพแวดล้อม Secret หรือไม่',
+      checkbox: 'ส่งออกค่าข้อมูลลับ',
+      ignore: 'ส่งออก DSL',
+      export: 'ส่งออก DSL ด้วยค่าลับ',
+    },
+  },
+  chatVariable: {
+    panelTitle: 'ตัวแปรการสนทนา',
+    panelDescription: 'ตัวแปรการสนทนาใช้เพื่อจัดเก็บข้อมูลแบบโต้ตอบที่ LLM จําเป็นต้องจดจํา รวมถึงประวัติการสนทนา ไฟล์ที่อัปโหลด การตั้งค่าของผู้ใช้ พวกเขาอ่าน-เขียน',
+    docLink: 'เยี่ยมชมเอกสารของเราเพื่อเรียนรู้เพิ่มเติม',
+    button: 'เพิ่มตัวแปร',
+    modal: {
+      title: 'เพิ่มตัวแปรการสนทนา',
+      editTitle: 'แก้ไขตัวแปรการสนทนา',
+      name: 'ชื่อ',
+      namePlaceholder: 'ชื่อตัวแปร',
+      type: 'ประเภท',
+      value: 'ค่าเริ่มต้น',
+      valuePlaceholder: 'ค่าเริ่มต้น เว้นว่างไว้เพื่อไม่ให้ตั้งค่า',
+      description: 'คำอธิบาย',
+      descriptionPlaceholder: 'อธิบายตัวแปร',
+      editInJSON: 'แก้ไขใน JSON',
+      oneByOne: 'เพิ่มทีละรายการ',
+      editInForm: 'แก้ไขในแบบฟอร์ม',
+      arrayValue: 'ค่า',
+      addArrayValue: 'เพิ่มมูลค่า',
+      objectKey: 'กุญแจ',
+      objectType: 'ประเภท',
+      objectValue: 'ค่าเริ่มต้น',
+    },
+    storedContent: 'เนื้อหาที่เก็บไว้',
+    updatedAt: 'อัพเดทเมื่อ',
+  },
+  changeHistory: {
+    title: 'ประวัติการเปลี่ยนแปลง',
+    placeholder: 'คุณยังไม่ได้เปลี่ยนแปลงอะไรเลย',
+    clearHistory: 'ล้างประวัติ',
+    hint: 'คนอินเดีย',
+    hintText: 'การดําเนินการแก้ไขของคุณจะถูกติดตามในประวัติการเปลี่ยนแปลง ซึ่งจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณตลอดระยะเวลาของเซสชันนี้ ประวัตินี้จะถูกล้างเมื่อคุณออกจากตัวแก้ไข',
+    stepBackward_one: '{{count}} ถอยหลัง',
+    stepBackward_other: '{{count}} ถอยหลัง',
+    stepForward_one: '{{count}} ก้าวไปข้างหน้า',
+    stepForward_other: '{{count}} ก้าวไปข้างหน้า',
+    sessionStart: 'เริ่มเซสชัน',
+    currentState: 'สถานะปัจจุบัน',
+    nodeTitleChange: 'เปลี่ยนชื่อบล็อก',
+    nodeDescriptionChange: 'คําอธิบายบล็อกเปลี่ยนไป',
+    nodeDragStop: 'บล็อกย้าย',
+    nodeChange: 'บล็อกเปลี่ยนไป',
+    nodeConnect: 'บล็อกเชื่อมต่อ',
+    nodePaste: 'บล็อกวาง',
+    nodeDelete: 'บล็อกลบ',
+    nodeAdd: 'เพิ่มบล็อก',
+    nodeResize: 'บล็อกปรับขนาด',
+    noteAdd: 'เพิ่มหมายเหตุ',
+    noteChange: 'เปลี่ยนหมายเหตุ',
+    noteDelete: 'ลบโน้ต',
+    edgeDelete: 'บล็อกตัดการเชื่อมต่อ',
+  },
+  errorMsg: {
+    fieldRequired: '{{field}} เป็นสิ่งจําเป็น',
+    rerankModelRequired: 'ก่อนเปิด Rerank Model โปรดยืนยันว่าได้กําหนดค่าโมเดลสําเร็จในการตั้งค่า',
+    authRequired: 'ต้องได้รับอนุญาต',
+    invalidJson: '{{field}} เป็น JSON ไม่ถูกต้อง',
+    fields: {
+      variable: 'ชื่อตัวแปร',
+      variableValue: 'ค่าตัวแปร',
+      code: 'รหัส',
+      model: 'แบบ',
+      rerankModel: 'จัดอันดับโมเดลใหม่',
+      visionVariable: 'ตัวแปรวิสัยทัศน์',
+    },
+    invalidVariable: 'ตัวแปรไม่ถูกต้อง',
+  },
+  singleRun: {
+    testRun: 'ทดสอบการทํางาน',
+    startRun: 'เริ่มวิ่ง',
+    running: 'กำลัง เรียก ใช้',
+    testRunIteration: 'การทดสอบการทําซ้ํา',
+    back: 'ย้อนกลับ',
+    iteration: 'เกิด ซ้ำ',
+  },
+  tabs: {
+    'searchBlock': 'บล็อกการค้นหา',
+    'blocks': 'บล็อก',
+    'searchTool': 'เครื่องมือค้นหา',
+    'tools': 'เครื่อง มือ',
+    'allTool': 'ทั้งหมด',
+    'builtInTool': 'ในตัว',
+    'customTool': 'ธรรมเนียม',
+    'workflowTool': 'เวิร์กโฟลว์',
+    'question-understand': 'คําถาม: เข้าใจ',
+    'logic': 'ตรรกวิทยา',
+    'transform': 'แปลง',
+    'utilities': 'สาธารณูปโภค',
+    'noResult': 'ไม่พบการจับคู่',
+  },
+  blocks: {
+    'start': 'เริ่ม',
+    'end': 'ปลาย',
+    'answer': 'ตอบ',
+    'llm': 'นิติศาสตราจารย์',
+    'knowledge-retrieval': 'การดึงความรู้',
+    'question-classifier': 'ตัวจําแนกคําถาม',
+    'if-else': 'ถ้า/อื่น',
+    'code': 'รหัส',
+    'template-transform': 'แม่ แบบ',
+    'http-request': 'คําขอ HTTP',
+    'variable-assigner': 'ตัวรวบรวมตัวแปร',
+    'variable-aggregator': 'ตัวรวบรวมตัวแปร',
+    'assigner': 'ตัวกําหนดตัวแปร',
+    'iteration-start': 'เริ่มการทําซ้ํา',
+    'iteration': 'เกิด ซ้ำ',
+    'parameter-extractor': 'ตัวแยกพารามิเตอร์',
+    'document-extractor': 'ตัวแยกเอกสาร',
+    'list-operator': 'ตัวดําเนินการรายการ',
+  },
+  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': 'รวมตัวแปรหลายสาขาเป็นตัวแปรเดียวสําหรับการกําหนดค่าแบบรวมของโหนดดาวน์สตรีม',
+    'assigner': 'โหนดการกําหนดตัวแปรใช้สําหรับกําหนดค่าให้กับตัวแปรที่เขียนได้ (เช่นตัวแปรการสนทนา)',
+    'variable-aggregator': 'รวมตัวแปรหลายสาขาเป็นตัวแปรเดียวสําหรับการกําหนดค่าแบบรวมของโหนดดาวน์สตรีม',
+    'iteration': 'ดําเนินการหลายขั้นตอนกับวัตถุรายการจนกว่าจะส่งออกผลลัพธ์ทั้งหมด',
+    'parameter-extractor': 'ใช้ LLM เพื่อแยกพารามิเตอร์ที่มีโครงสร้างจากภาษาธรรมชาติสําหรับการเรียกใช้เครื่องมือหรือคําขอ HTTP',
+    'document-extractor': 'ใช้เพื่อแยกวิเคราะห์เอกสารที่อัปโหลดเป็นเนื้อหาข้อความที่ LLM เข้าใจได้ง่าย',
+    'list-operator': 'ใช้เพื่อกรองหรือจัดเรียงเนื้อหาอาร์เรย์',
+  },
+  operator: {
+    zoomIn: 'ซูมเข้า',
+    zoomOut: 'ซูมออก',
+    zoomTo50: 'ซูมไปที่ 50%',
+    zoomTo100: 'ซูมไปที่ 100%',
+    zoomToFit: 'ซูมให้พอดี',
+  },
+  panel: {
+    userInputField: 'ฟิลด์ป้อนข้อมูลของผู้ใช้',
+    changeBlock: 'เปลี่ยนบล็อก',
+    helpLink: 'ลิงค์ช่วยเหลือ',
+    about: 'ประมาณ',
+    createdBy: 'สร้างโดย',
+    nextStep: 'ขั้นตอนถัดไป',
+    addNextStep: 'เพิ่มบล็อกถัดไปในเวิร์กโฟลว์นี้',
+    selectNextStep: 'เลือกบล็อกถัดไป',
+    runThisStep: 'เรียกใช้ขั้นตอนนี้',
+    checklist: 'ตรวจ สอบ',
+    checklistTip: 'ตรวจสอบให้แน่ใจว่าปัญหาทั้งหมดได้รับการแก้ไขแล้วก่อนที่จะเผยแพร่',
+    checklistResolved: 'ปัญหาทั้งหมดได้รับการแก้ไขแล้ว',
+    organizeBlocks: 'จัดระเบียบบล็อก',
+    change: 'เปลี่ยน',
+    optional: '(ไม่บังคับ)',
+  },
+  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: 'ตัวแปร',
+      },
+      sysQueryInUser: 'sys.query ในข้อความผู้ใช้เป็นสิ่งจําเป็น',
+    },
+    knowledgeRetrieval: {
+      queryVariable: 'ตัวแปรแบบสอบถาม',
+      knowledge: 'ความรู้',
+      outputVars: {
+        output: 'การดึงข้อมูลที่แบ่งส่วน',
+        content: 'เนื้อหาที่แบ่งกลุ่ม',
+        title: 'ชื่อแบ่งส่วน',
+        icon: 'ไอคอนแบ่งส่วน',
+        url: 'URL ที่แบ่งกลุ่ม',
+        metadata: 'ข้อมูลเมตาอื่นๆ',
+      },
+    },
+    http: {
+      inputVars: 'ตัวแปรอินพุต',
+      api: 'เอพีไอ',
+      apiPlaceholder: 'ป้อน URL พิมพ์ \'/\' แทรกตัวแปร',
+      extractListPlaceholder: 'ป้อนดัชนีรายการพิมพ์ \'/\' แทรกตัวแปร',
+      notStartWithHttp: 'API ควรขึ้นต้นด้วย http:// หรือ https://',
+      key: 'กุญแจ',
+      type: 'ประเภท',
+      value: 'ค่า',
+      bulkEdit: 'แก้ไขจํานวนมาก',
+      keyValueEdit: 'การแก้ไขคีย์-ค่า',
+      headers: 'หัว กระดาษ',
+      params: 'พารามิเตอร์',
+      body: 'ร่างกาย',
+      binaryFileVariable: 'ตัวแปรไฟล์ไบนารี',
+      outputVars: {
+        body: 'เนื้อหาการตอบกลับ',
+        statusCode: 'รหัสสถานะการตอบกลับ',
+        headers: 'JSON รายการส่วนหัวการตอบสนอง',
+        files: 'รายการไฟล์',
+      },
+      authorization: {
+        'authorization': 'การอนุญาต',
+        'authorizationType': 'ประเภทการอนุญาต',
+        'no-auth': 'ไม่มีใคร',
+        'api-key': 'คีย์ API',
+        'auth-type': 'ประเภทการรับรองความถูกต้อง',
+        'basic': 'พื้นฐาน',
+        'bearer': 'ผู้ถือ',
+        'custom': 'ธรรมเนียม',
+        'api-key-title': 'คีย์ API',
+        'header': 'หัว ข้อ',
+      },
+      insertVarPlaceholder: 'พิมพ์ \'/\' เพื่อแทรกตัวแปร',
+      timeout: {
+        title: 'หมดเวลา',
+        connectLabel: 'หมดเวลาการเชื่อมต่อ',
+        connectPlaceholder: 'ป้อนการหมดเวลาการเชื่อมต่อเป็นวินาที',
+        readLabel: 'หมดเวลาการอ่าน',
+        readPlaceholder: 'ป้อนหมดเวลาการอ่านเป็นวินาที',
+        writeLabel: 'หมดเวลาการเขียน',
+        writePlaceholder: 'ป้อนหมดเวลาการเขียนเป็นวินาที',
+      },
+      curl: {
+        title: 'นําเข้าจาก cURL',
+        placeholder: 'วางสตริง cURL ที่นี่',
+      },
+    },
+    code: {
+      inputVars: 'ตัวแปรอินพุต',
+      outputVars: 'ตัวแปรเอาต์พุต',
+      advancedDependencies: 'การพึ่งพาขั้นสูง',
+      advancedDependenciesTip: 'เพิ่มการพึ่งพาที่โหลดไว้ล่วงหน้าซึ่งใช้เวลามากขึ้นในการใช้หรือไม่ใช่ค่าเริ่มต้นในตัวที่นี่',
+      searchDependencies: 'การพึ่งพาการค้นหา',
+    },
+    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': 'เป็นโมฆะ',
+        'not null': 'ไม่เป็นโมฆะ',
+        'in': 'ใน',
+        'not in': 'ไม่อยู่ใน',
+        'all of': 'ทั้งหมด',
+        'exists': 'อยู่',
+        'not exists': 'ไม่มีอยู่จริง',
+      },
+      optionName: {
+        image: 'ภาพ',
+        doc: 'เอกสาร',
+        audio: 'เสียง',
+        video: 'วีดิทัศน์',
+        localUpload: 'อัปโหลดในเครื่อง',
+        url: 'URL',
+      },
+      enterValue: 'ป้อนค่า',
+      addCondition: 'เพิ่มเงื่อนไข',
+      conditionNotSetup: 'เงื่อนไข NOT ตั้งค่า',
+      selectVariable: 'เลือกตัวแปร...',
+      addSubVariable: 'ตัวแปรย่อย',
+      select: 'เลือก',
+    },
+    variableAssigner: {
+      title: 'กําหนดตัวแปร',
+      outputType: 'ประเภทเอาต์พุต',
+      varNotSet: 'ไม่ได้ตั้งค่าตัวแปร',
+      noVarTip: 'เพิ่มตัวแปรที่จะกําหนด',
+      type: {
+        string: 'เชือก',
+        number: 'เลข',
+        object: 'วัตถุ',
+        array: 'อาร์เรย์',
+      },
+      aggregationGroup: 'กลุ่มการรวม',
+      aggregationGroupTip: 'การเปิดใช้งานคุณลักษณะนี้ช่วยให้ตัวรวบรวมตัวแปรสามารถรวมชุดตัวแปรหลายชุดได้',
+      addGroup: 'เพิ่มกลุ่ม',
+      outputVars: {
+        varDescribe: '{{groupName}} เอาต์พุต',
+      },
+      setAssignVariable: 'ตั้งค่าตัวแปรกําหนด',
+    },
+    assigner: {
+      'assignedVariable': 'ตัวแปรที่กําหนด',
+      'writeMode': 'โหมดเขียน',
+      'writeModeTip': 'โหมดผนวก: ใช้ได้กับตัวแปรอาร์เรย์เท่านั้น',
+      'over-write': 'เขียน ทับ',
+      'append': 'ผนวก',
+      'plus': 'บวก',
+      'clear': 'ใส',
+      'setVariable': 'ตั้งค่าตัวแปร',
+      'variable': 'ตัวแปร',
+    },
+    tool: {
+      toAuthorize: 'เพื่ออนุญาต',
+      inputVars: 'ตัวแปรอินพุต',
+      outputVars: {
+        text: 'เนื้อหาที่สร้างขึ้นด้วยเครื่องมือ',
+        files: {
+          title: 'ไฟล์ที่สร้างขึ้นด้วยเครื่องมือ',
+          type: 'ประเภทการสนับสนุน ตอนนี้รองรับเฉพาะรูปภาพ',
+          transfer_method: 'วิธีการโอน ค่าเป็น remote_url หรือ local_file',
+          url: 'URL ของรูปภาพ',
+          upload_file_id: 'อัปโหลดรหัสไฟล์',
+        },
+        json: 'เครื่องมือสร้าง JSON',
+      },
+    },
+    questionClassifiers: {
+      model: 'แบบ',
+      inputVars: 'ตัวแปรอินพุต',
+      outputVars: {
+        className: 'ชื่อคลาส',
+      },
+      class: 'ประเภท',
+      classNamePlaceholder: 'เขียนชื่อชั้นเรียนของคุณ',
+      advancedSetting: 'การตั้งค่าขั้นสูง',
+      topicName: 'ชื่อหัวข้อ',
+      topicPlaceholder: 'เขียนชื่อหัวข้อของคุณ',
+      addClass: 'เพิ่มชั้นเรียน',
+      instruction: 'การสอน',
+      instructionTip: 'ป้อนคําแนะนําเพิ่มเติมเพื่อช่วยให้ตัวจําแนกคําถามเข้าใจวิธีจัดหมวดหมู่คําถามได้ดียิ่งขึ้น',
+      instructionPlaceholder: 'เขียนคําแนะนําของคุณ',
+    },
+    parameterExtractor: {
+      inputVar: 'ตัวแปรอินพุต',
+      extractParameters: 'แยกพารามิเตอร์',
+      importFromTool: 'นําเข้าจากเครื่องมือ',
+      addExtractParameter: 'เพิ่มพารามิเตอร์การแยกข้อมูล',
+      addExtractParameterContent: {
+        name: 'ชื่อ',
+        namePlaceholder: 'แยกชื่อพารามิเตอร์',
+        type: 'ประเภท',
+        typePlaceholder: 'แยกประเภทพารามิเตอร์',
+        description: 'คำอธิบาย',
+        descriptionPlaceholder: 'แยกคําอธิบายพารามิเตอร์',
+        required: 'ต้องระบุ',
+        requiredContent: 'Required ใช้เป็นข้อมูลอ้างอิงสําหรับการอนุมานแบบจําลองเท่านั้น และไม่ใช่สําหรับการตรวจสอบความถูกต้องของเอาต์พุตพารามิเตอร์ที่จําเป็น',
+      },
+      extractParametersNotSet: 'ไม่ได้ตั้งค่าพารามิเตอร์การแยกข้อมูล',
+      instruction: 'การสอน',
+      instructionTip: 'ป้อนคําแนะนําเพิ่มเติมเพื่อช่วยให้ตัวแยกพารามิเตอร์เข้าใจวิธีการแยกพารามิเตอร์',
+      advancedSetting: 'การตั้งค่าขั้นสูง',
+      reasoningMode: 'โหมดการให้เหตุผล',
+      reasoningModeTip: 'คุณสามารถเลือกโหมดการให้เหตุผลที่เหมาะสมตามความสามารถของโมเดลในการตอบสนองต่อคําแนะนําสําหรับการเรียกใช้ฟังก์ชันหรือข้อความแจ้ง',
+      isSuccess: 'คือ Success เมื่อสําเร็จค่าคือ 1 เมื่อล้มเหลวค่าเป็น 0',
+      errorReason: 'สาเหตุข้อผิดพลาด',
+    },
+    iteration: {
+      deleteTitle: 'ลบโหนดการทําซ้ํา?',
+      deleteDesc: 'การลบโหนดการวนซ้ําจะเป็นการลบโหนดย่อยทั้งหมด',
+      input: 'อินพุต',
+      output: 'ตัวแปรเอาต์พุต',
+      iteration_one: '{{นับ}} เกิด ซ้ำ',
+      iteration_other: '{{นับ}} เกิด ซ้ำ',
+      currentIteration: 'การทําซ้ําปัจจุบัน',
+      comma: ',',
+      error_one: '{{นับ}} ความผิดพลาด',
+      error_other: '{{นับ}} ข้อ ผิด พลาด',
+      parallelMode: 'โหมดขนาน',
+      parallelModeUpper: 'โหมดขนาน',
+      parallelModeEnableTitle: 'เปิดใช้งานโหมดขนาน',
+      parallelModeEnableDesc: 'ในโหมดขนาน งานภายในการทําซ้ําจะสนับสนุนการดําเนินการแบบขนาน คุณสามารถกําหนดค่านี้ได้ในแผงคุณสมบัติทางด้านขวา',
+      parallelPanelDesc: 'ในโหมดขนาน งานในการวนซ้ําจะสนับสนุนการดําเนินการแบบขนาน',
+      MaxParallelismTitle: 'ความขนานสูงสุด',
+      MaxParallelismDesc: 'ความขนานสูงสุดใช้เพื่อควบคุมจํานวนงานที่ดําเนินการพร้อมกันในการทําซ้ําครั้งเดียว',
+      errorResponseMethod: 'วิธีการตอบสนองข้อผิดพลาด',
+      ErrorMethod: {
+        operationTerminated: 'ยก เลิก',
+        continueOnError: 'ดําเนินการต่อเมื่อเกิดข้อผิดพลาด',
+        removeAbnormalOutput: 'ลบเอาต์พุตที่ผิดปกติ',
+      },
+      answerNodeWarningDesc: 'คําเตือนโหมดคู่ขนาน: โหนดคําตอบ การกําหนดตัวแปรการสนทนา และการดําเนินการอ่าน/เขียนแบบถาวรภายในการวนซ้ําอาจทําให้เกิดข้อยกเว้น',
+    },
+    note: {
+      addNote: 'เพิ่มหมายเหตุ',
+      editor: {
+        placeholder: 'เขียนบันทึกของคุณ...',
+        small: 'เล็ก',
+        medium: 'ปานกลาง',
+        large: 'ใหญ่',
+        bold: 'กล้า',
+        italic: 'ตัวเอียง',
+        strikethrough: 'ขีดทับ',
+        link: 'ลิงก์',
+        openLink: 'เปิด',
+        unlink: 'ยก เลิก',
+        enterUrl: 'ป้อน URL...',
+        invalidUrl: 'URL ไม่ถูกต้อง',
+        bulletList: 'รายการสัญลักษณ์แสดงหัวข้อย่อย',
+        showAuthor: 'แสดงผู้เขียน',
+      },
+    },
+    docExtractor: {
+      inputVar: 'ตัวแปรอินพุต',
+      outputVars: {
+        text: 'ข้อความที่แยกออกมา',
+      },
+      supportFileTypes: 'ประเภทไฟล์ที่รองรับ: {{types}}',
+      learnMore: 'ศึกษาเพิ่มเติม',
+    },
+    listFilter: {
+      inputVar: 'ตัวแปรอินพุต',
+      filterCondition: 'เงื่อนไขการกรอง',
+      filterConditionKey: 'คีย์เงื่อนไขตัวกรอง',
+      extractsCondition: 'แยกรายการ N',
+      filterConditionComparisonOperator: 'ตัวดําเนินการเปรียบเทียบเงื่อนไขตัวกรอง',
+      filterConditionComparisonValue: 'ค่าเงื่อนไขตัวกรอง',
+      selectVariableKeyPlaceholder: 'เลือกคีย์ตัวแปรย่อย',
+      limit: 'ด้านบน N',
+      orderBy: 'สั่งซื้อโดย',
+      asc: 'เอเอสซี',
+      desc: 'สูง สุด',
+      outputVars: {
+        result: 'กรองผลลัพธ์',
+        first_record: 'บันทึกแรก',
+        last_record: 'บันทึกล่าสุด',
+      },
+    },
+  },
+  tracing: {
+    stopBy: 'แวะที่ {{user}}',
+  },
+}
+
+export default translation