diff --git a/TRANSLATIONS.md b/TRANSLATIONS.md index 4476968878..13aa6b322d 100644 --- a/TRANSLATIONS.md +++ b/TRANSLATIONS.md @@ -30,6 +30,7 @@ from `LOCALES`. | Code | Language | UI dict | Root README | Core docs | Display metadata | Status | | ------- | -------------------- | ---------------------- | ------------------- | --------- | ---------------- | ------ | | `en` | English | `en.ts` (source) | `README.md` | source | `content.ts` | active | +| `id` | Bahasa Indonesia | `id.ts` | — | — | — | active | | `ar` | العربية | `ar.ts` | `README.ar.md` | — | — | active | | `de` | Deutsch | `de.ts` | `README.de.md` | yes | — | active | | `es-ES` | Español (España) | `es-ES.ts` | `README.es.md` | — | — | active | @@ -45,6 +46,7 @@ from `LOCALES`. | `fr` | Français | `fr.ts` | `README.fr.md` | yes | `content.fr.ts` | active | | `uk` | Українська | `uk.ts` | `README.uk.md` | — | — | active | | `tr` | Türkçe | `tr.ts` | `README.tr.md` | — | — | active | +| `th` | ภาษาไทย | `th.ts` | — | — | — | active | > A locale may ship a UI dict, a root README, core docs, display metadata, > or any subset of those surfaces. The English locale is the source of diff --git a/apps/web/src/i18n/index.tsx b/apps/web/src/i18n/index.tsx index 68324f7193..3b57b9277e 100644 --- a/apps/web/src/i18n/index.tsx +++ b/apps/web/src/i18n/index.tsx @@ -26,6 +26,7 @@ import { hu } from './locales/hu'; import { fr } from './locales/fr'; import { uk } from './locales/uk'; import { tr } from './locales/tr'; +import { th } from './locales/th'; import { LOCALES, type Dict, type Locale } from './types'; export { LOCALES, LOCALE_LABEL } from './types'; @@ -51,6 +52,7 @@ const DICTS: Record = { 'fr': fr, 'uk': uk, 'tr': tr, + 'th': th, }; const LS_KEY = 'open-design:locale'; diff --git a/apps/web/src/i18n/locales/th.ts b/apps/web/src/i18n/locales/th.ts new file mode 100644 index 0000000000..afcf513fb6 --- /dev/null +++ b/apps/web/src/i18n/locales/th.ts @@ -0,0 +1,1219 @@ +import { en } from './en'; +import type { Dict } from '../types'; + +export const th: Dict = { + ...en, + 'common.cancel': 'ยกเลิก', + 'common.save': 'บันทึก', + 'common.close': 'ปิด', + 'common.delete': 'ลบ', + 'common.rename': 'เปลี่ยนชื่อ', + 'common.preview': 'ดูตัวอย่าง', + 'common.share': 'แชร์', + 'common.search': 'ค้นหา', + 'common.searchEllipsis': 'ค้นหา…', + 'common.loading': 'กำลังโหลด…', + 'common.all': 'ทั้งหมด', + 'common.none': 'ไม่มี', + 'common.default': 'ค่าเริ่มต้น', + 'common.installed': 'ติดตั้งแล้ว', + 'common.notInstalled': 'ยังไม่ได้ติดตั้ง', + 'common.active': 'เปิดใช้งาน', + 'common.offline': 'ออฟไลน์', + 'common.selected': 'เลือกแล้ว', + 'common.create': 'สร้าง', + 'common.openPreview': 'เปิดหน้าตัวอย่าง', + 'common.exitFullscreen': 'ออกจากเต็มหน้าจอ', + 'common.fullscreen': 'เต็มหน้าจอ', + 'common.openInNewTab': 'เปิดในแท็บใหม่', + 'common.exportPdf': 'ส่งออกเป็น PDF', + 'common.exportZip': 'ดาวน์โหลดเป็น .zip', + 'common.exportHtml': 'ส่งออกเป็น HTML', + 'common.justNow': 'เมื่อครู่นี้', + 'common.minutesAgo': '{n} นาทีที่แล้ว', + 'common.hoursAgo': '{n} ชั่วโมงที่แล้ว', + 'common.daysAgo': '{n} วันที่แล้ว', + 'common.now': 'ตอนนี้', + 'common.minutesShort': '{n} นาที', + 'common.hoursShort': '{n} ชม.', + 'common.daysShort': '{n} วัน', + 'common.untitled': 'ไม่มีชื่อ', + + 'app.brand': 'Open Design', + 'app.brandPill': 'ตัวอย่างเพื่อการวิจัย', + 'app.brandSubtitle': 'โดย Nexu Labs', + 'app.welcomeLoading': 'กำลังโหลดพื้นที่ทำงาน…', + + 'settings.welcomeKicker': 'ยินดีต้อนรับ', + 'settings.welcomeTitle': 'ตั้งค่า Open Design', + 'settings.welcomeSubtitle': "เลือกวิธีที่คุณต้องการให้ระบบสร้างผลงาน คุณสามารถเปลี่ยนค่านี้ได้ตลอดเวลาจากปุ่มการตั้งค่าที่แถบด้านบน", + 'settings.kicker': 'การตั้งค่า', + 'settings.title': 'การรันและโมเดล', + 'settings.subtitle': 'เลือกระหว่าง Local CLI และ BYOK (ใช้ API Key ของคุณเอง) โดย API Key จะถูกเก็บไว้ในเบราว์เซอร์นี้เท่านั้น', + 'settings.modeAria': 'โหมดการทำงาน', + 'settings.protocolAria': 'โปรโตคอล API', + 'settings.modeDaemon': 'Local CLI', + 'settings.modeDaemonHelp': 'ทำงานผ่าน code-agent CLI บนเครื่องของคุณ', + 'settings.modeDaemonOffline': 'Daemon ไม่ได้ทำงานอยู่', + 'settings.modeDaemonOfflineMeta': 'daemon ออฟไลน์', + 'settings.modeDaemonInstalledMeta': 'ติดตั้งแล้ว {count} ตัว', + 'settings.modeApi': 'ผู้ให้บริการ API', + 'settings.modeApiMeta': 'BYOK', + 'settings.codeAgent': 'เอเจนต์โค้ด', + 'settings.codeAgentHint': 'ตรวจพบจากการสแกน PATH ของคุณ เลือก CLI ที่คุณต้องการให้ระบบใช้งาน', + 'settings.rescan': '↻ สแกนใหม่', + 'settings.rescanTitle': 'สแกน PATH ใหม่', + 'settings.rescanRunning': 'กำลังสแกน...', + 'settings.rescanSuccess': 'สแกนเสร็จสิ้น พบ {count} ตัวที่ใช้งานได้', + 'settings.rescanFailed': 'การสแกนล้มเหลว ตรวจสอบ daemon แล้วลองอีกครั้ง', + 'settings.test': 'ทดสอบ', + 'settings.testTitle': 'ส่งข้อความทดสอบขนาดเล็กเพื่อยืนยันการเชื่อมต่อ', + 'settings.testRunning': 'กำลังทดสอบการเชื่อมต่อ…', + 'settings.testCancel': 'ยกเลิก', + 'settings.testSuccessApi': 'เชื่อมต่อแล้ว ตอบกลับใน {ms} มิลลิวินาที — \'{sample}\'', + 'settings.testSuccessCli': '{agentName} ตอบกลับใน {ms} มิลลิวินาที — \'{sample}\'', + 'settings.testAuthFailed': 'การยืนยันตัวตนล้มเหลว ตรวจสอบ API Key ของคุณ', + 'settings.testForbidden': 'ถูกปฏิเสธการเข้าถึง ตรวจสอบบัญชี ภูมิภาค หรือองค์กรของคุณ', + 'settings.testNotFoundModel': 'ไม่พบโมเดล \'{model}\' ใน Endpoint นี้', + 'settings.testInvalidModelId': 'ID โมเดล \'{model}\' ไม่ถูกต้อง ID ต้องขึ้นต้นด้วยตัวอักษรหรือตัวเลข และไม่มีช่องว่าง', + 'settings.testInvalidBaseUrl': 'Base URL ไม่ถูกต้องหรือไม่สามารถเข้าถึงได้', + 'settings.testRateLimited': 'ผู้ให้บริการจำกัดอัตราการส่งข้อมูล', + 'settings.testUpstream': 'ผู้ให้บริการตอบกลับด้วยสถานะ {status} โปรดลองอีกครั้งในภายหลัง', + 'settings.testTimeout': 'การทดสอบหมดเวลาหลังจาก {ms} มิลลิวินาที', + 'settings.testAgentMissing': 'ยังไม่ได้ติดตั้ง {agentName} หรือไม่ได้อยู่ใน PATH', + 'settings.testAgentSpawn': 'ไม่สามารถเริ่ม {agentName} ได้: {detail}', + 'settings.testUnknown': 'การทดสอบล้มเหลว: {detail}', + 'settings.noAgentsDetected': 'ยังไม่พบเอเจนต์ โปรดติดตั้งอย่างใดอย่างหนึ่ง: Claude Code, Codex, Devin for Terminal, Gemini CLI, OpenCode, Cursor Agent, Qwen หรือ GitHub Copilot CLI แล้วคลิกสแกนใหม่', + 'settings.apiSection': 'Anthropic API', + 'settings.quickFillProvider': 'เลือกผู้ให้บริการอย่างรวดเร็ว', + 'settings.customProvider': 'กำหนดผู้ให้บริการเอง', + 'settings.apiKey': 'API Key', + 'settings.showKey': 'แสดง Key', + 'settings.hideKey': 'ซ่อน Key', + 'settings.show': 'แสดง', + 'settings.hide': 'ซ่อน', + 'settings.model': 'โมเดล', + 'settings.suggestedModelsHint': 'นี่คือโมเดลที่แนะนำสำหรับโปรโตคอลนี้ ผู้ให้บริการของคุณอาจรองรับโมเดลอื่นๆ', + 'settings.baseUrl': 'Base URL', + 'settings.baseUrlInvalid': 'ป้อน URL http:// หรือ https:// ที่ถูกต้อง อนุญาตให้ใช้ localhost ได้ แต่ห้ามใช้ IP ส่วนตัวในเครือข่าย', + 'settings.azureDeploymentModel': 'ชื่อ Deployment', + 'settings.azureDeploymentModelHint': 'สำหรับ Azure OpenAI ฟิลด์นี้ใช้เป็นชื่อ Deployment ใน /openai/deployments/ ป้อนชื่อ Deployment ที่คุณสร้างใน Azure', + 'settings.apiVersion': 'เวอร์ชัน API', + 'settings.maxTokens': 'Max tokens (เลือกได้)', + 'settings.maxTokensHint': 'ขีดจำกัดความยาวในการตอบกลับ', + 'settings.apiHint': 'คำสั่งจะถูกส่งผ่าน local daemon proxy ไปยัง base URL ที่คุณตั้งไว้ API Key จะถูกเก็บในเบราว์เซอร์นี้เท่านั้น', + 'settings.skipForNow': 'ข้ามไปก่อน', + 'settings.getStarted': 'เริ่มต้นใช้งาน', + 'settings.envConfigure': 'กำหนดค่าโหมดการทำงาน', + 'settings.localCli': 'Local CLI', + 'settings.anthropicApi': 'Anthropic API', + 'settings.noAgentSelected': 'ไม่ได้เลือกเอเจนต์', + 'settings.language': 'ภาษา', + 'settings.languageHint': 'เปลี่ยนภาษาอินเทอร์เฟซ บันทึกไว้ในเบราว์เซอร์นี้', + 'settings.appearance': 'ลักษณะที่ปรากฏ', + 'settings.appearanceHint': 'เลือกธีมสว่าง มืด หรือตามระบบ', + 'settings.themeSystem': 'ระบบ', + 'settings.themeLight': 'สว่าง', + 'settings.themeDark': 'มืด', + 'settings.modelPicker': 'โมเดล', + 'settings.reasoningPicker': 'ความพยายามในการให้เหตุผล', + 'settings.modelPickerHint': 'ดึงข้อมูลจาก CLI เมื่อมีคำสั่ง `models`', + 'settings.cliEnvTitle': 'ตำแหน่งการตั้งค่า CLI', + 'settings.cliEnvHint': 'ตั้งค่าไดเรกทอรีการกำหนดค่า (ที่ไม่เป็นความลับ) สำหรับแอปพลิเคชัน', + 'settings.cliEnvClaudeConfigDir': 'ไดเรกทอรีการตั้งค่า Claude Code', + 'settings.cliEnvCodexHome': 'Codex home', + 'settings.cliEnvCodexBin': 'เส้นทางไฟล์เรียกทำงาน Codex', + 'settings.modelCustom': 'กำหนดเอง (พิมพ์ด้านล่าง)…', + 'settings.modelCustomLabel': 'ID โมเดลที่กำหนดเอง', + 'settings.modelCustomPlaceholder': 'เช่น anthropic/claude-sonnet-4-6', + 'settings.mediaProviders': 'ผู้ให้บริการสื่อ', + 'settings.mediaProvidersHint': 'API keys สำหรับการสร้างภาพ วิดีโอ และเสียง บันทึกในเครื่องและซิงค์กับ local daemon', + 'settings.mcpServerTitle': 'เซิร์ฟเวอร์ MCP', + 'settings.mcpServerHint': 'เปิดให้ Open Design เป็นเซิร์ฟเวอร์ MCP สำหรับเอเจนต์โค้ด', + 'settings.externalMcpTitle': 'MCP ภายนอก', + 'settings.externalMcpHint': 'เพิ่มเครื่องมือ MCP จากบริการภายนอก (Higgsfield, GitHub, …)', + 'settings.mediaProviderApiKey': 'API key', + 'settings.mediaProviderBaseUrl': 'Base URL', + 'settings.mediaProviderConfigured': 'ตั้งค่าแล้ว', + 'settings.mediaProviderUnset': 'ยังไม่ได้ตั้งค่า', + 'settings.mediaProviderClear': 'ล้าง', + 'settings.mediaProviderClearConfirm': 'ล้างการตั้งค่า {name} ที่บันทึกไว้ใช่หรือไม่? คุณจะต้องตั้งค่าใหม่อีกครั้งเพื่อใช้งาน {name}', + 'settings.mediaProviderPlaceholder': 'วาง API key', + 'settings.mediaProviderBaseUrlPlaceholder': 'กำหนด Base URL แท่นค่าเริ่มต้น', + 'settings.privacy': 'ความเป็นส่วนตัว', + 'settings.privacyHint': 'ข้อมูลที่แชร์กับทีม Open Design', + 'settings.privacyConsentKicker': 'ช่วยเราพัฒนา Open Design', + 'settings.privacyConsentLead': 'Open Design สามารถแชร์ข้อมูลการใช้งานกับทีมของเราเพื่อช่วยพัฒนา ซึ่งรวมถึง:', + 'settings.privacyConsentFooter': 'คุณสามารถเปลี่ยนการตั้งค่าเหล่านี้ได้ตลอดเวลาใน การตั้งค่า → ความเป็นส่วนตัว เราจะไม่ส่งเนื้อหาในไฟล์ที่คุณสร้างขึ้น', + 'settings.privacyConsentShare': 'ช่วยปรับปรุง', + 'settings.privacyConsentDecline': 'ไว้ทีหลัง', + 'settings.privacyMetrics': 'ข้อมูลผู้ใช้นิรนาม', + 'settings.privacyMetricsHint': 'จำนวนการใช้งาน, การใช้โทเค็น, อัตราข้อผิดพลาด', + 'settings.privacyContent': 'เนื้อหาการสนทนา', + 'settings.privacyContentHint': 'คำสั่งของคุณและการตอบกลับของระบบ (ตัดทอนเหลือ 8/16 KB)', + 'settings.privacyArtifacts': 'ข้อมูลโครงสร้างไฟล์', + 'settings.privacyArtifactsHint': 'ชื่อไฟล์ ประเภท ขนาดไฟล์ที่สร้าง', + 'settings.privacyInstallationId': 'ID ผู้ใช้นิรนาม', + 'settings.privacyOptedOut': 'ปฏิเสธแล้ว', + 'settings.privacyDataDeletion': 'ลบข้อมูลของฉัน', + 'settings.privacyDataDeletionHint': 'รีเซ็ต ID ผู้ใช้นิรนามและหยุดการส่งข้อมูล', + 'settings.about': 'เกี่ยวกับ', + 'settings.aboutHint': 'เวอร์ชันและรายละเอียดระบบ', + 'settings.appVersion': 'เวอร์ชัน', + 'settings.appChannel': 'ช่องทาง', + 'settings.appRuntime': 'รันไทม์', + 'settings.appPlatform': 'แพลตฟอร์ม', + 'settings.appArchitecture': 'สถาปัตยกรรม', + 'settings.runtimePackaged': 'แอปที่แพ็กเกจแล้ว', + 'settings.runtimeDevelopment': 'การพัฒนา', + 'settings.versionUnavailable': 'ข้อมูลเวอร์ชันไม่พร้อมใช้งานขณะที่ daemon ออฟไลน์', + + 'entry.tabDesigns': 'ดีไซน์', + 'entry.tabExamples': 'ตัวอย่าง', + 'entry.tabDesignSystems': 'ระบบการออกแบบ', + 'entry.tabConnectors': 'ตัวเชื่อมต่อ', + 'entry.openSettingsTitle': 'การตั้งค่า', + 'entry.openSettingsAria': 'เปิดการตั้งค่า', + 'entry.resizeAria': 'ปรับขนาดแถบด้านข้าง', + 'entry.loadingWorkspace': 'กำลังโหลดพื้นที่ทำงาน…', + 'entry.tabImageTemplates': 'เทมเพลตภาพ', + 'entry.tabVideoTemplates': 'เทมเพลตวิดีโอ', + 'promptTemplates.searchPlaceholder': 'ค้นหาเทมเพลต…', + 'promptTemplates.countLabel': '{n} ผลลัพธ์', + 'promptTemplates.emptyImage': 'ยังไม่ได้ติดตั้งเทมเพลตคำสั่งภาพ', + 'promptTemplates.emptyVideo': 'ยังไม่ได้ติดตั้งเทมเพลตคำสั่งวิดีโอ', + 'promptTemplates.emptyNoMatch': 'ไม่พบเทมเพลตที่ตรงกับการค้นหา', + 'promptTemplates.attributionFooter': 'ดัดแปลงมาจากห้องสมุดคำสั่งสาธารณะ', + 'promptTemplates.openPreviewTitle': 'เปิดคำสั่งและดูตัวอย่าง', + 'promptTemplates.sourcePrefix': 'แหล่งที่มา:', + 'promptTemplates.fetchError': 'ไม่สามารถโหลดเนื้อหาเทมเพลตนี้', + 'promptTemplates.promptLabel': 'เนื้อหาคำสั่ง', + 'promptTemplates.copyPrompt': 'คัดลอกคำสั่ง', + 'promptTemplates.copyDone': 'คัดลอกแล้ว!', + 'promptTemplates.modelHint': 'โมเดลที่แนะนำ: {model}', + 'promptTemplates.openSource': 'ดูต้นฉบับ', + 'promptTemplates.openFullscreen': 'เปิดแสดงผลเต็มหน้าจอ', + 'promptTemplates.closeFullscreen': 'ปิดแสดงผลเต็มหน้าจอ', + 'promptTemplates.allSources': 'ทุกแหล่งที่มา', + 'promptTemplates.sourceFilterAria': 'กรองตามแหล่งที่มา', + 'promptTemplates.retry': 'ลองใหม่', + + 'connectors.title': 'ตัวเชื่อมต่อ', + 'connectors.subtitle': 'แหล่งข้อมูลที่สามารถใช้ใน live artifacts', + 'connectors.account': 'บัญชี', + 'connectors.noAccount': 'ไม่ได้เชื่อมต่อ', + 'connectors.tools': 'เครื่องมือ', + 'connectors.connect': 'เชื่อมต่อ', + 'connectors.disconnect': 'ตัดการเชื่อมต่อ', + 'connectors.authorizationPending': 'รอการอนุญาต...', + 'connectors.authorizationPendingHint': 'ดำเนินการอนุญาตให้เสร็จสมบูรณ์ในหน้าต่างที่เปิดขึ้น', + 'connectors.cancelAuthorization': 'ยกเลิก', + 'connectors.configure': 'กำหนดค่า', + 'connectors.unavailable': 'ไม่พร้อมใช้งาน', + 'connectors.phaseStubTitle': 'Connector APIs เป็นการแสดงตัวอย่างสำหรับ Phase 3', + 'connectors.statusAvailable': 'พร้อมใช้งาน', + 'connectors.statusConnected': 'เชื่อมต่อแล้ว', + 'connectors.statusError': 'ข้อผิดพลาด', + 'connectors.statusDisabled': 'ปิดการใช้งาน', + 'connectors.gateTitle': 'เพิ่ม Composio API key ของคุณเพื่อดำเนินการต่อ', + 'connectors.gateBody': 'วาง API key ด้านบนและคลิกบันทึกเพื่อดูการผสานรวมที่พร้อมใช้งาน', + 'connectors.aboutLabel': 'เกี่ยวกับ', + 'connectors.detailsLabel': 'รายละเอียด', + 'connectors.statusLabel': 'สถานะ', + 'connectors.category.aiAgents': 'เอเจนต์ AI', + 'connectors.category.aiInfrastructure': 'โครงสร้างพื้นฐาน AI', + 'connectors.category.accounting': 'การบัญชี', + 'connectors.category.admin': 'ผู้ดูแลระบบ', + 'connectors.category.advertising': 'การโฆษณา', + 'connectors.category.analytics': 'การวิเคราะห์', + 'connectors.category.automation': 'ระบบอัตโนมัติ', + 'connectors.category.cms': 'CMS', + 'connectors.category.crm': 'CRM', + 'connectors.category.calendar': 'ปฏิทิน', + 'connectors.category.commerce': 'พาณิชย์', + 'connectors.category.communication': 'การสื่อสาร', + 'connectors.category.contacts': 'รายชื่อติดต่อ', + 'connectors.category.dataPlatform': 'แพลตฟอร์มข้อมูล', + 'connectors.category.database': 'ฐานข้อมูล', + 'connectors.category.design': 'การออกแบบ', + 'connectors.category.developer': 'ผู้พัฒนา', + 'connectors.category.documentation': 'เอกสารประกอบ', + 'connectors.category.erp': 'ERP', + 'connectors.category.education': 'การศึกษา', + 'connectors.category.email': 'อีเมล', + 'connectors.category.events': 'กิจกรรม', + 'connectors.category.fieldService': 'บริการภาคสนาม', + 'connectors.category.finance': 'การเงิน', + 'connectors.category.fitness': 'ฟิตเนส', + 'connectors.category.forms': 'แบบฟอร์ม', + 'connectors.category.gaming': 'เกม', + 'connectors.category.hr': 'ฝ่ายบุคคล', + 'connectors.category.hospitality': 'การบริการลูกค้า', + 'connectors.category.itsm': 'ITSM', + 'connectors.category.integration': 'การผสานรวม', + 'connectors.category.localization': 'การปรับให้เข้ากับท้องถิ่น', + 'connectors.category.logistics': 'โลจิสติกส์', + 'connectors.category.maps': 'แผนที่', + 'connectors.category.marketing': 'การตลาด', + 'connectors.category.media': 'สื่อ', + 'connectors.category.meetings': 'การประชุม', + 'connectors.category.nonprofit': 'ไม่แสวงหาผลกำไร', + 'connectors.category.observability': 'ระบบการสังเกตการณ์', + 'connectors.category.payments': 'การชำระเงิน', + 'connectors.category.personal': 'ส่วนบุคคล', + 'connectors.category.presentations': 'งานนำเสนอ', + 'connectors.category.procurement': 'การจัดซื้อ', + 'connectors.category.product': 'ผลิตภัณฑ์', + 'connectors.category.productivity': 'ผลิตภาพ', + 'connectors.category.projectManagement': 'การจัดการโครงการ', + 'connectors.category.recruiting': 'การสรรหา', + 'connectors.category.research': 'การวิจัย', + 'connectors.category.salesIntelligence': 'ระบบข้อมูลการขาย', + 'connectors.category.scheduling': 'การจัดตารางเวลา', + 'connectors.category.search': 'ค้นหา', + 'connectors.category.security': 'ความปลอดภัย', + 'connectors.category.signing': 'เซ็นเอกสาร', + 'connectors.category.social': 'โซเชียลมีเดีย', + 'connectors.category.spreadsheets': 'สเปรดชีต', + 'connectors.category.storage': 'พื้นที่เก็บข้อมูล', + 'connectors.category.support': 'สนับสนุน', + 'connectors.category.surveys': 'แบบสำรวจ', + 'connectors.category.tasks': 'งาน', + 'connectors.category.timeTracking': 'ติดตามเวลา', + 'connectors.category.video': 'วิดีโอ', + 'connectors.category.whiteboard': 'กระดานไวท์บอร์ด', + 'connectors.categoryLabel': 'หมวดหมู่', + 'connectors.providerLabel': 'ผู้ให้บริการ', + 'connectors.toolsSection': 'เครื่องมือ', + 'connectors.toolsLoading': 'กำลังโหลดเครื่องมือ…', + 'connectors.noToolsAvailable': 'ยังไม่มีเครื่องมือที่พร้อมใช้งาน', + 'connectors.toolDetailsUnavailable': 'รายละเอียดเครื่องมือไม่พร้อมใช้งาน แต่ตัวเชื่อมต่อนี้มีเครื่องมือ {n} ตัว', + 'connectors.loadMoreTools': 'โหลดเครื่องมือเพิ่มเติม', + 'connectors.openDetailsAria': 'เปิดรายละเอียด {name}', + 'connectors.toolsBadgeNone': 'ไม่มีเครื่องมือ', + 'connectors.toolsBadgeOne': '{n} เครื่องมือ', + 'connectors.toolsBadgeMany': '{n} เครื่องมือ', + 'connectors.searchPlaceholder': 'ค้นหาตัวเชื่อมต่อ…', + 'connectors.searchAriaLabel': 'ค้นหาตัวเชื่อมต่อตามชื่อ', + 'connectors.searchClear': 'ล้างการค้นหา', + 'connectors.emptyNoMatchTitle': 'ไม่มีตัวเชื่อมต่อที่ตรงกับ “{query}”', + 'connectors.emptyNoMatchBody': 'ลองใช้คำหลักอื่น', + 'connectors.emptyNoMatchAction': 'ล้างการค้นหา', + + 'newproj.tabPrototype': 'ต้นแบบ (Prototype)', + 'newproj.tabLiveArtifact': 'Live artifact', + 'newproj.tabDeck': 'สไลด์นำเสนอ', + 'newproj.tabTemplate': 'จากเทมเพลต', + 'newproj.tabOther': 'อื่นๆ', + 'newproj.titlePrototype': 'ต้นแบบใหม่', + 'newproj.titleLiveArtifact': 'Live artifact ใหม่', + 'newproj.titleDeck': 'สไลด์นำเสนอใหม่', + 'newproj.titleTemplate': 'เริ่มจากเทมเพลต', + 'newproj.titleImage': 'ภาพใหม่', + 'newproj.titleVideo': 'วิดีโอใหม่', + 'newproj.titleAudio': 'เสียงใหม่', + 'newproj.titleOther': 'โปรเจกต์ใหม่', + 'newproj.namePlaceholder': 'ชื่อโปรเจกต์', + 'newproj.fidelityLabel': 'ความละเอียด', + 'newproj.fidelityWireframe': 'Wireframe', + 'newproj.fidelityHigh': 'High fidelity', + 'newproj.toggleSpeakerNotes': 'ใช้บันทึกผู้บรรยาย', + 'newproj.toggleSpeakerNotesHint': 'ลดข้อความในสไลด์ — ให้ข้อมูลอยู่ในบันทึกแทน', + 'newproj.toggleAnimations': 'รวมแอนิเมชัน', + 'newproj.toggleAnimationsHint': 'เพิ่มแอนิเมชันตอนเข้าหน้า', + 'newproj.templateLabel': 'เทมเพลต', + 'newproj.noTemplatesTitle': 'ยังไม่มีเทมเพลต', + 'newproj.noTemplatesBody': 'เปิดโปรเจกต์แล้วเลือกบันทึกเป็นเทมเพลตเพื่อใช้งานที่นี่', + 'newproj.savedTemplate': 'เทมเพลตที่บันทึกแล้ว', + 'newproj.fileSingular': 'ไฟล์', + 'newproj.filePlural': 'ไฟล์', + 'newproj.create': 'สร้าง', + 'newproj.createLiveArtifact': 'สร้าง live artifact', + 'newproj.createFromTemplate': 'สร้างจากเทมเพลต', + 'newproj.createDisabledTitle': 'คุณต้องบันทึกโปรเจกต์เป็นเทมเพลตก่อน', + 'newproj.importClaudeZip': 'นำเข้า Claude Design ZIP', + 'newproj.importClaudeZipTitle': 'นำเข้า .zip จาก Claude Design', + 'newproj.importingClaudeZip': 'กำลังนำเข้า…', + 'newproj.privacyFooter': 'โดยค่าเริ่มต้น คุณเท่านั้นที่สามารถดูโปรเจกต์ของคุณได้', + 'newproj.designSystem': 'ระบบการออกแบบ', + 'newproj.dsNoneFreeform': 'ไม่มี — ฟรีฟอร์ม', + 'newproj.dsNoneSubtitleEmpty': 'เลือกพาเลตต์สีของคุณเอง', + 'newproj.dsNoneSubtitleSelected': 'ให้ระบบเลือกพาเลตต์สีให้', + 'newproj.dsCategoryFallback': 'ระบบการออกแบบ', + 'newproj.dsSearch': 'ค้นหา Design systems…', + 'newproj.dsModeAria': 'โหมดการเลือก', + 'newproj.dsModeSingle': 'เดี่ยว', + 'newproj.dsModeMulti': 'หลาย', + 'newproj.dsNoneTitle': 'ไม่มี — ฟรีฟอร์ม', + 'newproj.dsNoneSub': 'ให้ระบบเลือกพาเลตต์สีให้', + 'newproj.dsEmpty': 'ไม่พบ Design systems ที่ตรงกับ “{query}”', + 'newproj.dsFootSingular': 'เพื่อเป็นแรงบันดาลใจเท่านั้น', + 'newproj.dsFootPlural': 'เพื่อเป็นแรงบันดาลใจเท่านั้น', + 'newproj.dsFootClear': 'ล้าง', + 'newproj.dsBadgeDefault': 'ค่าเริ่มต้น', + 'newproj.dsPrimaryFallback': 'หลัก', + 'newproj.surfaceImage': 'รูปภาพ', + 'newproj.surfaceVideo': 'วิดีโอ', + 'newproj.surfaceAudio': 'เสียง', + 'newproj.modelLabel': 'โมเดล', + 'newproj.aspectLabel': 'อัตราส่วน', + 'newproj.imageStyleLabel': 'สไตล์', + 'newproj.imageStylePlaceholder': 'ภาพถ่ายแนวบทความ แสงธรรมชาติ', + 'newproj.videoLengthLabel': 'ความยาว', + 'newproj.videoLengthSeconds': '{n}วิ', + 'newproj.audioKindLabel': 'ประเภทเสียง', + 'newproj.audioKindMusic': 'เพลง', + 'newproj.audioKindSpeech': 'คำพูด', + 'newproj.audioKindSfx': 'เอฟเฟกต์', + 'newproj.audioDurationLabel': 'ระยะเวลา', + 'newproj.audioDurationSeconds': '{n}วิ', + 'newproj.voiceLabel': 'เสียงพูด', + 'newproj.voicePlaceholder': 'Voice ID', + 'newproj.connectorsLabel': 'ตัวเชื่อมต่อ', + 'newproj.connectorsHint': 'แหล่งข้อมูลที่ artifact นี้ดึงข้อมูลมาได้', + 'newproj.connectorsEmptyTitle': 'ยังไม่ได้ตั้งค่าตัวเชื่อมต่อ', + 'newproj.connectorsEmptyBody': 'เชื่อมต่อแหล่งข้อมูลเพื่อให้ได้ตัวเลขจริง', + 'newproj.connectorsEmptyCta': 'ตั้งค่าตัวเชื่อมต่อ →', + 'newproj.connectorsLoading': 'กำลังโหลดตัวเชื่อมต่อ…', + 'newproj.connectorsCountOne': 'เชื่อมต่อแล้ว {n} ตัว', + 'newproj.connectorsCountMany': 'เชื่อมต่อแล้ว {n} ตัว', + 'newproj.connectorsManage': 'จัดการ', + 'newproj.promptTemplateLabel': 'เทมเพลตอ้างอิง', + 'newproj.promptTemplateNoneTitle': 'เขียนคำสั่งเอง', + 'newproj.promptTemplateNoneSub': 'ไม่ต้องใช้ตัวอ้างอิง อธิบายในแบบของคุณ', + 'newproj.promptTemplateRefSub': 'เทมเพลตอ้างอิง', + 'newproj.promptTemplateSearch': 'ค้นหาเทมเพลต…', + 'newproj.promptTemplateEmpty': 'ยังไม่ได้ติดตั้งเทมเพลตสำหรับส่วนนี้', + 'newproj.promptTemplateBodyLabel': 'คำสั่ง (แก้ไขได้)', + 'newproj.promptTemplateOptimizeHint': 'การปรับแก้ของคุณจะส่งผลต่อเอเจนต์ด้วย', + 'newproj.promptTemplateBodyEmpty': 'เนื้อหาว่างเปล่า เอเจนต์จะไม่ได้ข้อมูลอ้างอิง', + + 'designs.subRecent': 'ล่าสุด', + 'designs.subYours': 'ดีไซน์ของคุณ', + 'designs.filterAria': 'ตัวกรอง', + 'designs.searchPlaceholder': 'ค้นหา…', + 'designs.emptyNoProjects': 'ยังไม่มีโปรเจกต์', + 'designs.emptyNoMatch': 'ไม่พบโปรเจกต์', + 'designs.deleteTitle': 'ลบโปรเจกต์', + 'designs.deleteConfirm': 'ลบ "{name}"?', + 'designs.cardFreeform': 'ฟรีฟอร์ม', + 'designs.badgeLive': 'Live', + 'designs.liveArtifactBadgesAria': 'ป้ายกำกับ', + 'designs.liveCount': '{n} สด', + 'designs.statusLive': 'Live artifact', + 'designs.statusArchived': 'เก็บถาวรแล้ว', + 'designs.statusError': 'ข้อผิดพลาด', + 'designs.statusRefreshing': 'กำลังรีเฟรช…', + 'designs.statusRefreshFailed': 'รีเฟรชไม่สำเร็จ', + 'designs.statusRefreshed': 'รีเฟรชแล้ว', + 'designs.status.notStarted': 'ยังไม่เริ่ม', + 'designs.status.queued': 'อยู่ในคิว', + 'designs.status.running': 'กำลังทำงาน', + 'designs.status.awaitingInput': 'ต้องการข้อมูลเพิ่ม', + 'designs.status.succeeded': 'สำเร็จ', + 'designs.status.failed': 'ล้มเหลว', + 'designs.status.canceled': 'ยกเลิกแล้ว', + 'designs.viewToggleAria': 'โหมดมุมมอง', + 'designs.viewGrid': 'ตาราง', + 'designs.viewKanban': 'บอร์ด', + 'designs.kanbanEmptyColumn': 'ไม่มีรายการ', + 'designs.deleteAria': 'ลบ {name}', + + 'examples.typeLabel': 'ประเภท', + 'examples.surfaceLabel': 'พื้นที่', + 'examples.surfaceWeb': 'เว็บไซต์', + 'examples.surfaceImage': 'รูปภาพ', + 'examples.surfaceVideo': 'วิดีโอ', + 'examples.surfaceAudio': 'เสียง', + 'examples.scenarioLabel': 'สถานการณ์', + 'examples.modeAll': 'ทั้งหมด', + 'examples.modePrototypeDesktop': 'ต้นแบบ · เดสก์ท็อป', + 'examples.modePrototypeMobile': 'ต้นแบบ · มือถือ', + 'examples.modeDeck': 'สไลด์นำเสนอ', + 'examples.modeDocument': 'เอกสารและเทมเพลต', + 'examples.modeOrbit': 'Orbit', + 'examples.modeLive': 'Live', + 'examples.scenarioGeneral': 'ทั่วไป', + 'examples.scenarioEngineering': 'วิศวกรรม', + 'examples.scenarioProduct': 'ผลิตภัณฑ์', + 'examples.scenarioDesign': 'การออกแบบ', + 'examples.scenarioMarketing': 'การตลาด', + 'examples.scenarioSales': 'ฝ่ายขาย', + 'examples.scenarioFinance': 'การเงิน', + 'examples.scenarioHr': 'ทรัพยากรบุคคล', + 'examples.scenarioOperations': 'ฝ่ายปฏิบัติการ', + 'examples.scenarioSupport': 'ฝ่ายสนับสนุน', + 'examples.scenarioLegal': 'กฎหมาย', + 'examples.scenarioEducation': 'การศึกษา', + 'examples.scenarioPersonal': 'ส่วนบุคคล', + 'examples.searchPlaceholder': 'ค้นหาตัวอย่าง…', + 'examples.searchAria': 'ค้นหา', + 'examples.emptyNoSkills': 'ไม่มีทักษะที่พร้อมใช้งาน', + 'examples.emptyNoMatch': 'ไม่มีตัวอย่างที่ตรงกัน', + 'examples.openPreview': '⤢ เปิดหน้าตัวอย่าง', + 'examples.loadingPreview': 'กำลังโหลด…', + 'examples.hoverPreview': 'เลื่อนเมาส์ไปที่นี่เพื่อดูตัวอย่าง', + 'examples.usePrompt': 'ใช้คำสั่งนี้', + 'examples.previewModalTitle': 'ดูตัวอย่าง', + 'examples.shareTitle': 'แชร์ตัวอย่างนี้', + 'examples.shareLoadFirst': 'โหลดหน้าตัวอย่างก่อน', + 'examples.shareMenu': 'แชร์ ▾', + 'examples.exportPdfAllSlides': 'ดาวน์โหลด PDF', + 'examples.exportPptxLocked': 'ดาวน์โหลด PPTX', + 'examples.tagSlideDeck': 'สไลด์นำเสนอ', + 'examples.tagTemplate': 'เทมเพลต', + 'examples.tagDesignSystem': 'ระบบการออกแบบ', + 'examples.tagMobilePrototype': 'ต้นแบบมือถือ', + 'examples.tagDesktopPrototype': 'ต้นแบบเดสก์ท็อป', + 'examples.tagImage': 'ภาพ', + 'examples.tagVideo': 'วิดีโอ', + 'examples.tagAudio': 'เสียง', + 'examples.previewLabel': 'ดูตัวอย่าง', + + 'ds.surfaceLabel': 'พื้นที่', + 'ds.surfaceWeb': 'เว็บไซต์', + 'ds.surfaceImage': 'รูปภาพ', + 'ds.surfaceVideo': 'วิดีโอ', + 'ds.surfaceAudio': 'เสียง', + 'ds.searchPlaceholder': 'ค้นหา design systems…', + 'ds.emptyNoMatch': 'ไม่พบ design systems', + 'ds.badgeDefault': 'ค่าเริ่มต้น', + 'ds.preview': 'ดูตัวอย่าง', + 'ds.previewTitle': 'ตัวอย่าง', + 'ds.categoryAll': 'ทั้งหมด', + 'ds.categoryUncategorized': 'ไม่มีหมวดหมู่', + 'ds.showcase': 'โชว์เคส', + 'ds.tokens': 'โทเค็น', + 'ds.specToggle': 'DESIGN.md', + 'ds.specLoading': 'กำลังโหลด…', + + 'avatar.title': 'บัญชีและการตั้งค่า', + 'avatar.localCli': 'Local CLI', + 'avatar.anthropicApi': 'Anthropic API', + 'avatar.useLocal': 'ใช้ Local CLI', + 'avatar.useApi': 'ใช้ API · BYOK', + 'avatar.codeAgent': 'เอเจนต์โค้ด', + 'avatar.rescan': 'สแกนหาใหม่', + 'avatar.settings': 'การตั้งค่า', + 'avatar.backToProjects': 'กลับไปยังโปรเจกต์', + 'avatar.metaActive': 'เปิดใช้งาน', + 'avatar.metaOffline': 'ออฟไลน์', + 'avatar.metaSelected': 'เลือกแล้ว', + 'avatar.noAgentSelected': 'ไม่ได้เลือกเอเจนต์', + 'avatar.modelSection': 'โมเดล', + 'avatar.modelLabel': 'โมเดล', + 'avatar.reasoningLabel': 'การใช้เหตุผล', + 'avatar.customSuffix': '(กำหนดเอง)', + + 'project.backToProjects': 'กลับไปยังโปรเจกต์', + 'project.metaFreeform': 'ฟรีฟอร์ม', + 'project.resizeChatPanel': 'ปรับขนาดแผงแชท', + 'chat.tabChat': 'แชท', + 'chat.tabComments': 'ความคิดเห็น', + 'chat.commentsSoon': 'ความคิดเห็น — เร็วๆ นี้', + 'chat.comments.attached': 'แนบในแชทแล้ว', + 'chat.comments.emptyAttached': 'ไม่มีความคิดเห็น', + 'chat.comments.saved': 'บันทึกความคิดเห็นแล้ว', + 'chat.comments.emptySaved': 'ไม่มีการบันทึกความคิดเห็น', + 'chat.comments.add': 'เพิ่ม', + 'chat.comments.addAll': 'เพิ่มทั้งหมด', + 'chat.comments.remove': 'ลบ', + 'chat.comments.placeholder': 'แสดงความคิดเห็นเกี่ยวกับส่วนนี้…', + 'chat.comments.addSend': 'เพิ่ม & ส่ง', + 'chat.comments.updateSend': 'อัปเดต & ส่ง', + 'chat.comments.removeAttachment': 'ลบไฟล์แนบ', + 'chat.comments.removeAttachmentAria': 'ลบไฟล์แนบความคิดเห็นสำหรับ {name}', + 'chat.conversationsTitle': 'การสนทนา', + 'chat.conversationsAria': 'ประวัติ', + 'chat.newConversation': 'สนทนาใหม่', + 'chat.newConversationsTitle': 'เริ่มใหม่', + 'chat.conversationsHeading': 'บทสนทนาทั้งหมด', + 'chat.new': 'ใหม่', + 'chat.emptyConversations': 'ยังไม่มีบทสนทนา', + 'chat.deleteConversation': 'ลบบทสนทนา', + 'chat.deleteConversationConfirm': 'ลบ "{title}" หรือไม่?', + 'chat.untitledConversation': 'บทสนทนาที่ไม่มีชื่อ', + 'chat.startTitle': 'เริ่มแชทได้เลย', + 'chat.startHint': 'ลากหรือวางรูปภาพที่นี่ หรือพิมพ์ @ เพื่อดึงไฟล์โปรเจกต์', + 'chat.fillInputTitle': 'คลิกเพื่อใส่ข้อความ', + 'chat.jumpToLatest': 'เลื่อนไปล่าสุด', + 'chat.scrollToLatest': 'เลื่อนลงล่าง', + 'chat.you': 'คุณ', + 'chat.openFile': 'เปิด {name}', + 'chat.composerPlaceholder': 'บรรยายรายละเอียด... ลากรูปมาวางได้ หรือใช้ @ อ้างอิงไฟล์', + 'chat.composerHint': '⌘/Ctrl + Enter เพื่อส่ง · วางภาพ · @ เพื่ออ้างอิง', + 'chat.cliSettingsTitle': 'ตั้งค่าโมเดลและ CLI', + 'chat.cliSettingsAria': 'ตั้งค่า', + 'chat.attachTitle': 'แนบไฟล์ (วาง / ลาก)', + 'chat.attachAria': 'แนบไฟล์', + 'chat.importTitle': 'นำเข้าจากที่อื่น (เร็วๆ นี้)', + 'chat.importLabel': 'นำเข้า', + 'chat.importComingSoon': 'เร็วๆ นี้', + 'chat.importSoon': 'เร็วๆ นี้', + 'chat.importFig': 'อัปโหลดไฟล์ Figma', + 'chat.importGitHub': 'ต่อ GitHub', + 'chat.importWeb': 'ดึงหน้าเว็บ', + 'chat.importFolder': 'ลิ้งก์โค้ดโฟลเดอร์', + 'chat.importSkills': 'ทักษะและระบบการออกแบบ', + 'chat.importProject': 'อ้างอิงโปรเจกต์อื่น', + 'chat.linkedFolderRemoveAria': 'ลบโฟลเดอร์ที่ลิงก์ {path}', + 'chat.linkedFolderNotFound': 'หาโฟลเดอร์ไม่เจอ', + 'chat.linkedFolderAlready': 'ลิงก์ไว้แล้ว', + 'chat.linkedFolderPickError': 'เปิดโฟลเดอร์ไม่ได้', + 'chat.send': 'ส่ง', + 'chat.stop': 'หยุด', + 'chat.removeAria': 'ลบ {name}', + 'chat.example1Title': 'ตัวอย่างคำสั่งบรรณาธิการ', + 'chat.example1Tag': 'นิตยสาร', + 'chat.example1Prompt': 'สไลด์บทความบรรณาธิการ 10 หน้า จัดวางแบบคลาสสิค สไตล์นิตยสารและเพิ่มตัวหนังสือใหญ่ๆ', + 'chat.example2Title': 'ตัวอย่างแดชบอร์ด Analytics', + 'chat.example2Tag': 'ข้อมูล', + 'chat.example2Prompt': 'แดชบอร์ดการวิเคราะห์เครื่องมือ SaaS — แถบแสดง KPI และตารางวิเคราะห์สถิติ', + 'chat.example3Title': 'ตัวอย่างรายงานหน้ายาว', + 'chat.example3Tag': 'บรรณาธิการ', + 'chat.example3Prompt': 'หน้าจอรายงานผลกิจกรรมประจำปีแบบแสดงข้อความและกราฟ เลื่อนดูได้ยาวๆ', + + 'preview.shareMenu': 'แชร์ ▾', + 'preview.openInNewTab': 'เปิดในแท็บใหม่', + 'preview.exit': '⤓ ออก', + 'preview.fullscreen': '⤢ เต็มหน้าจอ', + 'preview.closeTitle': 'ปิด (Esc)', + 'preview.loading': 'กำลังโหลด {label}…', + 'preview.errorTitle': 'โหลดผิดพลาด', + 'preview.errorBody': 'โหลด HTML ไม่สำเร็จ โปรดลองอีกครั้ง', + 'preview.retry': 'ลองอีกครั้ง', + 'preview.showSidebar': 'แสดง {label}', + 'preview.hideSidebar': 'ซ่อน {label}', + + 'misc.savedTemplate': 'เทมเพลตที่เก็บไว้', + 'misc.primary': 'หลัก', + 'misc.designSystem': 'ระบบการออกแบบ', + + 'workspace.designFiles': 'ไฟล์งานดีไซน์', + 'workspace.focusMode': 'โหมดโฟกัส', + 'workspace.showChat': 'เปิดแชท', + 'workspace.closeTab': 'ปิดแท็บ', + 'workspace.deleteFileConfirm': 'ลบ "{name}" ทิ้งไปเลยหรือไม่?', + 'workspace.deleteSelectedFilesConfirm': 'ลบไฟล์ {n} รายการที่เลือกออกจากโปรเจกต์?', + 'workspace.deleteSelectedFilesPartial': 'ลบ {n} รายการไม่ผ่าน', + 'workspace.openFromDesignFiles': 'เปิดไฟล์จาก', + 'workspace.designFilesLink': 'หน้าไฟล์งาน', + 'workspace.loadingSketch': 'กำลังโหลดกระดานวาด…', + 'designFiles.title': 'ไฟล์ดีไซน์', + 'designFiles.upload': 'อัปโหลดไฟล์', + 'designFiles.pasteText': 'วางข้อความมาเป็นไฟล์', + 'designFiles.newSketch': 'กระดานวาดใหม่', + 'designFiles.empty': 'ลากไฟล์มาใส่เลย หรือสร้างภาพสเก็ตช์', + 'designFiles.refresh': 'รีเฟรช', + 'designFiles.delete': 'ลบ', + 'designFiles.searchPlaceholder': 'ค้นหาไฟล์…', + 'designFiles.up': 'กลับขึ้นบน', + 'designFiles.back': 'ย้อนกลับ', + 'designFiles.crumbs': 'โปรเจกต์', + 'designFiles.rowMenu': 'เมนูจัดการ', + 'designFiles.openInTab': 'เปิดในแท็บ', + 'designFiles.download': 'ดาวน์โหลด', + 'designFiles.downloadSelected': 'โหลด {n} ลงเป็น ZIP', + 'designFiles.deleteSelected': 'ลบ {n}', + 'designFiles.clearSelection': 'ล้างการเลือก', + 'designFiles.selectPage': 'เลือกทั้งหมดหน้านี้', + 'designFiles.selectAll': 'เลือกทุกอย่าง', + 'designFiles.dropTitle': '⤓ วางไฟล์ที่นี่', + 'designFiles.dropDesc': 'รูป เอกสาร อ้างอิง — เอเจนต์จะเก็บมาใช้วิเคราะห์', + 'designFiles.upload.title': 'อัปโหลดไฟล์', + 'designFiles.paste.title': 'วางข้อความแทนไฟล์', + 'designFiles.upload.label': 'อัปโหลด', + 'designFiles.paste.label': 'วาง', + 'designFiles.previewOpen': 'เปิดดู', + 'designFiles.previewClose': 'ปิดหน้าต่าง', + 'designFiles.modified': 'แก้ไปตอน {time} · {size}', + 'designFiles.weeksAgo': '{n} สัปดาห์มาแล้ว', + 'designFiles.sectionPages': 'หน้าเว็บ', + 'designFiles.sectionScripts': 'สคริปต์', + 'designFiles.sectionImages': 'รูปภาพ', + 'designFiles.sectionSketches': 'แบบร่าง', + 'designFiles.sectionLiveArtifacts': 'Live artifacts', + 'designFiles.sectionOther': 'อื่นๆ', + 'designFiles.showMore': 'เปิดดูอีก +{n}', + 'designFiles.kindHtml': 'ไฟล์ HTML', + 'designFiles.kindImage': 'รูปภาพ', + 'designFiles.kindSketch': 'ภาพวาดร่าง', + 'designFiles.kindText': 'ข้อความ', + 'designFiles.kindCode': 'สคริปต์โค้ด', + 'designFiles.kindPdf': 'เอกสาร PDF', + 'designFiles.kindDocument': 'ไฟล์เอกสาร', + 'designFiles.kindPresentation': 'สไลด์', + 'designFiles.kindSpreadsheet': 'ตารางตัวเลข', + 'designFiles.kindLiveArtifact': 'ตัวแอป Live artifact', + 'designFiles.kindBinary': 'ไฟล์ไบนารี', + 'designFiles.colName': 'ชื่อ', + 'designFiles.colKind': 'ชนิด', + 'designFiles.colModified': 'ใช้งานล่าสุด', + 'designFiles.perPage': 'จำนวนแสดง', + 'designFiles.all': 'ทั้งหมด', + 'designFiles.prev': 'ก่อนหน้า', + 'designFiles.next': 'ถัดไป', + 'designFiles.jumpToPage': 'ไปหน้าที่', + 'designFiles.pageInfo': '{start}–{end} รวม {total}', + 'quickSwitcher.placeholder': 'ค้นหาและเปิด…', + 'quickSwitcher.empty': 'ไร้ไฟล์ที่หาได้', + 'quickSwitcher.noMatches': 'ไม่เจอรายการที่ตรง', + 'quickSwitcher.navigate': 'ใช้ลูกศรหา', + 'quickSwitcher.open': 'เปิดได้เลย', + 'quickSwitcher.close': 'ปิดออก', + 'pasteDialog.title': 'วางข้อความตรงนี้', + 'pasteDialog.hint': 'จะถูกบันทึกที่กล่องโปรเจกต์', + 'pasteDialog.fileNameLabel': 'ชื่อ', + 'pasteDialog.namePlaceholder': 'เช่น notes.txt', + 'pasteDialog.contentLabel': 'ใจความหลัก', + 'pasteDialog.contentPlaceholder': 'วางอะไรก็ได้ทั้งนั้น…', + 'pasteDialog.save': 'จัดเก็บ', + 'pasteDialog.cancel': 'ยกเลิก', + 'sketch.save': 'บันทึกรูป', + 'sketch.cancel': 'ยกเลิก', + 'sketch.saving': 'กำลังบันทึกรูปภาพ…', + 'sketch.tooltipDirty': 'มีการเปลี่ยนผ่าน', + 'sketch.tooltipClean': 'บันทึกสมบูรณ์', + 'fileViewer.empty': 'คลิกที่ไฟล์เพื่อแสดงดู', + 'fileViewer.loading': 'กำลังเรียกโหลด…', + 'fileViewer.exportPptx': 'ส่งข้อมูลเป็น PPTX', + 'fileViewer.openInNewTab': 'เข้าจากหน้าต่างใหม่', + 'fileViewer.copyPath': 'ก็อปปี้ลิ้งก์', + 'fileViewer.copied': 'ทำการคัดลอก!', + 'fileViewer.share': 'แชร์ต่อ', + 'fileViewer.binaryMeta': 'ข้อมูล Binary · {size}', + 'fileViewer.binaryNote': 'เก็บไว้ในรูปแบบคอมพิวเตอร์ ({size} bytes). ให้คุณกดดาวน์โหลดโหลดดู', + 'fileViewer.pdfMeta': 'PDF ตัวย่อ · {size}', + 'fileViewer.documentMeta': 'ไฟล์เอกสาร', + 'fileViewer.presentationMeta': 'พรีเซนเทชั่น', + 'fileViewer.spreadsheetMeta': 'สเปรดชีตแสดงตาราง', + 'fileViewer.previewUnavailable': 'พรีวิวใช้ไม่ได้ ขอให้เปิดไฟล์จากภายนอกดู', + 'fileViewer.download': 'กดโหลด', + 'fileViewer.open': 'เรียกใช้', + 'fileViewer.imageMeta': 'รูปภาพขนาด · {size}', + 'fileViewer.reactMeta': 'โค้ด React · {size}', + 'fileViewer.sketchMeta': 'สเก็ตช์ · {size}', + 'fileViewer.markdownStreamingMeta': 'เตรียมหน้าพรีวิว…', + 'fileViewer.markdownErrorMeta': 'เกิดการเออเร่อในการจำลอง (อาจมีข้อมูลตกหล่น)', + 'fileViewer.markdownStreamingStatus': 'รอจำลอง… แสดง Markdown มาบ้างแล้ว', + 'fileViewer.markdownErrorStatus': 'พังในขั้นจำลอง แสดงชิ้นส่วนเดิมล่าสุด', + 'fileViewer.videoMeta': 'วิดีโอมาแล้ว · {size}', + 'fileViewer.audioMeta': 'คลิปเสียง · {size}', + 'fileViewer.reload': 'โหลดทับ', + 'fileViewer.reloadDisk': 'ดึงโหลดจากแหล่งล่าสุด', + 'fileViewer.copy': 'ก็อปปี้', + 'fileViewer.copyTitle': 'คัดลอกแบบจัดเต็ม', + 'fileViewer.saveDisabled': 'ปุ่มเซฟ (ตอนนี้อ่านได้เท่านั้น)', + 'fileViewer.save': 'เซฟด่วน', + 'fileViewer.preview': 'หน้าพรีวิว', + 'fileViewer.source': 'ซอร์สไฟล์', + 'fileViewer.tweaks': 'ตั้งปรับแต่ง', + 'fileViewer.comment': 'ช่วยคอมเมนต์', + 'fileViewer.edit': 'จัดการแก้ไข', + 'fileViewer.draw': 'วาดรูป', + 'manualEdit.layers': "เลเยอร์", + 'manualEdit.editableCount': "ใช้แก้ได้ {count} รูปแบบ", + 'manualEdit.title': "กล่องควบคุม", + 'manualEdit.selectLayer': "เลือกเลเยอร์ขึ้นมา", + 'manualEdit.empty': "เลือกกล่องด้านบนเพื่อเปิดดู", + 'manualEdit.noClass': "ไร้คลาสสไตล์", + 'manualEdit.tabsAria': "แท็บปรับโครง", + 'manualEdit.tabContent': "ตัวหนังสือ", + 'manualEdit.tabStyle': "สไตล์การตกแต่ง", + 'manualEdit.tabAttributes': "พิกัดส่วนเสริม", + 'manualEdit.tabHtml': "โค้ด HTML", + 'manualEdit.tabSource': "ต้นกำเนิดโค้ด", + 'manualEdit.attributesJson': "พิกัด JSON", + 'manualEdit.selectedHtml': "โค้ดในตัวที่เลือก", + 'manualEdit.fullSource': "เนื้อแท้ข้อมูลระบบ", + 'manualEdit.applyContent': "รับเนื้อหาเข้า", + 'manualEdit.applyStyle': "ใช้โครงตกแต่ง", + 'manualEdit.applyAttributes': "รับพิกัดเข้า", + 'manualEdit.applyHtml': "ตั้งต้น HTML", + 'manualEdit.applySource': "รับโค้ดรันระบบ", + 'manualEdit.invalidAttributes': "JSON แอททริบิวต์ใช้งานจริงไม่ได้", + 'manualEdit.changes': "จุดถูกแก้แล้ว", + 'manualEdit.undo': "กลับไปเก่า", + 'manualEdit.redo': "เลื่อนมาใหม่", + 'manualEdit.noChanges': "การใช้มือแก้ยังไม่มี", + 'manualEdit.imageUrl': "จุดฝังภาพ (URL)", + 'manualEdit.altText': "ตัวหนังสือข้อความลับ", + 'manualEdit.label': "ตัวหนังสือข้างหน้า", + 'manualEdit.text': "ข้อความ", + 'manualEdit.href': "ตัวลิ้งก์ข้ามทาง (Href)", + 'manualEdit.textColor': "ชุดสีตัวหนังสือ", + 'manualEdit.background': "สีแผ่นพื้นหลัง", + 'manualEdit.fontSize': "ความใหญ่ตัวหนังสือ", + 'manualEdit.weight': "น้ำหนักความเข้ม", + 'manualEdit.align': "ชิดกะตำแหน่ง", + 'manualEdit.padding': "ขยายเขตภายใน", + 'manualEdit.margin': "ขยายเขตภายนอก", + 'manualEdit.radius': "ขอบมน", + 'manualEdit.border': "ความหนาเส้น", + 'manualEdit.width': "ขนาดความกว้าง", + 'manualEdit.minHeight': "ส่วนเตี้ยที่สุด", + 'fileViewer.zoomOut': 'หุบมุมมอง', + 'fileViewer.zoomIn': 'ซูมมองชัด', + 'fileViewer.resetZoom': 'ซูมรีเซ็ตหน้าจอ', + 'fileViewer.reloadAria': 'กดรีโหลดให้สด', + 'fileViewer.previousSlide': 'เลื่อนสไลด์ก่อนหน้า', + 'fileViewer.nextSlide': 'สไลด์แผ่นหน้า', + 'fileViewer.slideNavAria': 'ตัวเลื่อนเปลี่ยนหน้า', + 'fileViewer.present': 'เปิดจอโชว์', + 'fileViewer.presentInTab': 'ค้างในหน้าจอแท็บ', + 'fileViewer.presentFullscreen': 'ยืดให้เต็มที่หน้าจอ', + 'fileViewer.presentNewTab': 'เข้าสู่ลิ้งก์หน้าใหม่', + 'fileViewer.exitPresentation': 'หนีออกโหมดคนโชว์', + 'fileViewer.shareLabel': 'แชร์', + 'fileViewer.exportPdf': 'เปลี่ยนฟอร์แมตเอาไปเป็น PDF', + 'fileViewer.exportPdfAllSlides': 'ดาวน์โหลดทั้งหน้าเป็น PDF', + 'fileViewer.exportPptxBusy': 'ต้องให้ทำระบบของปัจจุบันจนสำเร็จก่อน', + 'fileViewer.exportPptxHint': 'ส่งข้อมูลเพื่อให้ทำการแปลเอกสารเป็น PPTX', + 'fileViewer.exportPptxNa': 'งาน PPTX ไม่สามารถดึงออกในจุดนี้ได้', + 'fileViewer.exportZip': 'สูบทั้งหมดมาในรูป .zip', + 'fileViewer.exportHtml': 'เอาไปแค่รูปไฟล์ HTML', + 'fileViewer.exportMd': 'แปลงข้อความแบบฉบับเป็น Markdown', + 'fileViewer.exportJsx': 'นำโค้ดในรูปแบบ React JSX ออก', + 'fileViewer.exportReactHtml': 'แยกโหลดมาแค่โครง HTML เท่านั้น', + 'fileViewer.saveAsTemplate': 'จัดเก็บในหมวดเทมเพลต…', + 'fileViewer.savingTemplate': 'ระบบคอยเซฟแม่แบบให้…', + 'fileViewer.savedTemplate': 'ได้สร้างเทมเพลตใหม่ชื่อ "{name}"', + 'fileViewer.savedTemplateFail': 'ติดปัญหาที่การจำข้อมูลเทมเพลต — ทบทวนให้ดีแล้วกดอีกหน', + 'fileViewer.templateNamePrompt': 'ระบุชื่อตัวเทมเพลต', + 'fileViewer.templateNameDefault': 'แม่แบบว่างไม่มีการระบุชื่อ', + 'fileViewer.templateDescPrompt': 'อธิบายลักษณะเพิ่มเติม (ไม่จำเป็นต้องใส่เลยก็ได้ — แต่มีก็ดีต่อความเข้าใจในครั้งหน้า)', + 'liveArtifact.refresh.button': 'ดึงค่าเริ่มระบบอีกหน', + 'liveArtifact.refresh.buttonTitle': 'รีค่าการทำตัว Live artifact ใหม่', + 'liveArtifact.refresh.loadingTitle': 'ขอเวลาเพื่อดึงของ Live artifact…', + 'liveArtifact.refresh.noSourceTitle': 'ของดั้งเดิมยังไม่เคยมีให้ทำการอัปเดตต่อ', + 'liveArtifact.refresh.running': 'ระบบรันหาค่าอีกคราว…', + 'liveArtifact.refresh.runningMessage': 'เรียกโครงและหน้าตัวโชว์อยู่ โปรดเผื่อเวลา', + 'liveArtifact.refresh.runningAction': 'สิ่งพรีวิวที่มีจากของเก่าอยู่จะได้เห็นเรื่อยไป จนของครั้งหน้าสำเร็จถึงโชว์', + 'liveArtifact.refresh.successOne': 'ผ่านตลอด ได้ผลของล่าสุดแทนแล้ว', + 'liveArtifact.refresh.successMany': 'ผ่านตลอด ได้ผลของล่าสุดแทนแล้ว', + 'liveArtifact.refresh.successAction': 'เปลี่ยนระบบของเดิมเสร็จ ภาพโชว์ใหม่เอาไปใช้งานต่อแล้ว', + 'liveArtifact.refresh.previousFailure': 'ของคราวก่อนหลุดความสำเร็จไป: {message}', + 'liveArtifact.refresh.failureAction': 'ตรวจสอบปัญหาและช่องทางข้อมูลของตัวเดิมก่อน เพื่อกดเปิดใช้งานอีกที', + 'liveArtifact.refresh.networkFailure': 'รีเฟรชเครือข่ายส่งไม่ติด อาจจะมีเรื่องสัญญานตก', + 'liveArtifact.refresh.genericFailure': 'ระบบรีไม่สมบูรณ์', + 'liveArtifact.refresh.statusNever': 'ไร้สิ่งที่สามารถดึงค่าได้', + 'liveArtifact.refresh.statusReady': 'เตรียมเริ่มลุยรอบดึงใหม่', + 'liveArtifact.refresh.statusSucceeded': 'ได้ที่ของสดใหม่', + 'liveArtifact.refresh.statusFailed': 'เสียสูญกับการรอรีข้อมูล', + 'liveArtifact.viewer.tabPreview': 'พรีวิวภาพ', + 'liveArtifact.viewer.tabCode': 'คำสั่งโค้ด', + 'liveArtifact.viewer.tabData': 'ผลข้อมูล', + 'liveArtifact.viewer.tabRefreshHistory': 'ข้อมูลตอนสั่งเรียกครั้งเก่า', + 'liveArtifact.viewer.dataEmpty': 'Data.json ในตัวของยังไม่โผล่', + 'liveArtifact.viewer.code.templateHeading': 'โครงอักษร HTML เทมเพลต', + 'liveArtifact.viewer.code.renderedHeading': 'สิ่งที่สร้างเรนเดอร์มาที่แท้จริงแบบ HTML', + 'liveArtifact.viewer.code.templateHelp': 'แม่พิมพ์ถูกเตรียมการรวมด้วยค่าตัวของ data.json ไว้พร้อมโชว์พรีวิวแล้ว', + 'liveArtifact.viewer.code.renderedHelp': 'หน้าตาดั้งเดิมของที่สร้างได้ไว้เข้าใช้จริงแบบฉบับ index.html', + 'liveArtifact.viewer.code.variantAria': 'หมวดรวมส่วนแบบร่าง', + 'liveArtifact.viewer.code.variantTemplate': 'กลุ่มเทมเพลต', + 'liveArtifact.viewer.code.variantRendered': 'เรนเดอร์แล้ว', + 'liveArtifact.viewer.code.loading': 'ตามโค้ดเข้ามา…', + 'liveArtifact.viewer.code.unavailable': 'โค้ดที่หาอาจจะไร้ซึ่งข้อมูล', + 'liveArtifact.viewer.code.empty': 'ไม่มีสิ่งใดเขียนตกค้างไว้เลยในนี้', + 'fileViewer.deployToVercel': 'ขึ้นสู่ระดับ Deploy เพื่อ Vercel', + 'fileViewer.redeployToVercel': 'Deploy ทับอันเดิม', + 'fileViewer.deployingToVercel': 'ขอ Deploy เข้าสู่ผู้ดูแล Vercel…', + 'fileViewer.deployProviderLabel': 'ส่วนพื้นที่ผู้จัดการ', + 'fileViewer.vercelProvider': 'ทีม Vercel', + 'fileViewer.cloudflarePagesProvider': 'โฮส Cloudflare Pages', + 'fileViewer.deployToProvider': 'จัดนำโฮสติ้งไปเพื่อ {provider}', + 'fileViewer.redeployToProvider': 'ใช้ทับการ Deploy กับทาง {provider}', + 'fileViewer.deployingToProvider': 'กำลังย้ายข้อมูลเข้าไปสู่ {provider}…', + 'fileViewer.preparingPublicLink': 'จัดทำลิ้งก์ให้พบเห็นทางด้านนอก…', + 'fileViewer.copyDeployLink': 'ลอกลิ้งก์เซฟใช้', + 'fileViewer.deployModalTitle': 'สั่งขึ้นโฮสต์เพื่อ Deploy', + 'fileViewer.deployModalSubtitle': 'เลือกจัดการผสานเชื่อมการทำงานในรูป HTML นี้ให้ออกไปได้เลย', + 'fileViewer.vercelToken': 'ระบบเหรียญของ Vercel Token', + 'fileViewer.vercelTokenGetLink': 'ขอเอา Vercel Token นำมาใช้', + 'fileViewer.vercelTokenPlaceholder': 'วางลงรหัส Vercel Token', + 'fileViewer.vercelTokenReuseHint': 'จะนำข้อมูลเดิมที่ถูกจัดเก็บมาใช้ต่อเลย หากต้องการตัวอื่นก็เอามาพิมพ์ตรงนี้', + 'fileViewer.vercelTokenRequired': 'วางรหัสตัว Vercel ก่อน ถึงจะเริ่มได้', + 'fileViewer.cloudflareApiToken': 'ใช้โทเคนจากฝั่ง Cloudflare', + 'fileViewer.cloudflareApiTokenGetLink': 'เข้ากดรับหาจาก Cloudflare API', + 'fileViewer.cloudflareApiTokenPlaceholder': 'นำ Cloudflare ตัวใหม่แปะตรงช่อง', + 'fileViewer.cloudflareApiTokenReuseHint': 'โทเค็นตัวที่ผูกไว้จะได้การใช้งานก่อนเป็นอย่างดี ต้องการตัวใหม่ก็นำทับได้เลย', + 'fileViewer.cloudflareApiTokenRequired': 'เซฟ Cloudflare เพื่อเข้าใช้งานให้ถูกต้อง', + 'fileViewer.cloudflareApiTokenScopeHint': 'ควรมีสิทธิแบบ Pages Edit ถึงจะขึ้นของโฮสต์ให้ใช้งาน การเรียกตัวหลักและปรับโดเมนตามส่วน Zone และ DNS Edit จะมีส่วนร่วมเพื่อใช้งานต่อไปได้', + 'fileViewer.vercelTeamId': 'กรอกรหัสสำหรับระดับทีม ID', + 'fileViewer.vercelTeamSlug': 'นามพ่วงทีมแบบย่อ', + 'fileViewer.cloudflareAccountId': 'หมวดระดับรหัสบัญชีหลัก', + 'fileViewer.cloudflareAccountIdHint': 'ควรจะนำค่าตั้งไว้เสมอ เพื่อจะเช็คการรันโฮสต์ทั้งหมด ดูตัวอย่างได้จากหน้าระบบจัดการของบัญชีของ Cloudflare เอง', + 'fileViewer.cloudflareAccountIdRequired': 'โปรดป้อนเก็บไว้ Cloudflare หลัก Account ID ในเครื่องก่อนเริ่ม', + 'fileViewer.cloudflareZoneLabel': 'ตัวเชื่อมแบบโดเมน', + 'fileViewer.cloudflareZonePlaceholder': 'นำเครื่องมือตั้งต่าในหน้าหลักเพื่อเปิดลิงก์ทั้งหมดมาใช้', + 'fileViewer.cloudflareZoneRequired': 'เอาตัว Cloudflare โดเมน มากรอกให้เสร็จ', + 'fileViewer.cloudflareZonesLoading': 'เครื่องมือกำลังเช็ค Cloudflare โดเมน ทั้งระบบ…', + 'fileViewer.cloudflareZonesRefresh': 'รีข้อมูลเรียกตัวโดเมน', + 'fileViewer.cloudflareZonesLoadFailed': 'การเซฟตัวของโดเมนเข้าใน Cloudflare ประสบข้อไม่พบของที่จะโหลดได้', + 'fileViewer.cloudflareZonesEmpty': 'บัญชีนี้ยังขาดการเข้าเซฟข้อมูลจากโดเมนระดับแบบสมบูรณ์มาใช้ด้วยกัน', + 'fileViewer.cloudflareDomainPrefixLabel': 'กลุ่มของคำนำหน้าใน Subdomain Prefix', + 'fileViewer.cloudflareDomainPrefixPlaceholder': 'เดโม่ (demo)', + 'fileViewer.cloudflareDomainPrefixInvalid': 'คำโดเมนรองนี้ให้ใช้อักษรพิเศษอย่างยัติภังค์ (ขีด) กับตัวเลขและพิมพ์เล็กได้ ไม่ให้ใช้อย่างอื่นที่ผิดแปลกไปเลย', + 'fileViewer.cloudflareHostnamePreview': 'ความพร้อมตัวโฮสต์รอง: {hostname}', + 'fileViewer.cloudflareCustomDomainHint': 'เป็นตัวเลือกเสริม: หาโดเมนและการเข้าหน้าหลักของค่ายที่กำหนดเอง จะยังมีโฮสต์ระบบฟรี pages.dev ไว้ให้', + 'fileViewer.cloudflarePagesDevLinkLabel': 'ลิ้งก์จากช่องทางฟรี pages.dev URL', + 'fileViewer.cloudflareCustomDomainLinkLabel': 'ตัวลิ้งก์ Custom แบบมีโดเมนเสริม', + 'fileViewer.optional': 'ตัวเลือกเสริม', + 'fileViewer.vercelPreviewOnly': 'ปัจจุบันการโชว์ Deploy มีเปิดให้แต่พรีวิวการใช้งานเท่านั้น', + 'fileViewer.cloudflarePagesPreviewHint': 'สามารถส่งข้อมูลโฮสต์ผ่านแบบ Direct Upload ตรงเข้าสู่ของ Cloudflare ไปเลย', + 'fileViewer.savingConfig': 'คอยจัดระเบียบให้…', + 'fileViewer.deployConfigSaveFailed': 'จำคำสั่งเชื่อมระบบฝั่ง Vercel เข้ามาไม่ได้', + 'fileViewer.deployFailed': 'เกิดความล้มเหลวกับการเรียกตัว Deployment ขอไปปรับเครื่องมือ Vercel ใหม่แล้วลองซ้ำนะ', + 'fileViewer.deployProviderConfigSaveFailed': 'ปรับเปลี่ยนและนำตั้งค่าเซฟไม่ได้บนฝั่งผู้บริการ {provider}', + 'fileViewer.deployProviderFailed': 'โฮสต์ไม่ติดสำหรับตัวผู้ดำเนินการ {provider} เช็คการควบคุมดูอีกรอบก่อนเถอะ', + 'fileViewer.deployResultLabel': 'ที่อยู่แบบ URL ซึ่งอัพลง', + 'fileViewer.deployLinkReady': 'ลุยได้ทันที', + 'fileViewer.deployLinkPreparingLabel': 'เตรียมออกสู่หน้าผู้คนข้างนอก', + 'fileViewer.deployLinkDelayed': 'ตัวเว็บนั้นเข้าใช้งานได้แต่ความพร้อมยังถูกแช่ไว้บ้างอยู่', + 'fileViewer.deployLinkFailed': 'โดเมนส่วนตัวที่พยายามมีอยู่ดันไม่เชื่อมกัน', + 'fileViewer.deployLinkProtectedLabel': 'ใส่ตัวยืนยันและปกป้องให้กับการข้ามระบบไว้', + 'fileViewer.deployLinkProtected': 'ถึงจะเอาเว็บเข้าไปไว้ให้แล้วแต่การให้ดูตัวอย่างยังเข้ายาก ปลดรหัสความปลอดภัยเข้าออกที หรือสลับเป็นแบบ Custom', + 'fileViewer.retryLink': 'เข้ากดรีโหลดซ้ำหน่อย', + + 'questionForm.submit': 'ส่งผ่าน', + 'questionForm.skip': 'ข้ามตัวนี้', + 'questionForm.locked': 'สำเร็จตอบไปแล้ว', + + 'conv.switch': 'กดรับเข้าเลือกหน้าสนทนา', + 'conv.label': 'เรื่องของการสนทนา', + 'conv.heading': 'ข้อการพูดคุยที่เคยมี', + 'conv.new': '+ เพิ่มบทแชทใหม่', + 'conv.empty': 'ไม่มีประวัติเลยแม้แต่น้อย', + 'conv.untitled': 'ที่ค้างเก่าแบบลืมเขียนชื่อกำกับ', + 'conv.renameTooltip': 'คลิกซ้ำซ้อนสองทีถ้าคิดจะเปลี่ยนหน้า', + 'conv.delete': 'ยุติสิ่งของหัวข้อทิ้งเสีย', + 'conv.deleteConfirm': 'ต้องการลบ "{title}" ? เมื่อเอาออกจะทำให้สิ่งของของเนื้อความจบทันที', + + 'agentPicker.label': 'ตัวเลือกให้เอเจนต์ทำงาน', + 'agentPicker.modeChoose': 'กรุณาตั้งสถาณะว่าจะให้ใช้การสั่งงานทางรูปแบบไหน', + 'agentPicker.localCli': 'ตั้งแบบ Local CLI ในตัวของ', + 'agentPicker.daemonOff': 'ดับเครื่องมือ Daemon ไป', + 'agentPicker.byok': 'ส่วนของ API · BYOK ตัวรองรับ', + 'agentPicker.selectAgent': 'ระบุว่า CLI code-agent ในอันไหนที่เราพบเห็นให้ใช้ไปได้บ้าง', + 'agentPicker.noAgents': 'ไม่มีในความช่วยเหลือบนส่วนเส้นทาง (PATH)', + 'agentPicker.notInstalled': 'ไม่อยู่บนระบบที่ติดตั้งไว้', + 'agentPicker.rescan': 'ขอสแกนตัวของเส้นทางในเครื่องซ้ำเพื่อตามหาเอเจนต์', + + 'tool.openInTab': 'จับเรียก {name} ไว้ให้เข้าหน้าใหม่ของแท็บ', + 'tool.open': 'เข้าไป', + 'tool.todos': 'สิ่งที่วางแผนต้องทำ', + 'tool.write': 'ใส่เขียนลงไป', + 'tool.edit': 'จัดการปรับปรุง', + 'tool.read': 'มองเห็นภาพ', + 'tool.bash': 'สั่ง Bash ทำ', + 'tool.glob': 'หาสิ่ง Glob เอา', + 'tool.grep': 'หาการค้น Grep ลงไป', + 'tool.fetch': 'ดึงรับส่ง Fetch', + 'tool.search': 'สืบเสาะ', + 'tool.lines': '{n} เป็นจำนวนบรรัด', + 'tool.changeSingular': 'ปรับจุดหนึ่งแล้ว', + 'tool.changePlural': 'เปลี่ยนแก้ไขมาเยอะเลย', + 'tool.in': 'ผ่านทางที่อยู่ของ {path}', + 'tool.hide': 'ถูกแอบแฝง', + 'tool.output': 'ข้อสั่งสรุปหน้าจอ', + 'tool.running': 'เริ่มทำงานต่อ…', + 'tool.error': 'สะดุดขัดข้อง', + 'tool.done': 'จบบริบูรณ์', + + 'assistant.role': 'หน่วยผู้ช่วยเหลือส่วนตัว', + 'assistant.workingLabel': 'ดำเนินระบบรับทำงานอยู่', + 'assistant.doneLabel': 'บรรลุสู่ระดับพร้อมแล้ว', + 'assistant.unfinishedLabel': 'พ้นจากโหมดเพราะงานตกค้าง', + 'assistant.unfinishedSummary': 'งาน {n} ขั้นลืมอยู่ข้างหลัง', + 'assistant.unfinishedMore': 'ทิ้งเพิ่มมาอีก +{n}', + 'assistant.continueRemaining': 'สานต่อภาระหน้าที่หลงเหลือที', + 'assistant.outTokens': 'หมดการจ่ายใน {n} โทเคน', + 'assistant.producedFiles': 'ดึงงานมาจากระบบไฟล์', + 'assistant.openFile': 'เรียก', + 'assistant.downloadFile': 'สูบลงตัวเครื่อง', + 'assistant.thinking': 'ไตร่ตรอง…', + 'assistant.systemReminder': 'จดบอกเล่าจากสิ่งที่สำคัญในระบบ', + 'assistant.waitingFirstOutput': 'รอบอกการประมวลครั้งเปิดฉาก', + 'assistant.statusBootingAgent': 'เริ่มปลุกเอเจนต์ก่อน', + 'assistant.statusStarting': 'ขึ้นเดินหน้าสู่ระบบแล้ว', + 'assistant.statusRequesting': 'ผลักภาระด้วยคำสั่งเข้ามารับใช้', + 'assistant.statusThinking': 'ครุ่นคิดคำตอบเตรียมไว้ให้ดี', + 'assistant.statusStreaming': 'ส่งถ่ายผลลัพธ์มาตลอดต่อเนื่อง', + 'assistant.slowHint': 'ใช้ขอบเขตเวลามากผิดคาด ฟอร์มตอบควรมาราว 5-10 วินาที — หยุดไว้และขอเขียนเข้าไปให้เป็นที่เข้าใจอีกทีดีไหม', + 'assistant.verbEditing': 'แก้ไขโครงใหม่', + 'assistant.verbWriting': 'นั่งเขียนเพิ่มเติม', + 'assistant.verbReading': 'รับชมพิจารณาข้อมูล', + 'assistant.verbSearching': 'ไล่สายตาหา', + 'assistant.verbRunning': 'เดินระบบคำสั่งไป', + 'assistant.verbTodos': 'สร้างกำหนดของเป้าหมายหน้า', + 'assistant.verbFetching': 'ชักนำผลผ่านตัวออนไลน์', + 'assistant.verbCalling': 'ตามสั่งเครื่องมือมาใช้', + + 'qf.answered': 'ได้ส่งคำไปแล้ว', + 'qf.choose': 'จิ้มเลือกเถอะ…', + 'qf.required': 'เป็นของต้องจัดให้เสมอ', + 'qf.lockedSubmitted': 'ข้อมูลรับไปสู่มือเอเจนต์แบบไม่มีตกค้าง เพื่อต่อความรันได้จนเสร็จสิ้น', + 'qf.lockedPrev': 'หน้าจอกรอบนี้มาจากแบบข้อมูลผ่านแล้ว', + 'qf.hint': 'ระบุเลือกตามที่มองเห็นว่าชอบใจอันไหน หากไม่ได้รู้สึกว่าอยากใช้อะไรก็ข้ามไป เอเจนต์คอยวางเกณฑ์ค่าพื้นฐานไว้ด้วยตัวเขาเอง', + 'qf.submitDefault': 'เอาผลทั้งหมดนี้เข้าไป', + 'qf.submitDisabledTitle': 'นำคำลงในกล่องที่จำเป็นให้ครบกันก่อน', + 'qf.submitTitle': 'เอาผลทั้งหมดนี้เข้าไป', + 'qf.cardSelected': 'เลือกใช้งาน', + 'qf.cardRefs': 'เชื่อมโยงจากตัวของ:', + 'qf.cardSampleText': 'สุนัขจิ้งจอกสีน้ำตาลตัวรวดเร็ว · 0123', + + 'sketch.toolSelect': 'จิ้มเลือกตัวสิ่งของ', + 'sketch.toolPen': 'ปากกาวาดลาย', + 'sketch.toolText': 'ข้อความอักษร', + 'sketch.toolRect': 'ทำกรอบสี่เหลี่ยม', + 'sketch.toolArrow': 'ทำลูกศรชี้', + 'sketch.toolEraser': 'ยางลบเก็บลาย', + 'sketch.color': 'หยิบสีระบาย', + 'sketch.strokeSize': 'เพิ่มระดับความหนาเส้นวาด', + 'sketch.undo': 'ดึงกลับขั้นที่เพิ่งวาดไป', + 'sketch.clear': 'ลบทำความสะอาดเต็มแผ่น', + 'sketch.close': 'ทิ้งและปิดหน้าต่าง', + 'sketch.closeConfirm': 'ต้องการละทิ้งของที่ปรับยังไม่จบในร่างภาพวาดและออกไปเลยหรือ?', + 'sketch.textPrompt': 'ใส่ข้อความของคุณลง:', + 'sketch.textModalTitle': 'เติมข้อความลงที่ตัวหนังสือ', + + 'pet.title': 'เพื่อนสัตว์เลี้ยง', + 'pet.subtitle': 'มารับน้องเอาไว้ดูแลในบนหน้าจอโปรเจกต์', + 'pet.navTitle': 'เพื่อนสัตว์เลี้ยง', + 'pet.navHint': 'ให้รับน้องเข้ามาอยู่กับตัวเอง', + 'pet.tabBuiltIn': 'มาพร้อมเปิดระบบ', + 'pet.tabBuiltInHint': 'จัดกลุ่มให้พร้อมใช้กับชุดระบบจาก Open Design แล้ว — เอาได้เลย', + 'pet.builtInEmpty': 'ของที่จัดกลุ่มจากข้างในมาไม่เห็นเลย ถ้าระบบออนไลน์อยู่ก็ขอตัวรีไปหามันต่อให้ที', + 'pet.tabCustom': 'สร้างของสไตล์แต่งเติมเอาเอง', + 'pet.tabCustomHint': 'มีตัวสัตว์ของเอง สร้างชื่อ กำหนดรูป เอามาวางปรับได้เสร็จสรรพ', + 'pet.tabCommunity': 'จากเพื่อนชุมชน', + 'pet.tabCommunityHint': 'เป็นพวกตัวสัตว์จากการผลิตใน Codex — ดูๆ และรับเลี้ยงต่อ หรือสั่งเจาะจงให้ทำแบบของที่ตัวเลือกเอาได้', + 'pet.tabsAria': 'ช่องทางของน้องเอาที่ไหนมาดี', + 'pet.adopt': 'เอาไปดูแลรับเลี้ยง', + 'pet.adoptedBadge': 'อยู่ในช่วงรับเลี้ยงไปแล้ว', + 'pet.adoptCallout': 'เอาไปดูแลรับเลี้ยงเถอะนะ', + 'pet.changePet': 'เปลื่ยนเพื่อนคู่หูตัวอื่นเอามาดีกว่า', + 'pet.wake': 'ลืมตื่นเถิด', + 'pet.tuck': 'กลับไปซุกรังเถอะ', + 'pet.wakeTitle': 'ไปเรียกตื่นออกมา — แสดงโชว์ให้พร้อม', + 'pet.tuckTitle': 'ม้วนกลับที่นอน — เอาออกจากการแสดงโชว์ไปก่อน', + 'pet.settingsTitle': 'เข้ามาที่แถบการตั้งปรับสัตว์เลี้ยง', + 'pet.useCustom': 'นำเพื่อนของฉันมาเป็นโชว์คู่หู', + 'pet.customTitle': 'ทำสัตว์ตัวโปรดของคุณเลย', + 'pet.customHint': 'จัดระเบียบใส่ชื่อ อีโมจิ หรือสิ่งที่มีเพื่อนำมาเป็นโชว์สัตว์แบบสมบูรณ์พร้อม', + 'pet.customGreetingPlaceholder': 'ทักทายส่งเสียงบอกสักคำสิ…', + 'pet.fieldName': 'เรียกน้องสัตว์ว่า', + 'pet.fieldGlyph': 'ใช้อีโมจินี้แหล่ะ', + 'pet.fieldGlyphHint': 'เหมาะสุดก็คือแบบอีโมจิเดี่ยวมาตัวนึง (เช่น 🐝, 🦄, 🐢)', + 'pet.fieldGreeting': 'เสียงคำทักทายที่กล่าวไว้', + 'pet.fieldAccent': 'ใช้สีโทนสดใสของเน้นตัว', + 'pet.fieldAccentCustom': 'ปรับแต่งของสีด้วยตัวเอง', + 'pet.overlayAria': 'เป็นโชว์แผงของสัตว์', + 'pet.spriteAria': 'นี่ของ {name} — ตัวกดจับลากและแชทเข้าพูด', + 'pet.spriteTitle': 'แวะมาหวัดดีจาก {name}! จิ้มมาสนทนากัน', + 'pet.railAria': 'กดเครื่องหมายเปิดตัวเลือกหาสัตว์', + 'pet.railTitle': 'เพื่อนสัตว์เลี้ยง', + 'pet.railHint': 'ดูมาไว้คอยอยู่เป็นเพื่อนในกระดาน', + 'pet.railExpand': 'กางเปิดแถบดูสัตว์มาโชว์', + 'pet.railCollapse': 'พับแถบตัวสัตว์หดเข้าตัว', + 'pet.railHide': 'ปิดแผงการมองไม่ให้เห็นมาเลย', + 'pet.railShow': 'กลับมาแสดงตัวที่ตัวเลือกสัตว์ให้รู้ไป', + 'pet.railCustomFlavor': 'แบบฉบับเอาที่มี — ใส่เองมาหมดด้วยชื่อ สี และอีโมจิ', + 'pet.railCustomize': 'ปรับแต่งเอาเองเลย…', + 'pet.composerTitle': 'เพื่อนสัตว์เลี้ยง — เรียกตื่น ม้วนไปนอน หรือเอาอันไหนสักที', + 'pet.composerMenuTitle': 'เพื่อนสัตว์เลี้ยง', + 'pet.composerMenuHint': 'ตัวเลือกพิเศษ: ลองพิมพ์ /pet เพื่อเปลี่ยนการใช้งานโหมด', + 'pet.composerOpenSettings': 'ปรับแต่งเพิ่มในหน้าการตั้งค่า', + 'pet.welcomeTeaserTitle': 'เปิดรับเพื่อนมา', + 'pet.welcomeTeaserBody': 'ตัวกระจุ๋มกระจิ๋มอยู่ลอยไปมาบนพื้นที่ที่โชว์แวะทัก', + 'pet.welcomeTeaserCta': 'เลือกมาตัวนึงสิ', + 'pet.imageUpload': 'ส่งแถบภาพเคลื่อนไหวสไปรต์', + 'pet.imageReplace': 'โละเปลี่ยนใส่ของภาพสไปรต์ให้มาใหม่', + 'pet.imageRemove': 'หยุดกลับสู่อีโมจิตามปกติก่อน', + 'pet.imageHintIdle': 'รองรับทั้งไฟล์แบบ PNG, JPG, WebP, GIF รวมไปถึง SVG ของที่อัพเข้ามา ถ้าใช้แผ่นเคลื่อนไหวหลายช่อง ก็ต้องเซตส่วนตัวที่กรอบมาให้ด้วย', + 'pet.imageHintActive': 'รูปสัตว์โชว์การแสดงผลพร้อมใช้ ถ้าใส่เฟรมไว้ > 1 มันจะไปรันให้ดูผ่านของแผ่นแสดงตามที่ว่ามา', + 'pet.fieldFrames': 'จำนวนเฟรมที่แบ่ง', + 'pet.fieldFramesHint': 'มีแค่ 1 = ปักนิ่งเอาไว้ให้ มีของ > 1 = ลากมาเคลื่อนไปเรื่อยตามการใส่', + 'pet.fieldFps': 'วิ่งจังหวะฉับไว (fps)', + 'pet.fieldFpsHint': 'ให้กำหนดตามใจว่าหมุนมาเปลี่ยนช่องเร็วแค่ไหน', + 'pet.atlasImport': 'เอาของสไปรต์ Codex ใช้นำเข้า', + 'pet.atlasImportTitle': 'มาให้ดึงแบบสไปรต์สัตว์แบบฟัก (hatch-pet) แผนที่เข้าฉบับ 8x9 / 192x208 (แบบรับได้ของ PNG และ WebP)', + 'pet.atlasPickerTitle': 'ไปลองกดตรงแถบของโชว์ความเคลื่อนไหวมาสักชุด', + 'pet.atlasPickerHint': 'ของ Codex ที่รวมแผงสัตว์ไว้มีราว 9 แถวของการเคลือนมาด้วย ของที่พร้อมมาแล้วตามพื้นฐานมักจะทำแผ่นแบบครบเซต พอมีเวลาที่น้องขยับตามทิศทางเมาส์หรือเอามาพักเฉยๆ ก็พร้อมที่จะใช้ตลอด สามารถแช่ภาพหรือเอาตามการเล่นก็ตั้งตามใจในนั้นได้', + 'pet.atlasCancel': 'ทิ้งและปล่อยตัวเลือกนี้ไปเถิด', + 'pet.atlasAdopt': 'ล็อคแช่ตามแถวที่เลือกมา', + 'pet.atlasAdoptFull': 'ลากเข้าเอาในของแผนเต็มแบบจัดฉากเอง (เน้นทำทิศทางขยับเป็นหลายท่วงท่า)', + 'pet.atlasAdoptFullTitle': 'ครอบคลุมมาเก็บทั้งแถวให้โชว์ทุกอย่างเวลามีทิศทาง หรือโดนเมาส์รบกวน', + 'pet.atlasAdoptRowTitle': 'ตัดมาแบ่งใช้เน้นส่วนเด่นๆ ให้ทำวิ่งซ้ำๆ ของเฉพาะเจาะจงกันเลย', + 'pet.atlasActiveHint': 'อยู่ในของที่ตัวแอนิเมชันเปิดตามฉบับเต็มใช้งานตลอด — น้องพร้อมแล้วที่มีจะเปลี่ยนการแสดงอารมณ์ไป (ทั้งขยับไปมา ลาก หรืออยู่หยุดพักนิ่ง)', + 'pet.atlasRow.idle': 'ยืนนิ่งรับสถานะ', + 'pet.atlasRow.running-right': 'พุ่งตัวทางด้านขวา', + 'pet.atlasRow.running-left': 'พุ่งตัวไปในทิศทางซ้าย', + 'pet.atlasRow.waving': 'ทักทายโบกสะบัด', + 'pet.atlasRow.jumping': 'กระโดดลอยตัว', + 'pet.atlasRow.failed': 'รับทราบถึงข้อขัดข้องล้มเหลว', + 'pet.atlasRow.waiting': 'ทอดทิ้งไว้รอบางสิ่ง', + 'pet.atlasRow.running': 'พุ่งทะยานวิ่ง', + 'pet.atlasRow.review': 'ทำการไล่ทบทวนตรวจดูผลลัพธ์กัน', + 'pet.hatchTitle': 'เสกหาตัวน้องสัตว์ AI ด้วยตัวเองจากฟักไข่ใหม่เลย', + 'pet.hatchHint': 'เอาของเครื่องมือที่ฝังใช้จากข้างใน (hatch-pet skill) กดรับนำมาปั้นผลสไปรต์หน้าของ Codex ในหน้าจอและนำเข้ามายังตระกูลที่นี่ซะ', + 'pet.hatchConcept': 'ของไอเดียสัตว์ตัวหลัก (เสริมใส่หรือไม่ใส่ก็ว่าตามต้องการ)', + 'pet.hatchConceptPlaceholder': 'อาทิ หมาปั๊กแบบภาพ 8-บิท สวมชุดหมวกนิตติ้งมา', + 'pet.hatchCopy': 'จิ้มเพื่อก็อปปี้สคริปต์นี้ออกไว้ได้', + 'pet.hatchCopied': 'จัดการคัดลอกมาอยู่บนคลิปบอร์ดเสร็จแล้ว!', + 'pet.hatchFoot': 'หลังจากเครื่องมือเซฟสัตว์เลี้ยงไว้ ให้กลับมาที่นี่เพื่อทำการเลือก "นำเข้าภาพ Codex sprite" และระบุเลย', + 'pet.slashPopoverAria': 'แถบเข้าชุดเครื่องมือ Slash พิเศษ', + 'pet.slashPopoverTitle': 'สั่งทำงานตามคำพูดตรง', + 'pet.slashPopoverHint': 'ไล่ชี้จากทิศทาง ↑↓ นำเอา enter เข้าจับสั่ง · esc ไม่เอาหน้าต่างแล้วออกไป', + 'pet.slashPet': 'โหมดตั้งกลับแบบ เปิดเอา/ปิดรับ พร้อมการเข้าจัดระบบตัวของสัตว์เลยทันใจ', + 'pet.slashPetWake': 'เรียกตัวที่เตรียมลอยมาโชว์รับในจอ', + 'pet.slashPetTuck': 'เอากลับพับโชว์เข้าที่ไปตอนนี้นี่แหล่ะ', + 'pet.slashHatch': 'ก่อแบบเสกตัวของจากแบบฉบับ Codex ทำเข้าจากตรงระบบความสามารถ hatch-pet เสียด้วย', + 'pet.slashHatchArg': '<รายละเอียดการออกแบบคอนเซปต์>', + 'pet.slashSearch': 'รับให้สั่งดึงของคำสั่งที่ใช้เพื่อตรวจเว็บแบบ OD วิ่งค้นหากันได้', + 'pet.slashSearchArg': '<รายละเอียดการนำทางสืบค้น>', + 'pet.codexTitle': 'แบบสดๆ ฟักจากข้างในเลย', + 'pet.codexSubtitle': 'สิ่งที่เป็นพวกนี้คือตัวน้องๆ ที่ได้จากทักษะ hatch-pet โดยกดปุ๊บก็ไปพร้อมกับการให้ตัวเข้ามาทันที', + 'pet.codexSubtitleWithDir': 'ในเวลาที่เข้าดึงสแกนตามตัวจากระบบไดเรกทอรี {dir} ที่จะได้ให้ตัวเลือกการเข้าจัดการของ hatch-pet', + 'pet.codexEmpty': 'ไร้แววเลยตอนนี้ ไม่พบแบบของอะไรใหม่เลยที่ฟักออกมาได้ ไปตามปุ่มการใช้พิมพ์แบบ /hatch ดูเอาไว้สร้างขึ้นนะ', + 'pet.codexLoading': 'อยู่ระหว่างพิจารณาจับแบบการฟักสัตว์มาให้เห็นกัน…', + 'pet.codexRefresh': 'ดึงโหลดเข้ามาอีก', + 'pet.codexAdopt': 'กดยอมรับดูแลไปเลย', + 'pet.codexAdopting': 'สู่โหมดกำลังเข้าเอาตัวดูแลไปแล้วนะ…', + 'pet.communitySync': 'มาจับซิงค์หาเหล่าแบบจากส่วนชุมชนลงเครื่องมาสิ', + 'pet.communitySyncing': 'จัดการไล่จับข้อมูลดาวน์โหลดมาให้คอยอยู่…', + 'pet.communitySyncTitle': 'จับข้อมูลเพื่อซิงค์รุ่นเข้าแบบ Codex Pet Share ทั้งของแบบ j20 นำดึงสู่ในของ ~/.codex/pets/ ให้', + 'pet.communitySyncDone': 'ดำเนินการซิงค์ลุล่วงด้วยไปได้ {wrote} ของรุ่นสัตว์ใหม่ ({total} ค่ามีทั้งหมดในผลนะ)', + 'pet.communitySyncFailed': 'ซิงค์เข้าล้มซะแล้ว มีเออเร่อแบบนี้ขึ้นเลย: {error}', + 'pet.codexBundled': 'รวมมามัดชุดใหญ่', + 'pet.codexBundledTitle': 'เตรียมมาให้กับ Open Design แล้ว — ไม่ต้องดาวน์โหลดใหม่', + + 'settings.notifications': 'การรับส่งข้อมูลการแจ้งเตือน', + 'settings.notificationsHint': 'มีระบบใช้บอกทั้งส่งเตือนเดสก์ท็อป และเปิดเสียงที่รันรับใช้เข้าแบบทำงานลุล่วง', + 'settings.notifyCompletionSound': 'ส่งเสียงแสดงให้รับรู้', + 'settings.notifyCompletionSoundHint': 'ทำงานดังขึ้นเมื่อถึงจังหวะผลลุล่วง เป็นค่าตั้งที่ปิดก่อนด้วยค่าระดับพื้นฐานเอาไว้เลย', + 'settings.notifySuccessSound': 'โทนเสียงแจ้งงานผ่านตลอดรอดตาย', + 'settings.notifyFailureSound': 'โทนเสียงแบบเกิดล้มเหลว', + 'settings.notifyDesktop': 'ป้ายกล่องเตือนหน้าจอเดสก์ท็อป', + 'settings.notifyDesktopHint': 'ส่งไปเตือนให้เวลาหน้าจอหรือตัวหน้าต่างโดนไปไม่ได้ตั้งโฟกัสมองดูเอาไว้', + 'settings.notifyDesktopBlocked': 'ยังติดปิดกั้นแบบของในเบราว์เซอร์ไปแล้ว ให้เปิดไปตั้งค่าความอนุญาตรับในส่วนที่ทำในแผงจัดการตัวเว็บให้หน่อย', + 'settings.notifyDesktopUnsupported': 'หมดโอกาสรองรับกันไปในการทำแบบแผงการแจ้งนี้บนอุปกรณ์ที่เป็นอยู่นี่ซะ', + 'settings.notifyTest': 'กดลองฟังตัวเทสดู', + 'settings.notifyTestSent': 'ถูกลากผ่านส่งคำโชว์ข้อตัวทดสอบนี้ไป ถ้าระดับป้ายตัวเตือนไม่มีขึ้นเลย ควรตามเข้าไปจัดใหม่ดูในการของแจ้งทั้งระบบบนและเบราว์เซอร์ล่ะกัน', + 'settings.notifyTestFailed': 'เรียกการส่งเตือนเกิดความล้มเหลว ลองตรวจระดับตัวเซตติ้งในส่วนระบบของเตือนแบบระบบเบราว์เซอร์หน่อยแล้วกัน', + 'settings.notifySoundDing': 'ดังติ๊งสิ', + 'settings.notifySoundChime': 'ลั่นเหมือนดังกระดิ่ง', + 'settings.notifySoundTwoToneUp': 'โทนดังปรับขึ้นไป 2 จังหวะ', + 'settings.notifySoundPluck': 'เสียงดั่งโดนสายกระตุกไปมา', + 'settings.notifySoundBuzz': 'เป็นจังหวะกระตุ้นอารมณ์สั่นเลย', + 'settings.notifySoundTwoToneDown': 'โทนดังลดถอย 2 จังหวะ', + 'settings.notifySoundThud': 'เสียงหนักเน้นโครมให้ระวัง', + 'settings.library': 'ชุดของด้านความสามารถทั้ง Skills และตัว Design Systems มีคลังห้องข้อมูล', + 'settings.libraryHint': 'ให้สามารถตามมอง สลับการแสดงของในของหน้าห้องข้อมูลที่ตั้งใจ', + 'settings.librarySkills': 'พวก Skills', + 'settings.libraryDesignSystems': 'ตัวของระบบแบบ Design Systems', + 'settings.librarySearch': 'ต้องการหาสิ่งใด…', + 'settings.libraryAll': 'ทุกชิ้นส่วนเอามา', + 'settings.libraryPreview': 'ชมภาพเตรียม', + 'settings.libraryPreviewClose': 'นำเก็บซ่อน', + 'settings.libraryLoading': 'ในระบบเรียกมารอ…', + 'settings.libraryNoResults': 'ตัวหานี้มีอันที่ไม่มีตรงใดๆ กับที่ค้นเข้ามาเลยล่ะ', + 'settings.libraryEnabled': 'เปิดเข้าตัวโหมด', + 'settings.libraryDisabled': 'งับการแสดงอยู่', + 'settings.connectorsNavHint': 'แหล่งของระบบที่ไว้เข้าถึงจากที่ตั้งในของตัวพ่วงแผงอื่น', + 'settings.connectorsHint': 'ให้คอยเข้ามาปรับเซตและมองเข้าจัดการส่วนตัวบริการระบบที่เชื่อมผูกมากับดีไวซ์ในอันนี้ด้วย', + 'settings.connectorsComposioApiKey': 'ใส่ส่วนตัวของคีย์แบบ Composio API', + 'settings.connectorsSavedTitle': 'ดึงสู่ความพร้อมเก็บในที่ Local Daemon เลย', + 'settings.connectorsSavedWithTail': 'พร้อมใช้แล้ว · ••••{tail}', + 'settings.connectorsSaved': 'บันทึกพร้อม', + 'settings.connectorsGetApiKey': 'หาเส้นทางคีย์เข้า API Key', + 'settings.connectorsReplaceKeyPlaceholder': 'หามาใส่ของตัวคีย์ที่ตั้งในของแทนส่วนเก็บไปก่อนแล้วได้ตรงนี้', + 'settings.connectorsApiKeyPlaceholder': 'อัดเข้ากับตัว Composio API key ในนี่แหล่ะ', + 'settings.connectorsClear': 'ให้เอาออกโล่งเลย', + 'settings.connectorsClearConfirmTitle': 'สั่งแบบกำจัดพร้อมเอาคีย์เก่าบน Composio API ที่ตั้งไว้นี้หรือไม่', + 'settings.connectorsClearConfirmBody': 'ของชุดนี้ส่งออกคีย์ไปหมายความตัวของแอปใดใดทางตัวเชื่อมทุกชนิดที่จะติดผูกมาตรง Composio ทิ้งให้หมดทุกแบบ ซึ่งพวกรวมแบบอย่างการมีบัญชีของระบบ อนุญาตตั้งตามทาง OAuth รวมเลยกับของความเข้ามือเอาทิ้งตามออกหมดเรียบเลย', + 'settings.connectorsClearConfirmContinue': 'ขอเดินข้ามเอาต่อ', + 'settings.connectorsClearFinalTitle': 'เรื่องนี้จะไปรบกวนให้ทุกตัวแอปพลิเคชั่นหลุดออก', + 'settings.connectorsClearFinalBody': 'คุณจะไม่สามารถทำอะไรกลับมาได้ จนกว่าจะใส่และเชื่อมเครื่องมือต่างๆ ใหม่', + 'settings.connectorsClearFinalConfirm': 'ลบคีย์และเลิกแอป', + 'settings.connectorsClearArming': 'สักแป๊บดึงเวลาตั้งเตรียมรับ…', + 'settings.connectorsClearCancel': 'กดแบบยกเลิกไป', + 'settings.connectorsSaveKey': 'อัดลงบันทึกชุดคีย์เลย', + 'settings.connectorsSaveKeyTitle': 'ดึงโอนความของคีย์ที่ได้รับกลับมาให้ที่ส่วนระบบเครื่องส่วน Local Daemon ต่อเลย', + 'settings.connectorsKeySaving': 'เก็บรักษาที่ส่วนข้อมูล…', + 'settings.connectorsKeyError': 'ไม่สามารถบันทึกได้ ลองตรวจสอบตัว Daemon ให้ดี', + 'settings.connectorsHelpSaved': 'รหัสเก็บอยู่ในเครื่องเรียบร้อย นำรหัสใหม่ใส่ได้ตลอด หรือเอาออกด้วยปุ่มล้างข้อมูล', + 'settings.connectorsHelpUnsaved': 'ผลต่างของการแก้ที่คงไม่ทันบันทึก — กดที่คำบันทึกคีย์มาทำให้เป็นบันทึกเข้าเอาในของระบบไว้เพื่อให้เปิดตรงข้อมูลหน้าได้ดูความพร้อมในแถบเครื่องมือ', + 'settings.connectorsHelpEmpty': 'ต้องเอาคีย์ลงก่อนจึงใช้เป็นตัวระบบเพิ่ม ข้อมูลอยู่ที่แอป และเครื่องของคุณเท่านั้น', + 'settings.connectorsLoadingSavedKey': 'ตรวจสอบตามส่วนที่จะเจอความตั้งการในส่วนการใช้บันทึกคีย์ตรงที่มาของ Local Daemon…', + 'settings.autosaveSaving': 'บันทึก…', + 'settings.autosaveSaved': 'บันทึกของข้อมูลสำเร็จ', + 'settings.autosaveError': 'เซฟข้อมูลไม่ได้ คาดว่า Daemon ขาดสัญญาณ', + 'settings.libraryToggleLabel': 'สลับโหมด', + 'settings.orbit.eyebrow': 'ระบบออโตเมชัน', + 'settings.orbit.title': 'วงโคจร (Orbit)', + 'settings.orbit.navHint': 'รวบรวมเหตุการณ์ในรอบวัน', + 'settings.orbit.lede': 'เก็บสรุปของแอปทั้งหมดมาบันทึกและโชว์ได้เลย', + 'settings.orbit.statusOnTitle': 'งานตารางประจำวันเดินเครื่องแล้ว', + 'settings.orbit.statusOffTitle': 'งานตารางประจำวันถูกปิด', + 'settings.orbit.statusActive': 'กำลังใช้', + 'settings.orbit.statusOff': 'ปิด', + 'settings.orbit.runTitle': 'กดใช้งาน และไปหน้าสรุปได้เลย', + 'settings.orbit.running': 'กำลังดึงสรุป…', + 'settings.orbit.runOpen': 'สั่งทำงานทันที', + 'settings.orbit.dailySummaryTitle': 'รายวันสรุปยอด', + 'settings.orbit.dailySummarySub': 'ใช้เวลาเพียง 1 หนในวัน ที่ทำหน้าที่', + 'settings.orbit.on': 'เปิด', + 'settings.orbit.off': 'ปิด', + 'settings.orbit.runTimeTitle': 'จองเวลาสรุปยอด', + 'settings.orbit.runTimeSub': '08:00 ใช้ตามเกณฑ์ปกติ หรือนำมาบันทึกเป็นค่าหลักสำหรับของในเครื่อง', + 'settings.orbit.runTimeAria': 'ตัวสรุปกิจกรรมใน Orbit ประจำวัน', + 'settings.orbit.nextRun': 'สรุปผลครั้งใหม่', + 'settings.orbit.nextRunScheduledAfterSave': 'รอเปิดตามตาราง (หลังการบันทึก)', + 'settings.orbit.schedule': 'นัดเวลา', + 'settings.orbit.pausedManualOnly': 'หยุดพักอยู่ (รันจากการกดเท่านั้น)', + 'settings.orbit.templateTitle': 'รูปแบบข้อความอธิบาย', + 'settings.orbit.templateMissing': 'เทมเพลต {id} ไม่ได้ติดตั้งไว้', + 'settings.orbit.templateMissingOption': '{id} (ยังหายไป)', + 'settings.orbit.templateMissingInstall': 'ใช้งานสกิลของ Orbit เพื่อกำหนดรูปแบบสรุปยอดข้อความได้ดั่งใจ', + 'settings.orbit.templateMissingPickAnother': 'เปลี่ยนการใช้ตัวแทนใหม่ตรงรายการ', + 'settings.orbit.templateResetTitle': 'รีเซ็ตสู่ {id}', + 'settings.orbit.templateReset': 'รีเซ็ต', + 'settings.orbit.templateHelp': 'ใช้คำสั่งตรงเข้าหาเพื่อความตรงไปตรงมา — เทมเพลตตัวนี้พร้อมเข้าสร้างผลในทุกตัววงโคจรให้ดี', + 'settings.orbit.templateAria': 'คำสั่งควบคุม Orbit', + 'settings.orbit.templatesLoading': 'กำลังโหลดรายการ…', + 'settings.orbit.templatesOptgroup': 'แบบฟอร์มการวิเคราะห์', + 'settings.orbit.lastRun': 'ครั้งท้ายสุด', + 'settings.orbit.triggerManual': 'จัดการสั่งรันเอง', + 'settings.orbit.triggerScheduled': 'จองไว้แล้ว', + 'settings.orbit.meterAria': 'ทั้งหมด {checked}, เข้าที่สำเร็จ {succeeded}, ยกเลิก {skipped}, ล้ม {failed}', + 'settings.orbit.countChecked': 'ที่รับงานไป', + 'settings.orbit.countSucceeded': 'เสร็จตามเป้า', + 'settings.orbit.countSkipped': 'โดนข้ามไป', + 'settings.orbit.countFailed': 'ไม่ลุล่วง', + 'settings.orbit.runError': 'หาที่รวมงานไม่ได้ โปรดเตรียมทั้งการเชื่อมต่อ และเครื่องมือ', + 'settings.orbit.gateAriaLabel': 'ระบบเรียกความพร้อม', + 'settings.orbit.gateEyebrow': 'ใช้ตัวเสริม', + 'settings.orbit.gateTitle': 'ต่อข้อมูลแอปทั้งหมดเพื่อใช้ Orbit', + 'settings.orbit.gateBody': 'Orbit ไว้ให้เป็นพื้นที่สำหรับดูทุกงาน ลองเปิดต่อเชื่อมอย่างน้อย 1 ก่อนเพื่อให้มันโชว์สถิติของทุกสิ่ง', + 'settings.orbit.gateBodyNoKey': 'Orbit ต้องการต่อเข้าส่วน Composio โปรดดึง API ลงเข้าหาก่อนจึงสามารถเข้าเครื่องได้', + 'settings.orbit.gateAction': 'ตั้งค่าแอปใหม่', + 'settings.orbit.gateActionNoKey': 'ติดตั้ง Composio', + 'settings.orbit.gateLoading': 'กำลังตรวจสิ่งที่คุณตั้งไว้…', + 'settings.orbit.controlsLockedBadge': 'มีล็อกเอาไว้', + 'settings.orbit.controlsLockedHint': 'ต้องการตัวแอปเพิ่มเพื่อใช้งานให้ครบกับกำหนดแบบฟอร์มได้', + 'settings.orbit.artifactKickerLive': 'ตัวจำลอง Live artifact', + 'settings.orbit.artifactKickerLegacy': 'เนื้อหาสรุปล่าสุด', + 'settings.orbit.artifactTitle': 'ความเคลื่อนไหวล่าสุดผ่าน Orbit', + 'settings.orbit.artifactMetaLive': 'เป็นแบบระบบอัปเดตเอง จากแอปพลิเคชั่นที่เชื่อมอยู่', + 'settings.orbit.artifactMetaLegacy': 'ข้อมูลยังไม่มีการเข้าทำตัว Live artifact — หากอยากให้ระบบขึ้น กรุณากด Orbit ทำงานไป', + 'settings.orbit.copyMarkdownTitle': 'จำลองสำเนาสถิติ', + 'settings.orbit.copied': 'เตรียมพร้อมจำลอง', + 'settings.orbit.copy': 'ก็อปปี้', + 'settings.orbit.openArtifact': 'เรียกไฟล์ระบบโชว์ความเคลื่อนไหว', + 'settings.orbit.sourceMarkdown': 'Markdown ของหน้าความเคลื่อนไหว', + 'notify.successTitle': 'งานลุล่วงแล้ว', + 'notify.failureTitle': 'ข้อมูลการงานล้มเหลว', + 'notify.successBody': 'แชทตอบบทสนทนาเรียบร้อย', + 'notify.failureBody': 'หน้าที่ทำผิดพลาด', +}; diff --git a/apps/web/src/i18n/types.ts b/apps/web/src/i18n/types.ts index 19272c639b..b8974b2e58 100644 --- a/apps/web/src/i18n/types.ts +++ b/apps/web/src/i18n/types.ts @@ -1,8 +1,8 @@ // Supported UI locales. Adding a new locale requires creating a new // dictionary in `./locales/` and registering it in `./index.tsx`. -export type Locale = 'en' | 'id' | 'de' | 'zh-CN' | 'zh-TW' | 'pt-BR' | 'es-ES' | 'ru' | 'fa' | 'ar' | 'ja' | 'ko' | 'pl' | 'hu' | 'fr' | 'uk' | 'tr'; +export type Locale = 'en' | 'id' | 'de' | 'zh-CN' | 'zh-TW' | 'pt-BR' | 'es-ES' | 'ru' | 'fa' | 'ar' | 'ja' | 'ko' | 'pl' | 'hu' | 'fr' | 'uk' | 'tr' | 'th'; -export const LOCALES: Locale[] = ['en', 'id', 'de', 'zh-CN', 'zh-TW', 'pt-BR', 'es-ES', 'ru', 'fa', 'ar', 'ja', 'ko', 'pl', 'hu', 'fr', 'uk', 'tr']; +export const LOCALES: Locale[] = ['en', 'id', 'de', 'zh-CN', 'zh-TW', 'pt-BR', 'es-ES', 'ru', 'fa', 'ar', 'ja', 'ko', 'pl', 'hu', 'fr', 'uk', 'tr', 'th']; export const LOCALE_LABEL: Record = { 'en': 'English', @@ -21,7 +21,8 @@ export const LOCALE_LABEL: Record = { 'hu': 'Magyar', 'fr': 'Français', 'uk': 'Українська', - 'tr': 'Türkçe' + 'tr': 'Türkçe', + 'th': 'ภาษาไทย' }; // Translation dictionary shape — flat keys, dot-namespaced. We keep it diff --git a/apps/web/tests/i18n/locales.test.ts b/apps/web/tests/i18n/locales.test.ts index 96a9062e3a..f5affd5ab1 100644 --- a/apps/web/tests/i18n/locales.test.ts +++ b/apps/web/tests/i18n/locales.test.ts @@ -4,7 +4,7 @@ import { en } from '../../src/i18n/locales/en'; import { id } from '../../src/i18n/locales/id'; import { LOCALES, LOCALE_LABEL, type Dict, type Locale } from '../../src/i18n/types'; -const EXPECTED_LOCALES = ['en', 'id', 'de', 'zh-CN', 'zh-TW', 'pt-BR', 'es-ES', 'ru', 'fa', 'ar', 'ja', 'ko', 'pl', 'hu', 'fr', 'uk', 'tr']; +const EXPECTED_LOCALES = ['en', 'id', 'de', 'zh-CN', 'zh-TW', 'pt-BR', 'es-ES', 'ru', 'fa', 'ar', 'ja', 'ko', 'pl', 'hu', 'fr', 'uk', 'tr', 'th']; function placeholders(value: string): string[] { const names: string[] = [];