mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-21 14:21:46 +00:00
a876fb2634
* 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.
312 lines
18 KiB
TypeScript
312 lines
18 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
||
|
||
const settings: TranslationStrings = {
|
||
'settings.title': '設定',
|
||
'settings.subtitle': '配置你的個人設定',
|
||
'settings.tabs.display': '顯示',
|
||
'settings.tabs.map': '地圖',
|
||
'settings.tabs.notifications': '通知',
|
||
'settings.tabs.integrations': '整合',
|
||
'settings.tabs.account': '帳戶',
|
||
'settings.tabs.offline': 'Offline',
|
||
'settings.tabs.about': '關於',
|
||
'settings.map': '地圖',
|
||
'settings.mapTemplate': '地圖模板',
|
||
'settings.mapTemplatePlaceholder.select': '選擇模板...',
|
||
'settings.mapDefaultHint': '留空則使用 OpenStreetMap(預設)',
|
||
'settings.mapTemplatePlaceholder':
|
||
'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||
'settings.mapHint': '地圖瓦片 URL 模板',
|
||
'settings.mapProvider': '地圖提供商',
|
||
'settings.mapProviderHint':
|
||
'影響行程規劃和旅程地圖。Atlas 始終使用 Leaflet。',
|
||
'settings.mapLeafletSubtitle': '經典 2D,任何柵格瓦片',
|
||
'settings.mapMapboxSubtitle': '向量瓦片、3D 建築和地形',
|
||
'settings.mapExperimental': '實驗性',
|
||
'settings.mapMapboxToken': 'Mapbox 存取權杖',
|
||
'settings.mapMapboxTokenHint': '公開權杖 (pk.*) 來自',
|
||
'settings.mapMapboxTokenLink': 'mapbox.com → 存取權杖',
|
||
'settings.mapStyle': '地圖樣式',
|
||
'settings.mapStylePlaceholder': '選擇 Mapbox 樣式',
|
||
'settings.mapStyleHint': '預設或您自己的 mapbox://styles/USER/ID URL',
|
||
'settings.map3dBuildings': '3D 建築和地形',
|
||
'settings.map3dHint': '傾斜 + 真實 3D 建築拉伸 — 適用於所有樣式,包括衛星。',
|
||
'settings.mapHighQuality': '高畫質模式',
|
||
'settings.mapHighQualityHint':
|
||
'抗鋸齒 + 地球投影,帶來更清晰的邊緣和更真實的世界視圖。',
|
||
'settings.mapHighQualityWarning': '可能影響低階裝置的效能。',
|
||
'settings.mapTipLabel': '提示:',
|
||
'settings.mapTip':
|
||
'右鍵點擊並拖曳以旋轉/傾斜地圖。中鍵點擊新增地點(右鍵用於旋轉)。',
|
||
'settings.latitude': '緯度',
|
||
'settings.longitude': '經度',
|
||
'settings.saveMap': '儲存地圖',
|
||
'settings.apiKeys': 'API 金鑰',
|
||
'settings.mapsKey': 'Google Maps API 金鑰',
|
||
'settings.mapsKeyHint':
|
||
'用於地點搜尋。需要 Places API (New)。在 console.cloud.google.com 獲取',
|
||
'settings.weatherKey': 'OpenWeatherMap API 金鑰',
|
||
'settings.weatherKeyHint': '用於天氣資料。在 openweathermap.org/api 免費獲取',
|
||
'settings.keyPlaceholder': '輸入金鑰...',
|
||
'settings.configured': '已配置',
|
||
'settings.saveKeys': '儲存金鑰',
|
||
'settings.display': '顯示',
|
||
'settings.colorMode': '顏色模式',
|
||
'settings.light': '淺色',
|
||
'settings.dark': '深色',
|
||
'settings.auto': '自動',
|
||
'settings.language': '語言',
|
||
'settings.temperature': '溫度單位',
|
||
'settings.timeFormat': '時間格式',
|
||
'settings.blurBookingCodes': '模糊預訂程式碼',
|
||
'settings.notifications': '通知',
|
||
'settings.notifyTripInvite': '旅行邀請',
|
||
'settings.notifyBookingChange': '預訂變更',
|
||
'settings.notifyTripReminder': '旅行提醒',
|
||
'settings.notifyTodoDue': '待辦事項即將到期',
|
||
'settings.notifyVacayInvite': 'Vacay 融合邀請',
|
||
'settings.notifyPhotosShared': '共享照片 (Immich)',
|
||
'settings.notifyCollabMessage': '聊天訊息 (Collab)',
|
||
'settings.notifyPackingTagged': '行李清單:分配',
|
||
'settings.notifyWebhook': 'Webhook 通知',
|
||
'settings.notifyVersionAvailable': '有新版本可用',
|
||
'settings.notificationPreferences.email': '電子郵件',
|
||
'settings.notificationPreferences.webhook': 'Webhook',
|
||
'settings.notificationPreferences.inapp': '應用程式內',
|
||
'settings.notificationPreferences.ntfy': 'Ntfy',
|
||
'settings.notificationPreferences.noChannels':
|
||
'未配置通知渠道。請聯絡管理員設定電子郵件或 Webhook 通知。',
|
||
'settings.webhookUrl.label': 'Webhook URL',
|
||
'settings.webhookUrl.placeholder': 'https://discord.com/api/webhooks/...',
|
||
'settings.webhookUrl.hint':
|
||
'輸入您的 Discord、Slack 或自訂 Webhook URL 以接收通知。',
|
||
'settings.webhookUrl.saved': 'Webhook URL 已儲存',
|
||
'settings.webhookUrl.test': '測試',
|
||
'settings.webhookUrl.testSuccess': '測試 Webhook 傳送成功',
|
||
'settings.webhookUrl.testFailed': '測試 Webhook 傳送失敗',
|
||
'settings.ntfyUrl.topicLabel': 'Ntfy 主題',
|
||
'settings.ntfyUrl.topicPlaceholder': 'my-trek-alerts',
|
||
'settings.ntfyUrl.serverLabel': 'Ntfy 伺服器 URL(選填)',
|
||
'settings.ntfyUrl.serverPlaceholder': 'https://ntfy.sh',
|
||
'settings.ntfyUrl.hint':
|
||
'輸入您的 Ntfy 主題以接收推播通知。將伺服器留空以使用管理員設定的預設值。',
|
||
'settings.ntfyUrl.tokenLabel': '存取權杖(選填)',
|
||
'settings.ntfyUrl.tokenHint': '受密碼保護的主題需要此項目。',
|
||
'settings.ntfyUrl.saved': 'Ntfy 設定已儲存',
|
||
'settings.ntfyUrl.test': '測試',
|
||
'settings.ntfyUrl.testSuccess': '測試 Ntfy 通知傳送成功',
|
||
'settings.ntfyUrl.testFailed': '測試 Ntfy 通知失敗',
|
||
'settings.ntfyUrl.tokenCleared': '存取權杖已清除',
|
||
'settings.notificationsDisabled':
|
||
'通知尚未配置。請聯絡管理員啟用電子郵件或 Webhook 通知。',
|
||
'settings.notificationsActive': '活躍頻道',
|
||
'settings.notificationsManagedByAdmin': '通知事件由管理員配置。',
|
||
'settings.on': '開',
|
||
'settings.off': '關',
|
||
'settings.mcp.title': 'MCP 配置',
|
||
'settings.mcp.endpoint': 'MCP 端點',
|
||
'settings.mcp.clientConfig': '客戶端配置',
|
||
'settings.mcp.clientConfigHint':
|
||
'將 <your_token> 替換為下方列表中的 API 令牌。npx 的路徑可能需要根據您的系統進行調整(例如 Windows 上為 C:\\PROGRA~1\\nodejs\\npx.cmd)。',
|
||
'settings.mcp.clientConfigHintOAuth':
|
||
'將 <your_client_id> 和 <your_client_secret> 替換為上方建立的 OAuth 2.1 客戶端所顯示的憑據。首次連線時,mcp-remote 將開啟瀏覽器完成授權。npx 的路徑可能需要根據您的系統進行調整(例如 Windows 上為 C:\\PROGRA~1\\nodejs\\npx.cmd)。',
|
||
'settings.mcp.copy': '複製',
|
||
'settings.mcp.copied': '已複製!',
|
||
'settings.mcp.apiTokens': 'API 令牌',
|
||
'settings.mcp.createToken': '建立新令牌',
|
||
'settings.mcp.noTokens': '暫無令牌,請建立一個以連線 MCP 客戶端。',
|
||
'settings.mcp.tokenCreatedAt': '創建於',
|
||
'settings.mcp.tokenUsedAt': '使用於',
|
||
'settings.mcp.deleteTokenTitle': '刪除令牌',
|
||
'settings.mcp.deleteTokenMessage':
|
||
'此令牌將立即失效,使用它的所有 MCP 客戶端將失去訪問許可權。',
|
||
'settings.mcp.modal.createTitle': '建立 API 令牌',
|
||
'settings.mcp.modal.tokenName': '令牌名稱',
|
||
'settings.mcp.modal.tokenNamePlaceholder': '例如:Claude Desktop、工作電腦',
|
||
'settings.mcp.modal.creating': '建立中…',
|
||
'settings.mcp.modal.create': '建立令牌',
|
||
'settings.mcp.modal.createdTitle': '令牌已建立',
|
||
'settings.mcp.modal.createdWarning':
|
||
'此令牌只會顯示一次,請立即複製並妥善儲存——無法找回。',
|
||
'settings.mcp.modal.done': '完成',
|
||
'settings.mcp.toast.created': '令牌已建立',
|
||
'settings.mcp.toast.createError': '建立令牌失敗',
|
||
'settings.mcp.toast.deleted': '令牌已刪除',
|
||
'settings.mcp.toast.deleteError': '刪除令牌失敗',
|
||
'settings.mcp.apiTokensDeprecated':
|
||
'API 金鑰已棄用,將於未來版本中移除。請改用 OAuth 2.1 客戶端。',
|
||
'settings.oauth.clients': 'OAuth 2.1 客戶端',
|
||
'settings.oauth.clientsHint':
|
||
'註冊 OAuth 2.1 客戶端,讓第三方 MCP 應用程式(Claude Web、Cursor 等)無需靜態金鑰即可連線。',
|
||
'settings.oauth.createClient': '新增客戶端',
|
||
'settings.oauth.noClients': '尚無已註冊的 OAuth 客戶端。',
|
||
'settings.oauth.clientId': '客戶端 ID',
|
||
'settings.oauth.clientSecret': '客戶端密鑰',
|
||
'settings.oauth.deleteClient': '刪除客戶端',
|
||
'settings.oauth.deleteClientMessage':
|
||
'此客戶端及所有活躍工作階段將被永久刪除。任何使用此客戶端的應用程式將立即失去存取權限。',
|
||
'settings.oauth.rotateSecret': '輪換密鑰',
|
||
'settings.oauth.rotateSecretMessage':
|
||
'將產生新的客戶端密鑰,所有現有工作階段將立即失效。請在關閉此對話框前更新您的應用程式。',
|
||
'settings.oauth.rotateSecretConfirm': '輪換',
|
||
'settings.oauth.rotateSecretConfirming': '輪換中…',
|
||
'settings.oauth.rotateSecretDoneTitle': '已產生新密鑰',
|
||
'settings.oauth.rotateSecretDoneWarning':
|
||
'此密鑰僅顯示一次。請立即複製並更新您的應用程式——所有先前的工作階段已失效。',
|
||
'settings.oauth.activeSessions': '活躍的 OAuth 工作階段',
|
||
'settings.oauth.sessionScopes': '授權範圍',
|
||
'settings.oauth.sessionExpires': '到期時間',
|
||
'settings.oauth.revoke': '撤銷',
|
||
'settings.oauth.revokeSession': '撤銷工作階段',
|
||
'settings.oauth.revokeSessionMessage':
|
||
'這將立即撤銷此 OAuth 工作階段的存取權限。',
|
||
'settings.oauth.modal.createTitle': '註冊 OAuth 客戶端',
|
||
'settings.oauth.modal.presets': '快速預設',
|
||
'settings.oauth.modal.clientName': '應用程式名稱',
|
||
'settings.oauth.modal.clientNamePlaceholder':
|
||
'例如 Claude Web、我的 MCP 應用程式',
|
||
'settings.oauth.modal.redirectUris': '重新導向 URI',
|
||
'settings.oauth.modal.redirectUrisPlaceholder':
|
||
'https://your-app.com/callback\nhttps://your-app.com/auth',
|
||
'settings.oauth.modal.redirectUrisHint':
|
||
'每行一個 URI。需要 HTTPS(localhost 除外)。需要完全符合。',
|
||
'settings.oauth.modal.scopes': '允許的授權範圍',
|
||
'settings.oauth.modal.scopesHint':
|
||
'list_trips 和 get_trip_summary 始終可用——不需要授權範圍。它們可幫助 AI 找到所需的行程 ID。',
|
||
'settings.oauth.modal.selectAll': '全選',
|
||
'settings.oauth.modal.deselectAll': '取消全選',
|
||
'settings.oauth.modal.creating': '註冊中…',
|
||
'settings.oauth.modal.create': '註冊客戶端',
|
||
'settings.oauth.modal.createdTitle': '客戶端已註冊',
|
||
'settings.oauth.modal.createdWarning':
|
||
'客戶端密鑰僅顯示一次。請立即複製——無法恢復。',
|
||
'settings.oauth.toast.createError': '註冊 OAuth 客戶端失敗',
|
||
'settings.oauth.toast.deleted': 'OAuth 客戶端已刪除',
|
||
'settings.oauth.toast.deleteError': '刪除 OAuth 客戶端失敗',
|
||
'settings.oauth.toast.revoked': '工作階段已撤銷',
|
||
'settings.oauth.toast.revokeError': '撤銷工作階段失敗',
|
||
'settings.oauth.toast.rotateError': '輪換客戶端密鑰失敗',
|
||
'settings.oauth.modal.machineClient': '機器客戶端(無需瀏覽器登入)',
|
||
'settings.oauth.modal.machineClientHint':
|
||
'使用 client_credentials 授權——無需重新導向 URI。令牌透過 client_id + client_secret 直接簽發,並在所選範圍內以您的身份運行。',
|
||
'settings.oauth.modal.machineClientUsage':
|
||
'取得令牌:向 /oauth/token 發送 POST 請求,攜帶 grant_type=client_credentials、client_id 和 client_secret。無需瀏覽器,無重整令牌。',
|
||
'settings.oauth.badge.machine': '機器',
|
||
'settings.account': '賬戶',
|
||
'settings.about': '關於',
|
||
'settings.about.reportBug': '回報錯誤',
|
||
'settings.about.reportBugHint': '發現問題?告訴我們',
|
||
'settings.about.featureRequest': '功能建議',
|
||
'settings.about.featureRequestHint': '建議新功能',
|
||
'settings.about.wikiHint': '文件與指南',
|
||
'settings.about.supporters.badge': '月度支持者',
|
||
'settings.about.supporters.title': '與 TREK 同行的夥伴',
|
||
'settings.about.supporters.subtitle':
|
||
'當你規劃下一段路線時,這些人也在一起規劃 TREK 的未來。他們每月的支持直接用於開發與實際投入的時間——讓 TREK 保持開源。',
|
||
'settings.about.supporters.since': '自 {date} 起的支持者',
|
||
'settings.about.supporters.tierEmpty': '成為第一個',
|
||
'settings.about.supporter.tier.noReturnTicket': 'No Return Ticket',
|
||
'settings.about.supporter.tier.lostLuggageVip': 'Lost Luggage VIP',
|
||
'settings.about.supporter.tier.businessClassDreamer':
|
||
'Business Class Dreamer',
|
||
'settings.about.supporter.tier.budgetTraveller': 'Budget Traveller',
|
||
'settings.about.supporter.tier.hostelBunkmate': 'Hostel Bunkmate',
|
||
'settings.about.description':
|
||
'TREK 是一款自架旅遊規劃器,幫助您從最初構想到最後回憶,整理每次旅行。日程規劃、預算、行李清單、照片及更多功能——全部集中在您自己的伺服器上。',
|
||
'settings.about.madeWith': '以',
|
||
'settings.about.madeBy': '由 Maurice 及不斷成長的開源社群製作。',
|
||
'settings.username': '使用者名稱',
|
||
'settings.email': '郵箱',
|
||
'settings.role': '角色',
|
||
'settings.roleAdmin': '管理員',
|
||
'settings.oidcLinked': '已關聯',
|
||
'settings.changePassword': '修改密碼',
|
||
'settings.mustChangePassword': '您必須更改密碼才能繼續。請在下方設定新密碼。',
|
||
'settings.currentPassword': '當前密碼',
|
||
'settings.currentPasswordRequired': '請輸入當前密碼',
|
||
'settings.newPassword': '新密碼',
|
||
'settings.confirmPassword': '確認新密碼',
|
||
'settings.updatePassword': '更新密碼',
|
||
'settings.passwordRequired': '請輸入當前密碼和新密碼',
|
||
'settings.passwordTooShort': '密碼至少需要 8 個字元',
|
||
'settings.passwordMismatch': '兩次輸入的密碼不一致',
|
||
'settings.passwordWeak': '密碼必須包含大寫字母、小寫字母、數字和特殊字元',
|
||
'settings.passwordChanged': '密碼修改成功',
|
||
'settings.deleteAccount': '刪除賬戶',
|
||
'settings.deleteAccountTitle': '確定刪除賬戶?',
|
||
'settings.deleteAccountWarning':
|
||
'你的賬戶以及所有旅行、地點和檔案將被永久刪除。此操作無法撤銷。',
|
||
'settings.deleteAccountConfirm': '永久刪除',
|
||
'settings.deleteBlockedTitle': '無法刪除',
|
||
'settings.deleteBlockedMessage':
|
||
'你是唯一的管理員。請先將其他使用者提升為管理員,然後再刪除賬戶。',
|
||
'settings.roleUser': '使用者',
|
||
'settings.saveProfile': '儲存資料',
|
||
'settings.mfa.title': '雙因素認證 (2FA)',
|
||
'settings.mfa.description':
|
||
'登入時新增第二步驗證。使用身份驗證器應用(Google Authenticator、Authy 等)。',
|
||
'settings.mfa.requiredByPolicy':
|
||
'管理員要求雙因素身份驗證。請先完成下方的身份驗證器設定後再繼續。',
|
||
'settings.mfa.backupTitle': '備用程式碼',
|
||
'settings.mfa.backupDescription':
|
||
'如果你無法使用身份驗證器應用,可使用這些一次性備用程式碼登入。',
|
||
'settings.mfa.backupWarning':
|
||
'請立即儲存這些程式碼。每個程式碼只能使用一次。',
|
||
'settings.mfa.backupCopy': '複製程式碼',
|
||
'settings.mfa.backupDownload': '下載 TXT',
|
||
'settings.mfa.backupPrint': '列印 / PDF',
|
||
'settings.mfa.backupCopied': '備用程式碼已複製',
|
||
'settings.mfa.enabled': '您的賬戶已啟用 2FA。',
|
||
'settings.mfa.disabled': '2FA 未啟用。',
|
||
'settings.mfa.setup': '設定身份驗證器',
|
||
'settings.mfa.scanQr': '使用應用掃描此二維碼,或手動輸入金鑰。',
|
||
'settings.mfa.secretLabel': '金鑰(手動輸入)',
|
||
'settings.mfa.codePlaceholder': '6 位驗證碼',
|
||
'settings.mfa.enable': '啟用 2FA',
|
||
'settings.mfa.cancelSetup': '取消',
|
||
'settings.mfa.disableTitle': '停用 2FA',
|
||
'settings.mfa.disableHint': '輸入您的賬戶密碼和身份驗證器中的當前驗證碼。',
|
||
'settings.mfa.disable': '停用 2FA',
|
||
'settings.mfa.toastEnabled': '雙因素認證已啟用',
|
||
'settings.mfa.toastDisabled': '雙因素認證已停用',
|
||
'settings.mfa.demoBlocked': '演示模式下不可用',
|
||
'settings.toast.mapSaved': '地圖設定已儲存',
|
||
'settings.toast.keysSaved': 'API 金鑰已儲存',
|
||
'settings.toast.displaySaved': '顯示設定已儲存',
|
||
'settings.toast.profileSaved': '資料已儲存',
|
||
'settings.uploadAvatar': '上傳頭像',
|
||
'settings.removeAvatar': '移除頭像',
|
||
'settings.avatarUploaded': '頭像已更新',
|
||
'settings.avatarRemoved': '頭像已移除',
|
||
'settings.avatarError': '上傳失敗',
|
||
'settings.bookingLabels': '預訂路線標籤',
|
||
'settings.bookingLabelsHint':
|
||
'在地圖上顯示車站 / 機場名稱。關閉時僅顯示圖示。',
|
||
"settings.currency": "Currency",
|
||
"settings.currencyHint": "All amounts in Costs are converted to and shown in this currency.",
|
||
'settings.passkey.title': 'Passkey',
|
||
'settings.passkey.description':
|
||
'使用 Passkey 更快登入,並可抵禦網路釣魚——透過你的指紋、臉部、PIN 碼或硬體金鑰。你的密碼仍會保留作為備援。',
|
||
'settings.passkey.notConfigured':
|
||
'Passkey 已啟用,但此伺服器尚未完成設定。請聯絡管理員設定 WebAuthn 網域。',
|
||
'settings.passkey.add': '新增 Passkey',
|
||
'settings.passkey.addTitle': '新增 Passkey',
|
||
'settings.passkey.passwordPrompt': '請確認你目前的密碼,然後依照裝置提示操作。',
|
||
'settings.passkey.passwordRequired': '請輸入你目前的密碼。',
|
||
'settings.passkey.namePlaceholder': '名稱(選填,例如 "iPhone")',
|
||
'settings.passkey.addedToast': 'Passkey 已新增',
|
||
'settings.passkey.added': '已新增',
|
||
'settings.passkey.addError': '無法新增 Passkey',
|
||
'settings.passkey.cancelled': 'Passkey 設定已取消',
|
||
'settings.passkey.deleted': 'Passkey 已移除',
|
||
'settings.passkey.deleteConfirm': '要移除此 Passkey 嗎?請以密碼確認。',
|
||
'settings.passkey.rename': '重新命名',
|
||
'settings.passkey.defaultName': 'Passkey',
|
||
'settings.passkey.synced': '已同步',
|
||
'settings.passkey.deviceBound': '此裝置',
|
||
'settings.passkey.lastUsed': '上次使用',
|
||
'settings.passkey.neverUsed': '從未使用',
|
||
};
|
||
|
||
export default settings;
|