## 新增 - 15 条主流供应商预设(Kimi Coding / Moonshot / Anthropic / DeepSeek / 智谱 GLM / z.ai / 阿里百炼 / MiniMax / StepFun / SiliconFlow / Novita / OpenRouter / OpenAI / Google AI Studio / 火山方舟),通过 PresetPickerModal 一键填表 - 供应商余额/套餐查询(卡片底部 UsageFooter):余额类 (DeepSeek / SiliconFlow / OpenRouter / StepFun / Novita) + 套餐类(Kimi For Coding / 智谱 GLM / MiniMax),5min stale TTL + force_refresh + 并发 ≤3 - Rust 端 services/ 模块(balance / coding_plan / usage_types), 参考 cc-switch(MIT,© Jason Young)实现 - query_provider_usage 命令:Rust 端从 config 加载 key, 不经 IPC 序列化 API key - usageKinds 持久化到 SQLite settings(JSON 数组), load 时合并回 config,导出 config.toml 时不写 - detect_provider 启发式:旧用户升级后自动获得账单支持 - save-time 校验:未完成供应商(缺 api_key / base_url / 模型) 保存时弹 confirm 列出原因;新增未提交 back 时静默 drop - docs/PROPOSAL-presets-and-usage.md(v0.4-draft 实施档) - docs/VERIFICATION-CHECKLIST.md(70+ 项手动验证清单) ## 修复 - handleDuplicateProvider 的 alias.slice 漏洞:老数据 非规范 alias 复制不再错位 - handleSelectPreset 不再 auto-save,半成品不会落盘 - handleSwitchProvider 校验取消时自动 refresh 回滚, 不会出现内存改 / 盘没动的脏态 ## 文档 - README / README_EN 致谢段补 cc-switch(预设 + 账单) - README 已知限制与后续建议段(/reload 上游限制调研结论) - i18n 补 5 条校验 key + 11 条预设 UI key + 12 条账单 key 详见 docs/PROPOSAL-presets-and-usage.md 与 docs/VERIFICATION-CHECKLIST.md
364 lines
12 KiB
TypeScript
364 lines
12 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: "托管供应商(无需凭证)",
|
||
apiSettings: "API 设置",
|
||
apiFormat: "API 格式",
|
||
authField: "认证字段",
|
||
apiKey: "API Key",
|
||
show: "显示",
|
||
hide: "隐藏",
|
||
requestUrl: "请求地址",
|
||
fullUrl: "完整 URL",
|
||
baseUrlHint: "填写兼容 {type} API 的服务端点地址,不要以斜杠结尾",
|
||
envPairs: "Env 键值对",
|
||
addEnv: "+ 添加",
|
||
modelMappingDesc: "显示名称只影响 /model 菜单;1M 只是给 Kimi Code 的上下文能力声明。",
|
||
oneClickSetup: "一键设置",
|
||
fetchModels: "获取模型列表",
|
||
fetchingModels: "获取中...",
|
||
discoveredModels: "发现 {count} 个模型",
|
||
addSelected: "添加选中的",
|
||
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: "刷新中…",
|
||
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: "供应商模型用量趋势",
|
||
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} 条记录",
|
||
dashboardAttribution: "仪表盘功能基于",
|
||
sessionsAttribution: "会话管理功能基于",
|
||
attributionSuffix: "(MIT,© JochenYang)移植",
|
||
|
||
// 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",
|
||
presetNameZhipu: "智谱 GLM",
|
||
presetNameZai: "z.ai(智谱海外)",
|
||
presetNameBailian: "阿里百炼",
|
||
presetNameMinimax: "MiniMax",
|
||
presetNameStepfun: "阶跃星辰",
|
||
presetNameSiliconflow: "硅基流动",
|
||
presetNameNovita: "Novita AI",
|
||
presetNameOpenrouter: "OpenRouter",
|
||
presetNameOpenai: "OpenAI 官方",
|
||
presetNameGoogleGenai: "Google AI Studio",
|
||
presetNameVolcengine: "火山方舟",
|
||
|
||
// Provider usage
|
||
usageBalance: "余额",
|
||
usageUsed: "已使用",
|
||
usageRemaining: "剩余",
|
||
usageRefresh: "刷新",
|
||
usageRetry: "重试",
|
||
usageQueryFailed: "查询失败",
|
||
usageNetworkError: "网络异常",
|
||
usageInvalidKey: "API Key 无效",
|
||
usageResetIn: "{time} 后重置",
|
||
usageResetDone: "已重置",
|
||
usageLoading: "查询中…",
|
||
} as const;
|
||
|
||
export type TranslationKey = keyof typeof zhTranslations;
|