Files
TREK/shared/src/i18n/zh-TW/admin.ts
T
Maurice a876fb2634 feat: Passkey (WebAuthn) login (#1111)
* feat(auth): passkey (WebAuthn) login — server endpoints, schema + admin toggle

Add @simplewebauthn/server registration and primary (discoverable) login ceremonies under /api/auth/passkey, a webauthn_credentials + single-use webauthn_challenges schema (migration), the instance-wide passkey_login toggle (default off) enforced before auth by a guard, and require_mfa satisfaction via a verified passkey. RP ID/origin come only from server config (webauthn_rp_id/origins -> APP_URL), never request headers.

* feat(auth): passkey enrolment, login button + admin settings UI

PasskeysSection in account settings (add/rename/remove with a current-password step-up), a 'Sign in with a passkey' button on the login page, the admin enable + RP-ID/origins controls, and a per-user admin reset action.

* i18n(auth): passkey strings across all locales

Add login/settings/admin passkey keys to en and all 19 translated locales.
2026-06-05 18:54:13 +02:00

350 lines
19 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { TranslationStrings } from '../types';
const admin: TranslationStrings = {
'admin.notifications.title': '通知',
'admin.notifications.hint': '選擇一個通知渠道。一次只能啟用一個。',
'admin.notifications.none': '已停用',
'admin.notifications.email': '電子郵件 (SMTP)',
'admin.notifications.webhook': 'Webhook',
'admin.notifications.save': '儲存通知設定',
'admin.notifications.saved': '通知設定已儲存',
'admin.notifications.testWebhook': '傳送測試 Webhook',
'admin.notifications.testWebhookSuccess': '測試 Webhook 傳送成功',
'admin.notifications.testWebhookFailed': '測試 Webhook 傳送失敗',
'admin.notifications.emailPanel.title': '電子郵件 (SMTP)',
'admin.notifications.webhookPanel.title': 'Webhook',
'admin.notifications.inappPanel.title': '應用程式內通知',
'admin.notifications.inappPanel.hint':
'應用程式內通知始終啟用,無法全域性停用。',
'admin.notifications.adminWebhookPanel.title': '管理員 Webhook',
'admin.notifications.adminWebhookPanel.hint':
'此 Webhook 專用於管理員通知(例如版本提醒)。它與每位使用者的 Webhook 分開,設定後始終會觸發。',
'admin.notifications.adminWebhookPanel.saved': '管理員 Webhook URL 已儲存',
'admin.notifications.adminWebhookPanel.testSuccess': '測試 Webhook 傳送成功',
'admin.notifications.adminWebhookPanel.testFailed': '測試 Webhook 傳送失敗',
'admin.notifications.adminWebhookPanel.alwaysOnHint':
'配置 URL 後,管理員 Webhook 始終觸發',
'admin.notifications.ntfy': 'Ntfy',
'admin.ntfy.hint':
'允許使用者設定自己的 ntfy 主題以接收推播通知。在下方設定預設伺服器以預先填入使用者設定。',
'admin.notifications.testNtfy': '傳送測試 Ntfy',
'admin.notifications.testNtfySuccess': '測試 Ntfy 傳送成功',
'admin.notifications.testNtfyFailed': '測試 Ntfy 失敗',
'admin.notifications.adminNtfyPanel.title': '管理員 Ntfy',
'admin.notifications.adminNtfyPanel.hint':
'此 Ntfy 主題專用於管理員通知(例如版本提醒)。它與每位使用者的主題分開,設定後始終會觸發。',
'admin.notifications.adminNtfyPanel.serverLabel': 'Ntfy 伺服器 URL',
'admin.notifications.adminNtfyPanel.serverHint':
'同時用作使用者 ntfy 通知的預設伺服器。留空則預設使用 ntfy.sh。使用者可在自己的設定中覆寫此項。',
'admin.notifications.adminNtfyPanel.serverPlaceholder': 'https://ntfy.sh',
'admin.notifications.adminNtfyPanel.topicLabel': '管理員主題',
'admin.notifications.adminNtfyPanel.topicPlaceholder': 'trek-admin-alerts',
'admin.notifications.adminNtfyPanel.tokenLabel': '存取權杖(選填)',
'admin.notifications.adminNtfyPanel.tokenCleared': '管理員存取權杖已清除',
'admin.notifications.adminNtfyPanel.saved': '管理員 Ntfy 設定已儲存',
'admin.notifications.adminNtfyPanel.test': '傳送測試 Ntfy',
'admin.notifications.adminNtfyPanel.testSuccess': '測試 Ntfy 傳送成功',
'admin.notifications.adminNtfyPanel.testFailed': '測試 Ntfy 失敗',
'admin.notifications.adminNtfyPanel.alwaysOnHint':
'設定主題後管理員 Ntfy 始終觸發',
'admin.notifications.adminNotificationsHint':
'配置哪些渠道傳遞僅管理員通知(例如版本提醒)。',
'admin.notifications.tripReminders.title': '行程提醒',
'admin.notifications.tripReminders.hint':
'在行程開始前發送提醒通知(需要在行程中設定提醒天數)。',
'admin.notifications.tripReminders.enabled': '行程提醒已啟用',
'admin.notifications.tripReminders.disabled': '行程提醒已停用',
'admin.smtp.title': '郵件與通知',
'admin.smtp.hint': '用於傳送電子郵件通知的 SMTP 配置。',
'admin.smtp.testButton': '傳送測試郵件',
'admin.webhook.hint':
'允許使用者配置自己的 Webhook URL 以接收通知(Discord、Slack 等)。',
'admin.smtp.testSuccess': '測試郵件傳送成功',
'admin.smtp.testFailed': '測試郵件傳送失敗',
'admin.title': '管理後臺',
'admin.subtitle': '使用者管理和系統設定',
'admin.tabs.users': '使用者',
'admin.tabs.categories': '分類',
'admin.tabs.backup': '備份',
'admin.tabs.audit': '審計日誌',
'admin.tabs.notifications': '通知',
'admin.stats.users': '使用者',
'admin.stats.trips': '旅行',
'admin.stats.places': '地點',
'admin.stats.photos': '照片',
'admin.stats.files': '檔案',
'admin.table.user': '使用者',
'admin.table.email': '郵箱',
'admin.table.role': '角色',
'admin.table.created': '建立時間',
'admin.table.lastLogin': '最後登入',
'admin.table.actions': '操作',
'admin.you': '(你)',
'admin.editUser': '編輯使用者',
'admin.newPassword': '新密碼',
'admin.newPasswordHint': '留空則保持當前密碼',
'admin.deleteUser': '刪除使用者「{name}」?所有旅行將被永久刪除。',
'admin.deleteUserTitle': '刪除使用者',
'admin.newPasswordPlaceholder': '輸入新密碼…',
'admin.toast.loadError': '載入管理資料失敗',
'admin.toast.userUpdated': '使用者已更新',
'admin.toast.updateError': '更新失敗',
'admin.toast.userDeleted': '使用者已刪除',
'admin.toast.deleteError': '刪除失敗',
'admin.toast.cannotDeleteSelf': '不能刪除自己的賬戶',
'admin.toast.userCreated': '使用者已建立',
'admin.toast.createError': '建立使用者失敗',
'admin.toast.fieldsRequired': '使用者名稱、郵箱和密碼為必填項',
'admin.createUser': '建立使用者',
'admin.invite.title': '邀請連結',
'admin.invite.subtitle': '建立一次性註冊連結',
'admin.invite.create': '建立連結',
'admin.invite.createAndCopy': '建立並複製',
'admin.invite.empty': '尚未建立邀請連結',
'admin.invite.maxUses': '最大使用次數',
'admin.invite.expiry': '有效期',
'admin.invite.uses': '已使用',
'admin.invite.expiresAt': '過期時間',
'admin.invite.createdBy': '由',
'admin.invite.active': '有效',
'admin.invite.expired': '已過期',
'admin.invite.usedUp': '已用完',
'admin.invite.copied': '邀請連結已複製',
'admin.invite.copyLink': '複製連結',
'admin.invite.deleted': '邀請連結已刪除',
'admin.invite.createError': '建立連結失敗',
'admin.invite.deleteError': '刪除連結失敗',
'admin.tabs.settings': '設定',
'admin.allowRegistration': '允許註冊',
'admin.allowRegistrationHint': '新使用者可以自行註冊',
'admin.authMethods': 'Authentication Methods',
'admin.passwordLogin': 'Password Login',
'admin.passwordLoginHint': 'Allow users to sign in with email and password',
'admin.passwordRegistration': 'Password Registration',
'admin.passwordRegistrationHint':
'Allow new users to register with email and password',
'admin.oidcLogin': 'SSO Login',
'admin.oidcLoginHint': 'Allow users to sign in with SSO',
'admin.oidcRegistration': 'SSO Auto-Provisioning',
'admin.oidcRegistrationHint':
'Automatically create accounts for new SSO users',
'admin.envOverrideHint':
'Password login settings are controlled by the OIDC_ONLY environment variable and cannot be changed here.',
'admin.lockoutWarning': 'At least one login method must remain enabled',
'admin.requireMfa': '要求雙因素身份驗證(2FA',
'admin.requireMfaHint':
'未啟用 2FA 的使用者必須先完成設定中的配置才能使用應用。',
'admin.apiKeys': 'API 金鑰',
'admin.apiKeysHint': '可選。啟用地點的擴充套件資料,如照片和天氣。',
'admin.mapsKey': 'Google Maps API 金鑰',
'admin.mapsKeyHint': '用於地點搜尋。在 console.cloud.google.com 獲取',
'admin.mapsKeyHintLong':
'沒有 API 金鑰時,使用 OpenStreetMap 搜尋地點。有了 Google API 金鑰,還可以載入照片、評分和營業時間。在 console.cloud.google.com 獲取。',
'admin.recommended': '推薦',
'admin.weatherKey': 'OpenWeatherMap API 金鑰',
'admin.weatherKeyHint': '用於天氣資料。在 openweathermap.org 免費獲取',
'admin.validateKey': '測試',
'admin.keyValid': '已連線',
'admin.keyInvalid': '無效',
'admin.keySaved': 'API 金鑰已儲存',
'admin.oidcTitle': '單點登入 (OIDC)',
'admin.oidcSubtitle':
'允許透過 Google、Apple、Authentik 或 Keycloak 等外部提供商登入。',
'admin.oidcDisplayName': '顯示名稱',
'admin.oidcIssuer': '頒發者 URL',
'admin.oidcIssuerHint':
'提供商的 OpenID Connect 頒發者 URL。如 https://accounts.google.com',
'admin.oidcSaved': 'OIDC 配置已儲存',
'admin.oidcOnlyMode': '停用密碼登入',
'admin.oidcOnlyModeHint': '啟用後,僅允許 SSO 登入。密碼登入和註冊將被停用。',
'admin.fileTypes': '允許的檔案型別',
'admin.fileTypesHint': '配置使用者可以上傳的檔案型別。',
'admin.fileTypesFormat':
'以逗號分隔的副檔名(如 jpg,png,pdf,doc)。使用 * 允許所有型別。',
'admin.fileTypesSaved': '檔案型別設定已儲存',
'admin.placesPhotos.title': '地點照片',
'admin.placesPhotos.subtitle':
'從 Google Places API 獲取照片。停用可節省 API 配額。Wikimedia 照片不受影響。',
'admin.placesAutocomplete.title': '地點自動補全',
'admin.placesAutocomplete.subtitle':
'使用 Google Places API 提供搜尋建議。停用可節省 API 配額。',
'admin.placesDetails.title': '地點詳情',
'admin.placesDetails.subtitle':
'從 Google Places API 獲取地點詳細資訊(營業時間、評分、網站)。停用可節省 API 配額。',
'admin.bagTracking.title': '行李追蹤',
'admin.bagTracking.subtitle': '為打包物品啟用重量和行李分配',
'admin.collab.chat.title': '聊天',
'admin.collab.chat.subtitle': '即時訊息協作',
'admin.collab.notes.title': '筆記',
'admin.collab.notes.subtitle': '共享筆記和文件',
'admin.collab.polls.title': '投票',
'admin.collab.polls.subtitle': '群組投票和表決',
'admin.collab.whatsnext.title': '下一步',
'admin.collab.whatsnext.subtitle': '活動建議和後續步驟',
'admin.tabs.config': '配置',
'admin.tabs.defaults': '用戶預設設定',
'admin.defaultSettings.title': '用戶預設設定',
'admin.defaultSettings.description':
'設定整個執行個體的預設值。未更改設定的用戶將看到這些值。用戶自己的更改始終優先。',
'admin.defaultSettings.saved': '預設值已儲存',
'admin.defaultSettings.reset': '重設為內建預設值',
'admin.defaultSettings.resetToBuiltIn': '重設',
'admin.tabs.templates': '打包模板',
'admin.packingTemplates.title': '打包模板',
'admin.packingTemplates.subtitle': '建立可複用的旅行打包清單',
'admin.packingTemplates.create': '新建模板',
'admin.packingTemplates.namePlaceholder': '模板名稱(如:海灘度假)',
'admin.packingTemplates.empty': '尚未建立模板',
'admin.packingTemplates.items': '物品',
'admin.packingTemplates.categories': '分類',
'admin.packingTemplates.itemName': '物品名稱',
'admin.packingTemplates.itemCategory': '分類',
'admin.packingTemplates.categoryName': '分類名稱(如:衣物)',
'admin.packingTemplates.addCategory': '新增分類',
'admin.packingTemplates.created': '模板已建立',
'admin.packingTemplates.deleted': '模板已刪除',
'admin.packingTemplates.loadError': '載入模板失敗',
'admin.packingTemplates.createError': '建立模板失敗',
'admin.packingTemplates.deleteError': '刪除模板失敗',
'admin.packingTemplates.saveError': '儲存失敗',
'admin.tabs.addons': '擴充套件',
'admin.addons.title': '擴充套件',
'admin.addons.subtitle': '啟用或停用功能以自定義你的 TREK 體驗。',
'admin.addons.catalog.memories.name': '照片 (Immich)',
'admin.addons.catalog.memories.description': '透過 Immich 例項分享旅行照片',
'admin.addons.catalog.mcp.name': 'MCP',
'admin.addons.catalog.mcp.description': '用於 AI 助手整合的模型上下文協議',
'admin.addons.catalog.packing.name': '行李',
'admin.addons.catalog.packing.description': '每次旅行的行李準備清單',
'admin.addons.catalog.budget.name': '預算',
'admin.addons.catalog.budget.description': '跟蹤支出並規劃旅行預算',
'admin.addons.catalog.documents.name': '文件',
'admin.addons.catalog.documents.description': '儲存和管理旅行文件',
'admin.addons.catalog.vacay.name': 'Vacay',
'admin.addons.catalog.vacay.description': '帶日曆檢視的個人假期規劃器',
'admin.addons.catalog.atlas.name': 'Atlas',
'admin.addons.catalog.atlas.description':
'標記已訪問國家和旅行統計的世界地圖',
'admin.addons.catalog.collab.name': 'Collab',
'admin.addons.catalog.collab.description': '旅行規劃的即時筆記、投票和聊天',
'admin.addons.subtitleBefore': '啟用或停用功能以自定義你的 ',
'admin.addons.subtitleAfter': ' 體驗。',
'admin.addons.enabled': '已啟用',
'admin.addons.disabled': '已停用',
'admin.addons.type.trip': '旅行',
'admin.addons.type.global': '全域性',
'admin.addons.type.integration': '整合',
'admin.addons.tripHint': '在每次旅行中作為標籤頁顯示',
'admin.addons.globalHint': '在主導航中作為獨立板塊顯示',
'admin.addons.integrationHint': '後端服務和 API 整合,無專屬頁面',
'admin.addons.toast.updated': '擴充套件已更新',
'admin.addons.toast.error': '更新擴充套件失敗',
'admin.addons.noAddons': '暫無可用擴充套件',
'admin.weather.title': '天氣資料',
'admin.weather.badge': '自 2026 年 3 月 24 日起',
'admin.weather.description':
'TREK 使用 Open-Meteo 作為天氣資料來源。Open-Meteo 是免費的開源天氣服務——無需 API 金鑰。',
'admin.weather.forecast': '16 天天氣預報',
'admin.weather.forecastDesc': '之前為 5 天 (OpenWeatherMap)',
'admin.weather.climate': '歷史氣候資料',
'admin.weather.climateDesc': '16 天預報之外的日期使用過去 85 年的平均值',
'admin.weather.requests': '每天 10,000 次請求',
'admin.weather.requestsDesc': '免費,無需 API 金鑰',
'admin.weather.locationHint':
'天氣基於每天中第一個有座標的地點。如果當天沒有分配地點,則使用地點列表中的任意地點作為參考。',
'admin.tabs.mcpTokens': 'MCP 存取',
'admin.mcpTokens.title': 'MCP 存取',
'admin.mcpTokens.subtitle': '管理所有使用者的 OAuth 工作階段和 API 令牌',
'admin.mcpTokens.sectionTitle': 'API 令牌',
'admin.mcpTokens.owner': '所有者',
'admin.mcpTokens.tokenName': '令牌名稱',
'admin.mcpTokens.created': '建立時間',
'admin.mcpTokens.lastUsed': '最後使用',
'admin.mcpTokens.never': '從未',
'admin.mcpTokens.empty': '尚未建立任何 MCP 令牌',
'admin.mcpTokens.deleteTitle': '刪除令牌',
'admin.mcpTokens.deleteMessage':
'此令牌將立即被撤銷。使用者將失去透過此令牌的 MCP 訪問許可權。',
'admin.mcpTokens.deleteSuccess': '令牌已刪除',
'admin.mcpTokens.deleteError': '刪除令牌失敗',
'admin.mcpTokens.loadError': '載入令牌失敗',
'admin.oauthSessions.sectionTitle': 'OAuth 工作階段',
'admin.oauthSessions.clientName': '客戶端',
'admin.oauthSessions.owner': '所有者',
'admin.oauthSessions.scopes': '權限範圍',
'admin.oauthSessions.created': '建立時間',
'admin.oauthSessions.empty': '目前沒有活躍的 OAuth 工作階段',
'admin.oauthSessions.revokeTitle': '撤銷工作階段',
'admin.oauthSessions.revokeMessage':
'此 OAuth 工作階段將立即被撤銷。客戶端將失去 MCP 存取權限。',
'admin.oauthSessions.revokeSuccess': '工作階段已撤銷',
'admin.oauthSessions.revokeError': '撤銷工作階段失敗',
'admin.oauthSessions.loadError': '載入 OAuth 工作階段失敗',
'admin.tabs.github': 'GitHub',
'admin.audit.subtitle': '安全與管理員操作記錄(備份、使用者、MFA、設定)。',
'admin.audit.empty': '暫無審計記錄。',
'admin.audit.refresh': '重新整理',
'admin.audit.loadMore': '載入更多',
'admin.audit.showing': '已載入 {count} 條 · 共 {total} 條',
'admin.audit.col.time': '時間',
'admin.audit.col.user': '使用者',
'admin.audit.col.action': '操作',
'admin.audit.col.resource': '資源',
'admin.audit.col.ip': 'IP',
'admin.audit.col.details': '詳情',
'admin.github.title': '版本歷史',
'admin.github.subtitle': '{repo} 的最新更新',
'admin.github.latest': '最新',
'admin.github.prerelease': '預釋出',
'admin.github.showDetails': '顯示詳情',
'admin.github.hideDetails': '隱藏詳情',
'admin.github.loadMore': '載入更多',
'admin.github.loading': '載入中...',
'admin.github.support': '幫助我繼續開發 TREK',
'admin.github.error': '載入版本失敗',
'admin.github.by': '作者',
'admin.update.available': '有可用更新',
'admin.update.text': 'TREK {version} 已釋出。你當前使用的是 {current}。',
'admin.update.button': '在 GitHub 檢視',
'admin.update.install': '安裝更新',
'admin.update.confirmTitle': '確定安裝更新?',
'admin.update.confirmText':
'TREK 將從 {current} 更新到 {version}。伺服器將自動重啟。',
'admin.update.dataInfo':
'你的所有資料(旅行、使用者、API 金鑰、上傳檔案、Vacay、Atlas、預算)將被保留。',
'admin.update.warning': '重啟期間應用將短暫不可用。',
'admin.update.confirm': '立即更新',
'admin.update.installing': '更新中…',
'admin.update.success': '更新已安裝!伺服器正在重啟…',
'admin.update.failed': '更新失敗',
'admin.update.backupHint': '建議在更新前建立備份。',
'admin.update.backupLink': '前往備份',
'admin.update.howTo': '如何更新',
'admin.update.dockerText':
'你的 TREK 例項執行在 Docker 中。要更新到 {version},請在伺服器上執行以下命令:',
'admin.update.reloadHint': '請在幾秒後重新整理頁面。',
'admin.tabs.permissions': '許可權',
'admin.addons.catalog.journey.name': '旅程',
'admin.addons.catalog.journey.description':
'旅行追蹤與旅行日誌,包含打卡、照片和每日故事',
'admin.passkey.title': 'Passkey 登入',
'admin.passkey.cardHint': '讓使用者使用 PasskeyWebAuthn)登入。預設為關閉。',
'admin.passkey.login': '啟用 Passkey 登入',
'admin.passkey.loginHint':
'顯示「使用 Passkey 登入」選項,並讓使用者在設定中註冊 Passkey。',
'admin.passkey.notConfigured':
'此部署尚未解析出任何 WebAuthn 網域。請設定下方的 APP_URL 或 Relying Party ID——在此之前 Passkey 將保持隱藏。',
'admin.passkey.rpId': 'Relying Party ID(網域)',
'admin.passkey.rpIdHint':
'Passkey 綁定的純網域,例如 trek.example.org。留空則從 APP_URL 推導。日後變更將使現有 Passkey 失效。',
'admin.passkey.origins': '允許的來源',
'admin.passkey.originsHint':
'以逗號分隔的完整來源,例如 https://trek.example.org。留空則使用 APP_URL。',
'admin.passkey.reset': '重設 Passkey',
'admin.passkey.resetHint':
'移除此使用者的所有 Passkey(例如裝置遺失時)。他們仍可使用密碼登入。',
'admin.passkey.resetConfirm': '要移除 {name} 的所有 Passkey 嗎?',
'admin.passkey.resetDone': '已移除 {count} 個 Passkey',
};
export default admin;