diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 75dcc68b7b..dbbe56d804 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -16,6 +16,7 @@ import { renderWorkspaceNotifyContent } from '@/utils/workspaceNotifyContent' // TDesign locale configs import enUSConfig from 'tdesign-vue-next/esm/locale/en_US' import zhCNConfig from 'tdesign-vue-next/esm/locale/zh_CN' +import zhTWConfig from 'tdesign-vue-next/esm/locale/zh_TW' import koKRConfig from 'tdesign-vue-next/esm/locale/ko_KR' import ruRUConfig from 'tdesign-vue-next/esm/locale/ru_RU' @@ -28,6 +29,7 @@ const settingsStore = useSettingsStore() const tdLocaleMap: Record = { 'en-US': enUSConfig, 'zh-CN': zhCNConfig, + 'zh-TW': zhTWConfig, 'ko-KR': koKRConfig, 'ru-RU': ruRUConfig, } diff --git a/frontend/src/components/AgentEmbedChannelPanel.vue b/frontend/src/components/AgentEmbedChannelPanel.vue index a3e1ab013b..37cc1beb44 100644 --- a/frontend/src/components/AgentEmbedChannelPanel.vue +++ b/frontend/src/components/AgentEmbedChannelPanel.vue @@ -536,6 +536,7 @@ const headerTitleModeOptions = computed(() => ([ const defaultLocaleOptions = computed(() => ([ { label: t('embedPublish.defaultLocaleBrowser'), value: '' }, { label: '简体中文', value: 'zh-CN' }, + { label: '繁體中文', value: 'zh-TW' }, { label: 'English', value: 'en-US' }, { label: '한국어', value: 'ko-KR' }, { label: 'Русский', value: 'ru-RU' }, diff --git a/frontend/src/i18n/embed.ts b/frontend/src/i18n/embed.ts index a0162bf983..bbf7e7eea3 100644 --- a/frontend/src/i18n/embed.ts +++ b/frontend/src/i18n/embed.ts @@ -1202,7 +1202,7 @@ const ruEmbedPublish = { }, } as const -const SUPPORTED_LOCALES = ['zh-CN', 'en-US', 'ko-KR', 'ru-RU'] as const +const SUPPORTED_LOCALES = ['zh-CN', 'zh-TW', 'en-US', 'ko-KR', 'ru-RU'] as const export type EmbedLocale = (typeof SUPPORTED_LOCALES)[number] /** Isolated from the main app `locale` key so embed preview never hijacks admin UI language. */ @@ -1214,6 +1214,7 @@ export function normalizeEmbedLocale(raw: string): EmbedLocale { if (s.startsWith('en')) return 'en-US' if (s.startsWith('ko')) return 'ko-KR' if (s.startsWith('ru')) return 'ru-RU' + if (s === 'zh-tw' || s === 'zh-hant') return 'zh-TW' if (s.startsWith('zh')) return 'zh-CN' const exact = SUPPORTED_LOCALES.find((l) => l.toLowerCase() === s) return exact || 'zh-CN' diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts index f7820402ea..8889461817 100755 --- a/frontend/src/i18n/index.ts +++ b/frontend/src/i18n/index.ts @@ -1,5 +1,6 @@ import { createI18n } from 'vue-i18n' import zhCN from './locales/zh-CN.ts' +import zhTW from './locales/zh-TW.ts' import ruRU from './locales/ru-RU.ts' import enUS from './locales/en-US.ts' import koKR from './locales/ko-KR.ts' @@ -7,6 +8,7 @@ import { BUILT_IN_DEFAULT, resolveDefaultLocale } from './resolveDefaultLocale.t const messages = { 'zh-CN': zhCN, + 'zh-TW': zhTW, 'en-US': enUS, 'ru-RU': ruRU, 'ko-KR': koKR diff --git a/frontend/src/i18n/localeKeyAudit.ts b/frontend/src/i18n/localeKeyAudit.ts index 0cb915f389..60ed715652 100644 --- a/frontend/src/i18n/localeKeyAudit.ts +++ b/frontend/src/i18n/localeKeyAudit.ts @@ -20,10 +20,12 @@ import enUS from './locales/en-US.ts' import koKR from './locales/ko-KR.ts' import ruRU from './locales/ru-RU.ts' import zhCN from './locales/zh-CN.ts' +import zhTW from './locales/zh-TW.ts' export const LOCALE_BUNDLES = { 'en-US': enUS, 'zh-CN': zhCN, + 'zh-TW': zhTW, 'ko-KR': koKR, 'ru-RU': ruRU, } as const @@ -512,7 +514,7 @@ export function findAllLocaleMessageCompileErrors( type LocaleTree = Record -const LOCALE_ORDER: LocaleName[] = ['en-US', 'zh-CN', 'ko-KR', 'ru-RU'] +const LOCALE_ORDER: LocaleName[] = ['en-US', 'zh-CN', 'zh-TW', 'ko-KR', 'ru-RU'] const LOCALES_DIR = join(dirname(fileURLToPath(import.meta.url)), 'locales') function getLocaleValueAtPathParts(current: unknown, parts: string[]): unknown { diff --git a/frontend/src/i18n/locales/zh-TW.ts b/frontend/src/i18n/locales/zh-TW.ts new file mode 100755 index 0000000000..3748f6d170 --- /dev/null +++ b/frontend/src/i18n/locales/zh-TW.ts @@ -0,0 +1,6358 @@ +export default { + platformApiKeys: { + title: '平臺 API Key', + description: '為跨空間自動化建立平臺級憑證;呼叫空間介面時透過 X-Tenant-ID 指定目標空間。', + securityNotice: '平臺 API Key 預設可選擇任意空間。請只授予必要能力;金鑰明文僅在建立時顯示一次。', + create: '建立平臺 API Key', + createDescription: '平臺 Key 不繫結空間,所有操作仍受能力範圍限制。', + loading: '正在載入…', + empty: '暫無平臺 API Key', + name: '名稱', + namePlaceholder: '例如:集中運維自動化', + key: '金鑰', + capability: '能力授權', + capabilityMore: '+{count}', + viewAllCapabilities: '檢視全部能力授權', + capabilityHint: '空間能力對任意 X-Tenant-ID 生效;系統能力用於平臺控制面介面。', + lastUsed: '最後使用', + createdAt: '建立時間', + actions: '操作', + never: '從未使用', + systemCapabilityGroup: '平臺控制面', + createdTitle: '平臺 API Key 已建立', + createdDescription: '請立即複製並安全儲存。關閉後將不再顯示完整金鑰。', + copy: '複製金鑰', + copySuccess: '金鑰已複製', + deleteConfirm: '確定刪除“{name}”嗎?使用該 Key 的自動化將立即失效。', + deleteSuccess: '平臺 API Key 已刪除', + deleteFailed: '刪除平臺 API Key 失敗', + nameRequired: '請輸入名稱', + capabilityRequired: '請至少選擇一項能力', + loadFailed: '載入平臺 API Key 失敗', + createFailed: '建立平臺 API Key 失敗', + capabilityHints: { + tenantsRead: '列出、搜尋和檢視所有空間。', + tenantsManage: '建立、更新、刪除空間及應用全域性空間配置。', + settingsRead: '讀取平臺級執行設定。', + settingsManage: '更新和重置平臺級執行設定。', + runtimeRead: '檢視任務佇列和任務詳情。', + runtimeManage: '重試、立即執行、取消或刪除執行時任務。', + auditRead: '讀取平臺級審計日誌。' + }, + capabilities: { + tenantsRead: '檢視空間', + tenantsManage: '管理空間', + settingsRead: '檢視系統設定', + settingsManage: '管理系統設定', + runtimeRead: '檢視執行時', + runtimeManage: '管理執行時', + auditRead: '檢視系統審計' + } + }, + tenantInvitation: { + inboxTooltip: '檢視待接受的邀請', + pendingSectionTitle: '待接受的邀請', + pendingSectionDesc: '發出後等待對方在站內確認。{days} 天未響應將自動過期。', + pendingEmpty: '暫無待接受的邀請。', + inviteSubmit: '傳送邀請', + inviteSuccess: '邀請已發出,等待對方接受。', + confirmInviteTitle: '確認傳送邀請?', + confirmInviteBody: '將向 {email} 發出加入邀請(角色:{role})。TA 在站內接受後才會成為成員。', + confirmSend: '傳送', + copyLink: '複製邀請連結', + copied: '已複製到剪貼簿', + copyFailed: '複製失敗,請手動選中文字', + errors: { + pendingExists: '已經向該使用者發出過一條待接受的邀請。', + alreadyMember: '該使用者已是當前空間的成員。', + notPending: '邀請已不在待處理狀態。', + forbidden: '只有被邀請人本人可以接受或拒絕該邀請。', + notFound: '邀請不存在或已被撤銷。', + generic: '操作失敗,請稍後重試。' + }, + myInbox: { + title: '我的邀請', + description: '其他空間發給您的加入邀請。接受後您將以對應角色加入對方空間。', + empty: '沒有待處理的邀請。', + acceptButton: '接受', + declineButton: '拒絕', + acceptSuccess: '已加入 "{tenant}"。', + declineSuccess: '已拒絕邀請。', + from: '邀請人', + tenantLabel: '空間', + expiresIn: '到期:{date}', + messageLabel: '留言' + }, + status: { + pending: '待接受', + shareLinkActive: '生效中', + accepted: '已接受', + declined: '已拒絕', + revoked: '已撤銷', + expired: '已過期' + }, + columns: { + invitee: '被邀請人', + role: '角色', + inviter: '邀請人', + expiresAt: '到期時間', + status: '狀態', + operations: '操作' + }, + revoke: { + button: '撤銷', + confirmBody: '撤銷後,{email} 將無法再接受此邀請;如需再邀請請重新發出。', + confirm: '撤銷', + success: '邀請已撤銷。' + }, + shareLink: { + button: '生成共享連結', + cellTitle: '透過連結邀請', + cellAccepted: '已加入 {count} 人', + cellEmpty: '尚無成員加入', + dialogTitle: '生成共享邀請連結', + description: '生成一條多人可用的註冊連結,發到群裡就行;誰開啟都能用自己的信箱註冊並加入當前空間。連結 {days} 天後過期,或隨時可在列表中撤銷。', + generate: '生成連結', + resultTitle: '邀請連結已生成', + resultBody: '複製下方連結,透過任意私密渠道發給被邀請人。連結也會儲存在下方列表中,隨時可以重新複製或撤銷。', + revokeConfirm: '撤銷後,所有還未註冊的人都無法再使用此連結;如需重發請生成新連結。' + } + }, + tenantMember: { + title: '成員管理', + sectionDescription: '邀請夥伴加入當前空間並分配角色。只有 Owner 可以新增或移除成員。', + learnRbacGuide: '瞭解 RBAC', + listTitle: '空間成員', + loading: '正在載入成員…', + retry: '重試', + empty: '尚未邀請任何成員。點選右上角邀請夥伴加入。', + emptySearch: '沒有匹配 "{q}" 的成員。', + searchPlaceholder: '按姓名或信箱搜尋', + audit: { + tabLabel: '審計日誌', + description: '記錄當前空間的成員變更與訪問拒絕事件,按時間倒序展示。一分鐘內的重複拒絕會自動去重。', + refresh: '重新整理', + end: '已經到底了。', + empty: '暫無審計事件。', + forbidden: '無權檢視審計日誌。', + systemActor: '系統', + requiredRole: '需要角色:{role}', + expanded: { + actorId: '操作人 ID', + targetUserId: '目標使用者 ID', + targetType: '目標型別', + targetId: '目標 ID', + details: '原始詳情' + }, + outcome: { + success: '成功', + denied: '拒絕' + }, + action: { + 'rbac.member_added': '新增成員', + 'rbac.member_removed': '移除成員', + 'rbac.member_role_changed': '角色變更', + 'rbac.member_left': '成員退出', + 'rbac.access_denied': '訪問被拒', + 'rbac.invitation_sent': '發出邀請', + 'rbac.invitation_accepted': '接受邀請', + 'rbac.invitation_declined': '拒絕邀請', + 'rbac.invitation_revoked': '撤銷邀請', + 'rbac.invitation_expired': '邀請過期' + }, + columns: { + time: '時間', + actor: '操作人', + action: '事件', + target: '目標', + path: '請求', + outcome: '結果' + } + }, + errors: { + emailRequired: '請輸入信箱', + emailFormat: '信箱格式不正確', + roleRequired: '請選擇角色', + userNotFound: '該信箱尚未註冊,請先邀請對方註冊帳號。', + lastOwner: '無法降級、移除或退出最後一位 Owner,請先把其他成員提升為 Owner。', + notFound: '未找到對應的成員。', + invalidRole: '角色必須是 owner / admin / contributor / viewer 之一。', + generic: '操作失敗,請稍後重試。' + }, + roleChange: { + success: '角色已更新' + }, + leave: { + confirmTitle: '確認退出當前空間?', + confirmBody: '退出後您將無法訪問當前空間內的所有知識庫和智慧體。後續可被再次邀請加入。', + confirm: '退出', + success: '已退出當前空間' + }, + remove: { + button: '移除', + confirmBody: '確定要將 {name} 從當前空間中移除嗎?該使用者會立即失去訪問許可權。', + confirm: '移除', + success: '已移除成員' + }, + add: { + button: '邀請成員', + dialogTitle: '邀請成員', + emailLabel: '信箱', + emailPlaceholder: 'invitee{\'@\'}example.com', + roleLabel: '角色' + }, + role: { + owner: '所有者', + admin: '管理員', + contributor: '編輯', + viewer: '訪客' + }, + columns: { + member: '姓名與信箱', + role: '角色', + joinedAt: '加入時間', + operations: '操作' + }, + permissions: { + title: '角色許可權說明', + desc: '每個角色在當前空間內能做的事情。服務端強制執行,UI 控制元件僅作展示。', + iconHint: '懸停檢視角色許可權說明', + manageMembers: '管理成員', + manageTenantConfig: '修改空間配置', + manageInfra: '配置模型 / 向量庫 / IM 通道', + createOwnKB: '建立並編輯自己的知識庫和智慧體', + readAll: '檢視空間內容' + } + }, + userProfile: { + title: '使用者資訊', + description: '檢視您的帳號基礎資訊(使用者 ID、使用者名稱、信箱、註冊時間),並可修改登入密碼', + changePassword: { + label: '修改密碼', + description: '使用當前密碼驗證後設定新密碼。修改成功後所有裝置上的登入狀態將失效,需要重新登入。', + currentLabel: '當前密碼', + currentPlaceholder: '請輸入當前密碼', + currentRequired: '請輸入當前密碼', + newLabel: '新密碼', + newPlaceholder: '8-32 個字元,需包含字母和數字', + confirmLabel: '確認新密碼', + confirmPlaceholder: '再次輸入新密碼', + submit: '更新密碼', + success: '密碼已更新,請使用新密碼重新登入', + failed: '修改密碼失敗,請檢查當前密碼是否正確', + policyFailed: '新密碼須為 8-32 個字元,且同時包含字母和數字', + sameAsCurrent: '新密碼不能與當前密碼相同', + oidcOnlyDescription: '您的帳號透過 OIDC 登入開通,尚未設定本地登入密碼。', + oidcOnlyNotice: '請聯絡系統管理員重置密碼,或繼續使用 OIDC 登入。自助修改密碼需要先知道當前密碼。', + }, + }, + credential: { + configured: '已配置', + unconfigured: '未配置', + configure: '配置', + update: '更換', + remove: '移除', + inputPlaceholder: '請輸入', + savedToast: '憑證已儲存', + saveFailed: '儲存憑證失敗', + removedToast: '憑證已移除', + removeFailed: '移除憑證失敗', + confirmRemovePrompt: '確認移除?此操作不可撤銷', + confirmRemove: '確認移除' + }, + integrations: { + title: '釋出整合', + selectAgentPlaceholder: '請選擇智慧體', + selectAgentHint: '請先選擇一個智慧體', + boundAgent: '繫結智慧體', + filterByAgent: '按智慧體篩選', + filterByAgentWithName: '按智慧體篩選:{name}', + filterAllAgents: '全部智慧體', + claw: { + title: 'WeKnora Skill', + subtitle: '透過 WeKnora REST API 匯入文件並執行混合檢索(向量 + 關鍵詞)。適用於上傳檔案/URL/Markdown 到知識庫、跨庫檢索與瀏覽知識內容。', + capabilitiesTitle: 'Skill 能力', + stepsTitle: '配置步驟', + openApiSettings: '開啟 API 資訊', + copy: '複製', + copyEnvSuccess: '已複製環境變數示例', + copyCmdSuccess: '已複製安裝命令', + ecosystemNote: 'Skill 託管於 ClawHub({\'@\'}lyingbug/weknora),完整 API 說明與版本歷史請參見 ClawHub 頁面。', + installCta: '前往 ClawHub', + installCtaHint: '安裝 WeKnora Skill · 將在新標籤頁開啟', + hubMeta: 'ClawHub · {\'@\'}lyingbug/weknora · MIT-0', + steps: { + verify: { + title: '驗證連線', + desc: '安裝後讓 Agent 列出知識庫或執行一次檢索,確認 API 憑證與網路可達。' + }, + install: { + title: '安裝 Skill', + desc: '在已安裝 OpenClaw CLI 的環境中執行下方命令,或前往 ClawHub 頁面按指引安裝。' + }, + env: { + title: '配置環境變數', + desc: '在終端或 ~/.zshrc、~/.bashrc 中設定 WEKNORA_BASE_URL 與 WEKNORA_API_KEY。下方示例已填入當前 API 地址,請將 API Key 替換為實際值。' + }, + api: { + title: '獲取 API 憑證', + desc: '在「設定 → API 資訊」中複製 API Key 與 API 地址。' + } + }, + capabilities: { + browse: { + title: '瀏覽知識庫', + desc: '列出知識庫與條目、檢視詳情,管理已匯入的知識內容。' + }, + search: { + title: '混合檢索', + desc: '單庫 hybrid-search 與跨庫 knowledge-search,結合向量與關鍵詞召回。' + }, + manual: { + title: '寫入 Markdown', + desc: '以 Markdown 形式建立或編輯知識條目,適合會議記錄與結構化筆記。' + }, + url: { + title: '匯入網頁', + desc: '透過 URL 抓取網頁內容並寫入知識庫,支援解析狀態輪詢。' + }, + upload: { + title: '上傳檔案', + desc: '將 PDF、Word、Excel 等文件上傳至知識庫,自動解析與向量化。' + } + } + }, + chrome: { + title: '知識管理助手', + subtitle: '配合 WeKnora 自建服務使用:在任意網頁側邊欄提問、剪藏內容、Markdown 速記,將瀏覽中的知識沉澱到你的知識庫。', + capabilitiesTitle: '核心能力', + stepsTitle: '配置步驟', + openApiSettings: '開啟 API 資訊', + copy: '複製', + copySuccess: '已複製 API 地址', + installCta: '前往 Chrome 應用商店', + installCtaHint: '官方擴充套件 · 將在新標籤頁開啟', + storeMeta: 'Chrome 應用商店 · v1.0.0', + steps: { + connect: { + title: '在外掛中完成連線', + desc: '開啟外掛設定,選擇「企業/開發者」模式,填入服務 API 地址與 API Key。下方為當前服務地址。' + }, + install: { + title: '安裝 Chrome 外掛', + desc: '前往 Chrome 應用商店安裝「知識管理助手」。' + }, + port: { + title: '桌面版配置固定埠(推薦)', + desc: '使用 WeKnora 桌面版時,在 API 資訊中設定固定埠(如 37841),避免每次啟動後地址變化導致外掛斷連。' + }, + api: { + title: '獲取 API 憑證', + desc: '在「設定 → API 資訊」中複製 API Key 與 API 地址。' + } + }, + scenarios: { + research: '日常資料調研', + learning: '學習筆記整理', + tech: '技術資料收集', + work: '工作知識沉澱' + }, + capabilities: { + shortcuts: { + title: '高效快捷鍵', + desc: '可自定義快捷鍵快速提問、開啟側邊欄等操作,提升日常效率。' + }, + notes: { + title: 'Markdown 速記', + desc: '內建 Markdown 編輯器,隨時記錄靈感與筆記,一鍵儲存到知識庫。' + }, + clip: { + title: '網頁內容一鍵採集', + desc: '儲存頁面 URL、AI 智慧剪藏正文,或手動框選區域,精準寫入指定知識庫。' + }, + qa: { + title: '知識庫智慧問答', + desc: '側邊欄對話面板,支援多知識庫切換與快速/深度/精確三種回答模式,邊瀏覽邊提問不打斷工作流。' + } + } + }, + agentEditor: { + label: '釋出渠道', + desc: '將智慧體釋出到 IM 平臺或網站,在整合中心統一管理' + }, + embedOverview: { + title: '網頁嵌入渠道' + }, + imOverview: { + title: '已接入的 IM' + }, + api: { + title: 'API 整合', + subtitle: '透過 REST API 接入服務,並配置請求如何攜帶終端使用者身份。', + loading: '正在載入 API 整合設定...', + retry: '重試', + copy: '複製', + copySuccess: '已複製', + baseUrl: 'API 地址', + baseUrlDesc: '與 REST API 路徑拼接使用。', + apiKeys: 'API Keys', + apiKeysDesc: '為不同整合建立獨立 Key,並限制操作許可權與可訪問知識庫範圍。', + createApiKey: '建立 API Key', + createApiKeyDialogDesc: '選擇該 API Key 可用的能力和知識庫範圍。', + noApiKeys: '暫無 API Key', + apiKeyName: '名稱', + apiKeyValue: 'API Key', + apiKeyNamePlaceholder: '例如:MCP 只讀訪問', + apiKeyNameRequired: '請輸入 API Key 名稱', + apiKeyCapabilitiesRequired: 'Scoped API Key 至少需要選擇一項能力', + apiKeyAccessMode: '授權方式', + apiKeyScopedAccess: '能力授權', + apiKeyAccessType: '訪問型別', + apiKeyAccessTypeHint: '「知識庫」按下方許可權級別在知識庫範圍內操作;「空間完全訪問」額外開放模型、資料源等全部空間級介面。', + apiKeyCapabilities: '可用能力', + apiKeyCapabilityGroupKnowledge: '知識庫資料', + apiKeyCapabilityGroupAutomation: '智慧體與整合', + apiKeyCapabilityGroupCollaboration: '成員與空間', + apiKeyCapabilityGroupTenant: '空間配置', + apiKeyCapabilitySelectGroup: '全選', + apiKeyCapabilityClearGroup: '清空', + capabilityTenantFull: '空間完全訪問', + capabilityTenantFullHint: '允許呼叫模型、向量庫、資料源、渠道等全部空間級介面;知識庫範圍不再生效。', + capabilityRetrieve: '檢索知識庫', + capabilityRetrieveHint: '允許讀取、查詢和檢索所選知識庫範圍內的資料;不建立會話,也不修改內容。', + capabilityChat: '對話能力', + capabilityChatHint: '允許該金鑰發起對話並管理自己的會話;不修改知識庫內容。', + capabilityReadAgents: '讀取智慧體', + capabilityReadAgentsHint: '允許列出智慧體、檢視智慧體詳情、讀取智慧體預設和建議問題;不允許發起對話或修改智慧體。', + capabilityIngest: '寫入知識庫內容', + capabilityIngestHint: '允許向授權範圍內的知識庫寫入內容(上傳文件、編輯分塊/FAQ/標籤/wiki);不能新建知識庫、不能新建智慧體、不能清空知識庫,且僅限所選知識庫範圍。', + capabilityManageKbs: '管理知識庫', + capabilityManageKbsHint: '允許管理知識庫全生命週期:新建、複製、修改、刪除知識庫並調整初始化/配置資訊。針對已有知識庫的操作(複製/更新/刪除)仍受所選知識庫範圍限制;新建不受限(新知識庫歸本空間)。', + capabilityManageAgents: '管理智慧體', + capabilityManageAgentsHint: '允許建立、修改、刪除、複製智慧體。智慧體配置可能含模型/MCP 等敏感繫結,預設關閉,按需開啟。', + capabilityMessageHistory: '訊息歷史', + capabilityMessageHistoryHint: '允許檢索空間聊天曆史並讀取聊天曆史統計;不授予空間配置許可權。', + capabilityManageModels: '管理模型', + capabilityManageModelsHint: '允許管理模型配置、模型憑證、模型連通性測試和 WeKnoraCloud 憑證。', + capabilityManageMcpServices: '管理 MCP 服務', + capabilityManageMcpServicesHint: '允許管理 MCP 服務、憑證、工具審批策略和該主體的 OAuth 授權狀態。', + capabilityManageDatasources: '管理資料源', + capabilityManageDatasourcesHint: '允許管理資料源聯結器、憑證、資源選擇和同步任務;繫結知識庫時仍受知識庫範圍限制。', + capabilityManageChannels: '管理渠道', + capabilityManageChannelsHint: '允許管理智慧體的嵌入渠道、IM 渠道和微信掃碼繫結流程。', + capabilityManageVectorStores: '管理檢索基礎設施', + capabilityManageVectorStoresHint: '允許管理向量庫配置,以及解析器、文件讀取器和儲存引擎連通性檢查。', + capabilityManageStorageBackends: '管理儲存後端', + capabilityManageStorageBackendsHint: '允許管理物件/檔案儲存後端例項(如 S3 相容或本地檔案儲存)的增刪改查、連通性測試及空間預設儲存設定。', + capabilityManageWebSearch: '管理聯網搜尋', + capabilityManageWebSearchHint: '允許管理聯網搜尋供應商配置、憑證和連線測試。', + capabilityRunEvaluations: '執行評測', + capabilityRunEvaluationsHint: '允許執行評測任務並讀取評測結果。', + capabilityManageMembers: '管理成員', + capabilityManageMembersHint: '允許檢視和管理空間成員、角色、邀請和邀請連結;不包含 API Key 管理、空間刪除或所有權轉移。', + capabilityManageSpaces: '管理空間', + capabilityManageSpacesHint: '允許管理組織空間、加入流程、空間成員、邀請和共享空間可見性;不授予知識庫或智慧體分享管理許可權。', + capabilityManageTenantSettings: '管理空間設定', + capabilityManageTenantSettingsHint: '允許讀取和更新空間級整合設定,例如 API 終端使用者身份模式、請求頭配置、空間 KV 配置等;不包含 API Key 管理、成員管理、空間刪除或所有權轉移。', + apiKeyKnowledgeScope: '知識庫範圍', + apiKeyKnowledgeScopePlaceholder: '留空表示允許訪問全部知識庫', + allKnowledgeBases: '全部知識庫', + editApiKeyScope: '編輯 API Key', + editApiKeyScopeDesc: '修改 API Key「{name}」的名稱和授權範圍。', + editApiKeyScopeHint: '留空表示允許訪問本空間的全部知識庫。所有修改儲存後立即生效。', + updateApiKeyScopeSuccess: 'API Key 已更新', + updateApiKeyScopeFailed: '更新 API Key 失敗', + createdAt: '建立時間', + actions: '操作', + deleteApiKey: '刪除', + deleteApiKeyConfirm: '刪除後該 API Key 會立即失效,已部署的整合將無法繼續使用它。', + deleteApiKeySuccess: 'API Key 已刪除', + deleteApiKeyFailed: '刪除 API Key 失敗', + createApiKeyFailed: '建立 API Key 失敗', + loadApiKeysFailed: '載入 API Key 列表失敗', + apiKeyCreated: 'API Key 已建立', + principalMode: '使用者身份模式', + principalModeDesc: '配置 API 請求如何識別終端使用者。該身份會同時用於區分不同使用者的對話 Session 與 MCP 工具授權。', + principalScope: '終端使用者身份負責隔離 Session 與 MCP OAuth;API Key 自身的操作許可權和知識庫範圍由上方 API Keys 管理。', + modeTenant: '僅空間', + modeDirect: '直接傳使用者 ID', + modeSigned: '簽名 Token', + directWarning: '直接傳使用者 ID 會信任呼叫方請求頭,僅適用於可信服務端到服務端呼叫。', + directWarningDetail: '任何持有 API Key 的呼叫方都可以透過修改使用者 ID 請求頭冒充其他外部使用者,從而共用或劫持其 MCP OAuth 授權。請勿用於瀏覽器或不可信客戶端;面向終端使用者請使用「簽名 Token」。', + signedRecommended: '推薦給面向使用者的應用:由你的業務後端為外部使用者簽發短期 HS256 JWT。', + signedFlowDetail: 'HMAC 金鑰僅儲存在 WeKnora 與你的可信後端,切勿放入請求或下發給瀏覽器。請求頭裡傳的是用該金鑰簽出的 JWT 字串(每次簽發或過期後會變),不是金鑰本身。JWT 須包含 sub(外部使用者 ID)、tenant_id、aud=weknora、exp(有效期不超過 24 小時)。', + directHeader: '使用者 ID 請求頭', + requireDirectHeader: '必須攜帶使用者 ID', + requireDirectHeaderDesc: '開啟後,缺少使用者 ID 請求頭的 API Key 請求將被拒絕;關閉則按整個空間統一處理,不區分具體終端使用者。', + tokenHeader: 'Token 請求頭', + tokenHeaderDesc: '客戶端在該固定請求頭中攜帶後端簽發的 JWT。', + hmacSecret: 'HMAC 金鑰', + hmacSecretDesc: '與 WeKnora 儲存的同一份金鑰;僅用於後端簽發 JWT,不要作為請求頭髮送。', + secretConfigured: '已配置金鑰(不可回看);輸入新值可輪換', + secretSavedCopyHint: '金鑰已儲存,請立即複製到後端配置。離開本頁後將無法再次檢視。', + generateSecret: '生成金鑰', + hmacSecretResetConfirmTitle: '確認重置 HMAC 金鑰?', + hmacSecretResetConfirmBody: '重置後,舊的 HMAC 金鑰會立即失效,所有使用舊金鑰簽發 JWT 的後端服務必須更換為新金鑰才可繼續透過簽名 Token 呼叫。此操作不可撤銷。', + hmacSecretResetConfirmOk: '確認重置', + hmacSecretResetConfirmCancel: '取消', + tokenSignExample: '後端簽發 JWT 示例(Go)', + signedRequestStep0: '# 0. 在你的後端簽發 JWT(HS256,aud=weknora,sub=使用者 ID,tenant_id={tenantId},exp 不超過 24 小時)', + signedRequestStep0Hint: '# 將 JWT 放入 {headerName} 請求頭,不要傳 HMAC 金鑰', + requestExampleCreateSession: '# 1. 建立會話', + requestExampleAgentChat: '# 2. Agent 對話(SSE;將 替換為第 1 步返回的 id)', + requestExampleJwtPlaceholder: '<後端簽發的 JWT>', + requestExample: '請求示例', + playgroundTitle: 'API Playground', + playgroundDesc: '用當前 API Key 和身份模式發起真實請求,驗證會話建立、智慧體對話和 SSE 返回。', + playgroundOpen: '開啟 Playground', + playgroundDrawerDesc: '按真實 API 整合方式除錯 Session、Agent Chat 和 SSE 返回', + playgroundSectionRequest: '請求配置', + playgroundSectionPreview: '請求預覽', + playgroundSectionResult: '執行結果', + playgroundAgent: '測試智慧體', + playgroundAgentPlaceholder: '選擇要測試的智慧體', + playgroundBuiltin: '內建', + playgroundAgentsLoadFailed: '智慧體列表載入失敗', + playgroundExternalUser: '外部使用者 ID', + playgroundExternalUserPlaceholder: 'user_123', + playgroundTenantModeHint: '僅空間模式不會傳送外部使用者身份,所有 API 會話歸屬同一個空間級主體。', + playgroundDirectModeHint: '將透過 {headerName} 請求頭髮送此使用者 ID。', + playgroundSignedModeHint: '簽名模式由 JWT 的 sub 代表外部使用者;Playground 會用這裡的使用者 ID 自動簽出短期測試 JWT。', + playgroundQuestion: '測試問題', + playgroundQuestionPlaceholder: '輸入要傳送給智慧體的問題', + playgroundRequestPreview: '請求預覽(已遮蔽金鑰)', + playgroundRun: '執行測試', + playgroundStop: '停止', + playgroundNeedApiKey: '當前空間沒有 API Key。', + playgroundNeedAgent: '請選擇測試智慧體。', + playgroundNeedQuestion: '請輸入測試問題。', + playgroundNeedExternalUser: '請輸入外部使用者 ID。', + playgroundMintTokenFailed: '生成短期測試 JWT 失敗。', + playgroundMissingSessionId: '建立會話成功,但響應中沒有 session id。', + playgroundNoStream: '對話介面沒有返回可讀取的 SSE 流。', + playgroundGeneratedToken: '本次生成的測試 Token', + playgroundStepSession: '步驟 1:建立 Session', + playgroundStepChat: '步驟 2:Agent Chat SSE', + playgroundFinalAnswer: '提取出的回答', + playgroundEmptyResult: '執行後將在這裡顯示 Session 響應、SSE 原始輸出和提取出的回答。', + playgroundSuccess: '測試完成({ms}ms)', + playgroundStopped: '測試已停止', + playgroundFailed: 'API Playground 測試失敗', + loadFailed: '載入 API 整合設定失敗', + saveFailed: '儲存 API 整合設定失敗', + saveSuccess: 'API 整合設定已儲存', + autoSaveNeedSecret: '簽名 Token 模式需要填寫 HMAC 金鑰後才能自動儲存。' + }, + tabs: { + im: 'IM 整合', + embed: '網頁嵌入', + api: 'API 整合', + chrome: 'Chrome 外掛', + claw: 'Claw Skill' + } + }, + datasource: { + title: '資料源管理', + description: '配置外部資料源,自動同步內容到知識庫', + add: '新增資料源', + empty: '暫無資料源', + edit: '編輯', + delete: '刪除', + deleteConfirm: '確定刪除該資料源?同步的知識不會被刪除。', + deleteSuccess: '資料源已刪除', + deleteFailed: '刪除失敗', + syncNow: '立即同步', + syncTriggered: '同步任務已提交', + syncFailed: '同步觸發失敗', + pause: '暫停', + resume: '還原', + paused: '已暫停', + resumed: '已還原', + pauseFailed: '暫停失敗', + logs: '日誌', + syncModeLabel: '同步模式', + createTitle: '新增資料源', + editTitle: '編輯資料源', + nameLabel: '名稱', + namePlaceholder: '輸入資料源名稱', + sectionBasic: '基本資訊', + testConnection: '測試連線', + testSuccess: '連線成功', + testFailed: '連線失敗', + connected: '已連線', + connectionFailed: '連線失敗', + isRequired: '為必填項', + credentialsLabel: '憑證', + gitlab: { + baseUrl: 'GitLab 地址', + accessToken: '個人訪問權杖', + projects: 'GitLab 專案', + projectsHint: '填寫專案 ID 或名稱空間路徑(如 group/project),可選指定分支和目錄。', + project: '專案', projectId: '專案 ID', projectIdPlaceholder: '例如:12345 或 group/project', + ref: '分支', refPlaceholder: '留空時使用預設分支', + paths: '同步目錄', pathsPlaceholder: '每行一個目錄;留空同步整個專案', + addProject: '新增專案', projectRequired: '請至少新增一個 GitLab 專案', + }, + resourceHint: '選擇要同步的內容空間/資料夾', + untitled: '無標題', + resourceLoadFailed: '載入資源列表失敗', + noResources: '未找到可同步的知識庫空間', + noResourcesDesc: '應用需要透過群聊獲得知識庫訪問許可權才能拉取內容', + noResourcesDesc_notion: '應用需要獲得 Notion 頁面的訪問許可權才能拉取內容', + retryLoadResources: '重新載入', + guideStep1: '在飛書中建立一個群聊,在群設定「群機器人」中新增你的應用', + guideStep2: '開啟知識庫「設定」→「成員設定」→ 新增成員,搜尋該群聊名稱並新增', + guideStep3: '確保群聊角色至少為「可閱讀」,然後回到這裡點重新載入', + guideStep1_notion: '在 Notion 中開啟你想要同步的頁面或資料庫', + guideStep2_notion: '點選右上角的「···」選單,選擇「Connect to」或「Add connections」', + guideStep3_notion: '搜尋並選擇你的整合應用(Integration),然後回到這裡點重新載入', + permissionDocLink: '檢視飛書知識庫許可權配置文件', + syncScheduleLabel: '同步頻率', + conflictLabel: '衝突策略', + syncDeletions: '同步刪除(源端刪除時同步刪除知識庫中的條目)', + createAndSync: '建立並立即同步', + createAndSyncSuccess: '資料源建立成功,同步任務已提交', + createButSyncFailed: '資料源已建立,但觸發同步失敗', + updateSuccessSyncHint: '資料源更新成功;編輯不會自動觸發同步,如需重新匯入請點選“同步”。', + saveFailed: '儲存失敗', + syncHistory: '同步歷史', + refreshLogs: '重新整理日誌', + noLogs: '暫無同步記錄', + comingSoon: '即將支援', + docHint: '在以下地址獲取憑證:', + openDoc: '開啟文件', + prereqBarText: '首次使用?點選檢視飛書應用配置指引', + prereqBarText_yuque: '首次使用?點選檢視語雀 Token 配置指引', + prereqStep1Brief_yuque: '建立語雀個人 Token', + prereqStep1Desc_yuque: '登入語雀 → 個人頭像 → 設定 → Token → 新建 Token', + prereqStep2Brief_yuque: '為 Token 勾選所需許可權', + prereqStep2Desc_yuque: '至少勾選 repo:read 和 doc:read(讀取知識庫和文件內容)', + prereqStep3Brief_yuque: '(可選)企業版填寫 Base URL', + prereqStep3Desc_yuque: '公有雲使用者無需填寫;語雀企業版或私有部署請填寫企業域名', + prereqOpenConsole_yuque: '前往語雀 Token 設定', + prereqBarText_ima: '首次使用?點選檢視騰訊 IMA OpenAPI 授權指引', + prereqStep1Brief_ima: '開通 IMA 智慧體接入', + prereqStep1Desc_ima: '登入 https://ima.qq.com/agent-interface 並申請 OpenAPI 接入', + prereqStep2Brief_ima: '獲取 ClientID 與 APIKey', + prereqStep2Desc_ima: '在智慧體接入頁複製 ima-openapi-clientid 與 ima-openapi-apikey 兩個憑證', + prereqStep3Brief_ima: '授權目標知識庫', + prereqStep3Desc_ima: '在 IMA 客戶端為該憑證授權需要同步的知識庫,未授權的知識庫不會出現在列表中', + prereqOpenConsole_ima: '前往 IMA OpenAPI 控制檯', + prereqStep1Brief_feishu: "建立飛書自建應用", + prereqStep1Desc_feishu: "登入飛書開放平臺 → 建立企業自建應用", + prereqStep2Brief_feishu: "新增機器人能力", + prereqStep2Desc_feishu: "開放平臺 → 你的應用 → 新增應用能力 → 機器人", + prereqStep3Brief_feishu: "配置應用許可權", + prereqStep3Desc_feishu: "為應用開通 wiki:wiki:readonly, drive:drive:readonly, drive:export:readonly, docx:document:readonly 許可權", + prereqStep1Brief_lark: "建立 Lark 自建應用", + prereqStep1Desc_lark: "登入 Lark 開放平臺 → 建立企業自建應用", + prereqStep2Brief_lark: "新增機器人能力", + prereqStep2Desc_lark: "開放平臺 → 你的應用 → 新增應用能力 → 機器人", + prereqStep3Brief_lark: "配置應用許可權", + prereqStep3Desc_lark: "為應用開通 wiki:wiki:readonly, drive:drive:readonly, drive:export:readonly, docx:document:readonly 許可權", + prereqStep1Brief_feishu_drive: "建立飛書自建應用", + prereqStep1Desc_feishu_drive: "登入飛書開放平臺 → 建立企業自建應用", + prereqStep2Brief_feishu_drive: "新增機器人能力", + prereqStep2Desc_feishu_drive: "開放平臺 → 你的應用 → 新增應用能力 → 機器人", + prereqStep3Brief_feishu_drive: "配置應用許可權", + prereqStep3Desc_feishu_drive: "為應用開通 drive:drive:readonly, drive:export:readonly, docx:document:readonly 許可權", + prereqStep1Brief_lark_drive: "建立 Lark 自建應用", + prereqStep1Desc_lark_drive: "登入 Lark 開放平臺 → 建立企業自建應用", + prereqStep2Brief_lark_drive: "新增機器人能力", + prereqStep2Desc_lark_drive: "開放平臺 → 你的應用 → 新增應用能力 → 機器人", + prereqStep3Brief_lark_drive: "配置應用許可權", + prereqStep3Desc_lark_drive: "為應用開通 drive:drive:readonly, drive:export:readonly, docx:document:readonly 許可權", + prereqBotBrief: '為應用新增「機器人」能力', + prereqBotDesc: '開放平臺 → 新增應用能力 → 機器人 → 建立版本併發布', + prereqPermBrief: '開通 API 許可權', + prereqOpenConsole: '前往飛書開放平臺配置', + prereqMemberBrief: '透過群聊新增為知識庫成員', + prereqMemberDesc: '建立群聊 → 新增應用為群機器人 → 將群聊新增為知識庫成員', + back: '上一步', + next: '下一步', + save: '儲存', + schedule30min: '每 30 分鐘', + schedule1h: '每小時', + schedule6h: '每 6 小時', + schedule12h: '每 12 小時', + schedule24h: '每天', + neverSynced: '未同步', + justNow: '剛剛', + minutesAgo: '{n} 分鐘前', + hoursAgo: '{n} 小時前', + daysAgo: '{n} 天前', + resourceType: { + wikiSpace: '知識庫空間', + docCategory: '文件標籤', + book: '語雀知識庫' + }, + scheduleHuman: { + '30min': '每 30 分鐘', + '1h': '每小時', + '6h': '每 6 小時', + '12h': '每 12 小時', + '24h': '每天' + }, + field: { + appId: 'App ID', + appSecret: 'App Secret', + integrationToken: 'Integration Token', + apiToken: 'API Token', + imaClientId: 'IMA ClientID', + imaApiKey: 'IMA APIKey', + baseUrl: 'Base URL(可選)', + baseUrlHint: '留空將使用預設公有雲地址;如果是私有部署/企業內網部署,或需要透過反向代理訪問,請填寫自定義地址(例如 https://api-proxy.example.com)', + feedUrls: '訂閱源地址', + feedUrlsHint: '每行一個 RSS / Atom 訂閱源地址,支援同時填寫多個', + authHeaders: '自定義請求頭(可選)', + authHeadersHint: '用於訪問私有訂閱源,每行一個,格式為「名稱: 值」,例如 Authorization: Bearer xxxx' + }, + connectorDesc: { + feishu: '同步飛書知識庫中的文件、表格、檔案', + lark: '同步 Lark 知識庫中的文件、表格、檔案(飛書國際版)', + feishu_drive: "同步飛書雲盤資料夾中的文件、表格、檔案", + lark_drive: "同步 Lark 雲盤資料夾中的文件、表格、檔案(飛書國際版)", + notion: '同步 Notion 中的頁面和資料庫', + yuque: '同步語雀知識庫中的文件', + ima: '同步騰訊 IMA 知識庫中的文件、筆記與檔案(暫不支援 AI 會話與影片解析)', + rss: '同步 RSS / Atom 訂閱源中的文章', + gitlab: '同步 GitLab 專案中的檔案' + }, + connector: { + feishu: '飛書', + lark: 'Lark(飛書國際版)', + feishu_drive: "飛書雲盤", + lark_drive: "Lark 雲盤", + notion: 'Notion', + yuque: '語雀', + ima: '騰訊 IMA', + rss: 'RSS / Atom 訂閱', + gitlab: 'GitLab' + }, + logDetail: { + startTime: '開始時間', + endTime: '結束時間', + failedItems: '失敗文件', + failedItemsMore: '還有 {n} 個失敗文件未顯示', + docsFailedSummary: '{n} 個文件同步失敗' + }, + logSummary: { + total: '總次數', + success: '成功', + failed: '失敗', + items: '同步條目' + }, + logMetric: { + total: '總計', + skipped: '跳過', + failed: '失敗' + }, + logStatus: { + running: '同步中', + success: '成功', + partial: '部分成功', + failed: '失敗', + canceled: '已取消' + }, + step: { + selectType: '選擇型別', + credentials: '配置憑證', + resources: '選擇範圍', + strategy: '同步策略' + }, + conflict: { + overwrite: '覆蓋更新', + skip: '跳過已存在' + }, + status: { + active: '已連線', + paused: '已暫停', + error: '異常' + }, + syncMode: { + incremental: '增量同步', + full: '全量同步' + }, + drive: { + folderTokenLabel: "雲盤資料夾 Token", + folderTokenPlaceholder: "輸入 folder_token 或飛書雲盤資料夾連結", + folderTokenRequired: "請輸入具體資料夾的 folder_token,不支援雲空間根目錄", + rootNotSupportedHint: "根目錄不分頁且不返回快捷方式,請選擇具體資料夾", + load: "載入", + shareHint: "需先將該雲盤資料夾分享給應用所在的群,應用才能訪問", + placeholderTitle: "請先載入雲盤資料夾", + placeholderDesc: "在上方輸入 folder_token(或從飛書雲盤資料夾 URL 複製)並點選「載入」", + loadForbiddenHint: "應用無權訪問該資料夾。請在飛書雲盤中將該資料夾分享給應用所在的群後再試。", + loadAuthHint: "應用憑證無效或缺少雲盤許可權,請檢查 App ID / App Secret 及 drive:drive:readonly 等許可權。", + loadNotFoundHint: "folder_token 不存在或已刪除,請確認從飛書雲盤資料夾 URL 複製的 token 正確。", + }, + syncError: { + deletion_lookup_failed: '刪除前查詢文件失敗,請檢視伺服器日誌', + deletion_failed: '刪除失敗,請檢視伺服器日誌', + ingest_failed: '匯入失敗,請檢視伺服器日誌' + }, + }, + ollama: { + unknown: '未知', + today: '今天', + yesterday: '昨天', + daysAgo: '{days} 天前' + }, + mermaid: { + diagram: '圖表', + expand: '全屏檢視', + zoomIn: '放大', + zoomOut: '縮小', + reset: '重置', + download: '下載圖片', + close: '關閉', + downloading: '下載中...' + }, + faqManager: { + import: { + recentResult: '最近匯入結果', + totalData: '匯入資料', + success: '成功', + added: '新增', + merged: '合併更新', + partialFailed: '部分失敗', + failed: '失敗', + skipped: '跳過', + progressHint: '正在校驗並匯入 FAQ 資料...', + downloadReasons: '下載原因', + appendMode: '追加模式', + replaceMode: '替換模式', + importing: '匯入中...', + importDone: '匯入完成', + importFailed: '匯入失敗', + waiting: '等待中...', + importInProgress: '匯入正在進行中,請等待完成後再試', + noFailedRecords: '暫無失敗記錄可下載' + } + }, + agentEditor: { + builtinHint: '這是內建智慧體,名稱和描述不可修改,但可以調整配置引數', + fileTypes: { + label: '支援的檔案型別', + desc: '限制可選擇的檔案型別,留空表示支援所有型別', + allTypes: '全部型別', + pdf: 'PDF 文件', + word: 'Word 文件 (.docx/.doc)', + textLabel: '文字', + text: '純文字檔案 (.txt)', + markdown: 'Markdown 文件', + csv: '逗號分隔值檔案', + excel: 'Excel 表格 (.xlsx/.xls)', + imageLabel: '圖片', + image: '圖片檔案 (.jpg/.jpeg/.png)' + }, + fallback: { + fixed: '固定回覆', + model: '模型生成' + }, + dataAnalysis: { + enableLabel: '啟用表格資料分析', + enableDesc: '命中 CSV/Excel 類檔案時,先呼叫大模型生成 DuckDB SQL 進行統計或篩選,再據此回答。會額外增加一次模型呼叫與幾秒延遲,僅在確實需要時開啟。' + }, + faq: { + title: 'FAQ 優先策略', + enableLabel: '啟用 FAQ 優先', + enableDesc: 'FAQ 答案將優先於普通文件被引用,提高回答準確性', + thresholdLabel: '直接回答閾值', + thresholdDesc: '當問題與 FAQ 相似度超過此值時,直接使用 FAQ 答案', + boostLabel: 'FAQ 分數加權', + boostDesc: 'FAQ 結果的相關性分數乘以此係數,使其排序更靠前' + }, + chatParser: { + label: '聊天附件解析策略', + desc: '為不同檔案型別指定解析引擎,僅對當前智慧體的聊天附件生效', + waitTimeoutLabel: '附件解析等待超時(秒)', + waitTimeoutDesc: '單輪問答等待附件解析完成的最長時間,超時後未完成的附件會被跳過。大檔案 / 掃描件可調大。0 表示使用全域性預設。' + }, + audioUpload: { + label: '語音上傳', + desc: '啟用後使用者可在對話中上傳音訊檔案,系統將使用 ASR 模型自動轉錄為文字', + asrModel: 'ASR 模型', + asrModelDesc: '用於音訊轉錄的語音識別模型,未配置時音訊檔案將以佔位符形式傳遞', + asrModelPlaceholder: '請選擇 ASR 模型' + }, + imageUpload: { + navLabel: '附件上傳', + sectionTitle: '附件上傳', + sectionDesc: '配置對話中圖片、文件、音訊等附件的上傳、解析及對應模型', + label: '圖片上傳', + desc: '啟用後使用者可在對話中上傳圖片並由 VLM 理解', + vlmModel: 'VLM 模型', + vlmModelDesc: '用於圖片分析的視覺語言模型', + vlmModelPlaceholder: '請選擇 VLM 模型', + vlmModelRequired: '啟用圖片上傳時必須選擇 VLM 模型', + imageUnderstandingLabel: '附件圖片理解 / 掃描件 OCR', + imageUnderstandingDesc: '對圖片型 PDF/PPT 等掃描件,當解析不出文字時用 VLM 進行 OCR 識別。開啟會增加解析耗時,預設關閉。', + ocrMaxPagesLabel: '掃描件 OCR 最大頁數', + ocrMaxPagesDesc: '掃描件送入 VLM 做 OCR 的最大頁數,越多覆蓋越全但越慢、越貴。0 表示使用全域性預設。', + useGlobalDefault: '0 = 全域性預設', + storageProvider: '圖片儲存', + storageProviderDesc: '選擇圖片檔案的儲存引擎,留空則使用系統預設', + storageProviderPlaceholder: '選擇儲存引擎', + storageDefault: '系統預設', + notConfigured: '未配置', + goStorageSettings: '去儲存設定中配置' + }, + llmCallTimeout: { + label: 'LLM 呼叫超時', + desc: '單次 LLM 呼叫的最大等待時間(秒),超過此時間後呼叫將被中止', + hint: '留空或填 0 表示使用預設值(120 秒)', + placeholder: '輸入秒數,建議範圍 60-1800' + }, + mcp: { + label: 'MCP 服務', + desc: '選擇 Agent 可以呼叫的 MCP 服務', + selectLabel: '選擇 MCP 服務', + selectDesc: '選擇要啟用的 MCP 服務', + selectPlaceholder: '選擇 MCP 服務', + authWaitTimeout: '授權等待超時(秒)', + authWaitTimeoutDesc: '對話中觸發 OAuth 授權時,等待你完成授權的最長秒數,超時後自動跳過授權提示(僅對使用 OAuth 的 MCP 服務生效)。', + authWaitTimeoutPlaceholder: '預設 600 秒', + unavailableService: '不可用服務' + }, + agentType: { + label: '智慧體型別', + desc: '選擇一個預設會自動填充系統提示詞、工具列表和推薦的知識庫範圍。', + defaultNamePattern: '我的{label}', + kbIncompatibleWarn: '已選的 {count} 個知識庫不適用於當前型別,請手動調整', + kbMismatch: { + ragQa: '未啟用 RAG 檢索', + wikiQa: '未啟用 Wiki', + hybridRagWiki: '未啟用任何檢索能力', + dataAnalysis: '需啟用 RAG(不支援 FAQ)', + quickAnswer: '快速問答模式需啟用 RAG 檢索', + generic: '不適用於當前型別' + } + }, + im: { + title: 'IM 整合', + description: '將智慧體接入即時通訊平臺,支援企業微信、飛書、Slack、Telegram、釘釘、Mattermost、微信、QQBot 和雲之家', + feishu: '飛書', + lark: 'Lark(飛書國際版)', + slack: 'Slack', + telegram: 'Telegram', + dingtalk: '釘釘', + mattermost: 'Mattermost', + wecom: '企業微信', + wechat: '微信', + qqbot: 'QQBot', + yunzhijia: '雲之家', + addChannel: '新增渠道', + channelsTitle: 'IM 渠道', + disabled: '已停用', + editChannel: '編輯渠道', + deleteConfirm: '確定刪除該渠道?刪除後無法還原。', + channelName: '渠道名稱', + channelNamePlaceholder: '輸入渠道名稱,方便辨識', + channelNameDefaultHint: '預設為平臺名稱,可自行修改;留空儲存時也會使用平臺名稱', + platform: '平臺', + mode: '接入模式', + outputMode: '輸出模式', + outputStream: '流式輸出', + outputFull: '完整輸出', + callbackUrl: '回呼地址', + empty: '暫無 IM 渠道', + unnamed: '未命名渠道', + docLink: '檢視接入文件', + wecomConsole: '企業微信管理後臺', + feishuConsole: '飛書開放平臺', + larkConsole: 'Lark 開放平臺', + slackConsole: 'Slack API 控制檯', + telegramConsole: 'Telegram BotFather', + dingtalkConsole: '釘釘開放平臺', + dingtalkCardTemplateId: '卡片模板 ID(可選)', + dingtalkCardTemplateIdHint: '在 open-dev.dingtalk.com/fe/card 建立 AI 卡片模板,啟用後支援打字機效果的流式輸出', + mattermostConsole: 'Mattermost 整合說明', + qqbotConsole: 'QQ 開放平臺', + qqbotAPIBaseURLHint: '可選,留空則使用預設正式環境 API 地址。', + qqbotGatewayURLHint: '可選,留空則自動獲取通用 WebSocket 接入點。', + yunzhijiaConsole: '雲之家開放平臺', + yunzhijiaRobotDoc: '機器人訊息文件', + yunzhijiaImageDoc: '開發者平臺(圖片功能)', + yunzhijiaModeHint: '支援 Webhook 和 WebSocket;WebSocket 模式無需配置公網回呼地址。', + yunzhijiaSendMsgUrl: '傳送訊息地址', + yunzhijiaSendMsgUrlHint: '用於機器人回覆訊息。', + yunzhijiaSecret: '簽名金鑰(可選)', + yunzhijiaSecretPlaceholder: '雲之家機器人設定中的 HmacSHA1 簽名金鑰', + yunzhijiaSecretHint: '配置後,將對傳入的回呼請求進行 HmacSHA1 簽名驗證', + yunzhijiaAppId: '應用 App ID(圖片下載)', + yunzhijiaAppIdPlaceholder: '雲之家開放平臺應用 App ID', + yunzhijiaAppSecret: '應用 App Secret(圖片下載)', + yunzhijiaAppSecretPlaceholder: '雲之家開放平臺應用 Secret', + yunzhijiaAppCredentialHint: '用於獲取 appAccessToken 並下載使用者傳送的圖片檔案。', + yunzhijiaTimeout: 'HTTP 超時時間(秒)', + yunzhijiaTimeoutHint: '透過傳送訊息地址回覆的超時時間,預設 10 秒', + yunzhijiaAllowedHostSuffix: '允許的主機字尾', + yunzhijiaAllowedHostSuffixHint: '限制傳送訊息地址的目標域名字尾,提升安全性(如 yunzhijia.com)', + yunzhijiaSendMsgUrlRequired: '請填寫雲之家機器人設定中的傳送訊息地址', + mattermostModeHint: 'Mattermost 僅支援 Webhook(出站 Webhook + Bot Token)。', + mattermostPostToMain: '回覆顯示在頻道主時間線', + mattermostPostToMainHint: '開啟後 Bot 回覆作為頻道內新帖子;關閉(預設)則作為原訊息的執行緒回覆,主視窗僅顯示「N 條回覆」。', + modeHint: '推薦使用 WebSocket 方式接入,配置更簡單', + consoleTip: '前往獲取憑證資訊', + wecomWSEndpointHint: '可選,私有化部署時填寫自定義 WebSocket 地址,留空則使用預設公有雲地址。內網地址需將域名加入 SSRF_WHITELIST 環境變數', + wecomAPIBaseURLHint: '可選,私有化部署時填寫自定義 API 地址,留空則使用預設公有雲地址。內網地址需將域名加入 SSRF_WHITELIST 環境變數', + feishuAPIBaseURLHint: '可選。若伺服器能直連外網則留空;若需透過代理才能訪問飛書,填寫反向代理地址(如 nginx,http://host:port)。內網地址需將域名加入 SSRF_WHITELIST 環境變數', + fileKnowledgeBase: '檔案儲存知識庫', + fileKnowledgeBasePlaceholder: '選擇知識庫(可選)', + fileKnowledgeBaseHint: '配置後,使用者傳送的檔案將自動儲存到該知識庫中', + sessionMode: '會話模式', + sessionModeUser: '按使用者(預設)', + sessionModeThread: '按話題', + sessionModeHint: '使用者模式:每個使用者獨立對話,使用 /clear 開始新對話。話題模式:每個訊息話題獨立對話,同一話題中多人可協作。', + wechatScanBind: '掃碼繫結微信', + wechatScanning: '請使用微信掃描QR 碼', + wechatBindSuccess: '微信繫結成功', + wechatRebind: '重新繫結', + wechatHint: '需要 iOS 微信 8.0.70+ 版本,僅支援單聊訊息', + wechatQRExpired: 'QR 碼已過期,請重新獲取', + wechatBinding: '繫結中...', + sectionChannel: '渠道資訊', + sectionConnection: '連線設定', + sectionCredentials: '平臺憑證', + selectPlatform: '選擇平臺', + selectPlatformDesc: '選擇要接入的即時通訊平臺', + enabled: '啟用渠道', + stepBasic: '基本資訊', + stepConnection: '連線設定', + stepKnowledge: '檔案儲存', + stepCredentials: '平臺憑證', + sectionAccess: '接入與輸出', + sectionSession: '會話設定', + sectionCallback: '回呼地址', + sectionKnowledge: '檔案儲存', + sectionStatus: '執行狀態' + }, + embed: { + title: '網頁嵌入', + description: '將智慧體嵌入到您的網頁,訪客可透過頁面內聊天視窗或右下角浮窗發起對話,知識庫範圍跟隨本智慧體配置。' + }, + tools: { + thinking: '思考', + thinkingDesc: '動態和反思性的問題解決思考工具', + todoWrite: '制定計劃', + todoWriteDesc: '建立結構化的研究計劃', + grepChunks: '關鍵詞搜尋', + grepChunksDesc: '快速定位包含特定關鍵詞的文件和分塊', + knowledgeSearch: '語義搜尋', + knowledgeSearchDesc: '理解問題並查詢語義相關內容', + listChunks: '檢視文件分塊', + listChunksDesc: '獲取文件完整分塊內容', + queryGraph: '查詢知識圖譜', + queryGraphDesc: '從知識圖譜中查詢關係', + getDocInfo: '獲取文件資訊', + getDocInfoDesc: '檢視文件元資料', + dbQuery: '查詢資料庫', + dbQueryDesc: '查詢資料庫中的資訊', + dataAnalysis: '資料分析', + dataAnalysisDesc: '理解資料檔案並進行資料分析', + dataSchema: '檢視資料元資訊', + dataSchemaDesc: '獲取表格檔案的元資訊', + requiresKb: '(需要配置知識庫)', + requiresRagKb: '(需要關聯啟用向量/關鍵詞索引的知識庫)', + requiresWikiKb: '(需要關聯啟用 Wiki 能力的知識庫)', + wikiSearch: '搜尋 Wiki', + wikiSearchDesc: '在 Wiki 知識庫中按關鍵詞/語義搜尋頁面', + wikiReadPage: '閱讀 Wiki 頁面', + wikiReadPageDesc: '讀取指定 Wiki 頁面的完整內容', + wikiReadSourceDoc: '精讀源文件', + wikiReadSourceDocDesc: '透過知識點深入閱讀 Wiki 頁面背後的原始文件', + wikiFlagIssue: '標記 Wiki 問題', + wikiFlagIssueDesc: '標記頁面中存在的事實錯誤或合併衝突問題', + wikiWritePage: '建立/覆蓋 Wiki', + wikiWritePageDesc: '建立新頁面或完全覆蓋已有 Wiki 頁面', + wikiReplaceText: '區域性替換 Wiki', + wikiReplaceTextDesc: '替換 Wiki 頁面中的特定文字', + wikiRenamePage: '重新命名 Wiki', + wikiRenamePageDesc: '重新命名 Wiki 頁面並自動更新關聯連結', + wikiDeletePage: '刪除 Wiki', + wikiDeletePageDesc: '刪除 Wiki 頁面並自動清理關聯死鏈', + wikiReadIssue: '檢視 Wiki 問題', + wikiReadIssueDesc: '檢視特定 Wiki 頁面的巡檢問題詳情', + wikiUpdateIssue: '更新 Wiki 問題', + wikiUpdateIssueDesc: '更新 Wiki 頁面問題的處理狀態', + webSearch: '網路搜尋', + webFetch: '網頁抓取', + groupBase: '基礎', + groupRag: '知識庫檢索(RAG)', + groupWikiRead: 'Wiki 讀取', + groupWikiEdit: 'Wiki 編輯', + groupWikiIssue: 'Wiki 巡檢', + groupData: '資料分析', + writeWarning: '會修改 Wiki 內容', + dangerTag: '可寫', + statusNoKb: '當前未關聯任何知識庫', + kbMetricRag: 'RAG 知識庫', + kbMetricWiki: 'Wiki 知識庫', + statusInactive: '有 {count} 個已勾選工具在當前配置下無法生效', + effectiveLabel: '最終啟用的工具', + effectiveDesc: '根據當前配置計算,這是智慧體儲存後實際能呼叫的工具集合', + effectiveEmpty: '當前沒有可用工具,智慧體將退化為純模型問答' + }, + desc: { + name: '為智慧體設定一個易於識別的名稱', + description: '簡要描述智慧體的用途和特點', + systemPrompt: '自定義系統提示詞,定義智慧體的行為和角色', + leaveEmptyDefault: '(留空則使用系統預設)', + contextTemplate: '定義如何將檢索到的內容格式化後傳遞給模型', + model: '選擇智慧體使用的大語言模型', + temperature: '控制輸出的隨機性,0 最確定,1 最隨機', + maxTokens: '模型生成回覆的最大Token數量', + thinking: '啟用模型的擴充套件思考能力(需要模型支援)', + conversationSection: '配置多輪對話開關與問題改寫開關(改寫提示詞見「提示詞」)', + multiTurn: '開啟後將保留歷史對話上下文', + historyRounds: '保留最近幾輪對話作為上下文', + rewrite: '多輪對話時自動改寫使用者問題,消解指代和補全省略', + memoryEnabled: '允許該智慧體讀取並補充你的長期記憶。關閉後,與它的對話既不會讀取記憶,也不會新增記憶。空間或個人設定關閉時,這裡開啟也不會生效', + queryUnderstandModel: '用於問題理解(改寫與意圖識別)的模型,留空則複用主對話模型', + rewriteSystemPrompt: '用於問題改寫的系統提示詞(留空使用預設)', + rewriteUserPrompt: '用於問題改寫的使用者提示詞模板(留空使用預設)', + selectTools: '選擇 Agent 可以使用的工具', + maxIterations: 'Agent 執行任務時的最大推理步驟數', + kbScope: '選擇智慧體可訪問的知識庫範圍', + webSearch: '啟用後智慧體可以搜尋網際網路獲取資訊', + webSearchProvider: '為此智慧體指定搜尋引擎,留空則使用預設搜尋引擎', + webSearchMaxResults: '每次搜尋返回的最大結果數量', + webFetchEnabled: 'Rerank 後自動抓取排名靠前的網頁完整內容,提升回答質量', + webFetchTopN: 'Rerank 後最多抓取幾個網頁的完整內容', + retrievalSection: '配置知識庫檢索召回、排序與 FAQ 優先策略(ReRank 模型見「模型配置」)', + queryExpansion: '自動擴充套件查詢詞以提高召回率', + embeddingTopK: '向量檢索返回的最大結果數量', + keywordThreshold: '關鍵詞檢索的最低相關性分數', + vectorThreshold: '向量檢索的最低相似度分數', + rerankTopK: '重排序後保留的最大結果數量', + rerankThreshold: '重排序的最低相關性分數', + fallbackStrategy: '當無法從知識庫找到相關內容時的處理方式', + fallbackResponse: '當無法回答時返回的固定文字', + fallbackPrompt: '當無法從知識庫找到答案時,引導模型生成回覆的提示詞' + }, + selection: { + all: '全部', + selected: '指定', + disabled: '禁用' + }, + promptNav: { + ariaLabel: '提示詞目錄', + system: '系統提示詞', + context: '上下文模板', + intent: '意圖提示詞', + rewriteSystem: '改寫 · 系統', + rewriteUser: '改寫 · 使用者', + fallback: '檢索兜底' + }, + intentPrompts: { + title: '意圖提示詞', + sectionDesc: '為不同查詢意圖配置專屬系統提示詞;未自定義時使用系統預設模板', + intentLabel: '意圖', + promptPlaceholder: '輸入自定義系統提示詞...', + customized: '已自定義', + empty: '暫無可用的意圖模板' + }, + placeholders: { + available: '可用變數:', + clickToInsert: '(點選插入)', + hint: '(點選插入,或輸入 {\'{{\'} 喚起列表)' + }, + questionSuggestions: { + navLabel: '問題推薦', + title: '對話問題推薦', + description: '統一配置開場問題與回答後的上下文追問;渠道可關閉展示,但不能改寫智慧體策略。', + startersTitle: '開場推薦', + followUpsTitle: '回答後推薦', + enableStarters: '展示開場問題', + enableStartersDesc: '在使用者首次提問前展示,可使用運營配置、知識庫或混合來源。', + enableFollowUps: '生成回答後推薦', + enableFollowUpsDesc: '每次完整回答結束後非同步生成,不阻塞主回答。啟用後會產生額外模型呼叫。', + sourceMode: '內容來源', + count: '展示數量', + curatedItems: '運營配置問題', + curatedItemsDesc: '用於開場推薦;混合模式下優先展示。', + addItem: '新增問題', + model: '生成模型', + modelDesc: '留空時使用本輪對話模型。', + advancedSettings: '高階生成設定', + displayRules: '展示與兜底規則', + contextTurns: '上下文輪數', + categories: '問題型別', + instruction: '附加生成要求', + instructionPlaceholder: '例如:優先推薦能幫助使用者落地執行的問題,避免寬泛問題或重複當前回答…', + suppressFallback: '兜底回答後不展示', + suppressQuestion: '回答本身以提問結尾時不展示', + knowledgeFallback: '模型生成失敗時使用知識庫候選', + allowRegenerate: '允許使用者換一批', + modeCurated: '運營配置', + modeKnowledge: '知識庫', + modeGenerated: '模型生成', + modeHybrid: '混合', + categoryClarify: '澄清', + categoryDeepen: '深入', + categoryAction: '下一步' + }, + navGroups: { + basic: '基礎', + knowledge: '知識檢索', + capability: '能力擴充套件', + integration: '釋出整合' + } + }, + agentStream: { + saveToKb: { + emptyContent: '當前回答為空,無法儲存到知識庫', + editorOpened: '已開啟編輯器,請選擇知識庫後儲存' + }, + copy: { + emptyContent: '當前回答為空,無法複製', + success: '已複製到剪貼簿', + failed: '複製失敗,請手動複製' + }, + toolStatus: { + calling: '正在呼叫 {name}...', + searchKb: '檢索知識庫', + searchKbFailed: '檢索知識庫失敗', + searchMixed: '檢索知識庫和網路', + searchMixedFailed: '檢索失敗', + webSearch: '網路搜尋', + webSearchFailed: '網路搜尋失敗', + grepSearch: '搜尋關鍵詞', + grepSearchFailed: '搜尋關鍵詞失敗', + getDocInfo: '獲取文件資訊', + getDocInfoFailed: '獲取文件資訊失敗', + viewDocument: '檢視文件', + thinkingDone: '完成思考', + thinkingFailed: '思考失敗', + updateTodos: '更新任務列表', + updateTodosFailed: '更新任務列表失敗', + imageAnalyzing: '正在檢視圖片內容...', + imageAnalysisDone: '已檢視圖片內容', + imageAnalysisFailed: '圖片內容檢視失敗', + attachmentParsing: '正在解析附件...', + attachmentParsingDone: '已解析附件', + attachmentParsingFailed: '附件解析失敗', + queryUnderstanding: '正在理解問題...', + queryUnderstandDone: '已完成問題理解', + called: '呼叫 {name}', + calledFailed: '呼叫 {name} 失敗' + }, + ragPipeline: { + searching: '正在檢索知識庫...', + searchingWithQuery: '正在檢索知識庫:「{query}」', + searchingWeb: '正在檢索網路...', + searchingWebWithQuery: '正在檢索網路:「{query}」', + searchingMixed: '正在檢索知識庫和網路...', + searchingMixedWithQuery: '正在檢索知識庫和網路:「{query}」', + searchDone: '檢索完成' + }, + attachmentParsing: { + parsedSummary: '已解析 {count} 個附件', + parsedWithSkipped: '已解析 {parsed} 個附件,{skipped} 個未完成已跳過', + noneReady: '沒有可用的已解析附件' + }, + knowledgeChunksList: { + chunkRange: '已載入 {fetched} / {total} 個分塊', + page: '第 {page} 頁,每頁 {pageSize} 個' + }, + grepResults: { + chunkHits: '{count} 片段', + keywordHits: '{count} 次', + titleMatch: '標題匹配', + faqEntry: 'FAQ 條目' + }, + search: { + noResults: '未找到匹配的內容', + candidatesBelowThreshold: '命中 {count} 條候選,相關性不足,未用於回答', + foundResultsFromFiles: '找到 {count} 個結果,來自 {files} 個檔案', + foundResults: '找到 {count} 個結果', + foundMixedResults: '找到 {count} 個結果({docCount} 篇文件,{webCount} 條網頁)', + webResults: '找到 {count} 條網頁', + grepSummary: '找到 {chunks} 個匹配片段,來自 {docs} 個文件' + }, + plan: { + inProgress: '進行中', + pending: '待處理', + completed: '已完成' + }, + toolSummary: { + getDocument: '獲取文件:{title}', + document: '文件', + listChunks: '檢視 {title}', + listFaqEntry: '檢視 FAQ:{question}', + deepThinking: '深度思考' + }, + citation: { + notFound: '未找到內容', + loadFailed: '載入失敗', + noKbForWiki: '無法識別關聯的知識庫,無法開啟 Wiki' + }, + tools: { + searchKnowledge: '知識庫檢索', + grepChunks: '搜尋關鍵詞', + webSearch: '網路搜尋', + webFetch: '網頁抓取', + getDocumentInfo: '獲取文件資訊', + listKnowledgeChunks: '檢視知識分塊', + getRelatedDocuments: '查詢相關文件', + getDocumentContent: '獲取文件內容', + wikiReadSourceDoc: '精讀源文件', + todoWrite: '計劃管理', + knowledgeGraphExtract: '知識圖譜抽取', + thinking: '思考', + attachmentParsing: '解析附件', + imageAnalysis: '檢視圖片內容', + queryUnderstand: '理解問題', + queryKnowledgeGraph: '知識圖譜查詢', + readSkill: '讀取技能', + executeSkillScript: '執行技能指令碼', + dataAnalysis: '資料分析', + dataSchema: '資料結構', + databaseQuery: '資料庫查詢' + }, + mcpOAuth: { + waiting: '等待授權 · {target}', + waitingStatus: '等待授權', + targetWithTool: '{service} › {tool}', + titleWithService: 'OAuth 授權 · {service}', + titleWithTool: 'OAuth 授權 · {service} › {tool}', + desc: '點選授權將開啟新視窗完成登入,授權成功後會自動繼續本次工具呼叫。', + authorize: '去授權', + skip: '跳過', + countdownShort: '{seconds}s', + authorizedTag: '已授權', + timedOutTag: '授權超時', + canceledTag: '已取消', + authorizedToast: '授權成功,正在繼續', + startFailed: '發起授權失敗', + resumeFailed: '還原執行失敗,請重試', + skipFailed: '跳過失敗,請重試' + }, + toolApproval: { + waiting: '等待稽核 · {target}', + waitingStatus: '等待稽核', + targetWithTool: '{service} › {tool}', + titleWithTarget: '人工稽核 · {service} › {tool}', + argsLabel: '呼叫引數', + argsModified: '已修改', + countdownShort: '{seconds}s', + approve: '透過並執行', + reject: '拒絕', + approvedTag: '已透過', + rejectedTag: '已拒絕', + invalidJson: '引數不是合法 JSON', + submitted: '已提交', + submitFailed: '提交失敗', + userRejected: '使用者拒絕' + } + }, + kbSettings: { + parser: { + title: '解析引擎', + description: '為不同檔案型別選擇文件解析引擎。未配置的檔案型別將使用內建解析引擎。', + loading: '載入中...', + noEngineAvailable: '暫無可用解析引擎,或文件解析服務未配置。', + default: '預設', + goConfig: '前往配置 →', + noEngine: '無可用引擎', + fileTypePdf: 'PDF 文件', + fileTypeWord: 'Word 文件', + fileTypePpt: '簡報', + fileTypeExcel: 'Excel 表格', + xlsxFirstRowAsHeader: '將首行作為列標題,並保留在每行上下文中', + fileTypeEbook: '電子書', + fileTypeWebArchive: '網頁歸檔', + fileTypeCsv: 'CSV 檔案', + fileTypeText: '純文字', + fileTypeJson: 'JSON 檔案', + fileTypeImage: '圖片', + fileTypeAudiovisual: '音訊', + engines: { + opendataloader: { + name: 'OpenDataLoader', + desc: 'OpenDataLoader PDF 解析引擎(版面分析,需 Java 11+ 與 opendataloader-pdf)' + }, + markitdown: { + name: 'MarkItDown', + desc: 'Microsoft MarkItDown 文件轉換工具(支援 PDF/Office/HTML 等)' + }, + weknoracloud: { + name: 'WeKnora Cloud', + desc: '使用 WeKnora Cloud 進行文件解析' + }, + paddleocr_vl_cloud: { + name: 'PaddleOCR-VL Cloud', + desc: 'PaddleOCR-VL 雲 API' + }, + paddleocr_vl: { + name: 'PaddleOCR-VL', + desc: 'PaddleOCR-VL 自部署服務' + }, + mineru_cloud: { + name: 'MinerU Cloud', + desc: 'MinerU Cloud API' + }, + mineru: { + name: 'MinerU', + desc: 'MinerU 自部署服務' + }, + simple: { + name: 'Simple', + desc: '簡單格式 & 圖片解析(無需外部服務)' + }, + builtin: { + name: '內建', + desc: 'DocReader 內建解析引擎(docx/pdf/xlsx 等複雜格式)' + } + } + }, + storage: { + title: '儲存引擎', + selectDescription: '選擇此知識庫繫結的具體儲存例項。', + defaultTag: '預設', + instanceLabel: '儲存例項', + instanceDesc: '同一種儲存型別可以配置多個不同 Endpoint、Bucket 或憑證的例項。', + migrateHint: '知識庫中已有檔案,需透過儲存遷移流程才能更換例項。', + manageInstances: '管理儲存例項', + localStorage: '本地儲存', + loading: '載入中...' + }, + vectorStore: { + title: '向量儲存', + description: '選擇此知識庫要寫入的向量儲存。繫結不可更改 — 如需將現有 KB 遷移到其他儲存,請建立新 KB 並重新索引。', + loading: '正在載入向量儲存列表...', + engineLabel: '向量儲存', + engineDesc: '從全域性向量儲存配置中選擇,或保持系統預設以使用空間的 RETRIEVE_DRIVER 引擎。', + boundLabel: '已繫結的向量儲存', + systemDefault: '系統預設', + immutableHint: '建立後不可更改。如需遷移,請建立一個繫結到目標儲存的新 KB 並重新索引。', + immutableEdit: '向量儲存繫結在建立後無法更改。', + unavailableHint: '繫結的向量儲存當前不可用,請在設定 → 向量儲存中檢查其連線配置。', + goGlobalSettings: '前往向量儲存設定' + } + }, + vectorStoreBadge: { + systemDefault: '系統預設', + sharedFromOrg: '來自其他組織的共享', + unknownStore: '未知儲存', + unavailable: '不可用' + }, + tools: { + multiKbSearch: '跨庫搜尋', + knowledgeSearch: '知識庫搜尋', + grepChunks: '搜尋關鍵詞', + getChunkDetail: '獲取片段詳情', + listKnowledgeChunks: '檢視知識分塊', + listKnowledgeBases: '列出知識庫', + getDocumentInfo: '獲取文件資訊', + queryKnowledgeGraph: '查詢知識圖譜', + think: '深度思考', + todoWrite: '制定計劃' + }, + commandPalette: { + placeholder: '搜尋知識庫、檔案、對話…', + clearRecent: '清除', + retrieval: '檢索引數', + untitledSession: '未命名對話', + hotkey: { + select: '選擇', + enter: '開啟', + cmdNumber: '直接開啟', + cmdEnter: '發起對話', + esc: '關閉' + }, + empty: { + noResults: '沒有找到匹配結果', + askAi: '直接向 AI 提問', + adjustRetrieval: '調整檢索引數' + }, + quick: { + newChat: '新建對話', + knowledgeBases: '開啟知識庫', + agents: '開啟智慧體', + organizations: '開啟共享空間', + settings: '開啟設定', + productTour: '新手引導' + }, + match: { + vector: '向量', + keyword: '關鍵字' + }, + group: { + chunks: '知識庫檔案', + messages: '對話訊息', + kbs: '知識庫', + agents: '智慧體', + sessionsByTitle: '對話(按標題)', + commands: '命令', + recent: '最近搜尋', + quickActions: '快捷操作' + }, + scope: { + placeholder: '在本知識庫中搜尋…', + remove: '移除範圍過濾(Backspace)' + } + }, + preview: { + tab: '預覽', + loading: '正在載入文件預覽...', + loadFailed: '載入文件預覽失敗', + retry: '重試', + unsupported: '該檔案型別暫不支援線上預覽', + unsupportedHint: '請下載檔案後使用本地應用檢視', + fullscreen: '全屏預覽', + exitFullscreen: '退出全屏', + audioLoading: '載入音訊中…', + audioNotSupported: '您的瀏覽器不支援音訊播放' + }, + organization: { + title: '共享空間', + subtitle: '建立或加入共享空間,讓多個空間互相協作,共享知識庫與智慧體', + createOrg: '建立共享空間', + joinOrg: '加入共享空間', + name: '共享空間名稱', + namePlaceholder: '請輸入共享空間名稱', + nameRequired: '請輸入共享空間名稱', + avatar: '共享空間頭像', + avatarClear: '清除', + avatarPickerHint: '選擇 Emoji 作為共享空間頭像', + description: '共享空間描述', + descriptionPlaceholder: '請輸入共享空間描述(選填)', + noDescription: '暫無描述', + memberCount: '成員數量', + owner: '建立者', + inviteCode: '邀請碼', + inviteCodePlaceholder: '請輸入邀請碼', + inviteCodeRequired: '請輸入邀請碼', + refreshInviteCode: '重新整理邀請碼', + inviteCodeRefreshed: '邀請碼已重新整理', + inviteCodeRefreshFailed: '重新整理邀請碼失敗', + leave: '退出共享空間', + leaveConfirmTitle: '退出共享空間', + leaveConfirmMessage: '確定要退出共享空間「{name}」嗎?退出後將無法訪問該共享空間共享的知識庫。', + leaveSuccess: '已退出共享空間', + leaveFailed: '退出共享空間失敗', + deleteConfirmTitle: '刪除共享空間', + deleteConfirmMessage: '確定要刪除共享空間「{name}」嗎?刪除後所有成員將被移除,此操作不可撤銷。', + deleteSuccess: '共享空間已刪除', + deleteFailed: '刪除共享空間失敗', + createSuccess: '共享空間建立成功', + createFailed: '建立共享空間失敗', + joinSuccess: '成功加入共享空間', + joinFailed: '加入共享空間失敗', + manageMembers: '成員管理', + noMembers: '暫無成員', + roleUpdated: '角色已更新', + roleUpdateFailed: '更新角色失敗', + memberRemoved: '成員已移除', + memberRemoveFailed: '移除成員失敗', + empty: '您還沒有加入任何共享空間', + emptyDesc: '建立一個共享空間或透過邀請碼加入現有共享空間', + createdByMe: '我建立的', + joinedByMe: '我加入的', + emptyCreated: '您還沒有建立任何共享空間', + emptyCreatedDesc: '點選「建立共享空間」建立一個新的共享空間', + emptyJoined: '您還沒有加入任何共享空間', + emptyJoinedDesc: '透過邀請碼加入現有共享空間', + share: { + title: '共享到共享空間', + selectOrg: '選擇共享空間', + selectOrgPlaceholder: '請選擇要共享的共享空間', + permission: '許可權', + permissionTip: '可編輯許可權允許成員修改知識庫內容,只讀許可權僅允許檢索和問答', + shareSuccess: '已共享', + shareFailed: '共享失敗', + unshareSuccess: '已取消共享', + unshareFailed: '取消共享失敗', + sharedTo: '已共享到', + noShares: '尚未共享到任何共享空間', + searchPlaceholder: '搜尋共享空間…', + loading: '載入中…', + emptySearch: '未找到匹配「{q}」的共享空間', + addShareDialogTitle: '共享到共享空間', + unshareAction: '取消共享', + sharedKnowledgeBase: '共享知識庫', + agentShareDesc: '將智慧體共享到共享空間,共享空間成員可使用該智慧體', + sharedFrom: '來自', + permissionReadonly: '只讀', + permissionEditable: '可編輯', + columns: { + space: '共享空間', + permission: '許可權', + sharedAt: '共享時間', + operations: '操作' + } + }, + addMember: { + button: '新增成員', + dialogTitle: '新增成員', + tipTenant: '共享空間的成員單位是空間:選定一個空間後,其下全部使用者都將獲得訪問許可權。下方搜尋結果按空間去重。', + searchTenant: '選擇空間', + searchTenantPlaceholder: '輸入空間名搜尋...', + searchTenantHint: '輸入至少 2 個字元開始搜尋,按空間去重並自動過濾已加入的空間', + selectRole: '分配角色', + confirmBtn: '新增', + success: '成員新增成功', + failed: '新增失敗' + }, + upgrade: { + requestUpgrade: '申請升級', + pending: '稽核中', + dialogTitle: '申請升級', + dialogDesc: '管理員稽核透過後更新您的角色。', + currentRole: '當前角色', + selectRole: '申請角色', + reason: '申請理由(選填)', + reasonPlaceholder: '請簡要說明申請更高許可權的原因...', + submitBtn: '提交申請', + submitSuccess: '許可權升級申請已提交,等待管理員稽核', + submitFailed: '提交申請失敗' + }, + editor: { + navBasic: '基本資訊', + navPermissions: '許可權說明', + navJoin: '加入共享空間', + basicTitle: '基本資訊', + basicDesc: '設定共享空間的名稱和描述,便於成員識別', + nameTip: '建議使用團隊或專案名稱,便於成員識別', + descriptionTip: '描述共享空間的用途和目標,幫助成員瞭解共享空間', + permissionsTitle: '成員許可權', + permissionsDesc: '瞭解共享空間中不同角色對知識庫與智慧體的許可權範圍', + permissionFeature: '許可權功能', + fullAccess: '完整許可權', + editAccess: '編輯許可權', + viewAccess: '只讀許可權', + adminPerm1: '管理共享空間設定、成員及知識庫與智慧體共享', + adminPerm2: '共享和管理知識庫與智慧體', + adminPerm3: '編輯共享知識庫內容', + adminPerm4: '檢視和檢索知識庫', + useSharedAgentsPerm: '使用共享智慧體', + shareKBPerm: '共享知識庫到共享空間', + editorPerm1: '編輯共享知識庫內容', + editorPerm2: '檢視和檢索知識庫', + editorPerm3: '管理共享空間設定和成員', + viewerPerm1: '檢視和檢索知識庫', + viewerPerm2: '編輯知識庫內容', + viewerPerm3: '管理共享空間設定', + ownerNote: '作為共享空間建立者,您將自動成為共享空間的管理員,擁有完整許可權。', + joinTitle: '加入共享空間', + joinDesc: '透過邀請碼加入現有共享空間,獲得知識庫與智慧體訪問許可權', + joinIllustration: '輸入共享空間管理員提供的邀請碼即可加入', + inviteCodeTip: '邀請碼由共享空間管理員生成,請向他們索取', + howToGetCode: '如何獲取邀請碼?', + step1: '聯絡您要加入的共享空間管理員', + step2: '請求他們分享共享空間邀請碼', + step3: '將邀請碼貼上到上方輸入框' + }, + navGroups: { + basic: '基礎', + management: '成員與協作', + resources: '共享資源' + }, + settings: { + editTitle: '共享空間設定', + membersDesc: '檢視和管理共享空間成員、調整成員角色。成員的最小單位是空間——加入後該空間下的所有使用者都將獲得訪問許可權。', + permissionsIconHint: '檢視各角色許可權說明', + sharedDesc: '檢視共享到此共享空間的所有知識庫', + noSharedKB: '暫無共享的知識庫', + noSharedKBTip: '知識庫擁有者可以在知識庫設定中將其共享到此共享空間', + sharedAgents: '共享智慧體', + noSharedAgents: '暫無共享的智慧體', + sharedAgentsDesc: '已共享到本共享空間的智慧體,成員可在對話中使用', + sharedAgentsKbHint: '智慧體繫結的知識庫僅在成員使用該智慧體對話時可 {\'@\'} 使用(只讀),不會出現在「知識庫列表」中。若需成員在列表中看到或編輯知識庫,請單獨將知識庫共享到本共享空間。', + sharedAgentsKbHintShort: '智慧體繫結知識僅對話內只讀;需在列表看到或編輯請單獨共享知識庫', + noSharedAgentsTip: '管理員可將智慧體從智慧體設定中共享到本共享空間', + sharePermissionLabel: '共享空間許可權', + myPermissionLabel: '生效許可權', + permissionCalcFormula: '共享空間許可權為共享時設定;生效許可權取共享空間許可權與你的共享空間角色中較低值', + permissionCalcTip: '生效許可權取共享空間許可權與你的共享空間角色中較低值;只讀成員對此庫最多隻讀。', + inviteMembers: '邀請成員', + inviteMembersDesc: '透過邀請碼或連結邀請他人加入共享空間', + inviteLink: '邀請連結', + inviteLinkValidity: '邀請連結有效期', + inviteLinkValidityDesc: '新生成的邀請連結的有效期,僅影響之後重新整理生成的連結', + validity1Day: '1 天', + validity7Days: '7 天', + validity30Days: '30 天', + validityNever: '永不過期', + remainingValidity: '剩餘 {n} 天', + remainingValidityNever: '永不過期', + remainingValidityExpired: '已過期', + removeShareFromOrg: '從共享空間中移除', + removeShareConfirm: '確定將「{name}」從本共享空間中移除?移除後共享空間成員將無法再訪問該知識庫。', + removeAgentShareConfirm: '確定將「{name}」從本共享空間中移除?移除後共享空間成員將無法再訪問該智慧體。', + removeShareSuccess: '已從共享空間中移除', + removeShareFailed: '移除失敗,請重試', + requireApproval: '需要稽核', + requireApprovalDesc: '開啟後,新成員加入需要管理員稽核', + searchable: '開放可被搜尋', + searchableDesc: '開啟後,共享空間將出現在「加入共享空間」的搜尋列表中,他人可搜尋並申請加入,無需邀請碼', + memberLimit: '成員數量上限', + memberLimitDesc: '超過上限後無法再新增新成員;設為 0 表示不限制', + memberLimitPlaceholder: '0 表示不限制', + memberLimitHint: '當前成員數:{count}', + joinRequests: '加入申請', + joinRequestsDesc: '稽核待加入共享空間的申請', + noPendingRequests: '暫無待稽核的申請', + pendingJoinRequestsBadge: '有待審批的加入申請', + pendingReview: '待審批', + assignRole: '分配角色', + approve: '透過', + reject: '拒絕', + approveSuccess: '已透過申請', + rejectSuccess: '已拒絕申請', + reviewFailed: '操作失敗,請重試' + }, + detail: { + removeMemberConfirm: '確定要移除成員「{name}」嗎?', + removeMember: '移除成員' + }, + role: { + admin: '管理員', + editor: '編輯', + viewer: '只讀' + }, + sharedResources: { + kbListTitle: '共享知識庫', + agentListTitle: '共享智慧體', + loading: '載入中…', + columns: { + name: '名稱', + sharedBy: '共享者', + sharedAt: '共享時間', + permission: '許可權' + } + }, + joinRequests: { + listTitle: '待稽核申請', + searchPlaceholder: '搜尋申請人…', + loading: '載入申請中…', + emptySearch: '未找到匹配「{q}」的申請', + typeJoin: '加入', + typeUpgrade: '升級', + rejectConfirm: '確認拒絕該申請?', + approveTitle: '透過申請', + approveDesc: '為「{name}」分配加入後的角色', + columns: { + applicant: '申請人', + type: '型別', + requestedRole: '申請角色', + message: '申請說明', + appliedAt: '申請時間' + } + }, + members: { + listTitle: '共享空間成員', + searchPlaceholder: '搜尋成員…', + loading: '載入成員中…', + emptySearch: '未找到匹配「{q}」的成員', + columns: { + member: '成員', + role: '角色', + joinedAt: '加入時間', + operations: '操作' + } + }, + invite: { + loading: '載入中...', + previewTitle: '加入共享空間', + inputDesc: '輸入邀請碼或貼上邀請連結中的邀請碼,檢視共享空間資訊後加入', + previewAction: '檢視', + primaryJoin: '加入', + invalidCode: '邀請碼無效或已過期', + previewFailed: '預覽失敗,請稍後重試', + knowledgeBases: '知識庫', + agents: '智慧體', + alreadyMember: '您已經是該共享空間的成員', + submitRequest: '申請加入', + requireApprovalTip: '該共享空間需要管理員稽核後才能加入', + approvalLabel: '加入方式', + needApproval: '需要稽核', + noApproval: '無需稽核', + defaultRoleAfterJoin: '加入後預設許可權:{role}', + requestRole: '申請角色', + selectRole: '選擇角色', + messagePlaceholder: '選填:申請說明(如自我介紹或加入原因)', + applicationNote: '申請說明(選填)', + joinSuccess: '成功加入共享空間!', + joinFailed: '加入失敗,請稍後重試', + requestSubmitted: '申請已提交,請等待管理員稽核', + requestFailed: '申請提交失敗,請稍後重試', + viewOrganization: '檢視共享空間' + }, + join: { + title: '加入共享空間', + joining: '正在加入共享空間...', + success: '成功加入共享空間!', + failed: '加入共享空間失敗', + noCode: '未找到邀請碼', + goToOrganizations: '前往共享空間列表', + confirmTitle: '確認加入共享空間', + confirm: '確認加入', + preview: '預覽並加入', + memberCount: '{count} 個成員', + shareCount: '{count} 個共享知識庫', + agentShareCount: '{count} 個智慧體', + alreadyMember: '您已經是該共享空間的成員', + invalidCode: '無效的邀請碼', + byInviteCode: '輸入邀請碼', + searchSpaces: '搜尋共享空間', + searchSpacesDesc: '瀏覽或搜尋已開放可被搜尋的共享空間,無需邀請碼即可加入', + searchSpacesPlaceholder: '按共享空間名稱、描述或 ID 搜尋', + spaceId: '共享空間ID', + noSearchResult: '未找到匹配的共享空間', + noSearchableSpaces: '暫無開放可被搜尋的共享空間,或輸入關鍵詞搜尋', + memberLimitReached: '成員已滿', + backToSearch: '返回搜尋' + }, + rbac: { + needTenantAdminTip: '此操作需要當前空間的 admin 或更高角色,請聯絡空間 Owner 調整許可權。', + cannotCreate: '當前空間角色不足,無法建立共享空間', + cannotJoin: '當前空間角色不足,無法加入或申請加入共享空間', + cannotManage: '當前空間角色不足,無法管理共享空間' + } + }, + promptTemplate: { + noTemplates: '暫無模板', + selectTemplate: '選擇模板', + useTemplate: '使用模板', + resetDefault: '還原預設', + default: '預設', + withKnowledgeBase: '知識庫', + withWebSearch: '網路搜尋' + }, + mcpServiceDialog: { + addTitle: '新增 MCP 服務', + editTitle: '編輯 MCP 服務', + basicSection: '基本資訊', + connectionSection: '連線配置', + enableServiceDesc: '關閉後該服務不會被呼叫', + testAfterSaveHint: '儲存後可測試連線', + unitSecond: '秒', + unitTimes: '次', + name: '服務名稱', + namePlaceholder: '請輸入服務名稱', + description: '描述', + descriptionPlaceholder: '請輸入服務描述', + transportType: '傳輸型別', + serviceUrl: '服務 URL', + serviceUrlPlaceholder: 'https://example.com/mcp', + enableService: '啟用服務', + authConfig: '認證配置', + authType: '認證方式', + authTypeNone: '無 / 自定義 Header', + authTypeApiKey: 'API Key / Token', + authTypeOAuth: 'OAuth 2.0(首次連線授權)', + oauthRefreshable: 'Token 已過期,將在下次使用時自動重新整理', + oauthAuthorizeHint: '點選「去授權」會先自動儲存當前配置,再發起授權(每個使用者獨立授權)。', + apiKeyHeader: '請求頭名稱', + apiKeyHeaderDesc: '留空預設 X-API-Key。Bearer 方式請填 Authorization,並在下方金鑰值中寫 “Bearer ”;需要裸 token 時填 Authorization 並直接填入 token。', + credentialValue: '金鑰值 / Token', + optional: '可選', + advancedConfig: '高階配置', + timeoutSec: '超時時間(秒)', + retryCount: '重試次數', + retryDelaySec: '重試延遲(秒)', + codeImport: { + toggle: '從程式碼匯入', + hint: '貼上標準 mcpServers JSON 配置,自動填充表單', + parse: '解析並填充', + editOverwriteHint: '匯入會覆蓋當前表單內容(不影響已儲存的憑證,需點儲存生效)', + toasts: { + filled: '已填充表單,請檢查後儲存', + multipleServers: '檢測到多個服務,已匯入第一個:{name}' + }, + errors: { + empty: '請先貼上配置內容', + invalidJson: '無法解析,請檢查 JSON 格式', + noServer: '未找到 MCP 服務配置', + missingUrl: '配置缺少 url', + stdioUnsupported: '暫不支援 stdio(command/args)配置,請使用帶 url 的遠端配置' + } + }, + customHeaders: { + label: '自定義請求頭(可選)', + desc: '附加到每次 MCP 請求的 HTTP 請求頭,常用於企業閘道器鑑權、鏈路追蹤等場景。', + add: '新增請求頭', + keyPlaceholder: 'Header 名稱', + valuePlaceholder: 'Header 值' + }, + toasts: { + created: 'MCP 服務已建立', + updated: 'MCP 服務已更新', + createFailed: '建立 MCP 服務失敗', + updateFailed: '更新 MCP 服務失敗', + oauthRequired: '該服務需要 OAuth 授權,已自動切換為 OAuth 2.0,請儲存後點選「去授權」。' + }, + rules: { + nameRequired: '請輸入服務名稱', + transportRequired: '請選擇傳輸型別', + urlRequired: '請輸入服務 URL', + urlInvalid: '請輸入有效的 URL' + } + }, + ollamaSettings: { + title: 'Ollama 配置', + description: '管理本地 Ollama 服務,檢視和下載模型', + toasts: { + connected: '連線成功', + connectFailed: '連線失敗,請檢查 Ollama 是否執行', + listFailed: '獲取模型列表失敗', + downloadFailed: '下載失敗,請稍後重試', + downloadStarted: '已開始下載模型 {name}', + downloadCompleted: '模型 {name} 下載完成', + progressFailed: '查詢下載進度失敗' + }, + installed: { + title: '已下載的模型', + desc: '已安裝在 Ollama 中的模型列表', + empty: '暫無已下載的模型' + }, + download: { + title: '下載新模型', + descPrefix: '輸入模型名稱下載,', + browse: '瀏覽 Ollama 模型庫', + placeholder: '如:qwen2.5:0.5b', + download: '下載', + downloading: '正在下載: {name}' + }, + address: { + label: '服務地址', + desc: '本地 Ollama 服務的 API 地址,由系統自動檢測。如需修改,請在 .env 配置檔案中設定', + placeholder: 'http://localhost:11434', + failed: '連線失敗,請檢查 Ollama 是否執行或服務地址是否正確' + }, + status: { + label: 'Ollama 服務狀態', + desc: '自動檢測本地 Ollama 服務是否可用。如果服務未執行或地址配置錯誤,將顯示"不可用"狀態', + testing: '檢測中', + available: '可用', + unavailable: '不可用', + untested: '未檢測', + retest: '重新檢測' + } + }, + modelSettings: { + title: '模型配置', + description: '管理不同型別的 AI 模型,支援 Ollama 本地模型和遠端 API', + copySuffix: ' 副本', + builtinTag: '內建', + confirmDelete: '確定刪除模型「{name}」嗎?', + debug: { + title: '模型測試', + description: '向已配置的模型傳送真實請求,檢視響應與耗時', + groupModel: '選擇模型', + groupInput: '測試輸入', + groupResult: '執行結果', + modelType: '模型型別', + model: '模型', + modelPlaceholder: '請選擇要測試的模型', + noModelsForType: '當前型別暫無已新增模型', + query: '輸入內容', + queryPlaceholder: '輸入要傳送給模型的內容', + embeddingInput: '待向量化文字', + embeddingPlaceholder: '輸入要生成 Embedding 的文字', + vlmPrompt: '圖片提示詞', + vlmPromptPlaceholder: '例如:請詳細描述這張圖片', + documents: '候選文件', + documentsPlaceholder: '每行輸入一個候選文件', + documentsHint: '每個非空行會作為一個獨立文件傳送給 ReRank 模型', + imageFile: '圖片檔案', + audioFile: '音訊檔案', + chooseFile: '選擇檔案', + parameters: '請求引數', + thinking: '思考模式', + thinkingDesc: '僅對支援思考模式的模型生效', + systemPrompt: 'System Prompt', + systemPromptPlaceholder: '可選,輸入系統提示詞', + run: '執行測試', + copyResult: '複製結果', + history: '歷史記錄', + thinkOn: '思考開啟', + thinkOff: '思考關閉', + runLabel: '第 {n} 次執行', + success: '呼叫成功', + failed: '呼叫失敗', + rawResponse: '響應內容', + requestPreview: '請求預覽', + requestFailed: '模型測試請求失敗', + metrics: { + dimension: '向量維度', + resultCount: '結果數量', + answerChars: '回答字元數', + reasoningChars: '推理字元數', + reasoningReturned: '返回推理內容', + textChars: '轉寫字元數', + segmentCount: '分段數量' + } + }, + builtinModels: { + title: '內建模型', + description: '內建模型對所有空間可見,敏感資訊會被隱藏,且不可編輯或刪除。', + descriptionAdmin: '內建模型對所有空間可見。系統管理員可編輯配置和憑證;刪除仍由部署配置管理。', + viewGuide: '檢視內建模型管理指南' + }, + toasts: { + nameRequired: '模型名稱不能為空', + nameTooLong: '模型名稱不能超過100個字元', + displayNameTooLong: '顯示名稱不能超過100個字元', + baseUrlRequired: 'Remote API 型別必須填寫 Base URL', + baseUrlInvalid: 'Base URL 格式不正確,請輸入有效的 URL', + dimensionInvalid: 'Embedding 模型必須填寫有效的向量維度(128-4096)', + updated: '模型已更新', + added: '模型已新增', + saveFailed: '儲存模型失敗', + deleted: '模型已刪除', + deleteFailed: '刪除模型失敗', + builtinCannotEdit: '內建模型不能編輯', + builtinCannotDelete: '內建模型不能刪除', + builtinCannotCopy: '內建模型不能複製', + copied: '模型已複製', + copyFailed: '複製模型失敗' + }, + asr: { + title: 'ASR 語音模型', + desc: '配置用於語音識別和音訊轉錄的語音轉文字模型(如 OpenAI Whisper)', + empty: '暫無 ASR 語音模型' + }, + vllm: { + title: 'VLLM 視覺模型', + desc: '配置用於視覺理解和多模態的視覺語言模型', + empty: '暫無 VLLM 視覺模型' + }, + rerank: { + title: 'ReRank 模型', + desc: '配置用於結果重排序的模型', + empty: '暫無 ReRank 模型' + }, + embedding: { + title: 'Embedding 模型', + desc: '配置用於文字向量化的嵌入模型', + empty: '暫無 Embedding 模型' + }, + chat: { + title: '對話模型', + desc: '配置用於對話的大語言模型', + empty: '暫無對話模型' + }, + source: { + remote: 'Remote', + openaiCompatible: 'OpenAI相容', + custom: '自定義' + }, + actions: { + addModel: '新增模型', + debugModel: '模型測試' + }, + typeShort: { + chat: '對話', + embedding: 'Embedding', + rerank: 'ReRank', + vllm: '視覺', + asr: '語音' + } + }, + mcpSettings: { + title: 'MCP 服務管理', + description: '管理外部 MCP (Model Context Protocol) 服務,在 Agent 模式下呼叫外部工具和資源', + enabled: '已啟用', + disabled: '已禁用', + configuredServices: '已配置的服務', + manageAndTest: '管理和測試 MCP 服務連線', + addService: '新增服務', + empty: '暫無 MCP 服務', + deleteConfirmBody: '確定要刪除 MCP 服務"{name}"嗎?此操作無法撤銷。', + unnamed: '未命名', + builtin: '內建', + toasts: { + loadFailed: '載入 MCP 服務列表失敗', + enabled: '已啟用 MCP 服務', + disabled: '已禁用 MCP 服務', + updateStateFailed: '更新 MCP 服務狀態失敗', + testing: '正在測試 {name}...', + noResponse: '測試失敗:未收到伺服器響應', + testFailed: '測試 MCP 服務失敗', + deleted: 'MCP 服務已刪除', + deleteFailed: '刪除 MCP 服務失敗' + }, + actions: { + test: '測試連線' + } + }, + conversationSettings: { + maxTokens: { + desc: '生成回答的最大Token數量' + }, + temperature: { + desc: '控制模型輸出的隨機性,0最確定,1最隨機' + }, + systemPrompt: { + desc: '用於普通模式對話的系統級Prompt' + }, + contextTemplate: { + desc: '用於普通模式下基於檢索結果生成回答的Prompt模板' + }, + rerankModel: { + desc: '用於搜尋結果重排序的模型(可選)' + }, + chatModel: { + desc: '用於總結和摘要的大語言模型' + }, + rewritePrompt: { + desc: '控制問題改寫的系統提示詞' + }, + fallbackPrompt: { + desc: '當選擇模型兜底時使用的提示模板' + }, + fallbackResponse: { + desc: '當兜底策略為固定回覆時返回的文字' + }, + fallbackStrategy: { + desc: '檢索無結果時採用的處理方式' + }, + enableQueryExpansion: { + desc: '召回不足時呼叫大模型生成擴充套件查詢(增加時延與成本)' + }, + enableRewrite: { + desc: '多輪對話自動改寫問題以獲得更優召回' + }, + rerankThreshold: { + desc: '重排序階段的最低得分閾值' + }, + rerankTopK: { + desc: '重排序後進入答案生成的文件數量' + }, + vectorThreshold: { + desc: '向量召回的最低相似度閾值' + }, + keywordThreshold: { + desc: '關鍵詞檢索的最低得分閾值' + }, + embeddingTopK: { + desc: '向量召回階段保留的文件數量' + }, + maxRounds: { + desc: '用於多輪上下文和問題改寫的歷史輪數' + }, + models: { + chatGroupLabel: '思考 / 對話模型' + } + }, + agentSettings: { + systemPrompt: { + desc: '配置 Agent 的系統提示詞,支援佔位符模板。佔位符會在執行時自動替換為實際內容。' + }, + allowedTools: { + desc: '當前 Agent 可使用的工具列表' + }, + temperature: { + desc: '控制模型輸出的隨機性,0 最確定,1 最隨機' + }, + rerankModel: { + desc: '搜尋結果重排序,統一不同來源的相關度分數' + }, + thinkingModel: { + desc: '用於 Agent 推理和規劃的 LLM 模型' + }, + maxIterations: { + desc: 'Agent 執行任務時的最大推理步驟數' + }, + modelRecommendation: { + title: '模型推薦' + } + }, + upload: { + uploadDocument: '上傳文件', + uploadFolder: '上傳資料夾', + onlineEdit: '線上編輯', + deleteRecord: '刪除記錄' + }, + time: { + today: '今天', + yesterday: '昨天', + last7Days: '近7天', + last30Days: '近30天', + lastYear: '近1年', + earlier: '更早', + pinned: '已置頂' + }, + platform: { + subtitle: '大模型驅動的企業級知識框架', + description: 'RAG 檢索、智慧體推理、Wiki 知識庫,讓文件真正被理解和運用', + rag: 'RAG 增強生成', + agent: 'ReAct 智慧體', + wiki: 'Wiki 知識庫', + hybridSearch: '混合檢索', + multimodalParsing: '多模態文件解析', + hybridSearchEngine: '混合檢索 + 知識圖譜', + ragQandA: 'ReAct 智慧體問答', + independentTenant: '獨立空間', + fullApiAccess: '完整 API 訪問', + knowledgeBaseManagement: '知識庫管理', + carousel: { + agenticRagTitle: 'Agentic RAG', + agenticRagDesc: 'ReAct 推理 + 工具呼叫 + 多步思考', + hybridSearchTitle: '混合檢索策略', + hybridSearchDesc: 'BM25 + 向量 + 知識圖譜', + wikiTitle: 'Wiki 知識庫', + wikiDesc: '文件蒸餾為結構化互聯知識', + smartDocRetrievalTitle: '智慧文件檢索', + smartDocRetrievalDesc: 'PDF/Word/圖片多格式解析' + } + }, + font: { + uiFont: '介面字型', + uiFontDescription: '用於選單、正文、按鈕等介面大部分文字的字型', + monoFont: '程式碼字型', + monoFontDescription: '用於程式碼塊、終端命令、API 金鑰、檔案路徑等技術內容,每個字元等寬顯示,避免 0/O、1/l 混淆', + selectFont: '選擇字型', + sansPreview: '示例 Sample 字型 Font — Aa Gg Oo 0123', + monoPreview: 'const msg = \'Hello\'; // 0O1l', + fontSize: '字型大小', + fontSizeDescription: '整體縮放介面(文字、圖示、間距等),切換後立即生效', + size: { + small: '小', + normal: '正常', + large: '大' + }, + mono: { + system: '系統預設', + menlo: 'Menlo', + monaco: 'Monaco', + consolas: 'Consolas', + cascadia: 'Cascadia Code', + 'dejavu-mono': 'DejaVu Sans Mono', + 'liberation-mono': 'Liberation Mono', + monospace: '通用等寬' + }, + sans: { + system: '系統預設', + pingfang: '蘋方 PingFang SC', + georgia: 'Georgia 襯線', + yahei: '微軟雅黑 Microsoft YaHei', + times: 'Times New Roman 襯線', + 'noto-cjk': 'Noto Sans CJK', + 'dejavu-serif': 'DejaVu Serif 襯線', + 'sans-serif': '通用無襯線' + } + }, + theme: { + theme: '主題模式', + themeDescription: '選擇介面的顯示主題,支援跟隨系統自動切換', + light: '淺色', + dark: '深色', + system: '跟隨系統', + selectTheme: '選擇主題' + }, + general: { + title: '常規設定', + allSettings: '全部設定', + personalSettings: '個人設定', + helpAndDocs: '幫助與文件', + description: '配置語言、外觀等基礎選項', + settings: '設定', + close: '關閉設定' + }, + language: { + zhCN: '簡體中文', + enUS: 'English', + ruRU: 'Русский', + koKR: '한국어', + selectLanguage: '選擇語言', + language: '語言', + languageDescription: '選擇介面顯示語言', + languageSaved: '語言設定已儲存' + }, + model: { + modelName: '模型名稱', + defaultTag: '預設', + addModelInSettings: '前往全域性設定新增模型', + loadFailed: '載入模型列表失敗', + selectModelPlaceholder: '請選擇模型', + searchPlaceholder: '搜尋模型...', + builtinTag: '內建', + editor: { + addTitle: '新增模型', + editTitle: '編輯模型', + sectionType: '模型型別', + typeLabel: '模型型別', + sectionSource: '模型來源', + sectionProvider: '接入配置', + sectionAdvanced: '高階選項', + sourceLabel: '模型來源', + sourceLocal: 'Ollama', + sourceRemote: 'API', + baseUrlLabel: 'Base URL', + displayNameLabel: '顯示名稱(可選)', + displayNamePlaceholder: '例如:客服問答模型', + displayNameDesc: '僅用於介面展示,實際呼叫仍使用上面的模型名稱。', + baseUrlPlaceholder: '例如:https://api.openai.com/v1', + baseUrlPlaceholderVllm: '例如:http://localhost:11434/v1', + baseUrlPlaceholderAsr: '例如:https://api.openai.com/v1', + apiKeyOptional: 'API Key(可選)', + apiKeyPlaceholder: '輸入 API Key', + customHeadersLabel: '自定義請求頭(可選)', + customHeadersDesc: '呼叫遠端模型 API 時附加的 HTTP 請求頭,常用於企業閘道器鑑權、鏈路追蹤等場景;Authorization、Content-Type 等保留頭會被自動忽略。', + customHeadersAdd: '新增請求頭', + customHeadersKeyPlaceholder: 'Header 名稱', + customHeadersValuePlaceholder: 'Header 值', + testing: '測試中...', + testConnection: '測試連線', + downloadLabel: '下載: {keyword}', + refreshList: '重新整理列表', + dimensionLabel: '向量維度', + dimensionPlaceholder: '例如:1536', + checkDimension: '檢測維度', + dimensionDetected: '檢測成功,向量維度:{value}', + dimensionFailed: '檢測失敗,請手動輸入維度', + remoteDimensionDetected: '檢測到向量維度:{value}', + dimensionOverrideLabel: '自定義輸出維度', + dimensionOverrideDesc: '僅在確認該模型支援 dimensions 引數時開啟;預設只使用檢測到的實際維度。', + supportsVisionLabel: '支援視覺/多模態', + supportsVisionDesc: '模型是否支援圖片等多模態輸入', + maxConcurrencyLabel: '後臺併發上限', + maxConcurrencyPlaceholder: '0 表示使用全域性預設', + maxConcurrencyDesc: '限制文件入庫/富化等後臺任務對該模型的併發呼叫數(按模型全副本共享)。0 或留空表示沿用全域性預設;不影響互動式對話。', + thinkingControlLabel: '思考模式引數格式', + thinkingControlDesc: '決定智慧體「思考模式」開/關時如何寫入 API。已嘗試按廠商/模型預選,若與實際情況不符請按 API 文件手動修改;選「不寫入」時,智慧體「思考模式」開關不生效。', + dimensionHint: '模型已選擇,點選"檢測維度"按鈕自動獲取向量維度', + loadModelListFailed: '載入模型列表失敗', + listRefreshed: '列表已重新整理', + fillModelAndUrl: '請先填寫模型標識和 Base URL', + remoteBaseUrlRequired: 'Remote API 型別必須填寫 Base URL', + unsupportedModelType: '不支援的模型型別', + connectionSuccess: '連線成功', + connectionFailed: '連線失敗', + connectionConfigError: '連線失敗,請檢查配置', + downloadStarted: '開始下載 {name}', + downloadCompleted: '{name} 下載完成', + downloadFailed: '{name} 下載失敗', + downloadStartFailed: '啟動下載失敗', + ollamaUnavailable: 'Ollama服務不可用,無法選擇本地模型', + ollamaNotSupportRerank: 'Ollama 不支援 ReRank 模型,請使用遠端介面配置', + goToOllamaSettings: '檢視設定', + providerLabel: '服務商', + providerPlaceholder: '選擇模型服務商', + providers: { + novita: { + label: 'Novita AI', + description: 'moonshotai/kimi-k2.5, zai-org/glm-5, minimax/minimax-m2.7, qwen/qwen3-embedding-0.6b 等' + }, + nvidia: { + label: 'NVIDIA', + description: 'deepseek-ai-deepseek-v3_1, nv-embed-v1, rerank-qa-mistral-4b, etc.' + }, + lkeap: { + label: '騰訊雲 LKEAP', + description: 'DeepSeek-R1、DeepSeek-V3、lke-reranker-base 等' + }, + longcat: { + label: 'LongCat AI', + description: 'LongCat-Flash-Chat, LongCat-Flash-Thinking, etc.' + }, + qianfan: { + label: '百度千帆 Baidu Cloud', + description: 'ernie-5.0-thinking-preview, embedding-v1, bce-reranker-base, etc.' + }, + moonshot: { + label: '月之暗面 Moonshot', + description: 'kimi-k2-turbo-preview, moonshot-v1-8k-vision-preview, etc.' + }, + qiniu: { + label: '七牛雲 Qiniu', + description: 'deepseek/deepseek-v3.2-251201, z-ai/glm-4.7, etc.' + }, + modelscope: { + label: '魔搭 ModelScope', + description: 'Qwen/Qwen3-8B, Qwen/Qwen3-Embedding-8B, etc.' + }, + gpustack: { + label: 'GPUStack', + description: 'Choose your deployed model on GPUStack' + }, + gemini: { + label: 'Google Gemini', + description: 'gemini-3-flash-preview, gemini-2.5-pro 等' + }, + mimo: { + label: '小米 MiMo', + description: 'mimo-v2-flash' + }, + minimax: { + label: 'MiniMax', + description: 'MiniMax-M3, MiniMax-M2.7, MiniMax-M2.7-highspeed 等' + }, + hunyuan: { + label: '騰訊混元 Hunyuan', + description: 'hunyuan-pro, hunyuan-standard, hunyuan-embedding, etc.' + }, + deepseek: { + label: 'DeepSeek', + description: 'deepseek-chat, deepseek-reasoner 等' + }, + volcengine: { + label: '火山引擎 Volcengine', + description: 'doubao-1-5-pro-32k-250115, doubao-embedding-vision-250615, etc.' + }, + jina: { + label: 'Jina', + description: 'jina-clip-v1, jina-embeddings-v2-base-zh, etc.' + }, + siliconflow: { + label: '矽基流動 SiliconFlow', + description: 'deepseek-ai/DeepSeek-V3.1, etc.' + }, + generic: { + label: '自定義 (OpenAI相容介面)', + description: 'Generic API endpoint (OpenAI-compatible)' + }, + requesty: { + label: 'Requesty', + description: 'openai/gpt-4o-mini, anthropic/claude-sonnet-4-5, etc.' + }, + openrouter: { + label: 'OpenRouter', + description: 'openai/gpt-5.2-chat, google/gemini-3-flash-preview, etc.' + }, + zhipu: { + label: '智譜 BigModel', + description: 'glm-4.7, embedding-3, rerank, etc.' + }, + aliyun: { + label: '阿里雲 DashScope', + description: 'qwen-plus, tongyi-embedding-vision-plus, qwen3-rerank, etc.' + }, + azure_openai: { + label: 'Azure OpenAI', + description: 'Microsoft Azure 上的 OpenAI 服務' + }, + anthropic: { + label: 'Anthropic', + description: 'Claude models via native Anthropic Messages API' + }, + openai: { + label: 'OpenAI', + description: 'gpt-5.2, gpt-5-mini, etc.' + } + }, + validation: { + modelNameRequired: '請輸入模型名稱', + modelNameEmpty: '模型名稱不能為空', + modelNameMax: '模型名稱不能超過100個字元', + baseUrlRequired: '請輸入 Base URL', + baseUrlEmpty: 'Base URL 不能為空', + baseUrlInvalid: 'Base URL 格式不正確,請輸入有效的 URL' + }, + thinkingControl: { + thinkingType: { + label: 'thinking.type', + hint: '火山引擎 Ark;騰訊雲 LKEAP(DeepSeek V3 等,選 LKEAP 時預設此項;R1 請改「不寫入」)' + }, + enableThinking: { + label: 'enable_thinking', + hint: '阿里雲 DashScope:qwen3、qwen-plus、qwen-max、qwen-turbo' + }, + chatTemplateKwargs: { + label: 'chat_template_kwargs', + hint: '自定義 OpenAI 相容、NVIDIA NIM、vLLM / 本地 Qwen 部署' + }, + none: { + label: '不寫入思考引數', + hint: '智慧體「思考模式」開關不生效,不會在請求中寫入思考相關引數' + } + }, + volcengine: { + accessKeyLabel: 'Access Key ID', + accessKeyPlaceholder: '火山引擎訪問金鑰 Access Key ID', + secretKeyLabel: 'Secret Access Key', + secretKeyPlaceholder: '火山引擎訪問金鑰 Secret Access Key', + rerankCredentialHint: 'Rerank 使用 VikingDB AK/SK 簽名(非方舟 API Key),模型建議填寫 doubao-seed-rerank。' + }, + lkeap: { + secretIdLabel: 'SecretId', + secretIdPlaceholder: '騰訊雲 API 金鑰 SecretId', + secretKeyLabel: 'SecretKey', + secretKeyPlaceholder: '騰訊雲 API 金鑰 SecretKey', + regionLabel: '地域', + regionPlaceholder: 'ap-guangzhou', + regionDesc: 'RunRerank 支援 ap-beijing、ap-guangzhou 等,預設 ap-guangzhou', + rerankCredentialHint: 'Rerank 使用騰訊雲 API 簽名(非 OpenAI API Key)。請在雲 API 金鑰控制檯建立 SecretId/SecretKey。' + }, + modelNamePlaceholder: { + local: '例如:llama2:latest', + remote: '例如:gpt-4, claude-3-opus', + localVllm: '例如:llava:latest', + remoteVllm: '例如:gpt-4-vision-preview', + remoteAsr: '例如:whisper-1' + }, + description: { + chat: '配置用於對話的大語言模型', + embedding: '配置用於文字向量化的嵌入模型', + rerank: '配置用於結果重排序的模型', + vllm: '配置用於視覺理解和多模態的視覺語言模型', + asr: '配置用於語音識別和音訊轉錄的語音轉文字模型', + default: '配置模型資訊' + } + } + }, + error: { + networkError: '網路錯誤,請檢查您的網路連線', + invalidCredentials: '使用者名稱或密碼錯誤', + tokenRefreshFailed: 'Token重新整理失敗', + pleaseRelogin: '請重新登入', + fileSizeExceeded: '檔案大小不能超過 {size}M!', + unsupportedFileType: '不支援的檔案型別!', + invalidFileType: '檔案型別錯誤!', + invalidImageLink: '無效的圖片連結', + missingKbId: '缺少知識庫ID', + tokenNotFound: '未找到登入權杖,請重新登入', + streamFailed: '流式連線失敗', + initialization: { + checkFailed: '檢查失敗', + testFailed: '測試失敗' + }, + tenant: { + listFailed: '獲取空間列表失敗', + searchFailed: '搜尋空間失敗', + getApiPrincipalConfigFailed: '獲取 API 使用者身份配置失敗', + updateApiPrincipalConfigFailed: '更新 API 使用者身份配置失敗', + createApiPrincipalTestTokenFailed: '生成 API 測試 Token 失敗', + updateFailed: '更新空間資訊失敗', + deleteFailed: '刪除空間失敗' + }, + model: { + createFailed: '建立模型失敗', + getFailed: '獲取模型失敗', + updateFailed: '更新模型失敗', + deleteFailed: '刪除模型失敗' + }, + auth: { + loginFailed: '登入失敗', + registerFailed: '註冊失敗', + getUserFailed: '獲取使用者資訊失敗', + getTenantFailed: '獲取空間資訊失敗', + updatePreferencesFailed: '更新個性化設定失敗', + refreshTokenFailed: '重新整理Token失敗', + logoutFailed: '登出失敗', + validateTokenFailed: 'Token驗證失敗' + } + }, + mcp: { + testResult: { + title: '測試結果: {name}', + connectionSuccess: '連線成功', + connectionFailed: '連線失敗', + toolsTitle: '可用工具', + resourcesTitle: '可用資源', + descriptionLabel: '描述', + schemaLabel: '引數結構', + emptyDescription: '該服務未提供工具或資源', + requireApproval: '需人工稽核', + requireApprovalTip: '開啟後,Agent 呼叫該工具前會暫停並等待確認,適用於可能改庫/刪檔案等高危操作', + approvalSaveFailed: '儲存稽核設定失敗' + } + }, + system: { + title: '系統資訊', + sectionDescription: '檢視系統版本資訊和使用者帳號配置', + loadingInfo: '正在載入資訊...', + retry: '重試', + versionLabel: '應用版本', + versionDescription: '當前應用服務(weknora-app)的版本號', + frontendVersionLabel: 'UI 版本', + frontendVersionDescription: '當前 UI 介面(weknora-ui)的構建版本號', + versionMismatch: '與應用版本不一致', + buildTimeLabel: '構建時間', + buildTimeDescription: '系統構建的時間', + goVersionLabel: 'Go 版本', + goVersionDescription: '後端使用的 Go 語言版本', + startedAtLabel: '服務啟動時間', + startedAtDescription: '當前後端程序最近一次啟動的時刻', + uptimeLabel: '執行時長', + uptimeDescription: '自本次啟動以來的連續執行時間', + uptimeDays: '{n} 天', + uptimeHours: '{n} 小時', + uptimeMinutes: '{n} 分鐘', + uptimeSeconds: '{n} 秒', + dbVersionLabel: '資料庫版本', + dbVersionDescription: '當前資料庫遷移版本號', + dbMigrationFailedTag: '遷移失敗', + dbMigrationFailedTitle: '資料庫遷移失敗', + dbMigrationFailedDesc: '啟動時資料庫遷移未成功完成,部分表或索引可能未建立,會導致 Wiki、知識圖譜等功能異常。建議先檢視排查文件自助修復;如仍無法解決,請透過下方連結反饋。', + dbMigrationViewDocs: '檢視排查文件', + dbMigrationReportIssue: '無法修復?提交 Issue', + keywordIndexEngineLabel: '關鍵詞索引引擎', + keywordIndexEngineDescription: '當前使用的關鍵詞索引引擎', + vectorStoreEngineLabel: '向量儲存引擎', + vectorStoreEngineDescription: '當前使用的向量儲存引擎', + graphDatabaseEngineLabel: '圖資料庫引擎', + graphDatabaseEngineDescription: '當前使用的圖資料庫引擎', + unknown: '未知', + globalSettings: { + title: '系統設定', + description: '平臺級執行時配置,儲存後立即對所有空間生效。僅系統管理員可見可改。', + loading: '載入中...', + empty: '暫無可配置的系統設定', + saving: '儲存中', + saved: '已儲存', + saveAnnouncement: '{label} 已儲存', + badgeRequiresRestart: '需重啟', + badgeSecret: '敏感', + badgeHighRisk: '高風險', + badgeOverride: '已覆蓋', + badgeOverrideTooltip: '該值已由管理員儲存到資料庫,覆蓋了環境變數與預設值', + modifiedAt: '上次修改:{value}', + tagInputPlaceholder: '回車新增條目,例:example.com / *.foo.com / 10.0.0.0/8', + audit: { + tabLabel: '審計日誌', + description: '記錄平臺級操作:系統設定變更、系統管理員授予/回收、配額批次同步等。按時間倒序展示。', + refresh: '重新整理', + retry: '重試', + loading: '載入中...', + end: '已經到底了。', + empty: '暫無平臺級審計事件。', + forbidden: '無權檢視平臺審計日誌。', + systemActor: '系統', + drawer: { + sectionSummary: '事件概要', + sectionIdentifiers: '關聯標識', + sectionRequest: '請求資訊', + targetChange: '變更內容', + requestMethod: '請求方法' + }, + expanded: { + actorId: '操作人 ID', + targetUserId: '目標使用者 ID', + targetType: '目標型別', + targetId: '目標 ID', + details: '原始詳情' + }, + target: { + bulkQuota: '批次同步:預設儲存配額', + bulkQuotaDiff: '應用到 {count} 個空間({gb} GB)', + promoteIdempotent: '目標已是系統管理員(冪等)', + revokeNoop: '目標本就不是系統管理員(冪等)', + requiredRole: '需要角色:{role}', + valueNull: '(空)' + }, + outcome: { + success: '成功', + denied: '拒絕' + }, + action: { + 'system.setting_changed': '系統設定變更', + 'system.admin_promoted': '授予系統管理員', + 'system.api_key_created': '建立平臺 API Key', + 'system.api_key_revoked': '吊銷平臺 API Key', + 'system.admin_revoked': '回收系統管理員', + 'system.user_password_reset': '重置使用者密碼', + 'system.queue_task_retried': '重新執行失敗任務', + 'system.queue_task_deleted': '清除失敗任務記錄', + 'system.queue_task_run_now': '立即執行佇列任務', + 'system.queue_task_cancelled': '終止佇列任務', + 'system.queue_archived_purged': '清除全部失敗任務' + }, + columns: { + time: '時間', + actor: '操作人', + action: '事件', + target: '目標', + path: '請求', + outcome: '結果' + }, + actorRole: { + system_admin: '系統管理員' + }, + errors: { + generic: '載入審計日誌失敗' + } + }, + bulkApply: { + label: '應用到所有現有空間', + tooltip: '儲存的值預設只對之後新建的空間生效;點選此按鈕將當前值同步寫入所有現有空間。', + confirmBtn: '確認應用', + confirmBody: '將把所有現有空間的儲存配額覆蓋為 {value} GB。如有空間被運維單獨調整過的配額,也會一併被覆蓋。是否繼續?', + success: '已將 {count} 個空間的儲存配額更新為 {gb} GB', + failed: '應用到所有空間失敗' + }, + passwordReset: { + label: '重置使用者密碼', + description: '為忘記密碼的其他使用者設定新密碼。重置成功後,該使用者當前所有登入會話都會失效,需要使用新密碼重新登入。', + action: '重置密碼', + dialogTitle: '重置其他使用者的密碼', + warning: '這是高風險操作。請核對使用者信箱;出於安全考慮,不能在這裡重置自己的密碼。', + emailLabel: '使用者信箱', + emailPlaceholder: '輸入需要重置密碼的使用者信箱', + newPasswordLabel: '新密碼', + newPasswordPlaceholder: '8-32 個字元,包含字母和數字', + confirmPasswordLabel: '確認新密碼', + confirmPasswordPlaceholder: '再次輸入新密碼', + confirmBtn: '確認重置', + success: '密碼已重置,該使用者的現有會話已失效', + failed: '重置密碼失敗', + validation: { + emailRequired: '請輸入使用者信箱', + emailInvalid: '請輸入有效的信箱地址', + passwordRequired: '請輸入新密碼', + passwordLength: '密碼長度必須為 8-32 個字元', + passwordLetter: '密碼必須包含字母', + passwordNumber: '密碼必須包含數字', + confirmRequired: '請再次輸入新密碼', + passwordMismatch: '兩次輸入的密碼不一致' + } + }, + admins: { + label: '系統管理員', + description: '擁有平臺級許可權的使用者。在右側輸入信箱並回車即可提升使用者為管理員;點選 × 即為撤銷其許可權。當前你(自己)已是管理員,不在列表中顯示,也無法被自己撤銷。', + placeholder: '輸入使用者信箱並回車', + loadFailed: '載入系統管理員失敗', + saveSuccess: '已更新系統管理員', + saveFailed: '更新系統管理員失敗', + confirm: { + revoke: { + header: '撤銷系統管理員', + body: '確認撤銷 {email} 的系統管理員許可權?撤銷後該使用者將無法再訪問任何系統級功能。', + confirmBtn: '確認撤銷' + }, + promote: { + header: '提升為系統管理員', + body: '確認將 {email} 提升為系統管理員?該使用者將獲得平臺級許可權,可訪問所有空間、修改系統設定、管理其他管理員。', + confirmBtn: '確認提升' + } + } + }, + reset: { + label: '重置', + tooltip: '清除當前 UI 覆蓋,還原使用環境變數或內建預設值', + confirmBtn: '確認重置', + confirmBody: '確定要重置「{label}」嗎?該操作會刪除資料庫中的覆蓋值,回退到環境變數或內建預設值。', + success: '已重置為預設值', + failed: '重置失敗' + }, + messages: { + loadFailed: '載入系統設定失敗', + saveSuccess: '已儲存', + saveFailed: '儲存失敗' + }, + listConfirm: { + ssrf: { + whitelist: { + remove: { + header: '移除 SSRF 白名單條目', + body: '確認從 SSRF 白名單中移除 {entry}?移除後該條目將重新受 SSRF 防護攔截。', + confirmBtn: '確認移除' + }, + add: { + header: '新增 SSRF 白名單條目', + body: '確認把 {entry} 加入 SSRF 白名單?該條目匹配到的主機 / IP / 網段會繞過 SSRF 防護,可能讓 Agent 訪問內網服務,請僅在確知用途時新增。', + confirmBtn: '確認新增' + } + } + } + }, + confirm: { + confirmBtn: '確認儲存', + cancelBtn: '取消', + emptyValue: '(空)', + bodyAuthRegistrationMode: '即將把「{label}」改為:{value}\n\n如果切到 self_serve,公網任何人都可以註冊帳號 — 務必確認是預期行為。' + }, + enumLabels: { + auth: { + default_tenant_mode: { + create_personal: '自動建立個人空間', + tenantless: '不自動建立空間' + }, + registration_mode: { + self_serve: '自助註冊(任何人可註冊)', + invite_only: '僅邀請(關閉公網註冊)' + } + } + }, + keyDescriptions: { + model: { + max_concurrency: '後臺任務(文件入庫/富化)對單個模型的預設併發上限,按模型 ID 全副本共享。每次呼叫實時讀取,修改後立即生效、無需重啟。0 或負數表示關閉預設限制(各模型仍會尊重自身在模型管理裡配置的上限)。僅影響後臺任務,不影響互動式對話。' + }, + asynq: { + core_concurrency: '文件解析與手工重解析的每例項保底併發,可額外借用共享彈性池;修改後需重啟。', + postprocess_concurrency: '解析完成後的輕量收尾和富化扇出專用併發;修改後需重啟。', + enrichment_concurrency: '摘要、圖片、圖譜與問題生成的每例項保底併發,可額外借用共享彈性池;修改後需重啟。', + maintenance_concurrency: '資料源同步、批處理和清理任務的每例項併發,與使用者面流水線硬隔離;修改後需重啟。', + shared_concurrency: '核心解析與內容富化共同使用的每例項彈性併發,由有積壓的一側自動借用;修改後需重啟。', + wiki_concurrency: '每個服務例項的 Wiki 專用 Worker 併發數,與上游任務池相互隔離。最小值為 1;修改後需重啟服務程序方可生效。' + }, + tenant: { + max_owned_per_user: '每個非超管使用者透過自助建立可擁有的最大空間數。每次建立空間時實時讀取,修改後立即生效。0 表示使用內建預設值 10;負數表示完全關閉限制(不建議在公開部署使用)。', + self_service_creation_enabled: '是否允許非超管使用者主動建立空間。關閉後,普通使用者只能透過邀請加入已有空間;跨空間超管仍可建立。修改後立即生效。', + default_storage_quota_gb: '新建空間時預設分配的儲存配額(GB),包含向量、原文、文字、索引等。僅在建立時讀取,修改後只對之後新建的空間生效,不會回寫已存在的空間。0 或負數表示使用內建預設值 10GB。', + auto_create_api_key: '為新空間自動生成 full_access API Key,並在建立響應中返回明文 token。僅用於相容依賴舊行為的整合;預設關閉,建議透過 API Key 管理顯式建立。' + }, + ssrf: { + whitelist: 'SSRF 防護白名單。可填入 example.com / *.foo.com / 10.0.0.0/8 / 2001:db8::1。修改後立即生效。SSRF_WHITELIST_EXTRA 環境變數仍由部署方維護,不在此處覆蓋。' + }, + auth: { + registration_mode: '自助註冊模式。self_serve = 任何人可註冊帳號;invite_only = 關閉公網註冊,僅 Owner/Admin 可邀請。修改後立即生效,但謹慎對待 self_serve(公網會接受 spam)。', + default_tenant_mode: '公開註冊後的空間初始化策略。create_personal 會自動建立個人空間並授予 Owner;tenantless 僅建立帳號,使用者需要接受邀請或主動建立空間。隻影響之後註冊的使用者。' + } + }, + keyLabels: { + model: { + max_concurrency: '模型預設併發上限' + }, + asynq: { + core_concurrency: '核心解析保底併發數', + postprocess_concurrency: '後處理編排併發數', + enrichment_concurrency: '內容富化保底併發數', + maintenance_concurrency: '維護與同步併發數', + shared_concurrency: '共享彈性併發數', + wiki_concurrency: 'Wiki Worker 併發數' + }, + tenant: { + max_owned_per_user: '每使用者最大空間數', + self_service_creation_enabled: '允許使用者自助建立空間', + default_storage_quota_gb: '新空間預設儲存配額 (GB)', + auto_create_api_key: '建立空間時自動生成 API Key' + }, + ssrf: { + whitelist: 'SSRF 防護白名單' + }, + auth: { + registration_mode: '自助註冊模式', + default_tenant_mode: '註冊預設空間策略' + } + }, + runtime: { + title: '任務佇列執行時', + description: '後臺任務佇列的實時負載,以及各獨立 worker 池的每例項併發配置。支援檢視任務明細和安全管理,每 5 秒自動重新整理。', + refresh: '重新整理', + autoRefresh: '自動重新整理(每 5 秒)', + loading: '載入中...', + retry: '重試', + unavailableTitle: '任務佇列不可用', + unavailable: '當前部署未啟用 Redis / asynq 佇列(Lite 模式),無佇列可展示。', + empty: '暫無佇列資料', + detailsTitle: '佇列明細', + detailsDescription: '各處理通道的實時負載與等待情況。“最終失敗”表示任務超過重試上限,已停止自動執行。', + poolsTitle: 'Worker 池', + poolsDescription: '各階段擁有保底容量,核心解析與內容富化還可借用共享彈性池。', + perInstance: '卡片主值為叢集執行中/容量', + poolConfigured: '單例項配置 {value}', + poolInstances: '{value} 個例項', + poolUtilization: '利用率 {value}%', + queueCount: '{value} 個佇列', + weightShort: '權重 {value}', + footnote: '卡片主值為叢集執行中/實時容量;單例項配置修改後需重啟。共享彈性池只消費核心解析和內容富化佇列。', + updatedAt: '更新於 {value}', + models: { + title: '模型併發佔用', + description: '觀察後臺任務實際進入模型服務時的併發佔用;上方是任務排程,這裡是模型服務限流,兩者處於不同處理階段。', + scope: '佔用為叢集全域性 · 等待為當前例項', + disabled: '模型後臺併發治理未啟用。可在全域性設定中配置模型預設併發上限。', + empty: '暫無模型呼叫資料;模型首次執行後臺任務後會出現在這裡。', + backgroundOnly: '僅統計後臺任務,不包含互動式對話', + status: { + queued: '限流中', + full: '已滿載' + }, + columns: { + model: '模型 ID', + active: '呼叫中', + waiting: '限流等待', + usage: '併發用量' + } + }, + tasks: { + title: '任務明細 · {queue}', + description: '檢視各狀態任務及其安全管理動作。定時、重試任務按最近執行時間優先,其餘狀態按時間倒序。', + listTitle: '{state}任務', + openAria: '檢視{queue}中 {count} 個{state}任務', + unavailable: '當前部署不支援檢視任務明細', + empty: '這個佇列當前沒有{state}任務', + loadError: '獲取任務明細失敗', + loadMore: '載入更多', + loadedSummary: '已載入 {count} 條,繼續下滑或點選載入', + loadedAll: '已全部載入,共 {count} 條', + loadingMore: '正在載入更多…', + attempts: '執行 {current}/{max}', + unknownTarget: '未識別到關聯物件', + knowledgeBaseLabel: '知識庫 ID', + knowledgeLabel: '文件 ID', + taskIDLabel: '業務任務 ID', + tenantLabel: '空間 ID', + sourceLabel: '來源 ID', + targetLabel: '目標 ID', + sourceKBLabel: '來源知識庫', + targetKBLabel: '目標知識庫', + dataSourceLabel: '資料源 ID', + syncLogLabel: '同步記錄 ID', + knowledgeCountLabel: '文件數量', + enqueuedAt: '入隊時間', + startedAt: '開始時間', + nextProcessAt: '下次執行', + lastFailedAt: '最後失敗', + completedAt: '完成時間', + deadline: '執行截止', + worker: '執行例項', + health: '執行健康', + orphaned: '執行例項已失聯,等待還原', + cancel: '終止任務', + cancelConfirm: '將透過業務取消流程終止該任務及同一文件的相關佇列任務。確認終止?', + runNow: '立即執行', + runNowConfirm: '該任務將立即進入待執行佇列,重試次數不會重置。確認繼續?', + deleteRecord: '清除記錄', + deleteConfirm: '僅從當前佇列移除這條失敗記錄,不會執行或完成原任務,歷史日誌仍會保留。確認清除?', + purgeArchived: '清除全部失敗任務', + purgeArchivedConfirm: '將從當前佇列一次性移除全部 {count} 條失敗記錄,僅清理佇列裡的失敗任務,不影響執行中或排隊中的任務,也不會回滾已失敗文件的業務狀態。確認清除?', + purgeArchivedSuccess: '已清除 {count} 條失敗任務', + purgeArchivedError: '清除失敗任務失敗', + stateFilter: '按任務狀態篩選', + actionError: { + cancel: '終止任務失敗', + run_now: '立即執行任務失敗', + delete: '清除失敗記錄失敗' + }, + actionSuccess: { + cancel: '任務已終止', + run_now: '任務已進入待執行佇列', + delete: '失敗記錄已清除' + }, + guides: { + active: '執行中任務可檢視執行例項、開始時間和截止時間。只有具備完整業務取消語義的任務才允許終止。', + pending: '排隊任務尚未被 worker 領取。終止操作會同步更新業務狀態,而不是隻刪除 Redis 記錄。', + scheduled: '定時任務可提前立即執行;支援業務取消的文件任務也可以安全終止。', + retry: '請結合最後錯誤、重試次數和下次執行時間判斷是否立即執行或終止。', + archived: '請先修復失敗原因再立即執行。清除記錄不會完成原業務任務。', + completed: '這裡只展示設定了結果保留時間的近期完成任務,不提供管理動作。' + }, + states: { + active: '執行中', + pending: '排隊中', + scheduled: '定時執行', + retry: '重試中', + archived: '最終失敗', + completed: '已完成' + }, + taskTypes: { + documentProcess: '文件解析', + manualProcess: '手工重新處理', + temporaryDocumentProcess: '聊天附件解析', + postProcess: '文件後處理', + summary: '摘要生成', + tableSummary: '表格摘要生成', + question: '問題生成', + multimodal: '圖片多模態處理', + graph: '知識圖譜抽取', + sync: '資料源同步', + faqImport: 'FAQ 匯入', + batchReparse: '批次重新解析', + batchDelete: '批次刪除', + move: '文件移動', + indexDelete: '索引刪除', + kbClone: '知識庫複製', + kbDelete: '知識庫刪除', + wikiIngest: 'Wiki 內容生成', + wikiFinalize: 'Wiki 收尾處理' + } + }, + failedNotice: { + title: '{count} 個任務待處理', + description: '點選下方表中紅色「最終失敗」數字檢視原因,修復後可手動重試。' + }, + status: { + working: '處理中', + waiting: '等待中', + idle: '空閒', + actionRequired: '需處理', + retrying: '重試中', + paused: '已暫停' + }, + columns: { + queue: '佇列', + active: '執行中', + pending: '排隊', + scheduled: '定時', + retry: '重試', + archived: '最終失敗', + completed: '已完成', + latency: '最早等待', + status: '狀態' + }, + summary: { + title: '執行概覽', + active: '執行中', + pending: '排隊中', + retry: '重試中', + archived: '最終失敗' + }, + pools: { + core: '核心解析', + postprocess: '後處理編排', + enrichment: '內容富化', + maintenance: '維護與同步', + shared: '共享彈性', + wiki: 'Wiki 池' + }, + poolDescriptions: { + core: '文件解析與手工重解析的保底容量', + postprocess: '解析完成後的收尾與富化扇出', + enrichment: '摘要、圖片、圖譜與問題生成', + maintenance: '資料源同步、批處理與刪除清理', + shared: '由核心解析與內容富化按積壓借用', + wiki: 'Wiki 內容生成與全域性收尾' + }, + queueNames: { + default: '文件解析', + chat_attachment: '對話附件解析', + postprocess: '後處理編排', + summary: '摘要生成', + sync: '資料源同步', + low: '維護與批處理', + multimodal: '多模態處理', + graph: '圖譜抽取', + question: '問題生成', + wiki: 'Wiki 處理' + }, + queueDescriptions: { + default: '文件解析、手工重解析', + chat_attachment: '會話內上傳附件解析', + postprocess: '解析收尾、富化扇出', + summary: '文件摘要、表格摘要', + sync: '手動與定時同步', + low: 'FAQ 匯入、批次重解析、刪除清理', + multimodal: '圖片 OCR、視覺描述', + graph: '分塊圖譜抽取', + question: '分塊問題生成', + wiki: '內容生成、索引收尾' + }, + errors: { + generic: '獲取佇列狀態失敗' + } + }, + runtimeTable: { + setting: '配置項與用途', + value: '當前值' + }, + sections: { + other: { + tab: '其他 {count}', + title: '其他配置', + description: '當前部署中未歸入標準分組的配置項。' + }, + security: { + tab: '網路安全 {count}', + title: '網路安全', + description: '管理可繞過 SSRF 防護的受信主機、IP 與網段。' + }, + runtime: { + tab: '執行與併發 {count}', + title: '執行與併發', + description: '配置後臺任務池與模型服務的併發容量。', + restartHint: 'Worker 配置需重啟生效' + }, + tenant: { + tab: '空間預設值 {count}', + title: '空間預設值', + description: '設定新空間的初始配額與相容性行為,不會自動改寫已有空間。' + }, + access: { + tab: '帳號與訪問 {count}', + title: '帳號與訪問', + description: '管理系統管理員、公開註冊與使用者建立空間的規則。' + } + }, + priorityHint: { + disclosure: '配置來源與優先順序', + tier1: '在此頁面儲存過的項(帶「已覆蓋」徽章)— 始終以這裡的值為準,環境變數會被忽略。', + tier2: '未在此處儲存過的項 — 如果環境變數裡有就用環境變數,否則用程式內建預設值。', + tier3: '若想讓某項重新由環境變數控制,點選該行的「重置」按鈕即可清除當前 UI 設定。' + } + }, + messages: { + fetchFailed: '獲取系統資訊失敗', + networkError: '網路錯誤,請稍後重試' + } + }, + tenant: { + title: '空間資訊', + currentTenant: '當前空間', + switchTenant: '切換空間', + sectionDescription: '檢視空間的詳細配置資訊', + statusActive: '活躍', + statusInactive: '未啟用', + statusSuspended: '已暫停', + statusUnknown: '未知', + loadingInfo: '正在載入資訊...', + retry: '重試', + unknown: '未知', + formatError: '格式錯誤', + searchPlaceholder: '搜尋空間名稱或輸入空間 ID...', + noMatch: '未找到匹配的空間', + switchSuccessTitle: '已切換空間', + switchSuccessContent: '你已進入 {name}', + loadTenantsFailed: '載入空間列表失敗', + loading: '載入中...', + loadMore: '載入更多', + api: { + title: 'API 資訊', + docLabel: 'API 文件', + docDescription: '檢視完整的 API 呼叫文件和示例,', + openDoc: '開啟文件', + userIdLabel: '使用者 ID', + userIdDescription: '您的唯一使用者標識', + usernameLabel: '使用者名稱', + usernameDescription: '您的登入使用者名稱', + emailLabel: '信箱', + emailDescription: '您的註冊信箱地址', + createdAtLabel: '註冊時間', + createdAtDescription: '帳號建立的時間', + desktopPortLabel: '本地 API 埠(桌面版)', + desktopPortDescription: '填寫固定埠(如 37841)後,Chrome 擴充套件等工具可長期使用同一 API 地址;0 表示每次啟動隨機埠。儲存後請重啟應用生效。', + desktopPortSave: '儲存', + desktopPortSaved: '已儲存,請重啟應用後生效', + desktopPortSaveFailed: '儲存失敗', + desktopPortInvalid: '請輸入 0–65535 之間的埠', + desktopBindPublicLabel: '允許區域網訪問 API', + desktopBindPublicDescription: '開啟後內嵌服務監聽 0.0.0.0,同一區域網內其他裝置可透過下方地址呼叫 API。存在資料暴露風險,請在防火牆與路由側自行做好訪問控制;修改後需重啟應用。', + desktopBindPublicSaved: '已儲存,請重啟應用後生效', + desktopBindPublicSaveFailed: '儲存失敗', + lanUrlLabel: '區域網 API 地址', + lanUrlDescription: '在已開啟「允許區域網訪問」且應用已重啟後顯示;若 IP 不準確,請在本機網路設定中檢視實際 IPv4 後替換主機部分。', + lanUrlCopyTitle: '複製區域網 API 地址', + lanUrlUnavailable: '當前已監聽所有網絡卡,但未能自動識別本機 IPv4。請在本機網路設定中檢視區域網地址,並手動拼接為 http://你的IP:埠/api/v1。' + }, + messages: { + fetchFailed: '獲取空間資訊失敗', + networkError: '網路錯誤,請稍後重試' + }, + deleteDangerZone: { + title: '刪除當前空間', + desc: '刪除整個空間及其配置。刪除後,空間成員將無法繼續訪問其中的知識庫、智慧體與 API Key。', + button: '刪除空間', + confirmTitle: '刪除當前空間?', + confirmBody: '此操作將刪除空間「{name}」,並使其中的知識庫、智慧體、成員與 API Key 不再可用。此操作不可撤銷。', + confirmHint: '請輸入空間名稱「{name}」以確認刪除。', + confirm: '確認刪除', + nameMismatch: '空間名稱不匹配', + success: '空間已刪除', + failed: '刪除空間失敗' + }, + leaveDangerZone: { + title: '退出當前空間', + desc: '終止您在本空間的成員身份。退出後將無法訪問本空間的知識庫與智慧體,之後可被再次邀請加入。', + button: '退出空間' + }, + storage: { + quotaLabel: '儲存配額', + quotaDescription: '空間的總儲存空間配額', + usedLabel: '已使用儲存', + usedDescription: '已經使用的儲存空間', + usageLabel: '儲存使用率', + usageDescription: '儲存空間的使用百分比' + }, + details: { + idLabel: '空間 ID', + idDescription: '您所屬空間的唯一標識', + nameLabel: '空間名稱', + nameDescription: '您所屬的空間名稱', + descriptionLabel: '空間描述', + descriptionDescription: '空間的詳細描述資訊', + businessLabel: '空間業務', + businessDescription: '空間所屬的業務型別', + statusLabel: '空間狀態', + statusDescription: '空間當前的執行狀態', + createdAtLabel: '空間建立時間', + createdAtDescription: '空間建立的時間', + editName: '修改名稱', + editNamePlaceholder: '請輸入新的空間名稱', + editNameConfirm: '儲存', + editNameCancel: '取消', + editNameRequired: '空間名稱不能為空', + editNameSuccess: '空間名稱已更新', + editNameFailed: '更新空間名稱失敗', + editDescription: '修改描述', + editDescriptionPlaceholder: '請輸入新的空間描述', + editDescriptionSuccess: '空間描述已更新', + editDescriptionFailed: '更新空間描述失敗', + descriptionEmptyPlaceholder: '未填寫' + }, + create: { + action: '建立新空間', + dialogTitle: '建立新空間', + dialogSubtitle: '空間擁有獨立的知識庫與成員,你將自動成為新空間的所有者。', + nameLabel: '空間名稱', + namePlaceholder: '例如:我的新專案', + nameRequired: '請輸入空間名稱', + descriptionLabel: '描述(可選)', + descriptionPlaceholder: '簡單描述一下這個空間的用途', + submit: '建立', + cancel: '取消', + success: '空間建立成功', + failed: '空間建立失敗', + disabled: '當前系統只允許透過邀請加入空間,不能自行建立空間。' + }, + switcher: { + menuLabel: '切換空間', + currentBadge: '當前', + homeTooltip: '我的空間', + empty: '你目前只屬於這一個空間' + } + }, + chat: { + memoryUsedCount: '本次使用了 {count} 條記憶', + memoryForget: '刪除這條記憶', + memoryForgotten: '已刪除這條記憶', + memoryForgetFailed: '刪除失敗', + memoryHint: '這些是助手在回答時看到的長期記憶,刪除後不會再被使用。', + suggestedQuestions: '你可以這樣問我', + followUpQuestions: '繼續問', + followUpQuestionsLoading: '載入推薦問題', + refreshSuggestedQuestions: '換一批', + thinking: '思考中...', + thinkingAlt: '正在思考', + preparingAnswer: '正在準備回答…', + connectingModelAndGeneratingAnswer: '正在連線模型並生成回答…', + modelStillResponding: '模型響應較慢,仍在等待…', + deepThoughtCompleted: '已深度思考', + deepThoughtAlt: '深度思考完成', + referencesTitle: '參考了{count}個相關內容', + referencesDocCount: '引用了{count}篇文件', + referencesWebCount: '參考了{count}條網頁', + referencesDocAndWebCount: '引用了{docCount}篇文件和{webCount}條網頁', + referencesDrawerTitle: '參考來源', + referencesDrawerTitleWeb: '網頁來源', + referencesDrawerTitleDocs: '文件來源', + referencesDrawerTitleTools: '工具結果', + referencesDrawerTitleMixed: '參考來源', + referencesDrawerWebSection: '網頁', + referencesDrawerDocsSection: '知識庫文件', + referencesDrawerToolsSection: '工具', + referencesDrawerEmpty: '暫無參考來源', + referenceChunkCount: '{count}個片段', + fallbackHint: '未從知識庫中檢索到相關內容,以上為模型直接回答', + requestInfoTitle: '請求資訊', + requestInfoRequestId: 'Request ID', + requestInfoMessageId: '訊息 ID', + requestInfoSessionId: '會話 ID', + requestInfoUrl: '請求', + requestInfoSentAt: '發起時間', + requestInfoEmpty: '暫無請求資訊', + channelWeb: '網頁', + channelApi: 'API', + channelIm: 'IM', + chunkLabel: '片段{index}:', + navigateToDocument: '檢視文件詳情', + chunkIdLabel: '片段ID:', + documentIdLabel: '文件ID:', + faqIdLabel: 'FAQ ID:', + faqContainerIdLabel: '所屬文件ID:', + faqAnswersLabel: '答案:', + chunkOrdinal: '片段 {index}', + previewContent: '預覽內容', + noPlanSteps: '未提供具體步驟', + chunkIndexLabel: '片段 #{index}', + chunkPositionLabel: '(位置: {position})', + noRelatedChunks: '沒有找到相關片段', + noSearchResults: '沒有找到搜尋結果', + relevanceHigh: '高相關', + relevanceMedium: '中相關', + relevanceLow: '低相關', + relevanceWeak: '弱相關', + webSearchNoResults: '未找到搜尋結果', + otherSource: '其他來源', + webGroupIntro: '以下 {count} 條內容來自', + graphConfigTitle: '圖譜配置', + entityTypesLabel: '實體型別:', + relationTypesLabel: '關係型別:', + graphResultsHeader: '找到 {count} 條相關結果', + graphNoResults: '未找到相關的圖譜資訊', + unknownLink: '未知連結', + contentLengthLabel: '長度 {value}', + notProvided: '未提供', + promptLabel: '提示詞', + errorMessageLabel: '錯誤資訊', + summaryLabel: '總結', + rawTextLabel: '原始文字', + collapseRaw: '收起原文', + expandRaw: '展開原文', + noWebContent: '未獲取到網頁內容', + webFetchStatusSuccess: '抓取成功', + webFetchStatusFailed: '抓取失敗', + webFetchStatusSkipped: '已跳過', + webFetchErrorCode: '錯誤碼', + webFetchRetryable: '可重試', + webFetchSummaryFailed: '摘要失敗', + lengthChars: '{value} 字', + lengthThousands: '{value} 千字', + lengthTenThousands: '{value} 萬字', + noDatabaseRecords: '未找到匹配的記錄', + nullValuePlaceholder: '', + chunkCountValue: '{count} 個片段', + documentDescriptionLabel: '文件描述:', + documentSourceLabel: '來源:', + documentFileLabel: '檔案資訊:', + documentMetadataLabel: '元資料', + documentInfoEmpty: '暫無文件資訊', + positionLabel: '位置:', + chunkPositionValue: '第 {index} 個片段', + contentLengthLabelSimple: '內容長度:', + fullContentLabel: '完整內容', + copyContent: '複製內容', + knowledgeBaseCount: '共 {count} 個知識庫', + noKnowledgeBases: '沒有可用的知識庫', + enterDescription: '輸入描述', + rawOutputLabel: '原始輸出', + wikiWritePageTitle: 'Wiki 頁面寫入', + wikiReplaceTextTitle: 'Wiki 文字替換', + wikiRenamePageTitle: 'Wiki 頁面重新命名', + wikiDeletePageTitle: 'Wiki 頁面刪除', + wikiActionCreated: '已建立', + wikiActionUpdated: '已更新', + wikiActionRenamed: '已重新命名', + wikiActionDeleted: '已刪除', + wikiFieldSlug: '頁面路徑', + wikiFieldTitle: '標題', + wikiFieldPageType: '型別', + wikiFieldSummary: '摘要', + wikiFieldOldText: '原文字', + wikiFieldNewText: '新文字', + wikiFieldOldSlug: '原路徑', + wikiFieldNewSlug: '新路徑', + wikiFieldAffectedPages: '受影響頁面', + wikiAffectedCount: '{count} 個頁面的連結已更新', + processError: '處理出錯', + sessionExcerpt: '會話摘錄', + noAnswerContent: '(無回答內容)', + noMatchFound: '未找到匹配的內容', + deleteSessionFailed: '刪除失敗,請稍後再試!', + imageTooMany: '最多上傳5張圖片', + imageTypeSizeError: '僅支援 JPG/PNG/GIF/WEBP 格式,單張不超過 10MB', + imageUploadTooltip: '上傳圖片(支援貼上/拖拽)', + attachmentUploadTooltip: '上傳附件(文件、音訊等)', + attachmentWithCount: '已上傳 {count} 個附件', + attachmentTooMany: '最多上傳 {max} 個附件', + attachmentTotalTooMany: '圖片和附件合計最多 {max} 個', + attachmentTooLarge: '檔案 {name} 超過 {max}MB 限制', + attachmentTypeNotSupported: '不支援的檔案型別:{name}', + attachmentUploading: '上傳中 {progress}%', + attachmentParsing: '正在解析', + attachmentReady: '解析完成', + attachmentUploadFailed: '附件上傳失敗', + attachmentParseFailed: '附件解析失敗', + attachmentStillProcessing: '附件 {name} 仍在解析,請稍候' + }, + knowledgeEditor: { + titleCreate: '新建知識庫', + titleEdit: '知識庫設定', + advanced: { + title: '高階設定', + description: '配置問題生成等高階功能', + multimodal: { + label: '多模態功能', + description: '啟用圖片等多模態內容的理解能力', + vllmLabel: 'VLLM 視覺模型', + vllmDescription: '用於多模態理解的視覺語言模型(必選)', + vllmPlaceholder: '請選擇 VLLM 模型(必選)', + descriptionLanguageLabel: '圖片描述語言', + descriptionLanguageDescription: '留空時跟隨文件語言;不再強制使用中文', + descriptionLanguageAuto: '自動跟隨文件語言', + customInstructionsLabel: '圖片解析要求', + customInstructionsDescription: '補充需要重點識別的視覺資訊,OCR 和 Markdown 格式協議保持不變', + customInstructionsPlaceholder: '例如:重點識別裝置銘牌、型號、告警程式碼和表格中的單位…' + }, + tableMetadataInstructions: { + label: '表格元資料生成要求', + description: '為 CSV/Excel 摘要補充業務背景和欄位語義,幫助後續檢索理解表格內容', + placeholder: '例如:這是銷售訂單表,金額單位為元,status 欄位使用公司內部狀態碼…' + }, + questionGeneration: { + label: 'AI 問題生成', + description: '解析文件時呼叫大模型為每個分塊生成相關問題,提高檢索召回率。啟用後會增加文件解析耗時。', + countLabel: '生成問題數量', + countDescription: '每個文件分塊生成的問題數量(1-10)', + instructionsLabel: '問題生成要求', + instructionsDescription: '指定問題面向的人群、場景和表達方式,系統仍維護穩定輸出格式', + instructionsPlaceholder: '例如:生成客服使用者常問的自然語言問題,避免考試題式表達…' + }, + autoTag: { + label: '自動關聯標籤', + description: '文件解析完成後,從當前知識庫已有標籤中選擇合適標籤自動關聯。不會建立或刪除標籤,並會增加一次模型呼叫。', + modelLabel: '分類模型', + modelDescription: '留空時使用知識庫摘要模型。', + modelPlaceholder: '請選擇分類模型', + maxTagsLabel: '單篇文件最多標籤數', + maxTagsDescription: '每篇文件最多自動關聯 1-10 個已有標籤。', + skipIfTaggedLabel: '跳過已有標籤的文件', + skipIfTaggedDescription: '開啟後,上傳時已手動設定標籤的文件不再自動打標籤,避免覆蓋人工分類意圖。' + } + }, + asr: { + title: '音訊語音識別', + description: '配置語音識別(ASR),啟用後可上傳音訊檔案並整段轉寫為文字(常見格式:mp3、wav、m4a、flac、ogg 等)。暫不支援影片上傳。', + label: '啟用音訊語音識別', + desc: '啟用後可上傳音訊到知識庫,系統自動將語音轉寫為文字並參與解析與檢索', + modelLabel: 'ASR 模型', + modelDescription: '用於音訊中語音轉文字的識別模型(如 OpenAI Whisper)', + modelPlaceholder: '請選擇 ASR 模型', + languageLabel: '音訊語言提示', + languageDescription: '可選;指定主要語種可提高部分 ASR 模型的識別穩定性,留空時自動檢測', + languagePlaceholder: '例如 zh、en,留空自動檢測' + }, + multimodal: { + title: '影象處理配置', + description: '配置影象內容理解能力,啟用後支援圖片等非文字內容的解析和檢索' + }, + chunking: { + title: '分塊設定', + description: '控制上傳文件在嵌入前的切分方式。預設值適用於大多數場景,僅在檢索質量異常時調整。', + sizeLabel: '分塊大小', + sizeDescription: '每個分塊的最大字元數(100-4000)。預設 512 ≈ 中文 300 tokens / 英文 100-130 tokens。FAQ 用 200-400,敘述性長文件用 1000-2000。', + characters: '字元', + overlapLabel: '分塊重疊', + overlapDescription: '相鄰分塊之間共享的字元數(0-500)。預設 80 ≈ 分塊大小的 15%,符合當前研究推薦。FAQ/結構化資料用 0,長篇敘述用 150-200。', + separatorsLabel: '分隔符', + separatorsDescription: '切分時優先使用的字元或字串。優先順序高的分隔符先嚐試;預設順序優先段落 → 句子 → 標點。', + separatorsPlaceholder: '選擇或自定義分隔符', + parentChildLabel: '父子分塊', + parentChildDescription: '兩級分塊:小的子塊用於向量匹配(精準命中),大的父塊返回給 LLM(更豐富上下文)。建議用於長文件(>10 頁);短 FAQ 可關閉以節省儲存。', + parentChunkSizeLabel: '父塊大小', + parentChunkSizeDescription: '返回給 LLM 的上下文塊大小(512-8192)。預設 4096 ≈ 1000 英文 tokens,適合所有現代 LLM 上下文視窗。', + childChunkSizeLabel: '子塊大小', + childChunkSizeDescription: '用於向量匹配的嵌入塊大小(64-2048)。預設 384 ≈ 80 tokens,是 sentence-transformer / BGE 類嵌入模型的最佳點。', + strategyLabel: '分塊策略', + strategyDescription: '選擇文件的分塊方式。自動模式會分析每個文件的結構並選擇最佳策略。', + strategyPlaceholder: '選擇分塊策略(不填則按長度切分)', + overlapWarning: '重疊相對於分塊大小較大——分塊之間會共享大部分內容。', + advancedLabel: '高階選項', + tokenLimitLabel: '每塊 Token 上限', + tokenLimitDescription: '每個分塊的硬性 Token 上限(0-8192)。0 = 關閉(僅按字元數)。當嵌入模型 Token 上限較小時啟用:MiniLM (256 tok) 用 200,BGE/Cohere (512 tok) 用 400。現代嵌入器(OpenAI、Voyage、Jina-v3)支援 >2000 tokens,保持 0 即可。', + languagesLabel: '語言提示', + languagesDescription: '限制啟發式模式只識別選定的語言(DE/EN/ZH)。留空 = 自動檢測。同質化語料庫可顯式設定以避免跨語言誤匹配。', + languagesPlaceholder: '自動檢測', + debug: { + toggle: '測試分塊效果', + toggleHint: '無需重新上傳即可對示例文字執行分塊器', + sampleLabel: '示例文字', + samplePlaceholder: '貼上 Markdown / 純文字片段以檢視當前配置的分塊結果…', + presetLabel: '載入示例:', + runButton: '執行預覽', + loading: '正在對示例執行分塊器…', + errorPrefix: '預覽失敗', + selectedTier: '選定策略', + rejected: '被拒絕的層級', + contextHeader: '上下文標題', + fallbackWarning: '策略鏈已窮盡 — 當前設定無法智慧分塊此內容', + stats: { + chunks: '塊', + truncated: '已截斷;總數 {total}' + }, + profile: { + lines: '行', + chars: '字元', + headings: 'Markdown 標題', + pageBreaks: '分頁符', + chapterMarkers: '章節標記', + languages: '語言' + }, + samples: { + markdown: 'Markdown 文件', + faq: 'FAQ 列表', + chapter: 'PDF 章節', + plain: '純文字' + } + }, + languageOptions: { + de: '德語', + en: '英語', + zh: '中文' + }, + strategies: { + legacy: { + label: '按長度切分', + tooltip: '忽略結構,僅按字元數和分隔符遞迴切分——原始行為。當上述策略對你的內容效果不佳時使用。' + }, + heuristic: { + label: '結構感知', + tooltip: '識別分頁符、編號章節、多語言章節標記(DE/EN/ZH)、全大寫標題等結構訊號進行切分。適合沒有 Markdown 標題的 PDF / 掃描件。' + }, + heading: { + label: '按標題切分', + tooltip: '在 Markdown 標題(#、##、###)邊界處切分,每塊自動帶上所在標題路徑。適合結構清晰的 Markdown 文件。' + }, + auto: { + label: '自動', + tooltip: '文件分析器根據內容結構自動在「按標題切分」「結構感知」「按長度切分」之間選擇。' + } + }, + separators: { + doubleNewline: '雙換行 (\\n\\n)', + singleNewline: '單換行 (\\n)', + periodCn: '中文句號 (。)', + exclamationCn: '感嘆號 (!)', + questionCn: '問號 (?)', + semicolonCn: '中文分號 (;)', + semicolonEn: '英文分號 (;)', + space: '空格 ( )' + } + }, + models: { + title: '模型配置', + description: '為知識庫選擇合適的 AI 模型', + llmLabel: 'LLM 大語言模型', + llmDesc: '用於總結和摘要的大語言模型', + llmPlaceholder: '請選擇 LLM 模型(可選)', + embeddingLabel: 'Embedding 嵌入模型', + embeddingDesc: '用於文字向量化的嵌入模型', + embeddingPlaceholder: '請選擇 Embedding 模型', + embeddingLocked: '知識庫中已有檔案,無法修改 Embedding 模型', + embeddingOptional: '(可選)', + embeddingWikiOptionalDesc: '可選。配置後用於 Wiki 目錄歸類的相似度匹配,讓新頁面更好地複用已有目錄;不配置則按完整目錄樹歸類。' + }, + faqExport: { + exportButton: '匯出', + exportCSV: '匯出 CSV', + exportJSON: '匯出 JSON', + exportSuccess: '匯出成功', + exportFailed: '匯出失敗' + }, + faqImport: { + title: '批次匯入 FAQ', + modeLabel: '匯入模式', + appendMode: '追加匯入', + replaceMode: '替換現有條目', + fileLabel: '選擇檔案', + fileTip: '支援 JSON / CSV / Excel。CSV/Excel 表頭:標籤(必填)、問題(必填)、相似問題(選填-多個用##分隔)、反例問題(選填-多個用##分隔)、機器人回答(必填-多個用##分隔)、是否全部回覆(選填-預設FALSE)、是否停用(選填-預設FALSE)、是否禁止被推薦(選填-預設False 可被推薦)。也支援舊錶頭「分類」及舊格式:standard_question、answers、similar_questions、negative_questions', + clickToUpload: '點選上傳檔案', + dragDropTip: '或拖拽檔案到此處', + importButton: '匯入 FAQ', + deleteSuccess: '選中條目已刪除', + previewCount: '共解析 {count} 條記錄', + previewMore: '還有 {count} 條未展示', + importSuccess: '匯入成功', + parseFailed: '解析檔案失敗', + invalidJSON: 'JSON 檔案格式不正確', + unsupportedFormat: '暫不支援該檔案格式', + selectFile: '請先選擇需要匯入的檔案', + downloadExample: '下載示例檔案', + downloadExampleJSON: '下載 JSON 示例', + downloadExampleCSV: '下載 CSV 示例', + downloadExampleExcel: '下載 Excel 示例' + }, + faq: { + title: '問答', + subtitle: '結構化問答管理,支援標準問、相似問和反例,精準匹配使用者查詢,提升問答準確率', + description: '設定 FAQ 知識庫的索引策略和問答組織方式', + indexModeLabel: '索引方式', + indexModeDescription: '僅索引問題可提升精度,索引問答可提高召回率', + questionIndexModeLabel: '問題索引方式', + questionIndexModeDescription: '合併索引:標準問和相似問合併索引;分別索引:標準問和每個相似問獨立索引,檢索更精確但需要更多儲存', + entryGuide: 'FAQ 條目由標準問、相似問、反例和多個答案組成,可在知識庫詳情中批次匯入、編輯。', + tagDesc: '為 FAQ 條目選擇標籤', + tagPlaceholder: '請選擇標籤', + standardQuestion: '標準問', + standardQuestionDesc: '設定問題的標準表述,這是使用者最常問的問題形式。', + answers: '答案', + answersDesc: '提供完整準確的答案內容,可新增多個答案以覆蓋不同場景。', + similarQuestions: '相似問', + similarQuestionsDesc: '新增與標準問意思相同但表述不同的問題,幫助系統更好地匹配使用者查詢。', + negativeQuestions: '反例', + negativeQuestionsDesc: '新增不應匹配此答案的問題,用於排除誤匹配的情況。', + editorCreate: '新增 FAQ 條目', + editorEdit: '編輯 FAQ 條目', + answerPlaceholder: '請輸入答案內容,支援多行文字,按 Ctrl+Enter 或點選按鈕新增', + similarPlaceholder: '輸入相似問題後點選加號新增', + negativePlaceholder: '輸入反例後點選加號新增', + answerRequired: '請至少填寫一個答案', + emptyTitle: '暫無 FAQ 條目', + emptyDesc: '點選上方"新增 FAQ 條目"按鈕開始建立', + searchPlaceholder: '搜尋問題和答案...', + searchTest: '檢索測試', + createGroup: '新建', + searchTestTitle: 'FAQ 檢索測試', + queryLabel: '查詢內容', + queryPlaceholder: '請輸入要檢索的問題', + vectorThresholdDesc: '範圍 0-1,預設 0.7', + matchCountLabel: '結果數量', + matchCountDesc: '範圍 1-50,預設 10', + searchButton: '開始檢索', + searching: '檢索中...', + searchResults: '檢索結果', + noResults: '未找到匹配的 FAQ 條目', + matchedQuestion: '命中問題', + matchTypeEmbedding: '向量匹配', + matchTypeKeywords: '關鍵詞匹配', + similarityThresholdLabel: '相似度閾值', + statusEnabled: '已啟用', + statusDisabled: '已禁用', + statusEnableSuccess: 'FAQ 條目已啟用', + statusDisableSuccess: 'FAQ 條目已禁用', + statusUpdateFailed: '更新狀態失敗', + recommended: '推薦', + recommendedEnabled: '已開啟推薦', + recommendedDisabled: '已關閉推薦', + recommendedDisableSuccess: 'FAQ 條目已關閉推薦', + recommendedUpdateFailed: '更新推薦狀態失敗', + batchUpdateTag: '批次設定標籤', + batchUpdateTagTip: '將為 {count} 個選中的條目設定標籤', + batchEnable: '批次啟用', + batchDisable: '批次禁用', + batchDelete: '批次刪除', + confirmBatchDelete: '確認刪除選中的 {count} 個 FAQ 條目?刪除後將無法還原。', + batchDeleteSuccess: '已刪除 {count} 個 FAQ 條目', + modes: { + questionOnly: '僅標準問/相似問', + questionAnswer: '標準問 + 答案', + combined: '合併索引', + separate: '分別索引' + } + }, + document: { + title: '文件', + subtitle: '支援點選或拖拽上傳,多格式文件自動解析並智慧分塊,快速構建可檢索的知識庫' + }, + messages: { + loadModelsFailed: '載入模型列表失敗', + loadDataFailed: '載入知識庫資料失敗', + notFound: '知識庫不存在', + nameRequired: '請輸入知識庫名稱', + summaryRequired: '請選擇 Summary 模型', + multimodalInvalid: '多模態配置驗證失敗', + createSuccess: '知識庫建立成功', + createFailed: '建立知識庫失敗', + missingId: '缺少知識庫 ID', + buildDataFailed: '資料構建失敗', + updateSuccess: '配置儲存成功', + indexModeRequired: '請選擇 FAQ 的索引方式', + storageChangeConfirm: '知識庫中已有檔案,更改儲存引擎後舊檔案可能無法正常訪問。是否確認更改?' + }, + share: { + description: '將知識庫共享給空間,讓空間成員可以訪問和使用', + hintTitle: '共享說明', + addShare: '共享', + unshareConfirm: '確定要取消對「{name}」的共享嗎?', + tip1: '共享後,空間成員將根據設定的許可權訪問此知識庫', + tip2: '可編輯許可權允許成員修改知識庫內容,只讀許可權僅允許檢索和問答' + }, + buttons: { + create: '建立知識庫', + save: '儲存配置', + saveAndClose: '儲存並關閉', + }, + postCreateHint: { + title: '建立成功', + footer: '可繼續調整配置,設定共享與資料源,完成後點選「儲存並關閉」。', + followUpDesc: '可在左側配置資料源,或在「共享管理」中釋出到空間', + }, + wikiBrowser: { + editBtn: '編輯', + historyBtn: '歷史', + historyTitle: '版本歷史 · {title}', + deletePageBtn: '刪除', + deletePageConfirm: '確定要刪除頁面“{title}”嗎?刪除後可在回收週期內由管理員還原資料庫記錄,但頁面將從 Wiki 中消失。', + deletePageSuccess: '頁面已刪除', + deletePageFailed: '刪除頁面失敗', + editTitlePlaceholder: '頁面標題', + editSummaryPlaceholder: '一句話摘要(用於索引列表)', + editContentPlaceholder: 'Markdown 正文,支援 [[頁面連結]] 語法', + editSaveSuccess: '頁面已儲存', + editSaveFailed: '儲存失敗', + editConflictHint: '儲存衝突:頁面已被他人或系統更新至 v{ver}。你可以放棄本地修改載入最新版本,或覆蓋儲存(被覆蓋的版本會保留在歷史中)。', + editConflictReload: '載入最新版本', + editConflictOverwrite: '覆蓋儲存', + editSourceUser: '手動編輯', + editSourceAgent: 'AI 修改', + editSourceRevert: '版本回滾', + editSourcePipeline: '自動生成', + newPageBtn: '新建頁面', + newPageTitle: '新建 Wiki 頁面', + newPageTitleLabel: '標題', + newPageTitlePlaceholder: '請輸入頁面標題', + newPageSlugLabel: 'Slug(頁面地址)', + newPageSlugPlaceholder: '例如 concept/my-topic', + newPageSlugHint: '由字母/數字/中劃線組成,可用 / 分層,建立後不可修改', + newPageTypeLabel: '頁面型別', + newPageContentLabel: '正文(可選)', + newPageMissingFields: '請填寫標題和 Slug', + newPageSuccess: '頁面已建立', + newPageFailed: '建立頁面失敗', + revisionCurrent: '當前版本', + revisionCurrentHint: '這是頁面的當前版本,選擇左側的歷史版本可檢視差異或回滾。', + revisionSelectHint: '選擇左側的版本檢視內容', + revisionEmpty: '暫無歷史版本,頁面內容變化後會自動記錄快照', + revisionDiff: '對比當前', + revisionRaw: '檢視原文', + revisionDiffCaption: 'v{from} → v{to}(紅色為該版本,綠色為當前)', + revisionDiffIncremental: '版本變更', + revisionDiffCumulative: '對比當前', + revisionDiffBasisLabel: '對比方式', + revisionViewModeLabel: '檢視方式', + revisionLatestChangeHint: '上一版到當前版的變更', + revisionIncrementalHint: '產生 v{ver} 的變更', + revisionInitialRange: '初始 → v{ver}', + revisionInitialCreationHint: '初始建立內容', + revisionCumulativeHint: '該版本到當前版的累計變更', + revisionDiffIncrementalCaption: 'v{from} → v{to}(相鄰版本,紅色為舊、綠色為新)', + revisionDiffCumulativeCaption: 'v{from} → v{to}(距當前的累計變更)', + revisionFirstVersionHint: '這是首個版本,沒有上一版可對比。', + revisionDiffTitle: '標題', + revisionDiffSummary: '摘要', + revisionDiffContent: '正文', + revisionDiffEmpty: '此版本與當前在標題、摘要和正文上均無差異', + revisionLoadFailed: '載入版本歷史失敗', + revertBtn: '回滾到此版本', + revertConfirm: '確定回滾到 v{ver} 嗎?當前內容會先儲存為歷史版本,回滾操作可再次撤銷。', + revertSuccess: '已回滾到 v{ver}', + revertFailed: '回滾失敗', + viewInGraph: '在圖譜中檢視', + editingBadge: '編輯中', + pageActions: '頁面操作', + tabDocuments: '文件', + tabGraph: '圖譜', + tabGraphTip: 'Wiki 頁面之間的引用關係圖(即頁面連結圖譜),與「知識庫設定 → 知識圖譜」中基於 LLM 抽取的實體-關係圖譜不是同一個概念', + searchPlaceholder: '搜尋 Wiki 頁面...', + searchNoResults: '沒有找到匹配的頁面', + viewModeToggle: '切換目錄檢視', + viewTree: '樹形檢視', + viewList: '列表檢視', + newRootFolder: '新建目錄', + newSubfolder: '新建子目錄', + folderActions: '目錄操作', + folderNamePlaceholder: '請輸入目錄名稱', + createFolderSuccess: '目錄已建立', + createFolderFailed: '建立目錄失敗', + movePageSuccess: '頁面已移動', + movePageFailed: '移動頁面失敗', + renameFolder: '重新命名目錄', + renameFolderSuccess: '目錄已重新命名', + renameFolderFailed: '重新命名目錄失敗', + deleteFolder: '刪除目錄', + deleteFolderConfirm: '確定要刪除目錄“{name}”嗎?', + deleteFolderSuccess: '目錄已刪除', + deleteFolderFailed: '刪除目錄失敗', + deleteFolderNotEmpty: '目錄非空,請先移除其中的頁面和子目錄', + moveFolderSuccess: '目錄已移動', + moveFolderFailed: '移動目錄失敗', + moveFolderIntoSelf: '不能將目錄移動到自身或其子目錄中', + moveConfirm: '移動到「{target}」?', + moveConfirmTitle: '確認移動', + rootFolderLabel: '根目錄', + filterSummary: '摘要', + filterKnowledge: '知識', + filterEntity: '實體', + filterConcept: '概念', + filterSynthesis: '綜合', + filterComparison: '對比', + legendFamiliar: '你常用的資料', + emptyTitle: '暫無 Wiki 頁面', + emptyDesc: '上傳文件並啟用 Wiki 後將自動生成知識頁面', + selectPageHint: '從左側選擇一個頁面檢視內容', + version: 'v{ver}', + aliases: '別名', + linkedFrom: '被連結', + sources: '來源文件', + graphEmpty: '載入圖譜中...', + fitView: '適應螢幕', + indexTitle: '索引', + loading: '載入中…', + loadMoreShort: '載入更多', + indexOverviewTag: '分類目錄', + indexEmpty: '暫無 Wiki 頁面,請先上傳文件', + graphNoData: '暫無圖譜資料,請先上傳文件(這裡展示的是 Wiki 頁面之間的連結關係,與「知識庫設定 → 知識圖譜」中的實體-關係圖譜不同)', + showArrows: '顯示箭頭', + hideArrows: '隱藏箭頭', + expandNeighbors: '展開鄰居', + bloomNeighbors: '疊加鄰居', + growFrontier: '擴張邊緣 ({count})', + growFrontierTitle: '一鍵展開當前所有 {count} 個帶虛線環的節點', + cardEgoTitle: '當前焦點', + cardOverviewTitle: '全庫概覽', + cardOverviewPrimary: '{returned} / {total} 個節點', + cardOverviewHintTruncated: '雙擊任意節點聚焦到該節點的子圖', + cardOverviewHintFull: '已展示知識庫全部節點', + cardRelatedNodes: '{count} 個相關節點', + helpButtonTitle: '操作幫助', + helpTitle: '畫布操作', + helpClickAction: '單擊', + helpClickDesc: '開啟節點詳情', + helpDblClickAction: '雙擊', + helpDblClickDesc: '以該節點為中心聚焦', + helpShiftClickAction: 'Shift + 單擊', + helpShiftClickDesc: '疊加該節點鄰居到畫布', + helpHoverPlusAction: '懸浮 → ⊕', + helpHoverPlusDesc: '同 Shift + 單擊', + helpDragAction: '拖拽節點', + helpDragDesc: '手動調整節點位置', + helpPanAction: '拖拽空白', + helpPanDesc: '平移畫布', + helpZoomAction: '滾輪', + helpZoomDesc: '縮放畫布', + neighborsProgress: '已顯示鄰居 {visible}/{total}(還有 {hidden} 個未載入)', + neighborsAllShown: '全部 {total} 個鄰居已在圖中(可點"展開鄰居"聚焦到該節點子圖)', + neighborsNone: '該節點沒有連結鄰居', + neighborsCenterUnreachable: '已顯示鄰居 {visible}/{total}(還有 {hidden} 個無法連通:可能是死鏈、被過濾或已刪除)', + neighborsOverviewHidden: '已顯示鄰居 {visible}/{total}({hidden} 個不在概覽範圍,點"展開鄰居"以此為中心檢視)', + backToOverview: '返回概覽', + queueStatus: 'Wiki 佇列中 {count} 個待處理任務', + issueTitle: '此頁面存在 {count} 個待處理的知識衝突或錯誤', + issueFixBtn: 'AI 一鍵修復', + issueMixed: '資訊混雜', + issueConflict: '事實衝突', + issueOutdated: '資訊過時', + issueAttention: '需要關注', + issueReportedBy: '由 {reporter} 報告', + issueAiLinter: 'AI 巡檢', + issueIgnore: '忽略誤報', + globalIssuesTitle: '全庫待修復內容問題', + globalIssuesCount: '待修復內容問題: {count} 項', + globalIssuesEmpty: '暫無待處理的內容問題', + issuePagePrefix: '頁面: ', + issueGoFix: '去處理', + fixAssistantTitle: 'Wiki 智慧修復助手', + issueFixSuggestions: '內容最佳化建議 ({count})', + issueFixSingle: '修復', + fixStartError: '啟動修復助手失敗', + issueFixPromptSingle: '請修復頁面 [[{slug}]] 上的問題 (ID: {id})。', + issueFixPromptAutoStart: '請修復頁面 [[{slug}]] 上的以下問題:' + }, + indexing: { + title: '索引策略', + description: '配置文件上傳後的處理管道,可以獨立開啟或關閉每種索引方式', + searchTitle: 'RAG 檢索', + searchDesc: '對文件進行分塊、向量化和關鍵詞索引,支援混合檢索', + wikiTitle: 'Wiki 知識庫', + wikiDesc: '自動生成互相關聯的 Wiki 知識頁面,構建結構化知識體系', + graphTitle: '知識圖譜', + graphDesc: '提取實體和關係,構建知識圖譜支援圖譜檢索', + atLeastOne: '至少需要開啟一種索引策略', + embeddingRequired: 'RAG 檢索需要配置 Embedding 模型', + lockedTip: '知識庫已有內容,索引策略暫不支援調整。如需變更,請先清空知識庫。', + rebuildConfirmTitle: '重建索引', + rebuildConfirmBody: '索引策略已變更,是否對已有的 {count} 篇文件重新處理?這可能需要一些時間。', + rebuildSuccess: '已提交重建任務,共 {count} 篇文件', + rebuildSkip: '稍後可在資料源中手動觸發重建' + }, + wiki: { + title: 'Wiki 設定', + synthesisModelLabel: 'Wiki 合成模型', + synthesisModelPlaceholder: '選擇用於 Wiki 生成的 LLM 模型', + synthesisModelTip: '不設定時將回退使用摘要模型', + extractionGranularityLabel: '提取粒度', + contentInstructionsLabel: 'Wiki 內容生成要求', + contentInstructionsTip: '控制摘要、頁面和首頁的表達重點;引用、合併與防幻覺規則由系統固定維護。修改後需重新解析才能影響已有內容。', + contentInstructionsPlaceholder: '例如:使用法務審閱口吻,優先展示責任主體、時間線和風險提示…', + extractionInstructionsLabel: 'Wiki 提取重點', + extractionInstructionsTip: '說明應重點識別的領域實體和概念,不會替換系統的 JSON 與引用協議。', + extractionInstructionsPlaceholder: '例如:重點識別產品、版本、組織、負責人和關鍵技術概念…', + extractionGranularityTip: '控制每篇文件抽取的 Wiki 實體/概念數量。粒度越細,索引越聚焦;粒度越粗,索引越詳盡', + granularityFocused: '聚焦', + granularityStandard: '標準', + granularityExhaustive: '詳盡', + granularityFocusedHint: '只抽取文件的主角(如簡歷 → 人物和專案)。最乾淨,但可能漏掉次要實體。', + granularityStandardHint: '抽取主角 + 被詳細描述的次要實體/概念。跳過一帶而過的通用名詞。適合大多數場景。', + granularityExhaustiveHint: '抽取所有可識別的命名實體與概念,包括一帶而過的技術棧。適合將知識庫當作術語表使用。' + }, + basic: { + title: '基本資訊', + description: '設定知識庫的名稱和描述資訊', + kbId: '知識庫 ID', + kbIdDesc: 'API 整合時可使用此 ID 指定知識庫', + typeLabel: '知識庫型別', + typeDocument: '文件', + typeFAQ: '問答', + typeDescription: 'FAQ 型別適合結構化問答資料;文件型支援檔案解析與分塊;Wiki 型別由 LLM 自動構建互鏈知識頁面。', + nameLabel: '知識庫名稱', + namePlaceholder: '請輸入知識庫名稱', + descriptionLabel: '知識庫描述', + descriptionPlaceholder: '請輸入知識庫描述(可選)' + }, + errors: { + vectorStoreBindingInvalid: '無法使用所選向量儲存。請選擇其他儲存或使用系統預設值。', + vectorStoreUnavailable: '所選向量儲存當前不可用。請在設定 → 向量儲存中檢查其連線配置。' + }, + sidebar: { + basic: '基本資訊', + models: '模型配置', + vectorStore: '向量儲存', + chunking: '分塊設定', + storage: '儲存引擎', + advanced: '高階設定', + faq: 'FAQ 設定', + graph: '知識圖譜', + multimodal: '影象處理', + asr: '音訊處理', + datasource: '資料源', + share: '共享管理', + activity: '活動記錄' + }, + navGroups: { + basic: '基礎', + processing: '索引與解析', + data: '儲存與資料', + integration: '釋出整合', + management: '管理與審計' + }, + activity: { + title: '活動記錄', + description: '檢視這個知識庫的重要變更與後臺任務入口,記錄預設遵循審計日誌保留策略。', + allOutcomes: '全部結果', + allActions: '全部操作', + refresh: '重新整理', + retry: '重試', + empty: '暫無活動記錄', + emptyFiltered: '沒有匹配的活動記錄', + clearFilters: '清除篩選', + loadingMore: '載入中…', + end: '沒有更早的記錄了', + loadFailed: '活動記錄載入失敗', + systemActor: '系統觸發', + knowledgeBase: '知識庫', + countItems: '共 {count} 項', + titleWithCount: '{title} 等 {count} 項', + importSummary: '成功 {success} / 失敗 {failed} / 跳過 {skipped}', + detailValues: { + user: '使用者發起', + manual: '手動觸發', + schedule: '定時排程', + system: '系統觸發', + pending: '待處理', + completed: '已完成', + partial: '部分完成', + canceled: '已取消', + failed: '失敗', + enqueue: '任務提交', + reuse_vectors: '複用向量', + reparse: '重新解析', + viewer: '只讀', + editor: '可編輯', + admin: '管理', + append: '追加', + replace: '覆蓋' + }, + outcomes: { + accepted: '已受理', + success: '成功', + failed: '失敗', + partial: '部分完成', + canceled: '已取消', + denied: '已拒絕' + }, + actions: { + 'kb.created': '建立知識庫', + 'kb.updated': '更新知識庫', + 'kb.deleted': '刪除知識庫', + 'kb.duplicated': '複製知識庫', + 'kb.clone_started': '開始克隆', + 'kb.clone_completed': '完成克隆', + 'kb.clone_failed': '克隆失敗', + 'knowledge.created': '新增知識', + 'knowledge.updated': '更新知識', + 'knowledge.deleted': '刪除知識', + 'knowledge.batch_deleted': '批次刪除知識', + 'knowledge.reparse_started': '開始重新解析', + 'knowledge.parse_canceled': '取消解析', + 'knowledge.move_started': '開始移動知識', + 'knowledge.move_completed': '完成移動知識', + 'knowledge.move_failed': '移動知識失敗', + 'tag.created': '建立標籤', + 'tag.updated': '更新標籤', + 'tag.deleted': '刪除標籤', + 'datasource.created': '建立資料源', + 'datasource.updated': '更新資料源', + 'datasource.deleted': '刪除資料源', + 'datasource.sync_started': '開始同步資料源', + 'datasource.sync_completed': '資料源同步完成', + 'datasource.sync_failed': '資料源同步失敗', + 'datasource.paused': '暫停資料源', + 'datasource.resumed': '還原資料源', + 'kb.share_added': '新增共享', + 'kb.share_permission_changed': '修改共享許可權', + 'kb.share_removed': '移除共享', + 'wiki.content_changed': '更新 Wiki 內容', + 'faq.import_started': '開始匯入 FAQ', + 'faq.import_completed': '完成匯入 FAQ', + 'faq.import_failed': '匯入 FAQ 失敗' + }, + detailFields: { + task_id: '任務 ID', + trigger: '觸發方式', + processing_status: '處理狀態', + source_kb_id: '來源知識庫 ID', + target_kb_id: '目標知識庫 ID', + sync_log_id: '同步記錄 ID', + mode: '執行模式', + attempt: '處理批次', + count: '專案數', + total: '總數', + processed: '已處理', + failed: '失敗數', + skipped: '跳過數', + failure_stage: '失敗階段' + }, + targets: { + knowledge_base: '知識庫', + knowledge: '知識', + faq_entry: 'FAQ 條目', + knowledge_tag: '標籤', + data_source: '資料源', + knowledge_base_share: '共享', + knowledge_move: '知識移動', + wiki: 'Wiki' + }, + drawer: { + sectionSummary: '摘要', + sectionIdentifiers: '識別符號', + sectionTask: '任務資訊', + targetChange: '變更詳情' + }, + expanded: { + targetType: '物件型別', + targetId: '物件 ID', + actorId: '發起人 ID', + details: '詳情' + }, + columns: { + time: '時間', + action: '操作', + target: '物件', + actor: '發起人', + outcome: '結果' + } + } + }, + embedPublish: { + create: '新建嵌入渠道', + channelsTitle: '嵌入渠道', + disabled: '已停用', + empty: '暫無嵌入渠道', + allowedOrigins: '域名白名單', + embedCode: '嵌入程式碼', + widgetCode: '浮窗指令碼', + copyCode: '複製程式碼', + channelKey: '渠道金鑰', + channelKeyDesc: '用於第三方網站接入的長期金鑰,請妥善保管', + channelKeyHint: '載入渠道金鑰失敗,請關閉後重新開啟或重新整理頁面重試。', + channelKeyLoadFailed: '載入渠道金鑰失敗', + channelKeyUnavailable: '金鑰不可用', + resetKeyTitle: '重置渠道金鑰', + resetKeyConfirmOk: '確認重置', + resetKeyConfirmBody: '重置後,舊的渠道金鑰會立即失效,所有已部署的嵌入程式碼必須更換為新金鑰才能繼續訪問。此操作不可撤銷。', + resetKeySuccess: '渠道金鑰已重置,新金鑰已顯示在輸入框中', + resetKeyFailed: '重置渠道金鑰失敗', + copyChannelKeyTitle: '複製渠道金鑰', + revealKey: '顯示金鑰', + hideKey: '隱藏金鑰', + createTitle: '新建嵌入渠道', + name: '名稱', + nameDesc: '後臺管理用,用於列表與渠道識別', + namePlaceholder: '例如:官網客服', + nameDefaultHint: '預設為「智慧體名 · 網頁嵌入」,可自行修改;留空儲存時也會使用該名稱', + defaultChannelName: '網頁嵌入', + defaultChannelNameWithAgent: '{agent} · 網頁嵌入', + welcomeMessage: '歡迎語', + welcomePlaceholder: '你好,有什麼可以幫您?', + welcomeMessageDesc: '訪客開啟嵌入聊天后、尚未發言時展示;留空則不顯示', + showSuggestedQuestions: '推薦問題', + showSuggestedQuestionsDesc: '訪客未發言前展示快捷提問,內容來自智慧體配置與關聯知識庫', + originsHint: '每行一個完整來源地址(如 https://shop.example.com),至少填寫一個;支援 *.example.com 子域通配', + originsRequired: '請至少填寫一個域名白名單', + originsInvalid: '域名格式無效:{origin}', + originsWildcardProd: '生產環境不允許使用萬用字元 *', + originsPlaceholder: 'https://shop.example.com', + rateLimitLabel: '每分鐘請求上限', + rateLimitDesc: '按訪客 IP 統計,每分鐘最多允許的嵌入介面請求次數;超出後暫時拒絕訪問,預設 30。', + rateLimitDayLabel: '每日請求總上限', + rateLimitDayDesc: '整個渠道每天(跨所有訪客 IP)允許的請求總數;用於限制釋出 Token 被複制後被刷量的成本,預設 10000。', + publishTokenWarning: '釋出 Token 會以明文出現在嵌入頁面原始碼中,任何訪問該網站的人都能看到,請將其視為「可公開金鑰」而非機密:切勿把含敏感資料的智慧體做成嵌入渠道;務必配置域名白名單與請求上限;Token 洩露時可隨時「重置 Token」作廢舊值。', + primaryColor: '主題色', + pageTitle: '頁面標題', + pageTitleDesc: '訪客聊天頁標題與瀏覽器標籤;優先於名稱展示', + pageTitlePlaceholder: 'AI 客服', + headerTitleMode: '頂欄標題', + headerTitleModeChannel: '固定渠道標題', + headerTitleModeSession: '跟隨會話標題', + headerTitleModeDesc: '固定渠道標題:始終顯示頁面標題;跟隨會話標題:首條訊息後按對話內容自動命名,未生成前顯示頁面標題', + tokenHint: '載入渠道金鑰失敗,請關閉後重新開啟該渠道。', + createdWithToken: '嵌入渠道已建立,渠道金鑰已顯示在下方', + created: '嵌入渠道已建立', + updated: '嵌入渠道已更新', + saveFailed: '儲存失敗', + deleted: '已刪除', + copied: '已複製嵌入程式碼', + loadError: '載入失敗', + missingChannel: '缺少嵌入渠道或 Token', + invalidChannel: '無效的嵌入渠道', + sessionFailed: '無法建立對話會話,請稍後重試', + channelDisabled: '嵌入渠道已停用,請在 Agent 編輯器的「網頁嵌入」中重新啟用', + loading: '載入中...', + tabIframe: 'iframe', + tabWidget: '浮窗', + tabSecure: '安全模式', + widgetPosition: '浮窗位置', + widgetPreview: '浮窗預覽', + positionBottomRight: '右下角', + positionBottomLeft: '左下角', + positionTopRight: '右上角', + positionTopLeft: '左上角', + tokenCopied: '渠道金鑰已複製', + awaitingToken: '等待宿主頁面提供 Token…', + preview: '預覽', + previewIframeHint: '模擬第三方網站用 iframe 嵌入的效果(與複製程式碼一致)。', + previewWidgetHint: '模擬第三方網站載入浮窗指令碼後的效果;真實站點由宿主頁面透過 postMessage 傳遞 Token。', + previewMockPage: '模擬宿主頁面', + previewLoading: '正在載入預覽…', + previewUnavailable: '預覽暫時不可用,請確認渠道已啟用且 Redis 可用', + defaultChatTitle: 'AI 助手', + newChat: '新建對話', + sectionChannel: '渠道資訊', + sectionSecurity: '安全與限流', + sectionCapabilities: '對話能力', + allowWebSearch: '顯示聯網搜尋開關', + allowWebSearchDesc: '開啟後,訪客輸入框會顯示聯網搜尋按鈕,可自行開啟或關閉;不會預設開啟。僅當繫結的智慧體已啟用聯網搜尋時按鈕才會出現。', + allowFileUpload: '顯示檔案上傳', + allowFileUploadDesc: '開啟後,訪客可上傳圖片與文件附件。僅當繫結的智慧體已啟用圖片上傳時才會生效。', + webhookUrl: 'Webhook 地址', + webhookUrlPlaceholder: 'https://your-server.example.com/weknora/embed-events', + webhookUrlDesc: '可選。訪客發訊息與助手回覆完成時,WeKnora 會向該 HTTPS 地址 POST 事件(message_sent / message_received)。', + webhookSecret: 'Webhook 簽名金鑰', + webhookSecretPlaceholder: '用於 HMAC-SHA256 簽名(X-WeKnora-Signature)', + webhookSecretKeep: '留空表示不修改已儲存的金鑰', + webhookSecretDesc: '可選。配置後請求體會帶 sha256 簽名頭,便於你的服務端校驗來源。', + agentWebSearchDisabledHint: '當前智慧體未啟用聯網搜尋,訪客端不會顯示聯網按鈕。請先在智慧體設定中開啟聯網搜尋。', + agentImageUploadDisabledHint: '當前智慧體未啟用圖片上傳,訪客端不會顯示上傳按鈕。請先在智慧體設定中開啟圖片上傳。', + sectionAppearance: '外觀與展示', + sectionDeploy: '嵌入到網頁', + sectionWebhook: '事件回呼', + stepChannel: '渠道資訊', + stepSecurity: '安全限流', + stepCapabilities: '對話能力', + stepAppearance: '外觀展示', + stepWebhook: '事件回呼', + stepDeploy: '網頁嵌入', + deployIntro: '選擇嵌入方式並複製下方程式碼到您的網頁;需要鑑權或輪換金鑰時,可在頁面底部的「渠道金鑰」區域操作。', + deployStepEmbed: '複製嵌入程式碼', + deployStepEmbedDesc: '選擇嵌入方式,將程式碼貼上到第三方頁面即可。', + embedIframeDesc: '適合在頁面固定區域嵌入整頁聊天。', + embedWidgetDesc: '適合右下角浮窗,點選圖示展開聊天面板。', + embedSecureDesc: '推薦:釋出 Token 只儲存在你自己的後端,頁面只拿到短時權杖,瀏覽器永遠看不到長期金鑰。', + deployAfterSaveHint: '儲存渠道後,可在此複製渠道金鑰與嵌入程式碼。', + widgetTokenNote: '浮窗指令碼需包含渠道金鑰;iframe 會在載入時自動完成憑證交換。', + secureTokenNote: '頁面不再包含釋出 Token,而是指向你後端的取權杖介面(data-token-endpoint)。你的後端用釋出 Token 換取 30 分鐘的短時權杖返回給頁面,浮窗會在到期前自動重新整理。', + secureServerLabel: '服務端取權杖介面示例(釋出 Token 僅儲存在服務端)', + tabServerNode: 'Node.js', + tabServerGo: 'Go', + enabled: '啟用渠道', + deleteConfirm: '確定刪除該嵌入渠道?已部署的網站程式碼將失效。', + defaultLocale: '預設語言', + defaultLocaleDesc: '訪客開啟聊天時使用的介面語言;留空則跟隨瀏覽器或宿主頁面透過 Widget 設定的 locale。', + defaultLocaleBrowser: '跟隨瀏覽器 / 宿主' + }, + knowledgeList: { + create: '新建知識庫', + subtitle: '管理和組織您的知識庫,支援文件型和問答型知識庫', + sharedToOrgs: '已共享給 {count} 個空間', + uninitializedBanner: '部分知識庫尚未初始化,需要先在設定中配置模型資訊才能新增知識文件', + uploadProgress: { + uploadingTitle: '正在向「{name}」上傳資料夾中的文件', + detail: '已完成 {completed}/{total} 個檔案', + keepPageOpen: '請保持頁面開啟,上傳完成後會自動重新整理解析狀態。', + completedTitle: '「{name}」的上傳已完成', + completedDetail: '共上傳 {total} 個檔案,正在重新整理列表檢視解析狀態...', + refreshing: '正在重新整理列表並獲取最新解析狀態...', + errorTip: '部分檔案上傳失敗,請檢視右上角通知詳情。', + unknownKb: '知識庫 {id}' + }, + features: { + knowledgeGraph: '知識圖譜', + multimodal: '多模態', + questionGeneration: '問題生成', + wiki: 'Wiki' + }, + detail: { + title: '共享知識庫', + sourceType: '來源方式', + sourceTypeKbShare: '知識庫直接共享到本空間', + sourceTypeAgent: '智慧體可訪問(透過共享智慧體可見)', + sourceOrg: '來源空間', + sourceFromAgent: '智慧體', + agentKbStrategy: '智慧體知識庫策略', + agentKbStrategyAll: '全部知識庫', + agentKbStrategySelected: '指定知識庫', + agentKbStrategyNone: '不使用知識庫', + sharedAt: '共享時間', + myPermission: '我的許可權', + goToKb: '進入知識庫' + }, + messages: { + deleted: '已刪除', + deleteFailed: '刪除失敗', + duplicateSuccess: '知識庫副本已建立(不包含知識內容)', + duplicateFailed: '建立知識庫副本失敗' + }, + sections: { + pinned: '置頂', + mine: '我建立的', + tenantOthers: '本空間 · 其他成員', + tenantReadonly: '本空間 · 僅檢視', + sharedByMe: '我共享的', + sharedEditable: '共享給我 · 可編輯', + sharedReadonly: '共享給我 · 僅檢視' + }, + pin: { + pin: '置頂', + unpin: '取消置頂', + pinSuccess: '已置頂', + unpinSuccess: '已取消置頂', + failed: '操作失敗' + }, + menu: { + viewDetails: '檢視詳情', + duplicate: '建立副本' + }, + delete: { + confirmTitle: '刪除確認', + confirmMessage: '確認要刪除知識庫"{name}"?刪除後不可還原', + confirmButton: '確認刪除' + }, + empty: { + title: '暫無知識庫', + description: '點選左側快捷操作"新建知識庫"按鈕建立第一個知識庫', + sharedTitle: '暫無共享知識庫', + sharedDescription: '您可以加入共享空間或請求他人共享知識庫給您', + favoritesTitle: '暫無收藏', + favoritesDescription: '在知識庫卡片右上角點選星標即可收藏', + recentsTitle: '暫無最近訪問', + recentsDescription: '最近開啟過的知識庫會出現在這裡' + } + }, + createChat: { + title: 'Hi,我是 WeKnora,讓你的知識觸手可及', + newSessionTitle: '新會話', + messages: { + createFailed: '建立會話失敗', + createError: '建立會話失敗,請稍後重試' + } + }, + input: { + addModel: '新增模型', + placeholder: '直接向模型提問', + placeholderWithContext: '輸入問題,將基於上方選中的知識庫/檔案回答', + placeholderWebOnly: '輸入問題,將結合網路搜尋回答', + placeholderKbAndWeb: '輸入問題,將基於知識庫和網路搜尋回答', + placeholderAgent: '向 {name} 提問', + agentMode: '智慧推理', + normalMode: '快速問答', + normalModeDesc: '基於知識庫的 RAG 問答', + agentModeDesc: '多步思考,深度分析', + agentMissingAllowedTools: '允許的工具', + agentMissingSummaryModel: '對話模型', + agentMissingRerankModel: '重排模型', + customAgentMissingSummaryModel: '對話模型', + customAgentMissingRerankModel: '重排模型', + goToAgentEditor: '前往配置 →', + agentNotReadyDetail: '智慧體「{agentName}」未就緒,需要配置以下內容:{reasons}', + sharedAgentNotReadyDetail: '共享智慧體「{agentName}」尚未就緒(缺少:{reasons}),請聯絡分享方管理員完成配置。', + knowledgeBase: '知識庫', + knowledgeBaseWithCount: '知識庫({count})', + notConfigured: '未配置', + sharedAgentModelLabel: '共享智慧體配置的模型', + noModel: '暫無可用模型', + stopGeneration: '停止生成', + send: '傳送', + webSearchDisabledByAgent: '當前智慧體已禁用網路搜尋', + kbLockedByAgent: '當前智慧體已鎖定知識庫配置', + kbDisabledByAgent: '當前智慧體已禁用知識庫功能', + modelLockedByAgent: '當前智慧體已鎖定模型配置', + imageUploadDisabledByAgent: '當前智慧體未啟用圖片上傳', + goToAgentSettings: '去設定智慧體', + messages: { + enterContent: '請先輸入內容!', + replying: '正在回覆中,請稍後再試!', + agentSwitchedOn: '已切換到智慧推理', + agentSwitchedOff: '已切換到快速問答', + agentSelected: '已選擇智慧體「{name}」', + webSearchNotConfigured: '未配置網路搜尋引擎,請先在設定中完成搜尋引擎選擇與介面配置。', + webSearchEnabled: '網路搜尋已開啟', + webSearchDisabled: '網路搜尋已關閉', + sessionMissing: '會話 ID 不存在', + messageMissing: '無法獲取訊息 ID,請重新整理頁面後重試', + stopSuccess: '已停止生成', + stopFailed: '停止失敗,請重試' + }, + webSearch: { + toggleOn: '開啟網路搜尋', + toggleOff: '關閉網路搜尋', + notConfigured: '未配置網路搜尋引擎' + } + }, + manualEditor: { + description: '使用 Markdown 編寫知識內容,支援實時預覽', + defaultTitlePrefix: '新建文件', + noDocumentKnowledgeBases: '暫無可用的文件型知識庫,請先建立一個文件型知識庫', + actions: { + cancel: '取消', + saveDraft: '暫存草稿', + publish: '釋出入庫' + }, + loading: { + content: '正在載入內容', + preparing: '正在準備編輯器' + }, + status: { + draftTag: '當前狀態:草稿', + publishedTag: '當前狀態:已釋出', + lastUpdated: '最近更新:{time}' + }, + form: { + knowledgeBaseLabel: '目標知識庫', + knowledgeBasePlaceholder: '請選擇知識庫', + titleLabel: '知識標題', + titlePlaceholder: '請輸入標題', + contentPlaceholder: '支援 Markdown 語法,可使用 # 標題、列表、程式碼塊等' + }, + success: { + draftSaved: '草稿已儲存', + published: '知識已釋出並開始索引' + }, + warning: { + selectKnowledgeBase: '請選擇目標知識庫', + enterTitle: '請輸入知識標題', + enterContent: '請輸入知識內容', + contentTooShort: '內容過短,建議補充更多資訊後再發布' + }, + error: { + fetchDetailFailed: '獲取知識詳情失敗', + saveFailed: '儲存失敗,請稍後重試' + }, + labels: { + currentKnowledgeBase: '當前知識庫' + }, + section: { + basic: '基本資訊', + content: '知識內容' + }, + title: { + edit: '編輯 Markdown 知識', + create: '線上編輯 Markdown 知識' + }, + preview: { + empty: '暫無內容' + }, + view: { + editLabel: '返回編輯', + previewLabel: '預覽內容' + }, + toolbar: { + bold: '加粗', + italic: '斜體', + strike: '刪除線', + inlineCode: '行內程式碼', + heading1: '一級標題', + heading2: '二級標題', + heading3: '三級標題', + bulletList: '無序列表', + orderedList: '有序列表', + taskList: '任務列表', + blockquote: '引用', + codeBlock: '程式碼塊', + link: '插入連結', + image: '插入圖片', + table: '插入表格', + horizontalRule: '分割線' + }, + table: { + column1: '列1', + column2: '列2', + cell: '內容' + }, + placeholders: { + heading: '標題{level}', + listItem: '列表項', + taskItem: '任務項', + quote: '引用內容', + code: '程式碼內容', + linkText: '連結文字', + imageAlt: '描述', + bold: '加粗文字', + italic: '斜體文字', + strike: '刪除線', + inlineCode: 'code' + } + }, + file: { + upload: '上傳檔案' + }, + mentionDetail: { + readOnlyFromAgent: '僅在此對話中只讀,不顯示在知識庫列表中', + faqCount: '共 {count} 條問答', + kbCount: '共 {count} 個文件', + belongsToKb: '所屬知識庫:', + belongsToOrg: '所屬空間:', + noCompatibleKbForAgent: '當前智慧體的工具與作用域內知識庫的能力不匹配,暫無可引用的知識庫。' + }, + common: { + add: '新增', + me: '我', + confirm: '確認', + cancel: '取消', + save: '儲存', + delete: '刪除', + edit: '編輯', + copy: '複製', + copied: '已複製', + default: '預設', + create: '建立', + download: '下載', + refresh: '重新整理', + loading: '載入中...', + noData: '暫無資料', + noMoreData: '已載入全部內容', + error: '錯誤', + success: '成功', + failed: '失敗', + info: '資訊', + selectAll: '全選', + yes: '是', + no: '否', + close: '關閉', + back: '返回', + next: '下一步', + finish: '完成', + all: '全部', + clear: '清空', + website: '官方網站', + clawhubSkill: 'Claw Skill', + github: 'GitHub', + githubStarTip: '在 GitHub 開啟倉庫,若覺得有用歡迎點個 Star', + on: '開啟', + off: '關閉', + confirmDelete: '確認刪除', + deleteSuccess: '刪除成功', + deleteFailed: '刪除失敗', + updateSuccess: '更新成功', + saveSuccess: '儲存成功', + saveFailed: '儲存失敗', + file: '檔案', + knowledgeBase: '知識庫', + noResult: '無結果', + remove: '移除', + defaultUser: '使用者', + copyFailed: '複製失敗', + retry: '重試', + expand: '展開', + collapse: '收起' + }, + authStore: { + errors: { + parseUserFailed: '解析使用者資訊失敗', + parseTenantFailed: '解析空間資訊失敗', + parseKnowledgeBasesFailed: '解析知識庫列表失敗', + parseCurrentKnowledgeBaseFailed: '解析當前知識庫失敗' + } + }, + auth: { + login: '登入', + logout: '退出', + oidcLogin: '使用 OIDC 登入', + oidcLoginWithProvider: '使用 {provider} 登入', + redirectingToOIDC: '正在跳轉到身份提供商...', + orContinueWith: '或使用以下方式繼續', + oidcLoginFailed: 'OIDC 登入失敗', + username: '使用者名稱', + email: '信箱', + password: '密碼', + confirmPassword: '確認密碼', + loginSuccessTitle: '登入成功', + loginSuccessContent: '歡迎,你已進入 {name}', + loggingIn: '登入中...', + register: '註冊', + registering: '註冊中...', + createAccount: '建立帳號', + haveAccount: '已有帳號?', + backToLogin: '返回登入', + loginHint: '登入以繼續使用;首次使用請在下方建立帳號。', + firstTime: '首次使用 WeKnora?', + registerSuccess: '註冊成功,請登入', + registerFailed: '註冊失敗', + subtitle: 'RAG 問答、ReAct 智慧體與 Wiki 知識庫,大模型驅動的企業級知識框架', + registerSubtitle: '建立帳號並開始使用 WeKnora', + emailPlaceholder: '輸入信箱地址', + passwordPlaceholder: '輸入密碼(8-32個字元,包含字母和數字)', + confirmPasswordPlaceholder: '再次輸入密碼', + usernamePlaceholder: '輸入使用者名稱', + emailRequired: '請輸入信箱地址', + emailInvalid: '請輸入正確的信箱格式', + passwordRequired: '請輸入密碼', + passwordMinLength: '密碼至少8個字元', + passwordMaxLength: '密碼不能超過32個字元', + passwordMustContainLetter: '密碼必須包含字母', + passwordMustContainNumber: '密碼必須包含數字', + usernameRequired: '請輸入使用者名稱', + usernameMinLength: '使用者名稱至少2個字元', + usernameMaxLength: '使用者名稱不能超過20個字元', + usernameInvalid: '使用者名稱只能包含字母、數字、下劃線和中文字元', + confirmPasswordRequired: '請確認密碼', + passwordMismatch: '兩次輸入的密碼不一致', + loginError: '登入錯誤,請檢查信箱或密碼', + loginErrorRetry: '登入錯誤,請稍後重試', + registerError: '註冊錯誤,請稍後重試', + workspaceOnboarding: { + title: '選擇你的工作空間', + create: '建立空間', + invitations: '檢視邀請', + loadingPolicy: '正在確認可用的空間加入方式…', + policyLoadFailed: '暫時無法獲取空間許可權,請檢查網路後重試。', + retry: '重新載入', + inviteOnlyTitle: '等待加入工作空間', + inviteOnlyDescription: '當前系統不開放個人建立空間。你可以檢視並接受管理員發來的空間邀請。', + inviteOnlyNotice: '此帳號只能透過邀請加入已有空間', + inviteOnlyHelp: '還沒有邀請?請把你的註冊信箱提供給空間管理員,由管理員向你傳送邀請。' + } + }, + inviteRegister: { + bannerTitle: '您被邀請加入「{tenant}」', + bannerHint: '填寫下方資訊完成註冊,註冊成功後將自動加入該團隊。', + bannerHintLogin: '登入後將自動加入該團隊。', + loading: '正在校驗邀請連結…', + invalidTitle: '邀請連結無效或已撤銷', + invalidBody: '請聯絡邀請人重新傳送連結,或前往登入使用現有帳號。', + backToLogin: '返回登入', + title: '完成註冊', + subtitle: '您被邀請加入「{tenant}」', + email: '信箱', + emailPlaceholder: 'your{\'@\'}example.com', + emailHint: '用您自己的信箱註冊即可。', + emailInvalid: '請輸入有效的信箱地址', + username: '姓名', + usernamePlaceholder: '請輸入您的姓名', + password: '設定密碼', + passwordPlaceholder: '至少 6 位', + confirmPassword: '確認密碼', + submit: '完成註冊', + submitting: '提交中…', + success: '註冊成功,正在進入工作空間…', + joined: '已加入該團隊', + failed: '註冊失敗,請稍後重試', + usernameRequired: '請輸入姓名', + passwordTooShort: '密碼至少 6 位', + passwordMismatch: '兩次輸入的密碼不一致' + }, + initialization: { + skip: '跳過', + next: '下一步' + }, + graphSettings: { + title: '知識圖譜配置', + description: '配置實體-關係提取功能,自動從文字中抽取實體和關係構建知識圖譜(注意:這與 Wiki 知識庫中的「頁面連結圖譜」是兩回事——前者是基於 LLM 的實體-關係圖,後者是 Wiki 頁面之間的引用關係圖)', + enableLabel: '啟用實體關係提取', + enableDescription: '開啟後將自動從文字中提取實體和關係', + tagsLabel: '關係型別', + tagsDescription: '定義要提取的關係型別標籤,多個標籤用逗號分隔', + tagsPlaceholder: '輸入關係型別,如:工作於、同事、朋友等', + generateRandomTags: '生成隨機標籤', + sampleTextLabel: '示例文字', + sampleTextDescription: '用於測試實體關係提取的示例文字', + sampleTextPlaceholder: '輸入一段包含實體和關係的文字...', + customInstructionsLabel: '額外提取要求', + customInstructionsDescription: '補充領域範圍、實體篩選和屬性提取要求;系統仍負責結構化輸出協議', + customInstructionsPlaceholder: '例如:重點提取合同主體、金額、履約期限和違約責任…', + generateRandomText: '生成隨機文字', + entityListLabel: '實體列表', + entityListDescription: '從文字中提取的實體及其屬性', + nodeNamePlaceholder: '輸入實體名稱', + attributePlaceholder: '輸入屬性值', + addAttribute: '新增屬性', + manageEntitiesLabel: '管理實體', + manageEntitiesDescription: '新增或刪除實體節點', + addEntity: '新增實體', + relationListLabel: '關係列表', + relationListDescription: '定義實體之間的關係連線', + selectEntity: '選擇實體', + selectRelationType: '選擇關係型別', + manageRelationsLabel: '管理關係', + manageRelationsDescription: '新增或刪除實體間的關係', + addRelation: '新增關係', + extractActionsLabel: '提取操作', + extractActionsDescription: '執行實體關係提取或管理示例資料', + startExtraction: '開始提取', + extracting: '提取中...', + defaultExample: '預設示例', + clearExample: '清除示例', + completeModelConfig: '請先完成模型配置', + tagsGenerated: '標籤生成成功', + tagsGenerateFailed: '標籤生成失敗', + textGenerated: '文字生成成功', + textGenerateFailed: '文字生成失敗', + pleaseInputText: '請先輸入示例文字', + extractSuccess: '實體關係提取成功', + extractFailed: '實體關係提取失敗', + exampleLoaded: '示例已載入', + exampleCleared: '示例已清除', + disabledWarning: '知識圖譜資料庫未啟用,實體關係提取功能將無法使用', + howToEnable: '如何啟用知識圖譜?' + }, + retrievalSettings: { + title: '搜尋設定', + description: '配置知識庫搜尋和訊息搜尋的全域性檢索引數', + embeddingTopKLabel: '向量檢索數量 (Top K)', + vectorThresholdLabel: '向量相似度閾值', + keywordThresholdLabel: '關鍵詞匹配閾值', + rerankTopKLabel: 'Rerank 數量 (Top K)', + rerankThresholdLabel: 'Rerank 閾值', + rerankModelLabel: 'Rerank 模型', + rerankModelDescription: '選擇用於搜尋結果重排序的模型', + rerankModelRequired: '請選擇 Rerank 模型,搜尋功能需要此模型對結果進行重排序', + toasts: { + saveSuccess: '檢索配置已儲存', + saveFailed: '儲存配置失敗: {message}' + } + }, + memorySettings: { + title: '我的記憶', + description: '這裡是助手跨會話記住的關於你的內容。你可以隨時檢視、修改和刪除,刪除後不會再被使用。', + workspaceDisabled: '當前空間尚未開啟長期記憶,管理員開啟後這裡的開關才會生效。', + enableLabel: '為我啟用長期記憶', + enableDescription: '關閉後助手不再讀取或新增你的記憶,已有記憶會保留,重新開啟即可繼續使用。', + agentDisabledHint: '單個智慧體也可以單獨關閉長期記憶。被關閉的智慧體在對話中既不會讀取你的記憶,也不會新增記憶;換用其他智慧體不受影響。', + usage: { + title: '記憶何時會被使用', + iconHint: '檢視哪些記憶會在對話裡被使用', + intro: '僅「生效中」會進入對話。', + rows: { + alwaysOn: { + label: '每輪都會帶上', + text: '個人資訊、偏好,以及明確說「記住」的內容' + }, + situational: { + label: '相關時才用', + text: '事實、在辦事項' + }, + interest: { + label: '理解常問方向', + text: '長期關注,不一定每輪都引用' + }, + tracking: { + label: '先觀察再記住', + text: '常問方向會先計數,達到次數後才成為長期關注' + }, + documents: { + label: '常用資料', + text: '反覆用來回答你的文件,檢索時會稍稍優先' + }, + pending: { + label: '確認後才生效', + text: '待確認的推斷' + }, + inactive: { + label: '不再使用', + text: '已被更新、已歸檔' + } + } + }, + listTitle: '記憶列表', + listCount: '共 {count} 條', + statusActive: '生效中', + statusSuperseded: '已被更新', + statusArchived: '已歸檔', + statusPending: '待確認', + statusTracking: '觀察中', + statusDocuments: '常用資料', + confirmGuess: '是的', + rejectGuess: '不是', + pendingHint: '這些是系統從你的提問裡推斷出來的,確認之前不會被使用。', + trackingHint: '這些是你反覆問到、但還沒達到「長期關注」次數的主題。記下來之前不會進入對話。', + documentsHint: '這些文件在回答裡反覆出現,檢索會稍微偏向它們。停止跟蹤後不再加權,再被引用兩次會重新出現。', + supersededHint: '這些內容已被更新的記憶替代,不會再進入對話,只作為變更記錄保留。', + archivedHint: '已歸檔的記憶不會再進入對話。超出每人上限後,較少用到的條目會被自動收起。', + pendingEmptyTitle: '沒有待確認的推斷', + pendingEmptyDescription: '當系統從你的提問裡推斷出關於你的資訊時,會先放在這裡等你確認。', + trackingEmptyTitle: '沒有正在觀察的主題', + trackingEmptyDescription: '自動提煉開啟後,系統會先統計你常問的方向,達到次數後再記為長期關注。', + documentsEmptyTitle: '還沒有常用資料', + documentsEmptyDescription: '同一份文件被回答引用兩次以上,就會出現在這裡。', + supersededEmptyTitle: '還沒有被更新的記憶', + supersededEmptyDescription: '同一主題被新說法覆蓋時,舊內容會留在這裡。在本頁直接編輯是原地改寫,不會產生這條記錄。', + archivedEmptyTitle: '還沒有歸檔的記憶', + archivedEmptyDescription: '生效中超過上限(預設 200 條)時,較少用到的會自動收起;帶過期時間的事項到期後也會進來。', + documentsHits: '已引用 {hits} 次', + untitledDocument: '未命名文件', + openDocument: '開啟文件', + openDocumentUnavailable: '無法開啟:缺少知識庫資訊', + stopTrackingDocument: '停止跟蹤', + stopTrackingDocumentConfirm: '停止用這份文件做個性化檢索?之後再被引用兩次會重新出現。', + stopTrackingDocumentSuccess: '已停止跟蹤這份資料', + stopTrackingDocumentFailed: '停止跟蹤失敗', + trackingProgress: '已問 {hits} 次,滿 {threshold} 次後記為長期關注', + trackingReady: '已達到次數,可以記為長期關注', + trackingAliases: '也問過:{aliases}', + promoteTopic: '記為關注', + dismissTopic: '不再跟蹤', + dismissTopicConfirm: '停止跟蹤這個主題?之後再問到也不會自動記為長期關注。', + promoteSuccess: '已記為長期關注', + promoteFailed: '記為關註失敗', + dismissSuccess: '已停止跟蹤這個主題', + dismissFailed: '停止跟蹤失敗', + confirmSuccess: '已確認', + confirmFailed: '確認失敗', + rejectSuccess: '已否決,不會再次推斷', + rejectFailed: '否決失敗', + export: '匯出', + consolidate: '整理', + consolidateConfirm: '合併意思接近的條目,舊內容會留在「已被更新」。確定整理?', + consolidateSuccess: '整理完成:合併 {merged} 組,到期歸檔 {expired} 條,過期事項降權 {demoted} 條', + consolidateNothing: '沒有發現需要整理的內容', + consolidateTooFewItems: '記憶還太少,暫時沒有整理的必要', + consolidateNoCandidates: '沒有發現意思相近的記憶,無需合併', + consolidateModelDeclined: '模型看過了,這些記憶說的不是同一件事,未做合併', + consolidateTooSoon: '剛整理過,請稍後再試', + consolidateModelUnavailable: '模型不可用,為避免誤合併,本次沒有改動任何記憶', + consolidateFailed: '整理失敗', + clear: '清空', + clearConfirm: '將永久刪除你的全部記憶、正在觀察的主題和常用資料,此操作不可撤銷。確定繼續嗎?', + deleteConfirm: '永久刪除這條記憶?', + add: '新增', + addPlaceholder: '用一句話寫下你希望助手記住的事', + addTitle: '新增記憶', + addKindLabel: '型別', + addContentLabel: '內容', + emptyTitle: '還沒有記憶', + emptyDescription: '在對話裡說「記住:……」,或者在上面直接新增一條。', + kinds: { + profile: '個人資訊', + preference: '偏好', + fact: '事實', + task: '在辦事項', + interest: '長期關注' + }, + kindHints: { + profile: '之後每輪對話都會帶上', + preference: '之後每輪對話都會帶上', + fact: '只在問題相關時才會用到', + task: '只在問題相關時才會用到', + interest: '用來理解你常問的方向,不一定每輪都引用' + }, + origins: { + explicit: '你要求記住', + extracted: '自動提煉', + manual: '手動新增' + }, + toasts: { + enabled: '已為你開啟長期記憶', + disabled: '已關閉長期記憶', + added: '已新增', + updated: '已更新', + deleted: '已刪除', + cleared: '已刪除 {count} 條記憶', + saveFailed: '操作失敗:{message}' + } + }, + memoryWorkspaceSettings: { + title: '長期記憶', + description: '讓助手跨會話記住成員說過的個人資訊、偏好、事實與在辦事項。', + introTitle: '預設關閉,需要你顯式開啟', + introDescription: '長期記憶會保留成員在對話中說過的內容,因此預設不開啟。開啟後每位成員的記憶彼此隔離,成員可以在「我的記憶」裡隨時檢視、修改、刪除或整體關閉。生效中的個人資訊與偏好會進入之後的每一輪對話;事實和在辦事項只在相關問題時召回。', + enableLabel: '在本空間啟用長期記憶', + enableDescription: '關閉後本空間的所有會話都不會讀取或寫入記憶。', + writeModeLabel: '記憶寫入方式', + writeModeDescription: '決定什麼內容會被記住。', + writeModeExplicit: '僅顯式記錄', + writeModeAuto: '自動提煉', + writeModeExplicitHint: '只記錄成員明確說「記住:……」的內容,以及在記憶頁手動新增的條目,不額外呼叫模型。', + writeModeAutoHint: '在此基礎上,會話結束後在後臺呼叫一次模型,從成員自己說過的話裡提煉值得長期保留的內容。', + extractModelLabel: '提煉模型', + extractModelDescription: '留空則使用該次會話所用的模型。', + extractDelayLabel: '挖掘延遲', + extractDelayDescription: '一輪對話結束後等待多久再挖掘。等一等可以讓一次模型呼叫覆蓋使用者連著發的幾條訊息。', + extractMinIntervalLabel: '兩次挖掘的最小間隔', + extractMinIntervalDescription: '同一個人兩次挖掘之間至少間隔多久,用來控制成本。間隔內產生的訊息不會被丟棄,會順延到下一次挖掘一併處理。', + vectorRecallLabel: '按語義召回記憶', + vectorRecallDescription: '除了字面匹配,再按含義匹配。使用者換個說法之後,原來那條記憶仍然能被找到——而多數記憶遲早會被換說法。每輪問答多一次向量呼叫,超時會自動退回字面匹配。', + embeddingModelLabel: '記憶 Embedding 模型', + embeddingModelDescription: '語義召回只使用這一個模型,與各知識庫繫結的 Embedding 無關。不選則只按字面匹配。換模型後,新寫入立刻用新模型;舊記憶在補上新向量之前,語義召回找不到它們,只靠字面匹配。', + conditioningLabel: '讓記憶參與檢索', + conditioningDescription: '開啟後,記憶會參與查詢改寫和文件排序,而不只是附加到回答提示裡。這是記憶在知識庫產品裡真正起作用的地方。', + interestThresholdLabel: '成為長期關注的次數', + interestThresholdDescription: '同一個主題被問到這麼多次後,才會作為長期關注記下來。設為 1 會把每個一次性問題都記下來,通常太吵。', + instructionsLabel: '自定義挖掘規則', + instructionsDescription: '追加到挖掘提示詞裡的空間規則,用來表達產品猜不到的策略,例如「永遠不要記錄客戶姓名」。', + instructionsPlaceholder: '一行一條規則,例如:永遠不要記錄客戶姓名', + maxItemsLabel: '每人記憶上限', + maxItemsDescription: '超出後按重要度與使用時間歸檔最低的若干條,歸檔的記憶仍可在「我的記憶」裡檢視。', + toasts: { + saveSuccess: '長期記憶配置已儲存', + saveFailed: '儲存失敗:{message}' + } + }, + chatHistorySettings: { + title: '訊息管理', + description: '配置聊天曆史知識庫,將對話訊息自動向量化索引,實現語義搜尋', + enableLabel: '啟用訊息索引', + enableDescription: '開啟後,新的對話訊息將自動索引到知識庫,支援向量搜尋', + embeddingModelLabel: 'Embedding 模型', + embeddingModelDescription: '選擇用於訊息向量化的 Embedding 模型', + embeddingModelLocked: '已有訊息被索引,Embedding 模型不可修改(修改需清空索引資料)', + statsTitle: '索引統計', + statsIndexedMessages: '已索引訊息', + statsNotConfigured: '訊息索引未配置', + statsNotConfiguredDesc: '啟用並選擇 Embedding 模型後,對話訊息將自動向量化索引', + toasts: { + saveSuccess: '訊息管理配置已儲存', + saveFailed: '儲存配置失敗: {message}' + } + }, + vectorStoreSettings: { + title: '向量資料庫引擎', + description: '註冊和管理用於知識庫搜尋的向量資料庫例項。', + basicSection: '基本資訊', + storesTitle: '向量資料庫', + addStore: '新增資料庫', + editStore: '編輯資料庫', + deleteConfirm: '確定要刪除此向量資料庫嗎?', + emptyDesc: '尚未配置向量資料庫。點選"新增資料庫"開始設定。', + engineTypeLabel: '引擎型別', + nameLabel: '名稱', + namePlaceholder: '例如:my-vector-store', + connectionInfo: '連線資訊', + advancedIndexConfig: '高階設定', + envTag: 'DEFAULT', + testConnection: '測試連線', + testing: '測試中...', + immutableNotice: '建立後無法更改引擎型別、連線和索引設定。\n如需更改,請刪除後重新建立。', + insecureSkipVerifyWarning: '關閉 TLS 證書校驗會使連線面臨中間人攻擊風險。僅可用於自簽名證書的開發叢集,切勿在生產環境使用。', + toasts: { + storeCreated: '向量資料庫已建立', + storeUpdated: '向量資料庫已更新', + storeDeleted: '向量資料庫已刪除', + testSuccess: '連線測試成功', + testFailed: '連線測試失敗', + duplicateName: '同名向量資料庫已存在', + errorGeneric: '發生錯誤,請重試。' + }, + validation: { + nameRequired: '名稱為必填項', + engineTypeRequired: '引擎型別為必填項', + fieldRequired: '{field}為必填項', + indexNamePattern: '必須以字母開頭,僅允許字母、數字、下劃線和連字元(最多128個字元)' + } + }, + webSearchSettings: { + title: '網路搜尋配置', + description: '配置網路搜尋功能,在回答問題時可以從網際網路獲取實時資訊補充知識庫內容', + basicSection: '基本資訊', + credentialsSection: '連線配置', + optionsSection: '選項', + providersTitle: '搜尋引擎配置', + addProvider: '新增搜尋引擎', + editProvider: '編輯搜尋引擎', + deleteConfirm: '確定要刪除此搜尋引擎配置嗎?', + providerNameLabel: '名稱', + providerNamePlaceholder: '例如:生產環境 Bing 搜尋', + providerTypeLabel: '引擎型別', + providerDescLabel: '備註', + providerDescPlaceholder: '可選,如:測試環境用', + engineIdLabel: '搜尋引擎 ID', + setAsDefault: '設為預設', + testConnection: '測試連線', + testing: '測試中...', + viewDocs: '檢視文件獲取金鑰', + noProvidersDesc: '新增一個網路搜尋引擎,為您的智慧體提供實時的網際網路資訊檢索能力。', + setAsDefaultDesc: '當智慧體沒有指定特定的搜尋引擎時,將預設使用此配置', + proxyUrlLabel: 'HTTP 代理', + proxyUrlPlaceholder: '例如 http://proxy.example.com:3128(可選,僅支援 http/https)', + proxyUrlHelp: '若環境訪問搜尋 API 需代理,在此填寫;留空則使用系統環境變數 HTTP(S)_PROXY。', + apiKeyLabel: 'API 金鑰', + apiKeyOptionalLabel: 'API 金鑰(可選)', + baseUrlLabel: '例項地址', + baseUrlPlaceholder: 'https://searxng.example.com', + apiKeyPlaceholder: '請輸入 API 金鑰', + toasts: { + providerCreated: '搜尋引擎配置已建立', + providerUpdated: '搜尋引擎配置已更新', + providerDeleted: '搜尋引擎配置已刪除', + testSuccess: '連線測試成功', + testFailed: '連線測試失敗' + } + }, + settings: { + modelManagement: '模型管理', + webSearchConfig: '網路搜尋', + autoCheckUpdate: '自動下載更新', + autoCheckUpdateDesc: '開啟後自動檢查並在後臺下載最新版本安裝包。', + vectorStoreEngine: '向量資料庫引擎', + parserEngine: '解析引擎', + storageEngine: '儲存引擎', + sandbox: { + title: '沙箱後端', + description: '管理智慧體技能使用的沙箱執行環境,每個智慧體可以選擇一份空間後端配置。', + editorDescription: '配置空間執行環境,Docker、本地程序、CubeSandbox 和 E2B 使用同一套管理流程。', + stepConnection: '連線', + stepTemplate: '模板', + stepRuntime: '執行配置', + setupProgress: '沙箱配置進度', + stepDescriptions: { + connection: '先配置後端並驗證連線,透過後再從叢集載入模板。', + template: '選擇當前叢集返回且已經就緒的執行模板。', + runtime: '配置執行引數和環境變數,然後儲存。', + }, + back: '上一步', + connectAndContinue: '連線並繼續', + loading: '載入沙箱配置...', + loadFailed: '載入沙箱配置失敗', + backend: '沙箱後端', + backendType: '沙箱型別', + backendTypePlaceholder: '選擇沙箱型別', + scriptPolicyLabel: '允許在沙箱中執行技能指令碼', + scriptPolicyDesc: '關閉後本空間所有智慧體只能閱讀技能內容,不再執行指令碼;已在執行的遠端沙箱需結束會話後才釋放。', + backendDescriptions: { + cube: '適合私有化或內網部署的自建 MicroVM 叢集', + e2b: 'E2B 託管服務或相容 E2B 的叢集', + docker: '每次在當前 WeKnora 主機啟動一個短生命週期容器執行指令碼', + local: '直接在 WeKnora 服務程序所在環境執行指令碼', + }, + addConfig: '新增沙箱後端', + viewClusterGuide: '叢集搭建指南', + configName: '配置名稱', + configNamePlaceholder: '如:生產 E2B', + configNameRequired: '請填寫配置名稱', + configDescription: '描述', + configDescriptionPlaceholder: '選填,用於區分多份同型別配置', + createTitle: '新增沙箱後端', + editTitle: '編輯沙箱後端', + sectionBasic: '基本資訊', + sectionConnection: '叢集連線', + sectionRuntimeEnvironment: '執行環境', + sectionTemplate: '執行模板', + sectionRuntime: '執行設定', + sectionEnvironment: '環境變數', + noConfigs: '還沒有沙箱後端配置。智慧體未選擇空間配置時不會執行技能指令碼。', + identityFieldHint: '該配置下有沙箱執行時,以下項無法修改:後端型別、API 端點、API Key、沙箱域名、Proxy 端點。', + viewSandboxes: '檢視沙箱佔用', + inventoryTitle: '沙箱佔用', + inventoryDrawerDesc: '該配置當前佔用的沙箱,以及受影響的會話與智慧體。', + inventoryFailed: '獲取沙箱佔用失敗', + sandboxCount: '沙箱數量', + sandboxCountUnknown: '未知(無法連線該後端)', + inventoryUnverifiableHint: '無法連線該後端,因此沙箱數量未知——這不代表沒有沙箱。', + sandboxesStillLive: '該配置仍有 {count} 個執行中或已暫停的沙箱,暫時無法修改身份欄位。', + blockedHint: '可結束或刪除這些會話(刪除會話會銷燬其沙箱),或新建一份配置並把智慧體指過去。', + unverifiableBlocked: '無法連線該後端核實是否仍有沙箱,因此不能覆蓋現有憑證。', + unverifiableSaveHint: '請先還原該後端的連通性;若已廢棄,可新建一份配置並把智慧體指過去。', + affectedSessions: '影響 {count} 個會話。', + affectedAgents: '以下智慧體正在使用該配置:{names}', + confirmDelete: '確定刪除沙箱後端「{name}」嗎?', + confirmDeleteWithAgents: '確定刪除沙箱後端「{name}」嗎?{agents}它們將在下次執行技能時報錯。', + deleteFailed: '刪除失敗', + deleted: '已刪除', + forceDeleteTitle: '無法核實沙箱佔用', + forceDeleteConfirm: '無法連線該後端核實是否仍有沙箱。若該後端已廢棄,可強制刪除這份配置;若只是暫時不可達,強制刪除會讓殘留沙箱無人回收。仍要強制刪除嗎?', + forceDelete: '強制刪除', + disableScripts: '禁用沙盒執行', + enableScripts: '啟用沙盒執行', + disableScriptsConfirm: + '禁用後,本空間內所有智慧體將無法在沙盒中執行技能指令碼;仍可閱讀技能內容。已在執行中的遠端沙盒不會自動銷燬,需結束或刪除相關會話後才會釋放。是否繼續?', + scriptsDisabled: '已禁用本空間沙盒執行', + scriptsEnabled: '已還原本空間沙盒執行', + policySaveFailed: '更新沙盒執行策略失敗', + legacyConfig: '已廢棄', + namedBackendHint: '空間配置是唯一執行時來源;智慧體沒有選擇配置時不會執行技能指令碼。', + weknoraTemplateTitle: 'WeKnora 標準模板', + weknoraDockerImage: 'WeKnora 標準映象', + weknoraDockerImageHint: '每次執行都會基於該映象建立一個隔離的短生命週期容器,不保留會話沙箱。', + localRuntimeWarning: '本地程序會直接在 WeKnora 伺服器上執行技能指令碼,不具備容器或 MicroVM 隔離。僅建議在可信的開發空間使用。', + weknoraTemplateOverview: 'WeKnora 負責提供標準執行環境。連線叢集後會自動發現模板,缺少標準模板時自動建立。', + weknoraTemplateDescription: '包含 WeKnora 技能所需的 Python、Node.js、CLI 工具、工作目錄和非 root 執行使用者。', + recommendedTag: '推薦', + templateNotConfigured: '未配置模板', + cardTemplateConfigured: '模板已配置', + cardCredentialMissing: '缺少 API Key', + cardTimeout: '超時 {sec}s', + cardTtl: '沙箱存活 {sec}s', + cardVolumeMounted: '已掛載卷', + cardEnvVars: '{count} 個環境變數', + cardPrivateEndpoints: '允許訪問私網', + imageNotConfigured: '未配置映象', + localRuntimeSummary: 'WeKnora 伺服器本地程序', + templateApplied: '已使用', + refreshTemplates: '重新整理模板', + templateSelectHelp: '模板由當前叢集實時返回,儲存時僅記錄模板 ID,無需手工複製。', + templateSelectPlaceholder: '先連線叢集並載入模板', + templateLoadHint: '填寫叢集連線後重新整理模板;若缺少 WeKnora 標準模板,系統會自動建立。', + templateLoadFailed: '模板列表載入失敗', + standardTemplateProvisioning: '已開始在叢集中建立 WeKnora 標準模板,請稍後重新整理檢視狀態', + templateNotReady: '所選模板尚未構建完成,請重新整理並等待狀態就緒', + connectionPassed: '連線驗證透過,以下模板均從當前叢集實時載入。', + connectionPassedTitle: '叢集連線成功', + templateStepHint: '叢集缺少標準模板時,WeKnora 會自動建立;模板就緒後才能繼續。', + loadingTemplates: '正在從叢集載入模板…', + templateBuildingHint: '標準模板正在自動構建,列表會自動重新整理。', + templateUntaggedHint: '構建已完成,但沒有構建帶 default 標籤,建立沙箱時無法解析。請在 E2B 刪除該模板,重新整理後 WeKnora 會重新構建。', + templateFailedReason: '構建失敗:{reason}', + noTemplates: '當前叢集未返回可用模板。', + templateReadyHint: '模板「{name}」已就緒並選中。', + templateProvisioningHint: '模板仍在構建中,狀態會自動重新整理。', + templateStatuses: { + ready: '已就緒', + building: '構建中', + untagged: '缺少 default 標籤', + failed: '失敗', + unknown: '未知', + }, + allowPrivateEndpoints: '允許訪問私網叢集地址', + allowPrivateEndpointsHint: '僅用於自建 Cube 等私網控制面;雲元資料等鏈路本地地址始終禁止訪問。', + howToBuildTemplate: '沙箱叢集搭建與模板說明', + noEnvVars: '暫無額外環境變數,僅新增技能確實需要的值。', + fieldRequired: '必填', + cubeApiKeyOptional: '可留空 —— 自建 CubeSandbox 通常無鑑權', + cubeApiKeyWhere: '自建叢集如何開啟鑑權', + e2bApiKeyHelp: '在 E2B 控制檯的 API Keys 頁面建立,通常以 e2b_ 開頭。', + e2bApiKeyWhere: '前往 E2B 控制檯獲取 API Key', + apiKeyPlaceholder: '貼上 API Key', + secretConfigured: '已配置金鑰(不可回看);輸入新值可輪換', + secretKeepHint: '已配置,留空表示不修改', + e2bApiUrlOptional: '可留空 —— 留空時使用 SDK 預設值', + e2bDomainOptional: '可留空 —— 留空時使用 SDK 預設值', + e2bProxyUrlOptional: '自建 E2B 相容叢集的資料面閘道器地址;留空表示按 sandbox domain 直連(E2B Cloud 用法)', + backends: { + disabled: '禁用', + local: '本地程序', + docker: 'Docker', + cube: 'CubeSandbox', + e2b: 'E2B', + }, + apiUrl: 'API 端點', + proxyUrl: 'Proxy 端點', + sandboxDomain: '沙箱域名', + apiKey: 'API Key', + templateId: '模板 ID', + httpTimeout: 'HTTP 超時(秒)', + httpTimeoutHelp: '呼叫沙箱後端管理介面的等待上限,超過即視為端點不可用。留空按 30 秒。', + sandboxTtl: '沙箱 TTL(秒)', + sandboxTtlHelp: '沙箱空閒多久後被遠端回收。設得太短,會話繼續時要重建沙箱;設得太長,閒置例項會一直計費。留空按後端預設值。', + dockerImage: 'Docker 映象', + defaultTimeout: '執行超時(秒)', + defaultTimeoutHelp: '單次技能指令碼允許執行的最長時間,超時會被強制終止。留空按 60 秒。', + envVars: '環境變數', + envKey: '變數名', + envValue: '變數值', + envVarsHint: '注入到該空間所有沙箱;值加密儲存,但對沙箱內指令碼可見,請勿放入指令碼不應讀取的金鑰。', + addRow: '新增變數', + removeRow: '刪除', + save: '儲存', + saved: '已儲存,對新建會話生效', + saveFailed: '儲存失敗', + testConnection: '測試連線', + deepCheck: '完整驗證', + recheck: '重新驗證', + deepCheckIntro: '儲存前可以跑一次「完整驗證」:真實建立一個臨時沙箱、執行一次指令碼並檢查出網,隨後自動銷燬。', + deepCheckConfirm: '完整驗證會執行一次臨時指令碼;遠端後端還會真實建立並銷燬一個沙箱,可能消耗少量沙箱時長。是否繼續?', + checkPassed: '檢測透過', + checkFailed: '檢測未透過', + checkScopeConnection: '本次只驗證了控制面:端點可達且憑證有效。是否真的能跑起指令碼還沒有驗證。', + checkScopeFull: '端點、憑證、模板、沙箱內執行與出網均已真實驗證。', + checkPendingHint: '{names} 需要「完整驗證」才能確認:會真實建立一個臨時沙箱、執行一次指令碼再銷燬。', + noVolumeSupport: '該後端不支援掛載卷,依賴共享卷的技能將不可用。', + skipReasons: { + needs_deep_check: '需完整驗證', + control_plane_unreachable: '控制面不可達,已跳過', + environment_unavailable: '執行環境不可用,已跳過', + sandbox_not_created: '沙箱未建立,已跳過', + sandbox_exec_failed: '沙箱內執行失敗,已跳過', + }, + checks: { + environment_available: '執行環境可用性', + client_build: '客戶端構建', + api_url_reachable: '端點可達性', + credential_valid: '憑證有效性', + template_exists: '模板存在性', + sandbox_exec: '沙箱內執行', + egress_available: '出網可用', + }, + }, + mcpService: 'MCP服務', + versionInfo: '版本資訊', + taskQueue: '任務佇列', + tenantInfo: '空間資訊', + workspaceSettings: '空間設定', + system: '系統設定', + storage: { + title: '儲存引擎', + description: '配置文件與圖片的儲存方式。此處設定各引擎引數,知識庫中僅選擇使用哪個引擎。', + basicSection: '基本配置', + modeSection: '部署模式', + credentialsSection: '憑證', + bucketSection: 'Bucket', + useSslDesc: '透過 HTTPS 訪問 MinIO', + loading: '載入中...', + retry: '重試', + defaultEngine: '預設引擎', + defaultEngineDesc: '新建知識庫時預設選用的儲存引擎', + engineLocal: 'Local(本地)', + engineCos: '騰訊雲 COS', + engineTos: '火山引擎 TOS', + engineOss: '阿里雲 OSS', + localTitle: 'Local(本地儲存)', + localDesc: '使用伺服器本地檔案系統儲存檔案,僅適合單機部署。', + available: '可用', + needsConfig: '需要配置', + configurable: '可配置', + pathPrefix: '路徑字首(可選)', + pathPrefixPlaceholder: '如 weknora/images', + prefixPlaceholder: '如 weknora', + bucketName: 'Bucket 名稱', + bucketPlaceholder: '儲存桶名稱', + minioDesc: 'S3 相容的自託管物件儲存,適合內網和私有雲部署。', + minioDocker: 'Docker 部署', + minioRemote: '遠端 MinIO', + minioDockerDetected: '已檢測到 Docker 部署的 MinIO 環境變數,連線資訊由環境變數提供,無需手動填寫。', + minioDockerNotDetected: '未檢測到 MinIO 環境變數(MINIO_ENDPOINT 等),請確認 Docker Compose 配置正確。', + minioRemoteHint: '連線到遠端 MinIO 服務,需要手動填寫連線資訊。', + cosTitle: '騰訊雲 COS', + cosDesc: '騰訊雲物件儲存服務,適合公有雲部署,支援 CDN 加速。', + cosSecretIdPlaceholder: '騰訊雲 API 金鑰 SecretId', + cosSecretKeyPlaceholder: '騰訊雲 API 金鑰 SecretKey', + cosAppIdPlaceholder: '騰訊雲帳號 AppID', + tosTitle: '火山引擎 TOS', + tosDesc: '火山引擎物件儲存服務(TOS),適合公有雲部署。', + tosAccessKeyPlaceholder: '火山引擎 Access Key', + tosSecretKeyPlaceholder: '火山引擎 Secret Key', + s3Title: 'AWS S3', + s3Desc: 'AWS S3 及相容的物件儲存服務,適合公有雲部署。', + s3AccessKeyPlaceholder: 'AWS Access Key', + s3SecretKeyPlaceholder: 'AWS Secret Key', + s3DefaultCredentialsHint: 'Access Key 與 Secret Key 同時留空時,將使用 AWS 預設憑證鏈(IAM Role、IRSA / Web Identity、環境變數或共享配置)。', + s3EndpointPlaceholder: '可選,留空使用 AWS 區域預設端點', + ks3Title: '金山雲 KS3', + ks3Desc: '金山雲物件儲存服務(KS3),適合公有雲部署。', + ks3AccessKeyPlaceholder: '金山雲 Access Key', + ks3SecretKeyPlaceholder: '金山雲 Secret Key', + ks3EndpointPlaceholder: 'e.g. ks3-cn-beijing.ksyuncs.com', + ks3RegionPlaceholder: 'e.g. BEIJING', + engineKs3: '金山雲 KS3', + obsTitle: '華為雲 OBS', + obsDesc: '華為雲物件儲存服務(OBS),適合公有雲部署。', + obsAccessKeyPlaceholder: '華為雲 Access Key', + obsSecretKeyPlaceholder: '華為雲 Secret Key', + obsEndpointPlaceholder: 'e.g. obs.cn-north-4.myhuaweicloud.com', + obsRegionPlaceholder: 'e.g. cn-north-4', + engineObs: '華為雲 OBS', + ossTitle: '阿里雲 OSS', + ossDesc: '阿里雲物件儲存服務(OSS),適合公有雲部署。', + ossAccessKeyPlaceholder: '阿里雲 Access Key', + ossSecretKeyPlaceholder: '阿里雲 Secret Key', + console: '控制檯', + docs: '文件', + testConnection: '測試連線', + loadFailed: '載入失敗', + saveSuccess: '儲存成功', + saveFailed: '儲存失敗', + unknownError: '未知錯誤', + requestFailed: '請求失敗' + }, + storageBackend: { + description: '管理檔案與圖片使用的儲存例項;同一種型別可以配置多個例項。', + empty: '尚未配置儲存例項', + defaultTag: '預設', + add: '新增儲存例項', + editTitle: '編輯儲存例項', + createTitle: '新增儲存例項', + editSubtitle: '修改此儲存例項的連線配置。', + createSubtitle: '為檔案與圖片新增一個儲存例項。', + basicSection: '基本資訊', + nameLabel: '名稱', + namePlaceholder: '例如:生產 COS、歸檔 COS', + providerLabel: '儲存型別', + modeLabel: '部署模式', + modeRemote: '遠端例項', + modeEnv: '環境變數', + connectionSection: '連線配置', + optionalPlaceholder: '可選', + advancedSection: '高階選項', + pathPrefixLabel: '路徑字首', + useSslDesc: '使用 HTTPS 訪問 MinIO', + forcePathStyleDesc: '使用 Path Style', + useTempBucketDesc: '使用臨時桶', + tempBucketLabel: '臨時桶', + tempBucketPlaceholder: '可選,用於臨時檔案', + tempRegionLabel: '臨時桶 Region', + tempRegionPlaceholder: '留空時使用主 Region', + testConnection: '測試連線', + localStorage: '本地儲存', + setDefault: '設為預設', + edit: '編輯', + delete: '刪除', + testSuccess: '連線成功', + testFailed: '連線失敗', + nameRequired: '請輸入名稱', + saveSuccess: '儲存成功', + saveFailed: '儲存失敗', + defaultUpdated: '預設儲存已更新', + deleteTitle: '刪除儲存例項', + deleteConfirm: '確定刪除“{name}”嗎?', + deleted: '已刪除', + deleteFailed: '刪除失敗' + }, + parser: { + title: '解析引擎', + description: '文件解析引擎狀態及配置。此處設定優先於服務端環境變數,留空則使用環境變數預設值。', + supportedFileTypes: '支援檔案型別', + statusSection: '狀態資訊', + configSection: '配置', + featuresLabel: '識別選項', + loading: '載入中...', + retry: '重試', + noEngineDetected: '未檢測到解析引擎,請確認 DocReader 服務正常執行。', + disconnected: '未連線', + connected: '已連線', + available: '可用', + unavailable: '不可用', + builtinDesc: 'DocReader 內建解析引擎(docx/pdf/xlsx 等複雜格式)', + currentAddr: '當前', + envVarHint: '修改請設定環境變數 DOCREADER_ADDR、DOCREADER_TRANSPORT(grpc/http),重啟服務生效。', + selfHostedEndpoint: '自建端點', + formulaRecognition: '公式識別', + tableRecognition: '表格識別', + parseMethodLabel: 'PDF 解析方式', + parseMethodAuto: '自動識別(推薦)', + parseMethodOCR: '強制 OCR', + parseMethodText: '僅提取文字', + parseMethodHint: '自動模式會為掃描件啟用 OCR,電子版 PDF 直接提取文字。', + sealRecognition: '印章識別', + chartRecognition: '圖表識別', + language: '語言', + testConnection: '測試連線', + docs: '文件', + loadFailed: '載入解析引擎列表失敗', + ensureDocreaderConnected: '請先確保 DocReader 服務已透過環境變數配置並已連線', + checkDoneStatusUpdated: '已使用當前填寫引數檢測,上方狀態已更新', + checkSuccess: '測試連線成功', + checkFailed: '檢測失敗', + saveSuccess: '儲存成功', + saveFailed: '儲存失敗', + mineruEndpointPlaceholder: '如 https://your-mineru.example.com', + defaultPipeline: '預設 pipeline', + languagePlaceholder: '如 ch、en、ja(預設 ch)', + mineruCloudApiKeyPlaceholder: 'MinerU 雲服務 API Key', + vlmLabel: 'vlm(視覺語言模型)', + mineruHtmlLabel: 'MinerU-HTML(HTML 解析)', + serverUrl: '伺服器地址', + vlmServerUrlPlaceholder: '如 http://your-vllm-server:8000', + vlmServerUrlHint: '當 Backend 選擇 vlm-http-client 或 hybrid-http-client 時需要填寫', + paddleocrVlEndpointPlaceholder: '如 http://your-paddleocr-vl:8080', + paddleocrVlEndpointHint: '填寫 PaddleOCR-VL 完整服務(pipeline)地址,無需 /layout-parsing 字尾', + paddleocrVlCloudTokenPlaceholder: 'PaddleOCR-VL 飛槳星河社群 Token' + }, + weknoraCloud: { + title: 'WeKnora Cloud', + description: '配置 WeKnora Cloud 的 APPID 和 APPSECRET 憑證。憑證用於模型服務和文件解析引擎。', + viewDocs: '檢視文件', + unconfigured: '尚未配置憑證,請填寫 APPID 和 APPSECRET', + configured: '憑證已配置,狀態正常', + expired: 'WeKnora Cloud 憑證已失效', + expiredDefault: '服務重啟後加密金鑰已變更,已儲存的憑證無法解密。請重新填寫憑證。', + reconfigure: '重新配置', + appIdLabel: 'APPID', + appIdDesc: 'WeKnora Cloud 的應用 ID', + appIdPlaceholder: '請輸入 APPID', + appSecretLabel: 'APPSECRET', + appSecretDesc: 'WeKnora Cloud 的應用金鑰', + appSecretPlaceholder: '請輸入 APPSECRET', + saveHint: '儲存後將驗證服務可達性並加密儲存憑證', + saveBtn: '儲存憑證', + usageTitle: '使用說明', + usageSteps: '1. 填寫並儲存 APPID / APPSECRET\n2. 在下方「雲模型接入」中按行新增 chat、embedding、rerank、vlm\n3. 文件解析:知識庫設定 → 解析引擎,選擇 WeKnora Cloud 引擎', + fillRequired: '請填寫 APPID 和 APPSECRET', + saveSuccess: '憑證儲存成功', + saveFailed: '憑證儲存失敗', + credentialConfigured: 'WeKnoraCloud 憑證已配置', + credentialExpired: '憑證已失效,請重新配置。', + credentialUnconfigured: '尚未配置 WeKnoraCloud 憑證,請先填寫 APPID 和 APPSECRET。', + checkingStatus: '正在檢查憑證狀態...', + goToSettings: '前往設定中配置', + modelHintConfigured: 'WeKnoraCloud 憑證已配置。支援的模型可參考', + modelHintDocsLink: '介面文件', + addModelsSuccess: '已成功新增 {count} 個模型', + addModelsPartial: '已新增 {success} 個,{failed} 個失敗', + addModelsFailed: '新增模型失敗', + addModelsEmbeddingFailed: 'Embedding 模型連線測試失敗,無法獲取向量維度', + addModelsDisplayName: { + chat: 'WeKnoraCloud 對話', + embedding: 'WeKnoraCloud Embedding', + rerank: 'WeKnoraCloud ReRank', + vllm: 'WeKnoraCloud 視覺' + }, + modelsSection: { + title: '雲模型接入', + descReady: '將 WeKnora Cloud 提供的四類標準模型註冊到當前空間,用於對話、向量檢索、重排序與多模態理解。', + descPending: '請先儲存上方憑證,再在此新增雲模型。', + statusAdded: '已新增', + statusPending: '待配置憑證', + addOne: '新增', + addAllBtn: '新增全部缺失({count})', + addAllConfirm: '確認新增', + confirmAddOne: '新增 {type} 模型「{name}」?', + confirmAddAll: '一次性新增 {count} 個缺失的雲模型?', + allReady: '四類雲模型均已就緒' + } + }, + roleDenied: { + title: '許可權不足', + desc: '你當前的角色無權訪問此設定項。請聯絡本空間的管理員獲取所需角色。' + }, + capabilityUnavailable: '當前部署不支援此功能,已返回可用頁面。', + navGroups: { + account: '帳號', + workspace: '空間', + modelsRuntime: '模型', + dataExtensions: '資料與擴充套件', + systemAdministration: '系統管理', + platform: '平臺' + } + }, + agent: { + taskLabel: '任務:', + think: '思考', + copy: '複製', + addToKnowledgeBase: '新增到知識庫', + artifactDrawer: { + buttonTitle: '下載本次生成的檔案', + title: '生成的檔案', + empty: '本次未生成可下載的檔案', + download: '下載', + downloadFailed: '下載失敗,請稍後重試', + }, + updatePlan: '更新計劃', + webSearchFound: '找到 {count} 個網路搜尋結果', + toolFallback: '工具', + stepsCompleted: '已完成 {steps} 個步驟', + reasoningRounds: '思考 {rounds} 輪', + toolCalls: '呼叫 {tools} 次工具', + durationSuffix: '耗時 {duration}', + stepSummarySeparator: ' · ', + title: '智慧體', + subtitle: '配置和管理您的智慧體,自定義對話行為和能力', + createAgent: '建立智慧體', + builtin: '內建', + disabled: '已停用', + disable: '停用', + enable: '啟用', + noDescription: '暫無描述', + selectAgent: '選擇智慧體', + noAgents: '暫無智慧體', + manageAgents: '管理', + builtinAgents: '內建智慧體', + customAgents: '自定義智慧體', + selector: { + title: '選擇智慧體', + current: '當前', + goToSettings: '設定', + sharedLabel: '共享', + notReadyHint: '尚未就緒,還需配置:{items}', + notReadyStatus: '待配置', + configureAction: '去配置', + sharedNotReadyContact: '請聯絡分享方管理員完成配置', + capabilitiesSection: '能力', + webSearchCapability: '網路搜尋', + imageUploadCapability: '圖片上傳', + capabilityEnabled: '開啟', + capabilityDisabled: '關閉', + capabilitySupported: '支援', + capabilityUnsupported: '不支援', + capabilityUnconfigured: '未配置' + }, + editor: { + createTitle: '建立智慧體', + editTitle: '編輯智慧體', + buttons: { + create: '建立智慧體', + saveAndClose: '儲存並關閉', + }, + postCreateHint: { + title: '建立成功', + footer: '可繼續調整配置,設定共享與釋出渠道,完成後點選「儲存並關閉」。', + integrationDesc: '前往整合中心配置 IM、網頁嵌入等釋出渠道', + }, + basicInfo: '基本資訊', + basicInfoDesc: '配置智慧體的名稱、描述與執行模式', + promptsConfig: '提示詞', + promptsConfigDesc: '配置系統提示詞、上下文模板、意圖/改寫/兜底提示詞', + modelConfig: '模型配置', + modelConfigDesc: '配置對話模型、ReRank 等輔助模型及生成引數', + toolsConfig: '工具配置', + toolsConfigDesc: '配置 Agent 可以使用的工具', + knowledgeConfig: '知識庫', + knowledgeConfigDesc: '配置智慧體可訪問的知識庫範圍與 FAQ 策略', + webSearchConfig: '網路搜尋', + webSearchConfigDesc: '配置智慧體的網路搜尋能力', + agentId: '智慧體 ID', + agentIdDesc: 'API 整合時可使用此 ID 指定智慧體', + name: '名稱', + namePlaceholder: '請輸入智慧體名稱', + nameRequired: '請輸入智慧體名稱', + systemPromptRequired: '請輸入系統提示詞', + modelRequired: '請選擇模型', + queryMissingInRewrite: '改寫使用者提示詞必須包含 {\'{{\'}query{\'}}\'} 佔位符', + queryMissingInFallback: '兜底提示詞必須包含 {\'{{\'}query{\'}}\'} 佔位符', + description: '描述', + descriptionPlaceholder: '請輸入智慧體描述', + normalDesc: '快速響應,直接回答問題', + agentDesc: '多步思考,深度分析複雜問題', + model: '模型', + modelPlaceholder: '請選擇模型', + systemPrompt: '系統提示詞', + systemPromptPlaceholder: '自定義系統提示詞,定義智慧體的行為和角色(使用 {\'{{\'}web_search_status{\'}}\'} 佔位符動態控制網路搜尋行為)', + contextTemplateRequired: '請輸入上下文模板', + temperature: '溫度', + thinking: '思考模式', + citationEnabled: '輸出來源引用', + citationEnabledDesc: '在最終回答中展示知識庫和網頁來源;關閉後仍會正常檢索和使用證據', + mode: '執行模式', + webSearch: '網路搜尋', + webSearchProvider: '搜尋引擎', + webSearchProviderPlaceholder: '使用預設搜尋引擎', + webSearchMaxResults: '最大搜尋結果數', + webFetchEnabled: '自動抓取頁面內容', + webFetchTopN: '抓取頁面數', + knowledgeBases: '關聯知識庫', + allKnowledgeBases: '全部知識庫', + selectedKnowledgeBases: '指定知識庫', + noKnowledgeBase: '不使用知識庫', + selectKnowledgeBases: '選擇知識庫', + selectKnowledgeBasesDesc: '選擇要關聯的知識庫(包括協作知識庫)', + myKnowledgeBases: '我的知識庫', + sharedKnowledgeBases: '協作知識庫', + retrieveKBOnlyWhenMentioned: '僅在 {\'@\'} 提及時檢索', + retrieveKBOnlyWhenMentionedDesc: '關閉:自動檢索已配置的知識庫,開啟:僅當使用者 {\'@\'} 提及時才檢索', + rerankModel: 'ReRank 模型', + rerankModelDesc: '用於對知識庫檢索結果進行重排序,提高回答準確性', + rerankModelPlaceholder: '請選擇 ReRank 模型', + rerankModelOptionalHint: '當前作用域內暫無 RAG 型別知識庫,可不填;後續若加入 RAG 知識庫,將自動使用空間預設重排模型,仍建議顯式配置。', + maxIterations: '最大迭代次數', + allowedTools: '允許的工具', + multiTurn: '多輪對話', + historyTurns: '保留輪數', + memoryEnabled: '長期記憶', + retrievalStrategy: '檢索策略', + embeddingTopK: '向量召回數量', + keywordThreshold: '關鍵詞閾值', + vectorThreshold: '向量閾值', + rerankTopK: '重排數量', + rerankThreshold: '重排閾值', + conversationSettings: '多輪對話', + contextTemplate: '上下文模板', + contextTemplatePlaceholder: '自定義上下文模板...', + enableQueryExpansion: '查詢擴充套件', + enableRewrite: '問題改寫', + queryUnderstandModel: '問題理解模型', + queryUnderstandModelPlaceholder: '留空則複用主對話模型', + rewritePromptSystem: '改寫系統提示詞', + rewritePromptSystemPlaceholder: '留空使用系統預設提示詞', + rewritePromptUser: '改寫使用者提示詞', + rewritePromptUserPlaceholder: '留空使用系統預設提示詞', + maxCompletionTokens: '最大生成Token數', + fallbackStrategy: '兜底策略', + fallbackResponse: '固定回覆內容', + fallbackResponsePlaceholder: '抱歉,我無法回答這個問題。', + fallbackPrompt: '兜底提示詞', + fallbackPromptPlaceholder: '留空使用系統預設提示詞', + skillsConfig: '技能 Skills', + skillsConfigDesc: '配置 Agent 可以使用的預裝 Skills,提供專業領域知識和工作流程', + skillsSelection: 'Skills 選擇', + skillsSelectionDesc: '選擇 Agent 可以使用的 Skills 範圍', + skillsAll: '全部', + skillsSelected: '指定', + skillsNone: '禁用', + selectSkills: '選擇 Skills', + selectSkillsDesc: '選擇要啟用的 Skills', + noSkillsAvailable: '暫無預裝 Skills', + sandboxConfig: '沙箱後端', + sandboxConfigDesc: '選擇該智慧體的技能指令碼在哪個沙箱後端中執行。', + sandboxBackend: '沙箱後端', + sandboxBackendDefault: '不啟用沙箱', + sandboxBackendHint: '僅在啟用技能執行時生效。所選配置被刪除後,該智慧體的技能執行會失敗。', + sandboxBackendMissing: '配置已刪除', + sandboxNoConfigs: '當前空間還沒有沙箱後端配置,技能指令碼不會執行。可在「設定 - 沙箱後端」中新增。', + sandboxInfoTitle: '為什麼要選後端?', + sandboxInfoContent: '不同後端對應不同的帳號、區域與配額。同一會話的沙箱一旦建立,後續的附件、產物與銷燬都會鎖定在建立時那份配置上,改這裡隻影響之後新建的沙箱。', + skillsInfoTitle: '什麼是 Skills?', + skillsInfoContent: 'Skills 是預裝的專業知識模組,可以為 Agent 提供特定領域的指令、工作流程和工具支援。啟用 Skills 後,Agent 會在需要時自動載入相關知識。' + }, + messages: { + created: '智慧體建立成功', + updated: '智慧體更新成功', + deleted: '智慧體已刪除', + deleteFailed: '刪除失敗', + saveFailed: '儲存失敗', + copied: '智慧體複製成功', + copyFailed: '複製失敗', + disabled: '已停用', + enabled: '已啟用' + }, + delete: { + confirmTitle: '刪除智慧體', + confirmMessage: '確定要刪除智慧體「{name}」嗎?此操作不可還原。', + confirmButton: '確認刪除' + }, + shareScope: { + title: '共享範圍說明', + desc: '空間成員以只讀方式使用該智慧體,將遵循您當前配置的能力與資源;您對智慧體的修改會同步給已共享的空間。如需允許空間成員編輯知識庫內容,請將知識庫共享到空間。', + knowledgeBase: '知識庫', + chatModel: '對話模型', + rerankModel: '重排模型', + webSearch: '網路搜尋', + mcp: 'MCP 服務', + kbAll: '全部知識庫', + kbSelected: '指定 {count} 個知識庫', + kbNone: '不使用', + modelConfigured: '已配置', + modelNotSet: '未配置', + enabled: '開啟', + disabled: '關閉', + mcpAll: '全部服務', + mcpSelected: '指定 {count} 個服務', + mcpNone: '不使用' + }, + detail: { + title: '智慧體詳情', + useInChat: '在對話中使用' + }, + empty: { + title: '暫無自定義智慧體', + description: '點選右上角按鈕建立您的第一個智慧體', + sharedTitle: '暫無共享智慧體', + sharedDescription: '您可以加入空間或請求他人將智慧體共享給您', + favoritesTitle: '暫無收藏', + favoritesDescription: '在智慧體卡片右上角點選星標即可收藏', + recentsTitle: '暫無最近訪問', + recentsDescription: '最近使用過的智慧體會出現在這裡' + }, + sections: { + builtin: '內建', + mine: '我建立的', + tenantOthers: '本空間 · 其他成員', + tenantReadonly: '本空間 · 僅檢視', + sharedByMe: '我共享的', + sharedEditable: '共享給我 · 可編輯', + sharedReadonly: '共享給我 · 僅檢視' + }, + tabs: { + sharedToMe: '共享給我' + }, + features: { + webSearch: '支援網路搜尋', + knowledgeBase: '關聯知識庫', + mcp: '支援MCP服務', + multiTurn: '多輪對話' + }, + mode: { + normal: '快速問答', + agent: '智慧推理' + }, + type: { + normal: '快速問答', + agent: '智慧推理' + }, + capabilities: { + kbCount: '指定 {count} 個知識庫', + kbAll: '可訪問全部知識庫', + mcpEnabled: '啟用 MCP 服務', + multiTurn: '多輪對話' + } + }, + knowledgeStages: { + title: '處理流水線', + root: '知識處理', + attempt: '第 {n} 次嘗試', + retry: '重新解析', + refresh: '立即重新整理', + copy: '複製', + copyDetails: '複製詳情', + copied: '已複製到剪貼簿', + close: '關閉', + live: 'LIVE', + liveTooltip: '解析進行中,每 2 秒自動重新整理一次', + autoRefreshOn: '自動重新整理中', + fetchFailedShort: '重新整理失敗', + viewTrace: '檢視 Trace', + expandBranch: '展開子項', + collapseBranch: '收起子項', + rowSelectHint: '點選檢視詳情;左側箭頭展開或收起子項', + resizeDrawer: '拖拽調整面板寬度', + justNow: '剛剛', + secondsAgo: '{n} 秒前', + minutesAgo: '{n} 分鐘前', + noActivity: '暫無解析記錄', + totalDuration: '總耗時:{d}', + total: '總耗時 {d}', + errorCode: { + UNKNOWN_SUGGESTION: '請檢視應用日誌獲取詳細資訊。' + }, + status: { + pending: '等待中', + running: '進行中', + finalizing: '最佳化中', + done: '已完成', + failed: '失敗', + skipped: '已跳過', + cancelled: '已取消' + }, + stage: { + docreader: '文件解析', + chunking: '分塊', + embedding: '向量化', + multimodal: '多模態識別', + postprocess: '後處理' + }, + detail: { + started: '開始', + finished: '結束', + duration: '耗時', + offset: '起點偏移', + timing: '時序', + identity: '身份資訊', + stageBreakdown: '階段分解', + stageOrder: '階段順序', + childCount: '子 span 數', + kind: '型別', + status: '狀態', + name: '名稱', + input: '輸入', + output: '輸出', + metadata: '元資料', + traceMetadata: 'Trace 級元資料', + metadataHint: '記錄與 Langfuse 等可觀測性系統關聯的輔助欄位(如 trace ID)。各階段的業務入參/出參在「輸入」「輸出」標籤中檢視。', + metadataEmpty: '當前 span 沒有元資料。階段與子任務的入參/出參請檢視「輸入」「輸出」;若已接入 Langfuse,trace 級欄位會顯示在「概覽」。', + error: '錯誤', + empty: '暫無資料', + inProgress: '進行中', + elapsed: '已用', + placeholderHint: '此階段未記錄詳細 span,僅展示推斷狀態。', + showJson: '展開 JSON', + hideJson: '收起 JSON', + includingChildren: '含子任務' + }, + tab: { + overview: '概覽', + raw: '原始 JSON' + }, + head: { + stagesDone: '主流程階段', + stagesProgress: '當前階段', + postprocessTasks: '後臺任務:執行中 {running} / 失敗 {failed} / 已完成 {completed}', + completedWithActiveTrace: '處理已完成,但仍有 {n} 個 Trace 任務處於活動狀態', + attempt: '嘗試', + updated: '更新於' + }, + processConfig: { + title: '本次解析配置', + kbDefault: '使用知識庫預設配置', + graph: '知識圖譜' + } + }, + uploadConfirm: { + title: '上傳文件確認', + parseConfig: '解析配置', + configNav: '解析配置導航', + navParserDefault: '預設', + navParserCustomized: '已自定義', + moreOptions: '更多處理選項', + summaryParentChildShort: '父子分塊', + summaryParserForceScanned: '掃描件解析', + summaryQuestionCountValue: '{count} 個', + summaryGraphTagsValue: '{count} 個', + navChunkingSummary: '分塊 {size}', + statusOn: '已開啟', + statusOff: '未開啟', + notSet: '未設定', + summaryNoTags: '未設定', + summaryTagsCount: '{count} 個標籤', + confirm: '確認上傳並解析', + cancel: '取消', + tabTags: '文件標籤', + tagsDescription: '為本批次匯入的所有文件選擇標籤,可多選', + tagsPlaceholder: '請選擇標籤(可多選)', + tagsEmpty: '當前知識庫暫無標籤,可上傳後在標籤管理中建立', + tagsLoadFailed: '標籤載入失敗,可稍後在文件列表中設定', + noItems: '請至少新增一個檔案或 URL', + urlItemLabel: 'URL', + urlAdded: '已新增 URL', + urlDuplicate: '該 URL 已在列表中', + statusNeedsSetup: '待配置', + multimodalSetupHint: '含圖片內容,請啟用多模態並選擇模型', + asrSetupHint: '含音訊內容,請啟用語音識別並選擇模型', + vlmModelRequired: '請配置多模態模型', + asrModelRequired: '請配置語音識別模型', + vlmModelSelectRequired: '已啟用多模態,請選擇 VLM 模型', + asrModelSelectRequired: '已啟用語音識別,請選擇 ASR 模型', + continueAdd: '繼續新增', + destinationLabel: '上傳位置', + destinationChange: '更改上傳位置', + destinationToRoot: '改到根目錄', + folderUploadTitle: '資料夾「{name}」', + folderUploadHint: '共 {count} 個檔案,將保留本地目錄結構', + filesAdded: '已新增 {count} 個檔案', + filesAllDuplicate: '所選檔案已在列表中', + titleManual: '線上編輯釋出確認', + confirmManual: '確認釋出並解析', + titleReparse: '重新解析確認', + confirmReparse: '確認並重新解析', + reparseSource: '待重新解析文件', + reparseHint: '將沿用上次解析的配置,可在此調整', + manualCharCount: '{count} 個字元', + pdfForceScanned: { + label: '按掃描件解析 PDF', + description: '適用於網頁列印、掃描件、圖片型 PDF。開啟後會逐頁 OCR,解析更完整但耗時和模型呼叫更多。' + } + }, + knowledgeBase: { + title: '知識庫', + fileContent: '檔案內容', + name: '名稱', + description: '描述', + settings: '設定', + tagUpdateSuccess: '標籤更新成功', + tagEditDialogHeading: '編輯標籤', + tagEditSearch: '搜尋標籤...', + tagEditSelectedSection: '已選標籤', + tagEditAvailableSection: '可選標籤', + tagEditNoSelected: '暫未選擇', + folderTree: { + title: '目錄', + rootRow: '根目錄', + rootRowTip: '知識庫根目錄,未歸入子資料夾的文件在此', + folderCardCount: '{count} 個文件', + searchingSubtree: '(含子目錄)', + emptyFolder: '這個資料夾裡還沒有文件', + emptySearch: '沒有匹配的文件', + collapse: '收起目錄', + expand: '展開目錄', + collapseFolder: '收起該資料夾', + expandFolder: '展開該資料夾', + rename: '重新命名', + renamePlaceholder: '輸入資料夾名稱', + renameSuccess: '資料夾已重新命名', + renameFailed: '資料夾重新命名失敗', + renameInvalid: '不能把資料夾移動到它自己的子目錄下', + }, + moveToFolder: { + action: '移動到目錄', + newFolder: '新建子目錄', + newFolderPlaceholder: '輸入新目錄名稱', + newFolderCreate: '建立', + newFolderAddRoot: '在根目錄下新建子目錄', + newFolderAddUnder: '在「{folder}」下新建子目錄', + newFolderHint: '回車建立並移動', + newFolderHintRoot: '將在根目錄下建立', + newFolderHintUnder: '將在「{folder}」下建立', + success: '已移動 {count} 個文件', + failed: '移動失敗', + duplicate: '該目錄已存在', + }, + tagFilterTitle: '按標籤篩選', + tagFilterPlaceholder: '標籤', + tagFilterMulti: '{count} 個標籤', + tagManageTitle: '管理標籤', + tagManageDescription: '新建、重新命名或刪除知識庫標籤', + tagManageLink: '管理標籤…', + tagManageListSection: '標籤列表', + tagManageDocCount: '{count} 個文件', + tagManageFaqCount: '{count} 個 FAQ', + tagSelectedCount: '已選 {count} 個標籤', + tagNewPlaceholder: '輸入新標籤名稱,回車新增', + untagged: '無標籤', + tagClearAction: '清空已選', + tagCreateAction: '新建標籤', + tagSearchPlaceholder: '輸入標籤名稱關鍵字', + tagNamePlaceholder: '請輸入標籤名稱', + tagNameRequired: '請先輸入標籤名稱', + tagCreateSuccess: '標籤建立成功', + tagEditSuccess: '標籤更新成功', + tagDeleteDescDoc: '確定刪除標籤"{name}"?該標籤下的所有文件將被一併刪除', + tagDeleteSuccess: '標籤已刪除', + tagEditAction: '重新命名', + tagDeleteAction: '刪除', + tagEmptyResult: '未找到匹配的標籤', + tagLabel: '標籤', + tagPlaceholder: '請選擇標籤', + noTags: '暫無標籤', + uploadSuccess: '檔案上傳成功!', + uploadFailed: '檔案上傳失敗!', + fileExists: '檔案已存在', + uploadAllSuccess: '成功上傳 {count} 個檔案!', + uploadPartialSuccess: '上傳完成:成功 {success} 個,失敗 {fail} 個', + uploadAllFailed: '所有檔案上傳失敗', + uploadingFolder: '正在上傳資料夾中的 {total} 個檔案...', + videosFilteredNoVLM: '已跳過 {count} 個影片檔案(暫不支援影片上傳)', + unsupportedTypesHint: '部分文件型別({types})暫無可用解析引擎,上傳後將無法解析', + goToParserSettings: '前往配置', + importURL: '匯入網頁', + addDocument: '新增文件', + importURLTitle: '匯入網頁', + urlRequired: '請輸入URL', + invalidURL: '請輸入有效的URL', + urlImportSuccess: 'URL匯入成功!', + urlImportFailed: 'URL匯入失敗!', + urlExists: '該URL已存在', + urlLabel: 'URL地址', + urlPlaceholder: '請輸入網頁URL,例如:https://example.com', + urlTip: '支援匯入各類網頁內容,系統會自動提取和解析網頁中的文字內容', + typeURL: '網頁', + typeManual: '手動建立', + typeFile: '檔案', + channelLabel: '來源渠道', + channelWeb: '網頁端', + channelApi: 'API', + channelBrowserExtension: '瀏覽器外掛', + channelWechat: '微信', + channelWecom: '企業微信', + channelFeishu: '飛書', + channelFeishuDrive: "飛書雲盤", + channelLarkDrive: "Lark 雲盤", + channelDingtalk: '釘釘', + channelSlack: 'Slack', + channelIm: 'IM 渠道', + channelNotion: 'Notion', + channelYuque: '語雀', + channelGitLab: 'GitLab', + channelIma: '騰訊 IMA', + channelUpload: '上傳', + channelManual: '手動', + channelUrl: '網頁', + channelUnknown: '未知', + urlSource: '來源網址', + webContent: '網頁內容', + documentContent: '文件內容', + importTime: '匯入時間', + createTime: '建立時間', + createdAt: '建立', + updatedAt: '更新', + clickToViewFull: '點選卡片檢視全文與分段', + characters: '字元', + segment: '片段', + chunkCount: '共 {count} 個片段', + viewChunks: '檢視分塊', + viewMerged: '全文', + generatedQuestions: '輔助召回問題', + viewParentContext: '檢視父塊上下文', + parentContextLoadFailed: '載入父上下文失敗', + confirmDeleteQuestion: '確定要刪除這個問題嗎?刪除後將同時移除對應的向量索引。', + legacyQuestionCannotDelete: '舊格式問題無法刪除,請重新生成問題', + customMetadata: '自定義元資料', + metadataCapabilityHint: '用於文件總結,並在文件被召回後作為文件級上下文輔助回答;不會參與索引或影響召回排序', + noCustomMetadata: '暫無自定義元資料', + addMetadataField: '新增元資料欄位', + metadataKeyPlaceholder: '欄位名', + metadataValuePlaceholder: '欄位值', + metadataTypeText: '文字', + metadataTypeNumber: '數字', + metadataTypeBoolean: '布林值', + metadataTypeNull: '空值', + metadataKeyRequired: '元資料欄位名不能為空', + metadataKeyDuplicate: '元資料欄位 {key} 重複', + metadataNumberRequired: '元資料欄位 {key} 必須是有效數字', + regenerateSummary: '重新生成摘要', + generateSummary: '生成摘要', + noDocumentSummary: '暫無文件摘要', + summaryRefreshed: '摘要已更新', + summaryRefreshQueued: '摘要重新整理已提交,完成後會自動更新', + indexFailed: '索引同步失敗', + chunkSavedIndexFailed: '內容已儲存,但索引同步失敗,請點選重試索引', + chunkEditConflict: '分塊已被他人修改,列表已重新整理,請重試', + retryIndex: '重試索引', + indexRetrySuccess: '索引已同步', + chunkHistory: '分塊編輯歷史', + currentVersion: '當前版本', + noChunkHistory: '暫無編輯歷史', + compareRevisionWithCurrent: 'v{revision} 與當前 v{current} 的內容差異', + diffAddedInCurrent: '當前版本新增', + diffRemovedFromCurrent: '當前版本刪除', + noContentChanges: '內容沒有變化,該版本僅包含狀態變更', + revertRevision: '回滾版本', + revertRevisionConfirm: '確定回滾到 v{revision} 嗎?回滾後會生成一個新版本。', + chunkReverted: '分塊已回滾', + chunkContentRequired: '分塊內容不能為空', + disableChunk: '停用', + enableChunk: '啟用', + enabledStatus: '已啟用', + disabledStatus: '已停用', + editChunkContent: '編輯分塊內容', + addGeneratedQuestion: '新增輔助召回問題', + regenerateQuestions: '重新生成問題', + questionsRegenerated: '輔助召回問題已更新', + staleGeneratedQuestions: '問題基於編輯前內容生成,可按需重新生成', + noGeneratedQuestions: '暫無輔助召回問題', + notInitialized: '該知識庫尚未完成初始化配置,請先前往設定頁面配置模型資訊後再上傳檔案', + missingStorageEngine: '該知識庫尚未選擇儲存引擎,請先前往設定頁面配置儲存引擎後再上傳內容。', + missingStorageEngineUpload: '請先配置儲存引擎後再上傳內容', + goToStorageSettings: '前往配置', + getInfoFailed: '獲取知識庫資訊失敗,無法上傳檔案', + missingId: '缺少知識庫ID', + deleteFailed: '刪除失敗,請稍後再試!', + uploadTime: '上傳時間', + newSession: '新會話', + editDocument: '編輯文件', + rebuildDocument: '重建知識', + rebuildConfirm: '確認重建文件"{fileName}"?該操作會清理現有分塊並重新解析。', + rebuildSubmitted: '重建任務已提交', + rebuildFailed: '重建失敗,請稍後再試', + rebuildInProgress: '當前文件正在解析中,請稍後重試', + cancelParse: '停止解析', + cancelParseConfirmBody: '確認停止解析"{title}"?已寫入的分塊會保留,可稍後透過"重建"重新觸發;最佳化階段(摘要 / 問答 / 知識圖譜)的待執行任務會被立即丟棄。', + cancelParseSubmitted: '已停止解析', + cancelParseFailed: '停止失敗,請稍後再試', + draft: '草稿', + draftTip: '暫存內容,未參與檢索', + untitledDocument: '未命名文件', + deleteDocument: '刪除文件', + moveDocument: '移動到...', + moveToKnowledgeBase: '移動到知識庫', + moveNoTargets: '沒有相容的目標知識庫(需要相同型別和 Embedding 模型)', + moveModeReuseVectors: '複用向量(快速)', + moveModeReuseVectorsDesc: '直接移動分塊和向量索引,適用於分片配置相同的情況', + moveModeReparse: '重新解析', + moveModeReparseDesc: '使用目標知識庫的分片配置重新解析文件', + moveConfirm: '確認移動', + moveConfirmTitle: '確認移動設定', + moveStarted: '移動任務已提交', + moveFailed: '移動失敗', + moveCompleted: '移動完成', + moveCompletedWithErrors: '移動完成:{success} 成功,{failed} 失敗', + parsingFailed: '解析失敗', + parsingInProgress: '解析中...', + generatingSummary: '生成摘要中...', + documentSummary: '摘要', + detailSectionMeta: '基本資訊', + confirmDeleteDocument: '確認刪除文件"{fileName}",刪除後將無法還原', + confirmDelete: '確認刪除', + viewModeGrid: '卡片檢視', + viewModeList: '列表檢視', + viewModeToggle: '切換檢視', + columnName: '檔名', + columnTag: '標籤', + columnSize: '大小', + columnSource: '來源', + columnStatus: '狀態', + columnUpdatedAt: '更新時間', + columnActions: '操作', + selectAll: '全選', + selectedCount: '已選 {count} 項', + clearSelection: '取消選擇', + batchDelete: '批次刪除', + confirmBatchDeleteDocument: '確認刪除選中的 {count} 個文件?刪除後將無法還原。', + batchDeleteSuccess: '成功刪除 {count} 個文件', + batchDeleteFailed: '批次刪除失敗', + batchTag: '批次打標籤', + batchTagDialogHeading: '批次打標籤', + batchTagSubtitle: '為選中的 {count} 個文件統一設定標籤(將替換文件原有標籤)', + batchTagSelectedSection: '已選標籤', + batchTagAvailableSection: '可選標籤', + batchTagNoSelected: '暫未選擇', + batchTagSuccess: '已為 {count} 個文件成功設定標籤', + batchTagFailed: '批次打標籤失敗', + confirmBatchReparseDocument: '確認重建選中的 {count} 個文件?現有內容將被清除並重新解析。', + confirmBatchReparse: '確認並重新解析', + batchReparseSuccess: '已提交 {count} 個重建任務', + batchReparseFailed: '批次重建失敗', + batchReparseSkippedInFlight: '已跳過 {count} 個正在解析中的文件', + statusCompleted: '已完成', + statusProcessing: '解析中', + statusFinalizing: '最佳化中', + statusFailed: '失敗', + statusCancelled: '已取消', + statusDraft: '草稿', + noDescription: '無描述', + emptyKnowledgeDragDrop: '知識為空,拖放上傳', + pdfDocFormat: 'pdf、doc 格式檔案,不超過10M', + textMarkdownFormat: 'text、markdown格式檔案,不超過200K', + dragFileNotText: '請拖拽檔案而不是文字或連結', + searchPlaceholder: '搜尋知識庫...', + docSearchPlaceholder: '搜尋文件名稱...', + fileTypeFilter: '檔案型別', + allFileTypes: '全部型別', + allTags: '全部標籤', + parseStatusFilter: '解析狀態', + allParseStatuses: '全部狀態', + parseStatusPending: '等待中', + parseStatusProcessing: '處理中', + parseStatusCompleted: '已完成', + parseStatusFinalizing: '整理最佳化中', + parseStatusFailed: '失敗', + parseStatusCancelled: '已取消', + parseStatusDraft: '草稿', + sourceFilter: '來源', + allSources: '全部來源', + sourceApi: 'API', + sourceBrowserExtension: '瀏覽器擴充套件', + sourceUpload: '本地上傳', + sourceUrl: 'URL 匯入', + sourceManual: '手動建立', + updatedTimeFrom: '起始時間', + updatedTimeTo: '結束時間', + noMatch: '未找到匹配的知識庫', + noKnowledge: '暫無可用知識庫', + loadingFailed: '載入知識庫失敗', + operationNotSupportedForType: '當前知識庫型別不支援該操作', + allFilesSkippedNoEngine: '所選檔案型別暫無可用解析引擎,已全部跳過', + filesSkippedNoEngine: '{count} 個檔案因無可用解析引擎被跳過', + allUploadSuccess: '所有檔案上傳成功({count}個)', + partialUploadSuccess: '部分檔案上傳成功(成功:{success},失敗:{fail})', + allUploadFailed: '所有檔案上傳失敗({count}個)', + deleteSuccess: '知識刪除成功!', + chunkLoadFailed: '分塊載入失敗', + infoCard: { + tooltip: '檢視知識庫資訊', + title: '知識庫資訊', + basic: '基礎', + access: '訪問', + binding: '儲存繫結', + capabilities: '能力', + stats: '統計', + type: '型別', + createdAt: '建立時間', + source: '來源', + sharedTo: '共享範圍', + enabled: '已啟用', + vectorStore: '向量儲存', + fileStorage: '檔案儲存', + documentCount: '文件數', + faqCount: '問答數', + supportedFileTypes: '可上傳格式', + chunking: '分塊', + parentShort: '父', + childShort: '子' + }, + accessInfo: { + myRole: '我的身份', + roleOwner: '建立者', + permissionOwner: '可編輯、管理設定、刪除知識庫', + permissionAdmin: '可編輯、管理共享設定', + permissionEditor: '可編輯文件與標籤', + permissionViewer: '僅檢視與檢索', + fromOrg: '來自空間', + sharedAt: '共享於', + lastUpdated: '最後更新' + } + }, + resourceOrigin: { + mine: '我建立', + mineTooltip: '由當前使用者建立', + tenant: '本空間', + tenantTooltip: '本空間其他成員建立', + tenantTooltipWithCreator: '由 {creator} 建立', + space: '共享空間', + spaceTooltip: '來自共享空間「{space}」', + spaceTooltipWithTenant: '來自共享空間「{space}」· 源空間 {tenant}', + shared: '外部共享', + sharedTooltip: '透過共享空間從其他空間訪問' + }, + listSpaceSidebar: { + all: '全部', + workspace: '本空間', + spaces: '共享給我', + favorites: '收藏', + recents: '最近' + }, + batchManage: { + selectAll: '全選', + cancel: '取消', + delete: '刪除對話', + deleteConfirmTitle: '刪除對話', + deleteConfirmBody: '確定要刪除選中的 {count} 條對話嗎?刪除後無法還原。', + deleteAllConfirmBody: '確定要刪除所有對話嗎?此操作無法還原。', + deleteSuccess: '刪除成功', + deleteFailed: '刪除失敗,請稍後再試' + }, + contextualGuide: { + stepOf: '{current} / {total}', + skip: '跳過', + prev: '上一步', + next: '下一步', + done: '知道了', + interactHint: '請直接點選高亮區域繼續', + chat: { + steps: { + done: { + title: '開始探索吧', + desc: '試試提一個與已上傳文件相關的問題,體驗帶引用的精準回答。' + }, + send: { + title: '傳送開始對話', + desc: '傳送後將建立新會話,AI 會結合知識庫內容作答,並標註引用片段。' + }, + input: { + title: '輸入你的問題', + desc: '直接描述你想了解的內容;也可點選上方推薦問題快速開始。' + }, + kb: { + title: '選擇知識範圍', + desc: '點選 {\'@\'} 可指定一個或多個知識庫/檔案,僅基於選中內容回答;不選則按當前智慧體配置檢索。' + } + } + }, + kbDetail: { + steps: { + done: { + title: '解析完成後即可使用', + desc: '文件解析入庫後,可在對話中 {\'@\'} 本知識庫提問,回答會附帶引用來源。' + }, + upload: { + title: '新增文件', + desc: '點選此處上傳檔案、資料夾,或匯入網頁與線上編輯內容。' + }, + intro: { + title: '知識庫還是空的', + desc: '新增第一份資料後,才能基於它進行檢索與對話。支援拖拽上傳多種文件格式。' + } + } + }, + agentCreate: { + steps: { + submit: { + title: '儲存智慧體', + desc: '確認配置後點選高亮的「確定」完成建立,即可在對話中選擇該智慧體。' + }, + navTools: { + title: '工具與 MCP(可選)', + desc: '智慧推理模式下可勾選內建工具、MCP 服務等,擴充套件搜尋、計算等能力。' + }, + multimodal: { + title: '啟用附件上傳', + desc: '可分別配置圖片、音訊上傳及附件解析策略;啟用圖片上傳時需在下方選擇 VLM 模型。' + }, + navMultimodal: { + title: '附件上傳(可選)', + desc: '開啟後,對話中可上傳圖片、文件、音訊等附件;圖片理解需先在系統設定中配置 VLLM 模型。' + }, + navWebsearch: { + title: '聯網搜尋(可選)', + desc: '配置是否允許智慧體呼叫外部搜尋引擎補充實時資訊。' + }, + knowledge: { + title: '知識庫範圍', + desc: '「全部」適合通用助手;「指定」可限定專業領域;「不關聯」則僅依賴模型自身能力或聯網搜尋。' + }, + navKnowledge: { + title: '關聯知識庫', + desc: '決定智慧體可檢索哪些知識。預設「全部知識庫」,也可改為指定庫或暫不關聯。' + }, + model: { + title: '選擇模型', + desc: '從下拉選單選擇已配置的對話模型;沒有合適模型時請先到系統設定新增。' + }, + navModel: { + title: '繫結對話模型', + desc: '每個智慧體必須指定一個 KnowledgeQA 模型作為推理引擎。' + }, + name: { + title: '命名與描述', + desc: '取一個易識別的名稱。智慧推理模式下系統可能已預填預設名稱,可按需修改。' + }, + agentType: { + title: '選擇智慧體型別', + desc: '預設型別會自動填充系統提示詞、推薦工具與知識庫範圍(如 Wiki 構建、資料分析等)。可按場景切換,名稱與描述會隨之更新。' + }, + mode: { + title: '選擇執行模式', + desc: '「普通模式」適合固定流程的快速問答;「智慧推理」可呼叫工具、多步思考,適合複雜任務。' + } + } + }, + agentList: { + steps: { + create: { + title: '建立你的智慧體', + desc: '智慧體把模型、知識庫、工具與提示片語合成可複用的對話助手。點選下方高亮的「建立智慧體」開始配置。' + } + } + }, + kbCreate: { + steps: { + submit: { + title: '建立知識庫', + desc: '確認型別、名稱與模型已選好後,點選高亮的「建立」按鈕。建立成功後將引導你上傳第一份文件。' + }, + faq: { + title: 'FAQ 索引方式', + desc: '配置問答對的索引模式。建立後可在本頁繼續新增 FAQ 條目。' + }, + multimodalVllm: { + title: '選擇 VLM 模型', + desc: '開啟多模態後需指定 VLM(視覺語言模型)。若列表為空,請先在系統設定中新增 VLLM 型別模型。' + }, + multimodalToggle: { + title: '開啟多模態解析', + desc: '啟用後,上傳的圖片類文件將使用視覺語言模型提取內容,便於檢索與問答。' + }, + navMultimodal: { + title: '多模態 / 圖片理解(可選)', + desc: '若文件含大量圖表、掃描件或需理解圖片內容,可在此開啟多模態並選擇 VLM 模型。' + }, + storage: { + title: '儲存引擎(可選)', + desc: '原始檔案存放位置(本地或物件儲存)。預設跟隨空間設定即可。' + }, + chunking: { + title: '分塊策略(可選)', + desc: '決定文件如何切分為檢索片段。預設分塊大小已針對 RAG 最佳化,一般無需修改。' + }, + parser: { + title: '解析引擎(可選)', + desc: '控制 PDF、Office 等檔案的解析方式。預設配置適用於大多數場景,有 OCR 需求時可在此調整。' + }, + embedding: { + title: 'Embedding 模型', + desc: '將文字轉為向量以支援語義檢索。與上方索引策略中的「向量/關鍵詞檢索」配合使用。' + }, + llm: { + title: '對話 / 摘要模型', + desc: '用於文件摘要、問答生成等。若列表為空,請透過下拉選單前往系統設定新增模型。' + }, + navModels: { + title: '配置模型(必填)', + desc: '知識庫必須繫結對話模型;開啟檢索時還需 Embedding 模型。點選左側「模型配置」進入。' + }, + indexing: { + title: '選擇索引能力', + desc: '預設已開啟向量與關鍵詞檢索,可按需開啟 Wiki 結構化索引或知識圖譜。至少保留一種檢索方式。' + }, + name: { + title: '填寫名稱', + desc: '取一個便於識別的名稱,例如「產品手冊」或「客服 FAQ」。描述可選填。' + }, + type: { + title: '選擇知識庫型別', + desc: '文件庫適合上傳 PDF、Word 等檔案;FAQ 庫適合問答對。建立後型別不可更改,請按需選擇。' + } + } + }, + tenantModels: { + needChatModelFirst: '請先新增對話模型(KnowledgeQA),再建立智慧體。', + stepsAgent: { + done: { + title: '然後建立智慧體', + desc: '儲存並關閉設定後,點選「建立智慧體」,嚮導會帶你配置模式、知識庫與附件上傳等選項。' + }, + addModel: { + title: '新增對話模型', + desc: '點選「新增模型」,選擇 KnowledgeQA 型別並填寫接入資訊。' + }, + intro: { + title: '需要先配置對話模型', + desc: '建立智慧體至少需要一種 KnowledgeQA(對話)模型。請先在系統設定中新增;Embedding 模型僅建立知識庫時需要。' + } + }, + steps: { + done: { + title: '新增完成後繼續', + desc: '模型儲存後關閉設定頁,即可點選「新建知識庫」;建立嚮導會引導你完成型別、索引與模型繫結。' + }, + addModel: { + title: '新增模型', + desc: '點選「新增模型」,分別配置 KnowledgeQA(對話)與 Embedding 型別。Lite 使用者可使用 Ollama 拉取本地模型。' + }, + intro: { + title: '需要先配置模型', + desc: '建立文件知識庫至少需要:一個對話模型(用於摘要與問答)和一個 Embedding 模型(用於向量檢索)。請先在系統設定中新增。' + } + } + }, + kbList: { + steps: { + create: { + title: '建立第一個知識庫', + desc: '知識庫用來存放文件與 FAQ。點選下方高亮的「新建知識庫」按鈕,我們會帶你完成表單填寫。' + } + } + } + }, + newUserGuide: { + stepOf: '{current} / {total}', + skip: '跳過引導', + prev: '上一步', + next: '下一步', + done: '完成', + reopen: '新手引導', + steps: { + done: { + title: '一切就緒', + desc: '你已經瞭解了核心功能,現在就開始構建你的知識助手吧!隨時可點選選單頂部暱稱旁的幫助按鈕重新檢視引導。' + }, + models: { + title: '配置你的模型', + desc: '這是關鍵一步:在模型管理中新增對話、向量等模型,知識庫與對話功能才能正常工作。點選「新增模型」即可開始配置。' + }, + settings: { + title: '帳號與設定入口', + desc: '點開這裡可以管理帳號、成員與系統設定。需要再次檢視本引導時,可點選選單頂部暱稱旁的幫助按鈕重新開啟。' + }, + agents: { + title: '打造專屬智慧體', + desc: '把知識庫、提示詞與工具組合成可複用的智慧體,沉澱你的專業能力。' + }, + chat: { + title: '發起智慧對話', + desc: '基於知識庫內容向 AI 提問,獲得帶引用來源的精準回答。點選這裡開始新對話。' + }, + knowledge: { + title: '建立你的知識庫', + desc: '知識庫是一切的起點:上傳文件、網頁或 FAQ,WeKnora 會自動解析並建立索引。點選這裡進入知識庫。' + }, + welcome: { + title: '歡迎使用 WeKnora', + desc: '只需幾步,帶你快速瞭解知識庫、對話與智慧體的核心用法。點選「下一步」開始。' + } + } + }, + chatHeader: { + moreActions: '更多對話操作', + copySessionId: '複製會話 ID', + copyLink: '複製對話連結', + copyMarkdown: '複製為 Markdown', + openNewWindow: '在新視窗中開啟', + deleteSession: '刪除對話', + renamePlaceholder: '輸入對話標題', + unpinSuccess: '已取消置頂', + sessionIdCopied: '會話 ID 已複製', + linkCopied: '對話連結已複製', + copyFailed: '複製失敗,請檢查瀏覽器剪貼簿許可權', + markdownCopied: '完整對話已複製為 Markdown', + markdownCopyFailed: '複製 Markdown 失敗,請稍後重試', + clearConfirmTitle: '清空對話訊息', + clearConfirmBody: '確認清空當前對話的全部訊息?對話本身會保留,此操作無法還原。', + deleteConfirmTitle: '刪除對話', + deleteConfirmBody: '確認刪除當前對話?刪除後將無法還原。', + deleteSuccess: '對話已刪除', + markdown: { + sessionId: '會話 ID', + exportedAt: '匯出時間', + user: '使用者', + assistant: '助手', + attachments: '附件', + references: '引用' + } + }, + menu: { + knowledgeBase: '知識庫', + agents: '智慧體', + organizations: '共享空間', + newChat: '新對話', + settings: '系統設定', + logout: '退出登入', + clearMessages: '清空訊息', + clearMessagesSuccess: '訊息已清空', + clearMessagesFailed: '清空訊息失敗,請稍後再試', + renameSession: '修改標題', + renameSessionSuccess: '標題已更新', + renameSessionFailed: '修改標題失敗,請稍後再試', + batchManage: '批次管理', + newSession: '新會話', + pin: '置頂', + unpin: '取消置頂', + pinFailed: '置頂失敗,請稍後再試', + unpinFailed: '取消置頂失敗,請稍後再試', + search: '搜尋', + collapseSidebar: '收起側邊欄', + expandSidebar: '展開側邊欄', + logoutSuccess: '已退出登入', + myChats: '我的對話', + apiChats: 'API 會話', + noSessions: '暫無對話' + } +} diff --git a/frontend/src/i18n/resolveDefaultLocale.ts b/frontend/src/i18n/resolveDefaultLocale.ts index 808495f57a..836330e115 100644 --- a/frontend/src/i18n/resolveDefaultLocale.ts +++ b/frontend/src/i18n/resolveDefaultLocale.ts @@ -1,4 +1,4 @@ -export const SUPPORTED_LOCALES = ['zh-CN', 'en-US', 'ru-RU', 'ko-KR'] as const +export const SUPPORTED_LOCALES = ['zh-CN', 'zh-TW', 'en-US', 'ru-RU', 'ko-KR'] as const export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number] export const BUILT_IN_DEFAULT: SupportedLocale = 'zh-CN' diff --git a/frontend/src/utils/protectedFileAccess.test.ts b/frontend/src/utils/protectedFileAccess.test.ts index c865396d78..e87e9b70c3 100644 --- a/frontend/src/utils/protectedFileAccess.test.ts +++ b/frontend/src/utils/protectedFileAccess.test.ts @@ -2,6 +2,7 @@ import assert from 'node:assert/strict' import test from 'node:test' import { + buildProtectedFileFallbackRequest, buildProtectedFileRequest, isProtectedFileProxyPath, isProviderFileURL, @@ -55,6 +56,23 @@ test('message access routes through the session-message-scoped proxy', () => { ) }) +test('message access falls back to the tenant proxy when the server lacks the message route', () => { + const request = buildProtectedFileFallbackRequest(RESOURCE, { + mode: 'message', + sessionId: 'session 1', + messageId: 'message/1', + }) + + assert.equal(request?.url, `/files?file_path=${encodeURIComponent(RESOURCE)}`) +}) + +test('an embed context has no tenant-proxy fallback', () => { + assert.equal( + buildProtectedFileFallbackRequest(RESOURCE, { mode: 'embed', channelId: 'ch-1', token: 'tok-1' }), + null, + ) +}) + test('an embed context without a token yields no request instead of an unauthenticated one', () => { const request = buildProtectedFileRequest(RESOURCE, { mode: 'embed', channelId: 'ch-1', token: '' }) diff --git a/frontend/src/utils/protectedFileAccess.ts b/frontend/src/utils/protectedFileAccess.ts index 875e06e0ca..54f43ce270 100644 --- a/frontend/src/utils/protectedFileAccess.ts +++ b/frontend/src/utils/protectedFileAccess.ts @@ -134,6 +134,17 @@ function tenantRequestHeaders(): Record { * 为一个存储路径构造代理请求。返回 null 表示当前上下文无法发起该请求 * (非存储路径,或嵌入上下文尚未拿到 token),调用方应跳过并稍后重试。 */ +export function buildProtectedFileFallbackRequest( + sourceURL: string, + access: ProtectedFileAccessContext, +): ProtectedFileRequest | null { + // 訊息範圍代理晚於部分自架後端才加入;若該端點回傳 404,改以既有的 + // 已驗證 /files 路徑重試。不可降級嵌入訪客,因其沒有租戶憑證。 + if (access.mode !== 'message' || !isProviderFileURL(sourceURL.trim())) return null; + const query = new URLSearchParams({ file_path: sourceURL.trim() }).toString(); + return { url: `/files?${query}`, headers: tenantRequestHeaders() }; +} + export function buildProtectedFileRequest( sourceURL: string, access: ProtectedFileAccessContext, diff --git a/frontend/src/utils/security.ts b/frontend/src/utils/security.ts index 224a67cecd..a9899e6e1c 100644 --- a/frontend/src/utils/security.ts +++ b/frontend/src/utils/security.ts @@ -11,6 +11,7 @@ import { markdownDomPurifySecurityHooks, } from './markdownDomPurify.ts'; import { + buildProtectedFileFallbackRequest, buildProtectedFileRequest, isProtectedFileProxyPath, isProviderFileURL, @@ -537,7 +538,26 @@ export async function hydrateProtectedFileImages( credentials: 'include', }); if (!resp.ok) { + // 新版前端可使用訊息範圍圖片代理;較舊的自架後端沒有該端點, + // 但仍可透過已驗證的租戶 /files 代理讀取同一資源,因此僅在 404 + // 時進行相容性重試。 if (resp.status === 404) { + const fallback = buildProtectedFileFallbackRequest(sourceURL, resolvedAccess); + if (fallback) { + const fallbackResp = await fetch(fallback.url, { + method: 'GET', + headers: fallback.headers, + credentials: 'include', + }); + if (fallbackResp.ok) { + const blob = await fallbackResp.blob(); + const blobURL = URL.createObjectURL(blob); + protectedFileBlobCache.set(requestURL, blobURL); + protectedFileBlobCache.set(fallback.url, blobURL); + protectedFileFailureCache.delete(requestURL); + return { status: 'loaded', blobURL }; + } + } protectedFileFailureCache.set(requestURL, Date.now()); return { status: 'missing' }; } diff --git a/frontend/src/views/auth/Login.vue b/frontend/src/views/auth/Login.vue index edd29b1e2a..c54c44a7f2 100755 --- a/frontend/src/views/auth/Login.vue +++ b/frontend/src/views/auth/Login.vue @@ -433,6 +433,7 @@ const inviteLookupLoading = ref(false) // Language options const languageOptions = [ { value: 'zh-CN', label: '简体中文', shortLabel: '中文', flag: '🇨🇳' }, + { value: 'zh-TW', label: '繁體中文', shortLabel: '繁中', flag: '🇹🇼' }, { value: 'en-US', label: 'English', shortLabel: 'EN', flag: '🇺🇸' }, { value: 'ru-RU', label: 'Русский', shortLabel: 'RU', flag: '🇷🇺' }, { value: 'ko-KR', label: '한국어', shortLabel: '한국어', flag: '🇰🇷' } diff --git a/frontend/src/views/settings/GeneralSettings.vue b/frontend/src/views/settings/GeneralSettings.vue index 74ad9e6ba3..7c24f189e7 100755 --- a/frontend/src/views/settings/GeneralSettings.vue +++ b/frontend/src/views/settings/GeneralSettings.vue @@ -20,6 +20,7 @@ style="width: 280px;" > {{ $t('language.zhCN') }} + 繁體中文 {{ $t('language.enUS') }} {{ $t('language.ruRU') }} {{ $t('language.koKR') }} diff --git "a/zh-TW-\344\277\256\346\224\271\350\252\252\346\230\216.md" "b/zh-TW-\344\277\256\346\224\271\350\252\252\346\230\216.md" new file mode 100644 index 0000000000..380c60d4fb --- /dev/null +++ "b/zh-TW-\344\277\256\346\224\271\350\252\252\346\230\216.md" @@ -0,0 +1,187 @@ +# 台灣繁體中文(zh-TW)語系包修改說明 + +## 專案概述 +本文件記錄 WeKnora 前端專案新增台灣繁體中文語系包的所有修改內容,包含語系檔案建立、國際化框架註冊、UI 選單適配、用語校正與部署流程。 + +--- + +## 修改檔案清單 + +### 1. 語系核心檔案 +| 檔案路徑 | 修改內容 | +|---------|---------| +| `frontend/src/i18n/locales/zh-TW.ts` | **新增**。以 `zh-CN.ts` 為基準模板,建立台灣繁體中文語系包(共 6358 行) | + +### 2. 國際化框架註冊 +| 檔案路徑 | 修改內容 | +|---------|---------| +| `frontend/src/i18n/index.ts` | 新增 `zh_TW` 動態匯入邏輯與載入註冊 | +| `frontend/src/i18n/resolveDefaultLocale.ts` | 將 `zh-TW` 加入預設語系解析優先級(瀏覽器語言比對) | +| `frontend/src/i18n/localeKeyAudit.ts` | 將 `zh-TW` 納入語系金鑰審計清單,確保與 `zh-CN` key 數量一致 | +| `frontend/src/i18n/embed.ts` | 支援嵌入頁面自動偵測 `zh-TW` 語系偏好 | + +### 3. 全域 UI 適配 +| 檔案路徑 | 修改內容 | +|---------|---------| +| `frontend/src/App.vue` | 匯入 TDesign `zh_TW` 本地化配置並註冊至 `TDesignProvider` | +| `frontend/src/views/auth/Login.vue` | 登陸頁面語系切換選單新增 `zh-TW` 選項 | +| `frontend/src/views/settings/GeneralSettings.vue` | 一般設定頁語系下拉選單支援繁體中文 | +| `frontend/src/views/agent/AgentEmbedChannelPanel.vue` | Agent 嵌入渠道設定頁語系適配 | + +--- + +## 用語校正統計 + +初始版本執行 **19 組詞彙映射**,全面替換中國大陸用語為台灣繁體中文用語,初步修正 **685 處**。後續完整複核再以 OpenCC `s2twp` 僅處理翻譯值,並人工保留台灣慣用字(如「群」、「核」);共校正 2,076 個語系項目,包含「快速問答」、「智慧體」、「載入」、「連結」、「登入」、「使用者」、「支援」等用語。 + +### 主要替換對應表 +| 大陸用語 | 台灣繁體中文 | 說明 | +|---------|-------------|------| +| 创建 | 建立 | Create | +| 搜索 | 搜尋 | Search | +| 账户 | 帳號 | Account | +| 密钥 | 金鑰 | Secret Key | +| 服务器 | 伺服器 | Server | +| 二维码 | QR 碼 | QR Code | +| 变量 | 變數 | Variable | +| 恢复 | 還原 | Restore | +| 凭证 | 憑證 | Credential | +| 配置 | 設定 | Configuration | +| 取消 | 取消 | Cancel(一致) | +| 确定 | 確定 | Confirm | +| 删除 | 刪除 | Delete | +| 编辑 | 編輯 | Edit | +| 详情 | 詳細資訊 | Details | +| 状态 | 狀態 | Status | +| 参数 | 參數 | Parameter | +| 权限 | 權限 | Permission | +| 导入/导出 | 匯入/匯出 | Import/Export | + +### 校正方法 +使用 Python Regex 腳本進行批量替換,確保: +- 僅替換翻譯值(value),不影響程式碼金鑰(key) +- 避免誤觸發變數名稱與 API 端點 +- 執行多次 Regex 交叉驗證,確認零殘留 + +--- + +## 技術細節 + +### 國際化架構 +- **框架**:`vue-i18n` v9+ +- **UI 組件庫**:`TDesign Vue Next`(含內建本地化配置) +- **動態載入**:使用 `import()` 惰性載入語系 chunk,減少初始包體積 +- **語系偵測順序**: + 1. 使用者手動設定(localStorage) + 2. 瀏覽器 `navigator.language` + 3. 預設回退至 `zh-CN` + +### 語系金鑰審計 +專案內建 `localeKeyAudit.ts` 腳本,執行 `npm run locale-key-audit` 時會自動: +1. 掃描 `zh-CN.ts` 所有金鑰 +2. 比對 `zh-TW.ts` 是否存在對應金鑰 +3. 輸出缺失金鑰報告,防止 `missing translation` 警告 + +--- + +## 部署流程 + +### 遠端環境資訊 +- **容器主機**:`172.21.10.92` +- **SSH 跳板**:`172.21.10.94` +- **登入帳號**:`leonoxo` +- **專案路徑**:`/mnt/weknora/` +- **容器名稱**:`WeKnora-frontend`、`WeKnora-app` + +### 部署步驟 +1. 本機執行 `npm ci` 安裝依賴 +2. 執行 `npm run build` 編譯前端 +3. 壓縮 `dist/` 為 `frontend-dist.tar.gz` +4. 透過 `scp` 推送至遠端 `/tmp/` +5. 解壓縮至 `/mnt/weknora/frontend/dist/` +6. 執行 `docker compose up -d --build frontend` 重建映像檔並重啟容器 + +### 驗證方式 +- 檢查容器 JS Bundle 是否包含 `zh-TW` 字串 +- 瀏覽器開發者工具 `Network` 面板確認 `/assets/` 請求回傳 `200` +- 強制無快取重新載入(`⌘+Shift+R`)驗證語系生效 + +--- + +## 已知問題與解決方案 + +### 對話圖片顯示相容性(2026-08-14 更新) +**現象**:部分自架環境在載入 RAG 或歷史對話的知識庫圖片時,圖片短暫出現後消失;Nginx 可見下列請求回傳 `404`: +```text +/api/v1/sessions//messages//files?file_path=resource://... +``` + +**根因**:較新的前端具有 message-scoped 圖片代理機制,但搭配尚未提供此 API 路由的較舊自架後端時,該路由會回傳 `404`。前端既有邏輯將 `404` 視為檔案遺失並移除圖片,造成閃退觀感。這不是 MinerU 未保存圖片,也不是繁中翻譯內容造成。 + +**已部署的相容性修復**:前端仍先使用 message-scoped 路由;若取得 `404`,僅針對已登入的 message scope 自動以既有的租戶檔案路由重試: +```text +/files?file_path=resource://... +``` +Embed 訪客模式不會降級,以維持其 Embed token 的權限邊界。 + +**驗證**:使用繁中介面重新開啟既有 RAG 對話,圖片已可正常顯示,無須重新提問。 + +**目前部署 Image**: +```text +weknora-ui:zh-tw-v0.7.2-overlay-20260814 +``` + +**部署驗證(2026-08-14)**:已在官方 `v0.7.2` 前後端基準上重新編譯並部署;確認 served bundle 含 `zh-TW` 與受保護圖片相容性 fallback,並保留官方基準 Image: +```text +weknora-ui:official-v0.7.2-before-zh-tw-overlay-20260814 +``` + +**後續處置**:此相容性修復應以獨立 PR 提交,不混入 zh-TW 語系 PR。待後端版本原生支援上述 session/message 檔案路由後,才評估移除此 fallback。 + +### 聊天附件 TTL +聊天中「使用者直接上傳」的暫存附件另受下列設定管理,和知識庫(RAG)圖片是不同路徑: +```env +WEKNORA_CHAT_ATTACHMENT_TTL_HOURS=24 +``` +超過 TTL 的聊天附件可能被後端清理;可依實際保留政策調整 `.env` 後重啟 app 容器。 + +### 知識庫圖片儲存位置 +知識庫圖片與聊天附件不同,**不會被自動刪除**。存放位置: +- **容器內**:`WeKnora-app` 的 `/data/files/<空間ID>/<知識庫ID>/` +- **Docker Volume**:`weknora_data-files` +- 除非手動刪除知識庫或文件,否則圖片會永久保留 + +--- + +## PR 資訊 +- **PR 編號**:#2708 +- **狀態**:OPEN +- **URL**:https://github.com/Tencent/WeKnora/pull/2708 +- **CI 狀態**:CodeCC 安全掃描(自動執行,無需手動回覆) + +--- + +## 維護建議 + +### 未來語系更新 +1. 官方發布新版本後,執行 `npm run locale-key-audit` 檢查是否有新增金鑰 +2. 若有缺失,執行 `npm run regenerate-pruned-locales` 自動補齊 +3. 手動校對新增內容的台灣繁體中文翻譯 +4. 提交 PR 至官方倉庫 + +### 使用者偏好儲存 +語系偏好儲存在瀏覽器 `localStorage` 的 `weknora-locale` 金鑰中,清除快取會重置為系統預設。 + +--- + +## 版本紀錄 +| 日期 | 版本 | 修改內容 | +|------|------|---------| +| 2026-08-14 | v0.4 | 官方 UI Image 更新後,以 v0.7.2 基準重新部署 zh-TW Overlay;保留官方 Image 備份並驗證語系 bundle、內建智能體繁中名稱與圖片 fallback | +| 2026-08-14 | v0.3 | 完整複核 zh-TW 全部翻譯值;以 OpenCC `s2twp` 校正 2,076 個項目,確認「快速問答」等簡體用語零殘留,並完成語系審計與 production build 驗證 | +| 2026-08-14 | v0.2 | 更正 RAG 圖片閃退根因為新舊前後端圖片代理 API 不相容;記錄部署的 fallback Image 與獨立修復 PR 策略 | +| 2026-08-14 | v0.1 | 初始建立 zh-TW 語系包,完成 19 組用語校正、6 個核心檔案修改、遠端部署與 PR 提交 | + +--- + +*本文件由團隊協作產生,最後更新:2026-08-14*