From 27dc4af3b424155b4721340ba78a38ad42ab426d Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Tue, 21 Apr 2026 19:55:48 +0800 Subject: [PATCH] Add Thai language support for various application components - Introduced Thai translations for dashboard, knowledge, login, models, scripts, settings, skills, task, and common UI elements. - Updated provider placeholders to include Thai language options. - Modified locale resolution to support Thai language. - Adjusted settings store to handle legacy language migration from Japanese to Thai. - Enhanced runtime types to include Thai as a supported language. --- dist-electron/main/main.js | 2 +- runtime-shared/locales/messages.ts | 40 +++--- src/i18n/constants.ts | 4 +- src/i18n/index.ts | 54 ++++----- src/i18n/locales/en/common.json | 2 +- src/i18n/locales/ja/agents.json | 141 ---------------------- src/i18n/locales/ja/channels.json | 85 ------------- src/i18n/locales/ja/chat.json | 53 -------- src/i18n/locales/ja/common.json | 46 ------- src/i18n/locales/ja/cron.json | 187 ----------------------------- src/i18n/locales/ja/dashboard.json | 34 ------ src/i18n/locales/ja/knowledge.json | 51 -------- src/i18n/locales/ja/login.json | 22 ---- src/i18n/locales/ja/models.json | 100 --------------- src/i18n/locales/ja/scripts.json | 116 ------------------ src/i18n/locales/ja/settings.json | 57 --------- src/i18n/locales/ja/skills.json | 101 ---------------- src/i18n/locales/ja/task.json | 94 --------------- src/i18n/locales/th/agents.json | 141 ++++++++++++++++++++++ src/i18n/locales/th/channels.json | 85 +++++++++++++ src/i18n/locales/th/chat.json | 53 ++++++++ src/i18n/locales/th/common.json | 46 +++++++ src/i18n/locales/th/cron.json | 187 +++++++++++++++++++++++++++++ src/i18n/locales/th/dashboard.json | 34 ++++++ src/i18n/locales/th/knowledge.json | 51 ++++++++ src/i18n/locales/th/login.json | 22 ++++ src/i18n/locales/th/models.json | 100 +++++++++++++++ src/i18n/locales/th/scripts.json | 116 ++++++++++++++++++ src/i18n/locales/th/settings.json | 57 +++++++++ src/i18n/locales/th/skills.json | 101 ++++++++++++++++ src/i18n/locales/th/task.json | 94 +++++++++++++++ src/i18n/locales/zh/common.json | 2 +- src/lib/providers.ts | 12 +- src/pages/Cron/index.tsx | 2 +- src/pages/Knowledge/index.tsx | 2 +- src/stores/settings.ts | 8 +- src/types/runtime.ts | 2 +- 37 files changed, 1154 insertions(+), 1150 deletions(-) delete mode 100644 src/i18n/locales/ja/agents.json delete mode 100644 src/i18n/locales/ja/channels.json delete mode 100644 src/i18n/locales/ja/chat.json delete mode 100644 src/i18n/locales/ja/common.json delete mode 100644 src/i18n/locales/ja/cron.json delete mode 100644 src/i18n/locales/ja/dashboard.json delete mode 100644 src/i18n/locales/ja/knowledge.json delete mode 100644 src/i18n/locales/ja/login.json delete mode 100644 src/i18n/locales/ja/models.json delete mode 100644 src/i18n/locales/ja/scripts.json delete mode 100644 src/i18n/locales/ja/settings.json delete mode 100644 src/i18n/locales/ja/skills.json delete mode 100644 src/i18n/locales/ja/task.json create mode 100644 src/i18n/locales/th/agents.json create mode 100644 src/i18n/locales/th/channels.json create mode 100644 src/i18n/locales/th/chat.json create mode 100644 src/i18n/locales/th/common.json create mode 100644 src/i18n/locales/th/cron.json create mode 100644 src/i18n/locales/th/dashboard.json create mode 100644 src/i18n/locales/th/knowledge.json create mode 100644 src/i18n/locales/th/login.json create mode 100644 src/i18n/locales/th/models.json create mode 100644 src/i18n/locales/th/scripts.json create mode 100644 src/i18n/locales/th/settings.json create mode 100644 src/i18n/locales/th/skills.json create mode 100644 src/i18n/locales/th/task.json diff --git a/dist-electron/main/main.js b/dist-electron/main/main.js index db11edf..a921558 100644 --- a/dist-electron/main/main.js +++ b/dist-electron/main/main.js @@ -1,6 +1,6 @@ "use strict"; require("electron"); -require("./main-EIYRjWjp.js"); +require("./main-BjSUL7Zm.js"); require("electron-squirrel-startup"); require("electron-log"); require("bytenode"); diff --git a/runtime-shared/locales/messages.ts b/runtime-shared/locales/messages.ts index fc75a97..40b5739 100644 --- a/runtime-shared/locales/messages.ts +++ b/runtime-shared/locales/messages.ts @@ -2,7 +2,7 @@ export type RuntimeMessageTree = { [key: string]: string | number | RuntimeMessageTree; }; -export const runtimeLocaleMessages: Record<'en' | 'zh' | 'ja', RuntimeMessageTree> = { +export const runtimeLocaleMessages: Record<'en' | 'zh' | 'th', RuntimeMessageTree> = { en: { settings: { title: 'Settings', @@ -65,35 +65,35 @@ export const runtimeLocaleMessages: Record<'en' | 'zh' | 'ja', RuntimeMessageTre exit: '\u9000\u51fa', }, }, - ja: { + th: { settings: { - title: '\u8a2d\u5b9a', + title: '\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32', }, menu: { conversation: { - newConversation: '\u65b0\u3057\u3044\u4f1a\u8a71', - sortBy: '\u4e26\u3079\u66ff\u3048', - sortByCreateTime: '\u4f5c\u6210\u65e5\u6642\u3067\u4e26\u3079\u66ff\u3048', - sortByUpdateTime: '\u66f4\u65b0\u65e5\u6642\u3067\u4e26\u3079\u66ff\u3048', - sortByName: '\u540d\u524d\u3067\u4e26\u3079\u66ff\u3048', - sortByModel: '\u30e2\u30c7\u30eb\u3067\u4e26\u3079\u66ff\u3048', - sortAscending: '\u6607\u9806', - sortDescending: '\u964d\u9806', - pinConversation: '\u4f1a\u8a71\u3092\u30d4\u30f3\u7559\u3081', - renameConversation: '\u4f1a\u8a71\u540d\u3092\u5909\u66f4', - delConversation: '\u4f1a\u8a71\u3092\u524a\u9664', - batchOperations: '\u4e00\u62ec\u64cd\u4f5c', + newConversation: '\u0e01\u0e32\u0e23\u0e2a\u0e19\u0e17\u0e19\u0e32\u0e43\u0e2b\u0e21\u0e48', + sortBy: '\u0e08\u0e31\u0e14\u0e40\u0e23\u0e35\u0e22\u0e07\u0e15\u0e32\u0e21', + sortByCreateTime: '\u0e08\u0e31\u0e14\u0e40\u0e23\u0e35\u0e22\u0e07\u0e15\u0e32\u0e21\u0e40\u0e27\u0e25\u0e32\u0e2a\u0e23\u0e49\u0e32\u0e07', + sortByUpdateTime: '\u0e08\u0e31\u0e14\u0e40\u0e23\u0e35\u0e22\u0e07\u0e15\u0e32\u0e21\u0e40\u0e27\u0e25\u0e32\u0e2d\u0e31\u0e1b\u0e40\u0e14\u0e15', + sortByName: '\u0e08\u0e31\u0e14\u0e40\u0e23\u0e35\u0e22\u0e07\u0e15\u0e32\u0e21\u0e0a\u0e37\u0e48\u0e2d', + sortByModel: '\u0e08\u0e31\u0e14\u0e40\u0e23\u0e35\u0e22\u0e07\u0e15\u0e32\u0e21\u0e42\u0e21\u0e40\u0e14\u0e25', + sortAscending: '\u0e40\u0e23\u0e35\u0e22\u0e07\u0e08\u0e32\u0e01\u0e19\u0e49\u0e2d\u0e22\u0e44\u0e1b\u0e21\u0e32\u0e01', + sortDescending: '\u0e40\u0e23\u0e35\u0e22\u0e07\u0e08\u0e32\u0e01\u0e21\u0e32\u0e01\u0e44\u0e1b\u0e19\u0e49\u0e2d\u0e22', + pinConversation: '\u0e1b\u0e31\u0e01\u0e2b\u0e21\u0e38\u0e14\u0e01\u0e32\u0e23\u0e2a\u0e19\u0e17\u0e19\u0e32', + renameConversation: '\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e0a\u0e37\u0e48\u0e2d\u0e01\u0e32\u0e23\u0e2a\u0e19\u0e17\u0e19\u0e32', + delConversation: '\u0e25\u0e1a\u0e01\u0e32\u0e23\u0e2a\u0e19\u0e17\u0e19\u0e32', + batchOperations: '\u0e14\u0e33\u0e40\u0e19\u0e34\u0e19\u0e01\u0e32\u0e23\u0e41\u0e1a\u0e1a\u0e01\u0e25\u0e38\u0e48\u0e21', }, message: { - copyMessage: '\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30b3\u30d4\u30fc', - deleteMessage: '\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u524a\u9664', - selectMessage: '\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9078\u629e', + copyMessage: '\u0e04\u0e31\u0e14\u0e25\u0e2d\u0e01\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21', + deleteMessage: '\u0e25\u0e1a\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21', + selectMessage: '\u0e40\u0e25\u0e37\u0e2d\u0e01\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21', }, }, tray: { tooltip: 'ZN-AI', - showWindow: '\u30a6\u30a3\u30f3\u30c9\u30a6\u3092\u8868\u793a', - exit: '\u7d42\u4e86', + showWindow: '\u0e41\u0e2a\u0e14\u0e07\u0e2b\u0e19\u0e49\u0e32\u0e15\u0e48\u0e32\u0e07', + exit: '\u0e2d\u0e2d\u0e01', }, }, }; diff --git a/src/i18n/constants.ts b/src/i18n/constants.ts index cd5234f..5f5f70c 100644 --- a/src/i18n/constants.ts +++ b/src/i18n/constants.ts @@ -1,13 +1,13 @@ import type { LanguageCode } from '../types/runtime'; -export const SUPPORTED_LANGUAGE_CODES = ['en', 'zh', 'ja'] as const satisfies readonly LanguageCode[]; +export const SUPPORTED_LANGUAGE_CODES = ['en', 'zh', 'th'] as const satisfies readonly LanguageCode[]; export type { LanguageCode }; export const SUPPORTED_LANGUAGES = [ { code: 'en', label: 'English' }, { code: 'zh', label: '中文' }, - { code: 'ja', label: '日本語' }, + { code: 'th', label: 'ไทย' }, ] as const; export type Namespace = diff --git a/src/i18n/index.ts b/src/i18n/index.ts index 7b08ecf..4654c3d 100644 --- a/src/i18n/index.ts +++ b/src/i18n/index.ts @@ -26,19 +26,19 @@ import enSettings from './locales/en/settings.json'; import enSkills from './locales/en/skills.json'; import enTask from './locales/en/task.json'; -import jaAgents from './locales/ja/agents.json'; -import jaChannels from './locales/ja/channels.json'; -import jaChat from './locales/ja/chat.json'; -import jaCommon from './locales/ja/common.json'; -import jaCron from './locales/ja/cron.json'; -import jaDashboard from './locales/ja/dashboard.json'; -import jaKnowledge from './locales/ja/knowledge.json'; -import jaLogin from './locales/ja/login.json'; -import jaModels from './locales/ja/models.json'; -import jaScripts from './locales/ja/scripts.json'; -import jaSettings from './locales/ja/settings.json'; -import jaSkills from './locales/ja/skills.json'; -import jaTask from './locales/ja/task.json'; +import thAgents from './locales/th/agents.json'; +import thChannels from './locales/th/channels.json'; +import thChat from './locales/th/chat.json'; +import thCommon from './locales/th/common.json'; +import thCron from './locales/th/cron.json'; +import thDashboard from './locales/th/dashboard.json'; +import thKnowledge from './locales/th/knowledge.json'; +import thLogin from './locales/th/login.json'; +import thModels from './locales/th/models.json'; +import thScripts from './locales/th/scripts.json'; +import thSettings from './locales/th/settings.json'; +import thSkills from './locales/th/skills.json'; +import thTask from './locales/th/task.json'; import zhAgents from './locales/zh/agents.json'; import zhChannels from './locales/zh/channels.json'; @@ -93,20 +93,20 @@ const resources = { task: zhTask, scripts: zhScripts, }, - ja: { - common: jaCommon, - settings: jaSettings, - chat: jaChat, - channels: jaChannels, - agents: jaAgents, - skills: jaSkills, - cron: jaCron, - login: jaLogin, - models: jaModels, - knowledge: jaKnowledge, - dashboard: jaDashboard, - task: jaTask, - scripts: jaScripts, + th: { + common: thCommon, + settings: thSettings, + chat: thChat, + channels: thChannels, + agents: thAgents, + skills: thSkills, + cron: thCron, + login: thLogin, + models: thModels, + knowledge: thKnowledge, + dashboard: thDashboard, + task: thTask, + scripts: thScripts, }, } as const satisfies Record>; diff --git a/src/i18n/locales/en/common.json b/src/i18n/locales/en/common.json index 4d903b5..df24485 100644 --- a/src/i18n/locales/en/common.json +++ b/src/i18n/locales/en/common.json @@ -21,7 +21,7 @@ "language": { "zh": "Chinese", "en": "English", - "ja": "Japanese" + "th": "Thai" }, "common": { "loading": "Loading...", diff --git a/src/i18n/locales/ja/agents.json b/src/i18n/locales/ja/agents.json deleted file mode 100644 index 2d37288..0000000 --- a/src/i18n/locales/ja/agents.json +++ /dev/null @@ -1,141 +0,0 @@ -{ - "title": "Agents", - "subtitle": "新しい Agent を作成し、特定のチャンネルを別の人格設定やワークスペースへ振り分けます。", - "refresh": "更新", - "addAgent": "Agent を追加", - "addHint": "新しいワークスペース、役割、またはチャンネル担当のために別 Agent を作成します。", - "warning": "Providers、Channels、runtime の更新反映には少し時間がかかることがあります。表示が古い場合は更新してください。", - "emptyTitle": "まだ Agent はありません", - "emptyDescription": "最初の Agent を追加して、チャンネル、アカウント、またはワークスペースの文脈を Main Agent から分けましょう。", - "errorPrefix": "Agents の読み込みに失敗しました: {error}", - "defaultBadge": "既定", - "inherited": "継承", - "mainManagedHint": "Main Agent", - "none": "なし", - "actions": { - "rename": "名前変更", - "model": "モデル設定", - "settings": "設定", - "delete": "削除" - }, - "prompts": { - "createName": "Agent 名を入力してください", - "inheritWorkspace": "この Agent に Main Agent のワークスペース初期ファイルを引き継ぎますか?", - "renameName": "Agent 名を変更", - "modelRef": "この Agent の provider/model を設定します。空欄のままなら選択した Provider またはワークスペース既定モデルを継承します。", - "deleteConfirm": "Agent「{name}」を削除しますか?既存のチャットはディスクに残りますが、この Agent は Agents ページから消えます。" - }, - "createDialog": { - "title": "Agent を追加", - "description": "名前を指定して新しい Agent を作成します。必要なら Main Agent のワークスペース初期ファイルも引き継げます。", - "nameLabel": "Agent 名", - "namePlaceholder": "Coding Helper", - "inheritWorkspaceLabel": "Main Agent のワークスペースを引き継ぐ", - "inheritWorkspaceDescription": "Main Agent から SOUL.md、AGENTS.md などの初期ファイルをコピーします。", - "saveLabel": "保存", - "savingLabel": "保存中..." - }, - "feedback": { - "created": "Agent を作成しました。", - "createFailed": "Agent の作成に失敗しました: {error}", - "deleted": "Agent を削除しました。", - "deleteFailed": "Agent の削除に失敗しました: {error}", - "agentUpdated": "Agent 名を更新しました。", - "agentUpdateFailedPrefix": "Agent 名の更新に失敗しました: ", - "agentModelUpdated": "Agent モデルを更新しました。", - "agentModelReset": "Agent を既定モデルに戻しました。", - "agentModelUpdateFailedPrefix": "Agent モデルの更新に失敗しました: " - }, - "deleteDialog": { - "title": "Agent を削除", - "message": "Agent「{name}」を削除しますか?既存のチャットはディスクに残ります。", - "confirm": "削除する", - "deleting": "削除中..." - }, - "fields": { - "model": "モデル", - "workspace": "ワークスペース", - "agentDir": "Agent フォルダ", - "mainSessionKey": "メインセッション Key", - "channels": "チャンネル", - "providerAccount": "Provider" - }, - "card": { - "modelLabel": "Model", - "channelCount": "{count} チャンネル", - "accountBindingCount": "{count} 件のアカウント紐付け", - "noChannels": "チャンネルなし", - "missingWorkspace": "ワークスペース未設定", - "missingModel": "モデル未設定", - "missingAgentDir": "フォルダ未作成", - "missingProviderAccount": "Provider 未選択" - }, - "settings": { - "title": "Agent 設定", - "titleWithName": "{name} 設定", - "description": "Agent 名を更新し、この Agent に属するチャンネルを確認します。", - "identityTitle": "基本情報", - "modelTitle": "モデル", - "modelLabel": "Model", - "bindingTitle": "チャンネル担当", - "bindingHelp": "この Agent に現在解決されるチャンネル / アカウント担当を読み取り専用で表示します。", - "bindingEmpty": "この Agent にはまだチャンネルまたはアカウントの担当がありません。", - "nameLabel": "Agent 名", - "agentIdLabel": "Agent ID", - "providerAccountLabel": "Provider アカウント", - "useDefaultProvider": "ワークスペース既定の Provider を使う", - "modelRefLabel": "モデル上書き", - "modelRefPlaceholder": "provider/model-id", - "effectiveProviderLabel": "現在の Provider", - "effectiveModelLabel": "現在のモデル", - "modelHelp": "空欄のままなら選択した Provider のモデルを使い、Provider が固定されていなければワークスペース既定モデルを継承します。", - "inheritModel": "継承モデルに戻す", - "saveIdentity": "名前を保存", - "saveModel": "モデルを保存", - "save": "保存", - "saving": "保存中...", - "managedFromModels": "Main Agent は Models ページで設定した Provider と既定モデルに従います。", - "openModels": "Models を開く", - "workspaceTitle": "ワークスペース", - "workspaceDescription": "現在のワークスペースパスと、Main Agent のワークスペースを継承しているかを確認します。", - "inheritedWorkspaceLabel": "Main Agent のワークスペースを継承", - "inheritedWorkspaceYes": "はい", - "inheritedWorkspaceNo": "いいえ", - "channelSummaryLabel": "チャンネルルーティング要約", - "accountBindingsLabel": "アカウント紐付け数", - "providerLoadErrorPrefix": "Provider アカウントの読み込みに失敗しました: ", - "refreshCatalog": "データを更新", - "manageBindings": "Channels を開く", - "boundToLabel": "担当: {owner}", - "channelFallbackLabel": "チャンネル既定担当", - "channelFallbackHelp": "このチャンネル配下のアカウントに個別担当がない場合に使われます。", - "channelBindingLabel": "チャンネル継承", - "accountBindingLabel": "アカウント個別設定", - "unassigned": "未割り当て", - "noChannelAccounts": "このチャンネルではまだ表示できるアカウントが見つかっていません。", - "bindingReadonly": "ここでは担当を読み取り専用で表示します。channel/account の変更は Channels ページで行ってください。", - "providerLoadError": "Provider アカウントの読み込みに失敗しました: {error}", - "channelLoadError": "チャンネルアカウントの読み込みに失敗しました: {error}", - "closeLabel": "ダイアログを閉じる", - "notConfigured": "未設定", - "channelsTitle": "チャンネル", - "channelsDescription": "この一覧は読み取り専用です。チャンネルアカウントと紐付けは Channels ページで管理してください。", - "noChannels": "この Agent にはまだチャンネルが割り当てられていません。", - "channelsManagedInChannels": "この Agent に明示的なアカウント紐付けは見つかりませんでした。チャンネル単位の担当は Channels で確認してください。", - "mainAccount": "メインアカウント", - "unsavedChangesTitle": "未保存の変更を破棄しますか?", - "unsavedChangesMessage": "未保存の変更があります。今閉じると破棄されます。", - "closeWithoutSaving": "保存せずに閉じる", - "modelOverrideDescription": "この Agent のモデル上書きを更新します。現在の既定モデル: {defaultModel}", - "modelProviderLabel": "モデル Provider", - "modelProviderPlaceholder": "Provider を選択", - "modelIdLabel": "モデル ID", - "modelIdPlaceholder": "gpt-5.4", - "modelPreview": "モデルプレビュー", - "modelProviderEmpty": "モデル設定に使える Provider がまだありません。先に Models で Provider を設定してください。", - "useDefaultModel": "既定モデルを使う", - "modelProviderRequired": "先に Provider を選択してください。", - "modelIdRequired": "モデル ID を入力してください。", - "modelInvalid": "モデル設定の形式が正しくありません。" - } -} diff --git a/src/i18n/locales/ja/channels.json b/src/i18n/locales/ja/channels.json deleted file mode 100644 index cb2d20d..0000000 --- a/src/i18n/locales/ja/channels.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "page": { - "title": "対応チャンネル", - "description": "このページでは、対応チャンネルのモジュール、設定入口、更新操作をまとめて扱います。", - "refresh": "更新", - "pluginBadge": "プラグイン", - "configure": "設定を開始", - "empty": "設定可能なチャンネルモジュールはまだありません。", - "refreshed": "対応チャンネル一覧を更新しました。", - "saved": "{name} の設定を保存しました。", - "defaultAccountLabel": "デフォルトアカウント" - }, - "validation": { - "requiredField": "{field} を入力してください" - }, - "connectionType": { - "qr": "QRコード", - "webhook": "Webhook", - "token": "Token" - }, - "meta": { - "telegram": { - "name": "Telegram", - "description": "@BotFather が発行したボットトークンで Telegram に接続します。" - }, - "discord": { - "name": "Discord", - "description": "開発者ポータルのボットトークンで Discord に接続します。" - }, - "whatsapp": { - "name": "WhatsApp", - "description": "QR コードをスキャンして WhatsApp に接続します。電話番号は不要です。" - }, - "wechat": { - "name": "WeChat", - "description": "公式 OpenClaw プラグイン経由で QR スキャンし、個人 WeChat に接続します。" - }, - "dingtalk": { - "name": "DingTalk", - "description": "OpenClaw チャンネルプラグイン経由で DingTalk に接続します(Stream モード)。" - }, - "feishu": { - "name": "Feishu / Lark", - "description": "Feishu 公式の OpenClaw プラグイン経由で Feishu/Lark ボットに接続します。" - }, - "wecom": { - "name": "WeCom", - "description": "プラグイン経由で WeCom ボットに接続します。" - }, - "qqbot": { - "name": "QQ Bot", - "description": "QQ ボットチャンネルに接続します(OpenClaw 3.31 以降は内蔵)。" - } - }, - "modal": { - "title": "チャンネル設定", - "description": "まずチャンネル種類を選び、このテンプレートで使える接続項目を入力します。", - "configureTitle": "{name} を設定", - "typeLabel": "チャンネル種類", - "accountIdLabel": "Account ID", - "docsLabel": "ドキュメントと手順", - "instructionsTitle": "接続手順", - "howTo": "接続方法", - "viewDocs": "ドキュメントを見る", - "validate": "検証", - "validateConfig": "設定を検証", - "validating": "検証中...", - "saveAndConnect": "保存して接続", - "envVar": "環境変数", - "envVars": "環境変数", - "fieldDocs": "項目の説明", - "docsUrl": "ドキュメント URL", - "envVarHint": "必要に応じて、これらの値は環境変数からも指定できます。", - "credentialsVerified": "認証情報を確認しました", - "validationFailed": "検証に失敗しました", - "warnings": "警告", - "noAdditionalFields": "このチャンネルに追加項目はありません。", - "showSecret": "シークレットを表示", - "hideSecret": "シークレットを隠す", - "tokenHelpText": "選択したチャンネルに必要な token、secret、またはアクセス資格情報を入力してください。", - "diagnosticsNote": "QR コードと診断の導線は、バックエンド契約が整ってから接続します。", - "todoNote": "TODO: QR と診断は現在プレースホルダです。modal は引き続き props 駆動のままにしておきます。", - "confirm": "チャンネルを保存" - } -} diff --git a/src/i18n/locales/ja/chat.json b/src/i18n/locales/ja/chat.json deleted file mode 100644 index 589be27..0000000 --- a/src/i18n/locales/ja/chat.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "newConversation": "新しい会話", - "untitledConversation": "無題の会話", - "attachmentPlaceholder": "(ファイルを添付しました)", - "userName": "あなた", - "assistantName": "YINIAN", - "errors": { - "modelUnavailable": "現在の Agent で利用可能なモデルを設定するか、Models ページで既定モデルを先に設定してください。", - "readFile": "ファイルの読み込みに失敗しました" - }, - "composer": { - "placeholder": "メッセージを入力し、Enter で送信、Shift + Enter で改行", - "dismissError": "閉じる", - "attachAria": "添付ファイルを追加", - "sendAria": "メッセージを送信", - "stopAria": "生成を停止", - "removeAttachment": "{{name}} を添付から削除" - }, - "messageList": { - "loading": "会話内容を読み込み中...", - "emptyHint": "質問を入力して新しい会話を始めましょう。既存のメッセージとストリーミング応答はここに直接表示されます。", - "streaming": "返信を生成中...", - "assistantBadge": "AI", - "userBadge": "私" - }, - "historyPanel": { - "expandSidebar": "サイドバーを展開", - "collapseSidebar": "サイドバーを折りたたむ", - "loading": "会話履歴を読み込み中...", - "moreActions": "その他の操作", - "rename": "名前を変更", - "delete": "削除" - }, - "renameDialog": { - "title": "会話名を変更", - "description": "現在の会話に、あとで見つけやすい名前を付けます。", - "close": "ダイアログを閉じる", - "label": "会話タイトル", - "placeholder": "新しい会話名を入力", - "hint": "あとから再度変更することもできます。", - "cancel": "キャンセル", - "confirm": "名前を保存" - }, - "deleteDialog": { - "title": "会話を削除", - "description": "削除すると元に戻せません。続行する前に確認してください。", - "close": "ダイアログを閉じる", - "label": "会話タイトル", - "cancel": "キャンセル", - "deleting": "削除中...", - "confirm": "削除を確認" - } -} diff --git a/src/i18n/locales/ja/common.json b/src/i18n/locales/ja/common.json deleted file mode 100644 index ea6c18c..0000000 --- a/src/i18n/locales/ja/common.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "app": { - "title": "ZN-AI" - }, - "window": { - "minimize": "最小化", - "maximize": "最大化", - "restore": "元に戻す", - "close": "閉じる" - }, - "dialog": { - "cancel": "キャンセル", - "confirm": "確認", - "close": "閉じる" - }, - "theme": { - "light": "ライト", - "dark": "ダーク", - "system": "システム" - }, - "language": { - "zh": "中国語", - "en": "英語", - "ja": "日本語" - }, - "common": { - "loading": "読み込み中...", - "loadingPage": "ページを読み込み中...", - "retry": "再試行", - "unknownError": "不明なエラー" - }, - "brand": { - "logoAlt": "Logo" - }, - "sidebar": { - "home": "ホーム", - "knowledge": "ナレッジ", - "channels": "チャンネル", - "agents": "Agents", - "models": "モデル", - "skills": "スキル", - "cron": "定時タスク", - "scripts": "スクリプト", - "settings": "設定" - } -} diff --git a/src/i18n/locales/ja/cron.json b/src/i18n/locales/ja/cron.json deleted file mode 100644 index 912c906..0000000 --- a/src/i18n/locales/ja/cron.json +++ /dev/null @@ -1,187 +0,0 @@ -{ - "title": "定時タスク", - "subtitle": "AI 工作流を自動化する定時タスク", - "actions": { - "refresh": "更新", - "newTask": "新規タスク", - "createTask": "タスクを作成", - "runNow": "今すぐ実行", - "delete": "削除" - }, - "stats": { - "total": "全タスク", - "active": "有効", - "paused": "停止中", - "failed": "直近の失敗" - }, - "empty": { - "title": "定時タスクがありません", - "description": "タスクを作成し、チャンネルアカウントと配信先を事前に設定できます。" - }, - "loading": "タスクを読み込み中...", - "warnings": { - "agentsLoadFailed": "Agents の読み込みに失敗しました。現在のスナップショットで表示を継続します。{error}", - "channelsLoadFailed": "チャンネルアカウントの読み込みに失敗しました。配信情報はプレースホルダー表示になります。{error}", - "channelsCatalogFailed": "チャンネルアカウントの読み込みに失敗しました。既存の設定は保持できます。{error}", - "targetsLoadFailed": "配信先候補の読み込みに失敗しました。手動入力は可能です。{error}", - "noChannelsAvailable": "利用可能なチャンネルアカウントがありません。現在は配信型タスクを作成できません。" - }, - "feedback": { - "updated": "タスクを更新しました。", - "created": "タスクを作成しました。", - "enabled": "タスクを有効にしました。", - "paused": "タスクを停止しました。", - "triggered": "タスクを実行しました。", - "deleted": "タスクを削除しました。" - }, - "confirmDelete": "「{name}」を削除しますか?この操作は元に戻せません。", - "common": { - "unnamedJob": "無題のタスク" - }, - "card": { - "enabled": "有効", - "paused": "停止", - "modeAnnounce": "実行して送信", - "modeNone": "実行のみ", - "pauseTask": "タスクを停止", - "enableTask": "タスクを有効化", - "agentLabel": "Agent", - "deliveryLabel": "配信", - "lastRun": "前回実行:{time}", - "nextRun": "次回実行:{time}", - "success": "成功", - "failed": "失敗" - }, - "dialog": { - "editTitle": "タスクを編集", - "createTitle": "タスクを作成", - "subtitle": "自動化 AI タスクを設定します", - "nameLabel": "タスク名", - "namePlaceholder": "例:朝のブリーフィング", - "messageLabel": "メッセージ / プロンプト", - "messagePlaceholder": "タスクが実行・通知する内容を入力します", - "scheduleLabel": "スケジュール", - "customCronPlaceholder": "Cron 式を入力(例:0 9 * * *)", - "nextRun": "次回実行:{time}", - "scheduleHint": "プリセットを選ぶか、カスタム Cron 式を入力してください", - "usePreset": "プリセットを使用", - "useCustom": "カスタム Cron", - "deliveryTitle": "配信設定", - "deliverySubtitle": "結果を NIANXX に保持するか、外部チャンネルに送信します。", - "deliveryOptions": { - "noneTitle": "NIANXX 内のみ", - "noneDesc": "タスクは通常実行され、結果はアプリ内に保持されます。", - "announceTitle": "外部チャンネルへ送信", - "announceDesc": "最終結果を設定済みメッセージチャンネルへ配信します。" - }, - "channelLabel": "チャンネル", - "channelEmpty": "利用可能なチャンネルはありません", - "accountLabel": "アカウント", - "accountLoading": "チャンネルアカウントを読み込み中…", - "accountEmpty": "このチャンネルにはアカウントがありません", - "targetLabel": "送信先", - "targetPlaceholder": "例:運用グループ、room-ops、https://example.com/webhook", - "targetsLoading": "このチャンネルアカウントの候補を読み込み中...", - "targetsReady": "候補が利用可能です。グループ名、ユーザー ID、Webhook も手動入力できます。", - "targetsNone": "候補が見つかりません。グループ名、ユーザー ID、Webhook を手動入力できます。", - "preview": "プレビュー:{preview}", - "currentAccount": "現在のアカウント:{account}", - "enableTitle": "すぐに有効化", - "enableDesc": "作成後すぐにこのタスクの実行を開始します。", - "saving": "保存中...", - "saveEdit": "変更を保存", - "create": "タスクを作成" - }, - "validation": { - "nameRequired": "タスク名を入力してください。", - "messageRequired": "メッセージ/プロンプトを入力してください。", - "scheduleRequired": "スケジュールを入力してください。", - "channelRequired": "配信チャンネルを選択してください。", - "targetRequired": "配信先(グループ、ユーザー ID、Webhook)を入力してください。" - }, - "delivery": { - "none": "実行のみ(配信なし)", - "pending": "配信設定が未完了です", - "targetPending": "送信先が未入力です" - }, - "deliveryTarget": { - "savedCustom": "このタスクに保存されているカスタム送信先" - }, - "channels": { - "unnamed": "名称未設定のチャンネル", - "mainAccount": "メインアカウント", - "douyin": "Douyin", - "feishu": "Feishu", - "fliggy": "Fliggy", - "meituan": "Meituan", - "qqbot": "QQ Bot", - "telegram": "Telegram", - "wechat": "WeChat", - "wecom": "WeCom" - }, - "agent": { - "main": "メイン Agent", - "workspace": "ワークスペース {path}", - "dir": "ディレクトリ {path}", - "sharedMainWorkspace": "メインワークスペースを共有", - "syncPending": "ワークスペース同期待ち" - }, - "weekdays": { - "sun": "日", - "mon": "月", - "tue": "火", - "wed": "水", - "thu": "木", - "fri": "金", - "sat": "土" - }, - "time": { - "justNow": "たった今", - "secondsAgo": "{count} 秒前", - "minutesAgo": "{count} 分前", - "hoursAgo": "{count} 時間前", - "daysAgo": "{count} 日前" - }, - "schedule": { - "once": "1回のみ · {time}", - "everySeconds": "{count} 秒ごと", - "everyMinutes": "{count} 分ごと", - "everyHours": "{count} 時間ごと", - "everyDays": "{count} 日ごと", - "everyMinute": "毎分", - "everyNMinutes": "{count} 分ごと", - "hourly": "毎時", - "weekly": "毎週 {weekday} {time}", - "monthly": "毎月 {day} 日 {time}", - "daily": "毎日 {time}", - "presets": { - "every-minute": "毎分", - "every-5-minutes": "5 分ごと", - "every-15-minutes": "15 分ごと", - "every-hour": "毎時", - "daily-9": "毎日 09:00", - "daily-18": "毎日 18:00", - "weekly-mon": "毎週月曜 09:00", - "monthly-first": "毎月 1 日 09:00" - } - }, - "fallback": { - "jobs": { - "morningBriefing": { - "name": "朝のブリーフィング", - "message": "開店前に、当番スタッフへチャンネル状態と本日の在庫確認を通知します。", - "target": "朝番グループ" - }, - "channelCheck": { - "name": "チャンネル監視", - "message": "Fliggy、Meituan、Douyin のオンライン状態を 15 分ごとに確認します。" - }, - "reviewSummary": { - "name": "レビュー要約", - "message": "毎晩、レビュー対応リストを生成して運用へ送信します。", - "target": "運用レビューグループ", - "error": "チャンネル応答がタイムアウトしました。夜間要約が完了しませんでした。ゲートウェイとサービス状態を確認してください。" - } - } - } -} diff --git a/src/i18n/locales/ja/dashboard.json b/src/i18n/locales/ja/dashboard.json deleted file mode 100644 index 823c165..0000000 --- a/src/i18n/locales/ja/dashboard.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "route": { - "loading": "ページを読み込み中..." - }, - "historyBuckets": { - "today": "今日", - "yesterday": "昨日", - "withinWeek": "過去7日", - "withinTwoWeeks": "過去14日", - "withinMonth": "過去30日", - "older": "以前" - }, - "historyTime": { - "yesterdayAt": "昨日 {{time}}" - }, - "taskDate": { - "currentPeriod": "実行期間", - "today": "今日", - "yesterday": "昨日" - }, - "conversation": { - "title": "スマート会話", - "gatewayStatusSummary": "ゲートウェイ状態: {{status}}", - "gatewayStatus": { - "connected": "接続済み", - "reconnecting": "再接続中", - "disconnected": "未接続" - }, - "currentAgentSummary": "現在の Agent: {{name}}", - "modelSummary": "モデル: {{name}}", - "agentLabel": "Agent", - "refresh": "更新" - } -} diff --git a/src/i18n/locales/ja/knowledge.json b/src/i18n/locales/ja/knowledge.json deleted file mode 100644 index bfd9ef0..0000000 --- a/src/i18n/locales/ja/knowledge.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "title": "ナレッジ文書", - "subtitle": "knowledge ディレクトリに保存されたローカル文書ファイルをアップロード、確認、削除します。", - "refresh": "更新", - "upload": "文書をアップロード", - "documentsLabel": "文書数", - "storageLabel": "ストレージ", - "emptyTitle": "文書がありません", - "emptyDescription": "ファイルをアップロードして、ローカルのナレッジ文書ディレクトリの管理を始めてください。", - "table": { - "name": "名前", - "size": "サイズ", - "modifiedAt": "更新日時", - "type": "種類", - "actions": "操作", - "delete": "削除" - }, - "dialog": { - "title": "文書をアップロード", - "description": "ファイルを選択してローカルのナレッジ文書ディレクトリに保存します。", - "fileLabel": "ファイル", - "fileHint": "アップロードしたファイルは、ファイル名とメタデータを保持したまま保存されます。", - "cancel": "キャンセル", - "confirm": "アップロード" - }, - "deleteDialog": { - "title": "文書を削除しますか?", - "description": "「{name}」をローカルのナレッジ文書ディレクトリから完全に削除します。", - "confirm": "文書を削除", - "close": "ダイアログを閉じる" - }, - "status": { - "loading": "文書を読み込み中...", - "uploading": "アップロード中...", - "deleting": "削除中...", - "uploadSuccess": "文書をアップロードしました", - "deleteSuccess": "文書を削除しました", - "failed": "ナレッジ文書のリクエストに失敗しました: {error}" - }, - "errors": { - "readFile": "ファイルの読み取りに失敗しました" - }, - "fallback": { - "documentName": "文書 {count}", - "fileType": "ファイル" - }, - "common": { - "cancel": "キャンセル", - "confirm": "確認" - } -} diff --git a/src/i18n/locales/ja/login.json b/src/i18n/locales/ja/login.json deleted file mode 100644 index fc32f82..0000000 --- a/src/i18n/locales/ja/login.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "title": "おかえりなさい", - "subtitle": "24時間待機し、いつでも支援できるデジタルチームメイトです。", - "username": "アカウント", - "password": "パスワード", - "verificationCode": "認証コード", - "usernamePlaceholder": "アカウントを入力してください", - "passwordPlaceholder": "パスワードを入力してください", - "verificationCodePlaceholder": "認証コードを入力してください", - "usernameRequired": "ユーザー名を入力してください", - "passwordRequired": "パスワードを入力してください", - "codeRequired": "認証コードを入力してください", - "submitFailed": "ログインに失敗しました。しばらくしてからもう一度お試しください", - "errors": { - "missingAccessToken": "ログインに失敗しました。access_token が返されませんでした", - "submitStatus": "ログインに失敗しました ({status})" - }, - "submit": "ログイン", - "submitting": "ログイン中...", - "loadingCaptcha": "読み込み中...", - "captchaAlt": "認証コード" -} diff --git a/src/i18n/locales/ja/models.json b/src/i18n/locales/ja/models.json deleted file mode 100644 index 45cd18a..0000000 --- a/src/i18n/locales/ja/models.json +++ /dev/null @@ -1,100 +0,0 @@ -{ - "page": { - "title": "モデル設定", - "subtitle": "AI プロバイダーを設定し、モデルの Token 使用状況を確認できます。" - }, - "common": { - "closeDialog": "ダイアログを閉じる", - "unknownModel": "不明なモデル", - "unknown": "不明", - "empty": "データなし", - "loading": "読み込み中...", - "ai": "AI" - }, - "providers": { - "title": "AI プロバイダー", - "subtitle": "AI モデルと API キーを管理します。", - "providerName": "Provider", - "add": "プロバイダーを追加", - "loading": "プロバイダー設定を読み込み中...", - "defaultBadge": "デフォルト", - "configured": "設定済み", - "notConfigured": "未設定", - "setDefault": "デフォルトに設定", - "edit": "編集", - "delete": "削除", - "empty": "モデル設定はまだ取得されていません。", - "confirmDelete": "このプロバイダーを削除してもよろしいですか?", - "notices": { - "loadError": "プロバイダー設定の読み込みに失敗しました。", - "defaultSuccess": "デフォルトのプロバイダーを設定しました。", - "defaultError": "デフォルトのプロバイダー設定に失敗しました。", - "deleteSuccess": "プロバイダーを削除しました。", - "deleteError": "プロバイダーの削除に失敗しました。", - "saveSuccess": "プロバイダーを保存しました。", - "saveError": "プロバイダーの保存に失敗しました。" - }, - "picker": { - "title": "AI プロバイダーを追加", - "subtitle": "モデルアクセスと API ルーティング用の新しいプロバイダーを設定します。" - }, - "editor": { - "addTitle": "AI プロバイダーを追加", - "editTitle": "プロバイダーを編集", - "subtitle": "このデバイスに保存されるプロバイダーアカウント情報を設定します。", - "switchProvider": "プロバイダーを切り替え", - "viewDocs": "ドキュメントを見る", - "displayName": "表示名", - "displayNamePlaceholder": "プロバイダー名", - "apiKey": "API キー", - "apiKeyPlaceholder": "API キーを入力", - "apiKeyHint": "API キーはこの端末にのみ保存されます。", - "baseUrl": "Base URL(任意)", - "baseUrlPlaceholder": "https://api.example.com/v1", - "defaultModel": "デフォルトモデル(任意)", - "defaultModelPlaceholder": "gpt-5.4", - "saving": "保存中...", - "save": "保存", - "add": "プロバイダーを追加" - } - }, - "usage": { - "title": "Token 使用履歴", - "loading": "使用履歴を読み込み中...", - "loadError": "使用履歴の読み込みに失敗しました。", - "empty": "使用履歴はありません。", - "emptyWindow": "選択した期間には使用履歴がありません。", - "groupByModel": "モデル別", - "groupByTime": "時間別", - "window7d": "過去 7 日", - "window30d": "過去 30 日", - "windowAll": "全期間", - "showingRecords": "{{count}} 件を表示", - "chart": { - "total": "合計", - "input": "入力", - "output": "出力", - "cache": "キャッシュ" - }, - "row": { - "noUsageInfo": "使用量情報なし", - "errorParsingUsage": "使用量の解析エラー", - "input": "入力: {{count}}", - "output": "出力: {{count}}", - "cacheRead": "キャッシュ読込: {{count}}", - "cacheWrite": "キャッシュ書込: {{count}}", - "noUsageReported": "使用量が報告されていません", - "parseError": "解析エラー", - "viewContent": "内容を見る", - "error": "エラー" - }, - "pagination": { - "pageOf": "{{page}} / {{total}} ページ", - "prev": "前へ", - "next": "次へ" - }, - "requestContent": { - "title": "リクエスト内容" - } - } -} diff --git a/src/i18n/locales/ja/scripts.json b/src/i18n/locales/ja/scripts.json deleted file mode 100644 index 406f589..0000000 --- a/src/i18n/locales/ja/scripts.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "page": { - "title": "スクリプト", - "subtitle": "Playwright 自動化スクリプトを録画、編集、実行します。", - "searchPlaceholder": "スクリプトを検索...", - "clearSearch": "検索をクリア", - "stats": { - "total": "合計 {{count}}", - "active": "有効 {{count}}", - "failed": "失敗 {{count}}" - }, - "newScript": "新規スクリプト", - "refresh": "更新", - "loading": "スクリプトを読み込み中...", - "emptySearch": { - "title": "一致するスクリプトがありません", - "description": "別のキーワードを試すか、検索をクリアしてすべてのスクリプトを表示してください。", - "actionLabel": "検索をクリア" - }, - "emptyDefault": { - "title": "スクリプトがありません", - "description": "Playwright 自動化スクリプトを作成または録画して、チャネル対応を React ページへ移行しましょう。", - "actionLabel": "最初のスクリプトを作成" - } - }, - "feedback": { - "createdStartingCodegen": "スクリプトを作成しました。codegen の起動を試しています。", - "recordingCompletedWithCode": "録画が完了し、生成されたコードを持ってエディタを開きました。", - "codegenFailed": "codegen の起動に失敗しました。後で編集画面から手動で録画してください。", - "saved": "スクリプトの変更を保存しました。", - "enabled": "スクリプトを有効にしました。", - "disabled": "スクリプトを無効にしました。", - "testSuccess": "スクリプトのテストに成功しました。", - "testFailed": "スクリプトのテストに失敗しました。出力ログを確認してください。", - "deleted": "スクリプトを削除しました。", - "recordingStartFailed": "録画の開始に失敗しました。", - "recordingStarted": "録画を開始しました。新しいウィンドウで操作を完了してください。", - "recordingStopped": "録画を停止し、コードを反映しました。", - "recordingStopFailed": "録画の停止に失敗しました。" - }, - "card": { - "channels": { - "fliggy": "Fliggy", - "meituan": "Meituan", - "douyin": "Douyin", - "common": "共通" - }, - "status": { - "enabled": "有効", - "disabled": "無効" - }, - "noDescription": "スクリプトの説明はまだありません。", - "lastRun": "前回の実行: {{time}}", - "failed": "失敗", - "neverRun": "実行履歴はまだありません", - "testing": "テスト中...", - "test": "テスト", - "editing": "読み込み中...", - "edit": "編集", - "delete": "削除", - "relative": { - "justNow": "たった今" - } - }, - "dialogs": { - "close": "閉じる", - "create": { - "title": "スクリプトを作成", - "subtitle": "まず保存できるスクリプトを作成し、その後 Playwright コードの録画や編集を続けます。", - "nameLabel": "スクリプト名", - "namePlaceholder": "例: Fliggy 客室状況収集", - "descriptionLabel": "スクリプト説明", - "descriptionPlaceholder": "このスクリプトの役割を簡単に説明してください。", - "channelLabel": "チャネルリンク", - "channelPlaceholder": "対象チャネルの URL を貼り付けるか、空のまま後で追加できます。", - "channelHint": "作成後に codegen の起動を試み、録画結果をエディタに戻します。", - "cancel": "キャンセル", - "saving": "作成中...", - "confirm": "作成して録画" - }, - "edit": { - "missingChannel": "録画を開始する前にチャネルリンクを入力してください。", - "replaceChannelSuccess": "コード内の既知のチャネルリンクを現在の入力値に置き換えました。", - "title": "スクリプトを編集", - "subtitle": "スクリプト情報を更新し、Playwright コードを保守し、必要に応じて再録画します。", - "nameLabel": "スクリプト名", - "namePlaceholder": "スクリプト名を入力", - "descriptionLabel": "スクリプト説明", - "descriptionPlaceholder": "用途、依存ページ、注意点を追加します。", - "channelLabel": "チャネルリンク", - "replaceChannelUrls": "コード内のチャネル URL を置換", - "channelPlaceholder": "チャネル URL を貼り付け", - "codeLabel": "スクリプトコード", - "stopRecordingBusy": "停止中...", - "stopRecording": "録画を停止", - "startRecordingBusy": "開始中...", - "startRecording": "録画を開始", - "recordingHint": "録画中です。新しいウィンドウで操作を完了し、その後「録画を停止」をクリックしてコードを反映してください。", - "codePlaceholder": "// ここに Playwright 自動化スクリプトを記述します", - "enableTitle": "スクリプトを有効化", - "enableDescription": "保存後すぐにスクリプトを利用可能な状態に保ちます。", - "cancel": "キャンセル", - "saving": "保存中...", - "confirm": "変更を保存" - }, - "delete": { - "title": "スクリプトを削除", - "subtitle": "削除するとスクリプトファイルも一緒に削除されます。本当に続行しますか。", - "confirmNamed": "「{{name}}」を削除しますか? この操作は取り消せません。", - "confirmUnnamed": "このスクリプトを削除しますか? この操作は取り消せません。", - "cancel": "キャンセル", - "deleting": "削除中...", - "confirm": "削除を確認" - } - } -} diff --git a/src/i18n/locales/ja/settings.json b/src/i18n/locales/ja/settings.json deleted file mode 100644 index 76f7311..0000000 --- a/src/i18n/locales/ja/settings.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "menu": { - "systemSettings": "システム設定", - "account": "アカウント", - "general": "一般", - "agents": "Agents", - "models": "Models" - }, - "account": { - "title": "アカウント設定", - "description": "アカウント情報とサインインの安全性を管理します。", - "accountLabel": "アカウント", - "passwordLabel": "ログインパスワード", - "passwordHelp": "投資家ログインに使用します。最終ログイン時刻:{time}", - "configured": "設定済み", - "changePassword": "パスワードを変更" - }, - "general": { - "title": "基本設定", - "description": "アプリの見た目と操作感をカスタマイズします。", - "themeSection": "テーマ設定", - "languageSection": "言語", - "launchAtStartupTitle": "システム起動時に自動起動", - "launchAtStartupDescription": "システムにログインした後、アプリを自動的に起動します", - "gatewayTitle": "ゲートウェイ", - "gatewayDescription": "現在のゲートウェイ状態と基本的なランタイム操作を確認します。", - "gatewayStatusLabel": "状態", - "gatewayPortLabel": "ポート", - "gatewayConnected": "稼働中", - "gatewayDisconnected": "停止中", - "gatewayReconnecting": "再起動中", - "gatewayRestart": "再起動", - "gatewayLogs": "ログ", - "gatewayHideLogs": "ログを閉じる", - "gatewayLogsEmpty": "まだログはありません。", - "gatewayLogsLoading": "ログを読み込み中...", - "gatewayAutoStartTitle": "ゲートウェイを自動起動", - "gatewayAutoStartDescription": "アプリ起動時にゲートウェイを自動起動します", - "updatesTitle": "アップデート", - "currentVersion": "現在のバージョン", - "checkForUpdates": "更新を確認", - "checkingForUpdates": "更新を確認しています...", - "latestVersion": "最新バージョンを使用しています", - "newVersionAvailable": "新しいバージョンがあります:v{version}", - "downloadingVersion": "新しいバージョンをダウンロード中... {percent}%", - "downloadComplete": "ダウンロードが完了しました。インストールできます", - "updateError": "アップデートエラー:{error}", - "updateHint": "最新機能を利用するには更新を確認してください。", - "downloadUpdate": "更新をダウンロード", - "restartAndInstall": "再起動してインストール", - "autoCheckTitle": "更新を自動確認", - "autoCheckDescription": "起動時に更新を確認します", - "autoDownloadTitle": "更新を自動ダウンロード", - "autoDownloadDescription": "更新を自動でダウンロードしてインストールします", - "autoUpdateHint": "自動更新を有効にすると、更新が自動でダウンロードされてインストールされます。" - } -} diff --git a/src/i18n/locales/ja/skills.json b/src/i18n/locales/ja/skills.json deleted file mode 100644 index ff1a51d..0000000 --- a/src/i18n/locales/ja/skills.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "title": "スキル", - "subtitle": "AI 機能を閲覧して管理", - "gatewayWarning": "ゲートウェイが稼働していません。アクティブなゲートウェイがないとスキルを読み込めません。", - "refresh": "更新", - "openFolder": "スキルフォルダを開く", - "filter": { - "all": "すべて ({{count}})", - "builtIn": "内蔵 ({{count}})", - "marketplace": "マーケット ({{count}})" - }, - "search": "スキルを検索...", - "searchMarketplace": "マーケットを検索...", - "actions": { - "enableVisible": "表示中を有効化", - "disableVisible": "表示中を無効化", - "installSkill": "スキルをインストール" - }, - "noSkillsSearch": "別の検索語を試してください", - "noSkillsAvailable": "利用可能なスキルがありません", - "detail": { - "source": "ソース", - "coreSystem": "コアシステム", - "bundled": "内蔵", - "userInstalled": "ユーザー導入", - "enabled": "有効", - "disabled": "無効", - "apiKey": "API キー", - "apiKeyPlaceholder": "API キーを入力(任意)", - "apiKeyDesc": "このスキルの主要な API キーです。", - "envVars": "環境変数", - "addVariable": "変数を追加", - "noEnvVars": "環境変数はまだ設定されていません。", - "keyPlaceholder": "キー(例: BASE_URL)", - "valuePlaceholder": "値", - "envNote": "空のキーは保存時に自動削除されます。", - "saving": "保存中...", - "saveConfig": "設定を保存", - "configSaved": "設定を保存しました", - "openManual": "マニュアルを開く", - "openActualFolder": "実際のフォルダを開く", - "copyPath": "パスをコピー", - "pathUnavailable": "パスを取得できません", - "uninstall": "アンインストール", - "enable": "有効化", - "disable": "無効化" - }, - "source": { - "badge": { - "bundled": "内蔵", - "managed": "管理ディレクトリ", - "workspace": "ワークスペース", - "extra": "追加ディレクトリ", - "agentsPersonal": "個人 .agents", - "agentsProject": "プロジェクト .agents", - "unknown": "不明なソース" - } - }, - "toast": { - "enabled": "スキルを有効にしました", - "disabled": "スキルを無効にしました", - "installed": "スキルをインストールして有効にしました", - "uninstalled": "スキルを正常にアンインストールしました", - "openedEditor": "エディタで開きました", - "failedEditor": "エディターを開けませんでした", - "failedSave": "設定の保存に失敗しました", - "failedOpenFolder": "スキルフォルダを開けませんでした", - "failedInstall": "インストールに失敗しました", - "failedUninstall": "アンインストールに失敗しました", - "failedFolderNotFound": "スキルフォルダがまだ存在しません。先にスキルをインストールしてください。", - "copiedPath": "パスをコピーしました", - "failedCopyPath": "パスのコピーに失敗しました", - "failedOpenActualFolder": "実際のスキルフォルダを開けませんでした", - "searchTimeoutError": "検索がタイムアウトしました。ClawHub.aiで検索してZIPをダウンロードし、\"{{path}}\" に展開することも可能です", - "installTimeoutError": "インストールがタイムアウトしました。ClawHub.aiでZIPをダウンロードし、\"{{path}}\" に展開することも可能です", - "searchRateLimitError": "検索リクエストの制限を超過しました。ClawHub.aiで検索してZIPをダウンロードし、\"{{path}}\" に展開することも可能です", - "installRateLimitError": "インストールリクエストの制限を超過しました。ClawHub.aiからZIPをダウンロードし、\"{{path}}\" に展開することも可能です", - "fetchTimeoutError": "スキルリストの取得がタイムアウトしました。ネットワークを確認してください。", - "fetchRateLimitError": "スキルリスト取得のリクエスト制限を超過しました。後でお試しください。", - "timeoutError": "リクエストがタイムアウトしました。後でもう一度お試しください。", - "rateLimitError": "リクエストの制限を超過しました。後でもう一度お試しください。", - "noBatchEnableTargets": "表示中のスキルはすべて有効です。", - "noBatchDisableTargets": "表示中のスキルはすべて無効です。", - "batchEnabled": "{{count}} 件のスキルを有効化しました。", - "batchDisabled": "{{count}} 件のスキルを無効化しました。", - "batchPartial": "{{success}} / {{total}} 件を更新しました。一部失敗しています。" - }, - "marketplace": { - "installDialogTitle": "スキルをインストール", - "installDialogSubtitle": "初期表示は Explore、キーワード入力時に検索します。", - "sourceLabel": "ソース", - "sourceClawHub": "ClawHub", - "securityNote": "インストール前にスキルカードをクリックして、ClawHubでドキュメントとセキュリティ情報を確認してください。", - "manualInstallHint": "ネットワークに問題がありますか?いつでもClawHub.aiからスキルのZIPをダウンロードし、手動で \"{{path}}\" に展開してインストールできます。", - "searching": "ClawHub を検索中...", - "noResults": "一致するスキルが見つかりません。", - "emptyPrompt": "新しいスキルを検索して機能を広げましょう。", - "searchError": "ClawHub の検索に失敗しました。接続または導入状況を確認してください。", - "install": "インストール" - } -} diff --git a/src/i18n/locales/ja/task.json b/src/i18n/locales/ja/task.json deleted file mode 100644 index c2d3363..0000000 --- a/src/i18n/locales/ja/task.json +++ /dev/null @@ -1,94 +0,0 @@ -{ - "dialog": { - "close": "ダイアログを閉じる" - }, - "taskCenter": { - "items": { - "channelOpen": { - "title": "選択したチャネルを開く", - "description": "手動アカウントでログインし、自動化実行の準備を整えます。" - }, - "roomTypeManage": { - "title": "チャネル客室タイプ", - "description": "販売チャネルごとの客室タイプの開閉を管理します。" - } - }, - "configureChannels": "チャネルを設定", - "notices": { - "selectChannelsFirst": "「チャネルを開く」を実行する前に、現在のプロジェクトで選択済みチャネルを設定してください。", - "openTriggered": "「チャネルを開く」を実行しました。", - "configUpdated": "「チャネルを開く」の設定を更新しました。", - "taskCreated": "タスク「{{title}}」を作成しました。", - "taskCreateFailed": "タスク「{{title}}」は作成されましたが、実行に失敗しました。", - "retryTriggered": "失敗したサブタスクを再実行しました。", - "retryFailed": "再試行に失敗しました。しばらくしてからもう一度お試しください。" - } - }, - "channelDialog": { - "searchPlaceholder": "チャネル名またはリンクを入力", - "loading": "利用可能なチャネルを読み込み中...", - "emptyUnavailable": "利用可能なチャネルがありません。まずスクリプト設定を確認してください。", - "emptyFiltered": "追加できる一致チャネルがありません。", - "selectedTitle": "選択済みチャネル", - "emptySelected": "チャネルはまだ選択されていません", - "remove": "チャネルを削除 {{name}}", - "saving": "保存中..." - }, - "board": { - "pendingTab": "未処理", - "completedTab": "処理済み", - "currentPeriod": "実行期間", - "retry": "再試行", - "remove": "削除", - "empty": "このカテゴリにはタスクカードがありません。" - }, - "operation": { - "open": "有効化", - "close": "無効化", - "dialogTitle": "チャネル客室タイプ操作", - "roomTypeLabel": "客室タイプを選択", - "roomTypePlaceholder": "客室タイプを選択してください", - "loadingRoomTypes": "客室タイプを読み込み中...", - "startDateLabel": "開始日", - "endDateLabel": "終了日", - "actionLabel": "操作を選択", - "actionPlaceholder": "操作を選択してください", - "helpText": "客室タイプ一覧は既存の `typeMapping` API をそのまま利用します。送信時は `dyHotSrpingName / dyHotSpringName` の両方のフィールドに対応し、Douyin 温泉チャネルの取りこぼしを防ぎます。", - "cancel": "キャンセル", - "confirm": "確認", - "submitting": "実行中...", - "errors": { - "selectRoomType": "客室タイプを選択してください", - "selectDateRange": "日付範囲を選択してください", - "startAfterEnd": "開始日は終了日より後にできません", - "selectOperation": "操作を選択してください" - } - }, - "status": { - "pending": "待機中", - "running": "実行中", - "success": "成功", - "failed": "失敗", - "partial_failed": "一部失敗" - }, - "store": { - "scriptNames": { - "fliggyTrace": "Fliggy 客室状況トラッキング", - "meituanTrace": "Meituan 客室状況トラッキング", - "douyinHotelTrace": "Douyin ホテル客室状況トラッキング", - "douyinHotSpringTrace": "Douyin 温泉客室状況トラッキング" - }, - "messages": { - "waiting": "実行待ち", - "started": "実行開始" - }, - "taskTitleWithName": "{{operation}} チャネル客室タイプ - {{name}}", - "taskTitleWithoutName": "{{operation}} チャネル客室タイプ", - "errors": { - "taskMissingExecute": "タスクが存在しないため実行できません。", - "taskExecutionFailed": "タスクの実行に失敗しました", - "taskMissingRetry": "タスクが存在しないため再試行できません。", - "noFailedSubTasks": "このタスクには再試行できる失敗サブタスクがありません。" - } - } -} diff --git a/src/i18n/locales/th/agents.json b/src/i18n/locales/th/agents.json new file mode 100644 index 0000000..4cabf97 --- /dev/null +++ b/src/i18n/locales/th/agents.json @@ -0,0 +1,141 @@ +{ + "title": "Agents", + "subtitle": "สร้าง Agent ใหม่และกำหนดเส้นทางบางแชนเนลไปยังการตั้งค่าบุคลิกหรือ workspace อื่น", + "refresh": "รีเฟรช", + "addAgent": "เพิ่ม Agent", + "addHint": "สร้าง Agent แยกสำหรับ workspace บทบาท หรือผู้รับผิดชอบแชนเนลใหม่", + "warning": "การอัปเดตของ Providers, Channels และ runtime อาจใช้เวลาสักครู่กว่าจะมีผล หากข้อมูลที่แสดงยังเก่าอยู่ให้รีเฟรช", + "emptyTitle": "ยังไม่มี Agent", + "emptyDescription": "เพิ่ม Agent ตัวแรกเพื่อแยกบริบทของแชนเนล บัญชี หรือ workspace ออกจาก Main Agent", + "errorPrefix": "โหลด Agents ไม่สำเร็จ: {error}", + "defaultBadge": "ค่าเริ่มต้น", + "inherited": "สืบทอด", + "mainManagedHint": "Main Agent", + "none": "ไม่มี", + "actions": { + "rename": "เปลี่ยนชื่อ", + "model": "ตั้งค่าโมเดล", + "settings": "การตั้งค่า", + "delete": "ลบ" + }, + "prompts": { + "createName": "กรุณากรอกชื่อ Agent", + "inheritWorkspace": "ต้องการสืบทอดไฟล์เริ่มต้นของ workspace จาก Main Agent ให้ Agent นี้หรือไม่?", + "renameName": "เปลี่ยนชื่อ Agent", + "modelRef": "ตั้งค่า provider/model ของ Agent นี้ หากเว้นว่างไว้ จะสืบทอด Provider ที่เลือกหรือโมเดลเริ่มต้นของ workspace", + "deleteConfirm": "ลบ Agent \"{name}\" หรือไม่? แชตเดิมจะยังคงอยู่บนดิสก์ แต่ Agent นี้จะหายไปจากหน้า Agents" + }, + "createDialog": { + "title": "เพิ่ม Agent", + "description": "ระบุชื่อเพื่อสร้าง Agent ใหม่ หากต้องการ สามารถสืบทอดไฟล์เริ่มต้นของ workspace จาก Main Agent ได้ด้วย", + "nameLabel": "ชื่อ Agent", + "namePlaceholder": "Coding Helper", + "inheritWorkspaceLabel": "สืบทอด workspace ของ Main Agent", + "inheritWorkspaceDescription": "คัดลอกไฟล์เริ่มต้นอย่าง SOUL.md และ AGENTS.md จาก Main Agent", + "saveLabel": "บันทึก", + "savingLabel": "กำลังบันทึก..." + }, + "feedback": { + "created": "สร้าง Agent แล้ว", + "createFailed": "สร้าง Agent ไม่สำเร็จ: {error}", + "deleted": "ลบ Agent แล้ว", + "deleteFailed": "ลบ Agent ไม่สำเร็จ: {error}", + "agentUpdated": "อัปเดตชื่อ Agent แล้ว", + "agentUpdateFailedPrefix": "อัปเดตชื่อ Agent ไม่สำเร็จ: ", + "agentModelUpdated": "อัปเดตโมเดลของ Agent แล้ว", + "agentModelReset": "เปลี่ยน Agent กลับไปใช้โมเดลค่าเริ่มต้นแล้ว", + "agentModelUpdateFailedPrefix": "อัปเดตโมเดลของ Agent ไม่สำเร็จ: " + }, + "deleteDialog": { + "title": "ลบ Agent", + "message": "ลบ Agent \"{name}\" หรือไม่? แชตเดิมจะยังคงอยู่บนดิสก์", + "confirm": "ลบ", + "deleting": "กำลังลบ..." + }, + "fields": { + "model": "โมเดล", + "workspace": "เวิร์กสเปซ", + "agentDir": "โฟลเดอร์ Agent", + "mainSessionKey": "คีย์เซสชันหลัก", + "channels": "แชนเนล", + "providerAccount": "Provider" + }, + "card": { + "modelLabel": "Model", + "channelCount": "{count} แชนเนล", + "accountBindingCount": "ผูกบัญชี {count} รายการ", + "noChannels": "ไม่มีแชนเนล", + "missingWorkspace": "ยังไม่ได้ตั้งค่า workspace", + "missingModel": "ยังไม่ได้ตั้งค่าโมเดล", + "missingAgentDir": "ยังไม่ได้สร้างโฟลเดอร์", + "missingProviderAccount": "ยังไม่ได้เลือก Provider" + }, + "settings": { + "title": "การตั้งค่า Agent", + "titleWithName": "{name} การตั้งค่า", + "description": "อัปเดตชื่อ Agent และตรวจสอบแชนเนลที่อยู่ภายใต้ Agent นี้", + "identityTitle": "ข้อมูลพื้นฐาน", + "modelTitle": "โมเดล", + "modelLabel": "Model", + "bindingTitle": "ความรับผิดชอบของแชนเนล", + "bindingHelp": "แสดงแชนเนล / บัญชีที่ถูกกำหนดมายัง Agent นี้แบบอ่านอย่างเดียว", + "bindingEmpty": "Agent นี้ยังไม่มีแชนเนลหรือบัญชีที่รับผิดชอบ", + "nameLabel": "ชื่อ Agent", + "agentIdLabel": "Agent ID", + "providerAccountLabel": "บัญชี Provider", + "useDefaultProvider": "ใช้ Provider เริ่มต้นของ workspace", + "modelRefLabel": "เขียนทับโมเดล", + "modelRefPlaceholder": "provider/model-id", + "effectiveProviderLabel": "Provider ปัจจุบัน", + "effectiveModelLabel": "โมเดลปัจจุบัน", + "modelHelp": "หากเว้นว่างไว้ จะใช้โมเดลของ Provider ที่เลือก และถ้าไม่ได้ตรึง Provider ไว้ จะสืบทอดโมเดลเริ่มต้นของ workspace", + "inheritModel": "กลับไปใช้โมเดลที่สืบทอด", + "saveIdentity": "บันทึกชื่อ", + "saveModel": "บันทึกโมเดล", + "save": "บันทึก", + "saving": "กำลังบันทึก...", + "managedFromModels": "Main Agent จะทำตาม Provider และโมเดลเริ่มต้นที่ตั้งไว้ในหน้า Models", + "openModels": "เปิด Models", + "workspaceTitle": "เวิร์กสเปซ", + "workspaceDescription": "ตรวจสอบพาธ workspace ปัจจุบัน และดูว่าสืบทอด workspace ของ Main Agent อยู่หรือไม่", + "inheritedWorkspaceLabel": "สืบทอด workspace ของ Main Agent", + "inheritedWorkspaceYes": "ใช่", + "inheritedWorkspaceNo": "ไม่", + "channelSummaryLabel": "สรุปการกำหนดเส้นทางแชนเนล", + "accountBindingsLabel": "จำนวนการผูกบัญชี", + "providerLoadErrorPrefix": "โหลดบัญชี Provider ไม่สำเร็จ: ", + "refreshCatalog": "รีเฟรชข้อมูล", + "manageBindings": "เปิด Channels", + "boundToLabel": "รับผิดชอบโดย: {owner}", + "channelFallbackLabel": "ผู้รับผิดชอบเริ่มต้นของแชนเนล", + "channelFallbackHelp": "จะใช้เมื่อบัญชีภายใต้แชนเนลนี้ไม่มีผู้รับผิดชอบรายบุคคล", + "channelBindingLabel": "การสืบทอดของแชนเนล", + "accountBindingLabel": "การตั้งค่าเฉพาะบัญชี", + "unassigned": "ยังไม่ได้กำหนด", + "noChannelAccounts": "ยังไม่พบบัญชีที่สามารถแสดงได้ในแชนเนลนี้", + "bindingReadonly": "ส่วนนี้แสดงความรับผิดชอบแบบอ่านอย่างเดียว หากต้องการเปลี่ยน channel/account ให้ไปที่หน้า Channels", + "providerLoadError": "โหลดบัญชี Provider ไม่สำเร็จ: {error}", + "channelLoadError": "โหลดบัญชีแชนเนลไม่สำเร็จ: {error}", + "closeLabel": "ปิดกล่องโต้ตอบ", + "notConfigured": "ยังไม่ได้ตั้งค่า", + "channelsTitle": "แชนเนล", + "channelsDescription": "รายการนี้เป็นแบบอ่านอย่างเดียว โปรดจัดการบัญชีแชนเนลและการผูกข้อมูลที่หน้า Channels", + "noChannels": "Agent นี้ยังไม่ได้รับมอบหมายแชนเนล", + "channelsManagedInChannels": "ไม่พบการผูกบัญชีแบบระบุชัดเจนสำหรับ Agent นี้ โปรดตรวจสอบผู้รับผิดชอบระดับแชนเนลใน Channels", + "mainAccount": "บัญชีหลัก", + "unsavedChangesTitle": "ต้องการละทิ้งการเปลี่ยนแปลงที่ยังไม่ได้บันทึกหรือไม่?", + "unsavedChangesMessage": "มีการเปลี่ยนแปลงที่ยังไม่ได้บันทึก หากปิดตอนนี้ การเปลี่ยนแปลงเหล่านั้นจะหายไป", + "closeWithoutSaving": "ปิดโดยไม่บันทึก", + "modelOverrideDescription": "อัปเดตการเขียนทับโมเดลของ Agent นี้ โมเดลเริ่มต้นปัจจุบัน: {defaultModel}", + "modelProviderLabel": "Model Provider", + "modelProviderPlaceholder": "เลือก Provider", + "modelIdLabel": "Model ID", + "modelIdPlaceholder": "gpt-5.4", + "modelPreview": "ตัวอย่างโมเดล", + "modelProviderEmpty": "ยังไม่มี Provider ที่ใช้ตั้งค่าโมเดลได้ โปรดตั้งค่า Provider ในหน้า Models ก่อน", + "useDefaultModel": "ใช้โมเดลเริ่มต้น", + "modelProviderRequired": "โปรดเลือก Provider ก่อน", + "modelIdRequired": "โปรดกรอก Model ID", + "modelInvalid": "รูปแบบการตั้งค่าโมเดลไม่ถูกต้อง" + } +} diff --git a/src/i18n/locales/th/channels.json b/src/i18n/locales/th/channels.json new file mode 100644 index 0000000..a195a15 --- /dev/null +++ b/src/i18n/locales/th/channels.json @@ -0,0 +1,85 @@ +{ + "page": { + "title": "ช่องทางที่รองรับ", + "description": "หน้านี้ใช้สำหรับจัดการโมดูลของช่องทางที่รองรับ ทางเข้าสู่การตั้งค่า และการอัปเดตต่าง ๆ ในที่เดียว", + "refresh": "รีเฟรช", + "pluginBadge": "ปลั๊กอิน", + "configure": "เริ่มตั้งค่า", + "empty": "ยังไม่มีโมดูลช่องทางที่สามารถตั้งค่าได้", + "refreshed": "รีเฟรชรายการช่องทางที่รองรับแล้ว", + "saved": "บันทึกการตั้งค่าของ {name} แล้ว", + "defaultAccountLabel": "บัญชีเริ่มต้น" + }, + "validation": { + "requiredField": "กรุณากรอก {field}" + }, + "connectionType": { + "qr": "QR โค้ด", + "webhook": "Webhook", + "token": "Token" + }, + "meta": { + "telegram": { + "name": "Telegram", + "description": "เชื่อมต่อ Telegram ด้วย bot token ที่ออกโดย @BotFather" + }, + "discord": { + "name": "Discord", + "description": "เชื่อมต่อ Discord ด้วย bot token จากพอร์ทัลนักพัฒนา" + }, + "whatsapp": { + "name": "WhatsApp", + "description": "เชื่อมต่อ WhatsApp โดยสแกน QR โค้ด ไม่ต้องใช้หมายเลขโทรศัพท์" + }, + "wechat": { + "name": "WeChat", + "description": "เชื่อมต่อ WeChat ส่วนตัวโดยสแกน QR ผ่านปลั๊กอิน OpenClaw อย่างเป็นทางการ" + }, + "dingtalk": { + "name": "DingTalk", + "description": "เชื่อมต่อ DingTalk ผ่านปลั๊กอินช่องทาง OpenClaw (โหมด Stream)" + }, + "feishu": { + "name": "Feishu / Lark", + "description": "เชื่อมต่อบอท Feishu/Lark ผ่านปลั๊กอิน OpenClaw อย่างเป็นทางการของ Feishu" + }, + "wecom": { + "name": "WeCom", + "description": "เชื่อมต่อบอท WeCom ผ่านปลั๊กอิน" + }, + "qqbot": { + "name": "QQ Bot", + "description": "เชื่อมต่อกับช่องทาง QQ Bot (มีมาในตัวตั้งแต่ OpenClaw 3.31 เป็นต้นไป)" + } + }, + "modal": { + "title": "การตั้งค่าช่องทาง", + "description": "เริ่มจากเลือกประเภทช่องทาง แล้วกรอกข้อมูลการเชื่อมต่อที่ใช้ได้กับเทมเพลตนี้", + "configureTitle": "ตั้งค่า {name}", + "typeLabel": "ประเภทช่องทาง", + "accountIdLabel": "Account ID", + "docsLabel": "เอกสารและขั้นตอน", + "instructionsTitle": "ขั้นตอนการเชื่อมต่อ", + "howTo": "วิธีเชื่อมต่อ", + "viewDocs": "ดูเอกสาร", + "validate": "ตรวจสอบ", + "validateConfig": "ตรวจสอบการตั้งค่า", + "validating": "กำลังตรวจสอบ...", + "saveAndConnect": "บันทึกและเชื่อมต่อ", + "envVar": "ตัวแปรสภาพแวดล้อม", + "envVars": "ตัวแปรสภาพแวดล้อม", + "fieldDocs": "คำอธิบายฟิลด์", + "docsUrl": "URL เอกสาร", + "envVarHint": "หากจำเป็น สามารถระบุค่าเหล่านี้ผ่านตัวแปรสภาพแวดล้อมได้เช่นกัน", + "credentialsVerified": "ตรวจสอบข้อมูลรับรองแล้ว", + "validationFailed": "การตรวจสอบล้มเหลว", + "warnings": "คำเตือน", + "noAdditionalFields": "ช่องทางนี้ไม่มีฟิลด์เพิ่มเติม", + "showSecret": "แสดงซีเคร็ต", + "hideSecret": "ซ่อนซีเคร็ต", + "tokenHelpText": "กรอก token, secret หรือข้อมูลรับรองการเข้าถึงที่จำเป็นสำหรับช่องทางที่เลือก", + "diagnosticsNote": "ส่วนของ QR โค้ดและการวินิจฉัยจะเชื่อมต่อหลังจากสัญญาของ backend พร้อมแล้ว", + "todoNote": "TODO: QR และการวินิจฉัยยังเป็นเพียง placeholder ในตอนนี้ modal จะยังคงขับเคลื่อนด้วย props ต่อไป", + "confirm": "บันทึกช่องทาง" + } +} diff --git a/src/i18n/locales/th/chat.json b/src/i18n/locales/th/chat.json new file mode 100644 index 0000000..3e091b0 --- /dev/null +++ b/src/i18n/locales/th/chat.json @@ -0,0 +1,53 @@ +{ + "newConversation": "การสนทนาใหม่", + "untitledConversation": "การสนทนาไม่มีชื่อ", + "attachmentPlaceholder": "(แนบไฟล์แล้ว)", + "userName": "คุณ", + "assistantName": "YINIAN", + "errors": { + "modelUnavailable": "โปรดตั้งค่าโมเดลที่ Agent ปัจจุบันสามารถใช้งานได้ หรือกำหนดโมเดลเริ่มต้นในหน้า Models ก่อน", + "readFile": "ไม่สามารถอ่านไฟล์ได้" + }, + "composer": { + "placeholder": "พิมพ์ข้อความแล้วกด Enter เพื่อส่ง หรือกด Shift + Enter เพื่อขึ้นบรรทัดใหม่", + "dismissError": "ปิด", + "attachAria": "เพิ่มไฟล์แนบ", + "sendAria": "ส่งข้อความ", + "stopAria": "หยุดการสร้าง", + "removeAttachment": "ลบ {{name}} ออกจากไฟล์แนบ" + }, + "messageList": { + "loading": "กำลังโหลดเนื้อหาการสนทนา...", + "emptyHint": "พิมพ์คำถามเพื่อเริ่มการสนทนาใหม่ ข้อความเดิมและคำตอบแบบสตรีมจะแสดงที่นี่โดยตรง", + "streaming": "กำลังสร้างคำตอบ...", + "assistantBadge": "AI", + "userBadge": "ฉัน" + }, + "historyPanel": { + "expandSidebar": "ขยายแถบด้านข้าง", + "collapseSidebar": "ยุบแถบด้านข้าง", + "loading": "กำลังโหลดประวัติการสนทนา...", + "moreActions": "การดำเนินการเพิ่มเติม", + "rename": "เปลี่ยนชื่อ", + "delete": "ลบ" + }, + "renameDialog": { + "title": "เปลี่ยนชื่อการสนทนา", + "description": "ตั้งชื่อให้การสนทนาปัจจุบันเพื่อให้ค้นหาได้ง่ายขึ้นภายหลัง", + "close": "ปิดกล่องโต้ตอบ", + "label": "ชื่อการสนทนา", + "placeholder": "กรอกชื่อการสนทนาใหม่", + "hint": "คุณสามารถเปลี่ยนอีกครั้งได้ภายหลัง", + "cancel": "ยกเลิก", + "confirm": "บันทึกชื่อ" + }, + "deleteDialog": { + "title": "ลบการสนทนา", + "description": "เมื่อลบแล้วจะไม่สามารถกู้คืนได้ โปรดยืนยันก่อนดำเนินการต่อ", + "close": "ปิดกล่องโต้ตอบ", + "label": "ชื่อการสนทนา", + "cancel": "ยกเลิก", + "deleting": "กำลังลบ...", + "confirm": "ยืนยันการลบ" + } +} diff --git a/src/i18n/locales/th/common.json b/src/i18n/locales/th/common.json new file mode 100644 index 0000000..7a5f264 --- /dev/null +++ b/src/i18n/locales/th/common.json @@ -0,0 +1,46 @@ +{ + "app": { + "title": "ZN-AI" + }, + "window": { + "minimize": "ย่อ", + "maximize": "ขยาย", + "restore": "คืนค่า", + "close": "ปิด" + }, + "dialog": { + "cancel": "ยกเลิก", + "confirm": "ยืนยัน", + "close": "ปิด" + }, + "theme": { + "light": "สว่าง", + "dark": "มืด", + "system": "ระบบ" + }, + "language": { + "zh": "ภาษาจีน", + "en": "ภาษาอังกฤษ", + "th": "ภาษาไทย" + }, + "common": { + "loading": "กำลังโหลด...", + "loadingPage": "กำลังโหลดหน้า...", + "retry": "ลองอีกครั้ง", + "unknownError": "ข้อผิดพลาดที่ไม่ทราบสาเหตุ" + }, + "brand": { + "logoAlt": "Logo" + }, + "sidebar": { + "home": "หน้าหลัก", + "knowledge": "คลังความรู้", + "channels": "ช่องทาง", + "agents": "Agents", + "models": "โมเดล", + "skills": "ทักษะ", + "cron": "งานตามกำหนดเวลา", + "scripts": "สคริปต์", + "settings": "การตั้งค่า" + } +} diff --git a/src/i18n/locales/th/cron.json b/src/i18n/locales/th/cron.json new file mode 100644 index 0000000..da9d75a --- /dev/null +++ b/src/i18n/locales/th/cron.json @@ -0,0 +1,187 @@ +{ + "title": "งานตามกำหนดเวลา", + "subtitle": "งานตามกำหนดเวลาเพื่อทำให้ AI workflow เป็นอัตโนมัติ", + "actions": { + "refresh": "รีเฟรช", + "newTask": "งานใหม่", + "createTask": "สร้างงาน", + "runNow": "เรียกใช้ทันที", + "delete": "ลบ" + }, + "stats": { + "total": "งานทั้งหมด", + "active": "ใช้งานอยู่", + "paused": "หยุดอยู่", + "failed": "ล้มเหลวล่าสุด" + }, + "empty": { + "title": "ยังไม่มีงานตามกำหนดเวลา", + "description": "คุณสามารถสร้างงาน และตั้งค่าบัญชีช่องทางกับปลายทางการส่งล่วงหน้าได้" + }, + "loading": "กำลังโหลดงาน...", + "warnings": { + "agentsLoadFailed": "โหลด Agents ไม่สำเร็จ จะแสดงผลต่อด้วย snapshot ปัจจุบัน {error}", + "channelsLoadFailed": "โหลดบัญชีช่องทางไม่สำเร็จ ข้อมูลการส่งจะแสดงเป็น placeholder {error}", + "channelsCatalogFailed": "โหลดบัญชีช่องทางไม่สำเร็จ แต่ยังคงเก็บการตั้งค่าที่มีอยู่ได้ {error}", + "targetsLoadFailed": "โหลดตัวเลือกปลายทางการส่งไม่สำเร็จ แต่ยังกรอกเองได้ {error}", + "noChannelsAvailable": "ไม่มีบัญชีช่องทางที่พร้อมใช้งาน ขณะนี้จึงไม่สามารถสร้างงานประเภทส่งออกได้" + }, + "feedback": { + "updated": "อัปเดตงานแล้ว", + "created": "สร้างงานแล้ว", + "enabled": "เปิดใช้งานงานแล้ว", + "paused": "หยุดงานแล้ว", + "triggered": "เรียกใช้งานแล้ว", + "deleted": "ลบงานแล้ว" + }, + "confirmDelete": "ต้องการลบ \"{name}\" หรือไม่? การดำเนินการนี้ไม่สามารถย้อนกลับได้", + "common": { + "unnamedJob": "งานไม่มีชื่อ" + }, + "card": { + "enabled": "เปิดใช้งาน", + "paused": "หยุดอยู่", + "modeAnnounce": "รันและส่งออก", + "modeNone": "รันเท่านั้น", + "pauseTask": "หยุดงาน", + "enableTask": "เปิดใช้งานงาน", + "agentLabel": "Agent", + "deliveryLabel": "การส่งออก", + "lastRun": "รันล่าสุด: {time}", + "nextRun": "รันครั้งถัดไป: {time}", + "success": "สำเร็จ", + "failed": "ล้มเหลว" + }, + "dialog": { + "editTitle": "แก้ไขงาน", + "createTitle": "สร้างงาน", + "subtitle": "ตั้งค่างาน AI อัตโนมัติ", + "nameLabel": "ชื่องาน", + "namePlaceholder": "ตัวอย่าง: สรุปตอนเช้า", + "messageLabel": "ข้อความ / พรอมป์ต์", + "messagePlaceholder": "กรอกสิ่งที่งานจะรันหรือแจ้งเตือน", + "scheduleLabel": "ตารางเวลา", + "customCronPlaceholder": "กรอก cron expression (เช่น 0 9 * * *)", + "nextRun": "รันครั้งถัดไป: {time}", + "scheduleHint": "เลือก preset หรือกรอก cron expression แบบกำหนดเอง", + "usePreset": "ใช้ preset", + "useCustom": "Cron แบบกำหนดเอง", + "deliveryTitle": "การตั้งค่าการส่งออก", + "deliverySubtitle": "เก็บผลลัพธ์ไว้ใน NIANXX หรือส่งไปยังช่องทางภายนอก", + "deliveryOptions": { + "noneTitle": "เฉพาะภายใน NIANXX", + "noneDesc": "งานจะรันตามปกติ และผลลัพธ์จะถูกเก็บไว้ในแอป", + "announceTitle": "ส่งไปยังช่องทางภายนอก", + "announceDesc": "ส่งผลลัพธ์สุดท้ายไปยังช่องทางข้อความที่ตั้งค่าไว้" + }, + "channelLabel": "ช่องทาง", + "channelEmpty": "ไม่มีช่องทางที่ใช้งานได้", + "accountLabel": "บัญชี", + "accountLoading": "กำลังโหลดบัญชีช่องทาง…", + "accountEmpty": "ช่องทางนี้ไม่มีบัญชี", + "targetLabel": "ปลายทางการส่ง", + "targetPlaceholder": "ตัวอย่าง: กลุ่มปฏิบัติการ, room-ops, https://example.com/webhook", + "targetsLoading": "กำลังโหลดตัวเลือกสำหรับบัญชีช่องทางนี้...", + "targetsReady": "มีตัวเลือกพร้อมใช้งาน คุณยังสามารถกรอกชื่อกลุ่ม, user ID หรือ Webhook เองได้", + "targetsNone": "ไม่พบตัวเลือก คุณสามารถกรอกชื่อกลุ่ม, user ID หรือ Webhook เองได้", + "preview": "ตัวอย่าง: {preview}", + "currentAccount": "บัญชีปัจจุบัน: {account}", + "enableTitle": "เปิดใช้งานทันที", + "enableDesc": "เริ่มรันงานนี้ทันทีหลังจากสร้าง", + "saving": "กำลังบันทึก...", + "saveEdit": "บันทึกการเปลี่ยนแปลง", + "create": "สร้างงาน" + }, + "validation": { + "nameRequired": "กรุณากรอกชื่องาน", + "messageRequired": "กรุณากรอกข้อความ/พรอมป์ต์", + "scheduleRequired": "กรุณากรอกตารางเวลา", + "channelRequired": "กรุณาเลือกช่องทางสำหรับการส่งออก", + "targetRequired": "กรุณากรอกปลายทางการส่ง (กลุ่ม, user ID, Webhook)" + }, + "delivery": { + "none": "รันเท่านั้น (ไม่ส่งออก)", + "pending": "การตั้งค่าการส่งออกยังไม่สมบูรณ์", + "targetPending": "ยังไม่ได้กรอกปลายทางการส่ง" + }, + "deliveryTarget": { + "savedCustom": "ปลายทางแบบกำหนดเองที่บันทึกไว้สำหรับงานนี้" + }, + "channels": { + "unnamed": "ช่องทางที่ยังไม่ตั้งชื่อ", + "mainAccount": "บัญชีหลัก", + "douyin": "Douyin", + "feishu": "Feishu", + "fliggy": "Fliggy", + "meituan": "Meituan", + "qqbot": "QQ Bot", + "telegram": "Telegram", + "wechat": "WeChat", + "wecom": "WeCom" + }, + "agent": { + "main": "Agent หลัก", + "workspace": "เวิร์กสเปซ {path}", + "dir": "ไดเรกทอรี {path}", + "sharedMainWorkspace": "ใช้เวิร์กสเปซหลักร่วมกัน", + "syncPending": "รอการซิงก์เวิร์กสเปซ" + }, + "weekdays": { + "sun": "อา.", + "mon": "จ.", + "tue": "อ.", + "wed": "พ.", + "thu": "พฤ.", + "fri": "ศ.", + "sat": "ส." + }, + "time": { + "justNow": "เมื่อสักครู่", + "secondsAgo": "{count} วินาทีที่แล้ว", + "minutesAgo": "{count} นาทีที่แล้ว", + "hoursAgo": "{count} ชั่วโมงที่แล้ว", + "daysAgo": "{count} วันที่แล้ว" + }, + "schedule": { + "once": "ครั้งเดียว · {time}", + "everySeconds": "ทุก {count} วินาที", + "everyMinutes": "ทุก {count} นาที", + "everyHours": "ทุก {count} ชั่วโมง", + "everyDays": "ทุก {count} วัน", + "everyMinute": "ทุกนาที", + "everyNMinutes": "ทุก {count} นาที", + "hourly": "ทุกชั่วโมง", + "weekly": "ทุกสัปดาห์ {weekday} {time}", + "monthly": "ทุกเดือนวันที่ {day} {time}", + "daily": "ทุกวัน {time}", + "presets": { + "every-minute": "ทุกนาที", + "every-5-minutes": "ทุก 5 นาที", + "every-15-minutes": "ทุก 15 นาที", + "every-hour": "ทุกชั่วโมง", + "daily-9": "ทุกวัน 09:00", + "daily-18": "ทุกวัน 18:00", + "weekly-mon": "ทุกวันจันทร์ 09:00", + "monthly-first": "วันที่ 1 ของทุกเดือน 09:00" + } + }, + "fallback": { + "jobs": { + "morningBriefing": { + "name": "สรุปตอนเช้า", + "message": "ก่อนเปิดร้าน จะแจ้งสถานะช่องทางและการตรวจสอบสต็อกประจำวันให้พนักงานเวรทราบ", + "target": "กลุ่มกะเช้า" + }, + "channelCheck": { + "name": "ตรวจสอบช่องทาง", + "message": "ตรวจสอบสถานะออนไลน์ของ Fliggy, Meituan และ Douyin ทุก 15 นาที" + }, + "reviewSummary": { + "name": "สรุปรีวิว", + "message": "ทุกคืนจะสร้างรายการตอบกลับรีวิวและส่งให้ทีมปฏิบัติการ", + "target": "กลุ่มรีวิวปฏิบัติการ", + "error": "การตอบสนองของช่องทางหมดเวลา สรุปช่วงกลางคืนไม่เสร็จสมบูรณ์ กรุณาตรวจสอบสถานะเกตเวย์และบริการ" + } + } + } +} diff --git a/src/i18n/locales/th/dashboard.json b/src/i18n/locales/th/dashboard.json new file mode 100644 index 0000000..49ab8eb --- /dev/null +++ b/src/i18n/locales/th/dashboard.json @@ -0,0 +1,34 @@ +{ + "route": { + "loading": "กำลังโหลดหน้า..." + }, + "historyBuckets": { + "today": "วันนี้", + "yesterday": "เมื่อวาน", + "withinWeek": "7 วันที่ผ่านมา", + "withinTwoWeeks": "14 วันที่ผ่านมา", + "withinMonth": "30 วันที่ผ่านมา", + "older": "ก่อนหน้านี้" + }, + "historyTime": { + "yesterdayAt": "เมื่อวาน {{time}}" + }, + "taskDate": { + "currentPeriod": "ช่วงเวลาการดำเนินการ", + "today": "วันนี้", + "yesterday": "เมื่อวาน" + }, + "conversation": { + "title": "การสนทนาอัจฉริยะ", + "gatewayStatusSummary": "สถานะเกตเวย์: {{status}}", + "gatewayStatus": { + "connected": "เชื่อมต่อแล้ว", + "reconnecting": "กำลังเชื่อมต่อใหม่", + "disconnected": "ไม่ได้เชื่อมต่อ" + }, + "currentAgentSummary": "Agent ปัจจุบัน: {{name}}", + "modelSummary": "โมเดล: {{name}}", + "agentLabel": "Agent", + "refresh": "รีเฟรช" + } +} diff --git a/src/i18n/locales/th/knowledge.json b/src/i18n/locales/th/knowledge.json new file mode 100644 index 0000000..930e1a8 --- /dev/null +++ b/src/i18n/locales/th/knowledge.json @@ -0,0 +1,51 @@ +{ + "title": "เอกสารความรู้", + "subtitle": "อัปโหลด ตรวจสอบ และลบไฟล์เอกสารในไดเรกทอรี knowledge ที่จัดเก็บไว้ในเครื่อง", + "refresh": "รีเฟรช", + "upload": "อัปโหลดเอกสาร", + "documentsLabel": "จำนวนเอกสาร", + "storageLabel": "พื้นที่จัดเก็บ", + "emptyTitle": "ไม่มีเอกสาร", + "emptyDescription": "อัปโหลดไฟล์เพื่อเริ่มจัดการไดเรกทอรีเอกสารความรู้ในเครื่อง", + "table": { + "name": "ชื่อ", + "size": "ขนาด", + "modifiedAt": "วันที่แก้ไข", + "type": "ประเภท", + "actions": "การดำเนินการ", + "delete": "ลบ" + }, + "dialog": { + "title": "อัปโหลดเอกสาร", + "description": "เลือกไฟล์เพื่อบันทึกลงในไดเรกทอรีเอกสารความรู้ในเครื่อง", + "fileLabel": "ไฟล์", + "fileHint": "ไฟล์ที่อัปโหลดจะถูกบันทึกโดยคงชื่อไฟล์และเมตาดาตาไว้", + "cancel": "ยกเลิก", + "confirm": "อัปโหลด" + }, + "deleteDialog": { + "title": "ลบเอกสารนี้หรือไม่?", + "description": "ลบ \"{name}\" ออกจากไดเรกทอรีเอกสารความรู้ในเครื่องอย่างถาวร", + "confirm": "ลบเอกสาร", + "close": "ปิดกล่องโต้ตอบ" + }, + "status": { + "loading": "กำลังโหลดเอกสาร...", + "uploading": "กำลังอัปโหลด...", + "deleting": "กำลังลบ...", + "uploadSuccess": "อัปโหลดเอกสารแล้ว", + "deleteSuccess": "ลบเอกสารแล้ว", + "failed": "คำขอเอกสารความรู้ล้มเหลว: {error}" + }, + "errors": { + "readFile": "อ่านไฟล์ไม่สำเร็จ" + }, + "fallback": { + "documentName": "เอกสาร {count}", + "fileType": "ไฟล์" + }, + "common": { + "cancel": "ยกเลิก", + "confirm": "ยืนยัน" + } +} diff --git a/src/i18n/locales/th/login.json b/src/i18n/locales/th/login.json new file mode 100644 index 0000000..834673b --- /dev/null +++ b/src/i18n/locales/th/login.json @@ -0,0 +1,22 @@ +{ + "title": "ยินดีต้อนรับกลับมา", + "subtitle": "เพื่อนร่วมทีมดิจิทัลที่พร้อมช่วยเหลือคุณได้ทุกเมื่อ ตลอด 24 ชั่วโมง", + "username": "บัญชี", + "password": "รหัสผ่าน", + "verificationCode": "รหัสยืนยัน", + "usernamePlaceholder": "กรุณากรอกบัญชี", + "passwordPlaceholder": "กรุณากรอกรหัสผ่าน", + "verificationCodePlaceholder": "กรุณากรอกรหัสยืนยัน", + "usernameRequired": "กรุณากรอกบัญชีผู้ใช้", + "passwordRequired": "กรุณากรอกรหัสผ่าน", + "codeRequired": "กรุณากรอกรหัสยืนยัน", + "submitFailed": "เข้าสู่ระบบไม่สำเร็จ โปรดลองอีกครั้งในภายหลัง", + "errors": { + "missingAccessToken": "เข้าสู่ระบบไม่สำเร็จ ระบบไม่ได้ส่ง access_token กลับมา", + "submitStatus": "เข้าสู่ระบบไม่สำเร็จ ({status})" + }, + "submit": "เข้าสู่ระบบ", + "submitting": "กำลังเข้าสู่ระบบ...", + "loadingCaptcha": "กำลังโหลด...", + "captchaAlt": "รหัสยืนยัน" +} diff --git a/src/i18n/locales/th/models.json b/src/i18n/locales/th/models.json new file mode 100644 index 0000000..807aa5f --- /dev/null +++ b/src/i18n/locales/th/models.json @@ -0,0 +1,100 @@ +{ + "page": { + "title": "การตั้งค่าโมเดล", + "subtitle": "คุณสามารถตั้งค่า AI Provider และตรวจสอบการใช้งาน Token ของโมเดลได้" + }, + "common": { + "closeDialog": "ปิดกล่องโต้ตอบ", + "unknownModel": "โมเดลที่ไม่รู้จัก", + "unknown": "ไม่ทราบ", + "empty": "ไม่มีข้อมูล", + "loading": "กำลังโหลด...", + "ai": "AI" + }, + "providers": { + "title": "AI Provider", + "subtitle": "จัดการ AI Model และ API Key", + "providerName": "Provider", + "add": "เพิ่ม Provider", + "loading": "กำลังโหลดการตั้งค่า Provider...", + "defaultBadge": "ค่าเริ่มต้น", + "configured": "ตั้งค่าแล้ว", + "notConfigured": "ยังไม่ได้ตั้งค่า", + "setDefault": "ตั้งเป็นค่าเริ่มต้น", + "edit": "แก้ไข", + "delete": "ลบ", + "empty": "ยังไม่ได้รับการตั้งค่าโมเดล", + "confirmDelete": "คุณแน่ใจหรือไม่ว่าต้องการลบ Provider นี้?", + "notices": { + "loadError": "โหลดการตั้งค่า Provider ไม่สำเร็จ", + "defaultSuccess": "ตั้งค่า Provider เริ่มต้นเรียบร้อยแล้ว", + "defaultError": "ตั้งค่า Provider เริ่มต้นไม่สำเร็จ", + "deleteSuccess": "ลบ Provider เรียบร้อยแล้ว", + "deleteError": "ลบ Provider ไม่สำเร็จ", + "saveSuccess": "บันทึก Provider เรียบร้อยแล้ว", + "saveError": "บันทึก Provider ไม่สำเร็จ" + }, + "picker": { + "title": "เพิ่ม AI Provider", + "subtitle": "ตั้งค่า Provider ใหม่สำหรับการเข้าถึงโมเดลและการกำหนดเส้นทาง API" + }, + "editor": { + "addTitle": "เพิ่ม AI Provider", + "editTitle": "แก้ไข Provider", + "subtitle": "ตั้งค่าข้อมูลบัญชี Provider ที่จะบันทึกไว้บนอุปกรณ์นี้", + "switchProvider": "สลับ Provider", + "viewDocs": "ดูเอกสาร", + "displayName": "ชื่อที่แสดง", + "displayNamePlaceholder": "ชื่อ Provider", + "apiKey": "API Key", + "apiKeyPlaceholder": "กรอก API Key", + "apiKeyHint": "API Key จะถูกจัดเก็บไว้บนอุปกรณ์นี้เท่านั้น", + "baseUrl": "Base URL (ไม่บังคับ)", + "baseUrlPlaceholder": "https://api.example.com/v1", + "defaultModel": "โมเดลเริ่มต้น (ไม่บังคับ)", + "defaultModelPlaceholder": "gpt-5.4", + "saving": "กำลังบันทึก...", + "save": "บันทึก", + "add": "เพิ่ม Provider" + } + }, + "usage": { + "title": "ประวัติการใช้ Token", + "loading": "กำลังโหลดประวัติการใช้งาน...", + "loadError": "โหลดประวัติการใช้งานไม่สำเร็จ", + "empty": "ไม่มีประวัติการใช้งาน", + "emptyWindow": "ไม่มีประวัติการใช้งานในช่วงเวลาที่เลือก", + "groupByModel": "ตามโมเดล", + "groupByTime": "ตามเวลา", + "window7d": "7 วันที่ผ่านมา", + "window30d": "30 วันที่ผ่านมา", + "windowAll": "ทั้งหมด", + "showingRecords": "แสดง {{count}} รายการ", + "chart": { + "total": "รวม", + "input": "อินพุต", + "output": "เอาต์พุต", + "cache": "แคช" + }, + "row": { + "noUsageInfo": "ไม่มีข้อมูลการใช้งาน", + "errorParsingUsage": "เกิดข้อผิดพลาดในการแยกวิเคราะห์การใช้งาน", + "input": "อินพุต: {{count}}", + "output": "เอาต์พุต: {{count}}", + "cacheRead": "อ่านแคช: {{count}}", + "cacheWrite": "เขียนแคช: {{count}}", + "noUsageReported": "ไม่มีการรายงานการใช้งาน", + "parseError": "ข้อผิดพลาดในการแยกวิเคราะห์", + "viewContent": "ดูเนื้อหา", + "error": "ข้อผิดพลาด" + }, + "pagination": { + "pageOf": "{{page}} / {{total}} หน้า", + "prev": "ก่อนหน้า", + "next": "ถัดไป" + }, + "requestContent": { + "title": "เนื้อหาคำขอ" + } + } +} diff --git a/src/i18n/locales/th/scripts.json b/src/i18n/locales/th/scripts.json new file mode 100644 index 0000000..9732a8d --- /dev/null +++ b/src/i18n/locales/th/scripts.json @@ -0,0 +1,116 @@ +{ + "page": { + "title": "สคริปต์", + "subtitle": "บันทึก แก้ไข และรันสคริปต์อัตโนมัติ Playwright", + "searchPlaceholder": "ค้นหาสคริปต์...", + "clearSearch": "ล้างการค้นหา", + "stats": { + "total": "ทั้งหมด {{count}}", + "active": "ใช้งานอยู่ {{count}}", + "failed": "ล้มเหลว {{count}}" + }, + "newScript": "สคริปต์ใหม่", + "refresh": "รีเฟรช", + "loading": "กำลังโหลดสคริปต์...", + "emptySearch": { + "title": "ไม่พบสคริปต์ที่ตรงกัน", + "description": "ลองใช้คำค้นอื่น หรือล้างการค้นหาเพื่อดูสคริปต์ทั้งหมด", + "actionLabel": "ล้างการค้นหา" + }, + "emptyDefault": { + "title": "ยังไม่มีสคริปต์", + "description": "สร้างหรือบันทึกสคริปต์อัตโนมัติ Playwright เพื่อย้ายการรองรับแชนเนลไปยังหน้า React", + "actionLabel": "สร้างสคริปต์แรก" + } + }, + "feedback": { + "createdStartingCodegen": "สร้างสคริปต์แล้ว กำลังพยายามเปิด codegen", + "recordingCompletedWithCode": "บันทึกเสร็จแล้ว และเปิดตัวแก้ไขพร้อมโค้ดที่สร้างขึ้น", + "codegenFailed": "เปิด codegen ไม่สำเร็จ กรุณาไปบันทึกด้วยตนเองจากหน้าแก้ไขภายหลัง", + "saved": "บันทึกการเปลี่ยนแปลงของสคริปต์แล้ว", + "enabled": "เปิดใช้งานสคริปต์แล้ว", + "disabled": "ปิดใช้งานสคริปต์แล้ว", + "testSuccess": "ทดสอบสคริปต์สำเร็จ", + "testFailed": "ทดสอบสคริปต์ไม่สำเร็จ โปรดตรวจสอบบันทึกผลลัพธ์", + "deleted": "ลบสคริปต์แล้ว", + "recordingStartFailed": "เริ่มบันทึกไม่สำเร็จ", + "recordingStarted": "เริ่มบันทึกแล้ว โปรดทำงานให้เสร็จในหน้าต่างใหม่", + "recordingStopped": "หยุดการบันทึกและอัปเดตโค้ดแล้ว", + "recordingStopFailed": "หยุดการบันทึกไม่สำเร็จ" + }, + "card": { + "channels": { + "fliggy": "Fliggy", + "meituan": "Meituan", + "douyin": "Douyin", + "common": "ทั่วไป" + }, + "status": { + "enabled": "เปิดใช้งาน", + "disabled": "ปิดใช้งาน" + }, + "noDescription": "ยังไม่มีคำอธิบายสคริปต์", + "lastRun": "รันล่าสุด: {{time}}", + "failed": "ล้มเหลว", + "neverRun": "ยังไม่มีประวัติการรัน", + "testing": "กำลังทดสอบ...", + "test": "ทดสอบ", + "editing": "กำลังโหลด...", + "edit": "แก้ไข", + "delete": "ลบ", + "relative": { + "justNow": "เมื่อสักครู่" + } + }, + "dialogs": { + "close": "ปิด", + "create": { + "title": "สร้างสคริปต์", + "subtitle": "สร้างสคริปต์ที่สามารถบันทึกได้ก่อน แล้วค่อยบันทึกหรือแก้ไขโค้ด Playwright ต่อ", + "nameLabel": "ชื่อสคริปต์", + "namePlaceholder": "เช่น: เก็บข้อมูลห้องพัก Fliggy", + "descriptionLabel": "คำอธิบายสคริปต์", + "descriptionPlaceholder": "อธิบายหน้าที่ของสคริปต์นี้สั้น ๆ", + "channelLabel": "ลิงก์แชนเนล", + "channelPlaceholder": "วาง URL ของแชนเนลเป้าหมาย หรือเว้นว่างไว้เพื่อเพิ่มภายหลัง", + "channelHint": "หลังจากสร้างแล้ว ระบบจะพยายามเปิด codegen และนำผลการบันทึกกลับมาที่ตัวแก้ไข", + "cancel": "ยกเลิก", + "saving": "กำลังสร้าง...", + "confirm": "สร้างและเริ่มบันทึก" + }, + "edit": { + "missingChannel": "กรุณากรอกลิงก์แชนเนลก่อนเริ่มบันทึก", + "replaceChannelSuccess": "แทนที่ลิงก์แชนเนลที่รู้จักในโค้ดด้วยค่าที่ป้อนอยู่แล้ว", + "title": "แก้ไขสคริปต์", + "subtitle": "อัปเดตข้อมูลสคริปต์ ดูแลโค้ด Playwright และบันทึกใหม่ได้เมื่อจำเป็น", + "nameLabel": "ชื่อสคริปต์", + "namePlaceholder": "กรอกชื่อสคริปต์", + "descriptionLabel": "คำอธิบายสคริปต์", + "descriptionPlaceholder": "เพิ่มวัตถุประสงค์ หน้าที่ของหน้าเพจที่เกี่ยวข้อง และข้อควรระวัง", + "channelLabel": "ลิงก์แชนเนล", + "replaceChannelUrls": "แทนที่ URL แชนเนลในโค้ด", + "channelPlaceholder": "วาง URL แชนเนล", + "codeLabel": "โค้ดสคริปต์", + "stopRecordingBusy": "กำลังหยุด...", + "stopRecording": "หยุดการบันทึก", + "startRecordingBusy": "กำลังเริ่ม...", + "startRecording": "เริ่มการบันทึก", + "recordingHint": "กำลังบันทึกอยู่ โปรดทำงานให้เสร็จในหน้าต่างใหม่ จากนั้นคลิก \"หยุดการบันทึก\" เพื่อนำโค้ดมาใช้", + "codePlaceholder": "// เขียนสคริปต์อัตโนมัติ Playwright ที่นี่", + "enableTitle": "เปิดใช้งานสคริปต์", + "enableDescription": "หลังบันทึกแล้ว ให้สคริปต์พร้อมใช้งานทันที", + "cancel": "ยกเลิก", + "saving": "กำลังบันทึก...", + "confirm": "บันทึกการเปลี่ยนแปลง" + }, + "delete": { + "title": "ลบสคริปต์", + "subtitle": "เมื่อลบแล้ว ไฟล์สคริปต์จะถูกลบไปด้วย คุณแน่ใจหรือไม่ว่าจะดำเนินการต่อ", + "confirmNamed": "ลบ \"{{name}}\" หรือไม่? การกระทำนี้ไม่สามารถย้อนกลับได้", + "confirmUnnamed": "ลบสคริปต์นี้หรือไม่? การกระทำนี้ไม่สามารถย้อนกลับได้", + "cancel": "ยกเลิก", + "deleting": "กำลังลบ...", + "confirm": "ยืนยันการลบ" + } + } +} diff --git a/src/i18n/locales/th/settings.json b/src/i18n/locales/th/settings.json new file mode 100644 index 0000000..b44aad8 --- /dev/null +++ b/src/i18n/locales/th/settings.json @@ -0,0 +1,57 @@ +{ + "menu": { + "systemSettings": "การตั้งค่าระบบ", + "account": "บัญชี", + "general": "ทั่วไป", + "agents": "Agents", + "models": "Models" + }, + "account": { + "title": "การตั้งค่าบัญชี", + "description": "จัดการข้อมูลบัญชีและความปลอดภัยในการลงชื่อเข้าใช้", + "accountLabel": "บัญชี", + "passwordLabel": "รหัสผ่านสำหรับเข้าสู่ระบบ", + "passwordHelp": "ใช้สำหรับการเข้าสู่ระบบของนักลงทุน เวลาที่เข้าสู่ระบบล่าสุด: {time}", + "configured": "ตั้งค่าแล้ว", + "changePassword": "เปลี่ยนรหัสผ่าน" + }, + "general": { + "title": "การตั้งค่าทั่วไป", + "description": "ปรับแต่งรูปลักษณ์และประสบการณ์การใช้งานของแอป", + "themeSection": "การตั้งค่าธีม", + "languageSection": "ภาษา", + "launchAtStartupTitle": "เปิดอัตโนมัติเมื่อระบบเริ่มทำงาน", + "launchAtStartupDescription": "เปิดแอปโดยอัตโนมัติหลังจากลงชื่อเข้าใช้ระบบ", + "gatewayTitle": "เกตเวย์", + "gatewayDescription": "ตรวจสอบสถานะเกตเวย์ปัจจุบันและการดำเนินการรันไทม์พื้นฐาน", + "gatewayStatusLabel": "สถานะ", + "gatewayPortLabel": "พอร์ต", + "gatewayConnected": "กำลังทำงาน", + "gatewayDisconnected": "หยุดทำงาน", + "gatewayReconnecting": "กำลังรีสตาร์ต", + "gatewayRestart": "รีสตาร์ต", + "gatewayLogs": "บันทึก", + "gatewayHideLogs": "ซ่อนบันทึก", + "gatewayLogsEmpty": "ยังไม่มีบันทึก", + "gatewayLogsLoading": "กำลังโหลดบันทึก...", + "gatewayAutoStartTitle": "เริ่มเกตเวย์อัตโนมัติ", + "gatewayAutoStartDescription": "เริ่มเกตเวย์อัตโนมัติเมื่อเปิดแอป", + "updatesTitle": "การอัปเดต", + "currentVersion": "เวอร์ชันปัจจุบัน", + "checkForUpdates": "ตรวจสอบการอัปเดต", + "checkingForUpdates": "กำลังตรวจสอบการอัปเดต...", + "latestVersion": "คุณกำลังใช้เวอร์ชันล่าสุด", + "newVersionAvailable": "มีเวอร์ชันใหม่: v{version}", + "downloadingVersion": "กำลังดาวน์โหลดเวอร์ชันใหม่... {percent}%", + "downloadComplete": "ดาวน์โหลดเสร็จสิ้น พร้อมติดตั้งแล้ว", + "updateError": "ข้อผิดพลาดในการอัปเดต: {error}", + "updateHint": "ตรวจสอบการอัปเดตเพื่อใช้งานฟีเจอร์ล่าสุด", + "downloadUpdate": "ดาวน์โหลดการอัปเดต", + "restartAndInstall": "รีสตาร์ตและติดตั้ง", + "autoCheckTitle": "ตรวจสอบการอัปเดตอัตโนมัติ", + "autoCheckDescription": "ตรวจสอบการอัปเดตเมื่อเปิดแอป", + "autoDownloadTitle": "ดาวน์โหลดการอัปเดตอัตโนมัติ", + "autoDownloadDescription": "ดาวน์โหลดและติดตั้งการอัปเดตโดยอัตโนมัติ", + "autoUpdateHint": "เมื่อเปิดใช้การอัปเดตอัตโนมัติ ระบบจะดาวน์โหลดและติดตั้งการอัปเดตให้เอง" + } +} diff --git a/src/i18n/locales/th/skills.json b/src/i18n/locales/th/skills.json new file mode 100644 index 0000000..da1b225 --- /dev/null +++ b/src/i18n/locales/th/skills.json @@ -0,0 +1,101 @@ +{ + "title": "สกิล", + "subtitle": "เรียกดูและจัดการความสามารถ AI", + "gatewayWarning": "เกตเวย์ยังไม่ทำงาน ไม่สามารถโหลดสกิลได้หากไม่มีเกตเวย์ที่ใช้งานอยู่", + "refresh": "รีเฟรช", + "openFolder": "เปิดโฟลเดอร์สกิล", + "filter": { + "all": "ทั้งหมด ({{count}})", + "builtIn": "ในตัว ({{count}})", + "marketplace": "Marketplace ({{count}})" + }, + "search": "ค้นหาสกิล...", + "searchMarketplace": "ค้นหาใน Marketplace...", + "actions": { + "enableVisible": "เปิดใช้งานรายการที่แสดง", + "disableVisible": "ปิดใช้งานรายการที่แสดง", + "installSkill": "ติดตั้งสกิล" + }, + "noSkillsSearch": "ลองใช้คำค้นหาอื่น", + "noSkillsAvailable": "ไม่มีสกิลที่ใช้งานได้", + "detail": { + "source": "แหล่งที่มา", + "coreSystem": "ระบบหลัก", + "bundled": "ในตัว", + "userInstalled": "ติดตั้งโดยผู้ใช้", + "enabled": "เปิดใช้งาน", + "disabled": "ปิดใช้งาน", + "apiKey": "API Key", + "apiKeyPlaceholder": "กรอก API Key (ไม่บังคับ)", + "apiKeyDesc": "API Key หลักของสกิลนี้", + "envVars": "ตัวแปรสภาพแวดล้อม", + "addVariable": "เพิ่มตัวแปร", + "noEnvVars": "ยังไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม", + "keyPlaceholder": "คีย์ (เช่น BASE_URL)", + "valuePlaceholder": "ค่า", + "envNote": "คีย์ว่างจะถูกลบโดยอัตโนมัติเมื่อบันทึก", + "saving": "กำลังบันทึก...", + "saveConfig": "บันทึกการตั้งค่า", + "configSaved": "บันทึกการตั้งค่าแล้ว", + "openManual": "เปิดคู่มือ", + "openActualFolder": "เปิดโฟลเดอร์จริง", + "copyPath": "คัดลอกพาธ", + "pathUnavailable": "ไม่สามารถดึงพาธได้", + "uninstall": "ถอนการติดตั้ง", + "enable": "เปิดใช้งาน", + "disable": "ปิดใช้งาน" + }, + "source": { + "badge": { + "bundled": "ในตัว", + "managed": "ไดเรกทอรีที่จัดการ", + "workspace": "เวิร์กสเปซ", + "extra": "ไดเรกทอรีเพิ่มเติม", + "agentsPersonal": ".agents ส่วนตัว", + "agentsProject": ".agents ของโปรเจกต์", + "unknown": "แหล่งที่มาไม่ทราบ" + } + }, + "toast": { + "enabled": "เปิดใช้งานสกิลแล้ว", + "disabled": "ปิดใช้งานสกิลแล้ว", + "installed": "ติดตั้งและเปิดใช้งานสกิลแล้ว", + "uninstalled": "ถอนการติดตั้งสกิลเรียบร้อยแล้ว", + "openedEditor": "เปิดในตัวแก้ไขแล้ว", + "failedEditor": "ไม่สามารถเปิดตัวแก้ไขได้", + "failedSave": "บันทึกการตั้งค่าไม่สำเร็จ", + "failedOpenFolder": "ไม่สามารถเปิดโฟลเดอร์สกิลได้", + "failedInstall": "ติดตั้งไม่สำเร็จ", + "failedUninstall": "ถอนการติดตั้งไม่สำเร็จ", + "failedFolderNotFound": "ยังไม่มีโฟลเดอร์สกิล โปรดติดตั้งสกิลก่อน", + "copiedPath": "คัดลอกพาธแล้ว", + "failedCopyPath": "คัดลอกพาธไม่สำเร็จ", + "failedOpenActualFolder": "ไม่สามารถเปิดโฟลเดอร์สกิลจริงได้", + "searchTimeoutError": "การค้นหาหมดเวลา คุณสามารถค้นหาบน ClawHub.ai ดาวน์โหลด ZIP แล้วแตกไฟล์ไปที่ \"{{path}}\" ได้เช่นกัน", + "installTimeoutError": "การติดตั้งหมดเวลา คุณสามารถดาวน์โหลด ZIP จาก ClawHub.ai แล้วแตกไฟล์ไปที่ \"{{path}}\" ได้เช่นกัน", + "searchRateLimitError": "เกินขีดจำกัดคำขอค้นหา คุณสามารถค้นหาบน ClawHub.ai ดาวน์โหลด ZIP แล้วแตกไฟล์ไปที่ \"{{path}}\" ได้เช่นกัน", + "installRateLimitError": "เกินขีดจำกัดคำขอติดตั้ง คุณสามารถดาวน์โหลด ZIP จาก ClawHub.ai แล้วแตกไฟล์ไปที่ \"{{path}}\" ได้เช่นกัน", + "fetchTimeoutError": "หมดเวลาในการดึงรายการสกิล โปรดตรวจสอบเครือข่าย", + "fetchRateLimitError": "เกินขีดจำกัดคำขอสำหรับการดึงรายการสกิล โปรดลองอีกครั้งภายหลัง", + "timeoutError": "คำขอหมดเวลา โปรดลองใหม่อีกครั้งภายหลัง", + "rateLimitError": "เกินขีดจำกัดคำขอ โปรดลองใหม่อีกครั้งภายหลัง", + "noBatchEnableTargets": "สกิลที่แสดงอยู่ถูกเปิดใช้งานทั้งหมดแล้ว", + "noBatchDisableTargets": "สกิลที่แสดงอยู่ถูกปิดใช้งานทั้งหมดแล้ว", + "batchEnabled": "เปิดใช้งานสกิล {{count}} รายการแล้ว", + "batchDisabled": "ปิดใช้งานสกิล {{count}} รายการแล้ว", + "batchPartial": "อัปเดตแล้ว {{success}} / {{total}} รายการ และมีบางรายการล้มเหลว" + }, + "marketplace": { + "installDialogTitle": "ติดตั้งสกิล", + "installDialogSubtitle": "ค่าเริ่มต้นจะแสดง Explore และจะค้นหาเมื่อมีการกรอกคำสำคัญ", + "sourceLabel": "แหล่งที่มา", + "sourceClawHub": "ClawHub", + "securityNote": "ก่อนติดตั้ง ให้คลิกการ์ดสกิลเพื่อดูเอกสารและข้อมูลความปลอดภัยบน ClawHub", + "manualInstallHint": "มีปัญหาเครือข่ายหรือไม่? คุณสามารถดาวน์โหลด ZIP ของสกิลจาก ClawHub.ai และแตกไฟล์ไปที่ \"{{path}}\" เพื่อติดตั้งด้วยตนเองได้ทุกเมื่อ", + "searching": "กำลังค้นหา ClawHub...", + "noResults": "ไม่พบสกิลที่ตรงกัน", + "emptyPrompt": "ค้นหาสกิลใหม่เพื่อขยายความสามารถ", + "searchError": "ค้นหา ClawHub ไม่สำเร็จ โปรดตรวจสอบการเชื่อมต่อหรือการตั้งค่า", + "install": "ติดตั้ง" + } +} diff --git a/src/i18n/locales/th/task.json b/src/i18n/locales/th/task.json new file mode 100644 index 0000000..ec5eed8 --- /dev/null +++ b/src/i18n/locales/th/task.json @@ -0,0 +1,94 @@ +{ + "dialog": { + "close": "ปิดกล่องโต้ตอบ" + }, + "taskCenter": { + "items": { + "channelOpen": { + "title": "เปิดช่องทางที่เลือก", + "description": "เข้าสู่ระบบด้วยบัญชีแบบแมนนวล และเตรียมพร้อมสำหรับการทำงานอัตโนมัติ" + }, + "roomTypeManage": { + "title": "ประเภทห้องของช่องทาง", + "description": "จัดการการเปิดหรือปิดประเภทห้องของแต่ละช่องทางการขาย" + } + }, + "configureChannels": "ตั้งค่าช่องทาง", + "notices": { + "selectChannelsFirst": "ก่อนเรียกใช้ \"เปิดช่องทาง\" โปรดตั้งค่าช่องทางที่เลือกไว้ในโปรเจกต์ปัจจุบันก่อน", + "openTriggered": "เรียกใช้ \"เปิดช่องทาง\" แล้ว", + "configUpdated": "อัปเดตการตั้งค่าของ \"เปิดช่องทาง\" แล้ว", + "taskCreated": "สร้างงาน \"{{title}}\" แล้ว", + "taskCreateFailed": "สร้างงาน \"{{title}}\" แล้ว แต่รันไม่สำเร็จ", + "retryTriggered": "เรียกใช้ซ้ำสำหรับซับทาสก์ที่ล้มเหลวแล้ว", + "retryFailed": "ลองใหม่ไม่สำเร็จ โปรดลองอีกครั้งในภายหลัง" + } + }, + "channelDialog": { + "searchPlaceholder": "กรอกชื่อช่องทางหรือลิงก์", + "loading": "กำลังโหลดช่องทางที่พร้อมใช้งาน...", + "emptyUnavailable": "ไม่มีช่องทางที่พร้อมใช้งาน โปรดตรวจสอบการตั้งค่าสคริปต์ก่อน", + "emptyFiltered": "ไม่มีช่องทางที่ตรงกันให้เพิ่ม", + "selectedTitle": "ช่องทางที่เลือกแล้ว", + "emptySelected": "ยังไม่ได้เลือกช่องทาง", + "remove": "ลบช่องทาง {{name}}", + "saving": "กำลังบันทึก..." + }, + "board": { + "pendingTab": "ยังไม่ดำเนินการ", + "completedTab": "ดำเนินการแล้ว", + "currentPeriod": "ช่วงเวลาที่รัน", + "retry": "ลองใหม่", + "remove": "ลบ", + "empty": "ไม่มีการ์ดงานในหมวดหมู่นี้" + }, + "operation": { + "open": "เปิดใช้งาน", + "close": "ปิดใช้งาน", + "dialogTitle": "การจัดการประเภทห้องของช่องทาง", + "roomTypeLabel": "เลือกประเภทห้อง", + "roomTypePlaceholder": "โปรดเลือกประเภทห้อง", + "loadingRoomTypes": "กำลังโหลดประเภทห้อง...", + "startDateLabel": "วันที่เริ่มต้น", + "endDateLabel": "วันที่สิ้นสุด", + "actionLabel": "เลือกการดำเนินการ", + "actionPlaceholder": "โปรดเลือกการดำเนินการ", + "helpText": "รายการประเภทห้องจะใช้ API `typeMapping` เดิมโดยตรง ตอนส่งข้อมูลรองรับทั้งฟิลด์ `dyHotSrpingName / dyHotSpringName` เพื่อป้องกันข้อมูลตกหล่นของช่องทางน้ำพุร้อน Douyin", + "cancel": "ยกเลิก", + "confirm": "ยืนยัน", + "submitting": "กำลังดำเนินการ...", + "errors": { + "selectRoomType": "โปรดเลือกประเภทห้อง", + "selectDateRange": "โปรดเลือกช่วงวันที่", + "startAfterEnd": "วันที่เริ่มต้นต้องไม่อยู่หลังวันที่สิ้นสุด", + "selectOperation": "โปรดเลือกการดำเนินการ" + } + }, + "status": { + "pending": "รอดำเนินการ", + "running": "กำลังดำเนินการ", + "success": "สำเร็จ", + "failed": "ล้มเหลว", + "partial_failed": "ล้มเหลวบ้างบางส่วน" + }, + "store": { + "scriptNames": { + "fliggyTrace": "ติดตามสถานะห้องพัก Fliggy", + "meituanTrace": "ติดตามสถานะห้องพัก Meituan", + "douyinHotelTrace": "ติดตามสถานะห้องพักโรงแรม Douyin", + "douyinHotSpringTrace": "ติดตามสถานะห้องพักน้ำพุร้อน Douyin" + }, + "messages": { + "waiting": "รอการดำเนินการ", + "started": "เริ่มดำเนินการ" + }, + "taskTitleWithName": "{{operation}} ประเภทห้องของช่องทาง - {{name}}", + "taskTitleWithoutName": "{{operation}} ประเภทห้องของช่องทาง", + "errors": { + "taskMissingExecute": "ไม่สามารถรันได้เนื่องจากไม่มีงานนี้อยู่", + "taskExecutionFailed": "การรันงานล้มเหลว", + "taskMissingRetry": "ไม่สามารถลองใหม่ได้เนื่องจากไม่มีงานนี้อยู่", + "noFailedSubTasks": "งานนี้ไม่มีซับทาสก์ที่ล้มเหลวและสามารถลองใหม่ได้" + } + } +} diff --git a/src/i18n/locales/zh/common.json b/src/i18n/locales/zh/common.json index 47a287a..28e26c1 100644 --- a/src/i18n/locales/zh/common.json +++ b/src/i18n/locales/zh/common.json @@ -21,7 +21,7 @@ "language": { "zh": "中文", "en": "英文", - "ja": "日语" + "th": "泰语" }, "common": { "loading": "加载中...", diff --git a/src/lib/providers.ts b/src/lib/providers.ts index 0421c42..247783f 100644 --- a/src/lib/providers.ts +++ b/src/lib/providers.ts @@ -60,7 +60,7 @@ export interface ProviderTypeInfo { icon: string; placeholder: string; placeholderZh?: string; - placeholderJa?: string; + placeholderTh?: string; model?: string; requiresApiKey: boolean; defaultBaseUrl?: string; @@ -171,14 +171,14 @@ export const PROVIDER_TYPE_INFO: ProviderTypeInfo[] = [ { id: 'minimax-portal', name: 'MiniMax (Global)', icon: '☁️', placeholder: 'sk-...', model: 'MiniMax', requiresApiKey: false, isOAuth: true, supportsApiKey: true, defaultBaseUrl: 'https://api.minimax.io/v1', apiProtocol: 'openai-completions', defaultModelId: 'MiniMax-M2.7', showModelId: true, showModelIdInDevModeOnly: true, modelIdPlaceholder: 'MiniMax-M2.7', apiKeyUrl: 'https://platform.minimax.io' }, { id: 'modelstudio', name: 'Model Studio', icon: '☁️', placeholder: 'sk-...', model: 'Qwen', requiresApiKey: true, defaultBaseUrl: 'https://coding.dashscope.aliyuncs.com/v1', showBaseUrl: true, defaultModelId: 'qwen3.5-plus', showModelId: true, showModelIdInDevModeOnly: true, modelIdPlaceholder: 'qwen3.5-plus', apiKeyUrl: 'https://bailian.console.aliyun.com/', hidden: true }, { id: 'ark', name: 'ByteDance Ark', icon: 'A', placeholder: 'your-ark-api-key', model: 'Doubao', requiresApiKey: true, defaultBaseUrl: 'https://ark.cn-beijing.volces.com/api/v3', showBaseUrl: true, showModelId: true, modelIdPlaceholder: 'ep-20260228000000-xxxxx', docsUrl: 'https://www.volcengine.com/', codePlanPresetBaseUrl: 'https://ark.cn-beijing.volces.com/api/coding/v3', codePlanPresetModelId: 'ark-code-latest', codePlanDocsUrl: 'https://www.volcengine.com/docs/82379/1928261?lang=zh' }, - { id: 'ollama', name: 'Ollama', icon: '🦙', placeholder: 'Not required', placeholderZh: '无需填写', placeholderJa: '不要', requiresApiKey: false, defaultBaseUrl: 'http://localhost:11434/v1', showBaseUrl: true, showModelId: true, modelIdPlaceholder: 'qwen3:latest' }, + { id: 'ollama', name: 'Ollama', icon: '🦙', placeholder: 'Not required', placeholderZh: '无需填写', placeholderTh: 'ไม่ต้องกรอก', requiresApiKey: false, defaultBaseUrl: 'http://localhost:11434/v1', showBaseUrl: true, showModelId: true, modelIdPlaceholder: 'qwen3:latest' }, { id: 'custom', name: 'Custom', icon: '⚙️', placeholder: 'API key...', placeholderZh: 'API Key...', - placeholderJa: 'API キー...', + placeholderTh: 'API Key...', requiresApiKey: true, showBaseUrl: true, showModelId: true, @@ -216,7 +216,7 @@ export function getProviderDocsUrl( } export function getProviderPlaceholder( - provider: Pick | undefined, + provider: Pick | undefined, language: string | LanguageCode, ): string | undefined { if (!provider?.placeholder) { @@ -225,8 +225,8 @@ export function getProviderPlaceholder( if (language.startsWith('zh') && provider.placeholderZh) { return provider.placeholderZh; } - if (language.startsWith('ja') && provider.placeholderJa) { - return provider.placeholderJa; + if (language.startsWith('th') && provider.placeholderTh) { + return provider.placeholderTh; } return provider.placeholder; } diff --git a/src/pages/Cron/index.tsx b/src/pages/Cron/index.tsx index acd1999..9b37e18 100644 --- a/src/pages/Cron/index.tsx +++ b/src/pages/Cron/index.tsx @@ -507,7 +507,7 @@ function formatWeekday(weekday: string, t: Translate): string { function resolveDateLocale(locale: LanguageCode): string { if (locale === 'zh') return 'zh-CN'; - if (locale === 'ja') return 'ja-JP'; + if (locale === 'th') return 'th-TH'; return 'en-US'; } diff --git a/src/pages/Knowledge/index.tsx b/src/pages/Knowledge/index.tsx index 9bb564a..b29748c 100644 --- a/src/pages/Knowledge/index.tsx +++ b/src/pages/Knowledge/index.tsx @@ -123,7 +123,7 @@ function formatBytes(bytes: number | null | undefined): string { function resolveDateLocale(locale: LanguageCode): string { if (locale === 'zh') return 'zh-CN'; - if (locale === 'ja') return 'ja-JP'; + if (locale === 'th') return 'th-TH'; return 'en-US'; } diff --git a/src/stores/settings.ts b/src/stores/settings.ts index c33f3d2..6483aab 100644 --- a/src/stores/settings.ts +++ b/src/stores/settings.ts @@ -82,6 +82,10 @@ function createInitialState(): SettingsState { let state: SettingsState = createInitialState(); +function migrateLegacyLanguageCode(language: string | null | undefined): string | null | undefined { + return language === 'ja' ? 'th' : language; +} + function emit(): void { for (const listener of listeners) { listener(); @@ -219,7 +223,7 @@ async function hydrate(): Promise { readConfigValue(CONFIG_KEYS.GATEWAY_AUTO_START, true), ]); - const resolvedLanguage = resolveSupportedLanguage(language ?? systemLanguage); + const resolvedLanguage = resolveSupportedLanguage(migrateLegacyLanguageCode(language) ?? systemLanguage); const appliedTheme = applyTheme(themeMode, systemTheme); patchState({ @@ -265,7 +269,7 @@ async function setThemeMode(themeMode: ThemeMode): Promise { } async function setLanguage(language: string | null | undefined, persist = true): Promise { - const resolved = resolveSupportedLanguage(language, state.language); + const resolved = resolveSupportedLanguage(migrateLegacyLanguageCode(language), state.language); if (state.language === resolved && state.initialized) return state; applyLocale(resolved); diff --git a/src/types/runtime.ts b/src/types/runtime.ts index 7b15a48..621071d 100644 --- a/src/types/runtime.ts +++ b/src/types/runtime.ts @@ -12,7 +12,7 @@ export type ThemeMode = 'light' | 'dark' | 'system'; export type ResolvedThemeMode = 'light' | 'dark'; -export type LanguageCode = 'en' | 'zh' | 'ja'; +export type LanguageCode = 'en' | 'zh' | 'th'; export type RuntimePlatform = 'win32' | 'darwin' | 'linux' | 'web' | 'unknown';