diff --git a/apps/desktop/src/main/__tests__/bot-chat-detail.test.ts b/apps/desktop/src/main/__tests__/bot-chat-detail.test.ts index fe9c4040ca..02d8d08cd2 100644 --- a/apps/desktop/src/main/__tests__/bot-chat-detail.test.ts +++ b/apps/desktop/src/main/__tests__/bot-chat-detail.test.ts @@ -81,13 +81,13 @@ const expectedCopy = { ], }, 'zh-TW': { - help: 'Telegram 使用者 ID 是 64 位整數;填入後只接收列表裡這些 ID 的來信,其它人發的訊息會被靜默忽略(不會回彈任何提示)。', - cappedHelp: 'Telegram 使用者 ID 是 64 位整數;填入後只接收列表裡這些 ID 的來信,其它人發的訊息會被靜默忽略(不會回彈任何提示)。 (已達到上限)', + help: 'Telegram 使用者 ID 是 64 位元整數;填入後只接收清單裡這些 ID 的來信,其他使用者傳送的訊息會被直接忽略(不會回覆任何提示)。', + cappedHelp: 'Telegram 使用者 ID 是 64 位元整數;填入後只接收清單裡這些 ID 的來信,其他使用者傳送的訊息會被直接忽略(不會回覆任何提示)(已達到上限)。', warnings: [ - [1, '下列不是數字 ID,可能是使用者名稱之類的輸入,符合不到任何人:@alice'], - [3, '下列不是數字 ID,可能是使用者名稱之類的輸入,符合不到任何人:@alice、@bob、@carol'], - [4, '下列不是數字 ID,可能是使用者名稱之類的輸入,符合不到任何人:@alice、@bob、@carol 等 4 項'], - [5, '下列不是數字 ID,可能是使用者名稱之類的輸入,符合不到任何人:@alice、@bob、@carol 等 5 項'], + [1, '以下輸入不是數字 ID,可能是使用者名稱,因此無法對應到任何使用者:@alice'], + [3, '以下輸入不是數字 ID,可能是使用者名稱,因此無法對應到任何使用者:@alice、@bob、@carol'], + [4, '以下輸入不是數字 ID,可能是使用者名稱,因此無法對應到任何使用者:@alice、@bob、@carol 等 4 項'], + [5, '以下輸入不是數字 ID,可能是使用者名稱,因此無法對應到任何使用者:@alice、@bob、@carol 等 5 項'], ], }, en: { diff --git a/apps/desktop/src/main/__tests__/connection-settings-locale-render.test.ts b/apps/desktop/src/main/__tests__/connection-settings-locale-render.test.ts index 5c0da75522..55cf5b6210 100644 --- a/apps/desktop/src/main/__tests__/connection-settings-locale-render.test.ts +++ b/apps/desktop/src/main/__tests__/connection-settings-locale-render.test.ts @@ -130,10 +130,10 @@ const localeCases = [ { locale: 'zh-TW', direct: '直接連線', transit: '成員轉送', save: '儲存供應商', slugErrors: { - required: '請填寫連線標識', - format: '連線標識只能包含小寫字母、數字和連字號', - too_long: '連線標識不能超過 64 個字元', - duplicate: '連線標識已存在', + required: '請填寫連線識別碼', + format: '連線識別碼只能包含小寫字母、數字和連字號', + too_long: '連線識別碼不能超過 64 個字元', + duplicate: '連線識別碼已存在', }, }, { diff --git a/apps/desktop/src/main/__tests__/settings-memory-copy.test.ts b/apps/desktop/src/main/__tests__/settings-memory-copy.test.ts index d18566f593..255c5b8dbe 100644 --- a/apps/desktop/src/main/__tests__/settings-memory-copy.test.ts +++ b/apps/desktop/src/main/__tests__/settings-memory-copy.test.ts @@ -85,30 +85,30 @@ const formattedCopy = { }, 'zh-TW': { counts: [ - ['0 則生效', '草稿 0 則生效', '0 則已歸檔', '草稿 0 則已歸檔', '0 則記憶'], - ['1 則生效', '草稿 1 則生效', '1 則已歸檔', '草稿 1 則已歸檔', '1 則記憶'], - ['2 則生效', '草稿 2 則生效', '2 則已歸檔', '草稿 2 則已歸檔', '2 則記憶'], + ['0 則生效', '草稿 0 則生效', '0 則已封存', '草稿 0 則已封存', '0 則記憶'], + ['1 則生效', '草稿 1 則生效', '1 則已封存', '草稿 1 則已封存', '1 則記憶'], + ['2 則生效', '草稿 2 則生效', '2 則已封存', '草稿 2 則已封存', '2 則記憶'], ], summaries: [ ['目前 0 則生效;已保留上一版備份。', '0 則生效'], ['目前 1 則生效;已保留上一版備份。', '1 則生效'], ['目前 2 則生效;已保留上一版備份。', '2 則生效'], - ['目前 0 則生效 / 2 則已歸檔;已保留上一版備份。', '0 則生效 / 2 則已歸檔'], - ['目前 1 則生效 / 1 則已歸檔;已保留上一版備份。', '1 則生效 / 1 則已歸檔'], - ['目前 1 則生效 / 2 則已歸檔;已保留上一版備份。', '1 則生效 / 2 則已歸檔'], - ['目前 2 則生效 / 1 則已歸檔;已保留上一版備份。', '2 則生效 / 1 則已歸檔'], - ['目前 2 則生效 / 2 則已歸檔;已保留上一版備份。', '2 則生效 / 2 則已歸檔'], + ['目前 0 則生效 / 2 則已封存;已保留上一版備份。', '0 則生效 / 2 則已封存'], + ['目前 1 則生效 / 1 則已封存;已保留上一版備份。', '1 則生效 / 1 則已封存'], + ['目前 1 則生效 / 2 則已封存;已保留上一版備份。', '1 則生效 / 2 則已封存'], + ['目前 2 則生效 / 1 則已封存;已保留上一版備份。', '2 則生效 / 1 則已封存'], + ['目前 2 則生效 / 2 則已封存;已保留上一版備份。', '2 則生效 / 2 則已封存'], ], redacted: [ '寫入前已遮蔽疑似 token、API key 或密碼;目前 1 則生效;已保留上一版備份。', - '寫入前已遮蔽疑似 token、API key 或密碼;目前 1 則生效 / 2 則已歸檔;已保留上一版備份。', + '寫入前已遮蔽疑似 token、API key 或密碼;目前 1 則生效 / 2 則已封存;已保留上一版備份。', ], backupFailures: ['開啟重置前備份失敗', '開啟恢復前備份失敗', '開啟儲存前備份失敗'], preview: ['預覽已依 8,000 字元上限截斷', '預覽 1,234 / 8,000 字元', 'prompt 上限 8,000 字元'], labels: [ '0 / 0 則符合', '1 / 2 則符合', 'Memory #2清單', 'Memory #2 記憶操作', - '歸檔:Memory #2', '開啟備份候選 Backup #2', '還原備份候選 Backup #2', - '複製備份候選引用 Backup #2', '歸檔到草稿,儲存前不會寫入 MEMORY.md', + '封存:Memory #2', '開啟備份候選 Backup #2', '還原備份候選 Backup #2', + '複製備份候選引用 Backup #2', '封存到草稿,儲存前不會寫入 MEMORY.md', '恢復到草稿,儲存前不會寫入 MEMORY.md', '會先備份目前的 MEMORY.md,再以最近一次備份覆蓋目前檔案。將還原:Backup #2', '會先備份目前的 MEMORY.md,再以選取的備份覆蓋目前檔案。將還原:Backup #2', diff --git a/apps/desktop/src/main/runtime-host-wsl-handoff.ts b/apps/desktop/src/main/runtime-host-wsl-handoff.ts index e1847646ec..984c9eb692 100644 --- a/apps/desktop/src/main/runtime-host-wsl-handoff.ts +++ b/apps/desktop/src/main/runtime-host-wsl-handoff.ts @@ -127,9 +127,9 @@ const GUIDANCE = { }, 'zh-TW': { client: '請更新 Desktop,使它與此 Host 相容。不會降級現有 Host。', - binding: 'WSL 管理綁定不可用。請先在 Runtime Host 設定中恢復管理入口,再進行更新。', - source: '已安裝的 WSL 管理程式無法驗證正在執行的按需 Host。請在 Runtime Host 設定中檢查服務狀態。', + binding: 'WSL 管理綁定無法使用。請先在 Runtime Host 設定中恢復管理入口,再進行更新。', + source: '已安裝的 WSL 管理程式無法驗證正在執行的依需求啟動的 Host。請在 Runtime Host 設定中檢查服務狀態。', target: '目前 Desktop 無法驗證合適的替換套件。請更新 Desktop,或透過開發環境明確管理選定的開發套件;現有 Host 會被保留。', - development: '選定的開發構建', + development: '選定的開發建置版本', }, } as const; diff --git a/apps/desktop/src/main/startup-progress-window.ts b/apps/desktop/src/main/startup-progress-window.ts index 6bc3c2ac01..88de3d4cbb 100644 --- a/apps/desktop/src/main/startup-progress-window.ts +++ b/apps/desktop/src/main/startup-progress-window.ts @@ -57,8 +57,8 @@ const COPY = { }, 'zh-TW': { title: '正在開啟工作區', detail: 'Maka 正在準備本機背景服務。', - slow: '此次啟動耗時較長。更新可能需要下載或建置安裝套件;你可以最小化此視窗,Maka 會繼續處理。', - copy: '複製診斷資訊', copied: '已複製診斷資訊', copyFailed: '無法複製診斷資訊', elapsed: '已用時', + slow: '此次啟動耗時較長。更新可能需要下載或建置安裝套件;你可以將此視窗最小化,Maka 會繼續處理。', + copy: '複製診斷資訊', copied: '已複製診斷資訊', copyFailed: '無法複製診斷資訊', elapsed: '已耗時', phases: { prepare: '正在準備 Maka', storage: '正在檢查本機資料', connect: '正在連線至 Runtime Host', package: '正在準備 Runtime Host 安裝套件', checking: '正在檢查託管服務', diff --git a/apps/desktop/src/renderer/features/connection-settings/settings-provider-copy.ts b/apps/desktop/src/renderer/features/connection-settings/settings-provider-copy.ts index 13b6193d02..1e46422e7d 100644 --- a/apps/desktop/src/renderer/features/connection-settings/settings-provider-copy.ts +++ b/apps/desktop/src/renderer/features/connection-settings/settings-provider-copy.ts @@ -287,10 +287,10 @@ const zhTwCopy = { detail: { deviceCode: '登入碼:', delete: '刪除', cancel: '取消', deleteUnused: '不再需要,刪除連線', - deleteFailed: '刪除模型連線失敗', credentialReadFailed: '讀取模型憑據狀態失敗', refreshFailed: '重新整理模型連線失敗', + deleteFailed: '刪除模型連線失敗', credentialReadFailed: '讀取模型憑證狀態失敗', refreshFailed: '重新整理模型連線失敗', saveFailed: '儲存模型連線失敗', saveModelsFailed: '儲存啟用模型失敗', modelKey: '模型金鑰', pasteModelKey: '貼上模型金鑰', getModelKey: '取得模型金鑰', saving: '儲存中…', - advancedRequest: '高階請求設定', advancedRequestHelp: '為這個連線的 HTTP 請求新增請求頭和額外 JSON 請求體。請求頭值作為憑據儲存在本機。', + advancedRequest: '高階請求設定', advancedRequestHelp: '為這個連線的 HTTP 請求新增請求頭和額外 JSON 請求體。請求頭值作為憑證儲存在本機。', requestHeaders: '自訂請求頭', headerName: '請求頭名稱', headerValue: '請求頭值', retainedHeaderValue: '保留已儲存的值', addHeader: '新增請求頭', removeHeader: '移除', noRequestHeaders: '未設定自訂請求頭。', extraRequestBody: '額外請求體(JSON)', extraRequestBodyHelp: '僅新增頂層欄位;若與 Maka 生成的欄位重名,請求會明確失敗。', requestCustomizationInvalid: '請求設定無效', requestHeadersInvalidDetail: '請檢查請求頭名稱和值。', requestBodyInvalidDetail: '請輸入符合要求的 JSON 物件。', saveAdvancedRequest: '儲存高階請求設定', configuredHeaders: (count: number) => `${count} 個請求頭`, noAdvancedRequest: '未設定', oauthLoggedIn: 'OAuth 已登入', oauthLoading: 'OAuth 狀態讀取中', oauthUnknown: 'OAuth 狀態未知', oauthWaiting: '等待 OAuth 登入', @@ -300,9 +300,9 @@ const zhTwCopy = { oauthWaitingDetail: '請到帳號連線完成登入;登入成功後會自動出現在模型連線裡。', oauthRetired: '此登入方式已停用', oauthRetiredDetail: - '這條連線使用的登入方式已從 Maka 移除,無法再登入,也無法用於對話。改用 Anthropic API Key 連線即可繼續使用 Claude 模型;刪除這條連線會一併清除本機儲存的登入憑據。', - credentialLoadingDetail: '正在讀取模型憑據狀態,讀取完成前暫不測試連線或重新整理模型。', - credentialUnknownDetail: '模型憑據狀態暫時沒重新整理成功,已避免把未知狀態顯示成未登入或未設定。', + '這條連線使用的登入方式已從 Maka 移除,無法再登入,也無法用於對話。改用 Anthropic API Key 連線即可繼續使用 Claude 模型;刪除這條連線會一併清除本機儲存的登入憑證。', + credentialLoadingDetail: '正在讀取模型憑證狀態,讀取完成前暫不測試連線或重新整理模型。', + credentialUnknownDetail: '模型憑證狀態暫時沒重新整理成功,已避免把未知狀態顯示成未登入或未設定。', testConnection: '測試連線', updateModels: '更新模型目錄', endpoint: '服務地址', connectionName: '名稱', @@ -329,7 +329,7 @@ const zhTwCopy = { endpointManaged: '由帳號登入或服務商管理', endpointMissing: '尚未設定服務地址', endpointModelOverridesNote: '部分模型會透過其他服務端點發送請求', - endpointCredentialsMasked: '已儲存的地址內嵌憑據,編輯時預設隱藏', + endpointCredentialsMasked: '已儲存的地址內嵌憑證,編輯時預設隱藏', modelManagement: '模型', disconnectAndDelete: '退出帳號並刪除', login: '登入', loggingIn: '登入中…', relogin: '重新登入', @@ -341,18 +341,18 @@ const zhTwCopy = { enableModelAria: (name: string) => `啟用模型 ${name}`, declareCapabilities: '設定參數', declareCapabilitiesAria: (name: string) => `設定模型參數:${name}`, modelUndescribed: '缺少該模型的參數資訊,請手動設定。', - visionToken: '视觉', thinkingToken: '思考', contextToken: (value: string) => `${value} 上下文`, + visionToken: '視覺', thinkingToken: '思考', contextToken: (value: string) => `${value} 上下文`, noModels: '暫無可選模型,請先更新模型目錄。', - keySet: '已設定', statusLoading: '正在讀取狀態', credentialUnknown: '憑據狀態未知', keyMissing: '尚未設定金鑰', + keySet: '已設定', statusLoading: '正在讀取狀態', credentialUnknown: '憑證狀態未知', keyMissing: '尚未設定金鑰', keyTroubleshooting: '模型金鑰 / 服務地址 / 代理設定', endpointTroubleshooting: '本地服務 / 服務地址 / 代理設定', oauthTroubleshooting: 'OAuth 登入 / 代理設定', - unknownDescription: (provider: string) => `該連線使用的 provider「${provider}」在目前版本未註冊。設定和憑據會保留,切回支援它的版本即可繼續使用。`, + unknownDescription: (provider: string) => `該連線使用的 provider「${provider}」在目前版本未註冊。設定和憑證會保留,切回支援它的版本即可繼續使用。`, deleteProviderTitle: (name: string) => `刪除供應商 ${name}?`, deleteConnectionTitle: (name: string) => `刪除模型連線 ${name}?`, - deleteUnknownDescription: '刪除後,支援該 provider 的其他版本也無法恢復這條連線及其憑據。', + deleteUnknownDescription: '刪除後,支援該 provider 的其他版本也無法恢復這條連線及其憑證。', deleteDescription: (isDefault: boolean, disconnectsAccount: boolean) => [ disconnectsAccount - ? '這會退出本機帳號、刪除 OAuth 憑據和模型連線;重新整理後不會自動重建立立。' - : '這會刪除模型連線及其本機憑據;如需再次使用,需要重新新增。', + ? '這會退出本機帳號、刪除 OAuth 憑證和模型連線;重新整理後不會自動重新建立。' + : '這會刪除模型連線及其本機憑證;如需再次使用,需要重新新增。', isDefault ? '它目前是預設連線;刪除後預設模型會變成未設定,已有任務可能需要重新選擇模型。' : '', @@ -364,18 +364,18 @@ const zhTwCopy = { connectionTestError: (name: string) => `連線測試出錯 · ${name}`, modelsFetched: (count: number, name: string) => `已拉取 ${count} 個模型 · ${name}`, modelsFetchFailed: (name: string) => `拉取模型失敗 · ${name}`, modelsFetchFailedDetail: (message: string, troubleshooting: string) => `${message} · 目前繼續顯示靜態列表,請確認 ${troubleshooting} 後重試。`, - authTroubleshooting: (value: string) => `鑑權失敗,請確認 ${value} 後重試。`, recheckTroubleshooting: (value: string) => `檢查 ${value} 後重試。`, + authTroubleshooting: (value: string) => `驗證失敗,請確認 ${value} 後重試。`, recheckTroubleshooting: (value: string) => `檢查 ${value} 後重試。`, modelKeyAria: (name: string) => `${name} 模型金鑰`, }, shared: { connectionStale: '連線狀態已更新,請重新整理清單後再刪除。', actionFallback: '模型連線服務暫時不可用,請稍後重試。', rateLimit: '目前帳號或模型服務觸發速率限制,請稍後重試。', - timeout: '請求超時,請檢查網路或代理後重試。', unavailable: '模型服務暫時不可用,請稍後重試。', + timeout: '請求逾時,請檢查網路或代理後重試。', unavailable: '模型服務暫時不可用,請稍後重試。', network: '網路錯誤,請檢查服務地址或代理設定後重試。', statusUnavailable: '連線測試狀態暫時無法顯示,請重新測試。', filterMatches: (count: number) => (count === 0 ? '沒有符合的結果' : `${count} 個符合結果`), connectionStatuses: { retired: '已停用 · 請刪除', reauth: '需要重新登入', disabledFailed: '暫不可用 · 上次連線失敗', disabled: '暫不可用', failed: '上次連線失敗' }, lastTest: { - auth: '鑑權失敗', timeout: '請求超時', provider_unavailable: '模型服務回傳錯誤', network: '網路錯誤', invalid_response: '模型服務回傳錯誤', unknown: '連線測試失敗', + auth: '驗證失敗', timeout: '請求逾時', provider_unavailable: '模型服務回傳錯誤', network: '網路錯誤', invalid_response: '模型服務回傳錯誤', unknown: '連線測試失敗', }, }, panel: { @@ -398,14 +398,14 @@ const zhTwCopy = { cardAria: (name: string, description: string) => `新增模型供應商:${name},${description}`, }, add: { - slugIssues: { required: '請填寫連線標識', format: '連線標識只能包含小寫字母、數字和連字號', too_long: '連線標識不能超過 64 個字元' }, duplicateSlug: '連線標識已存在', cloudflareAccount: '請填寫 Cloudflare Account ID', endpointRequired: '這個供應商需要填寫服務地址', + slugIssues: { required: '請填寫連線識別碼', format: '連線識別碼只能包含小寫字母、數字和連字號', too_long: '連線識別碼不能超過 64 個字元' }, duplicateSlug: '連線識別碼已存在', cloudflareAccount: '請填寫 Cloudflare Account ID', endpointRequired: '這個供應商需要填寫服務地址', accountLogin: '請到帳號連線完成登入;登入成功後會自動建立模型連線。', apiKeyPlaceholder: '輸入或貼上 API Key', cancel: '取消', accountTitle: '使用帳號連線登入', advancedRequest: '高階請求設定', expandAdvancedRequest: '展開高階請求設定', collapseAdvancedRequest: '收起高階請求設定', requestHeaders: '自訂請求頭', headerName: '請求頭名稱', headerValue: '請求頭值', retainedHeaderValue: '保留已儲存的值', addHeader: '新增請求頭', removeHeader: '移除', noRequestHeaders: '未設定自訂請求頭。', - extraRequestBody: '額外請求體(JSON)', extraRequestBodyHelp: '僅新增頂層欄位;與 Maka 生成欄位重名時會明確失敗。請求頭值將作為憑據儲存在本機。', requestCustomizationInvalid: '請檢查高階請求設定。', + extraRequestBody: '額外請求體(JSON)', extraRequestBodyHelp: '僅新增頂層欄位;與 Maka 生成欄位重名時會明確失敗。請求頭值將作為憑證儲存在本機。', requestCustomizationInvalid: '請檢查高階請求設定。', accountDetail: '不要在這裡手動新增;請回到模型連線頁的帳號連線完成登入,Maka 會自動建立並重新整理模型連線。', - slug: '連線標識', name: '顯示名稱', + slug: '連線識別碼', name: '顯示名稱', accountIdPlaceholder: '填寫帳號 ID', saving: '儲存中…', save: '儲存供應商', keyRequired: (name: string) => `請填寫 ${name} API Key`, apiKeyLabel: 'API Key', accountIdLabel: 'Cloudflare Account ID', endpointLabel: '服務地址', @@ -424,29 +424,29 @@ const zhTwCopy = { retry: '請稍後再試。', startFailed: '無法開始登入', startFailedRetry: '無法開始登入,請稍後再試。', openFailed: '無法開啟瀏覽器', openFailedRetry: '無法開啟瀏覽器,請稍後重試。', loginSuccess: '登入成功', bound: (name: string) => `${name} 已繫結本機。`, incomplete: '登入未完成', incompleteRetry: '登入未完成,請重新開啟瀏覽器授權。', loginFailed: '登入失敗', - logoutDescription: '將刪除本機儲存的訂閱憑據,之後需要重新登入才能繼續使用這些 OAuth 模型。', logout: '退出登入', cancel: '取消', - loggedOut: '已退出登入', credentialsCleared: '本地憑據已清除。', logoutFailed: '退出失敗', logoutFailedRetry: '退出登入失敗,請稍後重試。', + logoutDescription: '將刪除本機儲存的訂閱憑證,之後需要重新登入才能繼續使用這些 OAuth 模型。', logout: '退出登入', cancel: '取消', + loggedOut: '已退出登入', credentialsCleared: '本地憑證已清除。', logoutFailed: '退出失敗', logoutFailedRetry: '退出登入失敗,請稍後重試。', serviceUnavailable: '登入服務暫時不可用,請檢查網路後重試。', loginConflict: '上一輪瀏覽器登入仍在進行或已切換,請再按一次登入,或稍後再試。', browserPresentFailed: '無法開啟系統瀏覽器完成登入,請檢查是否封鎖了彈出式視窗後再試。', resultCodes: { copilot_classic_pat_unsupported: 'GitHub Copilot 不支援 classic PAT;請使用相容 OAuth 登入或具有 Copilot Requests 權限的 fine-grained PAT。', - copilot_credential_type_unsupported: '目前的 GitHub 憑據類型不受支援;請使用相容 OAuth 登入或 fine-grained PAT。', - copilot_local_credential_missing: '找不到可匯入的 GitHub 憑據;請先使用 gh 登入或設定相容憑據。', - copilot_import_no_credential: 'GitHub Copilot 登入沒有產生可用憑據。', + copilot_credential_type_unsupported: '目前的 GitHub 憑證類型不受支援;請使用相容 OAuth 登入或 fine-grained PAT。', + copilot_local_credential_missing: '找不到可匯入的 GitHub 憑證;請先使用 gh 登入或設定相容憑證。', + copilot_import_no_credential: 'GitHub Copilot 登入沒有產生可用憑證。', copilot_import_superseded: 'GitHub Copilot 帳號在匯入期間發生變化,請重試。', copilot_subscription_unavailable: '目前的 GitHub 帳號沒有可用的 Copilot 訂閱權限。', - copilot_credential_import_rejected: '目前的 GitHub 憑據無法匯入,請檢查憑據後重試。', + copilot_credential_import_rejected: '目前的 GitHub 憑證無法匯入,請檢查憑證後重試。', copilot_subscription_check_failed: '暫時無法驗證 GitHub Copilot 訂閱狀態,請稍後重試。', copilot_import_commit_failed: 'GitHub Copilot 登入未能寫入 Runtime Host。', - experimental_disabled: '本機未啟用該帳號登入方式;可改用匯入相容憑據,或由管理員啟用後重試。', + experimental_disabled: '本機未啟用該帳號登入方式;可改用匯入相容憑證,或由管理員啟用後重試。', }, logoutTitle: (name: string) => `退出 ${name} 登入?`, }, oauthSection: { signedIn: '已登入', codexDescription: 'ChatGPT Plus / Pro 訂閱帳號登入。', xaiDescription: 'SuperGrok / X Premium 帳號登入。', configuredConnections: (count: number) => `已有 ${count} 個連線 · 新增另一個帳號`, - copilotDescription: '匯入相容 GitHub 憑據連線 Copilot 訂閱。', serviceUnavailable: '登入服務暫時不可用,請檢查網路後重試。', + copilotDescription: '匯入相容 GitHub 憑證連線 Copilot 訂閱。', serviceUnavailable: '登入服務暫時不可用,請檢查網路後重試。', aria: 'OAuth 登入', staleState: 'OAuth 登入狀態暫時沒重新整理成功,已保留上一次狀態。', codexDetail: '點選下方按鈕開啟裝置授權頁,並在頁面中輸入這裡顯示的登入碼。', xaiDetail: '點選下方按鈕開啟瀏覽器登入,授權完成後會自動回寫。', deviceCode: '登入碼:', @@ -454,12 +454,12 @@ const zhTwCopy = { copilotSubtitle: '匯入相容的 GitHub 登入;token 不會暴露給渲染程序。', copilotImported: '已匯入 GitHub Copilot 訂閱帳號。', copilotSetup: '請設定具有 Copilot Requests 權限的 fine-grained PAT;普通 gh auth login 可能不包含該權限。', importing: '匯入中…', copilotSignIn: '使用 GitHub 登入', copilotActionFailed: 'GitHub Copilot 帳號操作失敗', - copilotSignInDisabledHint: '本機未啟用 GitHub 登入;請改用匯入相容憑據,或由管理員啟用後重試。', - importCredential: '匯入相容憑據', + copilotSignInDisabledHint: '本機未啟用 GitHub 登入;請改用匯入相容憑證,或由管理員啟用後重試。', + importCredential: '匯入相容憑證', loadingAccount: '正在載入帳號狀態…', authorizing: '請在彈出的瀏覽器視窗完成登入。', refreshing: '正在重新整理存取權杖…', refreshTokenFailed: '權杖重新整理失敗,請重新登入。', cardAria: (intent: 'add' | 'import' | 'manage', name: string, status: string | undefined, description: string) => `${intent === 'add' ? '新增' : intent === 'import' ? '匯入' : '管理'}帳號連線:${name}${status ? `,狀態:${status}` : ''},${description.replace(/[。.!!??]+$/u, '')}`, connectTitle: (name: string) => `連線 ${name}`, addAccountTitle: (name: string) => `新增 ${name} 帳號`, login: (name: string) => `登入 ${name}`, loginAndAdd: '登入並新增', signedOut: (name: string) => `${name} 尚未登入。`, - storageFailed: (name: string) => `${name} 本地憑據讀取失敗,請重新登入。`, providerUnavailable: (name: string) => `${name} 已登入,但目前 provider 狀態不可用。`, + storageFailed: (name: string) => `${name} 本地憑證讀取失敗,請重新登入。`, providerUnavailable: (name: string) => `${name} 已登入,但目前 provider 狀態不可用。`, }, } as const; diff --git a/apps/desktop/src/renderer/features/workhub/locales/workhub-live-copy.ts b/apps/desktop/src/renderer/features/workhub/locales/workhub-live-copy.ts index 04ed11d84f..bf891e80cb 100644 --- a/apps/desktop/src/renderer/features/workhub/locales/workhub-live-copy.ts +++ b/apps/desktop/src/renderer/features/workhub/locales/workhub-live-copy.ts @@ -74,9 +74,9 @@ export const workHubLiveCopy = { openWork: '打开任务', openResult: '打开结果', }, 'zh-TW': { attachmentLimit: '附件數量或大小超過限制', attachmentUploadFailed: '附件上傳失敗', reviewAttachments: '請查看附件。', sendFailed: '傳送失敗', - retrySteering: '請先保留原文和附件,用 Shift+Enter 重試並確認上次提交結果。', - retryFollowup: '請先保留原文和附件,用 Enter 重試並確認上次提交結果。', - sendUnknown: 'Host 尚未確認這則訊息。重試會核對原提交。', + retrySteering: '請先保留原文和附件,用 Shift+Enter 重試並確認上次傳送結果。', + retryFollowup: '請先保留原文和附件,用 Enter 重試並確認上次傳送結果。', + sendUnknown: 'Host 尚未確認這則訊息。重試時會核對上次傳送的狀態。', sendNotAdmitted: 'Host 在接收這則訊息前已重新啟動,可以重試傳送。', modelConflict: '工作台已更新,請重新選擇模型。', undo: '復原上次修改', diff --git a/apps/desktop/src/renderer/locales/artifact-copy.ts b/apps/desktop/src/renderer/locales/artifact-copy.ts index 7c63bb5575..c878b9d013 100644 --- a/apps/desktop/src/renderer/locales/artifact-copy.ts +++ b/apps/desktop/src/renderer/locales/artifact-copy.ts @@ -134,7 +134,7 @@ const ARTIFACT_COPY = { previewNamed: (name) => `預覽 ${name}`, empty: '暫無生成檔案', emptyHint: '助手生成檔案後會顯示在這裡。', back: '返回生成檔案列表', moreActions: (name) => `${name} 的更多操作`, openInFinder: '在 Finder 中開啟', saveAs: '另存為', copy: '複製', - saveFailures: { not_found: '生成檔案不存在。', not_allowed: '生成檔案路徑檢查未透過。', write_failed: '目標位置無法寫入。', deleted: '生成檔案已刪除,不能另存。', source_failed: '生成檔案傳輸中斷,請重試。', size_mismatch: '生成檔案大小在傳輸過程中發生變化,請重試。', target_write_failed: '目標位置無法寫入。', replace_failed: '替換目標檔案失敗,原檔案已保留。', default: '無法儲存生成檔案。' }, + saveFailures: { not_found: '生成檔案不存在。', not_allowed: '生成檔案路徑檢查未通過。', write_failed: '目標位置無法寫入。', deleted: '生成檔案已刪除,不能另存。', source_failed: '生成檔案傳輸中斷,請重試。', size_mismatch: '生成檔案大小在傳輸過程中發生變化,請重試。', target_write_failed: '目標位置無法寫入。', replace_failed: '替換目標檔案失敗,原檔案已保留。', default: '無法儲存生成檔案。' }, actionFailed: '生成檔案操作失敗,請稍後重試。', }, preview: { @@ -146,7 +146,7 @@ const ARTIFACT_COPY = { highlightLimited: (limit, lines) => `為保證流暢,僅高亮前 ${limit}、最多 ${lines} 行,其餘內容以純文本顯示。`, diffLinesLimited: (count) => `為保證流暢,另有 ${count} 行未在預覽中展開。`, readFailed: { title: '無法讀取生成檔案', description: '路徑可能已被外部刪除。請透過更多選單「在 Finder 中開啟」檢查檔案位置。' }, - notAllowed: { title: '無法讀取生成檔案', description: '路徑檢查未透過,檔案已不在允許預覽的生成檔案目錄內。' }, + notAllowed: { title: '無法讀取生成檔案', description: '路徑檢查未通過,檔案已不在允許預覽的生成檔案目錄內。' }, tooLarge: (bytes) => ({ title: '檔案超出預覽大小', description: `${bytes} 位元組超過文本預覽閾值,請透過更多選單開啟或另存完整內容。` }), unsupportedMime: { title: '不支援的檔案型別', description: '該生成檔案的 MIME 型別不在內聯預覽允許列表中。請使用工具欄「在 Finder 中開啟」或「另存為」。' }, }, diff --git a/apps/desktop/src/renderer/locales/capability-reason-copy.ts b/apps/desktop/src/renderer/locales/capability-reason-copy.ts index 1178ebb03d..c3c381e629 100644 --- a/apps/desktop/src/renderer/locales/capability-reason-copy.ts +++ b/apps/desktop/src/renderer/locales/capability-reason-copy.ts @@ -50,9 +50,9 @@ const CAPABILITY_REASON_COPY = { }, 'zh-TW': { disabled: '此能力目前已關閉。', - platform_credentials_missing: '未設定平台憑據', + platform_credentials_missing: '未設定平台憑證', macos_tcc_only: '僅 macOS TCC 權限適用', - apple_events_tcc_status_unavailable: 'Electron 暫不支援讀取逐 App 的 Apple Events 授權狀態', + apple_events_tcc_status_unavailable: 'Electron 暫不支援讀取個別應用程式 的 Apple Events 授權狀態', cu_artifact_missing: '找不到通過完整性檢查的 Computer Use 執行器 artifact。', cu_backend_status: 'maka-cu artifact 已通過本機完整性檢查。', cu_backend_unavailable: 'Computer Use 後端目前無法使用。', diff --git a/apps/desktop/src/renderer/locales/conversation-copy.ts b/apps/desktop/src/renderer/locales/conversation-copy.ts index 2d52d8f182..f528da9eef 100644 --- a/apps/desktop/src/renderer/locales/conversation-copy.ts +++ b/apps/desktop/src/renderer/locales/conversation-copy.ts @@ -721,7 +721,7 @@ const COPY = { inspector: '追蹤', sideChat: '側邊對話', sideChatNumbered: (index) => `側邊對話 ${index}`, - openTab: '開啟或關閉工作欄的面', + openTab: '開啟或關閉工作欄面板', openTools: '開啟工具', launcher: { review: '檢視目前 Git 工作區變化', diff --git a/apps/desktop/src/renderer/locales/session-collaboration-copy.ts b/apps/desktop/src/renderer/locales/session-collaboration-copy.ts index 100240a654..6eb31fec55 100644 --- a/apps/desktop/src/renderer/locales/session-collaboration-copy.ts +++ b/apps/desktop/src/renderer/locales/session-collaboration-copy.ts @@ -192,7 +192,7 @@ const ZH_TW = { connectionFailed: '無法加入分享任務', cancelFailed: '無法取消加入分享任務', mountLimit: (max: number) => `最多可保留 ${max} 個已加入的分享任務`, - directPathUnavailable: '尚未建立直連。請確認分享者在線,並檢查雙方的 VPN、代理或防火牆;若網路無法打洞,可使用已知 Mesh 節點的轉送。', + directPathUnavailable: '尚未建立直接連線。請確認分享者在線上,並檢查雙方的 VPN、代理或防火牆;若無法透過 NAT 穿透建立連線,可使用已知 Mesh 節點的轉送。', insecureTitle: '此連線未加密', insecureBody: '訪客憑證、完整任務內容和輪次請求可能被同一網路中的第三方攔截。僅在你了解並接受風險時繼續。', shareInsecure: '接受風險並建立', diff --git a/apps/desktop/src/renderer/locales/session-local-copy.ts b/apps/desktop/src/renderer/locales/session-local-copy.ts index c96e9ff98b..9764a58ea9 100644 --- a/apps/desktop/src/renderer/locales/session-local-copy.ts +++ b/apps/desktop/src/renderer/locales/session-local-copy.ts @@ -53,9 +53,9 @@ const catalog = { }, 'zh-TW': { saved: '已儲存於本機 · 等待傳送', - sending: '正在投遞至 Host', + sending: '正在傳送至 Host', accepted: 'Host 已接受', - unknown: 'Host 接受結果未知', + unknown: '尚無法確認 Host 是否已接收', failed: '未傳送 · 本機副本已保留', remove: '移除本機副本', check: '核對狀態', diff --git a/apps/desktop/src/renderer/locales/settings-bot-copy.ts b/apps/desktop/src/renderer/locales/settings-bot-copy.ts index a94f960ba7..140f949604 100644 --- a/apps/desktop/src/renderer/locales/settings-bot-copy.ts +++ b/apps/desktop/src/renderer/locales/settings-bot-copy.ts @@ -224,7 +224,7 @@ const zhTwCopy = { }, testHints: { wechat_bridge_remote_url: '微信掃碼登入只允許存取本機 wechat-bridge,不能指向遠端 URL。', - wechat_bridge_unreachable: '先啟動本機 wechat-bridge,並確認它暴露了 iLink 相容的 /api/weixin/qrcode 或 /qrcode 介面。', + wechat_bridge_unreachable: '先啟動本機 wechat-bridge,並確認它提供 iLink 相容的 /api/weixin/qrcode 或 /qrcode 介面。', } satisfies Record, statusReasons: { codes: { @@ -240,9 +240,9 @@ const zhTwCopy = { }, withCode: { gatewayBot: (code: string) => `取得 Gateway 失敗(HTTP ${code})`, - gatewayClosed: (code: string) => `Gateway 連線關閉(${code});正在重連`, + gatewayClosed: (code: string) => `Gateway 連線關閉(${code});正在重新連線`, connectionsOpen: (code: string) => `Stream 訂閱開啟失敗(HTTP ${code})`, - streamClosed: (code: string) => `Stream 連線關閉(${code});正在重連`, + streamClosed: (code: string) => `Stream 連線關閉(${code});正在重新連線`, sendFailed: (code: string) => `傳送失敗(HTTP ${code})`, getAppAccessToken: (code: string) => `取得 access_token 失敗(HTTP ${code})`, }, @@ -295,13 +295,13 @@ const zhTwCopy = { wecomSecretPlaceholder: 'AI 應用 Secret', wecomSecretAria: '企業微信 Secret', qqId: 'QQ 應用編號', allowedUsersLabel: (count: number, max: number) => `允許的使用者 ID(${count} / ${max})`, allowedUsersPlaceholder: '每行一個使用者 ID,留空表示不限\n例如:123456789', allowedUsersHelp: (atCap: boolean) => atCap - ? 'Telegram 使用者 ID 是 64 位整數;填入後只接收列表裡這些 ID 的來信,其它人發的訊息會被靜默忽略(不會回彈任何提示)。 (已達到上限)' - : 'Telegram 使用者 ID 是 64 位整數;填入後只接收列表裡這些 ID 的來信,其它人發的訊息會被靜默忽略(不會回彈任何提示)。', + ? 'Telegram 使用者 ID 是 64 位元整數;填入後只接收清單裡這些 ID 的來信,其他使用者傳送的訊息會被直接忽略(不會回覆任何提示)(已達到上限)。' + : 'Telegram 使用者 ID 是 64 位元整數;填入後只接收清單裡這些 ID 的來信,其他使用者傳送的訊息會被直接忽略(不會回覆任何提示)。', invalidUsers: (entries: readonly string[]) => { const preview = entries.slice(0, 3).join('、'); return entries.length > 3 - ? `下列不是數字 ID,可能是使用者名稱之類的輸入,符合不到任何人:${preview} 等 ${entries.length} 項` - : `下列不是數字 ID,可能是使用者名稱之類的輸入,符合不到任何人:${preview}`; + ? `以下輸入不是數字 ID,可能是使用者名稱,因此無法對應到任何使用者:${preview} 等 ${entries.length} 項` + : `以下輸入不是數字 ID,可能是使用者名稱,因此無法對應到任何使用者:${preview}`; }, }, onboarding: { diff --git a/apps/desktop/src/renderer/locales/settings-memory-copy.ts b/apps/desktop/src/renderer/locales/settings-memory-copy.ts index aeaa911bb6..3deb94df46 100644 --- a/apps/desktop/src/renderer/locales/settings-memory-copy.ts +++ b/apps/desktop/src/renderer/locales/settings-memory-copy.ts @@ -87,7 +87,7 @@ const zhText = { } satisfies Record; const zhTwText = { - localFile: '本地 MEMORY.md', localFileHelp: '透明 Markdown 檔案,儲存在目前本機工作區。這裡的內容不會自動從聊天裡抽取。', enableLocalFile: '啟用本地 MEMORY.md', agentReadable: '模型上下文可讀取', agentReadableHelp: '預設關閉。開啟後,傳送訊息時會把本地記憶一併提供給模型;隱身模式下仍然不提供。', enableAgentRead: '允許模型上下文讀取本地記憶', waitingFile: '等待建立 MEMORY.md', waitingBackup: '等待生成上一版備份', dirty: '有未儲存修改', savedDraft: '草稿已儲存', backupCandidates: '備份候選', backupCandidatesAria: '本地記憶備份候選列表', opening: '開啟中…', open: '開啟', restoring: '恢復中…', restore: '恢復', copying: '複製中…', copyReference: '複製引用', backupHelp: '上一版操作會使用最近的候選;這裡只顯示 metadata,不展示備份正文。', savedAt: '儲存於 ', previewPaused: '草稿條目預覽暫停', filterAria: '篩選本地記憶', filterPlaceholder: '篩選標題、內容、ID 或標籤', clear: '清除', filterEmpty: '沒有符合的記憶條目', filterEmptyHelp: '篩選不會修改 MEMORY.md;清除篩選後會恢復顯示全部條目。', activeMemories: '生效記憶', archivedMemories: '已歸檔記憶', waitingEntry: '等待新增記憶條目', waitingEntryHelp: '在任務裡確認記憶,或點右上角「新增記憶」。', manualAddAria: '手動新增本地記憶', manualAdd: '手動新增記憶', manualAddHelp: '填寫後立即寫入本機 MEMORY.md。', title: '記憶標題', titlePlaceholder: '標題', tags: '記憶標籤', tagsPlaceholder: '標籤(逗號分隔,可選)', content: '記憶內容', contentPlaceholder: '內容', addDraft: '新增記憶', sensitiveDraft: '草稿含疑似敏感欄位', sensitiveDraftHelp: '儲存時會先遮蔽疑似 token、API key 或密碼,再寫入 MEMORY.md。', fileContent: 'MEMORY.md 內容', fileActionsAria: 'MEMORY.md 檔案操作', saving: '儲存中…', save: '儲存', saved: '已儲存', openFile: '開啟 MEMORY.md', openFolder: '開啟所在目錄', loading: '載入中…', reload: '重新載入', openPrevious: '開啟上一版', copyPath: '複製路徑', copyPrevious: '複製上一版引用', resetting: '重置中…', resetBackup: '重置並備份', restorePrevious: '恢復上一版', archiveDraftNotice: '目前歸檔/恢復操作只更新草稿,儲存後才會寫入 MEMORY.md。', noMatchEntry: '無符合條目。', noEntry: '暫無條目。', created: '建立 ', updated: '更新 ', archivedNoPrompt: '已歸檔,不會提供給模型', activePrompt: '生效條目,傳送時會提供給模型', locateDraft: '定位草稿', promptPreview: '模型上下文預覽', willInject: '傳送時會提供', willNotInject: '目前不會提供', copyContext: '複製上下文', promptPreviewHelp: '這裡是傳送時會提供給模型的內容;已歸檔條目不在其中,疑似金鑰會遮蔽。', safeModePreview: 'MEMORY.md 過大,目前不會生成模型上下文預覽。', emptyPromptPreview: '沒有生效記憶會提供給模型。', loadFailed: '載入本地記憶失敗', reloaded: '已重新載入 MEMORY.md', reloadDiscarded: '未儲存的草稿修改已丟棄。', toggleFailed: '更新本地記憶開關失敗', agentReadFailed: '更新模型讀取權限失敗', saveBlocked: '儲存被攔截', safeMode: 'MEMORY.md 內容過大,已進入安全模式。', savedRedacted: '已儲存並遮蔽敏感欄位', savedFile: '已儲存 MEMORY.md', saveFailed: '儲存 MEMORY.md 失敗', resetDone: '已重置 MEMORY.md', resetDoneDetail: '上一版已儲存為備份檔案。', resetFailed: '重置 MEMORY.md 失敗', noBackup: '沒有可恢復備份', noBackupDetail: '儲存或重置 MEMORY.md 後才會生成上一版備份。', restoreLatestTitle: '恢復上一版 MEMORY.md?', restoreCandidateTitle: '恢復這個 MEMORY.md 備份?', confirmRestore: '恢復', cancel: '取消', restoredLatest: '已恢復上一版 MEMORY.md', restoredCandidate: '已恢復 MEMORY.md 備份候選', restoredDetail: '恢復前的目前檔案已儲存為 restore.bak。', restoreFailed: '恢復失敗', restoreLatestFailed: '恢復上一版失敗', restoreCandidateFailed: '恢復備份失敗', openFailed: '開啟失敗', openPreviousFailed: '開啟上一版失敗', pathCopied: '已複製路徑', copyFailed: '複製失敗', copyFailedDetail: '剪貼簿不可用或被系統拒絕。', backupReferenceCopied: '已複製上一版引用', entryReferenceCopied: '已複製記憶引用', locateFailed: '無法定位記憶', locateFailedDetail: '目前草稿裡找不到這條記憶;請先儲存或重新整理後重試。', emptyTitle: '標題不能為空', emptyTitleDetail: '給這條記憶起一個短標題。', emptyContent: '內容不能為空', emptyContentDetail: '寫下要保留的偏好或事實。', draftOversize: '草稿過大', oversizeDetail: 'MEMORY.md 超出安全上限,請先刪減舊內容。', addedDraft: '已新增記憶', addedDraftDetail: '已寫入 MEMORY.md。', updateFailed: '無法更新記憶', invalidIdDetail: '這條記憶沒有可識別 ID,已停止更新。', archivedDraft: '已在草稿中歸檔記憶', restoredDraft: '已在草稿中恢復記憶', updateBlocked: '更新被攔截', archived: '已歸檔記憶', restored: '已恢復記憶', archiveFailed: '歸檔記憶失敗', entryRestoreFailed: '恢復記憶失敗', promptCopied: '已複製模型上下文預覽', promptCopiedDetail: '使用同一條 prompt 預覽和遮蔽路徑。', restoreDraftAction: '恢復到草稿', archiveDraftAction: '歸檔到草稿', restoreAction: '恢復', archiveAction: '歸檔', + localFile: '本地 MEMORY.md', localFileHelp: '透明 Markdown 檔案,儲存在目前本機工作區。這裡的內容不會自動從聊天裡抽取。', enableLocalFile: '啟用本地 MEMORY.md', agentReadable: '模型上下文可讀取', agentReadableHelp: '預設關閉。開啟後,傳送訊息時會把本地記憶一併提供給模型;隱身模式下仍然不提供。', enableAgentRead: '允許模型上下文讀取本地記憶', waitingFile: '等待建立 MEMORY.md', waitingBackup: '等待生成上一版備份', dirty: '有未儲存修改', savedDraft: '草稿已儲存', backupCandidates: '備份候選', backupCandidatesAria: '本地記憶備份候選列表', opening: '開啟中…', open: '開啟', restoring: '恢復中…', restore: '恢復', copying: '複製中…', copyReference: '複製引用', backupHelp: '上一版操作會使用最近的候選;這裡只顯示 metadata,不展示備份正文。', savedAt: '儲存於 ', previewPaused: '草稿項目預覽暫停', filterAria: '篩選本地記憶', filterPlaceholder: '篩選標題、內容、ID 或標籤', clear: '清除', filterEmpty: '沒有符合的記憶項目', filterEmptyHelp: '篩選不會修改 MEMORY.md;清除篩選後會恢復顯示全部項目。', activeMemories: '生效記憶', archivedMemories: '已封存記憶', waitingEntry: '等待新增記憶項目', waitingEntryHelp: '在任務裡確認記憶,或點右上角「新增記憶」。', manualAddAria: '手動新增本地記憶', manualAdd: '手動新增記憶', manualAddHelp: '填寫後立即寫入本機 MEMORY.md。', title: '記憶標題', titlePlaceholder: '標題', tags: '記憶標籤', tagsPlaceholder: '標籤(逗號分隔,可選)', content: '記憶內容', contentPlaceholder: '內容', addDraft: '新增記憶', sensitiveDraft: '草稿含疑似敏感欄位', sensitiveDraftHelp: '儲存時會先遮蔽疑似 token、API key 或密碼,再寫入 MEMORY.md。', fileContent: 'MEMORY.md 內容', fileActionsAria: 'MEMORY.md 檔案操作', saving: '儲存中…', save: '儲存', saved: '已儲存', openFile: '開啟 MEMORY.md', openFolder: '開啟所在目錄', loading: '載入中…', reload: '重新載入', openPrevious: '開啟上一版', copyPath: '複製路徑', copyPrevious: '複製上一版引用', resetting: '重置中…', resetBackup: '重置並備份', restorePrevious: '恢復上一版', archiveDraftNotice: '目前封存/恢復操作只更新草稿,儲存後才會寫入 MEMORY.md。', noMatchEntry: '無符合項目。', noEntry: '暫無項目。', created: '建立 ', updated: '更新 ', archivedNoPrompt: '已封存,不會提供給模型', activePrompt: '生效項目,傳送時會提供給模型', locateDraft: '定位草稿', promptPreview: '模型上下文預覽', willInject: '傳送時會提供', willNotInject: '目前不會提供', copyContext: '複製上下文', promptPreviewHelp: '這裡是傳送時會提供給模型的內容;已封存項目不在其中,疑似金鑰會遮蔽。', safeModePreview: 'MEMORY.md 過大,目前不會生成模型上下文預覽。', emptyPromptPreview: '沒有生效記憶會提供給模型。', loadFailed: '載入本地記憶失敗', reloaded: '已重新載入 MEMORY.md', reloadDiscarded: '未儲存的草稿修改已丟棄。', toggleFailed: '更新本地記憶開關失敗', agentReadFailed: '更新模型讀取權限失敗', saveBlocked: '儲存被攔截', safeMode: 'MEMORY.md 內容過大,已進入安全模式。', savedRedacted: '已儲存並遮蔽敏感欄位', savedFile: '已儲存 MEMORY.md', saveFailed: '儲存 MEMORY.md 失敗', resetDone: '已重置 MEMORY.md', resetDoneDetail: '上一版已儲存為備份檔案。', resetFailed: '重置 MEMORY.md 失敗', noBackup: '沒有可恢復備份', noBackupDetail: '儲存或重置 MEMORY.md 後才會生成上一版備份。', restoreLatestTitle: '恢復上一版 MEMORY.md?', restoreCandidateTitle: '恢復這個 MEMORY.md 備份?', confirmRestore: '恢復', cancel: '取消', restoredLatest: '已恢復上一版 MEMORY.md', restoredCandidate: '已恢復 MEMORY.md 備份候選', restoredDetail: '恢復前的目前檔案已儲存為 restore.bak。', restoreFailed: '恢復失敗', restoreLatestFailed: '恢復上一版失敗', restoreCandidateFailed: '恢復備份失敗', openFailed: '開啟失敗', openPreviousFailed: '開啟上一版失敗', pathCopied: '已複製路徑', copyFailed: '複製失敗', copyFailedDetail: '剪貼簿不可用或被系統拒絕。', backupReferenceCopied: '已複製上一版引用', entryReferenceCopied: '已複製記憶引用', locateFailed: '無法定位記憶', locateFailedDetail: '目前草稿裡找不到這條記憶;請先儲存或重新整理後重試。', emptyTitle: '標題不能為空', emptyTitleDetail: '給這條記憶起一個短標題。', emptyContent: '內容不能為空', emptyContentDetail: '寫下要保留的偏好或事實。', draftOversize: '草稿過大', oversizeDetail: 'MEMORY.md 超出安全上限,請先刪減舊內容。', addedDraft: '已新增記憶', addedDraftDetail: '已寫入 MEMORY.md。', updateFailed: '無法更新記憶', invalidIdDetail: '這條記憶沒有可識別 ID,已停止更新。', archivedDraft: '已在草稿中封存記憶', restoredDraft: '已在草稿中恢復記憶', updateBlocked: '更新被攔截', archived: '已封存記憶', restored: '已恢復記憶', archiveFailed: '封存記憶失敗', entryRestoreFailed: '恢復記憶失敗', promptCopied: '已複製模型上下文預覽', promptCopiedDetail: '使用同一條 prompt 預覽和遮蔽路徑。', restoreDraftAction: '恢復到草稿', archiveDraftAction: '封存到草稿', restoreAction: '恢復', archiveAction: '封存', } satisfies Record; const enText = { @@ -142,12 +142,12 @@ const SETTINGS_MEMORY_COPY = { intlLocale: 'zh-TW', text: zhTwText, countActive: (count, draft) => draft ? `草稿 ${count} 則生效` : `${count} 則生效`, - countArchived: (count, draft) => draft ? `草稿 ${count} 則已歸檔` : `${count} 則已歸檔`, + countArchived: (count, draft) => draft ? `草稿 ${count} 則已封存` : `${count} 則已封存`, saveSummary: (active, archived) => archived > 0 - ? `目前 ${active} 則生效 / ${archived} 則已歸檔;已保留上一版備份。` + ? `目前 ${active} 則生效 / ${archived} 則已封存;已保留上一版備份。` : `目前 ${active} 則生效;已保留上一版備份。`, backupSummary: (active, archived) => archived > 0 - ? `${active} 則生效 / ${archived} 則已歸檔` + ? `${active} 則生效 / ${archived} 則已封存` : `${active} 則生效`, countEntries: (count) => `${count} 則記憶`, countMatches: (filtered, total) => `${filtered} / ${total} 則符合`, @@ -174,12 +174,12 @@ const SETTINGS_MEMORY_COPY = { safe_mode: 'MEMORY.md 內容過大,已進入安全模式。', oversize: 'MEMORY.md 超出安全上限,請先刪減舊內容。', revision_conflict: '記憶內容剛被其他操作修改,請重試。', backup_revision_conflict: '備份內容剛被其他操作修改,請重試。', invalid_state: 'Runtime Host 回傳了無效的記憶狀態。', - invalid_content: 'MEMORY.md 內容無效,請檢查格式後重試。', invalid_scope: '目前記憶操作的作用域無效。', - not_found: '找不到對應的記憶條目。', not_pending: '對應的記憶條目不在待確認狀態。', + invalid_content: 'MEMORY.md 內容無效,請檢查格式後重試。', invalid_scope: '目前記憶操作的作用範圍無效。', + not_found: '找不到對應的記憶項目。', not_pending: '對應的記憶項目不在待確認狀態。', upload_not_found: '記憶上傳工作階段不存在或已過期。', upload_incomplete: '記憶內容尚未上傳完整。', upload_conflict: '另一個記憶上傳正在進行,請重試。', }, - origins: { manual: '手動記錄', imported: '匯入記錄', extracted: '確認提取', unknown: '手寫條目' }, entryStatuses: { draft: '草稿', review_required: '待確認', active: '生效', archived: '已歸檔', rejected: '已拒絕', unknown: '未識別' }, backupKinds: { reset: '重置前備份', restore: '恢復前備份', save: '儲存前備份' }, memoryStatuses: { ok: '本地檔案已就緒', disabled: '已關閉', safe_mode: '安全模式', incognito_blocked: '隱身停用', error: '讀取失敗' }, promptBlocked: { disabled: '本地記憶已關閉。', incognito: '隱身模式下不會提供本地記憶。', safeMode: 'MEMORY.md 過大,目前不會提供。', agentRead: '模型上下文讀取未開啟。' }, backupOversize: '備份過大,無法預覽條目', previewOversize: '草稿過大,條目預覽已暫停;儲存前請先刪減 MEMORY.md 內容。', previewTruncationMarker: '[本地記憶已按長度截斷]', + origins: { manual: '手動記錄', imported: '匯入記錄', extracted: '確認提取', unknown: '手寫項目' }, entryStatuses: { draft: '草稿', review_required: '待確認', active: '生效', archived: '已封存', rejected: '已拒絕', unknown: '未識別' }, backupKinds: { reset: '重置前備份', restore: '恢復前備份', save: '儲存前備份' }, memoryStatuses: { ok: '本地檔案已就緒', disabled: '已關閉', safe_mode: '安全模式', incognito_blocked: '隱身停用', error: '讀取失敗' }, promptBlocked: { disabled: '本地記憶已關閉。', incognito: '隱身模式下不會提供本地記憶。', safeMode: 'MEMORY.md 過大,目前不會提供。', agentRead: '模型上下文讀取未開啟。' }, backupOversize: '備份過大,無法預覽項目', previewOversize: '草稿過大,項目預覽已暫停;儲存前請先刪減 MEMORY.md 內容。', previewTruncationMarker: '[本地記憶已按長度截斷]', }, en: { intlLocale: 'en-US', diff --git a/apps/desktop/src/renderer/locales/settings-projects-copy.ts b/apps/desktop/src/renderer/locales/settings-projects-copy.ts index 78ee694394..d2b0e83f8f 100644 --- a/apps/desktop/src/renderer/locales/settings-projects-copy.ts +++ b/apps/desktop/src/renderer/locales/settings-projects-copy.ts @@ -916,23 +916,23 @@ const SETTINGS_PROJECTS_COPY_BY_LOCALE = { configuration_incomplete: '服務設定不完整,請重新安裝', retirement_failed: '無法安全停止目前的 Runtime Host', update_requires_retirement: '更新前需要先停止目前的 Runtime Host', - update_incomplete: '更新未完成,請查看服務日誌', - service_manager_operation_failed: '系統服務管理器操作失敗,請查看服務日誌', + update_incomplete: '更新未完成,請查看服務記錄', + service_manager_operation_failed: '系統服務管理器操作失敗,請查看服務記錄', uninstall_incomplete: '解除安裝未完成,請重試', deployment_io_failed: '無法寫入 Runtime Host 部署檔案', - deployment_commit_unknown: '請查看服務日誌了解詳情', + deployment_commit_unknown: '請查看服務記錄了解詳細資訊', target_unavailable: '找不到所選版本', registry_unavailable: '無法連線更新來源,請檢查網路', invalid_registry_metadata: '更新來源回傳了無效的版本資訊', package_download_failed: '更新套件下載失敗', - package_integrity_mismatch: '更新套件校驗失敗', + package_integrity_mismatch: '更新套件驗證失敗', invalid_package: '更新套件無效', invalid_update_policy: '更新策略無效', update_policy_write_failed: '無法儲存更新策略', - update_policy_commit_outcome_unknown: '請查看服務日誌了解詳情', + update_policy_commit_outcome_unknown: '請查看服務記錄了解詳細資訊', update_policy_changed: '更新策略已變更,請重新整理後重試', update_not_admitted: '目前版本不允許此更新', - unknown: '請查看服務日誌了解詳情', + unknown: '請查看服務記錄了解詳細資訊', }, managementReconnectFailed: '變更已套用,但 Desktop 無法重新連線', manageAccess: '管理存取權限', diff --git a/apps/desktop/src/renderer/locales/settings-test-result-copy.ts b/apps/desktop/src/renderer/locales/settings-test-result-copy.ts index 46c54c86d0..cb5e5e6fab 100644 --- a/apps/desktop/src/renderer/locales/settings-test-result-copy.ts +++ b/apps/desktop/src/renderer/locales/settings-test-result-copy.ts @@ -102,8 +102,8 @@ const COPY = { bot: { credentialsValid: (username) => username - ? `憑證檢查已透過 · ${username}。這不代表訊息收發服務已啟動。` - : "憑證檢查已透過。這不代表訊息收發服務已啟動。", + ? `憑證檢查已通過 · ${username}。這不代表訊息收發服務已啟動。` + : "憑證檢查已通過。這不代表訊息收發服務已啟動。", tokenMissing: "請填寫 Bot Token 後再測試。", tokenInvalid: "Bot Token 無效,請檢查後重試。", appCredentialsMissing: "請填寫 App ID 和 App Secret 後再測試。", diff --git a/apps/desktop/src/renderer/locales/work-board-error-copy.ts b/apps/desktop/src/renderer/locales/work-board-error-copy.ts index c6a28da90a..19b250633e 100644 --- a/apps/desktop/src/renderer/locales/work-board-error-copy.ts +++ b/apps/desktop/src/renderer/locales/work-board-error-copy.ts @@ -34,10 +34,10 @@ const WORK_BOARD_ERROR_COPY = { }, 'zh-TW': { invalid_input: '這項操作無效,請檢查後重試', - not_found: '這則事項已不存在', - operation_conflict: '這則事項已發生變化,請重新整理後重試', - corrupt_record: '這則事項暫時無法讀取', - must_archive_first: '請先封存,再刪除這則事項', + not_found: '這項事項已不存在', + operation_conflict: '這項事項已發生變化,請重新整理後重試', + corrupt_record: '這項事項暫時無法讀取', + must_archive_first: '請先封存,再刪除這項事項', unknown: '操作失敗,請稍後重試', }, en: { diff --git a/packages/cli/src/tui-copy-catalog.ts b/packages/cli/src/tui-copy-catalog.ts index 9272b0b0c1..542b585d4a 100644 --- a/packages/cli/src/tui-copy-catalog.ts +++ b/packages/cli/src/tui-copy-catalog.ts @@ -1076,7 +1076,7 @@ export const TUI_COPY_RESOURCES = { context: '檢視最近一次請求的上下文用量', copy: '複製最後一則回覆(或 /copy all)到剪貼簿', exit: '中斷此 TUI,保留已連線的 Host', - host: '查看 Host 狀態或停止、重新啟動本機擁有者', + host: '檢視 Host 狀態,或停止、重新啟動管理此 Host 的本機服務', update: '更新 npm 全域 CLI 及其本機 Host', goal: '檢視自主目標狀態', graph: '檢視、啟用、停用 Graph 模式,或執行一次 Graph 任務', diff --git a/packages/ui/src/__tests__/tool-activity-presentation.test.ts b/packages/ui/src/__tests__/tool-activity-presentation.test.ts index 847e952fac..e751815c44 100644 --- a/packages/ui/src/__tests__/tool-activity-presentation.test.ts +++ b/packages/ui/src/__tests__/tool-activity-presentation.test.ts @@ -78,7 +78,7 @@ describe('tool activity presentation', () => { const errorMessages = { 'zh-CN': '需要“绕过”模式。此操作会直接控制本机应用,无法在沙箱模式下执行。', - 'zh-TW': '需要“繞過”模式。此操作會直接控制本機應用,無法在沙箱模式下執行。', + 'zh-TW': '需要「繞過」模式。此操作會直接控制本機應用程式,無法在沙箱模式下執行。', en: 'Bypass mode required. This action controls a local app directly and cannot run inside the sandbox.', } satisfies UiCatalog; for (const locale of UI_LOCALES) { diff --git a/packages/ui/src/conversation-copy.ts b/packages/ui/src/conversation-copy.ts index 1bf10a43b4..9730da9abb 100644 --- a/packages/ui/src/conversation-copy.ts +++ b/packages/ui/src/conversation-copy.ts @@ -651,7 +651,7 @@ const CONVERSATION_COPY = { sending: '正在傳送…', importing: '正在匯入…', sendLabel: '傳送', queuedMessagesAriaLabel: (count) => `${count} 條待發送訊息`, steeringPending: '調整方向 · 等待整批生效', - followupPending: '下一輪 · 每輪一條', + followupPending: '下一輪 · 每輪一則訊息', queueShortcutsLabel: '傳送快速鍵', queueShortcuts: 'Shift+Enter:轉向(Steering)\nEnter:下一輪(Follow-up)', promoteQueuedEntry: '調整方向', editQueuedEntry: '編輯', saveQueuedEntry: '儲存', cancelQueuedEntryEdit: '取消編輯', deleteQueuedEntry: '刪除', reorderQueuedEntry: '拖動排序', @@ -716,7 +716,7 @@ const CONVERSATION_COPY = { chooseAriaLabel: (label, branch) => branch ? `選擇專案:${label},目前分支 ${branch}` : `選擇專案:${label}`, }, messages: { - you: '你', assistant: 'Maka', processing: '正在處理…', continuing: '繼續中…', awaitingModelOutput: '等待模型輸出…', providerRetryScheduled: (seconds, attempt, maxAttempts) => `${formatRetryDelay(seconds, { day: '天', hour: '小時', minute: '分', second: '秒' })}後重試(${attempt}/${maxAttempts})`, providerRetryStarted: (attempt, maxAttempts) => `正在重試(${attempt}/${maxAttempts})`, providerRetryWaiting: (attempt, maxAttempts) => `等待重試(${attempt}/${maxAttempts})`, providerRetryReason: { stream_truncated: '回應中途斷開', network: '網路中斷', provider_capacity: '模型服務暫時滿載', provider_unavailable: '模型服務暫時不可用', rate_limit: '觸發模型速率限制', timeout: '請求超時', unknown: '模型請求失敗' }, failureDetailsUnavailable: '無可用診斷詳情。', safeResumePending: '正在檢查…', safeResume: '繼續這一輪', thinking: '深度思考', truncated: '已截斷', copied: '已複製', copying: '複製中', copyFailed: '複製失敗', copy: '複製', editMessage: '編輯並重發', editMessageDisabledRunning: '目前回答仍在進行中,結束後再編輯', editMessageDisabledAttachments: '包含附件的歷史訊息暫不支援編輯並重發', editMessageDisabledQuotes: '包含引用的歷史訊息暫不支援編輯並重發', editMessageDisabledTransformedText: '包含已展開上下文的歷史訊息暫不支援編輯並重發', + you: '你', assistant: 'Maka', processing: '正在處理…', continuing: '繼續中…', awaitingModelOutput: '等待模型輸出…', providerRetryScheduled: (seconds, attempt, maxAttempts) => `${formatRetryDelay(seconds, { day: '天', hour: '小時', minute: '分', second: '秒' })}後重試(${attempt}/${maxAttempts})`, providerRetryStarted: (attempt, maxAttempts) => `正在重試(${attempt}/${maxAttempts})`, providerRetryWaiting: (attempt, maxAttempts) => `等待重試(${attempt}/${maxAttempts})`, providerRetryReason: { stream_truncated: '回應中途斷開', network: '網路中斷', provider_capacity: '模型服務暫時滿載', provider_unavailable: '模型服務暫時不可用', rate_limit: '觸發模型速率限制', timeout: '請求逾時', unknown: '模型請求失敗' }, failureDetailsUnavailable: '無可用診斷詳情。', safeResumePending: '正在檢查…', safeResume: '繼續這一輪', thinking: '深度思考', truncated: '已截斷', copied: '已複製', copying: '複製中', copyFailed: '複製失敗', copy: '複製', editMessage: '編輯並重發', editMessageDisabledRunning: '目前回答仍在進行中,結束後再編輯', editMessageDisabledAttachments: '包含附件的歷史訊息暫不支援編輯並重發', editMessageDisabledQuotes: '包含引用的歷史訊息暫不支援編輯並重發', editMessageDisabledTransformedText: '包含已展開上下文的歷史訊息暫不支援編輯並重發', editMessageDisabledDirectoryReferences: '包含資料夾引用的歷史訊息暫不支援編輯並重發', userAriaLabel: '你傳送的訊息', systemAriaLabel: '系統訊息', assistantAriaLabel: 'Maka 的回答', answerActionsAriaLabel: (context) => `回答操作${context ? `:${context}` : ''}`, answerActionAriaLabel: (action, context) => `${action}回答${context ? `:${context}` : ''}`, messageActionAriaLabel: (action, context) => `${action}訊息${context ? `:${context}` : ''}`, sourceAriaLabel: '本輪迴答的來源', derivativesAriaLabel: '本輪迴答的衍生', scheduledTaskTriggered: '定時任務觸發', scheduledTaskTitle: (id) => `由定時任務觸發 · ${id}`, legacyAutomationTriggered: '舊版自動化(僅歷史)', legacyAutomationTitle: (id) => `由舊版自動化觸發 · ${id} · 僅保留歷史,不會再次執行`, goalContinued: 'Goal 自動繼續', goalTitle: (id) => `由 Goal 繼續執行 · ${id}`, agentGraphTriggered: 'Agent Graph 自動繼續', agentGraphTitle: (graphId) => `由 Agent Graph 排程器觸發 · ${graphId}`, thinkingTruncatedTitle: '部分 reasoning 已截斷;顯示的是最近的內容', outputTruncatedTitle: '助手輸出已超過單次回合上限,超出部分未渲染。如需完整內容請重新生成或檢視持久化的任務記錄。', removeAttachmentAriaLabel: (name) => `移除 ${name}`, quoteLabel: '引用', quoteExpandAriaLabel: '展開引用全文', quoteCollapseAriaLabel: '收起引用', removeQuoteAriaLabel: '移除引用', aborted: '(已中斷)', abortedByStop: '(已中斷 · 由停止按鈕觸發)', diff --git a/packages/ui/src/shell-controls-copy.ts b/packages/ui/src/shell-controls-copy.ts index 0fa9a18702..f3c34c511a 100644 --- a/packages/ui/src/shell-controls-copy.ts +++ b/packages/ui/src/shell-controls-copy.ts @@ -101,14 +101,14 @@ const SHELL_CONTROLS_COPY_BY_LOCALE = { placeholder: '搜尋任務標題和內容…', unavailable: '目前環境無法連線搜尋後端,請稍後重試。', errorByReason: { - incognito_active: '關閉隱私模式後可以繼續按關鍵詞查詢歷史任務。', + incognito_active: '關閉隱身模式後可以繼續使用關鍵字搜尋歷史任務。', invalid_query: '搜尋詞無效,請縮短內容或移除憑證後重試。', aborted: '搜尋已取消。', disabled: '搜尋目前無法使用。', provider_error: '搜尋服務發生錯誤,請重試。', }, errorFallback: '搜尋服務需要重新整理,請重試。', - introduction: '開始輸入以按關鍵詞查詢歷史任務。結果只包含任務標題和內容文本,不進入網路。', + introduction: '開始輸入以使用關鍵字搜尋歷史任務。結果只包含任務標題和內容文本,不進入網路。', empty: '沒有符合的任務標題或內容。換個關鍵詞試試。', resultsLabel: '搜尋結果', }, diff --git a/packages/ui/src/skills-copy.ts b/packages/ui/src/skills-copy.ts index 8385e95e73..8bc8d18d3c 100644 --- a/packages/ui/src/skills-copy.ts +++ b/packages/ui/src/skills-copy.ts @@ -177,7 +177,7 @@ const SKILLS_COPY = { context: { scope: { project: '專案', workspace: '工作區', user: '使用者', custom: '自訂' }, decision: { advertised: '已進入上下文', disabled: '已停用', invalid: '後設資料無效', host_incompatible: '主機不相容', shadowed: '被高優先順序覆蓋', budget: '因預算省略' }, needsReview: '待確認', discoverySource: (scope, source) => `${scope}/${source} 發現源`, discoveryDiagnostic: { blocked_path: '路徑被安全策略阻止', read_failed: '來源不可讀取' } }, row: { opening: '開啟中…', reviewing: '審查中…', use: '使用', openTitle: '開啟 SKILL.md', pinTitle: '固定到技能上下文', unpinTitle: '取消固定', viewDiff: '檢視差異', viewUpdate: '檢視更新', confirmDeleteAriaLabel: (name) => `確認刪除 ${name}`, deleteDescription: '此操作會刪除這個 Skill 的檔案,且無法撤銷。', cancel: '取消', delete: '刪除' }, review: { ariaLabel: 'Skill 更新審查', title: '更新審查', source: (id) => `來源 ${id}`, managedSource: '受管理來源', hasBaseline: '已有基線', missingBaseline: '缺少基線', lineTransition: (current, source) => `${current} → ${source} 行`, changedLines: (count) => `${count} 行不同`, warning: '工作區副本已有本地修改。繼續更新會用來源庫版本覆蓋目前 SKILL.md。', workspace: '目前工作區', sourceVersion: '來源庫版本', cancel: '取消', overwrite: '覆蓋本地修改', update: '更新到來源版本' }, - bundledDescription: { 'computer-use': '檢視並操作本機桌面應用的介面。' }, + bundledDescription: { 'computer-use': '檢視並操作本機桌面應用程式的介面。' }, status: { metadataError: '後設資料異常', managed: { source_missing: '來源缺失', update_available: '可更新', local_modified: '本地已修改', metadata_error: '後設資料異常', up_to_date: '受管理', not_managed: '受管理' }, modified: '已修改', bundled: '內建', local: '本地', stateError: '狀態異常', enabled: '已啟用', disabled: '已停用' }, page: { title: '技能', toolbarAria: '技能篩選與檢視', metaInstalled: (count) => `${count} 個已安裝`, metaUpdates: (count) => `${count} 個可更新`, metaAvailable: (count) => `${count} 個可安裝`, searchMatches: (count) => `${count} 個符合`, search: '搜尋技能', openFolder: '開啟目錄', moreActions: '更多技能操作', refreshing: '重新整理中…', refresh: '重新整理' }, detail: { label: '技能詳情', enabled: '啟用', pinned: '已固定', inspectorOpened: (name) => `已開啟 ${name} 的詳情`, idLabel: '標識', scopeLabel: '範圍', sourceLabel: '來源', contextLabel: '上下文', runtimeLabel: '執行狀態', toolsLabel: '宣告工具', pathLabel: '路徑' }, diff --git a/packages/ui/src/tool-activity/copy.ts b/packages/ui/src/tool-activity/copy.ts index 8b042f8a71..638052022a 100644 --- a/packages/ui/src/tool-activity/copy.ts +++ b/packages/ui/src/tool-activity/copy.ts @@ -303,9 +303,9 @@ const TOOL_ACTIVITY_COPY = { }, sandboxBlocked: { title: '操作可能被沙箱阻止', description: '沙箱可能阻止了該呼叫中的至少一項操作。失敗前可能已經產生部分結果,請檢查輸出和工作區狀態後再決定是否重試。', copyAriaLabel: (label) => `${label}沙箱診斷資訊` }, requiresBypass: { - title: '需要“繞過”模式', - description: '此操作會直接控制本機應用,無法在沙箱模式下執行。', - errorMessage: '需要“繞過”模式。此操作會直接控制本機應用,無法在沙箱模式下執行。', + title: '需要「繞過」模式', + description: '此操作會直接控制本機應用程式,無法在沙箱模式下執行。', + errorMessage: '需要「繞過」模式。此操作會直接控制本機應用程式,無法在沙箱模式下執行。', action: '切換並重試', pending: '正在切換…', },