Browse Source

chore: add Thai GUI (#11201)

Yi Xiao 5 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

File diff suppressed because it is too large
+ 85 - 0
web/i18n/th-TH/app-api.ts


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


File diff suppressed because it is too large
+ 94 - 0
web/i18n/th-TH/app-log.ts


+ 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

File diff suppressed because it is too large
+ 598 - 0
web/i18n/th-TH/common.ts


+ 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

File diff suppressed because it is too large
+ 176 - 0
web/i18n/th-TH/dataset-creation.ts


+ 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

File diff suppressed because it is too large
+ 150 - 0
web/i18n/th-TH/dataset.ts


+ 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