Three distinct bugs caused infinite OIDC redirect loops:
1. After logout, navigating to /login with no signal to suppress the
auto-redirect caused the login page to immediately re-trigger the
OIDC flow. Fixed by passing `{ state: { noRedirect: true } }` via
React Router's navigation state (not URL params, which were fragile
due to async cleanup timing) from all logout call sites.
2. On the OIDC callback page (/login?oidc_code=...), App.tsx's
mount-level loadUser() fired concurrently with the LoginPage's
exchange fetch. The App-level call had no cookie yet and got a 401,
which (if it resolved after the successful exchange loadUser()) would
overwrite isAuthenticated back to false. Fixed by skipping loadUser()
in App.tsx when the initial path is /login.
3. React 18 StrictMode double-invokes useEffect. The first run called
window.history.replaceState to clean the oidc_code from the URL
before starting the async exchange, so the second run saw no
oidc_code and fell through to the getAppConfig auto-redirect, firing
window.location.href = '/api/auth/oidc/login' before the exchange
could complete. Fixed by adding a useRef guard to prevent
double-execution and moving replaceState into the fetch callbacks so
the URL is only cleaned after the exchange resolves.
Also adds login.oidcLoggedOut translation key in all 14 languages to
show "You have been logged out" instead of the generic OIDC-only
message when landing on /login after an intentional logout.
Closes #491
1693 lines
78 KiB
TypeScript
1693 lines
78 KiB
TypeScript
const zh: Record<string, string> = {
|
||
// Common
|
||
'common.save': '保存',
|
||
'common.cancel': '取消',
|
||
'common.delete': '删除',
|
||
'common.edit': '编辑',
|
||
'common.add': '添加',
|
||
'common.loading': '加载中...',
|
||
'common.import': '导入',
|
||
'common.error': '错误',
|
||
'common.back': '返回',
|
||
'common.all': '全部',
|
||
'common.close': '关闭',
|
||
'common.open': '打开',
|
||
'common.upload': '上传',
|
||
'common.search': '搜索',
|
||
'common.confirm': '确认',
|
||
'common.ok': '确定',
|
||
'common.yes': '是',
|
||
'common.no': '否',
|
||
'common.or': '或',
|
||
'common.none': '无',
|
||
'common.date': '日期',
|
||
'common.rename': '重命名',
|
||
'common.name': '名称',
|
||
'common.email': '邮箱',
|
||
'common.password': '密码',
|
||
'common.saving': '保存中...',
|
||
'common.saved': '已保存',
|
||
'trips.reminder': '提醒',
|
||
'trips.reminderNone': '无',
|
||
'trips.reminderDay': '天',
|
||
'trips.reminderDays': '天',
|
||
'trips.reminderCustom': '自定义',
|
||
'trips.reminderDaysBefore': '天前提醒',
|
||
'trips.reminderDisabledHint': '旅行提醒已禁用。请在管理 > 设置 > 通知中启用。',
|
||
'common.update': '更新',
|
||
'common.change': '修改',
|
||
'common.uploading': '上传中…',
|
||
'common.backToPlanning': '返回规划',
|
||
'common.reset': '重置',
|
||
|
||
// Navbar
|
||
'nav.trip': '旅行',
|
||
'nav.share': '分享',
|
||
'nav.settings': '设置',
|
||
'nav.admin': '管理',
|
||
'nav.logout': '退出登录',
|
||
'nav.lightMode': '浅色模式',
|
||
'nav.darkMode': '深色模式',
|
||
'nav.autoMode': '自动模式',
|
||
'nav.administrator': '管理员',
|
||
|
||
// Dashboard
|
||
'dashboard.title': '我的旅行',
|
||
'dashboard.subtitle.loading': '加载旅行中...',
|
||
'dashboard.subtitle.trips': '{count} 次旅行({archived} 已归档)',
|
||
'dashboard.subtitle.empty': '开始你的第一次旅行',
|
||
'dashboard.subtitle.activeOne': '{count} 个进行中的旅行',
|
||
'dashboard.subtitle.activeMany': '{count} 个进行中的旅行',
|
||
'dashboard.subtitle.archivedSuffix': ' · {count} 已归档',
|
||
'dashboard.newTrip': '新建旅行',
|
||
'dashboard.gridView': '网格视图',
|
||
'dashboard.listView': '列表视图',
|
||
'dashboard.currency': '货币',
|
||
'dashboard.timezone': '时区',
|
||
'dashboard.localTime': '本地',
|
||
'dashboard.timezoneCustomTitle': '自定义时区',
|
||
'dashboard.timezoneCustomLabelPlaceholder': '标签(可选)',
|
||
'dashboard.timezoneCustomTzPlaceholder': '如 America/New_York',
|
||
'dashboard.timezoneCustomAdd': '添加',
|
||
'dashboard.timezoneCustomErrorEmpty': '请输入时区标识符',
|
||
'dashboard.timezoneCustomErrorInvalid': '无效的时区。请使用 Europe/Berlin 这样的格式',
|
||
'dashboard.timezoneCustomErrorDuplicate': '已添加',
|
||
'dashboard.emptyTitle': '暂无旅行',
|
||
'dashboard.emptyText': '创建你的第一次旅行,开始规划吧!',
|
||
'dashboard.emptyButton': '创建第一次旅行',
|
||
'dashboard.nextTrip': '下次旅行',
|
||
'dashboard.shared': '共享',
|
||
'dashboard.sharedBy': '由 {name} 分享',
|
||
'dashboard.days': '天',
|
||
'dashboard.places': '地点',
|
||
'dashboard.members': '旅伴',
|
||
'dashboard.archive': '归档',
|
||
'dashboard.copyTrip': '复制',
|
||
'dashboard.copySuffix': '副本',
|
||
'dashboard.restore': '恢复',
|
||
'dashboard.archived': '已归档',
|
||
'dashboard.status.ongoing': '进行中',
|
||
'dashboard.status.today': '今天',
|
||
'dashboard.status.tomorrow': '明天',
|
||
'dashboard.status.past': '已结束',
|
||
'dashboard.status.daysLeft': '还剩 {count} 天',
|
||
'dashboard.toast.loadError': '加载旅行失败',
|
||
'dashboard.toast.created': '旅行创建成功!',
|
||
'dashboard.toast.createError': '创建旅行失败',
|
||
'dashboard.toast.updated': '旅行已更新!',
|
||
'dashboard.toast.updateError': '更新旅行失败',
|
||
'dashboard.toast.deleted': '旅行已删除',
|
||
'dashboard.toast.deleteError': '删除旅行失败',
|
||
'dashboard.toast.archived': '旅行已归档',
|
||
'dashboard.toast.archiveError': '归档旅行失败',
|
||
'dashboard.toast.restored': '旅行已恢复',
|
||
'dashboard.toast.restoreError': '恢复旅行失败',
|
||
'dashboard.toast.copied': '旅行已复制!',
|
||
'dashboard.toast.copyError': '复制旅行失败',
|
||
'dashboard.confirm.delete': '删除旅行「{title}」?所有地点和计划将被永久删除。',
|
||
'dashboard.editTrip': '编辑旅行',
|
||
'dashboard.createTrip': '创建新旅行',
|
||
'dashboard.tripTitle': '标题',
|
||
'dashboard.tripTitlePlaceholder': '如:日本夏日之旅',
|
||
'dashboard.tripDescription': '描述',
|
||
'dashboard.tripDescriptionPlaceholder': '这次旅行是关于什么的?',
|
||
'dashboard.startDate': '开始日期',
|
||
'dashboard.endDate': '结束日期',
|
||
'dashboard.dayCount': '天数',
|
||
'dashboard.dayCountHint': '未设置旅行日期时要规划的天数。',
|
||
'dashboard.noDateHint': '未设置日期——将默认创建 7 天。你可以随时修改。',
|
||
'dashboard.coverImage': '封面图片',
|
||
'dashboard.addCoverImage': '添加封面图片',
|
||
'dashboard.addMembers': '旅伴',
|
||
'dashboard.addMember': '添加成员',
|
||
'dashboard.coverSaved': '封面图片已保存',
|
||
'dashboard.coverUploadError': '上传失败',
|
||
'dashboard.coverRemoveError': '移除失败',
|
||
'dashboard.titleRequired': '标题为必填项',
|
||
'dashboard.endDateError': '结束日期必须晚于开始日期',
|
||
|
||
// Settings
|
||
'settings.title': '设置',
|
||
'settings.subtitle': '配置你的个人设置',
|
||
'settings.tabs.display': '显示',
|
||
'settings.tabs.map': '地图',
|
||
'settings.tabs.notifications': '通知',
|
||
'settings.tabs.integrations': '集成',
|
||
'settings.tabs.account': '账户',
|
||
'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.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.routeCalculation': '路线计算',
|
||
'settings.blurBookingCodes': '模糊预订代码',
|
||
'settings.notifications': '通知',
|
||
'settings.notifyTripInvite': '旅行邀请',
|
||
'settings.notifyBookingChange': '预订变更',
|
||
'settings.notifyTripReminder': '旅行提醒',
|
||
'settings.notifyVacayInvite': 'Vacay 融合邀请',
|
||
'settings.notifyPhotosShared': '共享照片 (Immich)',
|
||
'settings.notifyCollabMessage': '聊天消息 (Collab)',
|
||
'settings.notifyPackingTagged': '行李清单:分配',
|
||
'settings.notifyWebhook': 'Webhook 通知',
|
||
'settings.notificationsDisabled': '通知尚未配置。请联系管理员启用电子邮件或 Webhook 通知。',
|
||
'settings.notificationsActive': '活跃频道',
|
||
'settings.notificationsManagedByAdmin': '通知事件由管理员配置。',
|
||
'admin.notifications.title': '通知',
|
||
'admin.notifications.hint': '选择一个通知渠道。一次只能激活一个。',
|
||
'admin.notifications.none': '已禁用',
|
||
'admin.notifications.email': '电子邮件 (SMTP)',
|
||
'admin.notifications.webhook': 'Webhook',
|
||
'admin.notifications.events': '通知事件',
|
||
'admin.notifications.eventsHint': '选择哪些事件为所有用户触发通知。',
|
||
'admin.notifications.configureFirst': '请先在下方配置 SMTP 或 Webhook,然后启用事件。',
|
||
'admin.notifications.save': '保存通知设置',
|
||
'admin.notifications.saved': '通知设置已保存',
|
||
'admin.notifications.testWebhook': '发送测试 Webhook',
|
||
'admin.notifications.testWebhookSuccess': '测试 Webhook 发送成功',
|
||
'admin.notifications.testWebhookFailed': '测试 Webhook 发送失败',
|
||
'admin.smtp.title': '邮件与通知',
|
||
'admin.smtp.hint': '用于发送电子邮件通知的 SMTP 配置。',
|
||
'admin.smtp.testButton': '发送测试邮件',
|
||
'admin.webhook.hint': '向外部 Webhook 发送通知(Discord、Slack 等)。',
|
||
'admin.smtp.testSuccess': '测试邮件发送成功',
|
||
'admin.smtp.testFailed': '测试邮件发送失败',
|
||
'dayplan.icsTooltip': '导出日历 (ICS)',
|
||
'share.linkTitle': '公开链接',
|
||
'share.linkHint': '创建一个链接,任何人无需登录即可查看此旅行。仅可查看,无法编辑。',
|
||
'share.createLink': '创建链接',
|
||
'share.deleteLink': '删除链接',
|
||
'share.createError': '无法创建链接',
|
||
'common.copy': '复制',
|
||
'common.copied': '已复制',
|
||
'share.permMap': '地图与计划',
|
||
'share.permBookings': '预订',
|
||
'share.permPacking': '行李',
|
||
'shared.expired': '链接已过期或无效',
|
||
'shared.expiredHint': '此共享旅行链接已失效。',
|
||
'shared.readOnly': '只读共享视图',
|
||
'shared.tabPlan': '计划',
|
||
'shared.tabBookings': '预订',
|
||
'shared.tabPacking': '行李',
|
||
'shared.tabBudget': '预算',
|
||
'shared.tabChat': '聊天',
|
||
'shared.days': '天',
|
||
'shared.places': '个地点',
|
||
'shared.other': '其他',
|
||
'shared.totalBudget': '总预算',
|
||
'shared.messages': '条消息',
|
||
'shared.sharedVia': '通过以下分享',
|
||
'shared.confirmed': '已确认',
|
||
'shared.pending': '待确认',
|
||
'share.permBudget': '预算',
|
||
'share.permCollab': '聊天',
|
||
'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.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.account': '账户',
|
||
'settings.about': '关于',
|
||
'settings.about.reportBug': '报告错误',
|
||
'settings.about.reportBugHint': '发现问题?告诉我们',
|
||
'settings.about.featureRequest': '功能建议',
|
||
'settings.about.featureRequestHint': '建议一个新功能',
|
||
'settings.about.wikiHint': '文档和指南',
|
||
'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': '上传失败',
|
||
|
||
// Login
|
||
'login.error': '登录失败,请检查你的凭据。',
|
||
'login.tagline': '你的旅行。\n你的计划。',
|
||
'login.description': '通过互动地图、预算管理和实时同步,协同规划旅行。',
|
||
'login.features.maps': '互动地图',
|
||
'login.features.mapsDesc': 'Google Places、路线和聚类',
|
||
'login.features.realtime': '实时同步',
|
||
'login.features.realtimeDesc': '通过 WebSocket 协同规划',
|
||
'login.features.budget': '预算跟踪',
|
||
'login.features.budgetDesc': '分类、图表和人均费用',
|
||
'login.features.collab': '协作',
|
||
'login.features.collabDesc': '多用户共享旅行',
|
||
'login.features.packing': '行李清单',
|
||
'login.features.packingDesc': '分类、进度和建议',
|
||
'login.features.bookings': '预订',
|
||
'login.features.bookingsDesc': '航班、酒店、餐厅等',
|
||
'login.features.files': '文档',
|
||
'login.features.filesDesc': '上传和管理文档',
|
||
'login.features.routes': '智能路线',
|
||
'login.features.routesDesc': '自动优化和导出到 Google Maps',
|
||
'login.selfHosted': '自托管 · 开源 · 数据由你掌控',
|
||
'login.title': '登录',
|
||
'login.subtitle': '欢迎回来',
|
||
'login.signingIn': '登录中…',
|
||
'login.signIn': '登录',
|
||
'login.createAdmin': '创建管理员账户',
|
||
'login.createAdminHint': '为 TREK 设置第一个管理员账户。',
|
||
'login.setNewPassword': '设置新密码',
|
||
'login.setNewPasswordHint': '您必须更改密码才能继续。',
|
||
'login.createAccount': '创建账户',
|
||
'login.createAccountHint': '注册新账户。',
|
||
'login.creating': '创建中…',
|
||
'login.noAccount': '还没有账户?',
|
||
'login.hasAccount': '已有账户?',
|
||
'login.register': '注册',
|
||
'login.emailPlaceholder': 'your@email.com',
|
||
'login.username': '用户名',
|
||
'login.oidc.registrationDisabled': '注册已关闭。请联系管理员。',
|
||
'login.oidc.noEmail': '未从提供商获取到邮箱。',
|
||
'login.mfaTitle': '双因素认证',
|
||
'login.mfaSubtitle': '请输入身份验证器应用中的 6 位验证码。',
|
||
'login.mfaCodeLabel': '验证码',
|
||
'login.mfaCodeRequired': '请输入身份验证器应用中的验证码。',
|
||
'login.mfaHint': '打开 Google Authenticator、Authy 或其他 TOTP 应用。',
|
||
'login.mfaBack': '← 返回登录',
|
||
'login.mfaVerify': '验证',
|
||
'login.oidc.tokenFailed': '认证失败。',
|
||
'login.oidc.invalidState': '会话无效,请重试。',
|
||
'login.demoFailed': '演示登录失败',
|
||
'login.oidcSignIn': '通过 {name} 登录',
|
||
'login.oidcOnly': '密码登录已关闭。请通过 SSO 提供商登录。',
|
||
'login.oidcLoggedOut': '您已退出登录。请重新通过 SSO 提供商登录。',
|
||
'login.demoHint': '试用演示——无需注册',
|
||
|
||
// Register
|
||
'register.passwordMismatch': '两次输入的密码不一致',
|
||
'register.passwordTooShort': '密码至少需要 8 个字符',
|
||
'register.failed': '注册失败',
|
||
'register.getStarted': '开始使用',
|
||
'register.subtitle': '创建账户,开始规划你的梦想旅行。',
|
||
'register.feature1': '无限旅行计划',
|
||
'register.feature2': '互动地图视图',
|
||
'register.feature3': '管理地点和分类',
|
||
'register.feature4': '跟踪预订',
|
||
'register.feature5': '创建行李清单',
|
||
'register.feature6': '存储照片和文件',
|
||
'register.createAccount': '创建账户',
|
||
'register.startPlanning': '开始规划你的旅行',
|
||
'register.minChars': '至少 6 个字符',
|
||
'register.confirmPassword': '确认密码',
|
||
'register.repeatPassword': '重复密码',
|
||
'register.registering': '注册中...',
|
||
'register.register': '注册',
|
||
'register.hasAccount': '已有账户?',
|
||
'register.signIn': '登录',
|
||
|
||
// Admin
|
||
'admin.title': '管理后台',
|
||
'admin.subtitle': '用户管理和系统设置',
|
||
'admin.tabs.users': '用户',
|
||
'admin.tabs.categories': '分类',
|
||
'admin.tabs.backup': '备份',
|
||
'admin.tabs.audit': '审计',
|
||
'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.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 登录。密码登录和注册将被禁用。',
|
||
|
||
// File Types
|
||
'admin.fileTypes': '允许的文件类型',
|
||
'admin.fileTypesHint': '配置用户可以上传的文件类型。',
|
||
'admin.fileTypesFormat': '以逗号分隔的扩展名(如 jpg,png,pdf,doc)。使用 * 允许所有类型。',
|
||
'admin.fileTypesSaved': '文件类型设置已保存',
|
||
|
||
'admin.bagTracking.title': '行李追踪',
|
||
'admin.bagTracking.subtitle': '为打包物品启用重量和行李分配',
|
||
'admin.tabs.config': '个性化',
|
||
'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': '保存失败',
|
||
|
||
// Addons
|
||
'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': '暂无可用扩展',
|
||
// Weather info
|
||
'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': '天气基于每天中第一个有坐标的地点。如果当天没有分配地点,则使用地点列表中的任意地点作为参考。',
|
||
|
||
// MCP Tokens
|
||
'admin.tabs.mcpTokens': 'MCP 令牌',
|
||
'admin.mcpTokens.title': 'MCP 令牌',
|
||
'admin.mcpTokens.subtitle': '管理所有用户的 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': '加载令牌失败',
|
||
|
||
// GitHub
|
||
'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': '请在几秒后刷新页面。',
|
||
|
||
// Vacay addon
|
||
'vacay.subtitle': '规划和管理假期',
|
||
'vacay.settings': '设置',
|
||
'vacay.year': '年份',
|
||
'vacay.addYear': '添加下一年',
|
||
'vacay.addPrevYear': '添加上一年',
|
||
'vacay.removeYear': '移除年份',
|
||
'vacay.removeYearConfirm': '移除 {year}?',
|
||
'vacay.removeYearHint': '该年度所有假期记录和公司假日将被永久删除。',
|
||
'vacay.remove': '移除',
|
||
'vacay.persons': '成员',
|
||
'vacay.noPersons': '暂无成员',
|
||
'vacay.addPerson': '添加成员',
|
||
'vacay.editPerson': '编辑成员',
|
||
'vacay.removePerson': '移除成员',
|
||
'vacay.removePersonConfirm': '移除 {name}?',
|
||
'vacay.removePersonHint': '该成员的所有假期记录将被永久删除。',
|
||
'vacay.personName': '姓名',
|
||
'vacay.personNamePlaceholder': '输入姓名',
|
||
'vacay.color': '颜色',
|
||
'vacay.add': '添加',
|
||
'vacay.legend': '图例',
|
||
'vacay.publicHoliday': '公共假日',
|
||
'vacay.companyHoliday': '公司假日',
|
||
'vacay.weekend': '周末',
|
||
'vacay.modeVacation': '休假',
|
||
'vacay.modeCompany': '公司假日',
|
||
'vacay.entitlement': '年假额度',
|
||
'vacay.entitlementDays': '天',
|
||
'vacay.used': '已用',
|
||
'vacay.remaining': '剩余',
|
||
'vacay.carriedOver': '从 {year} 结转',
|
||
'vacay.blockWeekends': '锁定周末',
|
||
'vacay.blockWeekendsHint': '禁止在周六和周日安排假期',
|
||
'vacay.weekendDays': '周末',
|
||
'vacay.mon': '周一',
|
||
'vacay.tue': '周二',
|
||
'vacay.wed': '周三',
|
||
'vacay.thu': '周四',
|
||
'vacay.fri': '周五',
|
||
'vacay.sat': '周六',
|
||
'vacay.sun': '周日',
|
||
'vacay.publicHolidays': '公共假日',
|
||
'vacay.publicHolidaysHint': '在日历中标记公共假日',
|
||
'vacay.selectCountry': '选择国家',
|
||
'vacay.selectRegion': '选择地区(可选)',
|
||
'vacay.companyHolidays': '公司假日',
|
||
'vacay.companyHolidaysHint': '允许标记公司统一休假日',
|
||
'vacay.companyHolidaysNoDeduct': '公司假日不计入年假天数。',
|
||
'vacay.carryOver': '结转',
|
||
'vacay.carryOverHint': '自动将剩余年假天数结转到下一年',
|
||
'vacay.sharing': '共享',
|
||
'vacay.sharingHint': '与其他 TREK 用户共享你的假期计划',
|
||
'vacay.owner': '所有者',
|
||
'vacay.shareEmailPlaceholder': 'TREK 用户邮箱',
|
||
'vacay.shareSuccess': '计划共享成功',
|
||
'vacay.shareError': '无法共享计划',
|
||
'vacay.dissolve': '解除合并',
|
||
'vacay.dissolveHint': '重新分离日历。你的记录将被保留。',
|
||
'vacay.dissolveAction': '解除',
|
||
'vacay.dissolved': '日历已分离',
|
||
'vacay.fusedWith': '已合并',
|
||
'vacay.you': '你',
|
||
'vacay.noData': '暂无数据',
|
||
'vacay.changeColor': '更改颜色',
|
||
'vacay.inviteUser': '邀请用户',
|
||
'vacay.inviteHint': '邀请其他 TREK 用户共享合并的假期日历。',
|
||
'vacay.selectUser': '选择用户',
|
||
'vacay.sendInvite': '发送邀请',
|
||
'vacay.inviteSent': '邀请已发送',
|
||
'vacay.inviteError': '无法发送邀请',
|
||
'vacay.pending': '待处理',
|
||
'vacay.noUsersAvailable': '没有可用用户',
|
||
'vacay.accept': '接受',
|
||
'vacay.decline': '拒绝',
|
||
'vacay.acceptFusion': '接受并合并',
|
||
'vacay.inviteTitle': '合并请求',
|
||
'vacay.inviteWantsToFuse': '想要与你共享假期日历。',
|
||
'vacay.fuseInfo1': '你们双方将在一个共享日历中看到所有假期记录。',
|
||
'vacay.fuseInfo2': '双方都可以为对方创建和编辑记录。',
|
||
'vacay.fuseInfo3': '双方都可以删除记录和修改年假额度。',
|
||
'vacay.fuseInfo4': '公共假日和公司假日等设置将共享。',
|
||
'vacay.fuseInfo5': '任何一方都可以随时解除合并。你的记录将被保留。',
|
||
'vacay.addCalendar': '添加日历',
|
||
'vacay.calendarColor': '颜色',
|
||
'vacay.calendarLabel': '标签',
|
||
'vacay.noCalendars': '无日历',
|
||
'nav.myTrips': '我的旅行',
|
||
|
||
// Atlas addon
|
||
'atlas.subtitle': '你的全球旅行足迹',
|
||
'atlas.countries': '国家',
|
||
'atlas.trips': '旅行',
|
||
'atlas.places': '地点',
|
||
'atlas.days': '天',
|
||
'atlas.visitedCountries': '已访问国家',
|
||
'atlas.cities': '城市',
|
||
'atlas.noData': '暂无旅行数据',
|
||
'atlas.noDataHint': '创建旅行并添加地点以查看世界地图',
|
||
'atlas.lastTrip': '上次旅行',
|
||
'atlas.nextTrip': '下次旅行',
|
||
'atlas.daysLeft': '天后出发',
|
||
'atlas.streak': '连续',
|
||
'atlas.year': '年',
|
||
'atlas.years': '年',
|
||
'atlas.yearInRow': '年连续',
|
||
'atlas.yearsInRow': '年连续',
|
||
'atlas.tripIn': '次旅行在',
|
||
'atlas.tripsIn': '次旅行在',
|
||
'atlas.since': '自',
|
||
'atlas.europe': '欧洲',
|
||
'atlas.asia': '亚洲',
|
||
'atlas.northAmerica': '北美洲',
|
||
'atlas.southAmerica': '南美洲',
|
||
'atlas.africa': '非洲',
|
||
'atlas.oceania': '大洋洲',
|
||
'atlas.other': '其他',
|
||
'atlas.firstVisit': '首次旅行',
|
||
'atlas.lastVisitLabel': '最近旅行',
|
||
'atlas.tripSingular': '次旅行',
|
||
'atlas.tripPlural': '次旅行',
|
||
'atlas.placeVisited': '个地点已访问',
|
||
'atlas.placesVisited': '个地点已访问',
|
||
'atlas.statsTab': '统计',
|
||
'atlas.bucketTab': '心愿单',
|
||
'atlas.addBucket': '添加到心愿单',
|
||
'atlas.bucketNamePlaceholder': '地点或目的地...',
|
||
'atlas.bucketNotesPlaceholder': '备注(可选)',
|
||
'atlas.bucketEmpty': '你的心愿单是空的',
|
||
'atlas.bucketEmptyHint': '添加你梦想去的地方',
|
||
'atlas.unmark': '移除',
|
||
'atlas.confirmMark': '将此国家标记为已访问?',
|
||
'atlas.confirmUnmark': '从已访问列表中移除此国家?',
|
||
'atlas.confirmUnmarkRegion': '从已访问列表中移除此地区?',
|
||
'atlas.markVisited': '标记为已访问',
|
||
'atlas.markVisitedHint': '将此国家添加到已访问列表',
|
||
'atlas.markRegionVisitedHint': '将此地区添加到已访问列表',
|
||
'atlas.addToBucket': '添加到心愿单',
|
||
'atlas.addPoi': '添加地点',
|
||
'atlas.searchCountry': '搜索国家...',
|
||
'atlas.month': '月份',
|
||
'atlas.addToBucketHint': '保存为想去的地方',
|
||
'atlas.bucketWhen': '你计划什么时候去?',
|
||
|
||
// Trip Planner
|
||
'trip.tabs.plan': '计划',
|
||
'trip.tabs.reservations': '预订',
|
||
'trip.tabs.reservationsShort': '预订',
|
||
'trip.tabs.packing': '行李清单',
|
||
'trip.tabs.packingShort': '行李',
|
||
'trip.tabs.lists': '列表',
|
||
'trip.tabs.listsShort': '列表',
|
||
'trip.tabs.budget': '预算',
|
||
'trip.tabs.files': '文件',
|
||
'trip.loading': '加载旅行中...',
|
||
'trip.loadingPhotos': '正在加载地点照片...',
|
||
'trip.mobilePlan': '计划',
|
||
'trip.mobilePlaces': '地点',
|
||
'trip.toast.placeUpdated': '地点已更新',
|
||
'trip.toast.placeAdded': '地点已添加',
|
||
'trip.toast.placeDeleted': '地点已删除',
|
||
'trip.toast.selectDay': '请先选择一天',
|
||
'trip.toast.assignedToDay': '地点已分配到当天',
|
||
'trip.toast.reorderError': '排序失败',
|
||
'trip.toast.reservationUpdated': '预订已更新',
|
||
'trip.toast.reservationAdded': '预订已添加',
|
||
'trip.toast.deleted': '已删除',
|
||
'trip.confirm.deletePlace': '确定要删除这个地点吗?',
|
||
|
||
// Day Plan Sidebar
|
||
'dayplan.emptyDay': '当天暂无计划',
|
||
'dayplan.addNote': '添加备注',
|
||
'dayplan.editNote': '编辑备注',
|
||
'dayplan.noteAdd': '添加备注',
|
||
'dayplan.noteEdit': '编辑备注',
|
||
'dayplan.noteTitle': '备注',
|
||
'dayplan.noteSubtitle': '每日备注',
|
||
'dayplan.totalCost': '总费用',
|
||
'dayplan.days': '天',
|
||
'dayplan.dayN': '第 {n} 天',
|
||
'dayplan.calculating': '计算中...',
|
||
'dayplan.route': '路线',
|
||
'dayplan.optimize': '优化',
|
||
'dayplan.optimized': '路线已优化',
|
||
'dayplan.routeError': '路线计算失败',
|
||
'dayplan.toast.needTwoPlaces': '路线优化至少需要两个地点',
|
||
'dayplan.toast.routeOptimized': '路线已优化',
|
||
'dayplan.toast.noGeoPlaces': '未找到有坐标的地点用于路线计算',
|
||
'dayplan.confirmed': '已确认',
|
||
'dayplan.pendingRes': '待确认',
|
||
'dayplan.pdf': 'PDF',
|
||
'dayplan.pdfTooltip': '导出当天计划为 PDF',
|
||
'dayplan.pdfError': 'PDF 导出失败',
|
||
'dayplan.cannotReorderTransport': '有固定时间的预订无法重新排序',
|
||
'dayplan.confirmRemoveTimeTitle': '移除时间?',
|
||
'dayplan.confirmRemoveTimeBody': '此地点有固定时间({time})。移动后将移除时间并允许自由排序。',
|
||
'dayplan.confirmRemoveTimeAction': '移除时间并移动',
|
||
'dayplan.cannotDropOnTimed': '无法将项目放置在有固定时间的条目之间',
|
||
'dayplan.cannotBreakChronology': '这将打乱已计划项目和预订的时间顺序',
|
||
|
||
// Places Sidebar
|
||
'places.addPlace': '添加地点/活动',
|
||
'places.importGpx': 'GPX',
|
||
'places.gpxImported': '已从 GPX 导入 {count} 个地点',
|
||
'places.gpxError': 'GPX 导入失败',
|
||
'places.importGoogleList': 'Google 列表',
|
||
'places.googleListHint': '粘贴共享的 Google Maps 列表链接以导入所有地点。',
|
||
'places.googleListImported': '已从"{list}"导入 {count} 个地点',
|
||
'places.googleListError': 'Google Maps 列表导入失败',
|
||
'places.viewDetails': '查看详情',
|
||
'places.urlResolved': '已从 URL 导入地点',
|
||
'places.assignToDay': '添加到哪一天?',
|
||
'places.all': '全部',
|
||
'places.unplanned': '未规划',
|
||
'places.search': '搜索地点...',
|
||
'places.allCategories': '所有分类',
|
||
'places.categoriesSelected': '个分类',
|
||
'places.clearFilter': '清除筛选',
|
||
'places.count': '{count} 个地点',
|
||
'places.countSingular': '1 个地点',
|
||
'places.allPlanned': '所有地点已规划',
|
||
'places.noneFound': '未找到地点',
|
||
'places.editPlace': '编辑地点',
|
||
'places.formName': '名称',
|
||
'places.formNamePlaceholder': '如:埃菲尔铁塔',
|
||
'places.formDescription': '描述',
|
||
'places.formDescriptionPlaceholder': '简短描述...',
|
||
'places.formAddress': '地址',
|
||
'places.formAddressPlaceholder': '街道、城市、国家',
|
||
'places.formLat': '纬度(如 48.8566)',
|
||
'places.formLng': '经度(如 2.3522)',
|
||
'places.formCategory': '分类',
|
||
'places.noCategory': '无分类',
|
||
'places.categoryNamePlaceholder': '分类名称',
|
||
'places.formTime': '时间',
|
||
'places.startTime': '开始',
|
||
'places.endTime': '结束',
|
||
'places.endTimeBeforeStart': '结束时间早于开始时间',
|
||
'places.timeCollision': '时间冲突:',
|
||
'places.formWebsite': '网站',
|
||
'places.formNotesPlaceholder': '个人备注...',
|
||
'places.formReservation': '预订',
|
||
'places.reservationNotesPlaceholder': '预订备注、确认号...',
|
||
'places.mapsSearchPlaceholder': '搜索地点...',
|
||
'places.mapsSearchError': '地点搜索失败。',
|
||
'places.osmHint': '使用 OpenStreetMap 搜索(无照片、营业时间或评分)。在设置中添加 Google API 密钥以获取完整信息。',
|
||
'places.osmActive': '通过 OpenStreetMap 搜索(无照片、评分或营业时间)。在设置中添加 Google API 密钥以获取增强数据。',
|
||
'places.categoryCreateError': '创建分类失败',
|
||
'places.nameRequired': '请输入名称',
|
||
'places.saveError': '保存失败',
|
||
// Place Inspector
|
||
'inspector.opened': '营业中',
|
||
'inspector.closed': '已关闭',
|
||
'inspector.openingHours': '营业时间',
|
||
'inspector.showHours': '显示营业时间',
|
||
'inspector.files': '文件',
|
||
'inspector.filesCount': '{count} 个文件',
|
||
'inspector.removeFromDay': '从当天移除',
|
||
'inspector.addToDay': '添加到当天',
|
||
'inspector.confirmedRes': '已确认预订',
|
||
'inspector.pendingRes': '待确认预订',
|
||
'inspector.google': '在 Google Maps 中打开',
|
||
'inspector.website': '打开网站',
|
||
'inspector.addRes': '预订',
|
||
'inspector.editRes': '编辑预订',
|
||
'inspector.participants': '参与者',
|
||
'inspector.trackStats': '轨迹数据',
|
||
|
||
// Reservations
|
||
'reservations.title': '预订',
|
||
'reservations.empty': '暂无预订',
|
||
'reservations.emptyHint': '添加航班、酒店等预订信息',
|
||
'reservations.add': '添加预订',
|
||
'reservations.addManual': '手动添加',
|
||
'reservations.placeHint': '提示:建议从地点直接创建预订,以便与日程计划关联。',
|
||
'reservations.confirmed': '已确认',
|
||
'reservations.pending': '待确认',
|
||
'reservations.summary': '{confirmed} 已确认,{pending} 待确认',
|
||
'reservations.fromPlan': '来自计划',
|
||
'reservations.showFiles': '查看文件',
|
||
'reservations.editTitle': '编辑预订',
|
||
'reservations.status': '状态',
|
||
'reservations.datetime': '日期和时间',
|
||
'reservations.startTime': '开始时间',
|
||
'reservations.endTime': '结束时间',
|
||
'reservations.date': '日期',
|
||
'reservations.time': '时间',
|
||
'reservations.timeAlt': '时间(备选,如 19:30)',
|
||
'reservations.notes': '备注',
|
||
'reservations.notesPlaceholder': '其他备注...',
|
||
'reservations.meta.airline': '航空公司',
|
||
'reservations.meta.flightNumber': '航班号',
|
||
'reservations.meta.from': '出发',
|
||
'reservations.meta.to': '到达',
|
||
'reservations.meta.trainNumber': '车次',
|
||
'reservations.meta.platform': '站台',
|
||
'reservations.meta.seat': '座位',
|
||
'reservations.meta.checkIn': '入住',
|
||
'reservations.meta.checkOut': '退房',
|
||
'reservations.meta.linkAccommodation': '住宿',
|
||
'reservations.meta.pickAccommodation': '关联住宿',
|
||
'reservations.meta.noAccommodation': '无',
|
||
'reservations.meta.hotelPlace': '住宿',
|
||
'reservations.meta.pickHotel': '选择住宿',
|
||
'reservations.meta.fromDay': '从',
|
||
'reservations.meta.toDay': '到',
|
||
'reservations.meta.selectDay': '选择日期',
|
||
'reservations.type.flight': '航班',
|
||
'reservations.type.hotel': '住宿',
|
||
'reservations.type.restaurant': '餐厅',
|
||
'reservations.type.train': '火车',
|
||
'reservations.type.car': '租车',
|
||
'reservations.type.cruise': '邮轮',
|
||
'reservations.type.event': '活动',
|
||
'reservations.type.tour': '旅游团',
|
||
'reservations.type.other': '其他',
|
||
'reservations.confirm.delete': '确定要删除预订「{name}」吗?',
|
||
'reservations.confirm.deleteTitle': '删除预订?',
|
||
'reservations.confirm.deleteBody': '"{name}" 将被永久删除。',
|
||
'reservations.toast.updated': '预订已更新',
|
||
'reservations.toast.removed': '预订已删除',
|
||
'reservations.toast.fileUploaded': '文件已上传',
|
||
'reservations.toast.uploadError': '上传失败',
|
||
'reservations.newTitle': '新建预订',
|
||
'reservations.bookingType': '预订类型',
|
||
'reservations.titleLabel': '标题',
|
||
'reservations.titlePlaceholder': '如:汉莎 LH123、阿德隆酒店...',
|
||
'reservations.locationAddress': '地点 / 地址',
|
||
'reservations.locationPlaceholder': '地址、机场、酒店...',
|
||
'reservations.confirmationCode': '预订码',
|
||
'reservations.confirmationPlaceholder': '如:ABC12345',
|
||
'reservations.day': '日期',
|
||
'reservations.noDay': '无日期',
|
||
'reservations.place': '地点',
|
||
'reservations.noPlace': '无地点',
|
||
'reservations.pendingSave': '将被保存…',
|
||
'reservations.uploading': '上传中...',
|
||
'reservations.attachFile': '附加文件',
|
||
'reservations.linkExisting': '关联已有文件',
|
||
'reservations.toast.saveError': '保存失败',
|
||
'reservations.toast.updateError': '更新失败',
|
||
'reservations.toast.deleteError': '删除失败',
|
||
'reservations.confirm.remove': '移除「{name}」的预订?',
|
||
'reservations.linkAssignment': '关联日程分配',
|
||
'reservations.pickAssignment': '从计划中选择一个分配...',
|
||
'reservations.noAssignment': '无关联(独立)',
|
||
'reservations.price': '价格',
|
||
'reservations.budgetCategory': '预算类别',
|
||
'reservations.budgetCategoryPlaceholder': '例:交通、住宿',
|
||
'reservations.budgetCategoryAuto': '自动(按预订类型)',
|
||
'reservations.budgetHint': '保存时将自动创建预算条目。',
|
||
'reservations.departureDate': '出发',
|
||
'reservations.arrivalDate': '到达',
|
||
'reservations.departureTime': '出发时间',
|
||
'reservations.arrivalTime': '到达时间',
|
||
'reservations.pickupDate': '取车',
|
||
'reservations.returnDate': '还车',
|
||
'reservations.pickupTime': '取车时间',
|
||
'reservations.returnTime': '还车时间',
|
||
'reservations.endDate': '结束日期',
|
||
'reservations.meta.departureTimezone': '出发时区',
|
||
'reservations.meta.arrivalTimezone': '到达时区',
|
||
'reservations.span.departure': '出发',
|
||
'reservations.span.arrival': '到达',
|
||
'reservations.span.inTransit': '途中',
|
||
'reservations.span.pickup': '取车',
|
||
'reservations.span.return': '还车',
|
||
'reservations.span.active': '使用中',
|
||
'reservations.span.start': '开始',
|
||
'reservations.span.end': '结束',
|
||
'reservations.span.ongoing': '进行中',
|
||
'reservations.validation.endBeforeStart': '结束日期/时间必须晚于开始日期/时间',
|
||
|
||
// Budget
|
||
'budget.title': '预算',
|
||
'budget.exportCsv': '导出 CSV',
|
||
'budget.emptyTitle': '尚未创建预算',
|
||
'budget.emptyText': '创建分类和条目来规划旅行预算',
|
||
'budget.emptyPlaceholder': '输入分类名称...',
|
||
'budget.createCategory': '创建分类',
|
||
'budget.category': '分类',
|
||
'budget.categoryName': '分类名称',
|
||
'budget.table.name': '名称',
|
||
'budget.table.total': '合计',
|
||
'budget.table.persons': '人数',
|
||
'budget.table.days': '天数',
|
||
'budget.table.perPerson': '人均',
|
||
'budget.table.perDay': '日均',
|
||
'budget.table.perPersonDay': '人日均',
|
||
'budget.table.note': '备注',
|
||
'budget.table.date': '日期',
|
||
'budget.newEntry': '新建条目',
|
||
'budget.defaultEntry': '新建条目',
|
||
'budget.defaultCategory': '新分类',
|
||
'budget.total': '合计',
|
||
'budget.totalBudget': '总预算',
|
||
'budget.byCategory': '按分类',
|
||
'budget.editTooltip': '点击编辑',
|
||
'budget.confirm.deleteCategory': '确定删除分类「{name}」及其 {count} 个条目?',
|
||
'budget.deleteCategory': '删除分类',
|
||
'budget.perPerson': '人均',
|
||
'budget.paid': '已支付',
|
||
'budget.open': '未支付',
|
||
'budget.noMembers': '未分配成员',
|
||
'budget.settlement': '结算',
|
||
'budget.settlementInfo': '点击预算项目上的成员头像将其标记为绿色——表示该成员已付款。结算会显示谁欠谁多少。',
|
||
'budget.netBalances': '净余额',
|
||
|
||
// Files
|
||
'files.title': '文件',
|
||
'files.count': '{count} 个文件',
|
||
'files.countSingular': '1 个文件',
|
||
'files.uploaded': '已上传 {count} 个',
|
||
'files.uploadError': '上传失败',
|
||
'files.dropzone': '将文件拖放到此处',
|
||
'files.dropzoneHint': '或点击浏览',
|
||
'files.allowedTypes': '图片、PDF、DOC、DOCX、XLS、XLSX、TXT、CSV · 最大 50 MB',
|
||
'files.uploading': '上传中...',
|
||
'files.filterAll': '全部',
|
||
'files.filterPdf': 'PDF',
|
||
'files.filterImages': '图片',
|
||
'files.filterDocs': '文档',
|
||
'files.filterCollab': '协作笔记',
|
||
'files.sourceCollab': '来自协作笔记',
|
||
'files.empty': '暂无文件',
|
||
'files.emptyHint': '上传文件以附加到旅行中',
|
||
'files.openTab': '在新标签页中打开',
|
||
'files.confirm.delete': '确定要删除此文件吗?',
|
||
'files.toast.deleted': '文件已删除',
|
||
'files.toast.deleteError': '删除文件失败',
|
||
'files.sourcePlan': '日程计划',
|
||
'files.sourceBooking': '预订',
|
||
'files.attach': '附加',
|
||
'files.pasteHint': '也可以从剪贴板粘贴图片 (Ctrl+V)',
|
||
'files.trash': '回收站',
|
||
'files.trashEmpty': '回收站为空',
|
||
'files.emptyTrash': '清空回收站',
|
||
'files.restore': '恢复',
|
||
'files.star': '收藏',
|
||
'files.unstar': '取消收藏',
|
||
'files.assign': '分配',
|
||
'files.assignTitle': '分配文件',
|
||
'files.assignPlace': '地点',
|
||
'files.assignBooking': '预订',
|
||
'files.unassigned': '未分配',
|
||
'files.unlink': '移除关联',
|
||
'files.toast.trashed': '已移至回收站',
|
||
'files.toast.restored': '文件已恢复',
|
||
'files.toast.trashEmptied': '回收站已清空',
|
||
'files.toast.assigned': '文件已分配',
|
||
'files.toast.assignError': '分配失败',
|
||
'files.toast.restoreError': '恢复失败',
|
||
'files.confirm.permanentDelete': '永久删除此文件?此操作无法撤销。',
|
||
'files.confirm.emptyTrash': '永久删除回收站中的所有文件?此操作无法撤销。',
|
||
'files.noteLabel': '备注',
|
||
'files.notePlaceholder': '添加备注...',
|
||
|
||
// Packing
|
||
'packing.title': '行李清单',
|
||
'packing.empty': '行李清单为空',
|
||
'packing.import': '导入',
|
||
'packing.importTitle': '导入装箱清单',
|
||
'packing.importHint': '每行一个物品。可选用逗号、分号或制表符分隔类别和数量:名称, 类别, 数量',
|
||
'packing.importPlaceholder': '牙刷\n防晒霜, 卫生\nT恤, 衣物, 5\n护照, 证件',
|
||
'packing.importCsv': '加载 CSV/TXT',
|
||
'packing.importAction': '导入 {count}',
|
||
'packing.importSuccess': '已导入 {count} 项',
|
||
'packing.importError': '导入失败',
|
||
'packing.importEmpty': '没有可导入的项目',
|
||
'packing.progress': '已打包 {packed}/{total}({percent}%)',
|
||
'packing.clearChecked': '移除 {count} 个已勾选',
|
||
'packing.clearCheckedShort': '移除 {count} 个',
|
||
'packing.suggestions': '建议',
|
||
'packing.suggestionsTitle': '添加建议',
|
||
'packing.allSuggested': '所有建议已添加',
|
||
'packing.allPacked': '全部打包完成!',
|
||
'packing.addPlaceholder': '添加新物品...',
|
||
'packing.categoryPlaceholder': '分类...',
|
||
'packing.filterAll': '全部',
|
||
'packing.filterOpen': '未完成',
|
||
'packing.filterDone': '已完成',
|
||
'packing.emptyTitle': '行李清单为空',
|
||
'packing.emptyHint': '添加物品或使用建议',
|
||
'packing.emptyFiltered': '没有匹配的物品',
|
||
'packing.menuRename': '重命名',
|
||
'packing.menuCheckAll': '全部勾选',
|
||
'packing.menuUncheckAll': '取消全部勾选',
|
||
'packing.menuDeleteCat': '删除分类',
|
||
'packing.addItem': '添加物品',
|
||
'packing.addItemPlaceholder': '物品名称...',
|
||
'packing.addCategory': '添加分类',
|
||
'packing.newCategoryPlaceholder': '分类名称(如:衣物)',
|
||
'packing.applyTemplate': '应用模板',
|
||
'packing.template': '模板',
|
||
'packing.templateApplied': '已从模板添加 {count} 个物品',
|
||
'packing.templateError': '应用模板失败',
|
||
'packing.assignUser': '分配用户',
|
||
'packing.noMembers': '无成员',
|
||
'packing.bags': '行李',
|
||
'packing.noBag': '未分配',
|
||
'packing.totalWeight': '总重量',
|
||
'packing.bagName': '名称...',
|
||
'packing.addBag': '添加行李',
|
||
'packing.changeCategory': '更改分类',
|
||
'packing.confirm.clearChecked': '确定移除 {count} 个已勾选的物品?',
|
||
'packing.confirm.deleteCat': '确定删除分类「{name}」及其 {count} 个物品?',
|
||
'packing.defaultCategory': '其他',
|
||
'packing.toast.saveError': '保存失败',
|
||
'packing.toast.deleteError': '删除失败',
|
||
'packing.toast.renameError': '重命名失败',
|
||
'packing.toast.addError': '添加失败',
|
||
|
||
// Packing suggestions
|
||
'packing.suggestions.items': [
|
||
{ name: '护照', category: '证件' },
|
||
{ name: '身份证', category: '证件' },
|
||
{ name: '旅行保险', category: '证件' },
|
||
{ name: '机票', category: '证件' },
|
||
{ name: '信用卡', category: '财务' },
|
||
{ name: '现金', category: '财务' },
|
||
{ name: '签证', category: '证件' },
|
||
{ name: 'T恤', category: '衣物' },
|
||
{ name: '裤子', category: '衣物' },
|
||
{ name: '内衣', category: '衣物' },
|
||
{ name: '袜子', category: '衣物' },
|
||
{ name: '外套', category: '衣物' },
|
||
{ name: '睡衣', category: '衣物' },
|
||
{ name: '泳衣', category: '衣物' },
|
||
{ name: '雨衣', category: '衣物' },
|
||
{ name: '舒适的鞋子', category: '衣物' },
|
||
{ name: '牙刷', category: '洗漱用品' },
|
||
{ name: '牙膏', category: '洗漱用品' },
|
||
{ name: '洗发水', category: '洗漱用品' },
|
||
{ name: '除臭剂', category: '洗漱用品' },
|
||
{ name: '防晒霜', category: '洗漱用品' },
|
||
{ name: '剃须刀', category: '洗漱用品' },
|
||
{ name: '充电器', category: '电子产品' },
|
||
{ name: '充电宝', category: '电子产品' },
|
||
{ name: '耳机', category: '电子产品' },
|
||
{ name: '旅行转换插头', category: '电子产品' },
|
||
{ name: '相机', category: '电子产品' },
|
||
{ name: '止痛药', category: '健康' },
|
||
{ name: '创可贴', category: '健康' },
|
||
{ name: '消毒液', category: '健康' },
|
||
],
|
||
|
||
// Members / Sharing
|
||
'members.shareTrip': '分享旅行',
|
||
'members.inviteUser': '邀请用户',
|
||
'members.selectUser': '选择用户…',
|
||
'members.invite': '邀请',
|
||
'members.allHaveAccess': '所有用户均已拥有访问权限。',
|
||
'members.access': '访问权限',
|
||
'members.person': '人',
|
||
'members.persons': '人',
|
||
'members.you': '你',
|
||
'members.owner': '所有者',
|
||
'members.leaveTrip': '退出旅行',
|
||
'members.removeAccess': '移除访问权限',
|
||
'members.confirmLeave': '退出旅行?你将失去访问权限。',
|
||
'members.confirmRemove': '移除该用户的访问权限?',
|
||
'members.loadError': '加载成员失败',
|
||
'members.added': '已添加',
|
||
'members.addError': '添加失败',
|
||
'members.removed': '成员已移除',
|
||
'members.removeError': '移除失败',
|
||
|
||
// Categories (Admin)
|
||
'categories.title': '分类',
|
||
'categories.subtitle': '管理地点分类',
|
||
'categories.new': '新建分类',
|
||
'categories.empty': '暂无分类',
|
||
'categories.namePlaceholder': '分类名称',
|
||
'categories.icon': '图标',
|
||
'categories.color': '颜色',
|
||
'categories.customColor': '选择自定义颜色',
|
||
'categories.preview': '预览',
|
||
'categories.defaultName': '分类',
|
||
'categories.update': '更新',
|
||
'categories.create': '创建',
|
||
'categories.confirm.delete': '删除分类?该分类下的地点不会被删除。',
|
||
'categories.toast.loadError': '加载分类失败',
|
||
'categories.toast.nameRequired': '请输入名称',
|
||
'categories.toast.updated': '分类已更新',
|
||
'categories.toast.created': '分类已创建',
|
||
'categories.toast.saveError': '保存失败',
|
||
'categories.toast.deleted': '分类已删除',
|
||
'categories.toast.deleteError': '删除失败',
|
||
|
||
// Backup (Admin)
|
||
'backup.title': '数据备份',
|
||
'backup.subtitle': '数据库和所有上传文件',
|
||
'backup.refresh': '刷新',
|
||
'backup.upload': '上传备份',
|
||
'backup.uploading': '上传中…',
|
||
'backup.create': '创建备份',
|
||
'backup.creating': '创建中…',
|
||
'backup.empty': '暂无备份',
|
||
'backup.createFirst': '创建第一个备份',
|
||
'backup.download': '下载',
|
||
'backup.restore': '恢复',
|
||
'backup.confirm.restore': '恢复备份「{name}」?\n\n所有当前数据将被备份数据替换。',
|
||
'backup.confirm.uploadRestore': '上传并恢复备份文件「{name}」?\n\n所有当前数据将被覆盖。',
|
||
'backup.confirm.delete': '删除备份「{name}」?',
|
||
'backup.toast.loadError': '加载备份失败',
|
||
'backup.toast.created': '备份创建成功',
|
||
'backup.toast.createError': '创建备份失败',
|
||
'backup.toast.restored': '备份已恢复。页面即将刷新…',
|
||
'backup.toast.restoreError': '恢复失败',
|
||
'backup.toast.uploadError': '上传失败',
|
||
'backup.toast.deleted': '备份已删除',
|
||
'backup.toast.deleteError': '删除失败',
|
||
'backup.toast.downloadError': '下载失败',
|
||
'backup.toast.settingsSaved': '自动备份设置已保存',
|
||
'backup.toast.settingsError': '保存设置失败',
|
||
'backup.auto.title': '自动备份',
|
||
'backup.auto.subtitle': '按计划自动备份',
|
||
'backup.auto.enable': '启用自动备份',
|
||
'backup.auto.enableHint': '将按所选计划自动创建备份',
|
||
'backup.auto.interval': '间隔',
|
||
'backup.auto.hour': '执行时间',
|
||
'backup.auto.hourHint': '服务器本地时间({format} 格式)',
|
||
'backup.auto.dayOfWeek': '星期几',
|
||
'backup.auto.dayOfMonth': '每月几号',
|
||
'backup.auto.dayOfMonthHint': '限 1–28 以兼容所有月份',
|
||
'backup.auto.scheduleSummary': '计划',
|
||
'backup.auto.summaryDaily': '每天 {hour}:00',
|
||
'backup.auto.summaryWeekly': '每{day} {hour}:00',
|
||
'backup.auto.summaryMonthly': '每月 {day} 号 {hour}:00',
|
||
'backup.auto.envLocked': 'Docker',
|
||
'backup.auto.envLockedHint': '自动备份通过 Docker 环境变量配置。要更改设置,请更新 docker-compose.yml 并重启容器。',
|
||
'backup.auto.copyEnv': '复制 Docker 环境变量',
|
||
'backup.auto.envCopied': 'Docker 环境变量已复制到剪贴板',
|
||
'backup.auto.keepLabel': '自动删除旧备份',
|
||
'backup.dow.sunday': '周日',
|
||
'backup.dow.monday': '周一',
|
||
'backup.dow.tuesday': '周二',
|
||
'backup.dow.wednesday': '周三',
|
||
'backup.dow.thursday': '周四',
|
||
'backup.dow.friday': '周五',
|
||
'backup.dow.saturday': '周六',
|
||
'backup.interval.hourly': '每小时',
|
||
'backup.interval.daily': '每天',
|
||
'backup.interval.weekly': '每周',
|
||
'backup.interval.monthly': '每月',
|
||
'backup.keep.1day': '1 天',
|
||
'backup.keep.3days': '3 天',
|
||
'backup.keep.7days': '7 天',
|
||
'backup.keep.14days': '14 天',
|
||
'backup.keep.30days': '30 天',
|
||
'backup.keep.forever': '永久保留',
|
||
|
||
// Photos
|
||
'photos.allDays': '所有天',
|
||
'photos.noPhotos': '暂无照片',
|
||
'photos.uploadHint': '上传你的旅行照片',
|
||
'photos.clickToSelect': '或点击选择',
|
||
'photos.linkPlace': '关联地点',
|
||
'photos.noPlace': '无地点',
|
||
'photos.uploadN': '上传 {n} 张照片',
|
||
|
||
// Backup restore modal
|
||
'backup.restoreConfirmTitle': '恢复备份?',
|
||
'backup.restoreWarning': '所有当前数据(旅行、地点、用户、上传文件)将被备份数据永久替换。此操作无法撤销。',
|
||
'backup.restoreTip': '提示:恢复前建议先备份当前状态。',
|
||
'backup.restoreConfirm': '确认恢复',
|
||
|
||
// PDF
|
||
'pdf.travelPlan': '旅行计划',
|
||
'pdf.planned': '已规划',
|
||
'pdf.costLabel': '费用 EUR',
|
||
'pdf.preview': 'PDF 预览',
|
||
'pdf.saveAsPdf': '保存为 PDF',
|
||
|
||
// Planner
|
||
'planner.places': '地点',
|
||
'planner.bookings': '预订',
|
||
'planner.packingList': '行李清单',
|
||
'planner.documents': '文档',
|
||
'planner.dayPlan': '日程计划',
|
||
'planner.reservations': '预订',
|
||
'planner.minTwoPlaces': '至少需要 2 个有坐标的地点',
|
||
'planner.noGeoPlaces': '没有有坐标的地点',
|
||
'planner.routeCalculated': '路线已计算',
|
||
'planner.routeCalcFailed': '无法计算路线',
|
||
'planner.routeError': '路线计算错误',
|
||
'planner.routeOptimized': '路线已优化',
|
||
'planner.reservationUpdated': '预订已更新',
|
||
'planner.reservationAdded': '预订已添加',
|
||
'planner.confirmDeleteReservation': '删除预订?',
|
||
'planner.reservationDeleted': '预订已删除',
|
||
'planner.days': '天',
|
||
'planner.allPlaces': '所有地点',
|
||
'planner.totalPlaces': '共 {n} 个地点',
|
||
'planner.noDaysPlanned': '尚未规划天数',
|
||
'planner.editTrip': '编辑旅行 \u2192',
|
||
'planner.placeOne': '1 个地点',
|
||
'planner.placeN': '{n} 个地点',
|
||
'planner.addNote': '添加备注',
|
||
'planner.noEntries': '当天无条目',
|
||
'planner.addPlace': '添加地点/活动',
|
||
'planner.addPlaceShort': '+ 添加地点/活动',
|
||
'planner.resPending': '预订待确认 · ',
|
||
'planner.resConfirmed': '预订已确认 · ',
|
||
'planner.notePlaceholder': '备注…',
|
||
'planner.noteTimePlaceholder': '时间(可选)',
|
||
'planner.noteExamplePlaceholder': '如:14:30 从中央车站乘 S3,7 号码头渡轮,午餐休息…',
|
||
'planner.totalCost': '总费用',
|
||
'planner.searchPlaces': '搜索地点…',
|
||
'planner.allCategories': '所有分类',
|
||
'planner.noPlacesFound': '未找到地点',
|
||
'planner.addFirstPlace': '添加第一个地点',
|
||
'planner.noReservations': '暂无预订',
|
||
'planner.addFirstReservation': '添加第一个预订',
|
||
'planner.new': '新建',
|
||
'planner.addToDay': '+ 天',
|
||
'planner.calculating': '计算中…',
|
||
'planner.route': '路线',
|
||
'planner.optimize': '优化',
|
||
'planner.openGoogleMaps': '在 Google Maps 中打开',
|
||
'planner.selectDayHint': '从左侧列表选择一天以查看日程计划',
|
||
'planner.noPlacesForDay': '当天暂无地点',
|
||
'planner.addPlacesLink': '添加地点 \u2192',
|
||
'planner.minTotal': '分钟 合计',
|
||
'planner.noReservation': '无预订',
|
||
'planner.removeFromDay': '从当天移除',
|
||
'planner.addToThisDay': '添加到当天',
|
||
'planner.overview': '概览',
|
||
'planner.noDays': '暂无天数',
|
||
'planner.editTripToAddDays': '编辑旅行以添加天数',
|
||
'planner.dayCount': '{n} 天',
|
||
'planner.clickToUnlock': '点击解锁',
|
||
'planner.keepPosition': '路线优化时保持位置',
|
||
'planner.dayDetails': '日程详情',
|
||
'planner.dayN': '第 {n} 天',
|
||
|
||
// Dashboard Stats
|
||
'stats.countries': '国家',
|
||
'stats.cities': '城市',
|
||
'stats.trips': '旅行',
|
||
'stats.places': '地点',
|
||
'stats.worldProgress': '全球进度',
|
||
'stats.visited': '已访问',
|
||
'stats.remaining': '未访问',
|
||
'stats.visitedCountries': '已访问国家',
|
||
|
||
// Day Detail Panel
|
||
'day.precipProb': '降水概率',
|
||
'day.precipitation': '降水量',
|
||
'day.wind': '风速',
|
||
'day.sunrise': '日出',
|
||
'day.sunset': '日落',
|
||
'day.hourlyForecast': '逐小时预报',
|
||
'day.climateHint': '历史平均值——实际预报在该日期前 16 天内可用。',
|
||
'day.noWeather': '无天气数据。请添加有坐标的地点。',
|
||
'day.overview': '每日概览',
|
||
'day.accommodation': '住宿',
|
||
'day.addAccommodation': '添加住宿',
|
||
'day.hotelDayRange': '应用到天数',
|
||
'day.noPlacesForHotel': '请先在旅行中添加地点',
|
||
'day.allDays': '全部',
|
||
'day.checkIn': '入住',
|
||
'day.checkOut': '退房',
|
||
'day.confirmation': '确认号',
|
||
'day.editAccommodation': '编辑住宿',
|
||
'day.reservations': '预订',
|
||
|
||
// Memories / Immich
|
||
'memories.title': '照片',
|
||
'memories.notConnected': 'Immich 未连接',
|
||
'memories.notConnectedHint': '在设置中连接您的 Immich 实例以在此查看旅行照片。',
|
||
'memories.noDates': '为旅行添加日期以加载照片。',
|
||
'memories.noPhotos': '未找到照片',
|
||
'memories.noPhotosHint': 'Immich 中未找到此旅行日期范围内的照片。',
|
||
'memories.photosFound': '张照片',
|
||
'memories.fromOthers': '来自他人',
|
||
'memories.sharePhotos': '分享照片',
|
||
'memories.sharing': '分享中',
|
||
'memories.reviewTitle': '审查您的照片',
|
||
'memories.reviewHint': '点击照片以将其从分享中排除。',
|
||
'memories.shareCount': '分享 {count} 张照片',
|
||
'memories.immichUrl': 'Immich 服务器地址',
|
||
'memories.immichApiKey': 'API 密钥',
|
||
'memories.testConnection': '测试连接',
|
||
'memories.testFirst': '请先测试连接',
|
||
'memories.connected': '已连接',
|
||
'memories.disconnected': '未连接',
|
||
'memories.connectionSuccess': '已连接到 Immich',
|
||
'memories.connectionError': '无法连接到 Immich',
|
||
'memories.saved': 'Immich 设置已保存',
|
||
'memories.oldest': '最早优先',
|
||
'memories.newest': '最新优先',
|
||
'memories.allLocations': '所有地点',
|
||
'memories.addPhotos': '添加照片',
|
||
'memories.linkAlbum': '关联相册',
|
||
'memories.selectAlbum': '选择 Immich 相册',
|
||
'memories.noAlbums': '未找到相册',
|
||
'memories.syncAlbum': '同步相册',
|
||
'memories.unlinkAlbum': '取消关联',
|
||
'memories.photos': '张照片',
|
||
'memories.selectPhotos': '从 Immich 选择照片',
|
||
'memories.selectHint': '点击照片以选择。',
|
||
'memories.selected': '已选择',
|
||
'memories.addSelected': '添加 {count} 张照片',
|
||
'memories.alreadyAdded': '已添加',
|
||
'memories.private': '私密',
|
||
'memories.stopSharing': '停止分享',
|
||
'memories.tripDates': '旅行日期',
|
||
'memories.allPhotos': '所有照片',
|
||
'memories.confirmShareTitle': '与旅行成员分享?',
|
||
'memories.confirmShareHint': '{count} 张照片将对本次旅行的所有成员可见。你可以稍后将单张照片设为私密。',
|
||
'memories.confirmShareButton': '分享照片',
|
||
|
||
// Collab Addon
|
||
'collab.tabs.chat': '聊天',
|
||
'collab.tabs.notes': '笔记',
|
||
'collab.tabs.polls': '投票',
|
||
'collab.whatsNext.title': '接下来',
|
||
'collab.whatsNext.today': '今天',
|
||
'collab.whatsNext.tomorrow': '明天',
|
||
'collab.whatsNext.empty': '暂无活动',
|
||
'collab.whatsNext.until': '至',
|
||
'collab.whatsNext.emptyHint': '有时间安排的活动将显示在此',
|
||
'collab.chat.send': '发送',
|
||
'collab.chat.placeholder': '输入消息...',
|
||
'collab.chat.empty': '开始对话',
|
||
'collab.chat.emptyHint': '消息对所有旅行成员可见',
|
||
'collab.chat.emptyDesc': '与旅伴分享想法、计划和动态',
|
||
'collab.chat.today': '今天',
|
||
'collab.chat.yesterday': '昨天',
|
||
'collab.chat.deletedMessage': '删除了一条消息',
|
||
'collab.chat.reply': '回复',
|
||
'collab.chat.loadMore': '加载更早的消息',
|
||
'collab.chat.justNow': '刚刚',
|
||
'collab.chat.minutesAgo': '{n} 分钟前',
|
||
'collab.chat.hoursAgo': '{n} 小时前',
|
||
'collab.notes.title': '笔记',
|
||
'collab.notes.new': '新建笔记',
|
||
'collab.notes.empty': '暂无笔记',
|
||
'collab.notes.emptyHint': '开始记录想法和计划',
|
||
'collab.notes.all': '全部',
|
||
'collab.notes.titlePlaceholder': '笔记标题',
|
||
'collab.notes.contentPlaceholder': '写点什么...',
|
||
'collab.notes.categoryPlaceholder': '分类',
|
||
'collab.notes.newCategory': '新建分类...',
|
||
'collab.notes.category': '分类',
|
||
'collab.notes.noCategory': '无分类',
|
||
'collab.notes.color': '颜色',
|
||
'collab.notes.save': '保存',
|
||
'collab.notes.cancel': '取消',
|
||
'collab.notes.edit': '编辑',
|
||
'collab.notes.delete': '删除',
|
||
'collab.notes.pin': '置顶',
|
||
'collab.notes.unpin': '取消置顶',
|
||
'collab.notes.daysAgo': '{n} 天前',
|
||
'collab.notes.categorySettings': '管理分类',
|
||
'collab.notes.create': '创建',
|
||
'collab.notes.website': '网站',
|
||
'collab.notes.websitePlaceholder': 'https://...',
|
||
'collab.notes.attachFiles': '附加文件',
|
||
'collab.notes.noCategoriesYet': '暂无分类',
|
||
'collab.notes.emptyDesc': '创建一个笔记开始吧',
|
||
'collab.polls.title': '投票',
|
||
'collab.polls.new': '新建投票',
|
||
'collab.polls.empty': '暂无投票',
|
||
'collab.polls.emptyHint': '向团队提问并一起投票',
|
||
'collab.polls.question': '问题',
|
||
'collab.polls.questionPlaceholder': '我们应该做什么?',
|
||
'collab.polls.addOption': '+ 添加选项',
|
||
'collab.polls.optionPlaceholder': '选项 {n}',
|
||
'collab.polls.create': '创建投票',
|
||
'collab.polls.close': '关闭',
|
||
'collab.polls.closed': '已关闭',
|
||
'collab.polls.votes': '{n} 票',
|
||
'collab.polls.vote': '{n} 票',
|
||
'collab.polls.multipleChoice': '多选',
|
||
'collab.polls.multiChoice': '多选',
|
||
'collab.polls.deadline': '截止时间',
|
||
'collab.polls.option': '选项',
|
||
'collab.polls.options': '选项',
|
||
'collab.polls.delete': '删除',
|
||
'collab.polls.closedSection': '已关闭',
|
||
|
||
// Permissions
|
||
'admin.tabs.permissions': '权限',
|
||
'perm.title': '权限设置',
|
||
'perm.subtitle': '控制谁可以在应用中执行操作',
|
||
'perm.saved': '权限设置已保存',
|
||
'perm.resetDefaults': '恢复默认',
|
||
'perm.customized': '已自定义',
|
||
'perm.level.admin': '仅管理员',
|
||
'perm.level.tripOwner': '旅行所有者',
|
||
'perm.level.tripMember': '旅行成员',
|
||
'perm.level.everybody': '所有人',
|
||
'perm.cat.trip': '旅行管理',
|
||
'perm.cat.members': '成员管理',
|
||
'perm.cat.files': '文件',
|
||
'perm.cat.content': '内容与日程',
|
||
'perm.cat.extras': '预算、行李与协作',
|
||
'perm.action.trip_create': '创建旅行',
|
||
'perm.action.trip_edit': '编辑旅行详情',
|
||
'perm.action.trip_delete': '删除旅行',
|
||
'perm.action.trip_archive': '归档 / 取消归档旅行',
|
||
'perm.action.trip_cover_upload': '上传封面图片',
|
||
'perm.action.member_manage': '添加 / 移除成员',
|
||
'perm.action.file_upload': '上传文件',
|
||
'perm.action.file_edit': '编辑文件元数据',
|
||
'perm.action.file_delete': '删除文件',
|
||
'perm.action.place_edit': '添加 / 编辑 / 删除地点',
|
||
'perm.action.day_edit': '编辑日程、备注与分配',
|
||
'perm.action.reservation_edit': '管理预订',
|
||
'perm.action.budget_edit': '管理预算',
|
||
'perm.action.packing_edit': '管理行李清单',
|
||
'perm.action.collab_edit': '协作(笔记、投票、聊天)',
|
||
'perm.action.share_manage': '管理分享链接',
|
||
'perm.actionHint.trip_create': '谁可以创建新旅行',
|
||
'perm.actionHint.trip_edit': '谁可以更改旅行名称、日期、描述和货币',
|
||
'perm.actionHint.trip_delete': '谁可以永久删除旅行',
|
||
'perm.actionHint.trip_archive': '谁可以归档或取消归档旅行',
|
||
'perm.actionHint.trip_cover_upload': '谁可以上传或更改封面图片',
|
||
'perm.actionHint.member_manage': '谁可以邀请或移除旅行成员',
|
||
'perm.actionHint.file_upload': '谁可以向旅行上传文件',
|
||
'perm.actionHint.file_edit': '谁可以编辑文件描述和链接',
|
||
'perm.actionHint.file_delete': '谁可以将文件移至回收站或永久删除',
|
||
'perm.actionHint.place_edit': '谁可以添加、编辑或删除地点',
|
||
'perm.actionHint.day_edit': '谁可以编辑日程、日程备注和地点分配',
|
||
'perm.actionHint.reservation_edit': '谁可以创建、编辑或删除预订',
|
||
'perm.actionHint.budget_edit': '谁可以创建、编辑或删除预算项目',
|
||
'perm.actionHint.packing_edit': '谁可以管理行李物品和包袋',
|
||
'perm.actionHint.collab_edit': '谁可以创建笔记、投票和发送消息',
|
||
'perm.actionHint.share_manage': '谁可以创建或删除公开分享链接',
|
||
// Undo
|
||
'undo.button': '撤销',
|
||
'undo.tooltip': '撤销:{action}',
|
||
'undo.assignPlace': '地点已分配至某天',
|
||
'undo.removeAssignment': '地点已从某天移除',
|
||
'undo.reorder': '地点已重新排序',
|
||
'undo.optimize': '路线已优化',
|
||
'undo.deletePlace': '地点已删除',
|
||
'undo.moveDay': '地点已移至另一天',
|
||
'undo.lock': '地点锁定已切换',
|
||
'undo.importGpx': 'GPX 导入',
|
||
'undo.importGoogleList': 'Google 地图导入',
|
||
|
||
// Notifications
|
||
'notifications.title': '通知',
|
||
'notifications.markAllRead': '全部标为已读',
|
||
'notifications.deleteAll': '全部删除',
|
||
'notifications.showAll': '查看所有通知',
|
||
'notifications.empty': '暂无通知',
|
||
'notifications.emptyDescription': '您已全部查阅!',
|
||
'notifications.all': '全部',
|
||
'notifications.unreadOnly': '未读',
|
||
'notifications.markRead': '标为已读',
|
||
'notifications.markUnread': '标为未读',
|
||
'notifications.delete': '删除',
|
||
'notifications.system': '系统',
|
||
'memories.error.loadAlbums': '加载相册失败',
|
||
'memories.error.linkAlbum': '关联相册失败',
|
||
'memories.error.unlinkAlbum': '取消关联相册失败',
|
||
'memories.error.syncAlbum': '同步相册失败',
|
||
'memories.error.loadPhotos': '加载照片失败',
|
||
'memories.error.addPhotos': '添加照片失败',
|
||
'memories.error.removePhoto': '删除照片失败',
|
||
'memories.error.toggleSharing': '更新共享设置失败',
|
||
'undo.addPlace': '地点已添加',
|
||
'undo.done': '已撤销:{action}',
|
||
'notifications.test.title': '来自 {actor} 的测试通知',
|
||
'notifications.test.text': '这是一条简单的测试通知。',
|
||
'notifications.test.booleanTitle': '{actor} 请求您的审批',
|
||
'notifications.test.booleanText': '测试布尔通知。',
|
||
'notifications.test.accept': '批准',
|
||
'notifications.test.decline': '拒绝',
|
||
'notifications.test.navigateTitle': '查看详情',
|
||
'notifications.test.navigateText': '测试跳转通知。',
|
||
'notifications.test.goThere': '前往',
|
||
'notifications.test.adminTitle': '管理员广播',
|
||
'notifications.test.adminText': '{actor} 向所有管理员发送了测试通知。',
|
||
'notifications.test.tripTitle': '{actor} 在您的行程中发帖',
|
||
'notifications.test.tripText': '行程"{trip}"的测试通知。',
|
||
|
||
// Todo
|
||
'todo.subtab.packing': '行李清单',
|
||
'todo.subtab.todo': '待办事项',
|
||
'todo.completed': '已完成',
|
||
'todo.filter.all': '全部',
|
||
'todo.filter.open': '进行中',
|
||
'todo.filter.done': '已完成',
|
||
'todo.uncategorized': '未分类',
|
||
'todo.namePlaceholder': '任务名称',
|
||
'todo.descriptionPlaceholder': '描述(可选)',
|
||
'todo.unassigned': '未分配',
|
||
'todo.noCategory': '无分类',
|
||
'todo.hasDescription': '有描述',
|
||
'todo.addItem': '添加新任务...',
|
||
'todo.newCategory': '分类名称',
|
||
'todo.addCategory': '添加分类',
|
||
'todo.newItem': '新任务',
|
||
'todo.empty': '暂无任务,添加一个任务开始吧!',
|
||
'todo.filter.my': '我的任务',
|
||
'todo.filter.overdue': '已逾期',
|
||
'todo.sidebar.tasks': '任务',
|
||
'todo.sidebar.categories': '分类',
|
||
'todo.detail.title': '任务',
|
||
'todo.detail.description': '描述',
|
||
'todo.detail.category': '分类',
|
||
'todo.detail.dueDate': '截止日期',
|
||
'todo.detail.assignedTo': '分配给',
|
||
'todo.detail.delete': '删除',
|
||
'todo.detail.save': '保存更改',
|
||
'todo.detail.create': '创建任务',
|
||
'todo.detail.priority': '优先级',
|
||
'todo.detail.noPriority': '无',
|
||
'todo.sortByPrio': '优先级',
|
||
|
||
// Notification system (added from feat/notification-system)
|
||
'settings.notifyVersionAvailable': '有新版本可用',
|
||
'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.save': '保存',
|
||
'settings.webhookUrl.saved': 'Webhook URL 已保存',
|
||
'settings.webhookUrl.test': '测试',
|
||
'settings.webhookUrl.testSuccess': '测试 Webhook 发送成功',
|
||
'settings.webhookUrl.testFailed': '测试 Webhook 失败',
|
||
'settings.notificationPreferences.inapp': 'In-App',
|
||
'settings.notificationPreferences.webhook': 'Webhook',
|
||
'settings.notificationPreferences.email': 'Email',
|
||
'admin.notifications.emailPanel.title': 'Email (SMTP)',
|
||
'admin.notifications.webhookPanel.title': 'Webhook',
|
||
'admin.notifications.inappPanel.title': 'In-App',
|
||
'admin.notifications.inappPanel.hint': '应用内通知始终处于活跃状态,无法全局禁用。',
|
||
'admin.notifications.adminWebhookPanel.title': '管理员 Webhook',
|
||
'admin.notifications.adminWebhookPanel.hint': '此 Webhook 专用于管理员通知(如版本更新提醒)。它与用户 Webhook 相互独立,配置 URL 后自动触发。',
|
||
'admin.notifications.adminWebhookPanel.saved': '管理员 Webhook URL 已保存',
|
||
'admin.notifications.adminWebhookPanel.testSuccess': '测试 Webhook 发送成功',
|
||
'admin.notifications.adminWebhookPanel.testFailed': '测试 Webhook 失败',
|
||
'admin.notifications.adminWebhookPanel.alwaysOnHint': '配置 URL 后管理员 Webhook 自动触发',
|
||
'admin.notifications.adminNotificationsHint': '配置哪些渠道发送管理员通知(如版本更新提醒)。设置管理员 Webhook URL 后,Webhook 将自动触发。',
|
||
'admin.tabs.notifications': '通知',
|
||
'notifications.versionAvailable.title': '有可用更新',
|
||
'notifications.versionAvailable.text': 'TREK {version} 现已可用。',
|
||
'notifications.versionAvailable.button': '查看详情',
|
||
'notif.test.title': '[测试] 通知',
|
||
'notif.test.simple.text': '这是一条简单的测试通知。',
|
||
'notif.test.boolean.text': '您是否接受此测试通知?',
|
||
'notif.test.navigate.text': '点击下方前往控制台。',
|
||
|
||
// Notifications
|
||
'notif.trip_invite.title': '旅行邀请',
|
||
'notif.trip_invite.text': '{actor} 邀请您加入 {trip}',
|
||
'notif.booking_change.title': '预订已更新',
|
||
'notif.booking_change.text': '{actor} 更新了 {trip} 中的预订',
|
||
'notif.trip_reminder.title': '旅行提醒',
|
||
'notif.trip_reminder.text': '您的旅行 {trip} 即将开始!',
|
||
'notif.vacay_invite.title': 'Vacay 融合邀请',
|
||
'notif.vacay_invite.text': '{actor} 邀请您合并假期计划',
|
||
'notif.photos_shared.title': '照片已分享',
|
||
'notif.photos_shared.text': '{actor} 在 {trip} 中分享了 {count} 张照片',
|
||
'notif.collab_message.title': '新消息',
|
||
'notif.collab_message.text': '{actor} 在 {trip} 中发送了消息',
|
||
'notif.packing_tagged.title': '行李分配',
|
||
'notif.packing_tagged.text': '{actor} 将您分配到 {trip} 中的 {category}',
|
||
'notif.version_available.title': '新版本可用',
|
||
'notif.version_available.text': 'TREK {version} 现已可用',
|
||
'notif.action.view_trip': '查看旅行',
|
||
'notif.action.view_collab': '查看消息',
|
||
'notif.action.view_packing': '查看行李',
|
||
'notif.action.view_photos': '查看照片',
|
||
'notif.action.view_vacay': '查看 Vacay',
|
||
'notif.action.view_admin': '前往管理',
|
||
'notif.action.view': '查看',
|
||
'notif.action.accept': '接受',
|
||
'notif.action.decline': '拒绝',
|
||
'notif.generic.title': '通知',
|
||
'notif.generic.text': '您有一条新通知',
|
||
'notif.dev.unknown_event.title': '[DEV] 未知事件',
|
||
'notif.dev.unknown_event.text': '事件类型 "{event}" 未在 EVENT_NOTIFICATION_CONFIG 中注册',
|
||
}
|
||
|
||
export default zh
|
||
|