- 最近请求表新增缓存命中率列(缓存读取/总输入) - useCurrency:中文界面费用按最新 USD→CNY 汇率显示 ¥,英文保持 $(open.er-api.com,缓存 12h,失败兜底 7.2) - match_price 记忆化缓存:O(记录数×5910) → O(模型种类×5910),扫描从秒级降到百毫秒级 - 仪表盘右上角显示加载耗时/数据量(get_summary 往返埋点);Rust 侧分段计时
445 lines
16 KiB
TypeScript
445 lines
16 KiB
TypeScript
export const zhTranslations = {
|
||
// App / global
|
||
appTitle: "Kimi Switch",
|
||
loading: "加载中...",
|
||
loadTimeout: "加载时间较长,如果一直卡住,请尝试重新启动应用。",
|
||
loadFailed: "加载失败:",
|
||
retry: "重试",
|
||
saveConfig: "保存配置",
|
||
reloadConfig: "读取配置",
|
||
openConfigDir: "打开配置目录",
|
||
unsavedConfirm: "有未保存修改,确定要重新读取配置吗?",
|
||
validationNoApiKey: "缺少 API Key",
|
||
validationNoBaseUrl: "缺少 Base URL",
|
||
validationNoModels: "未配置模型",
|
||
validationBlankModels: "存在未填写 model id 的模型:{aliases}",
|
||
saveValidationConfirm:
|
||
"以下供应商尚未完成配置,仍要保存吗?\n\n{details}\n\n(点击「确定」仍会保存到 config.toml;点击「取消」可继续编辑)",
|
||
providerNotFound: "供应商不存在",
|
||
backToList: "返回列表",
|
||
syncToOmp: "同步到 OMP",
|
||
syncedToOmp: "已同步到 OMP:",
|
||
ompOverwriteConfirm: "OMP 中已存在供应商「{existing}」,是否替换为「{name}」?",
|
||
deleteProviderConfirm: "确定删除供应商 {name}?",
|
||
|
||
// Provider list
|
||
providers: "供应商",
|
||
dashboard: "用量仪表盘",
|
||
sessions: "会话管理",
|
||
addProvider: "添加供应商",
|
||
noProviders: "暂无供应商",
|
||
addFirstProvider: "添加第一个供应商",
|
||
noUrl: "无 URL",
|
||
modelCount: "{count} 个模型",
|
||
ompActive: "OMP 活跃",
|
||
defaultModel: "默认: {name}",
|
||
edit: "编辑",
|
||
delete: "删除",
|
||
copyProvider: "复制供应商",
|
||
testConnectivity: "测试连通性",
|
||
testing: "测试中...",
|
||
connectivityOk: "{name} 连通正常({latency}ms)",
|
||
connectivitySlow: "{name} 连通较慢({latency}ms)",
|
||
connectivityFail: "{name} 无法连通:{error}",
|
||
copiedProvider: "已复制为 {name}",
|
||
|
||
// Provider edit
|
||
editProvider: "编辑供应商",
|
||
back: "返回",
|
||
basicInfo: "基本信息",
|
||
modelMapping: "模型映射",
|
||
configJson: "配置 JSON",
|
||
providerName: "供应商名称",
|
||
note: "备注",
|
||
notePlaceholder: "例如:公司专用账号",
|
||
officialUrl: "官网链接",
|
||
managedProvider: "托管供应商(无需凭证)",
|
||
kimiOAuthLogin: "Kimi 授权登录",
|
||
kimiOAuthOpenPage: "打开授权页",
|
||
kimiOAuthCopyCode: "复制授权码",
|
||
kimiOAuthCodeCopied: "已复制",
|
||
kimiOAuthWaiting: "请在打开的页面中输入授权码,等待授权中…",
|
||
kimiOAuthSuccess: "授权成功,已写入 Kimi 登录凭据",
|
||
kimiOAuthExpired: "授权码已过期,请重新开始",
|
||
kimiOAuthDenied: "授权被拒绝",
|
||
kimiOAuthTimeout: "授权超时,请重新开始",
|
||
kimiOAuthRetry: "重新开始",
|
||
kimiOAuthCancel: "取消",
|
||
kimiOAuthNetworkError: "网络错误,正在重试…",
|
||
apiSettings: "API 设置",
|
||
apiFormat: "API 格式",
|
||
authField: "认证字段",
|
||
apiKey: "API Key",
|
||
getApiKeyLink: "获取 API Key",
|
||
show: "显示",
|
||
hide: "隐藏",
|
||
requestUrl: "请求地址",
|
||
fullUrl: "完整 URL",
|
||
baseUrlHint: "填写兼容 {type} API 的服务端点地址,不要以斜杠结尾",
|
||
envPairs: "Env 键值对",
|
||
addEnv: "+ 添加",
|
||
modelMappingDesc: "显示名称只影响 /model 菜单;1M 只是给 Kimi Code 的上下文能力声明。",
|
||
oneClickSetup: "一键设置",
|
||
fetchModels: "获取模型列表",
|
||
fetchingModels: "获取中...",
|
||
discoveredModels: "发现 {count} 个模型",
|
||
addSelected: "添加选中的",
|
||
alreadyAdded: "已添加",
|
||
displayName: "显示名称",
|
||
actualModel: "实际请求模型",
|
||
contextSize: "上下文长度",
|
||
supports1M: "声明支持 1M",
|
||
default: "默认",
|
||
operation: "操作",
|
||
isDefault: "已默认",
|
||
setDefault: "设为默认",
|
||
deleteModelConfirm: "确定删除模型 {alias}?",
|
||
noModelMappings: "暂无模型映射",
|
||
addModelMapping: "+ 添加模型映射",
|
||
readOnlyPreview: "可编辑 JSON",
|
||
apply: "应用",
|
||
invalidJson: "JSON 格式错误:{message}",
|
||
clickToSelectIcon: "点击选择图标",
|
||
clickToChangeIcon: "点击更换图标",
|
||
selectIcon: "选择图标",
|
||
clearIcon: "清除图标",
|
||
iconPickerSearch: "搜索图标",
|
||
iconPickerSearchPlaceholder: "输入图标名称...",
|
||
iconPickerNoResults: "未找到匹配的图标",
|
||
|
||
// Agent / target
|
||
target: "目标",
|
||
targetKimi: "Kimi Code",
|
||
targetOmp: "OMP",
|
||
targetQwen: "Qwen Code",
|
||
agent: "智能体",
|
||
agentKimiCode: "Kimi Code",
|
||
agentPi: "Pi",
|
||
activate: "启用",
|
||
activated: "已启用",
|
||
disabled: "已停用",
|
||
switchTo: "切换使用",
|
||
inUse: "使用中",
|
||
switchReloadHint: "切换供应商后,请在 Kimi Code 中执行 /reload 以生效。",
|
||
reloadCopiedHint: "已切换供应商,/reload 已复制到剪贴板,请在 Kimi Code 中粘贴执行。",
|
||
unsavedChanges: "未保存修改",
|
||
qwenActivateNotImplemented: "Qwen Code 启用功能将在后续实现。",
|
||
agentSettings: "全局配置",
|
||
enableThinking: "启用思考",
|
||
thinkingLevel: "思考等级",
|
||
thinkingKeep: "保留思考内容",
|
||
thinkingLow: "低",
|
||
thinkingMedium: "中",
|
||
thinkingHigh: "高",
|
||
thinkingMax: "最大",
|
||
thinkingContextHint: "启用思考会占用更多上下文,请确保模型上下文长度和预留空间足够。",
|
||
loopControlSettings: "循环控制",
|
||
maxRetriesPerStep: "单步重试次数",
|
||
reservedContextSize: "上下文预留大小",
|
||
backgroundSettings: "后台任务",
|
||
maxRunningTasks: "最大并发数",
|
||
keepAliveOnExit: "退出时保持运行",
|
||
permissionRules: "权限规则",
|
||
permissionDecision: "处置",
|
||
permissionPattern: "模式",
|
||
permissionAllow: "允许",
|
||
permissionDeny: "拒绝",
|
||
permissionAsk: "询问",
|
||
addRule: "+ 添加规则",
|
||
addCommonRules: "添加常用规则",
|
||
hooks: "生命周期钩子",
|
||
hookEvent: "事件",
|
||
hookMatcher: "匹配器",
|
||
hookCommand: "命令",
|
||
hookTimeout: "超时",
|
||
addHook: "+ 添加钩子",
|
||
importConfig: "导入当前配置",
|
||
importConfigConfirm: "导入会覆盖当前未保存的修改,是否继续?",
|
||
importConfigFailed: "导入失败:{message}",
|
||
capabilities: "能力标签",
|
||
fetchEnableThinking: "为获取的模型启用思考",
|
||
capThinking: "思考",
|
||
capAlwaysThinking: "始终思考",
|
||
capImageIn: "图像输入",
|
||
capVideoIn: "视频输入",
|
||
capToolUse: "工具调用",
|
||
customCapabilities: "其他能力(逗号分隔)",
|
||
|
||
// Sessions
|
||
sessionsTitle: "会话管理",
|
||
sessionsSubtitle: "按工作区查看、预览、归档或删除 Kimi Code 会话。归档不会删除数据。",
|
||
workspaces: "工作区",
|
||
workspaceIsolatedHint: "会话按工作区隔离存储",
|
||
allWorkspaces: "全部工作区",
|
||
emptyWorkspace: "空",
|
||
deleteWorkspace: "删除工作区",
|
||
noSessions: "暂无会话",
|
||
statusActive: "活跃",
|
||
statusArchived: "已归档",
|
||
statusAll: "全部",
|
||
selectAll: "全选",
|
||
deselectAll: "取消全选",
|
||
selectedCount: "已选 {n} 项",
|
||
archive: "归档",
|
||
unarchive: "取消归档",
|
||
sessionTitle: "会话",
|
||
workspace: "工作区",
|
||
status: "状态",
|
||
size: "大小",
|
||
updated: "更新时间",
|
||
actions: "操作",
|
||
sessionsInView: "共 {n} 个会话",
|
||
isolatedToWorkspace: "当前工作区",
|
||
openPreview: "打开预览",
|
||
scanning: "扫描中…",
|
||
refresh: "刷新",
|
||
refreshing: "刷新中…",
|
||
loadStats: "加载 {ms} ms · 数据 {kb} KB",
|
||
refreshed: "已刷新",
|
||
cancel: "取消",
|
||
confirmDeleteTitle: "永久删除会话?",
|
||
confirmDeleteSession: "删除后无法恢复。若只是暂时不用,请改用归档。",
|
||
confirmBulkTitle: "批量永久删除?",
|
||
confirmBulkDelete: "将永久删除 {n} 个会话,此操作无法撤销。",
|
||
confirmDeleteWorkspaceTitle: "删除空工作区?",
|
||
confirmDeleteWorkspace: "仅允许删除没有任何会话的工作区。",
|
||
deleteForever: "永久删除",
|
||
previewTitle: "会话预览",
|
||
previewHint: "仅展示角色与截断后的文本,不会暴露密钥或工具原始输出。",
|
||
previewEmpty: "没有可预览的消息",
|
||
previewTruncated: "预览已截断",
|
||
roleUser: "用户",
|
||
roleAssistant: "助手",
|
||
roleSystem: "系统",
|
||
|
||
// Heatmap
|
||
noData: "暂无数据",
|
||
heatLess: "少",
|
||
heatMore: "多",
|
||
requests: "请求",
|
||
cacheHitRate: "缓存命中率",
|
||
|
||
// Daily detail modal
|
||
dayDetail: "每日用量详情",
|
||
close: "关闭",
|
||
totalTokens: "总 Token",
|
||
cost: "费用",
|
||
modelDistribution: "模型用量分布",
|
||
providerDistribution: "供应商用量分布",
|
||
modalEscHint: "按 Esc 或点击外部关闭",
|
||
doubleClickHint: "双击查看详情",
|
||
|
||
// Languages
|
||
language: "语言",
|
||
zh: "中文",
|
||
en: "English",
|
||
|
||
// Theme & Settings
|
||
themeLight: "浅色",
|
||
themeDark: "深色",
|
||
themeAuto: "跟随系统",
|
||
settings: "设置",
|
||
settingsTitle: "设置",
|
||
settingsAppearance: "外观",
|
||
settingsUpdates: "更新",
|
||
settingsAbout: "关于",
|
||
checkUpdate: "检查更新",
|
||
checking: "检查中…",
|
||
upToDate: "已是最新版本",
|
||
updateAvailable: "有新版本可用",
|
||
currentVersion: "当前版本",
|
||
latestVersion: "最新版本",
|
||
downloadUpdate: "下载更新",
|
||
downloading: "下载中…",
|
||
downloadComplete: "下载完成,点击安装",
|
||
install: "安装",
|
||
updateCheckFailed: "检查更新失败",
|
||
lastChecked: "上次检查",
|
||
appDescription: "Windows 桌面端 LLM 供应商配置管理器",
|
||
referenceProject: "引用项目",
|
||
|
||
// Validation errors
|
||
emptyProviderName: "供应商名称为空",
|
||
duplicateProviderName: "重复的供应商名称:{0}",
|
||
missingCredentials: "供应商「{0}」缺少凭证(api_key 或环境变量键)",
|
||
ambiguousCredentials: "供应商「{0}」同时设置了直接凭证和 Env 凭证,只允许一种",
|
||
missingVertexProject: "Vertex 供应商「{0}」缺少 GOOGLE_CLOUD_PROJECT 或 GOOGLE_CLOUD_LOCATION",
|
||
emptyModelAlias: "模型别名为空",
|
||
duplicateModelAlias: "重复的模型别名:{0}",
|
||
unknownModelProvider: "模型「{0}」引用了未知供应商「{1}」",
|
||
emptyModelId: "模型「{0}」的模型 ID 为空",
|
||
invalidMaxContextSize: "模型「{0}」的 max_context_size 无效",
|
||
|
||
// Dashboard — ranges / status
|
||
rangeToday: "今天",
|
||
range7d: "7 天",
|
||
range30d: "30 天",
|
||
rangeAll: "全部",
|
||
dashLoadFailed: "加载失败",
|
||
|
||
// Dashboard — KPI labels
|
||
kpiRequests: "请求数",
|
||
kpiInputOther: "非缓存输入",
|
||
kpiOutput: "输出",
|
||
kpiCacheRead: "缓存读",
|
||
kpiCacheCreation: "缓存创建",
|
||
kpiCacheHit: "缓存命中",
|
||
kpiCost: "预估费用",
|
||
|
||
// Dashboard — cards
|
||
cardHeatmap: "全年热力图",
|
||
cardHeatmapSub: "按 Token 量着色",
|
||
cardDailyTrend: "用量趋势",
|
||
cardDailyTrendSubCapped: "近 30 天 · 共 {n} 天",
|
||
tabModelTrend: "模型用量趋势",
|
||
tabProviderTrend: "供应商模型用量趋势",
|
||
tabDailyTrend: "每日用量趋势",
|
||
providerUnknown: "未知供应商",
|
||
cardDailyTrendSub: "共 {n} 天",
|
||
cardModelUsage: "模型用量",
|
||
cardModelUsageSub: "{n} 个模型",
|
||
cardRecent: "最近请求",
|
||
cardRecentCapped: "显示前 {n} / {m} 条",
|
||
cardRecentCount: "{n} 条",
|
||
|
||
// Dashboard — table columns / units
|
||
colModel: "模型",
|
||
colTokens: "Token",
|
||
colCacheHit: "缓存命中",
|
||
colTime: "时间",
|
||
colInput: "输入",
|
||
colOutput: "输出",
|
||
colCacheRead: "缓存读",
|
||
unitTimes: "次",
|
||
estimate: "估算",
|
||
collapse: "收起",
|
||
expandAll: "展开全部 ({n})",
|
||
|
||
// Dashboard — pagination
|
||
paginationPage: "第 {x} / {y} 页",
|
||
paginationRange: "{x}–{y} 条",
|
||
paginationPerPage: "每页 {n} 条",
|
||
pageFirst: "首页",
|
||
pagePrev: "上一页",
|
||
pageNext: "下一页",
|
||
pageLast: "末页",
|
||
|
||
// Dashboard — footer / attribution
|
||
footerScanned: "扫描 {n} 个文件 · {m} 条记录",
|
||
attributionPorted: "仪表盘与会话管理功能基于",
|
||
attributionSuffix: "(MIT,© JochenYang)",
|
||
modelDataSourcePrefix: "新增模型与价格参考来自于",
|
||
|
||
// Sessions — preview
|
||
previewCollapseChars: "收起 · {n} 字符",
|
||
previewExpandChars: "展开全文 · {n} 字符",
|
||
|
||
// Provider presets
|
||
presetPickerTitle: "选择预设供应商",
|
||
presetSearchPlaceholder: "搜索预设供应商...",
|
||
presetSortOriginal: "原始",
|
||
presetSortAlpha: "A-Z",
|
||
presetNoResults: "没有匹配的预设",
|
||
presetCustomConfig: "+ 自定义配置",
|
||
presetFooterHint: "预设只是一键填表,后续可继续修改所有字段。",
|
||
presetCategoryOfficial: "官方",
|
||
presetCategoryCnOfficial: "国产",
|
||
presetCategoryThirdParty: "第三方",
|
||
presetCategoryAggregator: "聚合",
|
||
presetNameAnthropic: "Anthropic 官方",
|
||
presetNameKimiCoding: "Kimi For Coding",
|
||
presetNameMoonshot: "Moonshot 平台",
|
||
presetNameDeepseek: "DeepSeek",
|
||
presetNameZhipuApi: "智谱 GLM(按量)",
|
||
presetNameZhipuCoding: "智谱 GLM Coding Plan",
|
||
presetNameZaiApi: "z.ai(按量)",
|
||
presetNameZaiCoding: "z.ai Coding Plan",
|
||
presetNameBailian: "阿里百炼",
|
||
presetNameMinimax: "MiniMax",
|
||
presetNameMinimaxTokenPlan: "MiniMax Token Plan",
|
||
presetNameStepfun: "阶跃星辰",
|
||
presetNameStepfunPlan: "阶跃星辰 Step Plan",
|
||
presetNameSiliconflow: "硅基流动",
|
||
presetNameNovita: "Novita AI",
|
||
presetNameOpenrouter: "OpenRouter",
|
||
presetNameTokenRhythm: "基元律动",
|
||
presetNameOpenai: "OpenAI 官方",
|
||
presetNameGoogleGenai: "Google AI Studio",
|
||
presetNameVolcengine: "火山方舟",
|
||
presetNameOpencodeGo: "OpenCode Go",
|
||
presetNameOpencodeZen: "OpenCode Zen",
|
||
|
||
// Provider usage
|
||
usageBalance: "余额",
|
||
usageUsed: "已使用",
|
||
usageRemaining: "剩余",
|
||
usageRefresh: "刷新",
|
||
usageRetry: "重试",
|
||
usageQueryFailed: "查询失败",
|
||
usageNetworkError: "网络异常",
|
||
usageInvalidKey: "API Key 无效",
|
||
usageResetIn: "{time} 后重置",
|
||
usageResetDone: "已重置",
|
||
usageLoading: "查询中…",
|
||
usageQueryOk: "查询成功",
|
||
// Usage config panel (cc-switch style)
|
||
usageConfigTitle: "配置用量查询 - {name}",
|
||
usageConfigBtn: "配置用量查询",
|
||
usageEnable: "启用用量查询",
|
||
usageTemplate: "查询模板",
|
||
usageTemplateAuto: "自动检测",
|
||
usageTemplateNewapi: "NewAPI 中转站",
|
||
usageAutoDetectHint: "自动使用供应商的 API Key 和 Base URL 查询余额 / 套餐",
|
||
usageNewapiHint: "查询 NewAPI / OneAPI 中转站的账号余额(需网页后台 Access Token,不是 sk- 推理 Key)",
|
||
usageOAuthManagedHint: "官方 OAuth 托管:自动使用 Kimi Code 登录凭据查询订阅用量",
|
||
usageDetectedKinds: "检测到的查询类型",
|
||
usageNoKinds: "未识别(可切换到 NewAPI 模板手动配置)",
|
||
usageBaseUrl: "查询地址 (Base URL)",
|
||
usageAccessToken: "Access Token",
|
||
usageAccessTokenPlaceholder: "网页后台生成的 Access Token",
|
||
usageAccessTokenHint: "在 NewAPI 站点网页后台「个人设置 → Access Token」生成,不是 sk- 开头的推理 Key",
|
||
usageUserId: "User ID",
|
||
usageUserIdPlaceholder: "NewAPI 用户 ID(数字)",
|
||
usageUserIdHint: "网页后台「个人中心」页面的用户 ID,用于 New-Api-User 请求头",
|
||
usageAutoInterval: "自动查询间隔(分钟)",
|
||
usageAutoIntervalHint: "0 表示不自动查询,仅在打开页面或手动刷新时查询",
|
||
usageTimeout: "超时时间(秒)",
|
||
usageTimeoutHint: "0 表示使用默认值(8 秒)",
|
||
usageSupportedVars: "支持的变量",
|
||
usageBack: "返回",
|
||
usageNoKindsHint: "未识别此供应商的自动查询类型,请切换到 NewAPI 模板手动配置,或添加自定义查询脚本(即将支持)",
|
||
usageSwitchToNewapi: "切换到 NewAPI 模板",
|
||
usageUnsupportedProvider: "此供应商暂不支持自动查询",
|
||
usageTier5h: "5小时",
|
||
usageTierWeekly: "7天",
|
||
usageErrNoKey: "未配置 API Key",
|
||
usageErrDisabled: "用量查询已在配置面板中停用",
|
||
usageErrLoginExpired: "Kimi Code 登录已过期且自动续期失败,请重新运行 `kimi login`",
|
||
usageErrNoOauth: "未找到 Kimi Code 登录凭据,请先运行 `kimi login`",
|
||
usageErrNewapiCreds: "NewAPI 模板需要填写 Access Token 和 User ID",
|
||
usageTestQuery: "测试查询",
|
||
usageUpdatedAgo: "{time}前",
|
||
usageMinAgo: "{n} 分钟前",
|
||
usageHourAgo: "{n} 小时前",
|
||
usageDayAgo: "{n} 天前",
|
||
|
||
// Billing mode (套餐 / 按量)
|
||
billingTabSubscription: "套餐",
|
||
billingTabPayAsYouGo: "按量",
|
||
billingTabAll: "全部",
|
||
billingBadgeSubscription: "套餐",
|
||
billingBadgePayAsYouGo: "按量",
|
||
|
||
// Usage trend line chart
|
||
trendLineTitle: "用量趋势",
|
||
trendLineSub: "最近 {n} 天",
|
||
trendLineLegendTokens: "Token 用量",
|
||
trendLineLegendCacheHit: "缓存命中率",
|
||
trendLineLegendRequests: "请求数",
|
||
trendLineShowRequests: "显示请求数",
|
||
trendLineTooltip: "{date}\nToken: {tokens}\n命中率: {cache}\n请求: {req}",
|
||
trendLineNoData: "暂无数据",
|
||
} as const;
|
||
|
||
export type TranslationKey = keyof typeof zhTranslations;
|