Files
KimiCodeSwitch/src/i18n/zh.ts
T
KimiSwitch Dev 2614f80d0f v0.6.0: 预设供应商 + 供应商账单查询
## 新增

- 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
2026-07-29 20:59:53 +08:00

364 lines
12 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;