feat(dashboard): add i18n support with zh/en/ja/ko locales

- Add react-i18next + i18next + i18next-browser-languagedetector
- Create i18n config (singleton import) with zh/en/ja/ko JSON locale files
- Add language switcher Globe dropdown in Header topbar
- Replace all hardcoded Chinese strings in:
  - Layout (Header, Sidebar, NavItem, Layout, constants)
  - Settings (index, AppearanceTab, SecurityTab, OtherTab, AboutTab)
  - Auth page (auth.tsx)
  - Search dialog (searchItems via useMemo + t())
  - Restart overlay (getStatusConfig accepts t param)
  - Error boundary (ErrorFallback, ErrorDetails function components)
  - HTTP warning banner
- localStorage key: maibot-locale
- Compatible with Electron
This commit is contained in:
DrSmoothl
2026-03-03 20:50:06 +08:00
parent 5cc34f24c0
commit a65a40f85f
23 changed files with 7271 additions and 473 deletions

View File

@@ -0,0 +1,477 @@
{
"language": { "zh": "中文", "en": "English", "ja": "日本語", "ko": "한국어" },
"header": {
"collapseSidebar": "收起侧边栏",
"expandSidebar": "展开侧边栏",
"toggleConnection": "切换后端连接",
"viewAnnualSummary": "查看年度总结",
"annualSummary": "2025 年度总结",
"searchPlaceholder": "搜索...",
"viewDocs": "查看麦麦文档",
"docs": "麦麦文档",
"switchToLight": "切换到浅色模式",
"switchToDark": "切换到深色模式",
"logout": "登出系统",
"logoutLabel": "登出",
"notConnected": "未连接"
},
"sidebar": {
"groups": {
"overview": "概览",
"botConfig": "麦麦配置编辑",
"botResources": "麦麦资源管理",
"extensionsMonitor": "扩展与监控",
"system": "系统"
},
"menu": {
"home": "首页",
"botMainConfig": "麦麦主程序配置",
"aiModelProvider": "AI模型厂商配置",
"modelManagement": "模型管理与分配",
"adapterConfig": "麦麦适配器配置",
"emojiManagement": "表情包管理",
"expressionManagement": "表达方式管理",
"slangManagement": "黑话管理",
"personInfo": "人物信息管理",
"knowledgeGraph": "知识库图谱可视化",
"knowledgeBase": "麦麦知识库管理",
"pluginMarket": "插件市场",
"configTemplate": "配置模板市场",
"pluginConfig": "插件配置",
"logViewer": "日志查看器",
"plannerMonitor": "计划器&回复器监控",
"localChat": "本地聊天室",
"settings": "系统设置"
}
},
"layout": {
"verifyingLogin": "正在验证登录状态...",
"logoTitle": "MaiBot WebUI",
"logoTitleShort": "M"
},
"settings": {
"title": "系统设置",
"description": "管理您的应用偏好设置",
"tabs": {
"appearance": "外观",
"security": "安全",
"other": "其他",
"about": "关于"
},
"appearance": {
"themeMode": "主题模式",
"themeModeDesc": "浅色/深色/跟随系统",
"light": "浅色",
"dark": "深色",
"system": "跟随系统",
"accentColor": "主题色",
"resetDefault": "重置默认",
"colorPreview": "实时色板预览",
"styleTweaks": "界面样式微调",
"typography": "字体排版",
"visualEffects": "视觉效果",
"layout": "布局",
"animation": "动画",
"background": "背景设置",
"customCss": "自定义 CSS",
"animationEffect": "动画效果",
"importExportTheme": "主题导入/导出",
"importTheme": "导入主题",
"exportTheme": "导出主题",
"importSuccess": "导入成功",
"importFailed": "导入失败",
"resetSuccess": "重置成功",
"fontFamily": "字体",
"fontSize": "字号",
"borderRadius": "圆角",
"contentWidth": "内容宽度",
"sidebarWidth": "侧边栏宽度",
"animationSpeed": "动画速度",
"backgroundImage": "背景图片",
"backgroundBlur": "背景模糊",
"backgroundOpacity": "背景透明度",
"lightDesc": "始终使用浅色主题",
"darkDesc": "始终使用深色主题",
"systemDesc": "根据系统设置自动切换",
"accentPrimary": "主色调",
"accentHint": "点击色环选择或输入 HEX 值",
"resetTheme": "重置为默认",
"confirmResetTheme": "确认重置主题",
"confirmResetThemeDesc": "这将重置所有主题设置为默认值,包括颜色、字体、布局和自定义 CSS。此操作不可撤销确定要继续吗",
"confirmResetAction": "确认重置",
"cssWarningTitle": "以下内容已被安全过滤:",
"cssPlaceholder": "/* 在这里输入自定义 CSS */\n\n/* 例如: */\n/* .sidebar { background: #1a1a2e; } */",
"cssDescription": "编写自定义 CSS 来进一步个性化界面。危险的 CSS如 @import、url())将被自动过滤。",
"clearCss": "清除",
"exportDesc": "导出主题为 JSON 文件便于分享或备份,导入时会自动应用所有配置。",
"importSuccessDesc": "主题配置已导入,页面将自动刷新",
"resetSuccessDesc": "主题已重置为默认值",
"enableAnimations": "启用动画效果",
"enableAnimationsDesc": "关闭后将禁用所有过渡动画和特效,提升性能",
"loginWavesBackground": "登录页波浪背景",
"loginWavesBackgroundDesc": "关闭后登录页将使用纯色背景,适合低性能设备",
"inheritParentBg": "继承上级背景",
"inheritParentBgDesc": "开启后将使用上级层级的背景配置",
"fontFamilyLabel": "字体族 (Font Family)",
"fontFamilyPlaceholder": "选择字体族",
"fontFamilySystem": "系统默认 (System)",
"fontFamilySans": "无衬线 (Sans-serif)",
"fontFamilySerif": "衬线 (Serif)",
"fontFamilyMono": "等宽 (Monospace)",
"baseFontSize": "基准字体大小 (Base Size)",
"lineHeight": "行高 (Line Height)",
"lineHeightPlaceholder": "选择行高",
"lineHeightCompact": "紧凑 (1.2)",
"lineHeightNormal": "正常 (1.5)",
"lineHeightLoose": "宽松 (1.75)",
"borderRadiusLabel": "圆角大小 (Radius)",
"shadowLabel": "阴影强度 (Shadow)",
"shadowPlaceholder": "选择阴影强度",
"shadowNone": "无阴影 (None)",
"shadowSm": "轻微 (Small)",
"shadowMd": "中等 (Medium)",
"shadowLg": "强烈 (Large)",
"shadowXl": "极强 (Extra Large)",
"blurLabel": "模糊效果 (Blur)",
"sidebarWidthLabel": "侧边栏宽度 (Sidebar Width)",
"maxContentWidth": "内容区最大宽度 (Max Width)",
"spacingUnit": "基准间距 (Spacing Unit)",
"animationSpeedLabel": "动画速度 (Speed)",
"animationSpeedPlaceholder": "选择动画速度",
"animationFast": "快速 (100ms)",
"animationNormal": "正常 (300ms)",
"animationSlow": "慢速 (500ms)",
"animationOff": "关闭 (0ms)",
"bgPage": "页面",
"bgSidebar": "侧边栏",
"typographyGroup": "字体排版 (Typography)",
"visualGroup": "视觉效果 (Visual)",
"layoutGroup": "布局 (Layout)",
"animationGroup": "动画 (Animation)",
"backgroundGroup": "背景设置 (Backgrounds)"
},
"security": {
"currentToken": "当前 Access Token",
"yourToken": "您的访问令牌",
"regenerate": "重新生成",
"customToken": "自定义 Access Token",
"securityTip": "安全提示",
"cannotCopy": "无法复制",
"copySuccess": "复制成功",
"copyFailed": "复制失败",
"updateSuccess": "更新成功",
"updateFailed": "更新失败",
"generateSuccess": "生成成功",
"generateFailed": "生成失败",
"newToken": "新的 Access Token",
"confirmRegenerate": "确认重新生成 Token",
"confirmRegenerateDesc": "重新生成后,旧 Token 将失效,需重新登录",
"cancel": "取消",
"confirm": "确认",
"cannotCopyDesc": "Token 存储在安全 Cookie 中,请重新生成以获取新 Token",
"copySuccessDesc": "Token 已复制到剪贴板",
"copyFailedDesc": "请手动复制 Token",
"inputError": "输入错误",
"inputErrorDesc": "请输入新的 Token",
"formatError": "格式错误",
"formatErrorDesc": "Token 不符合要求: {{failedRules}}",
"updateSuccessDesc": "Access Token 已更新,即将跳转到登录页",
"updateFailedDesc": "无法更新 Token",
"updateFailedConn": "连接服务器失败",
"generateSuccessDesc": "新的 Access Token 已生成,请及时保存",
"generateFailedDesc": "无法生成新 Token",
"generateFailedConn": "连接服务器失败",
"cannotView": "无法查看",
"cannotViewDesc": "Token 存储在安全 Cookie 中,如需新 Token 请点击\"重新生成\"",
"hide": "隐藏",
"show": "显示",
"copyTip": "复制到剪贴板",
"regenerateShort": "生成",
"confirmRegenerateFullDesc": "这将生成一个新的 64 位安全令牌,并使当前 Token 立即失效。您需要使用新 Token 重新登录系统。此操作不可撤销,确定要继续吗?",
"confirmGenerate": "确认生成",
"tokenStorePlaceholder": "Token 存储在安全 Cookie 中",
"safekeepTip": "请妥善保管您的 Access Token不要泄露给他人",
"newTokenLabel": "新的访问令牌",
"customTokenPlaceholder": "输入自定义 Token",
"tokenReqTitle": "Token 安全要求:",
"tokenValid": "Token 格式正确,可以使用",
"updateBtn": "更新自定义 Token",
"updating": "更新中...",
"dialogTitle": "新的 Access Token",
"dialogDesc": "这是您的新 Token请立即保存。关闭此窗口后将跳转到登录页面。",
"dialogTokenLabel": "您的新 Token (64位安全令牌)",
"important": "重要提示",
"tip1": "此 Token 仅显示一次,关闭后无法再查看",
"tip2": "请立即复制并保存到安全的位置",
"tip3": "关闭窗口后将自动跳转到登录页面",
"tip4": "请使用新 Token 重新登录系统",
"copied": "已复制",
"copyToken": "复制 Token",
"savedClose": "我已保存,关闭",
"securityTip1": "重新生成 Token 会创建系统随机生成的 64 位安全令牌",
"securityTip2": "自定义 Token 必须满足所有安全要求才能使用",
"securityTip3": "更新 Token 后,旧的 Token 将立即失效",
"securityTip4": "请在安全的环境下查看和复制 Token",
"securityTip5": "如果怀疑 Token 泄露,请立即重新生成或更新",
"securityTip6": "建议使用系统生成的 Token 以获得最高安全性"
},
"other": {
"performance": "性能与存储",
"localStorage": "本地存储使用",
"logCache": "日志缓存大小",
"importExport": "导入/导出设置",
"configWizard": "配置向导",
"devTools": "开发者工具",
"clearStorage": "清空本地存储",
"clearStorageDesc": "清空所有本地存储数据",
"clearStorageConfirm": "确认清空",
"clearLogCache": "清空日志缓存",
"clearLogCacheDesc": "清空所有缓存的日志数据",
"clearLogCacheConfirm": "确认清空",
"importSettings": "导入设置",
"exportSettings": "导出设置",
"resetAllSettings": "重置所有设置",
"resetAllSettingsDesc": "将所有设置恢复到默认值",
"resetAllSettingsConfirm": "确认重置",
"clearStorageSuccess": "本地存储已清空",
"clearStorageFailed": "清空失败",
"clearLogSuccess": "日志缓存已清空",
"clearLogFailed": "清空失败",
"importSuccess": "导入成功",
"importFailed": "导入失败",
"exportSuccess": "导出成功",
"exportFailed": "导出失败",
"resetSuccess": "重置成功",
"resetFailed": "重置失败",
"storageItems": "{{count}} 个存储项",
"logCacheSizeDesc": "控制日志查看器最多缓存的日志条数,较大的值会占用更多内存",
"logCacheSizeUnit": "条",
"dataSyncIntervalLabel": "首页数据刷新间隔",
"dataSyncIntervalUnit": "秒",
"dataSyncIntervalDesc": "控制首页统计数据的自动刷新间隔",
"wsReconnectLabel": "WebSocket 重连间隔",
"wsReconnectUnit": "秒",
"wsReconnectDesc": "日志 WebSocket 连接断开后的重连基础间隔",
"wsMaxReconnectLabel": "WebSocket 最大重连次数",
"wsMaxReconnectUnit": "次",
"wsMaxReconnectDesc": "连接失败后的最大重连尝试次数",
"clearLogCacheFn": "清除日志缓存",
"clearLocalCache": "清除本地缓存",
"confirmClearCache": "确认清除本地缓存",
"confirmClearCacheDesc": "这将清除所有本地缓存的设置和数据(不包括登录凭证)。您可能需要重新配置部分偏好设置。确定要继续吗?",
"confirmClear": "确认清除",
"importExportDesc": "导出当前的界面设置以便备份,或从之前导出的文件中恢复设置。",
"exporting": "导出中...",
"importing": "导入中...",
"resetAllSettingsBtn": "重置所有设置为默认值",
"confirmResetAll": "确认重置所有设置",
"confirmResetAllDesc": "这将把所有界面设置恢复为默认值,包括主题、颜色、动画等偏好设置。此操作不会影响您的登录状态。确定要继续吗?",
"configWizardDesc": "重新进行初次配置向导,可以帮助您重新设置系统的基础配置。",
"rerunSetup": "重新进行初次配置",
"confirmRerunSetup": "确认重新配置",
"confirmRerunSetupDesc": "这将带您重新进入初次配置向导。您可以重新设置系统的基础配置项。确定要继续吗?",
"devToolsDesc": "以下功能仅供开发调试使用,可能会导致页面崩溃或异常。",
"triggerError": "触发测试错误",
"confirmTriggerError": "确认触发错误",
"confirmTriggerErrorDesc": "这将手动触发一个 React 错误,用于测试错误边界组件的显示效果。页面将显示错误界面,您可以通过刷新页面或点击返回首页来恢复。",
"confirmTrigger": "确认触发",
"logCleared": "日志已清除",
"logClearedDesc": "日志缓存已清空",
"cacheCleared": "缓存已清除",
"cacheClearedDesc": "已清除 {{count}} 项缓存数据",
"exportSuccessDesc": "设置已导出为 JSON 文件",
"exportFailedDesc": "无法导出设置",
"importSuccessDesc": "成功导入 {{imported}} 项设置",
"importSkippedSuffix": ",跳过 {{skipped}} 项",
"importRefreshHint": "提示",
"importRefreshHintDesc": "部分设置需要刷新页面才能完全生效",
"importNoDataDesc": "没有有效的设置项可导入",
"importInvalidDesc": "文件格式无效",
"resetDone": "已重置",
"resetDoneDesc": "所有设置已恢复为默认值,刷新页面以应用更改"
},
"about": {
"openSource": "开源项目",
"aboutApp": "关于 MaiBot Dashboard",
"version": "版本:",
"author": "作者",
"techStack": "技术栈",
"frontendFramework": "前端框架",
"uiComponents": "UI 组件",
"backend": "后端",
"buildTool": "构建工具",
"openSourceThanks": "开源库感谢",
"openSourceLicense": "开源许可",
"openSourceDesc": "本项目在 GitHub 开源,欢迎 Star ⭐ 支持!",
"visitGitHub": "前往 GitHub",
"appDesc": "麦麦MaiBot的现代化 Web 管理界面",
"maimaiCore": "MaiBot 核心",
"uiFrameworkGroup": "UI 框架与组件",
"routingStateGroup": "路由与状态管理",
"formGroup": "表单处理",
"utilsGroup": "工具库",
"animationGroup": "动画效果",
"backendGroup": "后端框架",
"devToolsGroup": "开发工具",
"openSourceThanksDesc": "本项目使用了以下优秀的开源库,感谢他们的贡献:",
"licenseDesc": "本项目采用 GNU General Public License v3.0 开源许可证。您可以自由地使用、修改和分发本软件,但必须保持相同的开源许可。",
"licenseDeps": "本项目依赖的所有开源库均遵循各自的开源许可证MIT、Apache-2.0、BSD 等)。感谢所有开源贡献者的无私奉献。",
"lib": {
"react": "用户界面构建库",
"shadcn": "优雅的 React 组件库",
"radix": "无样式的可访问组件库",
"tailwind": "实用优先的 CSS 框架",
"lucide": "精美的图标库",
"tanstackRouter": "类型安全的路由库",
"zustand": "轻量级状态管理",
"reactHookForm": "高性能表单库",
"zod": "TypeScript 优先的 schema 验证",
"clsx": "条件 className 构建工具",
"tailwindMerge": "Tailwind 类名合并工具",
"cva": "组件变体管理",
"dateFns": "现代化日期处理库",
"framerMotion": "React 动画库",
"vaul": "抽屉组件动画",
"fastapi": "现代化 Python Web 框架",
"uvicorn": "ASGI 服务器",
"pydantic": "数据验证库",
"pythonMultipart": "文件上传支持",
"typescript": "JavaScript 的超集",
"vite": "下一代前端构建工具",
"eslint": "JavaScript 代码检查工具",
"postcss": "CSS 转换工具"
}
}
},
"auth": {
"title": "登录",
"description": "请输入访问令牌以继续",
"tokenLabel": "Access Token",
"tokenPlaceholder": "请输入 Access Token",
"loginButton": "登录",
"loggingIn": "登录中...",
"loginFailed": "登录失败",
"loginSuccess": "登录成功",
"checkingAuth": "正在检查登录状态...",
"welcome": "欢迎使用 MaiBot",
"accessDesc": "请输入您的 Access Token 以继续访问系统",
"tokenRequired": "请输入 Access Token",
"verifyingLabel": "验证中...",
"verifyEnter": "验证并进入",
"helpLink": "我没有 Token我该去哪里获得 Token",
"helpTitle": "如何获取 Access Token",
"helpDesc": "Access Token 是访问 MaiBot WebUI 的唯一凭证,请按以下方式获取",
"method1Title": "方式一:查看启动日志",
"method1Desc": "在 MaiBot 启动时,控制台会显示 WebUI Access Token。",
"method1Example1": "🔑 WebUI Access Token: abc123...",
"method1Example2": "💡 请使用此 Token 登录 WebUI",
"method2Title": "方式二:查看配置文件",
"method2Desc": "Token 保存在项目根目录的配置文件中:",
"method2FileHint": "打开此文件,复制 access_token 字段的值",
"securityTipTitle": "安全提示",
"securityTip1": "请妥善保管您的 Token不要泄露给他人",
"securityTip2": "如需重置 Token请在登录后前往系统设置",
"slowLink": "我觉得这个界面很卡怎么办?",
"disableAnimTitle": "关闭背景动画",
"disableAnimDesc": "背景动画可能会在低性能设备上造成卡顿。关闭动画可以显著提升界面流畅度。",
"disableAnimDetail": "关闭动画后,背景将变为纯色,但不影响任何功能的使用。您可以随时在系统设置中重新开启动画。",
"disableAnimBtn": "关闭动画",
"verifyFailed": "Token 验证失败,请检查后重试",
"connFailed": "连接服务器失败,请检查网络连接",
"switchToLight": "切换到浅色模式",
"switchToDark": "切换到深色模式"
},
"common": {
"loading": "加载中...",
"error": "错误",
"retry": "重试",
"save": "保存",
"cancel": "取消",
"confirm": "确认",
"delete": "删除",
"edit": "编辑",
"close": "关闭",
"search": "搜索",
"noData": "暂无数据",
"success": "成功",
"failed": "失败"
},
"restart": {
"preparing": "准备重启",
"preparingDesc": "正在发送重启请求...",
"preparingTip": "🔄 正在准备重启麦麦...",
"restarting": "正在重启麦麦",
"restartingDesc": "请稍候,麦麦正在重启中...",
"restartingTip": "🔄 配置已保存,正在重启主程序...",
"checking": "检查服务状态",
"checkingDesc": "等待服务恢复... ({{current}}/{{max}})",
"checkingTip": "⏳ 正在等待服务恢复,请勿关闭页面...",
"success": "重启成功",
"successDesc": "正在跳转到登录页面...",
"successTip": "✅ 配置已生效,服务运行正常",
"failed": "重启超时",
"failedDesc": "服务未能在预期时间内恢复",
"failedTip": "⚠️ 如果长时间无响应,请尝试手动重启",
"refreshPage": "刷新页面",
"retryCheck": "重试检测",
"elapsed": "已用时:"
},
"errorBoundary": {
"title": "页面出现了问题",
"description": "应用程序遇到了意外错误。您可以尝试刷新页面或返回首页。",
"refreshPage": "刷新页面",
"goHome": "返回首页",
"footer": "如果问题持续存在,请将错误信息复制并反馈给开发者",
"copiedToClipboard": "已复制到剪贴板",
"copyError": "复制错误信息"
},
"search": {
"placeholder": "搜索页面...",
"title": "搜索",
"noResults": "未找到匹配的页面",
"startSearch": "输入关键词开始搜索",
"navigate": "导航",
"select": "选择",
"close": "关闭",
"categories": {
"overview": "概览",
"config": "配置",
"resources": "资源",
"monitor": "监控",
"extensions": "扩展",
"system": "系统"
},
"items": {
"home": "首页",
"homeDesc": "查看仪表板概览",
"botConfig": "麦麦主程序配置",
"botConfigDesc": "配置麦麦的核心设置",
"modelProvider": "麦麦模型提供商配置",
"modelProviderDesc": "配置模型提供商",
"model": "麦麦模型配置",
"modelDesc": "配置模型参数",
"emoji": "表情包管理",
"emojiDesc": "管理麦麦的表情包",
"expression": "表达方式管理",
"expressionDesc": "管理麦麦的表达方式",
"person": "人物信息管理",
"personDesc": "管理人物信息",
"jargon": "黑话管理",
"jargonDesc": "管理麦麦学习到的黑话和俚语",
"statistics": "统计信息",
"statisticsDesc": "查看使用统计",
"plugins": "插件市场",
"pluginsDesc": "浏览和安装插件",
"logs": "日志查看器",
"logsDesc": "查看系统日志",
"settings": "系统设置",
"settingsDesc": "配置系统参数"
}
},
"httpWarning": {
"title": "安全警告:",
"message": "您正在使用 HTTP 访问 MaiBot WebUI",
"description": "如果这是公网服务器,您的数据(包括 Token、聊天记录等可能在传输过程中被窃取。强烈建议使用 HTTPS 访问或仅在本地网络使用。",
"dismiss": "关闭警告"
}
}