diff --git a/src/langbot/pkg/discover/engine.py b/src/langbot/pkg/discover/engine.py index 0563c20f..713420d1 100644 --- a/src/langbot/pkg/discover/engine.py +++ b/src/langbot/pkg/discover/engine.py @@ -25,6 +25,15 @@ class I18nString(pydantic.BaseModel): ja_JP: typing.Optional[str] = None """日文""" + th_TH: typing.Optional[str] = None + """泰文""" + + vi_VN: typing.Optional[str] = None + """越南文""" + + es_ES: typing.Optional[str] = None + """西班牙文""" + def to_dict(self) -> dict: """转换为字典""" dic = {} @@ -36,6 +45,12 @@ class I18nString(pydantic.BaseModel): dic['zh_Hant'] = self.zh_Hant if self.ja_JP is not None: dic['ja_JP'] = self.ja_JP + if self.th_TH is not None: + dic['th_TH'] = self.th_TH + if self.vi_VN is not None: + dic['vi_VN'] = self.vi_VN + if self.es_ES is not None: + dic['es_ES'] = self.es_ES return dic diff --git a/src/langbot/pkg/platform/sources/discord.yaml b/src/langbot/pkg/platform/sources/discord.yaml index 24564999..0f963c76 100644 --- a/src/langbot/pkg/platform/sources/discord.yaml +++ b/src/langbot/pkg/platform/sources/discord.yaml @@ -7,11 +7,17 @@ metadata: zh_Hans: Discord zh_Hant: Discord ja_JP: Discord + th_TH: Discord + vi_VN: Discord + es_ES: Discord description: en_US: Discord Adapter zh_Hans: Discord 适配器,需要可连接 Discord 服务器的网络环境 zh_Hant: Discord 適配器,需要可連線 Discord 伺服器的網路環境 ja_JP: Discord アダプター、Discord サーバーに接続可能なネットワーク環境が必要です + th_TH: อะแดปเตอร์ Discord ต้องการสภาพแวดล้อมเครือข่ายที่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ Discord ได้ + vi_VN: Bộ điều hợp Discord, cần môi trường mạng có thể kết nối với máy chủ Discord + es_ES: Adaptador de Discord, requiere un entorno de red con acceso al servidor de Discord icon: discord.svg spec: categories: @@ -24,6 +30,9 @@ spec: zh_Hans: 客户端ID zh_Hant: 用戶端ID ja_JP: クライアント ID + th_TH: รหัสไคลเอนต์ + vi_VN: ID khách hàng + es_ES: ID de cliente type: string required: true default: "" @@ -33,6 +42,9 @@ spec: zh_Hans: 令牌 zh_Hant: 令牌 ja_JP: トークン + th_TH: โทเค็น + vi_VN: Mã thông báo + es_ES: Token type: string required: true default: "" diff --git a/src/langbot/pkg/platform/sources/line.yaml b/src/langbot/pkg/platform/sources/line.yaml index 75cd3121..05a1ee78 100644 --- a/src/langbot/pkg/platform/sources/line.yaml +++ b/src/langbot/pkg/platform/sources/line.yaml @@ -6,11 +6,17 @@ metadata: en_US: LINE zh_Hans: LINE zh_Hant: LINE + th_TH: LINE + vi_VN: LINE + es_ES: LINE description: en_US: LINE Adapter, requires a public URL to receive LINE message pushes, please refer to the documentation for usage details zh_Hans: LINE适配器,需要公网地址以接收 LINE 消息推送,请查看文档了解使用方式 zh_Hant: LINE 適配器,需要公網地址以接收 LINE 訊息推送,請查看文件了解使用方式 ja_JP: LINEアダプター、LINEのメッセージプッシュを受信するためにパブリックURLが必要です。使用方法の詳細については、ドキュメントを参照してください。 + th_TH: อะแดปเตอร์ LINE ต้องการ URL สาธารณะเพื่อรับการแจ้งเตือนข้อความจาก LINE โปรดดูเอกสารประกอบสำหรับรายละเอียดการใช้งาน + vi_VN: Bộ điều hợp LINE, cần URL công cộng để nhận thông báo tin nhắn LINE, vui lòng xem tài liệu để biết chi tiết cách sử dụng + es_ES: Adaptador de LINE, requiere una URL pública para recibir notificaciones de mensajes de LINE, consulte la documentación para obtener detalles de uso icon: line.png spec: categories: @@ -22,11 +28,17 @@ spec: zh_Hans: Webhook 回调地址 ja_JP: Webhook コールバック URL zh_Hant: Webhook 回調地址 + th_TH: URL การเรียกกลับ Webhook + vi_VN: URL gọi lại Webhook + es_ES: URL de devolución de llamada Webhook description: en_US: Copy this URL and paste it into your LINE channel's webhook configuration zh_Hans: 复制此地址并粘贴到 LINE 频道的 Webhook 配置中 ja_JP: この URL をコピーして LINE チャンネルの Webhook 設定に貼り付けてください zh_Hant: 複製此地址並貼到 LINE 頻道的 Webhook 設定中 + th_TH: คัดลอก URL นี้แล้ววางในการตั้งค่า Webhook ของช่อง LINE ของคุณ + vi_VN: Sao chép URL này và dán vào cấu hình webhook của kênh LINE của bạn + es_ES: Copie esta URL y péguela en la configuración de webhook de su canal LINE type: webhook-url required: false default: "" @@ -36,6 +48,9 @@ spec: zh_Hans: 频道访问令牌 ja_JP: チャンネルアクセストークン zh_Hant: 頻道存取令牌 + th_TH: โทเค็นการเข้าถึงช่อง + vi_VN: Mã truy cập kênh + es_ES: Token de acceso del canal type: string required: true default: "" @@ -45,11 +60,17 @@ spec: zh_Hans: 消息密钥 ja_JP: チャンネルシークレット zh_Hant: 訊息密鑰 + th_TH: รหัสลับช่อง + vi_VN: Khóa bí mật kênh + es_ES: Secreto del canal description: en_US: Only valid when webhook mode is enabled, please fill in the encrypt key zh_Hans: 请填写加密密钥 ja_JP: Webhookモードが有効な場合にのみ、暗号化キーを入力してください zh_Hant: 請填寫加密密鑰 + th_TH: กรุณากรอกคีย์เข้ารหัส + vi_VN: Vui lòng điền khóa mã hóa + es_ES: Por favor, introduzca la clave de cifrado type: string required: true default: "" diff --git a/src/langbot/pkg/platform/sources/satori.yaml b/src/langbot/pkg/platform/sources/satori.yaml index edeeb715..5d96cf37 100644 --- a/src/langbot/pkg/platform/sources/satori.yaml +++ b/src/langbot/pkg/platform/sources/satori.yaml @@ -6,10 +6,16 @@ metadata: en_US: Satori zh_Hans: Satori zh_Hant: Satori + th_TH: Satori + vi_VN: Satori + es_ES: Satori description: en_US: SatoriAdapter zh_Hans: Satori 协议适配器,支持多种平台的接入,请查看文档了解使用方式 zh_Hant: Satori 協定適配器,支援多種平台的接入,請查看文件了解使用方式 + th_TH: อะแดปเตอร์โปรโตคอล Satori รองรับการเชื่อมต่อหลายแพลตฟอร์ม โปรดดูเอกสารประกอบสำหรับวิธีการใช้งาน + vi_VN: Bộ điều hợp giao thức Satori, hỗ trợ kết nối nhiều nền tảng, vui lòng xem tài liệu để biết cách sử dụng + es_ES: Adaptador del protocolo Satori, soporta acceso a múltiples plataformas, consulte la documentación para obtener instrucciones de uso icon: satori.png spec: categories: @@ -20,6 +26,9 @@ spec: en_US: Platform zh_Hans: 平台名称 zh_Hant: 平台名稱 + th_TH: ชื่อแพลตฟอร์ม + vi_VN: Tên nền tảng + es_ES: Nombre de la plataforma type: string required: true default: "llonebot" @@ -27,11 +36,17 @@ spec: en_US: The platform name (e.g., llonebot, discord, telegram) zh_Hans: 平台名称(如 llonebot, discord, telegram) zh_Hant: 平台名稱(如 llonebot、discord、telegram) + th_TH: ชื่อแพลตฟอร์ม (เช่น llonebot, discord, telegram) + vi_VN: Tên nền tảng (ví dụ: llonebot, discord, telegram) + es_ES: El nombre de la plataforma (p. ej., llonebot, discord, telegram) - name: host label: en_US: Host zh_Hans: 主机地址 zh_Hant: 主機地址 + th_TH: ที่อยู่โฮสต์ + vi_VN: Địa chỉ máy chủ + es_ES: Dirección del host type: string required: true default: "127.0.0.1" @@ -39,11 +54,17 @@ spec: en_US: The host address of LLOneBot Satori server (e.g., 127.0.0.1, localhost, 192.168.1.100) zh_Hans: LLOneBot Satori服务器的主机地址(如 127.0.0.1, localhost, 192.168.1.100) zh_Hant: LLOneBot Satori 伺服器的主機地址(如 127.0.0.1、localhost、192.168.1.100) + th_TH: ที่อยู่โฮสต์ของเซิร์ฟเวอร์ LLOneBot Satori (เช่น 127.0.0.1, localhost, 192.168.1.100) + vi_VN: Địa chỉ máy chủ LLOneBot Satori (ví dụ: 127.0.0.1, localhost, 192.168.1.100) + es_ES: La dirección del host del servidor LLOneBot Satori (p. ej., 127.0.0.1, localhost, 192.168.1.100) - name: port label: en_US: Port zh_Hans: 监听端口 zh_Hant: 監聽連接埠 + th_TH: พอร์ต + vi_VN: Cổng + es_ES: Puerto type: integer required: true default: 5600 @@ -52,6 +73,9 @@ spec: en_US: Satori API Endpoint zh_Hans: Satori API 终结点 zh_Hant: Satori API 端點 + th_TH: จุดปลาย Satori API + vi_VN: Điểm cuối Satori API + es_ES: Punto de acceso de la API Satori type: string required: true default: "http://localhost:5600/v1" @@ -60,6 +84,9 @@ spec: en_US: Satori WebSocket Endpoint zh_Hans: Satori WebSocket 终结点 zh_Hant: Satori WebSocket 端點 + th_TH: จุดปลาย Satori WebSocket + vi_VN: Điểm cuối Satori WebSocket + es_ES: Punto de acceso WebSocket de Satori type: string required: true default: "ws://localhost:5600/v1/events" @@ -68,6 +95,9 @@ spec: en_US: Token zh_Hans: 令牌 zh_Hant: 令牌 + th_TH: โทเค็น + vi_VN: Mã thông báo + es_ES: Token type: string required: true default: "" diff --git a/src/langbot/pkg/platform/sources/slack.yaml b/src/langbot/pkg/platform/sources/slack.yaml index 1e61c86f..252431e3 100644 --- a/src/langbot/pkg/platform/sources/slack.yaml +++ b/src/langbot/pkg/platform/sources/slack.yaml @@ -7,11 +7,17 @@ metadata: zh_Hans: Slack zh_Hant: Slack ja_JP: Slack + th_TH: Slack + vi_VN: Slack + es_ES: Slack description: en_US: Slack Adapter zh_Hans: Slack 适配器,需要公网地址以接收 Slack 消息推送,请查看文档了解使用方式 zh_Hant: Slack 適配器,需要公網地址以接收 Slack 訊息推送,請查看文件了解使用方式 ja_JP: Slack アダプター、Slackのメッセージプッシュを受信するためにパブリックURLが必要です。使用方法の詳細については、ドキュメントを参照してください。 + th_TH: อะแดปเตอร์ Slack ต้องการที่อยู่สาธารณะเพื่อรับการแจ้งเตือนข้อความจาก Slack โปรดดูเอกสารประกอบสำหรับวิธีการใช้งาน + vi_VN: Bộ điều hợp Slack, cần địa chỉ công cộng để nhận thông báo tin nhắn từ Slack, vui lòng xem tài liệu để biết cách sử dụng + es_ES: Adaptador de Slack, requiere una dirección pública para recibir notificaciones de mensajes de Slack, consulte la documentación para obtener instrucciones de uso icon: slack.png spec: categories: @@ -24,11 +30,17 @@ spec: zh_Hans: Webhook 回调地址 zh_Hant: Webhook 回調地址 ja_JP: Webhook コールバック URL + th_TH: URL การเรียกกลับ Webhook + vi_VN: URL gọi lại Webhook + es_ES: URL de devolución de llamada Webhook description: en_US: Copy this URL and paste it into your Slack app's event subscription configuration zh_Hans: 复制此地址并粘贴到 Slack 应用的事件订阅配置中 zh_Hant: 複製此地址並貼到 Slack 應用的事件訂閱設定中 ja_JP: この URL をコピーして Slack アプリのイベントサブスクリプション設定に貼り付けてください + th_TH: คัดลอก URL นี้แล้ววางในการตั้งค่าการสมัครรับเหตุการณ์ของแอป Slack ของคุณ + vi_VN: Sao chép URL này và dán vào cấu hình đăng ký sự kiện của ứng dụng Slack của bạn + es_ES: Copie esta URL y péguela en la configuración de suscripción de eventos de su aplicación Slack type: webhook-url required: false default: "" @@ -38,6 +50,9 @@ spec: zh_Hans: 机器人令牌 zh_Hant: 機器人令牌 ja_JP: ボットトークン + th_TH: โทเค็นบอท + vi_VN: Mã thông báo Bot + es_ES: Token del bot type: string required: true default: "" @@ -47,6 +62,9 @@ spec: zh_Hans: 密钥 zh_Hant: 密鑰 ja_JP: 署名シークレット + th_TH: คีย์ลายเซ็น + vi_VN: Khóa ký + es_ES: Secreto de firma type: string required: true default: "" diff --git a/src/langbot/pkg/platform/sources/telegram.yaml b/src/langbot/pkg/platform/sources/telegram.yaml index 5faef3f9..9291bbd4 100644 --- a/src/langbot/pkg/platform/sources/telegram.yaml +++ b/src/langbot/pkg/platform/sources/telegram.yaml @@ -7,11 +7,17 @@ metadata: zh_Hans: 电报 zh_Hant: Telegram ja_JP: Telegram + th_TH: Telegram + vi_VN: Telegram + es_ES: Telegram description: en_US: Telegram Adapter zh_Hans: Telegram 适配器,请查看文档了解使用方式 zh_Hant: Telegram 適配器,請查看文件了解使用方式 ja_JP: Telegram アダプター。使用方法の詳細については、ドキュメントを参照してください。 + th_TH: อะแดปเตอร์ Telegram โปรดดูเอกสารประกอบสำหรับวิธีการใช้งาน + vi_VN: Bộ điều hợp Telegram, vui lòng xem tài liệu để biết cách sử dụng + es_ES: Adaptador de Telegram, consulte la documentación para obtener instrucciones de uso icon: telegram.svg spec: categories: @@ -24,6 +30,9 @@ spec: zh_Hans: 令牌 zh_Hant: 令牌 ja_JP: トークン + th_TH: โทเค็น + vi_VN: Mã thông báo + es_ES: Token type: string required: true default: "token_from_botfather" @@ -33,6 +42,9 @@ spec: zh_Hans: 是否使用 Markdown 卡片 zh_Hant: 是否使用 Markdown 卡片 ja_JP: Markdown カードを使用 + th_TH: การ์ด Markdown + vi_VN: Thẻ Markdown + es_ES: Tarjeta Markdown type: boolean required: false default: true @@ -42,11 +54,17 @@ spec: zh_Hans: 启用电报流式回复模式 zh_Hant: 啟用 Telegram 串流回覆模式 ja_JP: ストリーミング返信モードを有効化 + th_TH: เปิดใช้งานโหมดตอบกลับแบบสตรีม + vi_VN: Bật chế độ trả lời trực tuyến + es_ES: Habilitar modo de respuesta en streaming description: en_US: If enabled, the bot will use the stream of telegram reply mode zh_Hans: 如果启用,将使用电报流式方式来回复内容 zh_Hant: 如果啟用,將使用 Telegram 串流方式來回覆內容 ja_JP: 有効にすると、ボットはストリーミングモードでメッセージに返信します + th_TH: หากเปิดใช้งาน บอทจะใช้โหมดสตรีมของ Telegram ในการตอบกลับ + vi_VN: Nếu bật, bot sẽ sử dụng chế độ trả lời trực tuyến của Telegram + es_ES: Si está habilitado, el bot usará el modo de respuesta en streaming de Telegram type: boolean required: true default: false diff --git a/src/langbot/pkg/platform/sources/websocket.yaml b/src/langbot/pkg/platform/sources/websocket.yaml index 83680330..b0fec5dc 100644 --- a/src/langbot/pkg/platform/sources/websocket.yaml +++ b/src/langbot/pkg/platform/sources/websocket.yaml @@ -6,10 +6,16 @@ metadata: en_US: "WebSocket Chat" zh_Hans: "WebSocket 聊天" zh_Hant: "WebSocket 聊天" + th_TH: "แชท WebSocket" + vi_VN: "Trò chuyện WebSocket" + es_ES: "Chat WebSocket" description: en_US: "WebSocket adapter for bidirectional real-time communication" zh_Hans: "用于双向实时通信的 WebSocket 适配器" zh_Hant: "用於雙向即時通訊的 WebSocket 適配器" + th_TH: "อะแดปเตอร์ WebSocket สำหรับการสื่อสารแบบเรียลไทม์สองทิศทาง" + vi_VN: "Bộ điều hợp WebSocket cho giao tiếp thời gian thực hai chiều" + es_ES: "Adaptador WebSocket para comunicación bidireccional en tiempo real" icon: "" spec: categories: diff --git a/web/src/app/infra/entities/common.ts b/web/src/app/infra/entities/common.ts index 729aa77a..da148f2a 100644 --- a/web/src/app/infra/entities/common.ts +++ b/web/src/app/infra/entities/common.ts @@ -3,6 +3,9 @@ export interface I18nObject { zh_Hans: string; zh_Hant?: string; ja_JP?: string; + th_TH?: string; + vi_VN?: string; + es_ES?: string; } export interface ComponentManifest { diff --git a/web/src/components/ui/language-selector.tsx b/web/src/components/ui/language-selector.tsx index d699ff16..82f6b76d 100644 --- a/web/src/components/ui/language-selector.tsx +++ b/web/src/components/ui/language-selector.tsx @@ -39,6 +39,15 @@ export function LanguageSelector({ } else if (i18n.language === 'ja' || i18n.language === 'ja-JP') { setCurrentLanguage('ja-JP'); localStorage.setItem('langbot_language', 'ja-JP'); + } else if (i18n.language === 'th' || i18n.language === 'th-TH') { + setCurrentLanguage('th-TH'); + localStorage.setItem('langbot_language', 'th-TH'); + } else if (i18n.language === 'vi' || i18n.language === 'vi-VN') { + setCurrentLanguage('vi-VN'); + localStorage.setItem('langbot_language', 'vi-VN'); + } else if (i18n.language === 'es' || i18n.language === 'es-ES') { + setCurrentLanguage('es-ES'); + localStorage.setItem('langbot_language', 'es-ES'); } else { setCurrentLanguage('en-US'); localStorage.setItem('langbot_language', 'en-US'); @@ -58,6 +67,15 @@ export function LanguageSelector({ detectedLanguage = 'zh-Hant'; } else if (browserLanguage === 'ja' || browserLanguage === 'ja-JP') { detectedLanguage = 'ja-JP'; + } else if (browserLanguage === 'th' || browserLanguage === 'th-TH') { + detectedLanguage = 'th-TH'; + } else if (browserLanguage === 'vi' || browserLanguage === 'vi-VN') { + detectedLanguage = 'vi-VN'; + } else if ( + browserLanguage === 'es' || + browserLanguage.startsWith('es-') + ) { + detectedLanguage = 'es-ES'; } else { detectedLanguage = 'en-US'; } @@ -92,6 +110,9 @@ export function LanguageSelector({ 繁體中文 English 日本語 + ภาษาไทย + Tiếng Việt + Español ); diff --git a/web/src/i18n/I18nProvider.tsx b/web/src/i18n/I18nProvider.tsx index 8c6b4f28..e4720651 100644 --- a/web/src/i18n/I18nProvider.tsx +++ b/web/src/i18n/I18nProvider.tsx @@ -27,6 +27,9 @@ export const extractI18nObject = (i18nObject: I18nObject): string => { if (language === 'zh_Hans' && i18nObject.zh_Hans) return i18nObject.zh_Hans; if (language === 'zh_Hant' && i18nObject.zh_Hant) return i18nObject.zh_Hant; if (language === 'ja_JP' && i18nObject.ja_JP) return i18nObject.ja_JP; + if (language === 'th_TH' && i18nObject.th_TH) return i18nObject.th_TH; + if (language === 'vi_VN' && i18nObject.vi_VN) return i18nObject.vi_VN; + if (language === 'es_ES' && i18nObject.es_ES) return i18nObject.es_ES; return ( i18nObject.en_US || i18nObject.zh_Hans || @@ -49,6 +52,12 @@ export const getAPILanguageCode = (): string => { if (language === 'en-US') return 'en'; // ja-JP -> ja_JP if (language === 'ja-JP') return 'ja_JP'; + // th-TH -> th_TH + if (language === 'th-TH') return 'th_TH'; + // vi-VN -> vi_VN + if (language === 'vi-VN') return 'vi_VN'; + // es-ES -> es_ES + if (language === 'es-ES') return 'es_ES'; // 默认返回 en return 'en'; }; diff --git a/web/src/i18n/index.ts b/web/src/i18n/index.ts index 74995e00..f7d0cd98 100644 --- a/web/src/i18n/index.ts +++ b/web/src/i18n/index.ts @@ -8,6 +8,9 @@ import enUS from './locales/en-US'; import zhHans from './locales/zh-Hans'; import zhHant from './locales/zh-Hant'; import jaJP from './locales/ja-JP'; +import thTH from './locales/th-TH'; +import viVN from './locales/vi-VN'; +import esES from './locales/es-ES'; i18n .use(LanguageDetector) @@ -26,6 +29,15 @@ i18n 'ja-JP': { translation: jaJP, }, + 'th-TH': { + translation: thTH, + }, + 'vi-VN': { + translation: viVN, + }, + 'es-ES': { + translation: esES, + }, }, fallbackLng: 'zh-Hans', debug: process.env.NODE_ENV === 'development', diff --git a/web/src/i18n/locales/es-ES.ts b/web/src/i18n/locales/es-ES.ts new file mode 100644 index 00000000..183ef38d --- /dev/null +++ b/web/src/i18n/locales/es-ES.ts @@ -0,0 +1,1228 @@ +const esES = { + sidebar: { + home: 'Inicio', + extensions: 'Extensiones', + installedPlugins: 'Plugins instalados', + pluginMarket: 'Tienda', + mcpServers: 'Servidores MCP', + quickStart: 'Inicio rápido', + }, + common: { + login: 'Iniciar sesión', + logout: 'Cerrar sesión', + accountOptions: 'Configuración', + account: 'Cuenta', + integration: 'Integración', + email: 'Correo electrónico', + password: 'Contraseña', + welcome: 'Bienvenido de nuevo a LangBot 👋', + continueToLogin: 'Inicia sesión para continuar', + loginSuccess: 'Inicio de sesión exitoso', + loginFailed: + 'Error de inicio de sesión, por favor verifica tu correo y contraseña', + loginLoadError: 'No se puede conectar al servidor', + loginLoadErrorDesc: + 'No se puede conectar al backend de LangBot. Asegúrate de que el servicio esté en ejecución e inténtalo de nuevo.', + retry: 'Reintentar', + enterEmail: 'Introduce la dirección de correo electrónico', + enterPassword: 'Introduce la contraseña', + invalidEmail: + 'Por favor, introduce una dirección de correo electrónico válida', + emptyPassword: 'Por favor, introduce tu contraseña', + language: 'Idioma', + helpDocs: 'Obtener ayuda', + featureRequest: 'Solicitar función', + starOnGitHub: 'Dar estrella en GitHub', + create: 'Crear', + edit: 'Editar', + delete: 'Eliminar', + add: 'Añadir', + select: 'Seleccionar', + cancel: 'Cancelar', + submit: 'Enviar', + error: 'Error', + success: 'Éxito', + save: 'Guardar', + saving: 'Guardando...', + confirm: 'Confirmar', + confirmDelete: 'Confirmar eliminación', + deleteConfirmation: '¿Estás seguro de que deseas eliminar esto?', + selectOption: 'Selecciona una opción', + required: 'Obligatorio', + enable: 'Activar', + name: 'Nombre', + description: 'Descripción', + icon: 'Icono', + close: 'Cerrar', + deleteSuccess: 'Eliminado correctamente', + deleteError: 'Error al eliminar: ', + addRound: 'Añadir ronda', + copy: 'Copiar', + copySuccess: 'Copiado correctamente', + copyFailed: 'Error al copiar', + test: 'Probar', + forgotPassword: '¿Olvidaste tu contraseña?', + agreementNotice: 'Al continuar, aceptas nuestra', + privacyPolicy: 'Política de privacidad', + and: 'y', + dataCollectionPolicy: 'Política de recopilación de datos', + dataCollectionPolicyUrl: + 'https://docs.langbot.app/en/insight/data-collection-policy', + loading: 'Cargando...', + fieldRequired: 'Este campo es obligatorio', + or: 'o', + loginWithSpace: 'Iniciar sesión con Space', + spaceLoginRecommended: + 'Recomendado: Usa API de modelos oficiales estables y servicios en la nube', + loginLocal: 'Iniciar sesión con cuenta local', + loginWithPassword: 'Iniciar sesión con contraseña', + spaceLoginTitle: 'Iniciar sesión con Space', + spaceLoginDescription: + 'Escanea el código QR o visita el enlace para autorizar', + spaceLoginUserCode: 'Tu código', + spaceLoginExpires: 'El código expira en {{seconds}} segundos', + spaceLoginWaiting: 'Esperando autorización...', + spaceLoginSuccess: 'Autorización exitosa', + spaceLoginFailed: 'Error de inicio de sesión con Space', + spaceLoginExpired: + 'El código de autorización ha expirado, por favor inténtalo de nuevo', + spaceLoginCancel: 'Cancelar', + spaceLoginVisitLink: 'Visitar enlace', + spaceLoginProcessing: 'Iniciando sesión con Space', + spaceLoginProcessingDescription: + 'Por favor espera mientras completamos tu inicio de sesión...', + spaceLoginSuccessDescription: 'Redirigiendo a LangBot...', + spaceLoginError: 'Error de inicio de sesión', + spaceLoginNoCode: 'Falta el código de autorización', + backToLogin: 'Volver al inicio de sesión', + backToHome: 'Volver al inicio', + spaceAccountCannotChangePassword: + 'Las cuentas de Space no pueden cambiar la contraseña aquí', + theme: 'Tema', + changePassword: 'Cambiar contraseña', + currentPassword: 'Contraseña actual', + newPassword: 'Nueva contraseña', + confirmNewPassword: 'Confirmar nueva contraseña', + enterCurrentPassword: 'Introduce la contraseña actual', + enterNewPassword: 'Introduce la nueva contraseña', + enterConfirmPassword: 'Confirma la nueva contraseña', + currentPasswordRequired: 'La contraseña actual es obligatoria', + newPasswordRequired: 'La nueva contraseña es obligatoria', + confirmPasswordRequired: 'La confirmación de contraseña es obligatoria', + passwordsDoNotMatch: 'Las contraseñas no coinciden', + changePasswordSuccess: 'Contraseña cambiada correctamente', + changePasswordFailed: + 'Error al cambiar la contraseña, por favor verifica tu contraseña actual', + apiIntegration: 'Integración API', + apiKeys: 'Claves API', + manageApiIntegration: 'Gestionar integración API', + manageApiKeys: 'Gestionar claves API', + createApiKey: 'Crear clave API', + apiKeyName: 'Nombre de la clave API', + apiKeyDescription: 'Descripción de la clave API', + apiKeyValue: 'Valor de la clave API', + apiKeyCreated: 'Clave API creada correctamente', + apiKeyDeleted: 'Clave API eliminada correctamente', + apiKeyDeleteConfirm: '¿Estás seguro de que deseas eliminar esta clave API?', + apiKeyNameRequired: 'El nombre de la clave API es obligatorio', + copyApiKey: 'Copiar clave API', + apiKeyCopied: 'Clave API copiada al portapapeles', + noApiKeys: 'No hay claves API configuradas', + apiKeyHint: + 'Las claves API permiten a sistemas externos acceder a las API del servicio LangBot', + webhooks: 'Webhooks', + createWebhook: 'Crear Webhook', + webhookName: 'Nombre del Webhook', + webhookUrl: 'URL del Webhook', + webhookDescription: 'Descripción del Webhook', + webhookEnabled: 'Activado', + webhookCreated: 'Webhook creado correctamente', + webhookDeleted: 'Webhook eliminado correctamente', + webhookDeleteConfirm: '¿Estás seguro de que deseas eliminar este Webhook?', + webhookNameRequired: 'El nombre del Webhook es obligatorio', + webhookUrlRequired: 'La URL del Webhook es obligatoria', + noWebhooks: 'No hay Webhooks configurados', + webhookHint: + 'Los Webhooks permiten a LangBot enviar eventos de mensajes personales y grupales a sistemas externos', + actions: 'Acciones', + apiKeyCreatedMessage: + 'Por favor copia esta clave API, si el botón no funciona, cópiala manualmente.', + none: 'Ninguno', + more: 'Más ({{count}})', + less: 'Menos', + noItems: 'Sin elementos', + }, + notFound: { + title: 'Página no encontrada', + description: 'La página que buscas no existe.', + back: 'Volver', + home: 'Inicio', + help: 'Obtener ayuda', + }, + models: { + title: 'Modelos', + description: + 'Configura y gestiona los modelos que se pueden usar en los Pipelines', + createModel: 'Crear modelo', + editModel: 'Editar modelo', + getModelListError: 'Error al obtener la lista de modelos: ', + modelName: 'Nombre del modelo', + modelProvider: 'Proveedor del modelo', + modelBaseURL: 'URL base', + modelAbilities: 'Capacidades del modelo', + saveSuccess: 'Guardado correctamente', + saveError: 'Error al guardar: ', + createSuccess: 'Creado correctamente', + createError: 'Error al crear: ', + deleteSuccess: 'Eliminado correctamente', + deleteError: 'Error al eliminar: ', + deleteConfirmation: '¿Estás seguro de que deseas eliminar este modelo?', + modelNameRequired: 'El nombre del modelo no puede estar vacío', + modelProviderRequired: 'El proveedor del modelo no puede estar vacío', + requestURLRequired: 'La URL de solicitud no puede estar vacía', + apiKeyRequired: 'La clave API no puede estar vacía', + keyNameRequired: 'El nombre de la clave no puede estar vacío', + mustBeValidNumber: 'Debe ser un número válido', + mustBeTrueOrFalse: 'Debe ser verdadero o falso', + requestURL: 'URL de solicitud', + apiKey: 'Clave API', + abilities: 'Capacidades', + selectModelAbilities: 'Seleccionar capacidades del modelo', + visionAbility: 'Capacidad de visión', + functionCallAbility: 'Llamada a funciones', + extraParameters: 'Parámetros adicionales', + addParameter: 'Añadir parámetro', + keyName: 'Nombre de la clave', + type: 'Tipo', + value: 'Valor', + string: 'Cadena', + number: 'Número', + boolean: 'Booleano', + selectModelProvider: 'Seleccionar proveedor del modelo', + modelProviderDescription: + 'Por favor, introduce el nombre del modelo proporcionado por el proveedor', + modelManufacturer: 'Fabricante del modelo', + aggregationPlatform: 'Plataforma de agregación', + selfDeployed: 'Autoalojado', + builtin: 'Integrado', + selectModel: 'Seleccionar modelo', + testSuccess: 'Prueba exitosa', + testError: + 'Error en la prueba, por favor verifica la configuración del modelo', + llmModels: 'Modelos LLM', + localProvider: 'Local', + localProviderDescription: 'Modelos configurados y gestionados localmente', + spaceProviderDescription: 'Modelos sincronizados desde tu cuenta de Space', + spaceDisabledForLocalAccount: + 'Inicia sesión con Space para usar modelos en la nube', + syncModels: 'Sincronizar', + syncSuccess: + 'Sincronización completa: {{created}} creados, {{updated}} actualizados', + syncError: 'Error de sincronización: ', + spaceModelReadOnly: 'Los modelos de Space son de solo lectura', + noSpaceModels: + 'No hay modelos de Space. Haz clic en Sincronizar para obtener modelos de Space.', + noLocalModels: + 'No hay modelos locales. Haz clic en Crear para añadir un modelo.', + providerCount: '{{count}} proveedores', + // New keys for provider-based structure + addModel: 'Añadir modelo', + addLLMModel: 'Añadir modelo LLM', + addEmbeddingModel: 'Añadir modelo Embedding', + provider: 'Proveedor', + existingProvider: 'Proveedor existente', + newProvider: 'Nuevo proveedor', + selectProvider: 'Seleccionar proveedor', + requester: 'Tipo de proveedor', + selectRequester: 'Seleccionar tipo de proveedor', + langbotModelsDescription: 'Modelos en la nube impulsados por LangBot Space', + credits: 'Créditos', + loginWithSpace: 'Iniciar sesión con Space', + loginToUseModels: 'Inicia sesión con Space para usar modelos en la nube', + noModels: 'No hay modelos configurados', + langbotModels: 'Modelos LangBot', + spaceTrialTooltip: + '¡Créditos de prueba gratuitos disponibles! Inicia sesión con Space para acceder a modelos en la nube sin configuración.', + unlockModels: 'Inicia sesión para usar', + editProvider: 'Editar proveedor', + addProvider: 'Añadir proveedor', + addProviderHint: 'Añade proveedores para usar modelos de otras fuentes', + addProviderHintSimple: 'Añade proveedores para usar modelos', + noProviders: 'Aún no hay proveedores', + providerName: 'Nombre del proveedor', + providerNameRequired: 'El nombre del proveedor es obligatorio', + requesterRequired: 'El tipo de proveedor es obligatorio', + providerSaved: 'Proveedor guardado', + providerCreated: 'Proveedor creado', + providerSaveError: 'Error al guardar el proveedor: ', + providerDeleted: 'Proveedor eliminado', + providerDeleteError: 'Error al eliminar el proveedor: ', + deleteProviderConfirmation: + '¿Estás seguro de que deseas eliminar este proveedor?', + loadError: 'Error al cargar datos', + chat: 'Chat', + embedding: 'Embedding', + modelsCount: '{{count}} modelo(s)', + expandModels: 'Expandir', + collapseModels: 'Contraer', + fallback: { + primary: 'Modelo principal', + fallbackList: 'Modelos de respaldo', + addFallback: 'Añadir modelo de respaldo', + }, + }, + bots: { + title: 'Bots', + description: + 'Crea y gestiona Bots, que son los puntos de entrada para que LangBot se conecte con diversas plataformas', + createBot: 'Crear Bot', + selectFromSidebar: 'Selecciona un Bot de la barra lateral', + editBot: 'Editar Bot', + getBotListError: 'Error al obtener la lista de Bots: ', + botName: 'Nombre del Bot', + botDescription: 'Descripción del Bot', + botNameRequired: 'El nombre del Bot no puede estar vacío', + botDescriptionRequired: 'La descripción del Bot no puede estar vacía', + adapterRequired: 'El adaptador no puede estar vacío', + defaultDescription: 'Un Bot', + getBotConfigError: 'Error al obtener la configuración del Bot: ', + saveSuccess: 'Guardado correctamente', + saveError: 'Error al guardar: ', + createSuccess: + 'Creado correctamente. Por favor, activa o modifica el Pipeline vinculado', + createError: 'Error al crear: ', + deleteSuccess: 'Eliminado correctamente', + deleteError: 'Error al eliminar: ', + deleteConfirmation: '¿Estás seguro de que deseas eliminar este Bot?', + platformAdapter: 'Selección de plataforma/adaptador', + selectAdapter: 'Seleccionar adaptador', + adapterConfig: 'Configuración del adaptador', + bindPipeline: 'Vincular Pipeline', + selectPipeline: 'Seleccionar Pipeline', + selectBot: 'Seleccionar Bot', + botLogTitle: 'Registro del Bot', + enableAutoRefresh: 'Activar actualización automática', + session: 'Sesión', + yesterday: 'Ayer', + earlier: 'Anterior', + dateFormat: '{{day}}/{{month}}', + setBotEnableError: 'Error al establecer el estado de activación del Bot', + log: 'Registro', + configuration: 'Configuración', + logs: 'Registros', + basicInfo: 'Información básica', + basicInfoDescription: 'Establece el nombre y la descripción del Bot', + routingConnection: 'Enrutamiento y conexión', + routingConnectionDescription: + 'Vincula el Pipeline que procesa los mensajes de este Bot', + adapterConfigDescription: + 'Configura el adaptador de plataforma seleccionado', + dangerZone: 'Zona de peligro', + dangerZoneDescription: 'Acciones irreversibles y destructivas', + deleteBotAction: 'Eliminar este Bot', + deleteBotHint: + 'Una vez eliminado, toda la configuración asociada se eliminará permanentemente.', + webhookUrl: 'URL de callback Webhook', + webhookUrlCopied: 'URL del Webhook copiada', + webhookUrlHint: + 'Haz clic en el campo para seleccionar todo, luego presiona Ctrl+C (Mac: Cmd+C) para copiar, o haz clic en el botón', + webhookUrlHintEither: + 'Usa cualquiera de las dos URL anteriores en la configuración de tu plataforma', + webhookSaasHint: + 'Webhook requiere un dominio accesible públicamente. LangBot Cloud proporciona un punto de acceso público listo para usar para tu Bot.', + webhookSaasLink: 'Más información sobre LangBot Cloud', + adapterCategory: { + popular: 'Popular', + china: 'China', + global: 'Global', + protocol: 'Protocolo', + }, + logLevel: 'Nivel de registro', + allLevels: 'Todos los niveles', + selectLevel: 'Seleccionar nivel', + levelsSelected: 'niveles seleccionados', + viewDetailedLogs: 'Ver registros detallados', + viewDetails: 'Detalles', + collapse: 'Contraer', + imagesAttached: 'imagen(es) adjunta(s)', + noLogs: 'Aún no hay registros', + sessionMonitor: { + title: 'Sesiones', + sessions: 'Sesiones', + noSessions: 'No se encontraron sesiones', + selectSession: 'Selecciona una sesión para ver los mensajes', + noMessages: 'No hay mensajes en esta sesión', + messages: 'mensajes', + messageCount: '{{count}} mensajes', + loading: 'Cargando...', + loadingSessions: 'Cargando sesiones...', + loadingMessages: 'Cargando mensajes...', + user: 'Usuario', + variables: 'Variables', + platform: 'Plataforma', + lastActive: 'Última actividad', + refresh: 'Actualizar', + active: 'Activo', + inactive: 'Inactivo', + }, + }, + plugins: { + title: 'Extensiones', + description: + 'Instala y configura plugins para ampliar la funcionalidad, selecciónalos en la configuración del Pipeline', + createPlugin: 'Crear plugin', + editPlugin: 'Editar plugin', + installed: 'Instalados', + marketplace: 'Tienda', + arrange: 'Ordenar plugins', + install: 'Instalar', + installPlugin: 'Instalar plugin', + onlySupportGithub: 'Actualmente solo se admite la instalación desde GitHub', + enterGithubLink: 'Introduce el enlace de GitHub del plugin', + installing: 'Instalando plugin...', + installSuccess: 'Plugin instalado correctamente', + installFailed: 'Error en la instalación del plugin:', + searchPlugin: 'Buscar plugins', + sortBy: 'Ordenar por', + mostStars: 'Más estrellas', + recentlyAdded: 'Añadidos recientemente', + recentlyUpdated: 'Actualizados recientemente', + noMatchingPlugins: 'No se encontraron plugins coincidentes', + loading: 'Cargando...', + getPluginListError: 'Error al obtener la lista de plugins:', + noPluginInstalled: 'No hay plugins instalados', + pluginConfig: 'Configuración del plugin', + pluginSort: 'Orden de plugins', + pluginSortDescription: + 'El orden de los plugins afecta el orden de procesamiento dentro del mismo evento, arrastra la tarjeta del plugin para ordenar', + pluginSortSuccess: 'Orden de plugins aplicado correctamente', + pluginSortError: 'Error al ordenar plugins: ', + pluginNoConfig: 'El plugin no tiene elementos de configuración.', + systemDisabled: 'Sistema de plugins desactivado', + systemDisabledDesc: + 'El sistema de plugins no está activado, por favor modifica la configuración según la documentación', + connectionError: 'Error de conexión del sistema de plugins', + connectionErrorDesc: + 'Verifica la configuración del sistema de plugins o contacta al administrador.', + errorDetails: 'Detalles del error', + loadingStatus: 'Comprobando el estado del sistema de plugins...', + failedToGetStatus: 'Error al obtener el estado del sistema de plugins', + pluginSystemNotReady: + 'El sistema de plugins no está listo, no se puede realizar esta operación', + debugInfo: 'Información de depuración', + debugInfoTitle: 'Información de depuración del plugin', + debugUrl: 'URL de depuración', + debugKey: 'Clave de depuración', + noDebugKey: '(No establecida)', + debugKeyDisabled: + 'La clave de depuración no está configurada, la depuración del plugin no requiere autenticación', + failedToGetDebugInfo: 'Error al obtener la información de depuración', + copiedToClipboard: 'Copiado al portapapeles', + deleting: 'Eliminando...', + deletePlugin: 'Eliminar plugin', + cancel: 'Cancelar', + saveConfig: 'Guardar configuración', + saving: 'Guardando...', + confirmDeletePlugin: + '¿Estás seguro de que deseas eliminar el plugin ({{author}}/{{name}})?', + deleteDataCheckbox: + 'También eliminar la configuración y el almacenamiento persistente del plugin', + confirmDelete: 'Confirmar eliminación', + deleteError: 'Error al eliminar: ', + close: 'Cerrar', + deleteConfirm: 'Confirmación de eliminación', + deleteSuccess: 'Eliminación exitosa', + modifyFailed: 'Error al modificar: ', + componentName: { + Tool: 'Herramienta', + EventListener: 'Listener de eventos', + Command: 'Comando', + KnowledgeEngine: 'Motor de conocimiento', + Parser: 'Analizador', + }, + uploadLocal: 'Subir local', + debugging: 'Depuración', + uploadLocalPlugin: 'Subir plugin local', + dragToUpload: 'Arrastra el archivo del plugin aquí para subirlo', + unsupportedFileType: + 'Tipo de archivo no soportado, solo se admiten archivos .lbpkg y .zip', + uploadingPlugin: 'Subiendo plugin...', + uploadSuccess: 'Subida exitosa', + uploadFailed: 'Error en la subida', + selectFileToUpload: 'Selecciona el archivo del plugin para subir', + askConfirm: '¿Estás seguro de instalar el plugin "{{name}}" ({{version}})?', + fromGithub: 'Desde GitHub', + fromLocal: 'Desde local', + fromMarketplace: 'Desde la tienda', + componentsList: 'Componentes: ', + noComponents: 'Sin componentes', + delete: 'Eliminar plugin', + update: 'Actualizar plugin', + new: 'Nuevo', + updateConfirm: 'Confirmación de actualización', + confirmUpdatePlugin: + '¿Estás seguro de que deseas actualizar el plugin ({{author}}/{{name}})?', + confirmUpdate: 'Confirmar actualización', + updating: 'Actualizando...', + updateSuccess: 'Plugin actualizado correctamente', + updateError: 'Error al actualizar: ', + saveConfigSuccessNormal: 'Configuración guardada correctamente', + saveConfigError: 'Error al guardar la configuración: ', + config: 'Configuración', + readme: 'Documentación', + viewSource: 'Ver código fuente', + loadingReadme: 'Cargando documentación...', + noReadme: 'Este plugin no proporciona documentación README', + fileUpload: { + tooLarge: 'El tamaño del archivo supera el límite de 10MB', + success: 'Archivo subido correctamente', + failed: 'Error al subir el archivo', + uploading: 'Subiendo...', + chooseFile: 'Elegir archivo', + addFile: 'Añadir archivo', + }, + installFromGithub: 'Desde GitHub', + enterRepoUrl: 'Introduce la URL del repositorio de GitHub', + repoUrlPlaceholder: 'p. ej., https://github.com/owner/repo', + fetchingReleases: 'Obteniendo versiones...', + selectRelease: 'Seleccionar versión', + noReleasesFound: 'No se encontraron versiones', + fetchReleasesError: 'Error al obtener versiones: ', + selectAsset: 'Seleccionar archivo a instalar', + noAssetsFound: 'No hay archivos .lbpkg disponibles en esta versión', + fetchAssetsError: 'Error al obtener archivos: ', + backToReleases: 'Volver a versiones', + backToRepoUrl: 'Volver a la URL del repositorio', + backToAssets: 'Volver a archivos', + releaseTag: 'Etiqueta: {{tag}}', + releaseName: 'Nombre: {{name}}', + publishedAt: 'Publicado el: {{date}}', + prerelease: 'Pre-lanzamiento', + assetSize: 'Tamaño: {{size}}', + confirmInstall: 'Confirmar instalación', + installFromGithubDesc: 'Instalar plugin desde GitHub Release', + goToMarketplace: 'Ir a la tienda', + }, + market: { + searchPlaceholder: 'Buscar plugins...', + searchResults: 'Se encontraron {{count}} plugins', + totalPlugins: 'Total {{count}} plugins', + noPlugins: 'No hay plugins disponibles', + noResults: 'No se encontraron plugins relevantes', + loadingMore: 'Cargando más...', + loading: 'Cargando...', + allLoaded: 'Todos los plugins mostrados', + install: 'Instalar', + installConfirm: + '¿Estás seguro de que deseas instalar el plugin "{{name}}" ({{version}})?', + downloadComplete: 'Descarga del plugin "{{name}}" completada', + installFailed: 'Error en la instalación, por favor inténtalo más tarde', + loadFailed: + 'Error al obtener la lista de plugins, por favor inténtalo más tarde', + noDescription: 'No hay descripción disponible', + notFound: 'No se encontró la información del plugin', + sortBy: 'Ordenar por', + sort: { + recentlyAdded: 'Añadidos recientemente', + recentlyUpdated: 'Actualizados recientemente', + mostDownloads: 'Más descargas', + leastDownloads: 'Menos descargas', + }, + downloads: 'descargas', + download: 'Descargar', + repository: 'Repositorio', + downloadFailed: 'Error en la descarga', + noReadme: 'Este plugin no proporciona documentación README', + description: 'Descripción', + tagLabel: 'Etiquetas', + submissionTitle: 'Tienes un envío de plugin en revisión: {{name}}', + submissionPending: 'Tu envío de plugin está en revisión: {{name}}', + submissionApproved: 'Tu envío de plugin ha sido aprobado: {{name}}', + submissionRejected: 'Tu envío de plugin ha sido rechazado: {{name}}', + clickToRevoke: 'Revocar', + revokeSuccess: 'Revocación exitosa', + revokeFailed: 'Error en la revocación', + submissionDetails: 'Detalles del envío del plugin', + markAsRead: 'Marcar como leído', + markAsReadSuccess: 'Marcado como leído', + markAsReadFailed: 'Error al marcar como leído', + filterByComponent: 'Componente', + allComponents: 'Todos los componentes', + requestPlugin: 'Solicitar plugin', + viewDetails: 'Ver detalles', + deprecated: 'Obsoleto', + deprecatedTooltip: + 'Por favor, instala el plugin de motor de conocimiento correspondiente.', + tags: { + filterByTags: 'Filtrar por etiquetas', + selected: 'seleccionadas', + selectTags: 'Seleccionar etiquetas', + clearAll: 'Borrar todo', + noTags: 'No hay etiquetas disponibles', + }, + }, + mcp: { + title: 'MCP', + createServer: 'Añadir servidor MCP', + editServer: 'Editar servidor MCP', + deleteServer: 'Eliminar servidor MCP', + confirmDeleteServer: + '¿Estás seguro de que deseas eliminar este servidor MCP?', + confirmDeleteTitle: 'Eliminar servidor MCP', + getServerListError: 'Error al obtener la lista de servidores MCP: ', + serverName: 'Nombre del servidor', + serverMode: 'Modo de conexión', + selectMode: 'Seleccionar modo', + stdio: 'Modo Stdio', + sse: 'Modo SSE', + http: 'Modo HTTP', + noServerInstalled: 'No hay servidores MCP configurados', + serverNameRequired: 'El nombre del servidor no puede estar vacío', + commandRequired: 'El comando no puede estar vacío', + urlRequired: 'La URL no puede estar vacía', + timeoutMustBePositive: 'El tiempo de espera debe ser un número positivo', + command: 'Comando', + args: 'Argumentos', + env: 'Variables de entorno', + url: 'URL', + headers: 'Encabezados', + timeout: 'Tiempo de espera', + addArgument: 'Añadir argumento', + addEnvVar: 'Añadir variable de entorno', + addHeader: 'Añadir encabezado', + keyName: 'Nombre de la clave', + value: 'Valor', + testing: 'Probando...', + connecting: 'Conectando...', + testSuccess: 'Prueba exitosa', + testFailed: 'Error en la prueba: ', + testError: 'Error de prueba', + refreshSuccess: 'Actualización exitosa', + refreshFailed: 'Error en la actualización: ', + connectionSuccess: 'Conexión exitosa', + connectionFailed: 'Error de conexión, por favor verifica la URL', + connectionFailedStatus: 'Conexión fallida', + toolsFound: 'herramientas', + unknownError: 'Error desconocido', + noToolsFound: 'No se encontraron herramientas', + parseResultFailed: 'Error al analizar el resultado de la prueba', + noResultReturned: 'La prueba no devolvió resultados', + getTaskFailed: 'Error al obtener el estado de la tarea', + noTaskId: 'No se obtuvo el ID de la tarea', + deleteSuccess: 'Eliminado correctamente', + deleteFailed: 'Error al eliminar: ', + deleteError: 'Error al eliminar: ', + saveSuccess: 'Guardado correctamente', + saveError: 'Error al guardar: ', + createSuccess: 'Creado correctamente', + createFailed: 'Error al crear: ', + createError: 'Error al crear: ', + loadFailed: 'Error al cargar', + modifyFailed: 'Error al modificar: ', + toolCount: 'Herramientas: {{count}}', + statusConnected: 'Conectado', + statusDisconnected: 'Desconectado', + statusError: 'Error de conexión', + statusDisabled: 'Desactivado', + loading: 'Cargando...', + starCount: 'Estrellas: {{count}}', + install: 'Instalar', + installFromGithub: 'Instalar servidor MCP desde GitHub', + add: 'Añadir', + name: 'Nombre', + nameRequired: 'El nombre no puede estar vacío', + sseTimeout: 'Tiempo de espera SSE', + sseTimeoutDescription: 'Tiempo de espera para establecer la conexión SSE', + extraParametersDescription: + 'Parámetros adicionales para configurar el comportamiento específico del servidor MCP', + timeoutMustBeNumber: 'El tiempo de espera debe ser un número', + timeoutNonNegative: 'El tiempo de espera no puede ser negativo', + sseTimeoutMustBeNumber: 'El tiempo de espera SSE debe ser un número', + sseTimeoutNonNegative: 'El tiempo de espera SSE no puede ser negativo', + updateSuccess: 'Actualizado correctamente', + updateFailed: 'Error al actualizar: ', + selectFromSidebar: 'Selecciona un servidor MCP de la barra lateral', + dangerZone: 'Zona de peligro', + dangerZoneDescription: + 'Acciones irreversibles y destructivas para este servidor MCP.', + deleteMCPAction: 'Eliminar este servidor MCP', + deleteMCPHint: + 'Una vez eliminada, la configuración de este servidor MCP no se podrá recuperar.', + }, + pipelines: { + title: 'Pipelines', + description: + 'Los Pipelines definen el flujo de procesamiento de eventos de mensajes, se usan para vincular a los Bots', + createPipeline: 'Crear Pipeline', + selectFromSidebar: 'Selecciona un Pipeline de la barra lateral', + editPipeline: 'Editar Pipeline', + chat: 'Chat', + configuration: 'Configuración', + debugChat: 'Chat de depuración', + getPipelineListError: 'Error al obtener la lista de Pipelines: ', + daysAgo: 'días atrás', + today: 'Hoy', + updateTime: 'Actualizado ', + defaultBadge: 'Predeterminado', + sortBy: 'Ordenar por', + newestCreated: 'Más recientes', + earliestCreated: 'Más antiguos', + recentlyEdited: 'Editados recientemente', + earliestEdited: 'Editados más antiguos', + basicInfo: 'Información básica', + basicInfoDescription: + 'Establece el nombre, icono y descripción del Pipeline', + aiCapabilities: 'IA', + triggerConditions: 'Disparador', + safetyControls: 'Seguridad', + outputProcessing: 'Salida', + nameRequired: 'El nombre no puede estar vacío', + descriptionRequired: 'La descripción no puede estar vacía', + createSuccess: + 'Creado correctamente. Por favor, edita los parámetros del Pipeline', + createError: 'Error al crear: ', + saveSuccess: 'Guardado correctamente', + saveError: 'Error al guardar: ', + copySuffix: ' Copia', + deleteConfirmation: + '¿Estás seguro de que deseas eliminar este Pipeline? Los Bots vinculados a este Pipeline dejarán de funcionar.', + defaultPipelineCannotDelete: + 'El Pipeline predeterminado no se puede eliminar', + deleteSuccess: 'Eliminado correctamente', + deleteError: 'Error al eliminar: ', + copyConfirmTitle: 'Confirmar copia', + copyConfirmation: + '¿Estás seguro de que deseas copiar este Pipeline? Esto creará un nuevo Pipeline con todas las configuraciones.', + unsavedChanges: 'Tienes cambios sin guardar', + dangerZone: 'Zona de peligro', + dangerZoneDescription: 'Acciones irreversibles y destructivas', + deletePipelineAction: 'Eliminar este Pipeline', + deletePipelineHint: + 'Una vez eliminado, los Bots vinculados a este Pipeline dejarán de funcionar.', + copyPipelineAction: 'Copiar este Pipeline', + copyPipelineHint: + 'Crear un nuevo Pipeline con todas las configuraciones duplicadas.', + extensions: { + title: 'Extensiones', + loadError: 'Error al cargar plugins', + saveSuccess: 'Guardado correctamente', + saveError: 'Error al guardar', + noPluginsAvailable: 'No hay plugins disponibles', + disabled: 'Desactivado', + noPluginsSelected: 'No hay plugins seleccionados', + addPlugin: 'Añadir plugin', + selectPlugins: 'Seleccionar plugins', + pluginsTitle: 'Plugins', + mcpServersTitle: 'Servidores MCP', + noMCPServersSelected: 'No hay servidores MCP seleccionados', + addMCPServer: 'Añadir servidor MCP', + selectMCPServers: 'Seleccionar servidores MCP', + toolCount: '{{count}} herramientas', + noPluginsInstalled: 'No hay plugins instalados', + noMCPServersConfigured: 'No hay servidores MCP configurados', + selectAll: 'Seleccionar todo', + enableAllPlugins: 'Activar todos los plugins', + enableAllMCPServers: 'Activar todos los servidores MCP', + allPluginsEnabled: 'Todos los plugins activados', + allMCPServersEnabled: 'Todos los servidores MCP activados', + }, + debugDialog: { + title: 'Chat del Pipeline', + selectPipeline: 'Seleccionar Pipeline', + sessionType: 'Tipo de sesión', + privateChat: 'Chat privado', + groupChat: 'Chat grupal', + send: 'Enviar', + reset: 'Reiniciar conversación', + inputPlaceholder: 'Enviar mensaje {{type}}...', + noMessages: 'Sin mensajes', + userMessage: 'Usuario', + botMessage: 'Bot', + sendFailed: 'Error al enviar', + resetSuccess: 'Conversación reiniciada correctamente', + resetFailed: 'Error al reiniciar', + loadMessagesFailed: 'Error al cargar mensajes', + loadPipelinesFailed: 'Error al cargar Pipelines', + atTips: 'Mencionar al Bot', + streaming: 'Transmisión', + streamOutput: 'Transmisión', + connected: 'WebSocket conectado', + disconnected: 'WebSocket desconectado', + connectionError: 'Error de conexión WebSocket', + connectionFailed: 'Conexión WebSocket fallida', + notConnected: 'WebSocket no conectado, por favor inténtalo más tarde', + imageUploadFailed: 'Error al subir imagen', + reply: 'Responder', + replyTo: 'Responder a', + showMarkdown: 'Mostrar Markdown', + showRaw: 'Mostrar sin formato', + allMembers: 'Todos los miembros', + file: 'Archivo', + voice: 'Voz', + uploadImage: 'Subir imagen', + uploading: 'Subiendo...', + }, + monitoring: { + title: 'Panel de control', + description: + 'Ver registros de ejecución y errores de este Pipeline (últimas 24 horas)', + detailedLogs: 'Registros detallados', + }, + }, + knowledge: { + title: 'Conocimiento', + createKnowledgeBase: 'Crear base de conocimiento', + selectFromSidebar: + 'Selecciona una base de conocimiento de la barra lateral', + editKnowledgeBase: 'Editar base de conocimiento', + selectKnowledgeBase: 'Seleccionar base de conocimiento', + selectKnowledgeBases: 'Seleccionar bases de conocimiento', + addKnowledgeBase: 'Añadir base de conocimiento', + noKnowledgeBaseSelected: 'No hay bases de conocimiento seleccionadas', + empty: 'Vacío', + editDocument: 'Documentos', + description: + 'Configurar bases de conocimiento para mejorar las respuestas del LLM', + metadata: 'Metadatos', + documents: 'Documentos', + kbNameRequired: 'El nombre de la base de conocimiento no puede estar vacío', + kbDescriptionRequired: + 'La descripción de la base de conocimiento no puede estar vacía', + embeddingModelUUIDRequired: 'El modelo Embedding no puede estar vacío', + daysAgo: 'días atrás', + today: 'Hoy', + kbName: 'Nombre de la base de conocimiento', + kbDescription: 'Descripción de la base de conocimiento', + topK: 'Top K', + topKRequired: 'Top K no puede estar vacío', + topKMax: 'El valor máximo de Top K es 30', + topKdescription: + 'Se usa para especificar el número de documentos relevantes a recuperar, con un rango de 1 a 30.', + defaultDescription: 'Una base de conocimiento', + embeddingModelUUID: 'Modelo Embedding', + selectEmbeddingModel: 'Seleccionar modelo Embedding', + embeddingModelDescription: + 'Se usa para vectorizar el texto, puedes configurarlo en la página de Modelos', + updateTime: 'Actualizado ', + cannotChangeEmbeddingModel: + 'El modelo Embedding no se puede modificar una vez creada la base de conocimiento', + updateKnowledgeBaseSuccess: + 'Base de conocimiento actualizada correctamente', + updateKnowledgeBaseFailed: 'Error al actualizar la base de conocimiento: ', + documentsTab: { + name: 'Nombre', + status: 'Estado', + noResults: 'No hay documentos', + dragAndDrop: 'Arrastra y suelta archivos aquí o haz clic para subir', + uploading: 'Subiendo...', + supportedFormats: + 'Admite PDF, Word, TXT, Markdown, HTML, ZIP y otros formatos de documentos', + uploadSuccess: '¡Archivo subido correctamente!', + uploadError: 'Error al subir el archivo: ', + uploadingFile: 'Subiendo archivo...', + fileSizeExceeded: + 'El tamaño del archivo supera el límite de 10MB. Por favor, divídelo en archivos más pequeños.', + actions: 'Acciones', + delete: 'Eliminar archivo', + fileDeleteSuccess: 'Archivo eliminado correctamente', + fileDeleteFailed: 'Error al eliminar el archivo: ', + processing: 'Procesando', + completed: 'Completado', + failed: 'Fallido', + selectParser: 'Seleccionar analizador', + builtInParser: 'Proporcionado por el motor de conocimiento', + noParserAvailable: + 'Ningún analizador admite este tipo de archivo. Por favor, instala un plugin de analizador que pueda manejar este formato.', + confirmUpload: 'Subir', + cancelUpload: 'Cancelar', + }, + deleteKnowledgeBaseConfirmation: + '¿Estás seguro de que deseas eliminar esta base de conocimiento? Todos los documentos de esta base se eliminarán.', + retrieve: 'Prueba de recuperación', + retrieveTest: 'Prueba de recuperación', + query: 'Consulta', + queryPlaceholder: 'Introduce el texto de consulta...', + distance: 'Distancia', + content: 'Contenido', + fileName: 'Nombre del archivo', + noResults: 'Sin resultados', + retrieveError: 'Error en la recuperación: ', + unknownEngine: 'Motor desconocido', + knowledgeEngine: 'Motor de conocimiento', + knowledgeEngineRequired: 'El motor de conocimiento es obligatorio', + selectKnowledgeEngine: 'Seleccionar motor de conocimiento', + builtInEngine: 'Motor integrado', + cannotChangeKnowledgeEngine: + 'El motor de conocimiento no se puede cambiar después de la creación', + basicInfo: 'Información básica', + basicInfoDescription: + 'Establece el nombre, icono y descripción de la base de conocimiento', + engineSettings: 'Configuración del motor', + engineSettingsDescription: + 'Configuración del motor de conocimiento seleccionado', + engineSettingsReadonly: 'solo lectura en modo de edición', + retrievalSettings: 'Configuración de recuperación', + retrievalSettingsDescription: + 'Configura cómo se recuperan los documentos de esta base de conocimiento', + dangerZone: 'Zona de peligro', + dangerZoneDescription: 'Acciones irreversibles y destructivas', + deleteKbAction: 'Eliminar esta base de conocimiento', + deleteKbHint: + 'Una vez eliminada, todos los documentos y datos de esta base de conocimiento se eliminarán permanentemente.', + noEnginesAvailable: 'No hay motores de base de conocimiento disponibles', + installEngineHint: + 'Por favor, instala primero un plugin de "Motor de conocimiento"', + createKnowledgeBaseFailed: 'Error al crear la base de conocimiento: ', + loadKnowledgeBaseFailed: 'Error al cargar la base de conocimiento: ', + deleteKnowledgeBaseFailed: 'Error al eliminar la base de conocimiento: ', + getKnowledgeBaseListError: + 'Error al obtener la lista de bases de conocimiento: ', + embeddingModel: 'Modelo Embedding', + embeddingModelRequired: + 'El modelo Embedding es obligatorio para este motor', + addExternal: 'Añadir base de conocimiento externa', + createExternalSuccess: 'Base de conocimiento externa creada correctamente', + updateExternalSuccess: + 'Base de conocimiento externa actualizada correctamente', + deleteExternalSuccess: + 'Base de conocimiento externa eliminada correctamente', + retriever: 'Recuperador', + selectRetriever: 'Seleccionar un recuperador...', + retrieverConfiguration: 'Configuración del recuperador', + retrieverInstallInfo: + 'Puedes instalar plugins de recuperador de conocimiento desde', + retrieverMarketLink: 'aquí', + migration: { + title: 'Migración de base de conocimiento', + description: + 'La nueva versión ha refactorizado la base de conocimiento en una arquitectura basada en plugins, unificando las bases de conocimiento internas y externas como plugins de "Motor de conocimiento". Se requiere la migración de los datos heredados. Tus datos antiguos se han respaldado automáticamente en la base de datos.', + detected: + 'Se encontraron {{total}} base(s) de conocimiento para migrar ({{internal}} internas, {{external}} externas).', + startWithInstall: 'Auto-instalar plugin y migrar', + startDataOnly: 'Migrar solo datos', + dataOnlyHint: + '"Migrar solo datos" es para entornos sin conexión/intranet. Instala el plugin correspondiente manualmente después de la migración.', + dismiss: 'Descartar datos originales', + running: 'Migrando bases de conocimiento, por favor espera...', + success: 'Migración de base de conocimiento completada', + error: 'Error en la migración de base de conocimiento: ', + dismissError: 'Error en la operación', + retry: 'Reintentar', + }, + }, + register: { + title: 'Inicializar LangBot 👋', + description: 'Es tu primera vez iniciando LangBot', + adminAccountNote: + 'La cuenta que uses aquí se establecerá como cuenta de administrador', + register: 'Registrarse', + initWithSpace: 'Inicializar con Space', + spaceRecommended: + 'Recomendado: Usa API de modelos oficiales estables y servicios en la nube', + spaceInfoTip1: + 'Space proporciona servicios de autenticación unificada de cuentas sin subir ninguna de tu información sensible.', + spaceInfoTip2: + 'Iniciar sesión con una cuenta de Space te da acceso a los modelos de LangBot y otros servicios en la nube, incluyendo créditos gratuitos de llamadas a modelos para ayudarte a comenzar rápidamente.', + spaceInfoTip3: + 'Tu método de inicio de sesión no afecta otras funciones. Puedes configurar y usar modelos de otras fuentes en cualquier momento.', + registerLocal: 'Registrar cuenta local', + registerWithPassword: 'Registrarse con correo electrónico y contraseña', + initSuccess: 'Inicialización exitosa, por favor inicia sesión', + initFailed: 'Error en la inicialización: ', + }, + resetPassword: { + title: 'Restablecer contraseña 🔐', + description: + 'Introduce tu clave de recuperación y nueva contraseña para restablecer la contraseña de tu cuenta', + recoveryKey: 'Clave de recuperación', + recoveryKeyDescription: + 'Almacenada en `system.recovery_key` del archivo de configuración `data/config.yaml`', + newPassword: 'Nueva contraseña', + enterRecoveryKey: 'Introduce la clave de recuperación', + enterNewPassword: 'Introduce la nueva contraseña', + recoveryKeyRequired: 'La clave de recuperación no puede estar vacía', + newPasswordRequired: 'La nueva contraseña no puede estar vacía', + resetPassword: 'Restablecer contraseña', + resetting: 'Restableciendo...', + resetSuccess: + 'Contraseña restablecida correctamente, por favor inicia sesión', + resetFailed: + 'Error al restablecer la contraseña, por favor verifica tu correo y clave de recuperación', + backToLogin: 'Volver al inicio de sesión', + }, + embedding: { + description: 'Gestionar modelos Embedding para la vectorización de texto', + createModel: 'Crear modelo Embedding', + editModel: 'Editar modelo Embedding', + getModelListError: 'Error al obtener la lista de modelos Embedding: ', + embeddingModels: 'Embedding', + extraParametersDescription: + 'Se adjuntarán al cuerpo de la solicitud, como encoding_format, dimensions, etc.', + }, + llm: { + description: 'Gestionar modelos LLM para la generación de conversaciones', + llmModels: 'LLM', + extraParametersDescription: + 'Se adjuntarán al cuerpo de la solicitud, como max_tokens, temperature, top_p, etc.', + }, + version: { + newVersionAvailable: 'Nueva versión disponible', + viewUpdateGuide: 'Ver guía de actualización', + noReleaseNotes: 'No hay notas de la versión disponibles', + }, + account: { + settings: 'Configuración de la cuenta', + setPassword: 'Establecer contraseña', + passwordSetSuccess: 'Contraseña establecida correctamente', + passwordStatus: 'Contraseña local', + passwordSet: 'Establecida', + passwordNotSet: 'No establecida', + passwordSetDescription: + 'La contraseña está establecida, puedes iniciar sesión con correo y contraseña', + spaceStatus: 'Cuenta de Space', + spaceBound: 'Vinculada', + spaceNotBound: 'No vinculada', + spaceBoundDescription: + 'Cuenta de Space vinculada, API de modelos oficiales y servicios en la nube disponibles', + bindSpace: 'Vincular cuenta de Space', + bindSpaceDescription: + 'Vincular para usar API de modelos oficiales y servicios en la nube', + bindSpaceButton: 'Vincular', + bindSpaceConfirmTitle: 'Confirmar vinculación', + bindSpaceConfirmDescription: + 'Estás a punto de vincular tu instancia local a una cuenta de Space', + bindSpaceWarning: + 'Después de vincular, tu correo de inicio de sesión se cambiará de {{localEmail}} al correo de la cuenta de Space.', + bindSpaceSuccess: 'Cuenta de Space vinculada correctamente', + bindSpaceFailed: 'Error al vincular la cuenta de Space', + bindSpaceInvalidState: + 'Solicitud de vinculación no válida. Por favor, inténtalo de nuevo desde la configuración de la cuenta.', + setPasswordHint: + 'Establece una contraseña para iniciar sesión con correo y contraseña', + spaceEmailMismatch: + 'El correo de inicio de sesión de Space no coincide con el correo de la cuenta local', + }, + monitoring: { + title: 'Panel de control', + description: + 'Monitorea las actividades de los Bots, llamadas LLM y rendimiento del sistema', + overview: 'Resumen', + totalMessages: 'Total de mensajes', + llmCallsCount: 'Llamadas LLM', + modelCallsCount: 'Llamadas a modelos', + successRate: 'Tasa de éxito', + activeSessions: 'Sesiones activas', + last24Hours: 'Últimas 24 horas', + filters: { + title: 'Filtros', + bot: 'Bot', + pipeline: 'Pipeline', + allBots: 'Todos los Bots', + selectBot: 'Seleccionar Bot', + allPipelines: 'Todos los Pipelines', + selectPipeline: 'Seleccionar Pipeline', + loading: 'Cargando...', + timeRange: 'Rango de tiempo', + customRange: 'Rango personalizado', + from: 'Desde', + to: 'Hasta', + apply: 'Aplicar', + reset: 'Restablecer filtros', + lastHour: 'Última hora', + last6Hours: 'Últimas 6 horas', + last24Hours: 'Últimas 24 horas', + last7Days: 'Últimos 7 días', + last30Days: 'Últimos 30 días', + }, + tabs: { + messages: 'Registros de mensajes', + llmCalls: 'Llamadas LLM', + embeddingCalls: 'Llamadas Embedding', + modelCalls: 'Llamadas a modelos', + sessions: 'Análisis de sesiones', + errors: 'Registros de errores', + }, + messageList: { + timestamp: 'Marca de tiempo', + bot: 'Bot', + pipeline: 'Pipeline', + message: 'Mensaje', + sessionId: 'ID de sesión', + status: 'Estado', + actions: 'Acciones', + viewDetails: 'Ver detalles', + copyId: 'Copiar ID', + noMessages: 'No se encontraron mensajes', + noMessagesDescription: + 'Intenta ajustar los filtros o vuelve a comprobarlo más tarde', + loading: 'Cargando mensajes...', + loadMore: 'Cargar más', + autoRefresh: 'Actualización automática', + platform: 'Rol', + user: 'Usuario', + level: 'Nivel', + runner: 'Ejecutor', + viewConversation: 'Ver conversación', + }, + llmCalls: { + title: 'Llamadas LLM', + model: 'Modelo', + tokens: 'Tokens', + duration: 'Duración', + cost: 'Coste', + noData: 'No se encontraron llamadas LLM', + inputTokens: 'Tokens de entrada', + outputTokens: 'Tokens de salida', + totalTokens: 'Tokens totales', + avgDuration: 'Duración promedio', + calls: 'Llamadas', + }, + embeddingCalls: { + title: 'Llamadas Embedding', + model: 'Modelo', + tokens: 'Tokens', + duration: 'Duración', + noData: 'No se encontraron llamadas Embedding', + promptTokens: 'Tokens de prompt', + totalTokens: 'Tokens totales', + inputCount: 'Cantidad de entradas', + knowledgeBase: 'Base de conocimiento', + queryText: 'Consulta', + }, + modelCalls: { + title: 'Llamadas a modelos', + llmModel: 'LLM', + embeddingModel: 'Embedding', + embeddingCall: 'Embedding', + retrieveCall: 'Recuperación', + noData: 'No se encontraron llamadas a modelos', + }, + sessions: { + sessionId: 'ID de sesión', + messageCount: 'Mensajes', + duration: 'Duración', + lastActivity: 'Última actividad', + noSessions: 'No se encontraron sesiones', + startTime: 'Hora de inicio', + messageStats: 'Estadísticas de mensajes', + totalMessages: 'Total de mensajes', + successMessages: 'Exitosos', + errorMessages: 'Fallidos', + llmStats: 'Estadísticas LLM', + noData: 'Sesión no encontrada', + }, + errors: { + title: 'Errores', + errorType: 'Tipo de error', + errorMessage: 'Mensaje de error', + occurredAt: 'Ocurrido el', + noErrors: 'No se encontraron errores', + stackTrace: 'Traza de pila', + }, + queries: { + title: 'Consultas', + }, + messageDetails: { + noData: 'No hay llamadas LLM ni errores para esta consulta', + }, + queryVariables: { + title: 'Variables de consulta', + }, + trafficChart: { + title: 'Resumen de tráfico', + messages: 'Mensajes', + llmCalls: 'Llamadas LLM', + noData: 'No hay datos de tráfico disponibles', + }, + viewMonitoring: 'Ver monitoreo', + refreshData: 'Actualizar datos', + exportData: 'Exportar datos', + export: { + title: 'Exportar datos', + exporting: 'Exportando...', + messages: 'Mensajes', + llmCalls: 'Llamadas LLM', + embeddingCalls: 'Llamadas Embedding', + errors: 'Registros de errores', + sessions: 'Sesiones', + }, + }, + limitation: { + maxBotsReached: + 'Se ha alcanzado el número máximo de Bots ({{max}}). Por favor, elimina un Bot existente antes de crear uno nuevo.', + maxPipelinesReached: + 'Se ha alcanzado el número máximo de Pipelines ({{max}}). Por favor, elimina un Pipeline existente antes de crear uno nuevo.', + maxExtensionsReached: + 'Se ha alcanzado el número máximo de extensiones ({{max}}). Por favor, elimina un servidor MCP o plugin existente antes de añadir uno nuevo.', + }, + wizard: { + sidebarDescription: 'Crea un Bot con pasos guiados', + loading: 'Cargando asistente...', + loadError: 'Error al cargar los datos del asistente', + skip: 'Omitir', + skipConfirmMessage: + 'Puedes volver a acceder al asistente de inicio rápido desde la barra lateral más tarde, o crear un Bot manualmente.', + skipConfirmOk: 'Aceptar', + prev: 'Anterior', + next: 'Siguiente', + finish: 'Crear y desplegar', + confirmCreateBot: 'Confirmar, crear Bot', + createSuccess: '¡Pipeline creado y vinculado al Bot correctamente!', + botCreateSuccess: '¡Bot creado correctamente!', + botSaveSuccess: '¡Configuración del Bot guardada y activada!', + createError: 'Error al crear los recursos', + spaceAuthError: 'Error al iniciar la autorización de Space', + skipSaveError: + 'Error al guardar el estado de omisión. Por favor, inténtalo de nuevo.', + completeSaveError: + 'Error al guardar el estado de finalización. Por favor, inténtalo de nuevo.', + step: { + platform: 'Plataforma', + botConfig: 'Configuración del Bot', + aiEngine: 'Motor de IA', + done: 'Listo', + }, + platform: { + title: 'Selecciona una plataforma', + description: + 'Elige la plataforma de mensajería a la que se conectará tu Bot.', + }, + botConfig: { + title: 'Configura tu Bot', + description: + 'Configura tu Bot y verifica que funcione antes de continuar.', + saveBot: 'Guardar y activar Bot', + resaveBot: 'Volver a guardar configuración', + botSaved: + 'Configuración del Bot guardada y activada. Consulta los registros para verificar la conexión.', + logsTitle: 'Registros del Bot', + logsDescription: + 'Monitorea la actividad del Bot para verificar que la conexión con la plataforma funcione.', + }, + aiEngine: { + title: 'Selecciona un motor de IA', + description: + 'Elige el motor de IA que impulsará la inteligencia de tu Bot.', + }, + spaceBanner: { + message: + '¡Conéctate a LangBot Space para obtener créditos de prueba gratuitos y configuración instantánea sin esfuerzo!', + action: 'Autorizar con Space', + }, + config: { + botInfo: 'Información del Bot', + botNamePlaceholder: 'Introduce el nombre del Bot', + botDescPlaceholder: 'Introduce la descripción del Bot (opcional)', + platformConfig: 'Configuración de {{platform}}', + aiConfig: 'Configuración de {{engine}}', + }, + done: { + title: '¡Todo listo!', + description: + 'Tu Bot ha sido creado y conectado al Pipeline de IA. Ahora puedes gestionarlo desde el panel de trabajo.', + backToWorkbench: 'Volver al panel de trabajo', + }, + }, +}; + +export default esES; diff --git a/web/src/i18n/locales/th-TH.ts b/web/src/i18n/locales/th-TH.ts new file mode 100644 index 00000000..c0e6e611 --- /dev/null +++ b/web/src/i18n/locales/th-TH.ts @@ -0,0 +1,1172 @@ +const thTH = { + sidebar: { + home: 'หน้าแรก', + extensions: 'ส่วนขยาย', + installedPlugins: 'ปลั๊กอินที่ติดตั้ง', + pluginMarket: 'ตลาดปลั๊กอิน', + mcpServers: 'เซิร์ฟเวอร์ MCP', + quickStart: 'เริ่มต้นอย่างรวดเร็ว', + }, + common: { + login: 'เข้าสู่ระบบ', + logout: 'ออกจากระบบ', + accountOptions: 'การตั้งค่า', + account: 'บัญชี', + integration: 'การเชื่อมต่อ', + email: 'อีเมล', + password: 'รหัสผ่าน', + welcome: 'ยินดีต้อนรับกลับสู่ LangBot 👋', + continueToLogin: 'เข้าสู่ระบบเพื่อดำเนินการต่อ', + loginSuccess: 'เข้าสู่ระบบสำเร็จ', + loginFailed: 'เข้าสู่ระบบล้มเหลว กรุณาตรวจสอบอีเมลและรหัสผ่าน', + loginLoadError: 'ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์', + loginLoadErrorDesc: + 'ไม่สามารถเชื่อมต่อกับแบ็กเอนด์ LangBot ได้ กรุณาตรวจสอบว่าบริการกำลังทำงานอยู่แล้วลองใหม่อีกครั้ง', + retry: 'ลองใหม่', + enterEmail: 'กรอกที่อยู่อีเมล', + enterPassword: 'กรอกรหัสผ่าน', + invalidEmail: 'กรุณากรอกที่อยู่อีเมลที่ถูกต้อง', + emptyPassword: 'กรุณากรอกรหัสผ่าน', + language: 'ภาษา', + helpDocs: 'ขอความช่วยเหลือ', + featureRequest: 'ขอฟีเจอร์ใหม่', + starOnGitHub: 'ให้ดาวบน GitHub', + create: 'สร้าง', + edit: 'แก้ไข', + delete: 'ลบ', + add: 'เพิ่ม', + select: 'เลือก', + cancel: 'ยกเลิก', + submit: 'ส่ง', + error: 'ข้อผิดพลาด', + success: 'สำเร็จ', + save: 'บันทึก', + saving: 'กำลังบันทึก...', + confirm: 'ยืนยัน', + confirmDelete: 'ยืนยันการลบ', + deleteConfirmation: 'คุณแน่ใจหรือไม่ว่าต้องการลบสิ่งนี้?', + selectOption: 'เลือกตัวเลือก', + required: 'จำเป็น', + enable: 'เปิดใช้งาน', + name: 'ชื่อ', + description: 'คำอธิบาย', + icon: 'ไอคอน', + close: 'ปิด', + deleteSuccess: 'ลบสำเร็จ', + deleteError: 'ลบล้มเหลว: ', + addRound: 'เพิ่มรอบ', + copy: 'คัดลอก', + copySuccess: 'คัดลอกสำเร็จ', + copyFailed: 'คัดลอกล้มเหลว', + test: 'ทดสอบ', + forgotPassword: 'ลืมรหัสผ่าน?', + agreementNotice: 'การดำเนินการต่อแสดงว่าคุณยอมรับ', + privacyPolicy: 'นโยบายความเป็นส่วนตัว', + and: 'และ', + dataCollectionPolicy: 'นโยบายการเก็บรวบรวมข้อมูล', + dataCollectionPolicyUrl: + 'https://docs.langbot.app/en/insight/data-collection-policy', + loading: 'กำลังโหลด...', + fieldRequired: 'ช่องนี้จำเป็นต้องกรอก', + or: 'หรือ', + loginWithSpace: 'เข้าสู่ระบบด้วย Space', + spaceLoginRecommended: + 'แนะนำ: ใช้ API โมเดลที่เสถียรอย่างเป็นทางการและบริการคลาวด์', + loginLocal: 'เข้าสู่ระบบด้วยบัญชีท้องถิ่น', + loginWithPassword: 'เข้าสู่ระบบด้วยรหัสผ่าน', + spaceLoginTitle: 'เข้าสู่ระบบด้วย Space', + spaceLoginDescription: + 'สแกน QR code หรือเข้าชมลิงก์ด้านล่างเพื่อยืนยันสิทธิ์', + spaceLoginUserCode: 'รหัสของคุณ', + spaceLoginExpires: 'รหัสจะหมดอายุใน {{seconds}} วินาที', + spaceLoginWaiting: 'กำลังรอการยืนยันสิทธิ์...', + spaceLoginSuccess: 'ยืนยันสิทธิ์สำเร็จ', + spaceLoginFailed: 'เข้าสู่ระบบ Space ล้มเหลว', + spaceLoginExpired: 'รหัสยืนยันหมดอายุแล้ว กรุณาลองใหม่', + spaceLoginCancel: 'ยกเลิก', + spaceLoginVisitLink: 'เข้าชมลิงก์', + spaceLoginProcessing: 'กำลังเข้าสู่ระบบด้วย Space', + spaceLoginProcessingDescription: 'กรุณารอสักครู่ขณะดำเนินการเข้าสู่ระบบ...', + spaceLoginSuccessDescription: 'กำลังเปลี่ยนเส้นทางไปยัง LangBot...', + spaceLoginError: 'เข้าสู่ระบบล้มเหลว', + spaceLoginNoCode: 'ไม่พบรหัสยืนยันสิทธิ์', + backToLogin: 'กลับไปหน้าเข้าสู่ระบบ', + backToHome: 'กลับไปหน้าแรก', + spaceAccountCannotChangePassword: + 'บัญชี Space ไม่สามารถเปลี่ยนรหัสผ่านได้ที่นี่', + theme: 'ธีม', + changePassword: 'เปลี่ยนรหัสผ่าน', + currentPassword: 'รหัสผ่านปัจจุบัน', + newPassword: 'รหัสผ่านใหม่', + confirmNewPassword: 'ยืนยันรหัสผ่านใหม่', + enterCurrentPassword: 'กรอกรหัสผ่านปัจจุบัน', + enterNewPassword: 'กรอกรหัสผ่านใหม่', + enterConfirmPassword: 'ยืนยันรหัสผ่านใหม่', + currentPasswordRequired: 'กรุณากรอกรหัสผ่านปัจจุบัน', + newPasswordRequired: 'กรุณากรอกรหัสผ่านใหม่', + confirmPasswordRequired: 'กรุณายืนยันรหัสผ่าน', + passwordsDoNotMatch: 'รหัสผ่านไม่ตรงกัน', + changePasswordSuccess: 'เปลี่ยนรหัสผ่านสำเร็จ', + changePasswordFailed: 'เปลี่ยนรหัสผ่านล้มเหลว กรุณาตรวจสอบรหัสผ่านปัจจุบัน', + apiIntegration: 'การเชื่อมต่อ API', + apiKeys: 'คีย์ API', + manageApiIntegration: 'จัดการการเชื่อมต่อ API', + manageApiKeys: 'จัดการคีย์ API', + createApiKey: 'สร้างคีย์ API', + apiKeyName: 'ชื่อคีย์ API', + apiKeyDescription: 'คำอธิบายคีย์ API', + apiKeyValue: 'ค่าคีย์ API', + apiKeyCreated: 'สร้างคีย์ API สำเร็จ', + apiKeyDeleted: 'ลบคีย์ API สำเร็จ', + apiKeyDeleteConfirm: 'คุณแน่ใจหรือไม่ว่าต้องการลบคีย์ API นี้?', + apiKeyNameRequired: 'กรุณากรอกชื่อคีย์ API', + copyApiKey: 'คัดลอกคีย์ API', + apiKeyCopied: 'คัดลอกคีย์ API ไปยังคลิปบอร์ดแล้ว', + noApiKeys: 'ยังไม่มีคีย์ API ที่กำหนดค่า', + apiKeyHint: + 'คีย์ API ช่วยให้ระบบภายนอกสามารถเข้าถึง API บริการของ LangBot ได้', + webhooks: 'Webhooks', + createWebhook: 'สร้าง Webhook', + webhookName: 'ชื่อ Webhook', + webhookUrl: 'URL ของ Webhook', + webhookDescription: 'คำอธิบาย Webhook', + webhookEnabled: 'เปิดใช้งาน', + webhookCreated: 'สร้าง Webhook สำเร็จ', + webhookDeleted: 'ลบ Webhook สำเร็จ', + webhookDeleteConfirm: 'คุณแน่ใจหรือไม่ว่าต้องการลบ Webhook นี้?', + webhookNameRequired: 'กรุณากรอกชื่อ Webhook', + webhookUrlRequired: 'กรุณากรอก URL ของ Webhook', + noWebhooks: 'ยังไม่มี Webhook ที่กำหนดค่า', + webhookHint: + 'Webhooks ช่วยให้ LangBot สามารถส่งเหตุการณ์ข้อความส่วนตัวและกลุ่มไปยังระบบภายนอกได้', + actions: 'การดำเนินการ', + apiKeyCreatedMessage: + 'กรุณาคัดลอกคีย์ API นี้ หากปุ่มไม่ทำงาน กรุณาคัดลอกด้วยตนเอง', + none: 'ไม่มี', + more: 'เพิ่มเติม ({{count}})', + less: 'น้อยลง', + noItems: 'ไม่มีรายการ', + }, + notFound: { + title: 'ไม่พบหน้า', + description: 'หน้าที่คุณกำลังมองหาไม่มีอยู่', + back: 'ย้อนกลับ', + home: 'หน้าแรก', + help: 'ขอความช่วยเหลือ', + }, + models: { + title: 'โมเดล', + description: 'กำหนดค่าและจัดการโมเดลที่สามารถใช้ใน Pipeline', + createModel: 'สร้างโมเดล', + editModel: 'แก้ไขโมเดล', + getModelListError: 'ไม่สามารถดึงรายการโมเดลได้: ', + modelName: 'ชื่อโมเดล', + modelProvider: 'ผู้ให้บริการโมเดล', + modelBaseURL: 'URL พื้นฐาน', + modelAbilities: 'ความสามารถของโมเดล', + saveSuccess: 'บันทึกสำเร็จ', + saveError: 'บันทึกล้มเหลว: ', + createSuccess: 'สร้างสำเร็จ', + createError: 'สร้างล้มเหลว: ', + deleteSuccess: 'ลบสำเร็จ', + deleteError: 'ลบล้มเหลว: ', + deleteConfirmation: 'คุณแน่ใจหรือไม่ว่าต้องการลบโมเดลนี้?', + modelNameRequired: 'ชื่อโมเดลต้องไม่ว่างเปล่า', + modelProviderRequired: 'ผู้ให้บริการโมเดลต้องไม่ว่างเปล่า', + requestURLRequired: 'URL คำขอต้องไม่ว่างเปล่า', + apiKeyRequired: 'API Key ต้องไม่ว่างเปล่า', + keyNameRequired: 'ชื่อคีย์ต้องไม่ว่างเปล่า', + mustBeValidNumber: 'ต้องเป็นตัวเลขที่ถูกต้อง', + mustBeTrueOrFalse: 'ต้องเป็น true หรือ false', + requestURL: 'URL คำขอ', + apiKey: 'API Key', + abilities: 'ความสามารถ', + selectModelAbilities: 'เลือกความสามารถของโมเดล', + visionAbility: 'ความสามารถด้านภาพ', + functionCallAbility: 'การเรียกฟังก์ชัน', + extraParameters: 'พารามิเตอร์เพิ่มเติม', + addParameter: 'เพิ่มพารามิเตอร์', + keyName: 'ชื่อคีย์', + type: 'ประเภท', + value: 'ค่า', + string: 'สตริง', + number: 'ตัวเลข', + boolean: 'บูลีน', + selectModelProvider: 'เลือกผู้ให้บริการโมเดล', + modelProviderDescription: 'กรุณากรอกชื่อโมเดลที่ผู้ให้บริการจัดเตรียมไว้', + modelManufacturer: 'ผู้ผลิตโมเดล', + aggregationPlatform: 'แพลตฟอร์มรวม', + selfDeployed: 'ติดตั้งเอง', + builtin: 'ในตัว', + selectModel: 'เลือกโมเดล', + testSuccess: 'ทดสอบสำเร็จ', + testError: 'ทดสอบล้มเหลว กรุณาตรวจสอบการกำหนดค่าโมเดล', + llmModels: 'โมเดล LLM', + localProvider: 'ท้องถิ่น', + localProviderDescription: 'โมเดลที่กำหนดค่าและจัดการในเครื่อง', + spaceProviderDescription: 'โมเดลที่ซิงค์จากบัญชี Space ของคุณ', + spaceDisabledForLocalAccount: 'เข้าสู่ระบบด้วย Space เพื่อใช้โมเดลคลาวด์', + syncModels: 'ซิงค์', + syncSuccess: + 'ซิงค์เสร็จสมบูรณ์: สร้าง {{created}} รายการ, อัปเดต {{updated}} รายการ', + syncError: 'ซิงค์ล้มเหลว: ', + spaceModelReadOnly: 'โมเดล Space เป็นแบบอ่านอย่างเดียว', + noSpaceModels: 'ไม่มีโมเดล Space คลิกซิงค์เพื่อดึงโมเดลจาก Space', + noLocalModels: 'ไม่มีโมเดลท้องถิ่น คลิกสร้างเพื่อเพิ่มโมเดล', + providerCount: '{{count}} ผู้ให้บริการ', + addModel: 'เพิ่มโมเดล', + addLLMModel: 'เพิ่มโมเดล LLM', + addEmbeddingModel: 'เพิ่มโมเดล Embedding', + provider: 'ผู้ให้บริการ', + existingProvider: 'ผู้ให้บริการที่มีอยู่', + newProvider: 'ผู้ให้บริการใหม่', + selectProvider: 'เลือกผู้ให้บริการ', + requester: 'ประเภทผู้ให้บริการ', + selectRequester: 'เลือกประเภทผู้ให้บริการ', + langbotModelsDescription: 'โมเดลคลาวด์ขับเคลื่อนโดย LangBot Space', + credits: 'เครดิต', + loginWithSpace: 'เข้าสู่ระบบด้วย Space', + loginToUseModels: 'เข้าสู่ระบบด้วย Space เพื่อใช้โมเดลคลาวด์', + noModels: 'ยังไม่มีโมเดลที่กำหนดค่า', + langbotModels: 'โมเดล LangBot', + spaceTrialTooltip: + 'มีเครดิตทดลองใช้งานฟรี! เข้าสู่ระบบด้วย Space เพื่อเข้าถึงโมเดลคลาวด์โดยไม่ต้องตั้งค่า', + unlockModels: 'เข้าสู่ระบบเพื่อใช้งาน', + editProvider: 'แก้ไขผู้ให้บริการ', + addProvider: 'เพิ่มผู้ให้บริการ', + addProviderHint: 'เพิ่มผู้ให้บริการเพื่อใช้โมเดลจากแหล่งอื่น', + addProviderHintSimple: 'เพิ่มผู้ให้บริการเพื่อใช้โมเดล', + noProviders: 'ยังไม่มีผู้ให้บริการ', + providerName: 'ชื่อผู้ให้บริการ', + providerNameRequired: 'กรุณากรอกชื่อผู้ให้บริการ', + requesterRequired: 'กรุณาเลือกประเภทผู้ให้บริการ', + providerSaved: 'บันทึกผู้ให้บริการแล้ว', + providerCreated: 'สร้างผู้ให้บริการแล้ว', + providerSaveError: 'บันทึกผู้ให้บริการล้มเหลว: ', + providerDeleted: 'ลบผู้ให้บริการแล้ว', + providerDeleteError: 'ลบผู้ให้บริการล้มเหลว: ', + deleteProviderConfirmation: 'คุณแน่ใจหรือไม่ว่าต้องการลบผู้ให้บริการนี้?', + loadError: 'โหลดข้อมูลล้มเหลว', + chat: 'แชท', + embedding: 'Embedding', + modelsCount: '{{count}} โมเดล', + expandModels: 'ขยาย', + collapseModels: 'ย่อ', + fallback: { + primary: 'โมเดลหลัก', + fallbackList: 'โมเดลสำรอง', + addFallback: 'เพิ่มโมเดลสำรอง', + }, + }, + bots: { + title: 'Bot', + description: + 'สร้างและจัดการ Bot ซึ่งเป็นจุดเชื่อมต่อของ LangBot กับแพลตฟอร์มต่างๆ', + createBot: 'สร้าง Bot', + selectFromSidebar: 'เลือก Bot จากแถบด้านข้าง', + editBot: 'แก้ไข Bot', + getBotListError: 'ไม่สามารถดึงรายการ Bot ได้: ', + botName: 'ชื่อ Bot', + botDescription: 'คำอธิบาย Bot', + botNameRequired: 'ชื่อ Bot ต้องไม่ว่างเปล่า', + botDescriptionRequired: 'คำอธิบาย Bot ต้องไม่ว่างเปล่า', + adapterRequired: 'อะแดปเตอร์ต้องไม่ว่างเปล่า', + defaultDescription: 'Bot หนึ่งตัว', + getBotConfigError: 'ไม่สามารถดึงการกำหนดค่า Bot ได้: ', + saveSuccess: 'บันทึกสำเร็จ', + saveError: 'บันทึกล้มเหลว: ', + createSuccess: 'สร้างสำเร็จ กรุณาเปิดใช้งานหรือแก้ไข Pipeline ที่ผูกไว้', + createError: 'สร้างล้มเหลว: ', + deleteSuccess: 'ลบสำเร็จ', + deleteError: 'ลบล้มเหลว: ', + deleteConfirmation: 'คุณแน่ใจหรือไม่ว่าต้องการลบ Bot นี้?', + platformAdapter: 'การเลือกแพลตฟอร์ม/อะแดปเตอร์', + selectAdapter: 'เลือกอะแดปเตอร์', + adapterConfig: 'การกำหนดค่าอะแดปเตอร์', + bindPipeline: 'ผูก Pipeline', + selectPipeline: 'เลือก Pipeline', + selectBot: 'เลือก Bot', + botLogTitle: 'บันทึก Bot', + enableAutoRefresh: 'เปิดการรีเฟรชอัตโนมัติ', + session: 'เซสชัน', + yesterday: 'เมื่อวาน', + earlier: 'ก่อนหน้า', + dateFormat: '{{day}}/{{month}}', + setBotEnableError: 'ไม่สามารถตั้งค่าสถานะเปิดใช้งาน Bot ได้', + log: 'บันทึก', + configuration: 'การกำหนดค่า', + logs: 'บันทึก', + basicInfo: 'ข้อมูลพื้นฐาน', + basicInfoDescription: 'ตั้งชื่อและคำอธิบาย Bot', + routingConnection: 'การกำหนดเส้นทางและการเชื่อมต่อ', + routingConnectionDescription: + 'ผูก Pipeline ที่ประมวลผลข้อความสำหรับ Bot นี้', + adapterConfigDescription: 'กำหนดค่าอะแดปเตอร์แพลตฟอร์มที่เลือก', + dangerZone: 'โซนอันตราย', + dangerZoneDescription: 'การดำเนินการที่ย้อนกลับไม่ได้และเป็นอันตราย', + deleteBotAction: 'ลบ Bot นี้', + deleteBotHint: + 'เมื่อลบแล้ว การกำหนดค่าที่เกี่ยวข้องทั้งหมดจะถูกลบอย่างถาวร', + webhookUrl: 'URL เรียกกลับ Webhook', + webhookUrlCopied: 'คัดลอก URL Webhook แล้ว', + webhookUrlHint: + 'คลิกที่ช่องกรอกเพื่อเลือกทั้งหมด จากนั้นกด Ctrl+C (Mac: Cmd+C) เพื่อคัดลอก หรือคลิกปุ่ม', + webhookUrlHintEither: + 'ใช้ URL ใดก็ได้จากสอง URL ด้านบนในการกำหนดค่าแพลตฟอร์มของคุณ', + webhookSaasHint: + 'Webhook ต้องใช้โดเมนที่เข้าถึงได้จากภายนอก LangBot Cloud มี endpoint สาธารณะพร้อมใช้งานสำหรับ Bot ของคุณ', + webhookSaasLink: 'เรียนรู้เพิ่มเติมเกี่ยวกับ LangBot Cloud', + adapterCategory: { + popular: 'ยอดนิยม', + china: 'จีน', + global: 'ทั่วโลก', + protocol: 'โปรโตคอล', + }, + logLevel: 'ระดับบันทึก', + allLevels: 'ทุกระดับ', + selectLevel: 'เลือกระดับ', + levelsSelected: 'ระดับที่เลือก', + viewDetailedLogs: 'ดูบันทึกโดยละเอียด', + viewDetails: 'รายละเอียด', + collapse: 'ย่อ', + imagesAttached: 'รูปภาพที่แนบ', + noLogs: 'ยังไม่มีบันทึก', + sessionMonitor: { + title: 'เซสชัน', + sessions: 'เซสชัน', + noSessions: 'ไม่พบเซสชัน', + selectSession: 'เลือกเซสชันเพื่อดูข้อความ', + noMessages: 'ไม่มีข้อความในเซสชันนี้', + messages: 'ข้อความ', + messageCount: '{{count}} ข้อความ', + loading: 'กำลังโหลด...', + loadingSessions: 'กำลังโหลดเซสชัน...', + loadingMessages: 'กำลังโหลดข้อความ...', + user: 'ผู้ใช้', + variables: 'ตัวแปร', + platform: 'แพลตฟอร์ม', + lastActive: 'ใช้งานล่าสุด', + refresh: 'รีเฟรช', + active: 'ใช้งานอยู่', + inactive: 'ไม่ได้ใช้งาน', + }, + }, + plugins: { + title: 'ส่วนขยาย', + description: + 'ติดตั้งและกำหนดค่าปลั๊กอินเพื่อขยายฟังก์ชันการทำงาน กรุณาเลือกใน Pipeline', + createPlugin: 'สร้างปลั๊กอิน', + editPlugin: 'แก้ไขปลั๊กอิน', + installed: 'ติดตั้งแล้ว', + marketplace: 'ตลาดปลั๊กอิน', + arrange: 'เรียงลำดับปลั๊กอิน', + install: 'ติดตั้ง', + installPlugin: 'ติดตั้งปลั๊กอิน', + onlySupportGithub: 'ปัจจุบันรองรับเฉพาะการติดตั้งจาก GitHub', + enterGithubLink: 'กรอกลิงก์ GitHub ของปลั๊กอิน', + installing: 'กำลังติดตั้งปลั๊กอิน...', + installSuccess: 'ติดตั้งปลั๊กอินสำเร็จ', + installFailed: 'ติดตั้งปลั๊กอินล้มเหลว:', + searchPlugin: 'ค้นหาปลั๊กอิน', + sortBy: 'เรียงตาม', + mostStars: 'ดาวมากที่สุด', + recentlyAdded: 'เพิ่มล่าสุด', + recentlyUpdated: 'อัปเดตล่าสุด', + noMatchingPlugins: 'ไม่พบปลั๊กอินที่ตรงกัน', + loading: 'กำลังโหลด...', + getPluginListError: 'ไม่สามารถดึงรายการปลั๊กอินได้:', + noPluginInstalled: 'ยังไม่มีปลั๊กอินที่ติดตั้ง', + pluginConfig: 'การกำหนดค่าปลั๊กอิน', + pluginSort: 'เรียงลำดับปลั๊กอิน', + pluginSortDescription: + 'ลำดับปลั๊กอินมีผลต่อลำดับการประมวลผลภายในเหตุการณ์เดียวกัน กรุณาลากการ์ดปลั๊กอินเพื่อเรียงลำดับ', + pluginSortSuccess: 'เรียงลำดับปลั๊กอินสำเร็จ', + pluginSortError: 'เรียงลำดับปลั๊กอินล้มเหลว: ', + pluginNoConfig: 'ปลั๊กอินนี้ไม่มีรายการกำหนดค่า', + systemDisabled: 'ระบบปลั๊กอินปิดอยู่', + systemDisabledDesc: + 'ระบบปลั๊กอินไม่ได้เปิดใช้งาน กรุณาแก้ไขการกำหนดค่าตามเอกสาร', + connectionError: 'ข้อผิดพลาดการเชื่อมต่อระบบปลั๊กอิน', + connectionErrorDesc: + 'กรุณาตรวจสอบการกำหนดค่าระบบปลั๊กอินหรือติดต่อผู้ดูแลระบบ', + errorDetails: 'รายละเอียดข้อผิดพลาด', + loadingStatus: 'กำลังตรวจสอบสถานะระบบปลั๊กอิน...', + failedToGetStatus: 'ไม่สามารถดึงสถานะระบบปลั๊กอินได้', + pluginSystemNotReady: 'ระบบปลั๊กอินยังไม่พร้อม ไม่สามารถดำเนินการนี้ได้', + debugInfo: 'ข้อมูลดีบัก', + debugInfoTitle: 'ข้อมูลดีบักปลั๊กอิน', + debugUrl: 'URL ดีบัก', + debugKey: 'คีย์ดีบัก', + noDebugKey: '(ไม่ได้ตั้งค่า)', + debugKeyDisabled: + 'ไม่ได้ตั้งค่าคีย์ดีบัก การดีบักปลั๊กอินไม่ต้องยืนยันตัวตน', + failedToGetDebugInfo: 'ไม่สามารถดึงข้อมูลดีบักได้', + copiedToClipboard: 'คัดลอกไปยังคลิปบอร์ดแล้ว', + deleting: 'กำลังลบ...', + deletePlugin: 'ลบปลั๊กอิน', + cancel: 'ยกเลิก', + saveConfig: 'บันทึกการกำหนดค่า', + saving: 'กำลังบันทึก...', + confirmDeletePlugin: + 'คุณแน่ใจหรือไม่ว่าต้องการลบปลั๊กอิน ({{author}}/{{name}})?', + deleteDataCheckbox: 'ลบการกำหนดค่าปลั๊กอินและที่เก็บข้อมูลถาวรด้วย', + confirmDelete: 'ยืนยันการลบ', + deleteError: 'ลบล้มเหลว: ', + close: 'ปิด', + deleteConfirm: 'ยืนยันการลบ', + deleteSuccess: 'ลบสำเร็จ', + modifyFailed: 'แก้ไขล้มเหลว: ', + componentName: { + Tool: 'เครื่องมือ', + EventListener: 'ตัวรับฟังเหตุการณ์', + Command: 'คำสั่ง', + KnowledgeEngine: 'เครื่องมือความรู้', + Parser: 'ตัวแยกวิเคราะห์', + }, + uploadLocal: 'อัปโหลดจากเครื่อง', + debugging: 'ดีบัก', + uploadLocalPlugin: 'อัปโหลดปลั๊กอินจากเครื่อง', + dragToUpload: 'ลากไฟล์ปลั๊กอินมาวางที่นี่เพื่ออัปโหลด', + unsupportedFileType: 'ประเภทไฟล์ไม่รองรับ รองรับเฉพาะไฟล์ .lbpkg และ .zip', + uploadingPlugin: 'กำลังอัปโหลดปลั๊กอิน...', + uploadSuccess: 'อัปโหลดสำเร็จ', + uploadFailed: 'อัปโหลดล้มเหลว', + selectFileToUpload: 'เลือกไฟล์ปลั๊กอินเพื่ออัปโหลด', + askConfirm: 'คุณแน่ใจหรือไม่ที่จะติดตั้งปลั๊กอิน "{{name}}" ({{version}})?', + fromGithub: 'จาก GitHub', + fromLocal: 'จากเครื่อง', + fromMarketplace: 'จากตลาดปลั๊กอิน', + componentsList: 'ส่วนประกอบ: ', + noComponents: 'ไม่มีส่วนประกอบ', + delete: 'ลบปลั๊กอิน', + update: 'อัปเดตปลั๊กอิน', + new: 'ใหม่', + updateConfirm: 'ยืนยันการอัปเดต', + confirmUpdatePlugin: + 'คุณแน่ใจหรือไม่ว่าต้องการอัปเดตปลั๊กอิน ({{author}}/{{name}})?', + confirmUpdate: 'ยืนยันการอัปเดต', + updating: 'กำลังอัปเดต...', + updateSuccess: 'อัปเดตปลั๊กอินสำเร็จ', + updateError: 'อัปเดตล้มเหลว: ', + saveConfigSuccessNormal: 'บันทึกการกำหนดค่าสำเร็จ', + saveConfigError: 'บันทึกการกำหนดค่าล้มเหลว: ', + config: 'การกำหนดค่า', + readme: 'เอกสาร', + viewSource: 'ดูซอร์สโค้ด', + loadingReadme: 'กำลังโหลดเอกสาร...', + noReadme: 'ปลั๊กอินนี้ไม่มีเอกสาร README', + fileUpload: { + tooLarge: 'ขนาดไฟล์เกินขีดจำกัด 10MB', + success: 'อัปโหลดไฟล์สำเร็จ', + failed: 'อัปโหลดไฟล์ล้มเหลว', + uploading: 'กำลังอัปโหลด...', + chooseFile: 'เลือกไฟล์', + addFile: 'เพิ่มไฟล์', + }, + installFromGithub: 'จาก GitHub', + enterRepoUrl: 'กรอก URL ของ GitHub repository', + repoUrlPlaceholder: 'เช่น https://github.com/owner/repo', + fetchingReleases: 'กำลังดึงรีลีส...', + selectRelease: 'เลือกรีลีส', + noReleasesFound: 'ไม่พบรีลีส', + fetchReleasesError: 'ไม่สามารถดึงรีลีสได้: ', + selectAsset: 'เลือกไฟล์เพื่อติดตั้ง', + noAssetsFound: 'ไม่มีไฟล์ .lbpkg ในรีลีสนี้', + fetchAssetsError: 'ไม่สามารถดึงไฟล์แนบได้: ', + backToReleases: 'กลับไปรีลีส', + backToRepoUrl: 'กลับไป URL ของ repository', + backToAssets: 'กลับไปไฟล์แนบ', + releaseTag: 'แท็ก: {{tag}}', + releaseName: 'ชื่อ: {{name}}', + publishedAt: 'เผยแพร่เมื่อ: {{date}}', + prerelease: 'รุ่นก่อนเผยแพร่', + assetSize: 'ขนาด: {{size}}', + confirmInstall: 'ยืนยันการติดตั้ง', + installFromGithubDesc: 'ติดตั้งปลั๊กอินจาก GitHub Release', + goToMarketplace: 'ไปที่ตลาดปลั๊กอิน', + }, + market: { + searchPlaceholder: 'ค้นหาปลั๊กอิน...', + searchResults: 'พบ {{count}} ปลั๊กอิน', + totalPlugins: 'ทั้งหมด {{count}} ปลั๊กอิน', + noPlugins: 'ไม่มีปลั๊กอินที่พร้อมใช้งาน', + noResults: 'ไม่พบปลั๊กอินที่เกี่ยวข้อง', + loadingMore: 'กำลังโหลดเพิ่มเติม...', + loading: 'กำลังโหลด...', + allLoaded: 'แสดงปลั๊กอินทั้งหมดแล้ว', + install: 'ติดตั้ง', + installConfirm: + 'คุณแน่ใจหรือไม่ว่าต้องการติดตั้งปลั๊กอิน "{{name}}" ({{version}})?', + downloadComplete: 'ดาวน์โหลดปลั๊กอิน "{{name}}" เสร็จสมบูรณ์', + installFailed: 'ติดตั้งล้มเหลว กรุณาลองใหม่ภายหลัง', + loadFailed: 'ไม่สามารถดึงรายการปลั๊กอินได้ กรุณาลองใหม่ภายหลัง', + noDescription: 'ไม่มีคำอธิบาย', + notFound: 'ไม่พบข้อมูลปลั๊กอิน', + sortBy: 'เรียงตาม', + sort: { + recentlyAdded: 'เพิ่มล่าสุด', + recentlyUpdated: 'อัปเดตล่าสุด', + mostDownloads: 'ดาวน์โหลดมากที่สุด', + leastDownloads: 'ดาวน์โหลดน้อยที่สุด', + }, + downloads: 'ดาวน์โหลด', + download: 'ดาวน์โหลด', + repository: 'Repository', + downloadFailed: 'ดาวน์โหลดล้มเหลว', + noReadme: 'ปลั๊กอินนี้ไม่มีเอกสาร README', + description: 'คำอธิบาย', + tagLabel: 'แท็ก', + submissionTitle: 'คุณมีปลั๊กอินที่ส่งเพื่อตรวจสอบอยู่: {{name}}', + submissionPending: 'ปลั๊กอินที่คุณส่งกำลังอยู่ระหว่างการตรวจสอบ: {{name}}', + submissionApproved: 'ปลั๊กอินที่คุณส่งได้รับการอนุมัติแล้ว: {{name}}', + submissionRejected: 'ปลั๊กอินที่คุณส่งถูกปฏิเสธ: {{name}}', + clickToRevoke: 'เพิกถอน', + revokeSuccess: 'เพิกถอนสำเร็จ', + revokeFailed: 'เพิกถอนล้มเหลว', + submissionDetails: 'รายละเอียดการส่งปลั๊กอิน', + markAsRead: 'ทำเครื่องหมายว่าอ่านแล้ว', + markAsReadSuccess: 'ทำเครื่องหมายว่าอ่านแล้ว', + markAsReadFailed: 'ทำเครื่องหมายว่าอ่านแล้วล้มเหลว', + filterByComponent: 'ส่วนประกอบ', + allComponents: 'ส่วนประกอบทั้งหมด', + requestPlugin: 'ขอปลั๊กอิน', + viewDetails: 'ดูรายละเอียด', + deprecated: 'เลิกใช้แล้ว', + deprecatedTooltip: 'กรุณาติดตั้งปลั๊กอินเครื่องมือความรู้ที่เกี่ยวข้อง', + tags: { + filterByTags: 'กรองตามแท็ก', + selected: 'เลือกแล้ว', + selectTags: 'เลือกแท็ก', + clearAll: 'ล้างทั้งหมด', + noTags: 'ไม่มีแท็กที่พร้อมใช้งาน', + }, + }, + mcp: { + title: 'MCP', + createServer: 'เพิ่มเซิร์ฟเวอร์ MCP', + editServer: 'แก้ไขเซิร์ฟเวอร์ MCP', + deleteServer: 'ลบเซิร์ฟเวอร์ MCP', + confirmDeleteServer: 'คุณแน่ใจหรือไม่ว่าต้องการลบเซิร์ฟเวอร์ MCP นี้?', + confirmDeleteTitle: 'ลบเซิร์ฟเวอร์ MCP', + getServerListError: 'ไม่สามารถดึงรายการเซิร์ฟเวอร์ MCP ได้: ', + serverName: 'ชื่อเซิร์ฟเวอร์', + serverMode: 'โหมดการเชื่อมต่อ', + selectMode: 'เลือกโหมด', + stdio: 'โหมด Stdio', + sse: 'โหมด SSE', + http: 'โหมด HTTP', + noServerInstalled: 'ยังไม่มีเซิร์ฟเวอร์ MCP ที่กำหนดค่า', + serverNameRequired: 'ชื่อเซิร์ฟเวอร์ต้องไม่ว่างเปล่า', + commandRequired: 'คำสั่งต้องไม่ว่างเปล่า', + urlRequired: 'URL ต้องไม่ว่างเปล่า', + timeoutMustBePositive: 'ค่าหมดเวลาต้องเป็นตัวเลขบวก', + command: 'คำสั่ง', + args: 'อาร์กิวเมนต์', + env: 'ตัวแปรสภาพแวดล้อม', + url: 'URL', + headers: 'ส่วนหัว', + timeout: 'หมดเวลา', + addArgument: 'เพิ่มอาร์กิวเมนต์', + addEnvVar: 'เพิ่มตัวแปรสภาพแวดล้อม', + addHeader: 'เพิ่มส่วนหัว', + keyName: 'ชื่อคีย์', + value: 'ค่า', + testing: 'กำลังทดสอบ...', + connecting: 'กำลังเชื่อมต่อ...', + testSuccess: 'ทดสอบสำเร็จ', + testFailed: 'ทดสอบล้มเหลว: ', + testError: 'ข้อผิดพลาดในการทดสอบ', + refreshSuccess: 'รีเฟรชสำเร็จ', + refreshFailed: 'รีเฟรชล้มเหลว: ', + connectionSuccess: 'เชื่อมต่อสำเร็จ', + connectionFailed: 'เชื่อมต่อล้มเหลว กรุณาตรวจสอบ URL', + connectionFailedStatus: 'เชื่อมต่อล้มเหลว', + toolsFound: 'เครื่องมือ', + unknownError: 'ข้อผิดพลาดที่ไม่ทราบสาเหตุ', + noToolsFound: 'ไม่พบเครื่องมือ', + parseResultFailed: 'ไม่สามารถแยกวิเคราะห์ผลการทดสอบได้', + noResultReturned: 'การทดสอบไม่ส่งผลลัพธ์กลับมา', + getTaskFailed: 'ไม่สามารถดึงสถานะงานได้', + noTaskId: 'ไม่ได้รับ ID งาน', + deleteSuccess: 'ลบสำเร็จ', + deleteFailed: 'ลบล้มเหลว: ', + deleteError: 'ลบล้มเหลว: ', + saveSuccess: 'บันทึกสำเร็จ', + saveError: 'บันทึกล้มเหลว: ', + createSuccess: 'สร้างสำเร็จ', + createFailed: 'สร้างล้มเหลว: ', + createError: 'สร้างล้มเหลว: ', + loadFailed: 'โหลดล้มเหลว', + modifyFailed: 'แก้ไขล้มเหลว: ', + toolCount: 'เครื่องมือ: {{count}}', + statusConnected: 'เชื่อมต่อแล้ว', + statusDisconnected: 'ไม่ได้เชื่อมต่อ', + statusError: 'ข้อผิดพลาดการเชื่อมต่อ', + statusDisabled: 'ปิดใช้งาน', + loading: 'กำลังโหลด...', + starCount: 'ดาว: {{count}}', + install: 'ติดตั้ง', + installFromGithub: 'ติดตั้งเซิร์ฟเวอร์ MCP จาก GitHub', + add: 'เพิ่ม', + name: 'ชื่อ', + nameRequired: 'ชื่อต้องไม่ว่างเปล่า', + sseTimeout: 'หมดเวลา SSE', + sseTimeoutDescription: 'หมดเวลาสำหรับการสร้างการเชื่อมต่อ SSE', + extraParametersDescription: + 'พารามิเตอร์เพิ่มเติมสำหรับกำหนดค่าพฤติกรรมเฉพาะของเซิร์ฟเวอร์ MCP', + timeoutMustBeNumber: 'ค่าหมดเวลาต้องเป็นตัวเลข', + timeoutNonNegative: 'ค่าหมดเวลาต้องไม่เป็นค่าลบ', + sseTimeoutMustBeNumber: 'ค่าหมดเวลา SSE ต้องเป็นตัวเลข', + sseTimeoutNonNegative: 'ค่าหมดเวลา SSE ต้องไม่เป็นค่าลบ', + updateSuccess: 'อัปเดตสำเร็จ', + updateFailed: 'อัปเดตล้มเหลว: ', + selectFromSidebar: 'เลือกเซิร์ฟเวอร์ MCP จากแถบด้านข้าง', + dangerZone: 'โซนอันตราย', + dangerZoneDescription: + 'การดำเนินการที่ย้อนกลับไม่ได้และเป็นอันตรายสำหรับเซิร์ฟเวอร์ MCP นี้', + deleteMCPAction: 'ลบเซิร์ฟเวอร์ MCP นี้', + deleteMCPHint: + 'เมื่อลบแล้ว การกำหนดค่าเซิร์ฟเวอร์ MCP นี้จะไม่สามารถกู้คืนได้', + }, + pipelines: { + title: 'Pipeline', + description: + 'Pipeline กำหนดกระบวนการประมวลผลเหตุการณ์ข้อความ ใช้เพื่อผูกกับ Bot', + createPipeline: 'สร้าง Pipeline', + selectFromSidebar: 'เลือก Pipeline จากแถบด้านข้าง', + editPipeline: 'แก้ไข Pipeline', + chat: 'แชท', + configuration: 'การกำหนดค่า', + debugChat: 'แชทดีบัก', + getPipelineListError: 'ไม่สามารถดึงรายการ Pipeline ได้: ', + daysAgo: 'วันก่อน', + today: 'วันนี้', + updateTime: 'อัปเดตเมื่อ ', + defaultBadge: 'ค่าเริ่มต้น', + sortBy: 'เรียงตาม', + newestCreated: 'สร้างล่าสุด', + earliestCreated: 'สร้างเก่าสุด', + recentlyEdited: 'แก้ไขล่าสุด', + earliestEdited: 'แก้ไขเก่าสุด', + basicInfo: 'ข้อมูลพื้นฐาน', + basicInfoDescription: 'ตั้งชื่อ ไอคอน และคำอธิบาย Pipeline', + aiCapabilities: 'AI', + triggerConditions: 'ทริกเกอร์', + safetyControls: 'ความปลอดภัย', + outputProcessing: 'เอาต์พุต', + nameRequired: 'ชื่อต้องไม่ว่างเปล่า', + descriptionRequired: 'คำอธิบายต้องไม่ว่างเปล่า', + createSuccess: 'สร้างสำเร็จ กรุณาแก้ไขพารามิเตอร์ Pipeline', + createError: 'สร้างล้มเหลว: ', + saveSuccess: 'บันทึกสำเร็จ', + saveError: 'บันทึกล้มเหลว: ', + copySuffix: ' สำเนา', + deleteConfirmation: + 'คุณแน่ใจหรือไม่ว่าต้องการลบ Pipeline นี้? Bot ที่ผูกกับ Pipeline นี้จะไม่ทำงาน', + defaultPipelineCannotDelete: 'ไม่สามารถลบ Pipeline ค่าเริ่มต้นได้', + deleteSuccess: 'ลบสำเร็จ', + deleteError: 'ลบล้มเหลว: ', + copyConfirmTitle: 'ยืนยันการคัดลอก', + copyConfirmation: + 'คุณแน่ใจหรือไม่ว่าต้องการคัดลอก Pipeline นี้? การดำเนินการนี้จะสร้าง Pipeline ใหม่พร้อมการกำหนดค่าทั้งหมด', + unsavedChanges: 'คุณมีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก', + dangerZone: 'โซนอันตราย', + dangerZoneDescription: 'การดำเนินการที่ย้อนกลับไม่ได้และเป็นอันตราย', + deletePipelineAction: 'ลบ Pipeline นี้', + deletePipelineHint: 'เมื่อลบแล้ว Bot ที่ผูกกับ Pipeline นี้จะหยุดทำงาน', + copyPipelineAction: 'คัดลอก Pipeline นี้', + copyPipelineHint: 'สร้าง Pipeline ใหม่พร้อมการกำหนดค่าทั้งหมดที่คัดลอกมา', + extensions: { + title: 'ส่วนขยาย', + loadError: 'ไม่สามารถโหลดปลั๊กอินได้', + saveSuccess: 'บันทึกสำเร็จ', + saveError: 'บันทึกล้มเหลว', + noPluginsAvailable: 'ไม่มีปลั๊กอินที่พร้อมใช้งาน', + disabled: 'ปิดใช้งาน', + noPluginsSelected: 'ไม่ได้เลือกปลั๊กอิน', + addPlugin: 'เพิ่มปลั๊กอิน', + selectPlugins: 'เลือกปลั๊กอิน', + pluginsTitle: 'ปลั๊กอิน', + mcpServersTitle: 'เซิร์ฟเวอร์ MCP', + noMCPServersSelected: 'ไม่ได้เลือกเซิร์ฟเวอร์ MCP', + addMCPServer: 'เพิ่มเซิร์ฟเวอร์ MCP', + selectMCPServers: 'เลือกเซิร์ฟเวอร์ MCP', + toolCount: '{{count}} เครื่องมือ', + noPluginsInstalled: 'ไม่มีปลั๊กอินที่ติดตั้ง', + noMCPServersConfigured: 'ไม่มีเซิร์ฟเวอร์ MCP ที่กำหนดค่า', + selectAll: 'เลือกทั้งหมด', + enableAllPlugins: 'เปิดใช้งานปลั๊กอินทั้งหมด', + enableAllMCPServers: 'เปิดใช้งานเซิร์ฟเวอร์ MCP ทั้งหมด', + allPluginsEnabled: 'เปิดใช้งานปลั๊กอินทั้งหมดแล้ว', + allMCPServersEnabled: 'เปิดใช้งานเซิร์ฟเวอร์ MCP ทั้งหมดแล้ว', + }, + debugDialog: { + title: 'แชท Pipeline', + selectPipeline: 'เลือก Pipeline', + sessionType: 'ประเภทเซสชัน', + privateChat: 'แชทส่วนตัว', + groupChat: 'แชทกลุ่ม', + send: 'ส่ง', + reset: 'รีเซ็ตการสนทนา', + inputPlaceholder: 'ส่งข้อความ{{type}}...', + noMessages: 'ไม่มีข้อความ', + userMessage: 'ผู้ใช้', + botMessage: 'Bot', + sendFailed: 'ส่งล้มเหลว', + resetSuccess: 'รีเซ็ตการสนทนาสำเร็จ', + resetFailed: 'รีเซ็ตล้มเหลว', + loadMessagesFailed: 'ไม่สามารถโหลดข้อความได้', + loadPipelinesFailed: 'ไม่สามารถโหลด Pipeline ได้', + atTips: 'กล่าวถึง Bot', + streaming: 'สตรีมมิ่ง', + streamOutput: 'สตรีม', + connected: 'เชื่อมต่อ WebSocket แล้ว', + disconnected: 'ยกเลิกการเชื่อมต่อ WebSocket', + connectionError: 'ข้อผิดพลาดการเชื่อมต่อ WebSocket', + connectionFailed: 'เชื่อมต่อ WebSocket ล้มเหลว', + notConnected: 'ยังไม่ได้เชื่อมต่อ WebSocket กรุณาลองใหม่ภายหลัง', + imageUploadFailed: 'อัปโหลดรูปภาพล้มเหลว', + reply: 'ตอบกลับ', + replyTo: 'ตอบกลับถึง', + showMarkdown: 'แสดง Markdown', + showRaw: 'แสดงข้อมูลดิบ', + allMembers: 'สมาชิกทั้งหมด', + file: 'ไฟล์', + voice: 'เสียง', + uploadImage: 'อัปโหลดรูปภาพ', + uploading: 'กำลังอัปโหลด...', + }, + monitoring: { + title: 'แดชบอร์ด', + description: + 'ดูบันทึกการดำเนินการและข้อผิดพลาดของ Pipeline นี้ (24 ชั่วโมงล่าสุด)', + detailedLogs: 'บันทึกโดยละเอียด', + }, + }, + knowledge: { + title: 'ฐานความรู้', + createKnowledgeBase: 'สร้างฐานความรู้', + selectFromSidebar: 'เลือกฐานความรู้จากแถบด้านข้าง', + editKnowledgeBase: 'แก้ไขฐานความรู้', + selectKnowledgeBase: 'เลือกฐานความรู้', + selectKnowledgeBases: 'เลือกฐานความรู้', + addKnowledgeBase: 'เพิ่มฐานความรู้', + noKnowledgeBaseSelected: 'ไม่ได้เลือกฐานความรู้', + empty: 'ว่างเปล่า', + editDocument: 'เอกสาร', + description: 'กำหนดค่าฐานความรู้เพื่อปรับปรุงการตอบสนองของ LLM', + metadata: 'ข้อมูลเมตา', + documents: 'เอกสาร', + kbNameRequired: 'ชื่อฐานความรู้ต้องไม่ว่างเปล่า', + kbDescriptionRequired: 'คำอธิบายฐานความรู้ต้องไม่ว่างเปล่า', + embeddingModelUUIDRequired: 'โมเดล Embedding ต้องไม่ว่างเปล่า', + daysAgo: 'วันก่อน', + today: 'วันนี้', + kbName: 'ชื่อฐานความรู้', + kbDescription: 'คำอธิบายฐานความรู้', + topK: 'Top K', + topKRequired: 'ค่า Top K ต้องไม่ว่างเปล่า', + topKMax: 'ค่าสูงสุดของ Top K คือ 30', + topKdescription: + 'ใช้เพื่อระบุจำนวนเอกสารที่เกี่ยวข้องที่ต้องการดึง มีช่วง 1 ถึง 30', + defaultDescription: 'ฐานความรู้หนึ่งแห่ง', + embeddingModelUUID: 'โมเดล Embedding', + selectEmbeddingModel: 'เลือกโมเดล Embedding', + embeddingModelDescription: + 'ใช้เพื่อแปลงข้อความเป็นเวกเตอร์ คุณสามารถกำหนดค่าได้ในหน้าโมเดล', + updateTime: 'อัปเดตเมื่อ ', + cannotChangeEmbeddingModel: + 'ฐานความรู้ที่สร้างแล้วไม่สามารถเปลี่ยนโมเดล Embedding ได้', + updateKnowledgeBaseSuccess: 'อัปเดตฐานความรู้สำเร็จ', + updateKnowledgeBaseFailed: 'อัปเดตฐานความรู้ล้มเหลว: ', + documentsTab: { + name: 'ชื่อ', + status: 'สถานะ', + noResults: 'ไม่มีเอกสาร', + dragAndDrop: 'ลากและวางไฟล์ที่นี่หรือคลิกเพื่ออัปโหลด', + uploading: 'กำลังอัปโหลด...', + supportedFormats: + 'รองรับไฟล์ PDF, Word, TXT, Markdown, HTML, ZIP และรูปแบบเอกสารอื่นๆ', + uploadSuccess: 'อัปโหลดไฟล์สำเร็จ!', + uploadError: 'อัปโหลดไฟล์ล้มเหลว: ', + uploadingFile: 'กำลังอัปโหลดไฟล์...', + fileSizeExceeded: 'ขนาดไฟล์เกินขีดจำกัด 10MB กรุณาแบ่งเป็นไฟล์ขนาดเล็กลง', + actions: 'การดำเนินการ', + delete: 'ลบไฟล์', + fileDeleteSuccess: 'ลบไฟล์สำเร็จ', + fileDeleteFailed: 'ลบไฟล์ล้มเหลว: ', + processing: 'กำลังประมวลผล', + completed: 'เสร็จสมบูรณ์', + failed: 'ล้มเหลว', + selectParser: 'เลือกตัวแยกวิเคราะห์', + builtInParser: 'จัดเตรียมโดยเครื่องมือความรู้', + noParserAvailable: + 'ไม่มีตัวแยกวิเคราะห์ที่รองรับไฟล์ประเภทนี้ กรุณาติดตั้งปลั๊กอินตัวแยกวิเคราะห์ที่สามารถจัดการรูปแบบนี้ได้', + confirmUpload: 'อัปโหลด', + cancelUpload: 'ยกเลิก', + }, + deleteKnowledgeBaseConfirmation: + 'คุณแน่ใจหรือไม่ว่าต้องการลบฐานความรู้นี้? เอกสารทั้งหมดในฐานความรู้นี้จะถูกลบ', + retrieve: 'ทดสอบการดึงข้อมูล', + retrieveTest: 'ทดสอบการดึงข้อมูล', + query: 'คำค้นหา', + queryPlaceholder: 'กรอกข้อความค้นหา...', + distance: 'ระยะห่าง', + content: 'เนื้อหา', + fileName: 'ชื่อไฟล์', + noResults: 'ไม่มีผลลัพธ์', + retrieveError: 'ดึงข้อมูลล้มเหลว: ', + unknownEngine: 'เครื่องมือไม่ทราบ', + knowledgeEngine: 'เครื่องมือความรู้', + knowledgeEngineRequired: 'กรุณาเลือกเครื่องมือความรู้', + selectKnowledgeEngine: 'เลือกเครื่องมือความรู้', + builtInEngine: 'เครื่องมือในตัว', + cannotChangeKnowledgeEngine: + 'ไม่สามารถเปลี่ยนเครื่องมือความรู้หลังจากสร้างแล้ว', + basicInfo: 'ข้อมูลพื้นฐาน', + basicInfoDescription: 'ตั้งชื่อ ไอคอน และคำอธิบายฐานความรู้', + engineSettings: 'การตั้งค่าเครื่องมือ', + engineSettingsDescription: 'การกำหนดค่าสำหรับเครื่องมือความรู้ที่เลือก', + engineSettingsReadonly: 'อ่านอย่างเดียวในโหมดแก้ไข', + retrievalSettings: 'การตั้งค่าการดึงข้อมูล', + retrievalSettingsDescription: 'กำหนดค่าวิธีดึงเอกสารจากฐานความรู้นี้', + dangerZone: 'โซนอันตราย', + dangerZoneDescription: 'การดำเนินการที่ย้อนกลับไม่ได้และเป็นอันตราย', + deleteKbAction: 'ลบฐานความรู้นี้', + deleteKbHint: + 'เมื่อลบแล้ว เอกสารและข้อมูลทั้งหมดในฐานความรู้นี้จะถูกลบอย่างถาวร', + noEnginesAvailable: 'ไม่มีเครื่องมือฐานความรู้ที่พร้อมใช้งาน', + installEngineHint: 'กรุณาติดตั้งปลั๊กอิน "เครื่องมือความรู้" ก่อน', + createKnowledgeBaseFailed: 'สร้างฐานความรู้ล้มเหลว: ', + loadKnowledgeBaseFailed: 'โหลดฐานความรู้ล้มเหลว: ', + deleteKnowledgeBaseFailed: 'ลบฐานความรู้ล้มเหลว: ', + getKnowledgeBaseListError: 'ไม่สามารถดึงรายการฐานความรู้ได้: ', + embeddingModel: 'โมเดล Embedding', + embeddingModelRequired: 'เครื่องมือนี้ต้องใช้โมเดล Embedding', + addExternal: 'เพิ่มฐานความรู้ภายนอก', + createExternalSuccess: 'สร้างฐานความรู้ภายนอกสำเร็จ', + updateExternalSuccess: 'อัปเดตฐานความรู้ภายนอกสำเร็จ', + deleteExternalSuccess: 'ลบฐานความรู้ภายนอกสำเร็จ', + retriever: 'ตัวดึงข้อมูล', + selectRetriever: 'เลือกตัวดึงข้อมูล...', + retrieverConfiguration: 'การกำหนดค่าตัวดึงข้อมูล', + retrieverInstallInfo: 'คุณสามารถติดตั้งปลั๊กอินตัวดึงข้อมูลความรู้ได้จาก', + retrieverMarketLink: 'ที่นี่', + migration: { + title: 'การย้ายฐานความรู้', + description: + 'เวอร์ชันใหม่ได้ปรับโครงสร้างฐานความรู้เป็นสถาปัตยกรรมแบบปลั๊กอิน รวมฐานความรู้ในตัวและภายนอกเป็นปลั๊กอิน "เครื่องมือความรู้" จำเป็นต้องย้ายข้อมูลฐานความรู้เดิม ข้อมูลเก่าของคุณได้รับการสำรองข้อมูลอัตโนมัติในฐานข้อมูลแล้ว', + detected: + 'พบ {{total}} ฐานความรู้ที่ต้องย้าย ({{internal}} ภายใน, {{external}} ภายนอก)', + startWithInstall: 'ติดตั้งปลั๊กอินอัตโนมัติและย้ายข้อมูล', + startDataOnly: 'ย้ายข้อมูลเท่านั้น', + dataOnlyHint: + '"ย้ายข้อมูลเท่านั้น" สำหรับสภาพแวดล้อมออฟไลน์/อินทราเน็ต กรุณาติดตั้งปลั๊กอินที่เกี่ยวข้องด้วยตนเองหลังจากย้ายข้อมูล', + dismiss: 'ยกเลิกข้อมูลเดิม', + running: 'กำลังย้ายฐานความรู้ กรุณารอ...', + success: 'การย้ายฐานความรู้เสร็จสมบูรณ์', + error: 'การย้ายฐานความรู้ล้มเหลว: ', + dismissError: 'การดำเนินการล้มเหลว', + retry: 'ลองใหม่', + }, + }, + register: { + title: 'เริ่มต้น LangBot 👋', + description: 'นี่เป็นครั้งแรกที่คุณเริ่มใช้งาน LangBot', + adminAccountNote: 'บัญชีที่คุณใช้ที่นี่จะถูกตั้งเป็นบัญชีผู้ดูแลระบบ', + register: 'ลงทะเบียน', + initWithSpace: 'เริ่มต้นด้วย Space', + spaceRecommended: + 'แนะนำ: ใช้ API โมเดลที่เสถียรอย่างเป็นทางการและบริการคลาวด์', + spaceInfoTip1: + 'Space ให้บริการยืนยันตัวตนแบบรวมโดยไม่อัปโหลดข้อมูลสำคัญใดๆ ของคุณ', + spaceInfoTip2: + 'การเข้าสู่ระบบด้วยบัญชี Space ช่วยให้คุณเข้าถึงโมเดล LangBot และบริการคลาวด์อื่นๆ รวมถึงเครดิตเรียกใช้โมเดลฟรีเพื่อช่วยให้คุณเริ่มต้นได้อย่างรวดเร็ว', + spaceInfoTip3: + 'วิธีการเข้าสู่ระบบของคุณไม่มีผลต่อฟีเจอร์อื่นๆ คุณสามารถกำหนดค่าและใช้โมเดลจากแหล่งอื่นได้ตลอดเวลา', + registerLocal: 'ลงทะเบียนบัญชีท้องถิ่น', + registerWithPassword: 'ลงทะเบียนด้วยอีเมลและรหัสผ่าน', + initSuccess: 'เริ่มต้นระบบสำเร็จ กรุณาเข้าสู่ระบบ', + initFailed: 'เริ่มต้นระบบล้มเหลว: ', + }, + resetPassword: { + title: 'รีเซ็ตรหัสผ่าน 🔐', + description: 'กรอกคีย์กู้คืนและรหัสผ่านใหม่เพื่อรีเซ็ตรหัสผ่านบัญชี', + recoveryKey: 'คีย์กู้คืน', + recoveryKeyDescription: + 'เก็บไว้ใน `system.recovery_key` ของไฟล์กำหนดค่า `data/config.yaml`', + newPassword: 'รหัสผ่านใหม่', + enterRecoveryKey: 'กรอกคีย์กู้คืน', + enterNewPassword: 'กรอกรหัสผ่านใหม่', + recoveryKeyRequired: 'คีย์กู้คืนต้องไม่ว่างเปล่า', + newPasswordRequired: 'รหัสผ่านใหม่ต้องไม่ว่างเปล่า', + resetPassword: 'รีเซ็ตรหัสผ่าน', + resetting: 'กำลังรีเซ็ต...', + resetSuccess: 'รีเซ็ตรหัสผ่านสำเร็จ กรุณาเข้าสู่ระบบ', + resetFailed: 'รีเซ็ตรหัสผ่านล้มเหลว กรุณาตรวจสอบอีเมลและคีย์กู้คืน', + backToLogin: 'กลับไปหน้าเข้าสู่ระบบ', + }, + embedding: { + description: 'จัดการโมเดล Embedding สำหรับการแปลงข้อความเป็นเวกเตอร์', + createModel: 'สร้างโมเดล Embedding', + editModel: 'แก้ไขโมเดล Embedding', + getModelListError: 'ไม่สามารถดึงรายการโมเดล Embedding ได้: ', + embeddingModels: 'Embedding', + extraParametersDescription: + 'จะถูกแนบไปกับเนื้อหาคำขอ เช่น encoding_format, dimensions เป็นต้น', + }, + llm: { + description: 'จัดการโมเดล LLM สำหรับการสร้างบทสนทนา', + llmModels: 'LLM', + extraParametersDescription: + 'จะถูกแนบไปกับเนื้อหาคำขอ เช่น max_tokens, temperature, top_p เป็นต้น', + }, + version: { + newVersionAvailable: 'มีเวอร์ชันใหม่', + viewUpdateGuide: 'ดูคู่มือการอัปเดต', + noReleaseNotes: 'ไม่มีบันทึกการเผยแพร่', + }, + account: { + settings: 'การตั้งค่าบัญชี', + setPassword: 'ตั้งรหัสผ่าน', + passwordSetSuccess: 'ตั้งรหัสผ่านสำเร็จ', + passwordStatus: 'รหัสผ่านท้องถิ่น', + passwordSet: 'ตั้งค่าแล้ว', + passwordNotSet: 'ยังไม่ได้ตั้งค่า', + passwordSetDescription: + 'ตั้งรหัสผ่านแล้ว คุณสามารถเข้าสู่ระบบด้วยอีเมลและรหัสผ่าน', + spaceStatus: 'บัญชี Space', + spaceBound: 'ผูกแล้ว', + spaceNotBound: 'ยังไม่ผูก', + spaceBoundDescription: + 'ผูกบัญชี Space แล้ว สามารถใช้ API โมเดลอย่างเป็นทางการและบริการคลาวด์ได้', + bindSpace: 'ผูกบัญชี Space', + bindSpaceDescription: 'ผูกเพื่อใช้ API โมเดลอย่างเป็นทางการและบริการคลาวด์', + bindSpaceButton: 'ผูก', + bindSpaceConfirmTitle: 'ยืนยันการผูก', + bindSpaceConfirmDescription: 'คุณกำลังจะผูกอินสแตนซ์ท้องถิ่นกับบัญชี Space', + bindSpaceWarning: + 'หลังจากผูกแล้ว อีเมลเข้าสู่ระบบของคุณจะเปลี่ยนจาก {{localEmail}} เป็นอีเมลบัญชี Space', + bindSpaceSuccess: 'ผูกบัญชี Space สำเร็จ', + bindSpaceFailed: 'ผูกบัญชี Space ล้มเหลว', + bindSpaceInvalidState: 'คำขอผูกไม่ถูกต้อง กรุณาลองใหม่จากการตั้งค่าบัญชี', + setPasswordHint: 'ตั้งรหัสผ่านเพื่อเข้าสู่ระบบด้วยอีเมลและรหัสผ่าน', + spaceEmailMismatch: 'อีเมลเข้าสู่ระบบ Space ไม่ตรงกับอีเมลบัญชีท้องถิ่น', + }, + monitoring: { + title: 'แดชบอร์ด', + description: 'ตรวจสอบกิจกรรม Bot, การเรียก LLM และประสิทธิภาพของระบบ', + overview: 'ภาพรวม', + totalMessages: 'ข้อความทั้งหมด', + llmCallsCount: 'การเรียก LLM', + modelCallsCount: 'การเรียกโมเดล', + successRate: 'อัตราความสำเร็จ', + activeSessions: 'เซสชันที่ใช้งานอยู่', + last24Hours: '24 ชั่วโมงล่าสุด', + filters: { + title: 'ตัวกรอง', + bot: 'Bot', + pipeline: 'Pipeline', + allBots: 'Bot ทั้งหมด', + selectBot: 'เลือก Bot', + allPipelines: 'Pipeline ทั้งหมด', + selectPipeline: 'เลือก Pipeline', + loading: 'กำลังโหลด...', + timeRange: 'ช่วงเวลา', + customRange: 'ช่วงเวลาที่กำหนดเอง', + from: 'จาก', + to: 'ถึง', + apply: 'นำไปใช้', + reset: 'รีเซ็ตตัวกรอง', + lastHour: '1 ชั่วโมงล่าสุด', + last6Hours: '6 ชั่วโมงล่าสุด', + last24Hours: '24 ชั่วโมงล่าสุด', + last7Days: '7 วันล่าสุด', + last30Days: '30 วันล่าสุด', + }, + tabs: { + messages: 'บันทึกข้อความ', + llmCalls: 'การเรียก LLM', + embeddingCalls: 'การเรียก Embedding', + modelCalls: 'การเรียกโมเดล', + sessions: 'การวิเคราะห์เซสชัน', + errors: 'บันทึกข้อผิดพลาด', + }, + messageList: { + timestamp: 'เวลา', + bot: 'Bot', + pipeline: 'Pipeline', + message: 'ข้อความ', + sessionId: 'ID เซสชัน', + status: 'สถานะ', + actions: 'การดำเนินการ', + viewDetails: 'ดูรายละเอียด', + copyId: 'คัดลอก ID', + noMessages: 'ไม่พบข้อความ', + noMessagesDescription: 'ลองปรับตัวกรองหรือกลับมาตรวจสอบภายหลัง', + loading: 'กำลังโหลดข้อความ...', + loadMore: 'โหลดเพิ่มเติม', + autoRefresh: 'รีเฟรชอัตโนมัติ', + platform: 'บทบาท', + user: 'ผู้ใช้', + level: 'ระดับ', + runner: 'ตัวประมวลผล', + viewConversation: 'ดูการสนทนา', + }, + llmCalls: { + title: 'การเรียก LLM', + model: 'โมเดล', + tokens: 'โทเคน', + duration: 'ระยะเวลา', + cost: 'ค่าใช้จ่าย', + noData: 'ไม่พบการเรียก LLM', + inputTokens: 'โทเคนอินพุต', + outputTokens: 'โทเคนเอาต์พุต', + totalTokens: 'โทเคนทั้งหมด', + avgDuration: 'ระยะเวลาเฉลี่ย', + calls: 'การเรียก', + }, + embeddingCalls: { + title: 'การเรียก Embedding', + model: 'โมเดล', + tokens: 'โทเคน', + duration: 'ระยะเวลา', + noData: 'ไม่พบการเรียก Embedding', + promptTokens: 'โทเคนพรอมต์', + totalTokens: 'โทเคนทั้งหมด', + inputCount: 'จำนวนอินพุต', + knowledgeBase: 'ฐานความรู้', + queryText: 'คำค้นหา', + }, + modelCalls: { + title: 'การเรียกโมเดล', + llmModel: 'LLM', + embeddingModel: 'Embedding', + embeddingCall: 'Embedding', + retrieveCall: 'การดึงข้อมูล', + noData: 'ไม่พบการเรียกโมเดล', + }, + sessions: { + sessionId: 'ID เซสชัน', + messageCount: 'ข้อความ', + duration: 'ระยะเวลา', + lastActivity: 'กิจกรรมล่าสุด', + noSessions: 'ไม่พบเซสชัน', + startTime: 'เวลาเริ่มต้น', + messageStats: 'สถิติข้อความ', + totalMessages: 'ข้อความทั้งหมด', + successMessages: 'สำเร็จ', + errorMessages: 'ล้มเหลว', + llmStats: 'สถิติ LLM', + noData: 'ไม่พบเซสชัน', + }, + errors: { + title: 'ข้อผิดพลาด', + errorType: 'ประเภทข้อผิดพลาด', + errorMessage: 'ข้อความผิดพลาด', + occurredAt: 'เกิดขึ้นเมื่อ', + noErrors: 'ไม่พบข้อผิดพลาด', + stackTrace: 'Stack Trace', + }, + queries: { + title: 'คำค้นหา', + }, + messageDetails: { + noData: 'ไม่มีการเรียก LLM หรือข้อผิดพลาดสำหรับคำค้นหานี้', + }, + queryVariables: { + title: 'ตัวแปรคำค้นหา', + }, + trafficChart: { + title: 'ภาพรวมปริมาณการใช้งาน', + messages: 'ข้อความ', + llmCalls: 'การเรียก LLM', + noData: 'ไม่มีข้อมูลปริมาณการใช้งาน', + }, + viewMonitoring: 'ดูการตรวจสอบ', + refreshData: 'รีเฟรชข้อมูล', + exportData: 'ส่งออกข้อมูล', + export: { + title: 'ส่งออกข้อมูล', + exporting: 'กำลังส่งออก...', + messages: 'ข้อความ', + llmCalls: 'การเรียก LLM', + embeddingCalls: 'การเรียก Embedding', + errors: 'บันทึกข้อผิดพลาด', + sessions: 'เซสชัน', + }, + }, + limitation: { + maxBotsReached: + 'จำนวน Bot สูงสุด ({{max}}) ถึงขีดจำกัดแล้ว กรุณาลบ Bot ที่มีอยู่ก่อนสร้างใหม่', + maxPipelinesReached: + 'จำนวน Pipeline สูงสุด ({{max}}) ถึงขีดจำกัดแล้ว กรุณาลบ Pipeline ที่มีอยู่ก่อนสร้างใหม่', + maxExtensionsReached: + 'จำนวนส่วนขยายสูงสุด ({{max}}) ถึงขีดจำกัดแล้ว กรุณาลบเซิร์ฟเวอร์ MCP หรือปลั๊กอินที่มีอยู่ก่อนเพิ่มใหม่', + }, + wizard: { + sidebarDescription: 'สร้าง Bot ด้วยขั้นตอนที่แนะนำ', + loading: 'กำลังโหลดตัวช่วย...', + loadError: 'ไม่สามารถโหลดข้อมูลตัวช่วยได้', + skip: 'ข้าม', + skipConfirmMessage: + 'คุณสามารถเข้าสู่ตัวช่วยเริ่มต้นอย่างรวดเร็วจากแถบด้านข้างในภายหลัง หรือสร้าง Bot ด้วยตนเอง', + skipConfirmOk: 'ตกลง', + prev: 'ก่อนหน้า', + next: 'ถัดไป', + finish: 'สร้างและติดตั้ง', + confirmCreateBot: 'ยืนยัน สร้าง Bot', + createSuccess: 'สร้าง Pipeline และเชื่อมกับ Bot สำเร็จ!', + botCreateSuccess: 'สร้าง Bot สำเร็จ!', + botSaveSuccess: 'บันทึกและเปิดใช้งาน Bot สำเร็จ!', + createError: 'ไม่สามารถสร้างทรัพยากรได้', + spaceAuthError: 'ไม่สามารถเริ่มต้นการยืนยันสิทธิ์ Space ได้', + skipSaveError: 'ไม่สามารถบันทึกสถานะการข้ามได้ กรุณาลองใหม่', + completeSaveError: 'ไม่สามารถบันทึกสถานะการเสร็จสิ้นได้ กรุณาลองใหม่', + step: { + platform: 'แพลตฟอร์ม', + botConfig: 'ตั้งค่า Bot', + aiEngine: 'เครื่องมือ AI', + done: 'เสร็จสิ้น', + }, + platform: { + title: 'เลือกแพลตฟอร์ม', + description: 'เลือกแพลตฟอร์มข้อความที่ Bot ของคุณจะเชื่อมต่อ', + }, + botConfig: { + title: 'กำหนดค่า Bot ของคุณ', + description: 'ตั้งค่า Bot ของคุณและตรวจสอบว่าทำงานได้ก่อนดำเนินการต่อ', + saveBot: 'บันทึกและเปิดใช้งาน Bot', + resaveBot: 'บันทึกการกำหนดค่าอีกครั้ง', + botSaved: + 'บันทึกและเปิดใช้งาน Bot แล้ว ตรวจสอบบันทึกเพื่อยืนยันการเชื่อมต่อ', + logsTitle: 'บันทึก Bot', + logsDescription: + 'ตรวจสอบกิจกรรม Bot เพื่อยืนยันว่าการเชื่อมต่อแพลตฟอร์มทำงานอยู่', + }, + aiEngine: { + title: 'เลือกเครื่องมือ AI', + description: 'เลือกเครื่องมือ AI ที่จะขับเคลื่อนความฉลาดของ Bot', + }, + spaceBanner: { + message: + 'เชื่อมต่อกับ LangBot Space เพื่อรับเครดิตทดลองใช้โมเดลฟรีและตั้งค่าทันทีโดยไม่ต้องกำหนดค่า!', + action: 'ยืนยันสิทธิ์กับ Space', + }, + config: { + botInfo: 'ข้อมูล Bot', + botNamePlaceholder: 'กรอกชื่อ Bot', + botDescPlaceholder: 'กรอกคำอธิบาย Bot (ไม่บังคับ)', + platformConfig: 'การกำหนดค่า {{platform}}', + aiConfig: 'การกำหนดค่า {{engine}}', + }, + done: { + title: 'เสร็จเรียบร้อย!', + description: + 'Bot ของคุณถูกสร้างและเชื่อมต่อกับ Pipeline AI แล้ว คุณสามารถจัดการได้จากหน้าทำงาน', + backToWorkbench: 'กลับไปหน้าทำงาน', + }, + }, +}; + +export default thTH; diff --git a/web/src/i18n/locales/vi-VN.ts b/web/src/i18n/locales/vi-VN.ts new file mode 100644 index 00000000..3a8e871c --- /dev/null +++ b/web/src/i18n/locales/vi-VN.ts @@ -0,0 +1,1193 @@ +const viVN = { + sidebar: { + home: 'Trang chủ', + extensions: 'Tiện ích mở rộng', + installedPlugins: 'Plugin đã cài đặt', + pluginMarket: 'Chợ ứng dụng', + mcpServers: 'Máy chủ MCP', + quickStart: 'Bắt đầu nhanh', + }, + common: { + login: 'Đăng nhập', + logout: 'Đăng xuất', + accountOptions: 'Cài đặt', + account: 'Tài khoản', + integration: 'Tích hợp', + email: 'Email', + password: 'Mật khẩu', + welcome: 'Chào mừng trở lại LangBot 👋', + continueToLogin: 'Đăng nhập để tiếp tục', + loginSuccess: 'Đăng nhập thành công', + loginFailed: 'Đăng nhập thất bại, vui lòng kiểm tra email và mật khẩu', + loginLoadError: 'Không thể kết nối đến máy chủ', + loginLoadErrorDesc: + 'Không thể kết nối đến máy chủ LangBot. Vui lòng đảm bảo dịch vụ đang chạy và thử lại.', + retry: 'Thử lại', + enterEmail: 'Nhập địa chỉ email', + enterPassword: 'Nhập mật khẩu', + invalidEmail: 'Vui lòng nhập địa chỉ email hợp lệ', + emptyPassword: 'Vui lòng nhập mật khẩu', + language: 'Ngôn ngữ', + helpDocs: 'Trợ giúp', + featureRequest: 'Yêu cầu tính năng', + starOnGitHub: 'Star trên GitHub', + create: 'Tạo', + edit: 'Chỉnh sửa', + delete: 'Xóa', + add: 'Thêm', + select: 'Chọn', + cancel: 'Hủy', + submit: 'Gửi', + error: 'Lỗi', + success: 'Thành công', + save: 'Lưu', + saving: 'Đang lưu...', + confirm: 'Xác nhận', + confirmDelete: 'Xác nhận xóa', + deleteConfirmation: 'Bạn có chắc chắn muốn xóa mục này không?', + selectOption: 'Chọn một tùy chọn', + required: 'Bắt buộc', + enable: 'Bật', + name: 'Tên', + description: 'Mô tả', + icon: 'Biểu tượng', + close: 'Đóng', + deleteSuccess: 'Xóa thành công', + deleteError: 'Xóa thất bại: ', + addRound: 'Thêm lượt', + copy: 'Sao chép', + copySuccess: 'Sao chép thành công', + copyFailed: 'Sao chép thất bại', + test: 'Kiểm tra', + forgotPassword: 'Quên mật khẩu?', + agreementNotice: 'Bằng việc tiếp tục, bạn đồng ý với', + privacyPolicy: 'Chính sách bảo mật', + and: 'và', + dataCollectionPolicy: 'Chính sách thu thập dữ liệu', + dataCollectionPolicyUrl: + 'https://docs.langbot.app/en/insight/data-collection-policy', + loading: 'Đang tải...', + fieldRequired: 'Trường này là bắt buộc', + or: 'hoặc', + loginWithSpace: 'Đăng nhập với Space', + spaceLoginRecommended: + 'Khuyến nghị: Sử dụng API mô hình ổn định chính thức và dịch vụ đám mây', + loginLocal: 'Đăng nhập với tài khoản cục bộ', + loginWithPassword: 'Đăng nhập bằng mật khẩu', + spaceLoginTitle: 'Đăng nhập với Space', + spaceLoginDescription: + 'Quét mã QR hoặc truy cập liên kết bên dưới để ủy quyền', + spaceLoginUserCode: 'Mã của bạn', + spaceLoginExpires: 'Mã hết hạn sau {{seconds}} giây', + spaceLoginWaiting: 'Đang chờ ủy quyền...', + spaceLoginSuccess: 'Ủy quyền thành công', + spaceLoginFailed: 'Đăng nhập Space thất bại', + spaceLoginExpired: 'Mã ủy quyền đã hết hạn, vui lòng thử lại', + spaceLoginCancel: 'Hủy', + spaceLoginVisitLink: 'Truy cập liên kết', + spaceLoginProcessing: 'Đang đăng nhập với Space', + spaceLoginProcessingDescription: + 'Vui lòng chờ trong khi chúng tôi hoàn tất đăng nhập...', + spaceLoginSuccessDescription: 'Đang chuyển hướng đến LangBot...', + spaceLoginError: 'Đăng nhập thất bại', + spaceLoginNoCode: 'Thiếu mã ủy quyền', + backToLogin: 'Quay lại đăng nhập', + backToHome: 'Quay lại trang chủ', + spaceAccountCannotChangePassword: + 'Tài khoản Space không thể đổi mật khẩu tại đây', + theme: 'Giao diện', + changePassword: 'Đổi mật khẩu', + currentPassword: 'Mật khẩu hiện tại', + newPassword: 'Mật khẩu mới', + confirmNewPassword: 'Xác nhận mật khẩu mới', + enterCurrentPassword: 'Nhập mật khẩu hiện tại', + enterNewPassword: 'Nhập mật khẩu mới', + enterConfirmPassword: 'Xác nhận mật khẩu mới', + currentPasswordRequired: 'Mật khẩu hiện tại là bắt buộc', + newPasswordRequired: 'Mật khẩu mới là bắt buộc', + confirmPasswordRequired: 'Xác nhận mật khẩu là bắt buộc', + passwordsDoNotMatch: 'Mật khẩu không khớp', + changePasswordSuccess: 'Đổi mật khẩu thành công', + changePasswordFailed: + 'Đổi mật khẩu thất bại, vui lòng kiểm tra mật khẩu hiện tại', + apiIntegration: 'Tích hợp API', + apiKeys: 'Khóa API', + manageApiIntegration: 'Quản lý tích hợp API', + manageApiKeys: 'Quản lý khóa API', + createApiKey: 'Tạo khóa API', + apiKeyName: 'Tên khóa API', + apiKeyDescription: 'Mô tả khóa API', + apiKeyValue: 'Giá trị khóa API', + apiKeyCreated: 'Tạo khóa API thành công', + apiKeyDeleted: 'Xóa khóa API thành công', + apiKeyDeleteConfirm: 'Bạn có chắc chắn muốn xóa khóa API này không?', + apiKeyNameRequired: 'Tên khóa API là bắt buộc', + copyApiKey: 'Sao chép khóa API', + apiKeyCopied: 'Đã sao chép khóa API vào clipboard', + noApiKeys: 'Chưa cấu hình khóa API nào', + apiKeyHint: + 'Khóa API cho phép các hệ thống bên ngoài truy cập API dịch vụ LangBot', + webhooks: 'Webhooks', + createWebhook: 'Tạo Webhook', + webhookName: 'Tên Webhook', + webhookUrl: 'URL Webhook', + webhookDescription: 'Mô tả Webhook', + webhookEnabled: 'Đã bật', + webhookCreated: 'Tạo Webhook thành công', + webhookDeleted: 'Xóa Webhook thành công', + webhookDeleteConfirm: 'Bạn có chắc chắn muốn xóa Webhook này không?', + webhookNameRequired: 'Tên Webhook là bắt buộc', + webhookUrlRequired: 'URL Webhook là bắt buộc', + noWebhooks: 'Chưa cấu hình Webhook nào', + webhookHint: + 'Webhooks cho phép LangBot đẩy sự kiện tin nhắn cá nhân và nhóm đến các hệ thống bên ngoài', + actions: 'Hành động', + apiKeyCreatedMessage: + 'Vui lòng sao chép khóa API này, nếu nút không hoạt động, vui lòng sao chép thủ công.', + none: 'Không có', + more: 'Thêm ({{count}})', + less: 'Thu gọn', + noItems: 'Không có mục nào', + }, + notFound: { + title: 'Không tìm thấy trang', + description: 'Trang bạn đang tìm kiếm không tồn tại.', + back: 'Quay lại', + home: 'Trang chủ', + help: 'Trợ giúp', + }, + models: { + title: 'Mô hình', + description: + 'Cấu hình và quản lý các mô hình có thể sử dụng trong Pipeline', + createModel: 'Tạo mô hình', + editModel: 'Chỉnh sửa mô hình', + getModelListError: 'Lấy danh sách mô hình thất bại: ', + modelName: 'Tên mô hình', + modelProvider: 'Nhà cung cấp mô hình', + modelBaseURL: 'URL cơ sở', + modelAbilities: 'Khả năng mô hình', + saveSuccess: 'Lưu thành công', + saveError: 'Lưu thất bại: ', + createSuccess: 'Tạo thành công', + createError: 'Tạo thất bại: ', + deleteSuccess: 'Xóa thành công', + deleteError: 'Xóa thất bại: ', + deleteConfirmation: 'Bạn có chắc chắn muốn xóa mô hình này không?', + modelNameRequired: 'Tên mô hình không được để trống', + modelProviderRequired: 'Nhà cung cấp mô hình không được để trống', + requestURLRequired: 'URL yêu cầu không được để trống', + apiKeyRequired: 'API Key không được để trống', + keyNameRequired: 'Tên khóa không được để trống', + mustBeValidNumber: 'Phải là một số hợp lệ', + mustBeTrueOrFalse: 'Phải là true hoặc false', + requestURL: 'URL yêu cầu', + apiKey: 'API Key', + abilities: 'Khả năng', + selectModelAbilities: 'Chọn khả năng mô hình', + visionAbility: 'Khả năng thị giác', + functionCallAbility: 'Gọi hàm', + extraParameters: 'Tham số bổ sung', + addParameter: 'Thêm tham số', + keyName: 'Tên khóa', + type: 'Loại', + value: 'Giá trị', + string: 'Chuỗi', + number: 'Số', + boolean: 'Boolean', + selectModelProvider: 'Chọn nhà cung cấp mô hình', + modelProviderDescription: + 'Vui lòng điền tên mô hình do nhà cung cấp cung cấp', + modelManufacturer: 'Nhà sản xuất mô hình', + aggregationPlatform: 'Nền tảng tổng hợp', + selfDeployed: 'Tự triển khai', + builtin: 'Tích hợp sẵn', + selectModel: 'Chọn mô hình', + testSuccess: 'Kiểm tra thành công', + testError: 'Kiểm tra thất bại, vui lòng kiểm tra cấu hình mô hình', + llmModels: 'Mô hình LLM', + localProvider: 'Cục bộ', + localProviderDescription: 'Các mô hình được cấu hình và quản lý cục bộ', + spaceProviderDescription: + 'Các mô hình được đồng bộ từ tài khoản Space của bạn', + spaceDisabledForLocalAccount: + 'Đăng nhập với Space để sử dụng mô hình đám mây', + syncModels: 'Đồng bộ', + syncSuccess: + 'Đồng bộ hoàn tất: {{created}} đã tạo, {{updated}} đã cập nhật', + syncError: 'Đồng bộ thất bại: ', + spaceModelReadOnly: 'Mô hình Space chỉ đọc', + noSpaceModels: + 'Không có mô hình Space. Nhấn Đồng bộ để lấy mô hình từ Space.', + noLocalModels: 'Không có mô hình cục bộ. Nhấn Tạo để thêm mô hình.', + providerCount: '{{count}} nhà cung cấp', + addModel: 'Thêm mô hình', + addLLMModel: 'Thêm mô hình LLM', + addEmbeddingModel: 'Thêm mô hình Embedding', + provider: 'Nhà cung cấp', + existingProvider: 'Nhà cung cấp hiện có', + newProvider: 'Nhà cung cấp mới', + selectProvider: 'Chọn nhà cung cấp', + requester: 'Loại nhà cung cấp', + selectRequester: 'Chọn loại nhà cung cấp', + langbotModelsDescription: 'Mô hình đám mây được cung cấp bởi LangBot Space', + credits: 'Tín dụng', + loginWithSpace: 'Đăng nhập với Space', + loginToUseModels: 'Đăng nhập với Space để sử dụng mô hình đám mây', + noModels: 'Chưa cấu hình mô hình nào', + langbotModels: 'Mô hình LangBot', + spaceTrialTooltip: + 'Có tín dụng dùng thử miễn phí! Đăng nhập với Space để truy cập mô hình đám mây không cần cấu hình.', + unlockModels: 'Đăng nhập để sử dụng', + editProvider: 'Chỉnh sửa nhà cung cấp', + addProvider: 'Thêm nhà cung cấp', + addProviderHint: 'Thêm nhà cung cấp để sử dụng mô hình từ các nguồn khác', + addProviderHintSimple: 'Thêm nhà cung cấp để sử dụng mô hình', + noProviders: 'Chưa có nhà cung cấp nào', + providerName: 'Tên nhà cung cấp', + providerNameRequired: 'Tên nhà cung cấp là bắt buộc', + requesterRequired: 'Loại nhà cung cấp là bắt buộc', + providerSaved: 'Đã lưu nhà cung cấp', + providerCreated: 'Đã tạo nhà cung cấp', + providerSaveError: 'Lưu nhà cung cấp thất bại: ', + providerDeleted: 'Đã xóa nhà cung cấp', + providerDeleteError: 'Xóa nhà cung cấp thất bại: ', + deleteProviderConfirmation: + 'Bạn có chắc chắn muốn xóa nhà cung cấp này không?', + loadError: 'Tải dữ liệu thất bại', + chat: 'Trò chuyện', + embedding: 'Embedding', + modelsCount: '{{count}} mô hình', + expandModels: 'Mở rộng', + collapseModels: 'Thu gọn', + fallback: { + primary: 'Mô hình chính', + fallbackList: 'Mô hình dự phòng', + addFallback: 'Thêm mô hình dự phòng', + }, + }, + bots: { + title: 'Bot', + description: + 'Tạo và quản lý Bot, là điểm kết nối của LangBot với các nền tảng khác nhau', + createBot: 'Tạo Bot', + selectFromSidebar: 'Chọn một Bot từ thanh bên', + editBot: 'Chỉnh sửa Bot', + getBotListError: 'Lấy danh sách Bot thất bại: ', + botName: 'Tên Bot', + botDescription: 'Mô tả Bot', + botNameRequired: 'Tên Bot không được để trống', + botDescriptionRequired: 'Mô tả Bot không được để trống', + adapterRequired: 'Adapter không được để trống', + defaultDescription: 'Một Bot', + getBotConfigError: 'Lấy cấu hình Bot thất bại: ', + saveSuccess: 'Lưu thành công', + saveError: 'Lưu thất bại: ', + createSuccess: + 'Tạo thành công. Vui lòng bật hoặc sửa đổi Pipeline đã liên kết', + createError: 'Tạo thất bại: ', + deleteSuccess: 'Xóa thành công', + deleteError: 'Xóa thất bại: ', + deleteConfirmation: 'Bạn có chắc chắn muốn xóa Bot này không?', + platformAdapter: 'Nền tảng/Lựa chọn Adapter', + selectAdapter: 'Chọn Adapter', + adapterConfig: 'Cấu hình Adapter', + bindPipeline: 'Liên kết Pipeline', + selectPipeline: 'Chọn Pipeline', + selectBot: 'Chọn Bot', + botLogTitle: 'Nhật ký Bot', + enableAutoRefresh: 'Bật tự động làm mới', + session: 'Phiên', + yesterday: 'Hôm qua', + earlier: 'Trước đó', + dateFormat: '{{day}}/{{month}}', + setBotEnableError: 'Thiết lập trạng thái bật Bot thất bại', + log: 'Nhật ký', + configuration: 'Cấu hình', + logs: 'Nhật ký', + basicInfo: 'Thông tin cơ bản', + basicInfoDescription: 'Đặt tên và mô tả Bot', + routingConnection: 'Định tuyến & Kết nối', + routingConnectionDescription: + 'Liên kết Pipeline xử lý tin nhắn cho Bot này', + adapterConfigDescription: 'Cấu hình Adapter nền tảng đã chọn', + dangerZone: 'Vùng nguy hiểm', + dangerZoneDescription: 'Các hành động không thể đảo ngược và phá hủy', + deleteBotAction: 'Xóa Bot này', + deleteBotHint: + 'Sau khi xóa, tất cả cấu hình liên quan sẽ bị xóa vĩnh viễn.', + webhookUrl: 'URL Webhook Callback', + webhookUrlCopied: 'Đã sao chép URL Webhook', + webhookUrlHint: + 'Nhấp vào ô nhập để chọn tất cả, sau đó nhấn Ctrl+C (Mac: Cmd+C) để sao chép, hoặc nhấn nút', + webhookUrlHintEither: + 'Sử dụng một trong hai URL trên trong cấu hình nền tảng của bạn', + webhookSaasHint: + 'Webhook yêu cầu một tên miền có thể truy cập công khai. LangBot Cloud cung cấp điểm cuối công khai sẵn sàng sử dụng cho Bot của bạn.', + webhookSaasLink: 'Tìm hiểu thêm về LangBot Cloud', + adapterCategory: { + popular: 'Phổ biến', + china: 'Trung Quốc', + global: 'Toàn cầu', + protocol: 'Giao thức', + }, + logLevel: 'Mức nhật ký', + allLevels: 'Tất cả các mức', + selectLevel: 'Chọn mức', + levelsSelected: 'mức đã chọn', + viewDetailedLogs: 'Xem nhật ký chi tiết', + viewDetails: 'Chi tiết', + collapse: 'Thu gọn', + imagesAttached: 'hình ảnh đính kèm', + noLogs: 'Chưa có nhật ký', + sessionMonitor: { + title: 'Phiên', + sessions: 'Phiên', + noSessions: 'Không tìm thấy phiên nào', + selectSession: 'Chọn một phiên để xem tin nhắn', + noMessages: 'Không có tin nhắn trong phiên này', + messages: 'tin nhắn', + messageCount: '{{count}} tin nhắn', + loading: 'Đang tải...', + loadingSessions: 'Đang tải phiên...', + loadingMessages: 'Đang tải tin nhắn...', + user: 'Người dùng', + variables: 'Biến', + platform: 'Nền tảng', + lastActive: 'Hoạt động lần cuối', + refresh: 'Làm mới', + active: 'Đang hoạt động', + inactive: 'Không hoạt động', + }, + }, + plugins: { + title: 'Tiện ích mở rộng', + description: + 'Cài đặt và cấu hình plugin để mở rộng chức năng, vui lòng chọn chúng trong cấu hình Pipeline', + createPlugin: 'Tạo Plugin', + editPlugin: 'Chỉnh sửa Plugin', + installed: 'Đã cài đặt', + marketplace: 'Chợ ứng dụng', + arrange: 'Sắp xếp Plugin', + install: 'Cài đặt', + installPlugin: 'Cài đặt Plugin', + onlySupportGithub: 'Hiện chỉ hỗ trợ cài đặt từ GitHub', + enterGithubLink: 'Nhập liên kết GitHub của plugin', + installing: 'Đang cài đặt plugin...', + installSuccess: 'Cài đặt plugin thành công', + installFailed: 'Cài đặt plugin thất bại:', + searchPlugin: 'Tìm kiếm plugin', + sortBy: 'Sắp xếp theo', + mostStars: 'Nhiều star nhất', + recentlyAdded: 'Mới thêm gần đây', + recentlyUpdated: 'Mới cập nhật gần đây', + noMatchingPlugins: 'Không tìm thấy plugin phù hợp', + loading: 'Đang tải...', + getPluginListError: 'Lấy danh sách plugin thất bại:', + noPluginInstalled: 'Chưa cài đặt plugin nào', + pluginConfig: 'Cấu hình Plugin', + pluginSort: 'Sắp xếp Plugin', + pluginSortDescription: + 'Thứ tự plugin ảnh hưởng đến thứ tự xử lý trong cùng một sự kiện, vui lòng kéo thẻ plugin để sắp xếp', + pluginSortSuccess: 'Sắp xếp plugin thành công', + pluginSortError: 'Sắp xếp plugin thất bại: ', + pluginNoConfig: 'Plugin không có mục cấu hình nào.', + systemDisabled: 'Hệ thống Plugin đã bị tắt', + systemDisabledDesc: + 'Hệ thống plugin chưa được bật, vui lòng sửa đổi cấu hình theo tài liệu hướng dẫn', + connectionError: 'Lỗi kết nối hệ thống Plugin', + connectionErrorDesc: + 'Vui lòng kiểm tra cấu hình hệ thống plugin hoặc liên hệ quản trị viên.', + errorDetails: 'Chi tiết lỗi', + loadingStatus: 'Đang kiểm tra trạng thái hệ thống plugin...', + failedToGetStatus: 'Lấy trạng thái hệ thống plugin thất bại', + pluginSystemNotReady: + 'Hệ thống plugin chưa sẵn sàng, không thể thực hiện thao tác này', + debugInfo: 'Thông tin gỡ lỗi', + debugInfoTitle: 'Thông tin gỡ lỗi Plugin', + debugUrl: 'URL gỡ lỗi', + debugKey: 'Khóa gỡ lỗi', + noDebugKey: '(Chưa đặt)', + debugKeyDisabled: + 'Khóa gỡ lỗi chưa được đặt, gỡ lỗi plugin không yêu cầu xác thực', + failedToGetDebugInfo: 'Lấy thông tin gỡ lỗi thất bại', + copiedToClipboard: 'Đã sao chép vào clipboard', + deleting: 'Đang xóa...', + deletePlugin: 'Xóa Plugin', + cancel: 'Hủy', + saveConfig: 'Lưu cấu hình', + saving: 'Đang lưu...', + confirmDeletePlugin: + 'Bạn có chắc chắn muốn xóa plugin ({{author}}/{{name}}) không?', + deleteDataCheckbox: 'Đồng thời xóa cấu hình và dữ liệu lưu trữ của plugin', + confirmDelete: 'Xác nhận xóa', + deleteError: 'Xóa thất bại: ', + close: 'Đóng', + deleteConfirm: 'Xác nhận xóa', + deleteSuccess: 'Xóa thành công', + modifyFailed: 'Sửa đổi thất bại: ', + componentName: { + Tool: 'Công cụ', + EventListener: 'Trình lắng nghe sự kiện', + Command: 'Lệnh', + KnowledgeEngine: 'Công cụ tri thức', + Parser: 'Trình phân tích', + }, + uploadLocal: 'Tải lên cục bộ', + debugging: 'Gỡ lỗi', + uploadLocalPlugin: 'Tải lên Plugin cục bộ', + dragToUpload: 'Kéo tệp plugin vào đây để tải lên', + unsupportedFileType: + 'Loại tệp không được hỗ trợ, chỉ hỗ trợ tệp .lbpkg và .zip', + uploadingPlugin: 'Đang tải lên plugin...', + uploadSuccess: 'Tải lên thành công', + uploadFailed: 'Tải lên thất bại', + selectFileToUpload: 'Chọn tệp plugin để tải lên', + askConfirm: + 'Bạn có chắc chắn muốn cài đặt plugin "{{name}}" ({{version}}) không?', + fromGithub: 'Từ GitHub', + fromLocal: 'Từ cục bộ', + fromMarketplace: 'Từ chợ ứng dụng', + componentsList: 'Thành phần: ', + noComponents: 'Không có thành phần', + delete: 'Xóa Plugin', + update: 'Cập nhật Plugin', + new: 'Mới', + updateConfirm: 'Xác nhận cập nhật', + confirmUpdatePlugin: + 'Bạn có chắc chắn muốn cập nhật plugin ({{author}}/{{name}}) không?', + confirmUpdate: 'Xác nhận cập nhật', + updating: 'Đang cập nhật...', + updateSuccess: 'Cập nhật plugin thành công', + updateError: 'Cập nhật thất bại: ', + saveConfigSuccessNormal: 'Lưu cấu hình thành công', + saveConfigError: 'Lưu cấu hình thất bại: ', + config: 'Cấu hình', + readme: 'Tài liệu', + viewSource: 'Xem mã nguồn', + loadingReadme: 'Đang tải tài liệu...', + noReadme: 'Plugin này không cung cấp tài liệu README', + fileUpload: { + tooLarge: 'Kích thước tệp vượt quá giới hạn 10MB', + success: 'Tải tệp lên thành công', + failed: 'Tải tệp lên thất bại', + uploading: 'Đang tải lên...', + chooseFile: 'Chọn tệp', + addFile: 'Thêm tệp', + }, + installFromGithub: 'Từ GitHub', + enterRepoUrl: 'Nhập URL kho lưu trữ GitHub', + repoUrlPlaceholder: 'ví dụ: https://github.com/owner/repo', + fetchingReleases: 'Đang lấy danh sách phiên bản...', + selectRelease: 'Chọn phiên bản', + noReleasesFound: 'Không tìm thấy phiên bản nào', + fetchReleasesError: 'Lấy danh sách phiên bản thất bại: ', + selectAsset: 'Chọn tệp để cài đặt', + noAssetsFound: 'Không có tệp .lbpkg nào trong phiên bản này', + fetchAssetsError: 'Lấy danh sách tệp thất bại: ', + backToReleases: 'Quay lại danh sách phiên bản', + backToRepoUrl: 'Quay lại URL kho lưu trữ', + backToAssets: 'Quay lại danh sách tệp', + releaseTag: 'Tag: {{tag}}', + releaseName: 'Tên: {{name}}', + publishedAt: 'Ngày phát hành: {{date}}', + prerelease: 'Phiên bản trước phát hành', + assetSize: 'Kích thước: {{size}}', + confirmInstall: 'Xác nhận cài đặt', + installFromGithubDesc: 'Cài đặt plugin từ GitHub Release', + goToMarketplace: 'Đi đến chợ ứng dụng', + }, + market: { + searchPlaceholder: 'Tìm kiếm plugin...', + searchResults: 'Tìm thấy {{count}} plugin', + totalPlugins: 'Tổng cộng {{count}} plugin', + noPlugins: 'Không có plugin nào', + noResults: 'Không tìm thấy plugin liên quan', + loadingMore: 'Đang tải thêm...', + loading: 'Đang tải...', + allLoaded: 'Đã hiển thị tất cả plugin', + install: 'Cài đặt', + installConfirm: + 'Bạn có chắc chắn muốn cài đặt plugin "{{name}}" ({{version}}) không?', + downloadComplete: 'Tải plugin "{{name}}" hoàn tất', + installFailed: 'Cài đặt thất bại, vui lòng thử lại sau', + loadFailed: 'Lấy danh sách plugin thất bại, vui lòng thử lại sau', + noDescription: 'Không có mô tả', + notFound: 'Không tìm thấy thông tin plugin', + sortBy: 'Sắp xếp theo', + sort: { + recentlyAdded: 'Mới thêm gần đây', + recentlyUpdated: 'Mới cập nhật gần đây', + mostDownloads: 'Tải nhiều nhất', + leastDownloads: 'Tải ít nhất', + }, + downloads: 'lượt tải', + download: 'Tải xuống', + repository: 'Kho lưu trữ', + downloadFailed: 'Tải xuống thất bại', + noReadme: 'Plugin này không cung cấp tài liệu README', + description: 'Mô tả', + tagLabel: 'Thẻ', + submissionTitle: 'Bạn có một plugin đang chờ duyệt: {{name}}', + submissionPending: 'Plugin của bạn đang được xem xét: {{name}}', + submissionApproved: 'Plugin của bạn đã được phê duyệt: {{name}}', + submissionRejected: 'Plugin của bạn đã bị từ chối: {{name}}', + clickToRevoke: 'Thu hồi', + revokeSuccess: 'Thu hồi thành công', + revokeFailed: 'Thu hồi thất bại', + submissionDetails: 'Chi tiết gửi Plugin', + markAsRead: 'Đánh dấu đã đọc', + markAsReadSuccess: 'Đã đánh dấu đã đọc', + markAsReadFailed: 'Đánh dấu đã đọc thất bại', + filterByComponent: 'Thành phần', + allComponents: 'Tất cả thành phần', + requestPlugin: 'Yêu cầu Plugin', + viewDetails: 'Xem chi tiết', + deprecated: 'Không còn hỗ trợ', + deprecatedTooltip: 'Vui lòng cài đặt plugin Công cụ tri thức tương ứng.', + tags: { + filterByTags: 'Lọc theo thẻ', + selected: 'đã chọn', + selectTags: 'Chọn thẻ', + clearAll: 'Xóa tất cả', + noTags: 'Không có thẻ nào', + }, + }, + mcp: { + title: 'MCP', + createServer: 'Thêm máy chủ MCP', + editServer: 'Chỉnh sửa máy chủ MCP', + deleteServer: 'Xóa máy chủ MCP', + confirmDeleteServer: 'Bạn có chắc chắn muốn xóa máy chủ MCP này không?', + confirmDeleteTitle: 'Xóa máy chủ MCP', + getServerListError: 'Lấy danh sách máy chủ MCP thất bại: ', + serverName: 'Tên máy chủ', + serverMode: 'Chế độ kết nối', + selectMode: 'Chọn chế độ', + stdio: 'Chế độ Stdio', + sse: 'Chế độ SSE', + http: 'Chế độ HTTP', + noServerInstalled: 'Chưa cấu hình máy chủ MCP nào', + serverNameRequired: 'Tên máy chủ không được để trống', + commandRequired: 'Lệnh không được để trống', + urlRequired: 'URL không được để trống', + timeoutMustBePositive: 'Thời gian chờ phải là số dương', + command: 'Lệnh', + args: 'Tham số', + env: 'Biến môi trường', + url: 'URL', + headers: 'Tiêu đề', + timeout: 'Thời gian chờ', + addArgument: 'Thêm tham số', + addEnvVar: 'Thêm biến môi trường', + addHeader: 'Thêm tiêu đề', + keyName: 'Tên khóa', + value: 'Giá trị', + testing: 'Đang kiểm tra...', + connecting: 'Đang kết nối...', + testSuccess: 'Kiểm tra thành công', + testFailed: 'Kiểm tra thất bại: ', + testError: 'Lỗi kiểm tra', + refreshSuccess: 'Làm mới thành công', + refreshFailed: 'Làm mới thất bại: ', + connectionSuccess: 'Kết nối thành công', + connectionFailed: 'Kết nối thất bại, vui lòng kiểm tra URL', + connectionFailedStatus: 'Kết nối thất bại', + toolsFound: 'công cụ', + unknownError: 'Lỗi không xác định', + noToolsFound: 'Không tìm thấy công cụ nào', + parseResultFailed: 'Phân tích kết quả kiểm tra thất bại', + noResultReturned: 'Kiểm tra không trả về kết quả', + getTaskFailed: 'Lấy trạng thái tác vụ thất bại', + noTaskId: 'Không lấy được ID tác vụ', + deleteSuccess: 'Xóa thành công', + deleteFailed: 'Xóa thất bại: ', + deleteError: 'Xóa thất bại: ', + saveSuccess: 'Lưu thành công', + saveError: 'Lưu thất bại: ', + createSuccess: 'Tạo thành công', + createFailed: 'Tạo thất bại: ', + createError: 'Tạo thất bại: ', + loadFailed: 'Tải thất bại', + modifyFailed: 'Sửa đổi thất bại: ', + toolCount: 'Công cụ: {{count}}', + statusConnected: 'Đã kết nối', + statusDisconnected: 'Đã ngắt kết nối', + statusError: 'Lỗi kết nối', + statusDisabled: 'Đã tắt', + loading: 'Đang tải...', + starCount: 'Star: {{count}}', + install: 'Cài đặt', + installFromGithub: 'Cài đặt máy chủ MCP từ GitHub', + add: 'Thêm', + name: 'Tên', + nameRequired: 'Tên không được để trống', + sseTimeout: 'Thời gian chờ SSE', + sseTimeoutDescription: 'Thời gian chờ để thiết lập kết nối SSE', + extraParametersDescription: + 'Tham số bổ sung để cấu hình hành vi cụ thể của máy chủ MCP', + timeoutMustBeNumber: 'Thời gian chờ phải là một số', + timeoutNonNegative: 'Thời gian chờ không được âm', + sseTimeoutMustBeNumber: 'Thời gian chờ SSE phải là một số', + sseTimeoutNonNegative: 'Thời gian chờ SSE không được âm', + updateSuccess: 'Cập nhật thành công', + updateFailed: 'Cập nhật thất bại: ', + selectFromSidebar: 'Chọn một máy chủ MCP từ thanh bên', + dangerZone: 'Vùng nguy hiểm', + dangerZoneDescription: + 'Các hành động không thể đảo ngược và phá hủy cho máy chủ MCP này.', + deleteMCPAction: 'Xóa máy chủ MCP này', + deleteMCPHint: 'Sau khi xóa, cấu hình máy chủ MCP này không thể khôi phục.', + }, + pipelines: { + title: 'Pipeline', + description: + 'Pipeline xác định luồng xử lý sự kiện tin nhắn, dùng để liên kết với Bot', + createPipeline: 'Tạo Pipeline', + selectFromSidebar: 'Chọn một Pipeline từ thanh bên', + editPipeline: 'Chỉnh sửa Pipeline', + chat: 'Trò chuyện', + configuration: 'Cấu hình', + debugChat: 'Trò chuyện gỡ lỗi', + getPipelineListError: 'Lấy danh sách Pipeline thất bại: ', + daysAgo: 'ngày trước', + today: 'Hôm nay', + updateTime: 'Cập nhật ', + defaultBadge: 'Mặc định', + sortBy: 'Sắp xếp theo', + newestCreated: 'Tạo mới nhất', + earliestCreated: 'Tạo sớm nhất', + recentlyEdited: 'Chỉnh sửa gần đây', + earliestEdited: 'Chỉnh sửa sớm nhất', + basicInfo: 'Thông tin cơ bản', + basicInfoDescription: 'Đặt tên, biểu tượng và mô tả Pipeline', + aiCapabilities: 'AI', + triggerConditions: 'Điều kiện kích hoạt', + safetyControls: 'An toàn', + outputProcessing: 'Đầu ra', + nameRequired: 'Tên không được để trống', + descriptionRequired: 'Mô tả không được để trống', + createSuccess: 'Tạo thành công. Vui lòng chỉnh sửa tham số Pipeline', + createError: 'Tạo thất bại: ', + saveSuccess: 'Lưu thành công', + saveError: 'Lưu thất bại: ', + copySuffix: ' Bản sao', + deleteConfirmation: + 'Bạn có chắc chắn muốn xóa Pipeline này không? Bot liên kết với Pipeline này sẽ không hoạt động.', + defaultPipelineCannotDelete: 'Không thể xóa Pipeline mặc định', + deleteSuccess: 'Xóa thành công', + deleteError: 'Xóa thất bại: ', + copyConfirmTitle: 'Xác nhận sao chép', + copyConfirmation: + 'Bạn có chắc chắn muốn sao chép Pipeline này không? Thao tác này sẽ tạo một Pipeline mới với tất cả cấu hình.', + unsavedChanges: 'Bạn có thay đổi chưa lưu', + dangerZone: 'Vùng nguy hiểm', + dangerZoneDescription: 'Các hành động không thể đảo ngược và phá hủy', + deletePipelineAction: 'Xóa Pipeline này', + deletePipelineHint: + 'Sau khi xóa, Bot liên kết với Pipeline này sẽ ngừng hoạt động.', + copyPipelineAction: 'Sao chép Pipeline này', + copyPipelineHint: 'Tạo một Pipeline mới với tất cả cấu hình được sao chép.', + extensions: { + title: 'Tiện ích mở rộng', + loadError: 'Tải plugin thất bại', + saveSuccess: 'Lưu thành công', + saveError: 'Lưu thất bại', + noPluginsAvailable: 'Không có plugin nào', + disabled: 'Đã tắt', + noPluginsSelected: 'Chưa chọn plugin nào', + addPlugin: 'Thêm Plugin', + selectPlugins: 'Chọn Plugin', + pluginsTitle: 'Plugin', + mcpServersTitle: 'Máy chủ MCP', + noMCPServersSelected: 'Chưa chọn máy chủ MCP nào', + addMCPServer: 'Thêm máy chủ MCP', + selectMCPServers: 'Chọn máy chủ MCP', + toolCount: '{{count}} công cụ', + noPluginsInstalled: 'Chưa cài đặt plugin nào', + noMCPServersConfigured: 'Chưa cấu hình máy chủ MCP nào', + selectAll: 'Chọn tất cả', + enableAllPlugins: 'Bật tất cả Plugin', + enableAllMCPServers: 'Bật tất cả máy chủ MCP', + allPluginsEnabled: 'Đã bật tất cả plugin', + allMCPServersEnabled: 'Đã bật tất cả máy chủ MCP', + }, + debugDialog: { + title: 'Trò chuyện Pipeline', + selectPipeline: 'Chọn Pipeline', + sessionType: 'Loại phiên', + privateChat: 'Trò chuyện riêng', + groupChat: 'Trò chuyện nhóm', + send: 'Gửi', + reset: 'Đặt lại cuộc trò chuyện', + inputPlaceholder: 'Gửi tin nhắn {{type}}...', + noMessages: 'Không có tin nhắn', + userMessage: 'Người dùng', + botMessage: 'Bot', + sendFailed: 'Gửi thất bại', + resetSuccess: 'Đặt lại cuộc trò chuyện thành công', + resetFailed: 'Đặt lại thất bại', + loadMessagesFailed: 'Tải tin nhắn thất bại', + loadPipelinesFailed: 'Tải Pipeline thất bại', + atTips: 'Nhắc đến Bot', + streaming: 'Đang truyền', + streamOutput: 'Luồng', + connected: 'WebSocket đã kết nối', + disconnected: 'WebSocket đã ngắt kết nối', + connectionError: 'Lỗi kết nối WebSocket', + connectionFailed: 'Kết nối WebSocket thất bại', + notConnected: 'WebSocket chưa kết nối, vui lòng thử lại sau', + imageUploadFailed: 'Tải hình ảnh lên thất bại', + reply: 'Trả lời', + replyTo: 'Trả lời cho', + showMarkdown: 'Hiển thị Markdown', + showRaw: 'Hiển thị thô', + allMembers: 'Tất cả thành viên', + file: 'Tệp', + voice: 'Giọng nói', + uploadImage: 'Tải hình ảnh lên', + uploading: 'Đang tải lên...', + }, + monitoring: { + title: 'Bảng điều khiển', + description: 'Xem nhật ký thực thi và lỗi của Pipeline này (24 giờ qua)', + detailedLogs: 'Nhật ký chi tiết', + }, + }, + knowledge: { + title: 'Cơ sở tri thức', + createKnowledgeBase: 'Tạo cơ sở tri thức', + selectFromSidebar: 'Chọn một cơ sở tri thức từ thanh bên', + editKnowledgeBase: 'Chỉnh sửa cơ sở tri thức', + selectKnowledgeBase: 'Chọn cơ sở tri thức', + selectKnowledgeBases: 'Chọn cơ sở tri thức', + addKnowledgeBase: 'Thêm cơ sở tri thức', + noKnowledgeBaseSelected: 'Chưa chọn cơ sở tri thức nào', + empty: 'Trống', + editDocument: 'Tài liệu', + description: 'Cấu hình cơ sở tri thức để cải thiện phản hồi LLM', + metadata: 'Siêu dữ liệu', + documents: 'Tài liệu', + kbNameRequired: 'Tên cơ sở tri thức không được để trống', + kbDescriptionRequired: 'Mô tả cơ sở tri thức không được để trống', + embeddingModelUUIDRequired: 'Mô hình Embedding không được để trống', + daysAgo: 'ngày trước', + today: 'Hôm nay', + kbName: 'Tên cơ sở tri thức', + kbDescription: 'Mô tả cơ sở tri thức', + topK: 'Top K', + topKRequired: 'Top K không được để trống', + topKMax: 'Giá trị tối đa của Top K là 30', + topKdescription: + 'Dùng để chỉ định số lượng tài liệu liên quan cần truy xuất, phạm vi từ 1 đến 30.', + defaultDescription: 'Một cơ sở tri thức', + embeddingModelUUID: 'Mô hình Embedding', + selectEmbeddingModel: 'Chọn mô hình Embedding', + embeddingModelDescription: + 'Dùng để véc tơ hóa văn bản, bạn có thể cấu hình trong trang Mô hình', + updateTime: 'Cập nhật ', + cannotChangeEmbeddingModel: + 'Không thể thay đổi mô hình Embedding sau khi tạo cơ sở tri thức', + updateKnowledgeBaseSuccess: 'Cập nhật cơ sở tri thức thành công', + updateKnowledgeBaseFailed: 'Cập nhật cơ sở tri thức thất bại: ', + documentsTab: { + name: 'Tên', + status: 'Trạng thái', + noResults: 'Không có tài liệu', + dragAndDrop: 'Kéo và thả tệp vào đây hoặc nhấp để tải lên', + uploading: 'Đang tải lên...', + supportedFormats: + 'Hỗ trợ các định dạng PDF, Word, TXT, Markdown, HTML, ZIP và các định dạng tài liệu khác', + uploadSuccess: 'Tải tệp lên thành công!', + uploadError: 'Tải tệp lên thất bại: ', + uploadingFile: 'Đang tải tệp lên...', + fileSizeExceeded: + 'Kích thước tệp vượt quá giới hạn 10MB. Vui lòng chia thành các tệp nhỏ hơn.', + actions: 'Hành động', + delete: 'Xóa tệp', + fileDeleteSuccess: 'Xóa tệp thành công', + fileDeleteFailed: 'Xóa tệp thất bại: ', + processing: 'Đang xử lý', + completed: 'Hoàn tất', + failed: 'Thất bại', + selectParser: 'Chọn trình phân tích', + builtInParser: 'Được cung cấp bởi Công cụ tri thức', + noParserAvailable: + 'Không có trình phân tích hỗ trợ loại tệp này. Vui lòng cài đặt plugin trình phân tích có thể xử lý định dạng này.', + confirmUpload: 'Tải lên', + cancelUpload: 'Hủy', + }, + deleteKnowledgeBaseConfirmation: + 'Bạn có chắc chắn muốn xóa cơ sở tri thức này không? Tất cả tài liệu trong cơ sở tri thức này sẽ bị xóa.', + retrieve: 'Kiểm tra truy xuất', + retrieveTest: 'Kiểm tra truy xuất', + query: 'Truy vấn', + queryPlaceholder: 'Nhập văn bản truy vấn...', + distance: 'Khoảng cách', + content: 'Nội dung', + fileName: 'Tên tệp', + noResults: 'Không có kết quả', + retrieveError: 'Truy xuất thất bại: ', + unknownEngine: 'Công cụ không xác định', + knowledgeEngine: 'Công cụ tri thức', + knowledgeEngineRequired: 'Công cụ tri thức là bắt buộc', + selectKnowledgeEngine: 'Chọn công cụ tri thức', + builtInEngine: 'Công cụ tích hợp', + cannotChangeKnowledgeEngine: + 'Không thể thay đổi công cụ tri thức sau khi tạo', + basicInfo: 'Thông tin cơ bản', + basicInfoDescription: 'Đặt tên, biểu tượng và mô tả cơ sở tri thức', + engineSettings: 'Cài đặt công cụ', + engineSettingsDescription: 'Cấu hình cho công cụ tri thức đã chọn', + engineSettingsReadonly: 'chỉ đọc trong chế độ chỉnh sửa', + retrievalSettings: 'Cài đặt truy xuất', + retrievalSettingsDescription: + 'Cấu hình cách truy xuất tài liệu từ cơ sở tri thức này', + dangerZone: 'Vùng nguy hiểm', + dangerZoneDescription: 'Các hành động không thể đảo ngược và phá hủy', + deleteKbAction: 'Xóa cơ sở tri thức này', + deleteKbHint: + 'Sau khi xóa, tất cả tài liệu và dữ liệu trong cơ sở tri thức này sẽ bị xóa vĩnh viễn.', + noEnginesAvailable: 'Không có công cụ cơ sở tri thức nào khả dụng', + installEngineHint: 'Vui lòng cài đặt plugin "Công cụ tri thức" trước', + createKnowledgeBaseFailed: 'Tạo cơ sở tri thức thất bại: ', + loadKnowledgeBaseFailed: 'Tải cơ sở tri thức thất bại: ', + deleteKnowledgeBaseFailed: 'Xóa cơ sở tri thức thất bại: ', + getKnowledgeBaseListError: 'Lấy danh sách cơ sở tri thức thất bại: ', + embeddingModel: 'Mô hình Embedding', + embeddingModelRequired: 'Mô hình Embedding là bắt buộc cho công cụ này', + addExternal: 'Thêm cơ sở tri thức bên ngoài', + createExternalSuccess: 'Tạo cơ sở tri thức bên ngoài thành công', + updateExternalSuccess: 'Cập nhật cơ sở tri thức bên ngoài thành công', + deleteExternalSuccess: 'Xóa cơ sở tri thức bên ngoài thành công', + retriever: 'Trình truy xuất', + selectRetriever: 'Chọn trình truy xuất...', + retrieverConfiguration: 'Cấu hình trình truy xuất', + retrieverInstallInfo: + 'Bạn có thể cài đặt plugin trình truy xuất tri thức từ', + retrieverMarketLink: 'đây', + migration: { + title: 'Di chuyển cơ sở tri thức', + description: + 'Phiên bản mới đã tái cấu trúc cơ sở tri thức thành kiến trúc dựa trên plugin, hợp nhất cơ sở tri thức tích hợp và bên ngoài thành plugin "Công cụ tri thức". Cần di chuyển dữ liệu cơ sở tri thức cũ. Dữ liệu cũ của bạn đã được tự động sao lưu trong cơ sở dữ liệu.', + detected: + 'Phát hiện {{total}} cơ sở tri thức cần di chuyển ({{internal}} nội bộ, {{external}} bên ngoài).', + startWithInstall: 'Tự động cài đặt Plugin & Di chuyển', + startDataOnly: 'Chỉ di chuyển dữ liệu', + dataOnlyHint: + '"Chỉ di chuyển dữ liệu" dành cho môi trường ngoại tuyến/mạng nội bộ. Vui lòng cài đặt plugin tương ứng thủ công sau khi di chuyển.', + dismiss: 'Hủy bỏ dữ liệu gốc', + running: 'Đang di chuyển cơ sở tri thức, vui lòng chờ...', + success: 'Di chuyển cơ sở tri thức hoàn tất', + error: 'Di chuyển cơ sở tri thức thất bại: ', + dismissError: 'Thao tác thất bại', + retry: 'Thử lại', + }, + }, + register: { + title: 'Khởi tạo LangBot 👋', + description: 'Đây là lần đầu tiên bạn khởi động LangBot', + adminAccountNote: + 'Tài khoản bạn sử dụng ở đây sẽ được đặt làm tài khoản quản trị viên', + register: 'Đăng ký', + initWithSpace: 'Khởi tạo với Space', + spaceRecommended: + 'Khuyến nghị: Sử dụng API mô hình ổn định chính thức và dịch vụ đám mây', + spaceInfoTip1: + 'Space cung cấp dịch vụ xác thực tài khoản thống nhất mà không tải lên bất kỳ thông tin nhạy cảm nào của bạn.', + spaceInfoTip2: + 'Đăng nhập bằng tài khoản Space cho phép bạn truy cập Mô hình LangBot và các dịch vụ đám mây khác, bao gồm tín dụng gọi mô hình miễn phí để giúp bạn bắt đầu nhanh chóng.', + spaceInfoTip3: + 'Phương thức đăng nhập của bạn không ảnh hưởng đến các tính năng khác. Bạn có thể cấu hình và sử dụng mô hình từ các nguồn khác bất cứ lúc nào.', + registerLocal: 'Đăng ký tài khoản cục bộ', + registerWithPassword: 'Đăng ký bằng email và mật khẩu', + initSuccess: 'Khởi tạo thành công, vui lòng đăng nhập', + initFailed: 'Khởi tạo thất bại: ', + }, + resetPassword: { + title: 'Đặt lại mật khẩu 🔐', + description: + 'Nhập khóa khôi phục và mật khẩu mới để đặt lại mật khẩu tài khoản', + recoveryKey: 'Khóa khôi phục', + recoveryKeyDescription: + 'Được lưu trữ trong `system.recovery_key` của tệp cấu hình `data/config.yaml`', + newPassword: 'Mật khẩu mới', + enterRecoveryKey: 'Nhập khóa khôi phục', + enterNewPassword: 'Nhập mật khẩu mới', + recoveryKeyRequired: 'Khóa khôi phục không được để trống', + newPasswordRequired: 'Mật khẩu mới không được để trống', + resetPassword: 'Đặt lại mật khẩu', + resetting: 'Đang đặt lại...', + resetSuccess: 'Đặt lại mật khẩu thành công, vui lòng đăng nhập', + resetFailed: + 'Đặt lại mật khẩu thất bại, vui lòng kiểm tra email và khóa khôi phục', + backToLogin: 'Quay lại đăng nhập', + }, + embedding: { + description: 'Quản lý mô hình Embedding để véc tơ hóa văn bản', + createModel: 'Tạo mô hình Embedding', + editModel: 'Chỉnh sửa mô hình Embedding', + getModelListError: 'Lấy danh sách mô hình Embedding thất bại: ', + embeddingModels: 'Embedding', + extraParametersDescription: + 'Sẽ được đính kèm vào nội dung yêu cầu, như encoding_format, dimensions, v.v.', + }, + llm: { + description: 'Quản lý mô hình LLM để sinh hội thoại', + llmModels: 'LLM', + extraParametersDescription: + 'Sẽ được đính kèm vào nội dung yêu cầu, như max_tokens, temperature, top_p, v.v.', + }, + version: { + newVersionAvailable: 'Có phiên bản mới', + viewUpdateGuide: 'Xem hướng dẫn cập nhật', + noReleaseNotes: 'Không có ghi chú phát hành', + }, + account: { + settings: 'Cài đặt tài khoản', + setPassword: 'Đặt mật khẩu', + passwordSetSuccess: 'Đặt mật khẩu thành công', + passwordStatus: 'Mật khẩu cục bộ', + passwordSet: 'Đã đặt', + passwordNotSet: 'Chưa đặt', + passwordSetDescription: + 'Mật khẩu đã được đặt, bạn có thể đăng nhập bằng email và mật khẩu', + spaceStatus: 'Tài khoản Space', + spaceBound: 'Đã liên kết', + spaceNotBound: 'Chưa liên kết', + spaceBoundDescription: + 'Tài khoản Space đã liên kết, có thể sử dụng API mô hình chính thức và dịch vụ đám mây', + bindSpace: 'Liên kết tài khoản Space', + bindSpaceDescription: + 'Liên kết để sử dụng API mô hình chính thức và dịch vụ đám mây', + bindSpaceButton: 'Liên kết', + bindSpaceConfirmTitle: 'Xác nhận liên kết', + bindSpaceConfirmDescription: + 'Bạn sắp liên kết phiên bản cục bộ với tài khoản Space', + bindSpaceWarning: + 'Sau khi liên kết, email đăng nhập của bạn sẽ được đổi từ {{localEmail}} sang email tài khoản Space.', + bindSpaceSuccess: 'Liên kết tài khoản Space thành công', + bindSpaceFailed: 'Liên kết tài khoản Space thất bại', + bindSpaceInvalidState: + 'Yêu cầu liên kết không hợp lệ. Vui lòng thử lại từ cài đặt tài khoản.', + setPasswordHint: 'Đặt mật khẩu để đăng nhập bằng email và mật khẩu', + spaceEmailMismatch: + 'Email đăng nhập Space không khớp với email tài khoản cục bộ', + }, + monitoring: { + title: 'Bảng điều khiển', + description: 'Giám sát hoạt động Bot, cuộc gọi LLM và hiệu suất hệ thống', + overview: 'Tổng quan', + totalMessages: 'Tổng tin nhắn', + llmCallsCount: 'Cuộc gọi LLM', + modelCallsCount: 'Cuộc gọi mô hình', + successRate: 'Tỷ lệ thành công', + activeSessions: 'Phiên đang hoạt động', + last24Hours: '24 giờ qua', + filters: { + title: 'Bộ lọc', + bot: 'Bot', + pipeline: 'Pipeline', + allBots: 'Tất cả Bot', + selectBot: 'Chọn Bot', + allPipelines: 'Tất cả Pipeline', + selectPipeline: 'Chọn Pipeline', + loading: 'Đang tải...', + timeRange: 'Khoảng thời gian', + customRange: 'Tùy chỉnh', + from: 'Từ', + to: 'Đến', + apply: 'Áp dụng', + reset: 'Đặt lại bộ lọc', + lastHour: '1 giờ qua', + last6Hours: '6 giờ qua', + last24Hours: '24 giờ qua', + last7Days: '7 ngày qua', + last30Days: '30 ngày qua', + }, + tabs: { + messages: 'Bản ghi tin nhắn', + llmCalls: 'Cuộc gọi LLM', + embeddingCalls: 'Cuộc gọi Embedding', + modelCalls: 'Cuộc gọi mô hình', + sessions: 'Phân tích phiên', + errors: 'Nhật ký lỗi', + }, + messageList: { + timestamp: 'Thời gian', + bot: 'Bot', + pipeline: 'Pipeline', + message: 'Tin nhắn', + sessionId: 'ID phiên', + status: 'Trạng thái', + actions: 'Hành động', + viewDetails: 'Xem chi tiết', + copyId: 'Sao chép ID', + noMessages: 'Không tìm thấy tin nhắn', + noMessagesDescription: 'Hãy thử điều chỉnh bộ lọc hoặc kiểm tra lại sau', + loading: 'Đang tải tin nhắn...', + loadMore: 'Tải thêm', + autoRefresh: 'Tự động làm mới', + platform: 'Vai trò', + user: 'Người dùng', + level: 'Mức', + runner: 'Trình chạy', + viewConversation: 'Xem cuộc trò chuyện', + }, + llmCalls: { + title: 'Cuộc gọi LLM', + model: 'Mô hình', + tokens: 'Token', + duration: 'Thời lượng', + cost: 'Chi phí', + noData: 'Không tìm thấy cuộc gọi LLM', + inputTokens: 'Token đầu vào', + outputTokens: 'Token đầu ra', + totalTokens: 'Tổng Token', + avgDuration: 'Thời lượng trung bình', + calls: 'Cuộc gọi', + }, + embeddingCalls: { + title: 'Cuộc gọi Embedding', + model: 'Mô hình', + tokens: 'Token', + duration: 'Thời lượng', + noData: 'Không tìm thấy cuộc gọi Embedding', + promptTokens: 'Token prompt', + totalTokens: 'Tổng Token', + inputCount: 'Số đầu vào', + knowledgeBase: 'Cơ sở tri thức', + queryText: 'Truy vấn', + }, + modelCalls: { + title: 'Cuộc gọi mô hình', + llmModel: 'LLM', + embeddingModel: 'Embedding', + embeddingCall: 'Embedding', + retrieveCall: 'Truy xuất', + noData: 'Không tìm thấy cuộc gọi mô hình', + }, + sessions: { + sessionId: 'ID phiên', + messageCount: 'Tin nhắn', + duration: 'Thời lượng', + lastActivity: 'Hoạt động cuối', + noSessions: 'Không tìm thấy phiên nào', + startTime: 'Thời gian bắt đầu', + messageStats: 'Thống kê tin nhắn', + totalMessages: 'Tổng tin nhắn', + successMessages: 'Thành công', + errorMessages: 'Thất bại', + llmStats: 'Thống kê LLM', + noData: 'Không tìm thấy phiên', + }, + errors: { + title: 'Lỗi', + errorType: 'Loại lỗi', + errorMessage: 'Thông báo lỗi', + occurredAt: 'Xảy ra lúc', + noErrors: 'Không tìm thấy lỗi', + stackTrace: 'Stack Trace', + }, + queries: { + title: 'Truy vấn', + }, + messageDetails: { + noData: 'Không có cuộc gọi LLM hoặc lỗi cho truy vấn này', + }, + queryVariables: { + title: 'Biến truy vấn', + }, + trafficChart: { + title: 'Tổng quan lưu lượng', + messages: 'Tin nhắn', + llmCalls: 'Cuộc gọi LLM', + noData: 'Không có dữ liệu lưu lượng', + }, + viewMonitoring: 'Xem giám sát', + refreshData: 'Làm mới dữ liệu', + exportData: 'Xuất dữ liệu', + export: { + title: 'Xuất dữ liệu', + exporting: 'Đang xuất...', + messages: 'Tin nhắn', + llmCalls: 'Cuộc gọi LLM', + embeddingCalls: 'Cuộc gọi Embedding', + errors: 'Nhật ký lỗi', + sessions: 'Phiên', + }, + }, + limitation: { + maxBotsReached: + 'Đã đạt số lượng Bot tối đa ({{max}}). Vui lòng xóa một Bot hiện có trước khi tạo mới.', + maxPipelinesReached: + 'Đã đạt số lượng Pipeline tối đa ({{max}}). Vui lòng xóa một Pipeline hiện có trước khi tạo mới.', + maxExtensionsReached: + 'Đã đạt số lượng tiện ích mở rộng tối đa ({{max}}). Vui lòng xóa một máy chủ MCP hoặc plugin hiện có trước khi thêm mới.', + }, + wizard: { + sidebarDescription: 'Tạo Bot với các bước hướng dẫn', + loading: 'Đang tải trình hướng dẫn...', + loadError: 'Tải dữ liệu trình hướng dẫn thất bại', + skip: 'Bỏ qua', + skipConfirmMessage: + 'Bạn có thể vào lại trình hướng dẫn Bắt đầu nhanh từ thanh bên sau, hoặc tạo Bot thủ công.', + skipConfirmOk: 'OK', + prev: 'Trước', + next: 'Tiếp', + finish: 'Tạo & Triển khai', + confirmCreateBot: 'Xác nhận, Tạo Bot', + createSuccess: 'Tạo Pipeline và liên kết với Bot thành công!', + botCreateSuccess: 'Tạo Bot thành công!', + botSaveSuccess: 'Cấu hình Bot đã lưu và bật!', + createError: 'Tạo tài nguyên thất bại', + spaceAuthError: 'Khởi tạo ủy quyền Space thất bại', + skipSaveError: 'Lưu trạng thái bỏ qua thất bại. Vui lòng thử lại.', + completeSaveError: 'Lưu trạng thái hoàn tất thất bại. Vui lòng thử lại.', + step: { + platform: 'Nền tảng', + botConfig: 'Thiết lập Bot', + aiEngine: 'Công cụ AI', + done: 'Hoàn tất', + }, + platform: { + title: 'Chọn nền tảng', + description: 'Chọn nền tảng nhắn tin mà Bot của bạn sẽ kết nối.', + }, + botConfig: { + title: 'Cấu hình Bot của bạn', + description: 'Thiết lập Bot và xác minh hoạt động trước khi tiếp tục.', + saveBot: 'Lưu & Bật Bot', + resaveBot: 'Lưu lại cấu hình', + botSaved: + 'Cấu hình Bot đã lưu và bật. Kiểm tra nhật ký để xác minh kết nối.', + logsTitle: 'Nhật ký Bot', + logsDescription: + 'Giám sát hoạt động Bot để xác minh kết nối nền tảng đang hoạt động.', + }, + aiEngine: { + title: 'Chọn công cụ AI', + description: 'Chọn công cụ AI sẽ cung cấp trí tuệ cho Bot của bạn.', + }, + spaceBanner: { + message: + 'Kết nối với LangBot Space để nhận tín dụng dùng thử mô hình miễn phí và thiết lập tức thì không cần cấu hình!', + action: 'Ủy quyền với Space', + }, + config: { + botInfo: 'Thông tin Bot', + botNamePlaceholder: 'Nhập tên Bot', + botDescPlaceholder: 'Nhập mô tả Bot (tùy chọn)', + platformConfig: 'Cấu hình {{platform}}', + aiConfig: 'Cấu hình {{engine}}', + }, + done: { + title: 'Hoàn tất!', + description: + 'Bot của bạn đã được tạo và kết nối với Pipeline AI. Bạn có thể quản lý nó từ bàn làm việc.', + backToWorkbench: 'Quay lại bàn làm việc', + }, + }, +}; + +export default viVN;