1704 lines
95 KiB
TypeScript
1704 lines
95 KiB
TypeScript
import { createTraditionalMessages } from './traditional';
|
||
import { jaOverrides } from './ja';
|
||
|
||
export type MessageVariables = Record<string, string | number>;
|
||
|
||
export const zhCN = {
|
||
'app.language': '语言',
|
||
'app.theme.light': '日间模式',
|
||
'app.theme.dark': '夜间模式',
|
||
'app.theme.switchToLight': '切换到日间模式',
|
||
'app.theme.switchToDark': '切换到夜间模式',
|
||
'app.desktopConsole': '桌面控制台',
|
||
'app.navigation': '主导航',
|
||
'app.nav.home': '首页',
|
||
'app.nav.versions': '版本管理',
|
||
'app.nav.kernel': '内核',
|
||
'app.nav.config': '高级设置',
|
||
'app.nav.thinkingAliases': '模型别名',
|
||
'app.nav.oauth': 'OAuth',
|
||
'app.nav.api': 'API 接入',
|
||
'app.nav.authFiles': '认证文件',
|
||
'app.nav.quota': '额度查询',
|
||
'app.nav.usageRecords': '使用记录',
|
||
'app.nav.agents': '智能体',
|
||
'app.coreRequired.title': '请先启动内核',
|
||
'app.coreRequired.description': '启动 CPA 内核后,才能使用配置、OAuth、API 接入等功能。',
|
||
'app.contact.title': '通过 QQ 联系我们',
|
||
'app.contact.label': '联系我们',
|
||
'app.close.title': '请选择后续操作',
|
||
'app.close.description': '你可以退出程序,或让 EasyCLIProxyAPI 继续在系统托盘中运行。',
|
||
'app.close.minimizing': '正在最小化...',
|
||
'app.close.minimize': '最小化到托盘',
|
||
'app.close.exiting': '正在退出...',
|
||
'app.close.exit': '退出程序',
|
||
'error.render.title': '页面渲染出现异常',
|
||
'error.unknown': '未知错误',
|
||
'error.reload': '重新加载页面',
|
||
'quota.title': '额度查询',
|
||
'quota.queryableCredentials.one': '{count} 个可查询凭据',
|
||
'quota.queryableCredentials.other': '{count} 个可查询凭据',
|
||
'quota.credentials.one': '{count} 个凭据',
|
||
'quota.credentials.other': '{count} 个凭据',
|
||
'quota.readList': '读取列表',
|
||
'quota.refreshAll': '刷新全部',
|
||
'quota.loadingFiles': '读取认证文件中',
|
||
'quota.empty.title': '暂无可查询配额',
|
||
'quota.empty.description': '先在认证文件中添加支持配额查询的凭据。',
|
||
'quota.unknownProvider': '未知',
|
||
'quota.reset': '重置额度',
|
||
'quota.fileDisabled': '认证文件已停用',
|
||
'quota.refresh': '获取/刷新额度',
|
||
'quota.notFetched': '尚未获取额度',
|
||
'quota.disabled': '已停用',
|
||
'quota.fetch': '获取额度',
|
||
'quota.querying': '查询中',
|
||
'quota.resetCredits': '主动重置次数',
|
||
'quota.earliestExpiry': '最早过期',
|
||
'quota.remaining': '剩余 {percent}%',
|
||
'quota.confirm.title': '确认重置“{name}”的 Codex 额度吗?',
|
||
'quota.confirm.cost': '本操作将消耗 1 次主动重置机会。',
|
||
'quota.confirm.available': '当前可用:{count} 次',
|
||
'quota.confirm.expiry': '最早过期:{time}',
|
||
'quota.confirm.warning': '只有点击“确定”后才会执行;点击“取消”不会消耗重置机会。',
|
||
'oauth.title': 'OAuth 登录',
|
||
'oauth.loginSuccess': '{provider} 登录成功',
|
||
'oauth.priorityApplyFailed': 'OAuth 登录成功,但无法将新凭证的优先级设为 0:{error}',
|
||
'oauth.authFailed': '认证失败',
|
||
'oauth.loginFailed': '{provider} 登录失败{detail}',
|
||
'oauth.missingState': '内核未返回 OAuth state',
|
||
'oauth.missingStatePolling': '内核未返回 OAuth state,无法轮询登录状态',
|
||
'oauth.openFailedDetail': '已获取登录链接,但自动打开浏览器失败:{error}',
|
||
'oauth.openFailed': '已获取登录链接,但自动打开浏览器失败,请手动打开',
|
||
'oauth.linkCopied': '登录链接已复制',
|
||
'oauth.linkCopyFailed': '复制登录链接失败',
|
||
'oauth.pasteCallback': '请粘贴回调 URL',
|
||
'oauth.pasteXaiCallback': '请粘贴 xAI 返回的 code 或回调 URL',
|
||
'oauth.invalidCallback': '回调内容无效',
|
||
'oauth.invalidXaiCallback': '无法从输入内容构造 xAI 回调,请检查 code 与 state',
|
||
'oauth.callbackSubmittedNotice': '回调已提交,正在等待认证完成',
|
||
'oauth.loginAnother': '登录另一个账号',
|
||
'oauth.loggingIn': '登录中…',
|
||
'oauth.startLogin': '开始登录',
|
||
'oauth.hint': '点击开始登录后,将自动打开浏览器完成授权;如未自动跳转,可手动打开链接',
|
||
'oauth.authorizationLink': '授权链接',
|
||
'oauth.copyLink': '复制链接',
|
||
'oauth.openLink': '打开链接',
|
||
'oauth.callbackPlaceholder': '粘贴完整回调 URL',
|
||
'oauth.xaiCallbackPlaceholder': '粘贴 code 或完整回调 URL',
|
||
'oauth.submitCallback': '提交回调',
|
||
'oauth.callbackSubmitted': '回调已提交,等待认证完成',
|
||
'oauth.callbackFailed': '回调提交失败{detail}',
|
||
'oauth.openBrowser': '打开浏览器',
|
||
'oauth.status.completed': '已完成',
|
||
'oauth.status.failed': '失败',
|
||
'oauth.status.waiting': '等待回调',
|
||
'oauth.status.signedOut': '未登录',
|
||
'usage.title': '使用记录',
|
||
'usage.collector.collecting': '本地采集中',
|
||
'usage.collector.error': '采集异常',
|
||
'usage.collector.waiting': '等待内核',
|
||
'usage.longTermRecords': '{count} 条长期记录',
|
||
'usage.pageLabel': '使用记录页面',
|
||
'usage.tab.overview': '总览',
|
||
'usage.tab.analysis': '分析',
|
||
'usage.tab.events': '请求明细',
|
||
'usage.tab.pricing': '价格统计',
|
||
'usage.filter.timeRange': '时间范围',
|
||
'usage.range.4h': '最近 4 小时',
|
||
'usage.range.24h': '最近 24 小时',
|
||
'usage.range.today': '今天',
|
||
'usage.range.7d': '最近 7 天',
|
||
'usage.range.30d': '最近 30 天',
|
||
'usage.range.all': '全部时间',
|
||
'usage.range.custom': '自定义',
|
||
'usage.filter.model': '模型',
|
||
'usage.filter.allModels': '全部模型',
|
||
'usage.filter.allProviders': '全部 Provider',
|
||
'usage.filter.source': '来源',
|
||
'usage.filter.allSources': '全部来源',
|
||
'usage.filter.allKeys': '全部密钥',
|
||
'usage.filter.result': '请求结果',
|
||
'usage.filter.allResults': '全部结果',
|
||
'usage.result.success': '成功',
|
||
'usage.result.failed': '失败',
|
||
'usage.filter.startTime': '开始时间',
|
||
'usage.filter.endTime': '结束时间',
|
||
'usage.filter.to': '至',
|
||
'usage.loading': '正在读取本地 SQLite 使用记录',
|
||
'usage.stat.requests': '请求总数',
|
||
'usage.stat.requestMeta': '{success} 成功 · {failed} 失败',
|
||
'usage.stat.tokens': 'Token 总量',
|
||
'usage.stat.tokenMeta': '输入 {input} · 输出 {output}',
|
||
'usage.stat.successRate': '成功率',
|
||
'usage.stat.reasoningMeta': '思考 {tokens} Token',
|
||
'usage.stat.averageLatency': '平均延迟',
|
||
'usage.stat.tps': 'TPS',
|
||
'usage.stat.performanceMeta': '{rpm} RPM · 平均延迟 {latency} ms',
|
||
'usage.stat.cacheHitRate': '缓存命中率',
|
||
'usage.stat.cacheHitMeta': '命中 {hit} / 输入 {input} Token',
|
||
'usage.stat.estimatedCost': '预估成本',
|
||
'usage.stat.costMeta': '已计价 {priced} / {total} 次请求 · 仅供参考',
|
||
'usage.pricing.coverage': '已计价 {priced} / {total} 次请求 · 可用 {saved} 个模型价格',
|
||
'usage.pricing.search': '搜索模型',
|
||
'usage.pricing.add': '手动添加',
|
||
'usage.pricing.sync': '同步价格',
|
||
'usage.pricing.syncing': '同步中',
|
||
'usage.pricing.syncResult': '价格更新完成:导入 {imported},保留手动价格 {skipped},未匹配 {unmatched}',
|
||
'usage.pricing.syncFallback': '远程价格读取失败,已继续使用软件内置价格',
|
||
'usage.pricing.model': '模型',
|
||
'usage.pricing.calls': '请求数',
|
||
'usage.pricing.cost': '预估成本',
|
||
'usage.pricing.prompt': '输入价 ($/1M)',
|
||
'usage.pricing.completion': '输出价 ($/1M)',
|
||
'usage.pricing.cache': '兼容缓存价 ($/1M)',
|
||
'usage.pricing.cacheRead': '缓存读取价 ($/1M)',
|
||
'usage.pricing.cacheCreation': '缓存创建价 ($/1M)',
|
||
'usage.pricing.actions': '操作',
|
||
'usage.pricing.optional': '可选,留空使用回退价',
|
||
'usage.pricing.modelRequired': '请输入模型名称',
|
||
'usage.pricing.saving': '保存中',
|
||
'usage.pricing.saved': '模型价格已保存,总览成本已更新',
|
||
'usage.pricing.deleted': '模型价格已删除,总览成本已更新',
|
||
'usage.pricing.deleteConfirm': '确定删除模型 {model} 的价格吗?',
|
||
'usage.trend.title': '请求与 Token 趋势',
|
||
'usage.trend.description': '按系统本地小时聚合',
|
||
'usage.token.title': 'Token 构成',
|
||
'usage.token.description': '缓存、思考与生成消耗',
|
||
'usage.token.input': '输入',
|
||
'usage.token.output': '输出',
|
||
'usage.token.reasoning': '思考',
|
||
'usage.token.cacheRead': '缓存读取',
|
||
'usage.token.cacheCreation': '缓存创建',
|
||
'usage.trend.aria': '请求趋势',
|
||
'usage.analysis.models': '模型使用',
|
||
'usage.analysis.sources': '请求来源',
|
||
'usage.analysis.keys': '鉴权密钥',
|
||
'usage.analysis.hours': '时段分布',
|
||
'usage.analysis.sortedByTokens': '按 Token 排序',
|
||
'usage.analysis.itemMeta': '{requests} 次 · {percent}% · {tokens} Token',
|
||
'usage.events.total': '共 {count} 条记录',
|
||
'usage.events.page': '第 {page} / {total} 页',
|
||
'usage.column.time': '时间',
|
||
'usage.column.model': '模型',
|
||
'usage.column.source': '来源',
|
||
'usage.column.result': '结果',
|
||
'usage.column.latency': '总耗时',
|
||
'usage.column.ttft': '首字延迟',
|
||
'usage.column.input': '输入',
|
||
'usage.column.output': '输出',
|
||
'usage.column.reasoning': '思考',
|
||
'usage.column.cache': '缓存',
|
||
'usage.column.total': '总计',
|
||
'usage.key.noRemark': '未备注',
|
||
'usage.previous': '上一页',
|
||
'usage.next': '下一页',
|
||
'usage.empty': '当前筛选范围没有使用记录',
|
||
'aliases.effort.low': '轻量',
|
||
'aliases.effort.medium': '均衡',
|
||
'aliases.effort.high': '深入',
|
||
'aliases.effort.xhigh': '超高',
|
||
'aliases.effort.max': '最大',
|
||
'aliases.source.openAiCompatible': 'OpenAI 兼容',
|
||
'aliases.source.other': '其他来源',
|
||
'aliases.source.available': '内核当前可用模型',
|
||
'aliases.error.selectModel': '请先选择原模型',
|
||
'aliases.error.emptyAlias': '别名模型不能为空',
|
||
'aliases.error.emptyEffort': '思考强度不能为空',
|
||
'aliases.created': '已创建 {alias},思考强度固定为 {effort}',
|
||
'aliases.deleteConfirm': '确定删除别名模型“{alias}”吗?\n将同时移除对应的思考强度覆盖规则。',
|
||
'aliases.deleted': '已删除 {alias}',
|
||
'aliases.create.title': '创建思考别名',
|
||
'aliases.create.description': '支持 Codex OAuth、Codex API 和 OpenAI 兼容接入',
|
||
'aliases.originalModel': '原模型',
|
||
'aliases.loadingModels': '正在读取模型',
|
||
'aliases.searchModel': '搜索并选择原模型',
|
||
'aliases.availableModels': '可用原模型',
|
||
'aliases.noMatch': '没有匹配的模型或来源',
|
||
'aliases.noModels': '当前没有可选模型',
|
||
'aliases.sourceLabel': '来源:{source}',
|
||
'aliases.sourceHint': '同名模型会按 Codex OAuth、Codex API 和 OpenAI 兼容来源分别列出',
|
||
'aliases.effort.title': '思考强度',
|
||
'aliases.effort.description': '选择常用等级,或输入上游支持的自定义值',
|
||
'aliases.customLevel': '自定义等级:{effort}',
|
||
'aliases.customLevelHint': '输入模型提供商支持的其他思考等级',
|
||
'aliases.custom': '自定义',
|
||
'aliases.customPlaceholder': '例如 minimal、auto、ultra 或厂商等级',
|
||
'aliases.collapseCustom': '收起自定义输入',
|
||
'aliases.customHelp': '仅填写目标模型实际支持的等级名称',
|
||
'aliases.aliasName.title': '别名模型名称',
|
||
'aliases.aliasName.description': '由你填写,仅新增入口,不会改名原模型',
|
||
'aliases.aliasName.example': '例如 {model}-{effort}',
|
||
'aliases.aliasName.selectFirst': '先选择原模型,再填写客户端使用的别名',
|
||
'aliases.notSelected': '未选择模型',
|
||
'aliases.enterAlias': '请输入别名模型名称',
|
||
'aliases.notSet': '未填写',
|
||
'aliases.creating': '创建中',
|
||
'aliases.create': '创建别名',
|
||
'aliases.createdList.title': '已创建别名',
|
||
'aliases.createdList.description': '每个别名都保留原模型、来源和固定思考强度',
|
||
'aliases.loadingConfig': '读取配置中',
|
||
'aliases.empty.title': '尚未创建思考别名',
|
||
'aliases.empty.description': '从左侧选择模型和强度即可创建',
|
||
'aliases.unboundEffort': '未绑定强度',
|
||
'aliases.delete': '删除 {alias}',
|
||
'config.routing.roundRobin': '轮询',
|
||
'config.routing.fillFirst': '优先填充',
|
||
'config.tabs.label': '高级设置子页面',
|
||
'config.tabs.general': '基础设置',
|
||
'config.tabs.network': '网络与路由',
|
||
'config.error.emptyKey': '鉴权密钥不能为空',
|
||
'config.error.invalidKey': '只能使用 ASCII 可见字符,且不能包含空格',
|
||
'config.error.duplicateKey': '该鉴权密钥已经存在',
|
||
'config.error.remarkTooLong': '备注不能超过 80 个字符',
|
||
'config.error.portRange': '端口必须是 1–65535 之间的整数',
|
||
'config.error.networkRestartFailed': '设置已保存,但内核重启失败:{error}',
|
||
'config.error.saveFailed': '保存失败:{error}',
|
||
'config.notice.keyAdded': '鉴权密钥已新增',
|
||
'config.notice.keyUpdated': '鉴权密钥已更新',
|
||
'config.notice.keyDeleted': '鉴权密钥已删除',
|
||
'config.notice.keyCopied': '鉴权密钥已复制',
|
||
'config.notice.keyCopyFailed': '复制鉴权密钥失败',
|
||
'config.notice.routingUpdated': '路由策略已更新',
|
||
'config.notice.networkUpdated': '网络与会话路由设置已保存',
|
||
'config.notice.networkRestarted': '网络设置已保存,内核已重启',
|
||
'config.notice.networkNextStart': '网络设置已保存,将在下次启动内核时生效',
|
||
'config.notice.proxyUpdated': '代理 URL 已保存',
|
||
'config.notice.sessionAffinityEnabled': '会话粘性路由已启用',
|
||
'config.notice.sessionAffinityDisabled': '会话粘性路由已停用',
|
||
'config.notice.sessionTtlUpdated': '会话粘性 TTL 已保存',
|
||
'config.keys.title': '鉴权密钥',
|
||
'config.keys.count': '密钥数量',
|
||
'config.keys.add': '新增鉴权密钥',
|
||
'config.unavailable': '配置不可用',
|
||
'common.retry': '重试',
|
||
'config.keys.noRemark': '未填写备注',
|
||
'config.keys.copy': '复制鉴权密钥',
|
||
'config.keys.copyNth': '复制第 {number} 个鉴权密钥',
|
||
'config.keys.edit': '编辑鉴权密钥',
|
||
'config.keys.editNth': '编辑第 {number} 个鉴权密钥',
|
||
'config.keys.delete': '删除鉴权密钥',
|
||
'config.keys.deleteNth': '删除第 {number} 个鉴权密钥',
|
||
'config.keys.empty': '暂无鉴权密钥',
|
||
'common.loading': '读取中',
|
||
'common.unavailable': '不可用',
|
||
'common.enabled': '已启用',
|
||
'common.disabled': '已停用',
|
||
'config.routing.title': '路由策略',
|
||
'config.network.title': '网络与会话路由',
|
||
'config.network.networkSection': '网络设置',
|
||
'config.network.routingSection': '会话路由',
|
||
'config.network.saving': '正在保存',
|
||
'config.network.saved': '已保存',
|
||
'config.network.unsaved': '有未保存修改',
|
||
'config.network.confirmSave': '确认保存',
|
||
'config.network.port': '端口',
|
||
'config.network.portHint': '范围 1–65535;内核运行时修改会自动重启',
|
||
'config.network.allowLan': '允许局域网',
|
||
'config.network.allowLanHint': '启用后将',
|
||
'config.network.proxyUrl': '代理 URL',
|
||
'config.network.proxyPlaceholder': '例如 socks5://127.0.0.1:7890',
|
||
'config.network.proxyHint': '全局上游代理;留空表示不使用',
|
||
'config.network.sessionAffinity': '会话粘性路由',
|
||
'config.network.sessionAffinityHint': '同一会话优先复用已选择的凭据',
|
||
'config.network.sessionTtl': '会话粘性 TTL',
|
||
'config.network.sessionTtlHint': '例如 1h;留空使用内核默认值',
|
||
'config.keys.addTitle': '新增鉴权密钥',
|
||
'config.keys.editTitle': '编辑鉴权密钥',
|
||
'common.close': '关闭',
|
||
'config.keys.label': '鉴权密钥',
|
||
'config.keys.hide': '隐藏密钥',
|
||
'config.keys.show': '显示密钥',
|
||
'config.keys.remark': '备注',
|
||
'config.keys.remarkPlaceholder': '例如:开发环境、张三的密钥',
|
||
'config.keys.generate': '生成密钥',
|
||
'config.keys.adding': '正在新增',
|
||
'common.add': '新增',
|
||
'config.keys.deleteTitle': '删除鉴权密钥',
|
||
'config.keys.deleteAllWarning': '删除所有密钥将会导致默认放行所有密钥',
|
||
'common.cancel': '取消',
|
||
'common.deleting': '正在删除',
|
||
'common.delete': '删除',
|
||
'authFiles.unknownProvider': '未知提供商',
|
||
'authFiles.status.disabled': '已停用',
|
||
'authFiles.status.unavailable': '不可用',
|
||
'authFiles.status.ready': '就绪',
|
||
'authFiles.quota.loading': '额度查询中',
|
||
'authFiles.quota.failed': '额度获取失败',
|
||
'authFiles.quota.aria': '额度信息',
|
||
'authFiles.quota.empty': '暂无额度数据',
|
||
'authFiles.quota.resets': '主动重置 {count} 次',
|
||
'authFiles.quota.expiry': '最早过期 {time}',
|
||
'authFiles.models.noneForProvider': '该提供商没有可配置的模型定义',
|
||
'authFiles.models.updated': '{provider} 开放模型已更新',
|
||
'authFiles.priority.button': '优先级 {priority}',
|
||
'authFiles.priority.title': '修改凭证优先级',
|
||
'authFiles.priority.label': '优先级',
|
||
'authFiles.priority.placeholder': '例如 10 或 -1',
|
||
'authFiles.priority.hint': '仅支持整数;数值越大优先级越高。留空或填写 0 恢复默认。',
|
||
'authFiles.priority.invalid': '请输入有效的整数优先级',
|
||
'authFiles.priority.updated': '{name} 的优先级已更新',
|
||
'authFiles.uploaded': '已上传 {count} 个认证文件',
|
||
'authFiles.uploadFailed': '{count} 个文件上传失败:{errors}',
|
||
'authFiles.notice.enabled': '认证文件已启用',
|
||
'authFiles.notice.disabled': '认证文件已停用',
|
||
'authFiles.runtimeDeleteError': '运行时认证文件不能从磁盘删除',
|
||
'authFiles.deleteConfirm': '确定删除“{name}”吗?',
|
||
'authFiles.deleted': '认证文件已删除',
|
||
'authFiles.deleteAllConfirm': '确定删除所有磁盘认证文件吗?运行时认证不会被删除。',
|
||
'authFiles.deletedAll': '磁盘认证文件已全部删除',
|
||
'common.copyFailed': '复制失败',
|
||
'authFiles.title': '认证文件',
|
||
'authFiles.summary': '{files} 个文件 · {disabled} 个停用',
|
||
'common.refresh': '刷新',
|
||
'authFiles.clearDisk': '清空磁盘文件',
|
||
'common.upload': '上传',
|
||
'authFiles.searchPlaceholder': '搜索文件名、账号或提供商',
|
||
'authFiles.filter.allProviders': '全部提供商',
|
||
'authFiles.filter.allStatuses': '全部状态',
|
||
'authFiles.filter.enabled': '已启用',
|
||
'authFiles.filter.disabled': '已停用',
|
||
'authFiles.filter.runtime': '仅运行时',
|
||
'authFiles.loading': '读取认证文件中',
|
||
'authFiles.empty.filtered': '没有匹配的认证文件',
|
||
'authFiles.empty.none': '暂无认证文件',
|
||
'authFiles.empty.tryFilter': '换个筛选条件试试',
|
||
'authFiles.empty.upload': '上传 JSON 认证文件后会显示在这里',
|
||
'authFiles.unknownSize': '大小未知',
|
||
'authFiles.runtime': '运行时',
|
||
'authFiles.quota.querying': '查询中',
|
||
'authFiles.quota.refresh': '刷新额度',
|
||
'authFiles.quota.fetch': '获取额度',
|
||
'authFiles.models.settings': '设置开放模型',
|
||
'authFiles.models.button': '模型',
|
||
'authFiles.copyName': '复制文件名',
|
||
'authFiles.openDirectory': '打开凭证所在文件夹',
|
||
'common.enable': '启用',
|
||
'common.disable': '停用',
|
||
'authFiles.runtimeFootnote': '{count} 个凭据来自运行时存储,只能在对应提供商或认证源中管理。',
|
||
'authFiles.models.title': '开放模型',
|
||
'authFiles.models.description': '{provider} · 默认全部开放,可取消不需要的模型',
|
||
'authFiles.models.search': '搜索模型名称',
|
||
'authFiles.models.summary': '共 {total} 个 · 已开放 {open} 个',
|
||
'authFiles.models.closeVisible': '关闭当前',
|
||
'authFiles.models.openVisible': '开放当前',
|
||
'authFiles.models.openAll': '全部开放',
|
||
'authFiles.models.closeAll': '全部关闭',
|
||
'authFiles.models.loading': '正在读取模型定义',
|
||
'authFiles.models.loadFailed': '读取模型失败',
|
||
'authFiles.models.noMatch': '没有匹配的模型',
|
||
'authFiles.models.empty': '暂无模型定义',
|
||
'common.saving': '保存中',
|
||
'authFiles.models.save': '保存(开放 {count} 个)',
|
||
'agents.description.claudeCode': '使用 CPA 的 Anthropic 兼容接口',
|
||
'agents.description.claudeDesktop': '使用 CPA 3P 推理网关,支持 Windows、macOS 和 Linux Beta',
|
||
'agents.description.codex': '使用 CPA Responses 接口',
|
||
'agents.description.opencode': '使用 CPA OpenAI Compatible provider',
|
||
'agents.description.openclaw': '使用 CPA 模型供应商和默认模型',
|
||
'agents.description.hermes': '使用 CPA custom provider',
|
||
'agents.list.detecting': '正在检测',
|
||
'agents.list.unsupported': '当前平台不支持',
|
||
'agents.list.notInstalled': '未检测到安装',
|
||
'agents.list.modified': '已修改 · {model}',
|
||
'agents.list.installedVersion': '已安装 · {version}',
|
||
'agents.list.installed': '已安装 · 保持原配置',
|
||
'agents.model.loading': '正在读取模型',
|
||
'agents.model.loadFailed': '获取模型失败',
|
||
'agents.model.select': '选择模型',
|
||
'agents.model.none': '模型列表为空',
|
||
'agents.model.search': '搜索模型名称或别名',
|
||
'agents.model.clearSearch': '清空搜索',
|
||
'agents.model.refresh': '刷新模型',
|
||
'agents.model.fetching': '正在获取模型',
|
||
'agents.model.noMatch': '没有匹配的模型',
|
||
'agents.model.unavailable': '模型列表为空',
|
||
'agents.model.tryKeywords': '尝试其他关键词',
|
||
'agents.model.connectFirst': '请先接入可用模型后刷新',
|
||
'agents.model.available': '可用模型',
|
||
'agents.model.count': '{count} 个可用模型',
|
||
'agents.model.stale': '刷新失败,显示上次结果',
|
||
'agents.error.modelsLoading': '模型列表仍在加载,请稍后再试',
|
||
'agents.error.noModels': '当前没有可选模型,无法应用配置修改',
|
||
'agents.error.selectionGone': '当前选择已不在可用模型列表中,请刷新模型后重新选择',
|
||
'agents.error.applyFirst': '模型选择尚未应用,请先点击“应用配置修改”',
|
||
'agents.status.detecting': '检测中',
|
||
'agents.status.unsupported': '平台不支持',
|
||
'agents.status.notInstalled': '未安装',
|
||
'agents.status.conflict': '配置冲突',
|
||
'agents.status.modified': '已修改配置',
|
||
'agents.status.original': '保持原配置',
|
||
'agents.status.invalid': '配置无效',
|
||
'agents.status.applied': '已应用',
|
||
'agents.status.unconfigured': '尚未配置',
|
||
'agents.title': '智能体配置',
|
||
'agents.redetect': '重新检测',
|
||
'agents.tabs.label': '智能体配置子页面',
|
||
'agents.tabs.core': '核心配置',
|
||
'agents.tabs.sessions': '会话管理',
|
||
'agents.sessions.title': 'Codex 会话管理',
|
||
'agents.sessions.description': '扫描本地 Codex 会话,并安全地恢复历史会话、备份或删除。',
|
||
'agents.sessions.refresh': '刷新',
|
||
'agents.sessions.currentPage': '当前页',
|
||
'agents.sessions.active': '未归档',
|
||
'agents.sessions.archived': '已归档',
|
||
'agents.sessions.database': '数据库来源',
|
||
'agents.sessions.databaseMissing': '未发现会话数据库',
|
||
'agents.sessions.repairTitle': '恢复历史会话',
|
||
'agents.sessions.repairDescription': '将其他渠道的会话同步到当前会话',
|
||
'agents.sessions.autoRepair': '自动恢复历史会话',
|
||
'agents.sessions.settingLoading': '读取中',
|
||
'agents.sessions.settingOn': '已开启',
|
||
'agents.sessions.settingOff': '已关闭',
|
||
'agents.sessions.settingLoadFailed': '读取自动恢复设置失败:{error}',
|
||
'agents.sessions.applyManagedFirst': '请先应用 Codex 的 CPA 托管配置',
|
||
'agents.sessions.repairNow': '立即恢复',
|
||
'agents.sessions.repairing': '正在恢复',
|
||
'agents.sessions.loadFailed': '读取 Codex 会话失败:{error}',
|
||
'agents.sessions.localSessions': '本地会话',
|
||
'agents.sessions.pageDescription': '第 {page} 页 · 每页最多 {size} 条',
|
||
'agents.sessions.selected': '已选 {count} 条',
|
||
'agents.sessions.selectAll': '全选本页',
|
||
'agents.sessions.clearSelection': '清空选择',
|
||
'agents.sessions.deleteSelected': '删除所选',
|
||
'agents.sessions.multiSelect': '多选',
|
||
'agents.sessions.loading': '正在扫描本地会话…',
|
||
'agents.sessions.empty': '没有找到可显示的 Codex 会话。',
|
||
'agents.sessions.selectSession': '选择会话 {title}',
|
||
'agents.sessions.untitled': '未命名会话',
|
||
'agents.sessions.noProject': '无项目路径',
|
||
'agents.sessions.noProvider': '未知 Provider',
|
||
'agents.sessions.noTime': '更新时间未知',
|
||
'agents.sessions.activeBadge': '未归档',
|
||
'agents.sessions.archivedBadge': '已归档',
|
||
'agents.sessions.previousPage': '上一页',
|
||
'agents.sessions.nextPage': '下一页',
|
||
'agents.sessions.pageNumber': '第 {page} 页',
|
||
'agents.sessions.deleteOneTitle': '删除这个会话?',
|
||
'agents.sessions.deleteManyTitle': '删除 {count} 个会话?',
|
||
'agents.sessions.deleteOneDescription': '将先创建备份,再删除“{title}”及其已知关联记录。此操作不提供界面内撤销。',
|
||
'agents.sessions.deleteManyDescription': '将先创建备份,再删除以下 {count} 个会话及其已知关联记录:{preview}{extra}',
|
||
'agents.sessions.deleteMore': ',另有 {count} 个',
|
||
'agents.sessions.confirmDelete': '备份并删除',
|
||
'agents.sessions.deleteResult': '已删除 {deleted} 个,失败 {failed} 个。{details}{backup}',
|
||
'agents.sessions.deleteFailed': '删除会话失败:{error}',
|
||
'agents.sessions.backupAt': '备份位置:{path}',
|
||
'agents.sessions.settingFailed': '保存自动恢复设置失败:{error}',
|
||
'agents.sessions.repairResult': '历史会话已恢复到 {provider}:迁移 {files} 个 rollout 文件、更新 {rows} 条数据库记录、跳过 {skipped} 个占用文件。',
|
||
'agents.sessions.repairFailed': '恢复历史会话失败:{error}',
|
||
'agents.sessions.progressCount': '{processed}/{total}',
|
||
'agents.sessions.progress.scanning': '正在扫描会话',
|
||
'agents.sessions.progress.backingUp': '正在创建备份',
|
||
'agents.sessions.progress.rewriting': '正在迁移历史会话',
|
||
'agents.sessions.progress.updatingDatabase': '正在同步数据库',
|
||
'agents.sessions.progress.complete': '恢复完成',
|
||
'agents.sessions.scanIndex': '检查无效会话记录',
|
||
'agents.sessions.scanningIndex': '正在检查无效记录',
|
||
'agents.sessions.cleanupNoCandidates': '未发现可安全清理的无效会话记录。',
|
||
'agents.sessions.cleanupPreviewFailed': '检查无效会话记录失败:{error}',
|
||
'agents.sessions.cleanupTitle': '可清理的无效索引',
|
||
'agents.sessions.cleanupDescription': '发现 {count} 条只存在于 session_index.jsonl、但已没有真实会话来源的记录。默认不选择;确认 Codex 和 ChatGPT 已退出后,再逐项清理。未知格式记录会保留。',
|
||
'agents.sessions.cleanupSelectAll': '选择全部候选',
|
||
'agents.sessions.cleanupConfirm': '清理所选 {count} 条',
|
||
'agents.sessions.cleanupResult': '已清理 {count} 条无效会话索引。{backup}',
|
||
'agents.sessions.cleanupFailed': '清理无效会话索引失败:{error}',
|
||
'agents.localClients': '本机客户端',
|
||
'agents.selectClient': '选择需要管理的智能体',
|
||
'agents.installStatus': '安装状态',
|
||
'agents.clientDetected': '已检测到客户端',
|
||
'agents.clientNotDetected': '未检测到客户端',
|
||
'agents.clientVersion': '客户端版本',
|
||
'agents.notFetched': '未获取',
|
||
'agents.useModel': '使用模型',
|
||
'agents.pending': '尚未应用',
|
||
'agents.model.readingAvailable': '正在读取可用模型',
|
||
'agents.model.current': '当前已应用:{model}',
|
||
'agents.model.firstSelection': '{count} 个可用模型,首次默认选择第一项',
|
||
'agents.modify.title': '配置修改',
|
||
'agents.modify.oauthConfiguration': 'Oauth配置方式',
|
||
'agents.oauthLoginRequired.title': '需要登录 Codex',
|
||
'agents.oauthLoginRequired.enableDescription': '未检测到有效的 Codex 登录凭据,无法开启 OAuth 配置模式。请先在 Codex 应用中登录 ChatGPT 账号,如果 Codex 应用无法触发登录,请先使用',
|
||
'agents.oauthLoginRequired.enableClearConfiguration': '清空配置',
|
||
'agents.oauthLoginRequired.enableDescriptionSuffix': '功能。',
|
||
'agents.oauthLoginRequired.applyDescription': '无法应用 OAuth 配置:未检测到有效的 Codex 登录凭据。请先在 Codex 中登录 ChatGPT 账号,然后再应用配置。',
|
||
'agents.oauthLoginRequired.launchDescription': '已开启 OAuth 配置模式,但未检测到有效的 Codex 登录凭据。请先在 Codex 中登录 ChatGPT 账号,然后再启动。',
|
||
'agents.oauthLoginRequired.confirm': '我知道了',
|
||
'agents.modify.apply': '应用配置修改',
|
||
'agents.modify.default': '默认配置',
|
||
'agents.modify.clear': '清空配置',
|
||
'agents.modify.invalid': '当前配置无法解析。点击“应用配置修改”会重建最小合法配置;“默认配置”会重置整个文件。',
|
||
'agents.modify.applied': '软件负责的配置字段已应用,其他用户内容保持不变。',
|
||
'agents.launch.enableFirst': '请先应用配置修改',
|
||
'agents.launch.applyFirst': '请先应用当前模型选择',
|
||
'agents.launch.starting': '启动中',
|
||
'agents.launch.startCli': '启动 CLI',
|
||
'agents.launch.startApp': '启动 App',
|
||
'agents.launch.start': '启动 {target}',
|
||
'agents.launch.unavailable': '无法启动',
|
||
'agents.launch.closeChatgpt': '关闭 ChatGPT App',
|
||
'agents.launch.closingChatgpt': '关闭中',
|
||
'agents.default.title': '重置为默认配置',
|
||
'agents.default.description': '这会使用当前选中模型重写 {name} 的全部相关配置文件,并删除其中其他用户内容。该操作没有备份且无法恢复。',
|
||
'agents.default.confirm': '确认写入默认配置',
|
||
'agents.clear.title': '清空 Codex 配置',
|
||
'agents.clear.description': '这会永久删除 Codex 配置目录中的 auth.json 和 config.toml,并重置软件记录的应用状态。该操作没有备份且无法恢复。',
|
||
'agents.clear.confirm': '确认清空配置',
|
||
'agents.clear.success': 'Codex 配置已清空。',
|
||
'agents.closeApp.title': '关闭 ChatGPT App',
|
||
'agents.closeApp.description': '这会关闭本机所有正在运行的 ChatGPT App 进程及其子进程。正在生成的回复或尚未保存的状态可能丢失。',
|
||
'agents.closeApp.confirm': '确认关闭 App',
|
||
'agents.closeApp.success': 'ChatGPT App 已关闭({count} 个进程)。',
|
||
'agents.closeApp.notRunning': 'ChatGPT App 当前没有运行。',
|
||
'apiAccess.compatibleName': 'OpenAI 兼容 {number}',
|
||
'apiAccess.error.headerMissingColon': '自定义请求头第 {number} 行缺少冒号',
|
||
'apiAccess.error.headerInvalid': '自定义请求头第 {number} 行格式无效',
|
||
'apiAccess.error.partialLoad': '部分接入读取失败:{errors}',
|
||
'apiAccess.error.requiredAll': '备注、Base URL 和密钥不能为空',
|
||
'apiAccess.error.requiredBaseKey': 'Base URL 和 API 密钥不能为空',
|
||
'apiAccess.error.requiredKey': 'API 密钥不能为空',
|
||
'apiAccess.error.baseRequired': '{provider} 接入必须填写 Base URL',
|
||
'apiAccess.error.noModels': '没有发现可放行的模型,请确认 Base URL 和 API 密钥',
|
||
'apiAccess.error.stale': '接入配置已被其他操作修改,请刷新后重试',
|
||
'apiAccess.error.duplicate': '相同的接入配置已经存在',
|
||
'apiAccess.error.remarkInvalid': '备注不能超过 80 个字符,且不能包含换行或控制字符',
|
||
'apiAccess.notice.updated': '接入已更新',
|
||
'apiAccess.notice.added': '接入已新增',
|
||
'apiAccess.deleteConfirm': '确定删除“{remark}”吗?',
|
||
'apiAccess.notice.deleted': '接入已删除',
|
||
'apiAccess.notice.enabled': '接入已启用',
|
||
'apiAccess.notice.disabled': '接入已停用',
|
||
'apiAccess.title': 'API 接入',
|
||
'apiAccess.count': '{count} 个接入',
|
||
'apiAccess.add': '新增',
|
||
'apiAccess.matches': '{count} 个匹配接入',
|
||
'apiAccess.search': '搜索备注、密钥或地址',
|
||
'apiAccess.loading': '读取配置中',
|
||
'apiAccess.empty.filtered': '没有匹配的接入',
|
||
'apiAccess.empty.none': '暂无接入配置',
|
||
'apiAccess.empty.tryKeyword': '换个关键词试试',
|
||
'apiAccess.empty.addFirst': '点击右上角“新增”添加第一个接入',
|
||
'apiAccess.keys.count': '{count} 个密钥',
|
||
'apiAccess.keys.summary': '{key} · 共 {count} 个密钥',
|
||
'apiAccess.remarkValue': '备注:{remark}',
|
||
'apiAccess.defaultUrl': '使用默认地址',
|
||
'apiAccess.models.summary': '模型 {count} 个 · {models}',
|
||
'apiAccess.priorityValue': '优先级 {priority}',
|
||
'apiAccess.runtimeCredential': '运行时凭据 {index}…',
|
||
'apiAccess.enable': '启用接入',
|
||
'apiAccess.disable': '停用接入',
|
||
'apiAccess.status.disabled': '已停用',
|
||
'apiAccess.status.enabled': '已启用',
|
||
'apiAccess.toggleAria': '{remark} 接入{action}开关',
|
||
'common.edit': '编辑',
|
||
'apiAccess.error.enterBaseUrl': '请先填写 Base URL',
|
||
'apiAccess.error.noAvailableModels': '未发现可用模型',
|
||
'apiAccess.error.baseBeforeModels': '请先填写 Base URL,再获取模型',
|
||
'apiAccess.models.selected': '已选择 {count} 个模型',
|
||
'apiAccess.models.restricted': '已配置模型限制',
|
||
'apiAccess.models.autoAll': '保存时默认开放全部模型',
|
||
'apiAccess.models.upstreamDefault': '使用上游默认模型',
|
||
'apiAccess.models.hiddenHint': '未勾选的模型不会出现在开放列表',
|
||
'apiAccess.models.autoHint': '保存接入时会自动获取模型,也可提前取消不需要的项目',
|
||
'apiAccess.models.allHint': '当前开放上游全部模型',
|
||
'apiAccess.dialog.edit': '编辑 API 接入',
|
||
'apiAccess.dialog.add': '新增 API 接入',
|
||
'apiAccess.field.keysMany': 'API 密钥(每行一个)',
|
||
'apiAccess.field.key': 'API 密钥',
|
||
'apiAccess.field.remark': '备注',
|
||
'apiAccess.remarkPlaceholder': '例如:生产环境、团队主账号',
|
||
'apiAccess.baseRequiredPlaceholder': '必填,例如 https://api.example.com',
|
||
'apiAccess.baseOptionalPlaceholder': '可选,留空使用默认地址',
|
||
'apiAccess.preset.title': 'OpenAI 兼容预设',
|
||
'apiAccess.preset.description': '已预填 DeepSeek 官方地址,保存时自动发现并开放全部模型',
|
||
'apiAccess.thinking.builtIn': '内置思考等级',
|
||
'apiAccess.thinking.builtInDescription': '自动应用到当前开放的全部模型',
|
||
'apiAccess.thinking.title': '思考等级',
|
||
'apiAccess.thinking.description': '按上游支持情况自行添加',
|
||
'apiAccess.thinking.placeholder': '例如 low、medium 或自定义等级',
|
||
'apiAccess.thinking.add': '添加',
|
||
'apiAccess.thinking.delete': '删除 {level}',
|
||
'apiAccess.thinking.deleteAria': '删除思考等级 {level}',
|
||
'apiAccess.thinking.empty': '未添加时不写入 thinking.levels',
|
||
'apiAccess.models.title': '模型',
|
||
'apiAccess.models.description': '勾选表示当前开放,取消勾选后将从模型列表隐藏',
|
||
'apiAccess.models.fetch': '获取模型',
|
||
'apiAccess.field.priority': '优先级',
|
||
'common.optional': '可选',
|
||
'apiAccess.advanced': '高级设置',
|
||
'apiAccess.field.prefix': '模型前缀',
|
||
'apiAccess.prefixPlaceholder': '可选,例如 team-a',
|
||
'apiAccess.field.headers': '自定义请求头(每行 Name: Value)',
|
||
'apiAccess.field.excludedModels': '排除模型(每行一个,支持通配符)',
|
||
'apiAccess.field.testModel': '测试模型',
|
||
'apiAccess.cloak.mode': 'Claude 伪装模式',
|
||
'apiAccess.cloak.default': '默认(auto)',
|
||
'apiAccess.cloak.words': '伪装敏感词(每行一个)',
|
||
'apiAccess.cloak.strict': '严格模式',
|
||
'apiAccess.cloak.strictDescription': '仅保留 Claude Code 系统提示',
|
||
'apiAccess.cloak.enableStrict': '启用严格模式',
|
||
'apiAccess.cloak.cacheUser': '缓存用户标识',
|
||
'apiAccess.cloak.cacheUserDescription': '复用伪装后的用户标识',
|
||
'apiAccess.websocket.description': '为该 Codex 接入启用 WebSocket',
|
||
'apiAccess.websocket.enable': '启用 WebSocket',
|
||
'apiAccess.cooling.title': '禁用冷却',
|
||
'apiAccess.cooling.description': '上游限流后仍允许继续选择该接入',
|
||
'common.save': '保存',
|
||
'apiAccess.modelDialog.title': '选择模型',
|
||
'apiAccess.modelDialog.summary': '找到 {found} 个 · 已选择 {selected} 个',
|
||
'apiAccess.modelDialog.deselectAll': '取消全选',
|
||
'apiAccess.modelDialog.selectVisible': '全选当前',
|
||
'common.clear': '清空',
|
||
'apiAccess.modelDialog.fetching': '正在获取模型',
|
||
'apiAccess.modelDialog.fetchFailed': '获取模型失败',
|
||
'apiAccess.modelDialog.noMatch': '没有匹配的模型',
|
||
'apiAccess.modelDialog.none': '未发现模型',
|
||
'apiAccess.modelDialog.tryKeyword': '换个关键词试试',
|
||
'apiAccess.modelDialog.checkCredentials': '请检查 Base URL 和 API 密钥',
|
||
'apiAccess.modelDialog.apply': '应用选择({count})',
|
||
'kernel.install.completed': '{version} 安装完成',
|
||
'kernel.error.progressListener': '监听下载进度失败: {error}',
|
||
'kernel.action.start': '启动',
|
||
'kernel.action.stop': '关闭',
|
||
'kernel.action.restart': '重启',
|
||
'kernel.notice.actionSuccess': '内核{action}成功',
|
||
'kernel.notice.actionFailed': '内核{action}失败:{error}',
|
||
'kernel.notice.networkRestarted': '网络设置已保存,内核已重启',
|
||
'kernel.notice.networkRestartFailed': '网络设置已保存,但内核重启失败',
|
||
'kernel.notice.networkNextStart': '网络设置已保存,下次启动内核时生效',
|
||
'kernel.notice.networkSaveFailed': '保存网络设置失败:{error}',
|
||
'kernel.error.port': '端口必须在 1 到 65535 之间',
|
||
'kernel.error.installTask': '读取安装任务失败: {error}',
|
||
'kernel.install.installingVersion': '正在安装 {version}',
|
||
'kernel.phase.preparingDownload': '准备下载',
|
||
'kernel.phase.downloading': '下载中',
|
||
'kernel.phase.extracting': '解压中',
|
||
'kernel.phase.completed': '安装完成',
|
||
'kernel.install.installingBundled': '正在安装内置内核 {version}',
|
||
'kernel.phase.preparingBundled': '准备内置内核',
|
||
'kernel.install.bundledCompleted': '{version} 内置内核安装完成',
|
||
'kernel.phase.failed': '安装失败',
|
||
'kernel.phase.cancelled': '已取消',
|
||
'kernel.install.cancelling': '正在取消下载',
|
||
'kernel.notice.copyFailed': '复制接入信息失败',
|
||
'kernel.error.openUpdate': '打开更新页面失败:{error}',
|
||
'kernel.progress.completed': '已完成',
|
||
'kernel.progress.extracting': '正在解压文件',
|
||
'kernel.progress.waiting': '等待进度信息',
|
||
'kernel.status.running': '运行中',
|
||
'kernel.status.stopped': '已停止',
|
||
'kernel.status.notInstalled': '未安装',
|
||
'common.detectionFailed': '检测失败',
|
||
'common.detecting': '检测中',
|
||
'kernel.update.failedRetry': '检查失败,重试',
|
||
'kernel.update.toVersion': '更新至 {version}',
|
||
'kernel.update.checking': '检查中',
|
||
'kernel.update.failed': '检查失败',
|
||
'kernel.update.notChecked': '未检查',
|
||
'kernel.update.statusChecking': '正在检查',
|
||
'kernel.update.notYetChecked': '尚未检查',
|
||
'kernel.update.latest': '已是最新版本',
|
||
'kernel.update.available': '可安装新版本',
|
||
'appUpdate.eyebrow': '软件升级',
|
||
'appUpdate.title': '软件版本管理',
|
||
'appUpdate.current': '当前版本',
|
||
'appUpdate.latest': '最新版本',
|
||
'appUpdate.status': '升级状态',
|
||
'appUpdate.manualFallback': '如果检测失败,请手动到GitHub页面更新',
|
||
'appUpdate.upToDate': '已是最新版本',
|
||
'appUpdate.available': '发现新版本 {version}',
|
||
'appUpdate.check': '检查更新',
|
||
'appUpdate.checking': '正在检查',
|
||
'appUpdate.catalog.label': 'Codex 模型目录',
|
||
'appUpdate.catalog.description': '启动时自动从 GitHub 静默同步',
|
||
'appUpdate.catalog.update': '同步模型目录',
|
||
'appUpdate.catalog.updateHint': '从 GitHub 检查并更新 Codex 模型目录',
|
||
'appUpdate.catalog.updating': '正在同步模型目录',
|
||
'appUpdate.catalog.updated': '模型目录已从 GitHub 同步',
|
||
'appUpdate.catalog.unchanged': '模型目录已是最新版本',
|
||
'appUpdate.installNow': '立即升级',
|
||
'appUpdate.openRelease': '打开下载页面',
|
||
'appUpdate.confirmTitle': '安装软件更新',
|
||
'appUpdate.confirmDescription': '将下载并安装 {version}。应用会自动重启,正在运行的托管内核会短暂停止并恢复。',
|
||
'appUpdate.progressTitle': '正在升级软件',
|
||
'appUpdate.cancelDownload': '取消下载',
|
||
'appUpdate.badgeAvailable': '发现软件新版本 {version}',
|
||
'appUpdate.phase.idle': '等待操作',
|
||
'appUpdate.phase.checking': '检查更新',
|
||
'appUpdate.phase.available': '可升级',
|
||
'appUpdate.phase.downloading': '正在下载',
|
||
'appUpdate.phase.verifying': '正在校验',
|
||
'appUpdate.phase.staging': '准备更新',
|
||
'appUpdate.phase.waitingForExit': '等待程序退出',
|
||
'appUpdate.phase.restarting': '正在重启',
|
||
'appUpdate.phase.completed': '升级完成',
|
||
'appUpdate.phase.cancelled': '下载已取消',
|
||
'appUpdate.phase.failed': '升级失败',
|
||
'kernel.install.inProgress': '正在安装',
|
||
'kernel.install.githubFailed': 'Github连接失败,请使用“离线安装”',
|
||
'kernel.install.titleCancelling': '正在取消下载',
|
||
'kernel.install.titleInstalling': '正在安装内核',
|
||
'kernel.install.titleCompleted': '安装完成',
|
||
'kernel.install.titleCancelled': '下载已取消',
|
||
'kernel.install.titleFailed': '安装失败',
|
||
'kernel.install.waitingStop': '正在等待下载任务停止',
|
||
'kernel.install.taskRunning': '安装任务正在进行',
|
||
'kernel.install.cancellingShort': '正在取消',
|
||
'kernel.install.cancel': '取消下载',
|
||
'common.processing': '处理中',
|
||
'kernel.overview.coreStatus': '内核状态',
|
||
'kernel.overview.appVersion': '软件版本',
|
||
'kernel.update.openGithub': '打开 GitHub 最新版本页面',
|
||
'kernel.overview.coreVersion': '内核版本',
|
||
'kernel.control.title': '运行控制',
|
||
'kernel.control.installStatus': '安装状态',
|
||
'kernel.control.installed': '已安装',
|
||
'kernel.control.runStatus': '运行状态',
|
||
'kernel.control.pid': '进程 PID',
|
||
'kernel.control.notRunning': '未运行',
|
||
'kernel.control.noPid': '无',
|
||
'kernel.control.allowLan': '允许局域网',
|
||
'kernel.control.lanRestartHint': '切换后会自动重启正在运行的内核',
|
||
'kernel.control.allowLanAria': '允许局域网访问',
|
||
'kernel.control.port': '端口',
|
||
'kernel.control.portPlaceholder': '端口号',
|
||
'kernel.control.portRange': '端口范围 1-65535',
|
||
'kernel.notice.stopped': '内核已关闭',
|
||
'kernel.notice.started': '内核已启动',
|
||
'kernel.notice.restarted': '内核已重启',
|
||
'kernel.control.refresh': '刷新状态',
|
||
'kernel.versions.title': '内核版本管理',
|
||
'kernel.versions.offlineHint': 'GitHub 无法连接时,可使用离线安装使用内置内核。',
|
||
'kernel.versions.current': '当前版本',
|
||
'kernel.versions.latest': '最新版本',
|
||
'kernel.versions.bundled': '内置版本',
|
||
'kernel.versions.notIncluded': '未包含',
|
||
'kernel.versions.platform': '运行平台',
|
||
'kernel.versions.updateStatus': '更新状态',
|
||
'kernel.versions.check': '检查更新',
|
||
'kernel.versions.installVersion': '安装 {version}',
|
||
'kernel.versions.installLatest': '安装最新版',
|
||
'kernel.versions.reinstallTitle': '重新安装当前版本',
|
||
'kernel.versions.reinstall': '重新安装',
|
||
'kernel.versions.noBundled': '当前发行包未包含内置内核',
|
||
'kernel.versions.offlineInstall': '离线安装',
|
||
'kernel.access.firstKey': '第一个密钥',
|
||
'kernel.access.noConfiguredKey': '未设置密钥,当前默认放行所有密钥',
|
||
'kernel.access.connectable': '可连接',
|
||
'kernel.access.waiting': '等待内核启动',
|
||
'kernel.access.localUrl': '本机 URL',
|
||
'kernel.access.localCopied': '{name} 本机 URL 已复制',
|
||
'kernel.access.copyLocal': '复制 {name} 本机 URL',
|
||
'kernel.access.lanUrl': '局域网 URL',
|
||
'kernel.access.detectingIp': '正在检测局域网 IP',
|
||
'kernel.access.noIp': '未检测到局域网 IP',
|
||
'kernel.access.lanCopied': '{name} 局域网 URL 已复制',
|
||
'kernel.access.copyLan': '复制 {name} 局域网 URL',
|
||
'kernel.dialog.install': '内核安装',
|
||
'kernel.dialog.phase': '当前阶段',
|
||
'kernel.dialog.unknownProgress': '进度未知',
|
||
'kernel.access.openaiDescription': 'OpenAI兼容格式',
|
||
'kernel.access.claudeDescription': 'Anthropic兼容格式',
|
||
'kernel.access.geminiDescription': 'Gemini兼容格式',
|
||
'authFiles.unnamed': '未命名认证文件',
|
||
'management.notConfigured': '未配置',
|
||
'management.error.upstream': '上游请求失败',
|
||
'management.error.upstreamHttp': '上游返回 HTTP {status}',
|
||
'model.error.invalidBaseUrl': 'Base URL 不是有效地址,请输入类似 https://api.example.com 的 URL',
|
||
'model.error.unsupportedBaseUrl': 'Base URL 只支持 http:// 或 https:// 地址',
|
||
'model.error.baseUrlRequired': '请先输入 Base URL',
|
||
'model.error.noResponse': '模型接口无响应',
|
||
'quota.service.relative.daysHours': '{days} 天 {hours} 小时后',
|
||
'quota.service.relative.days': '{days} 天后',
|
||
'quota.service.relative.hoursMinutes': '{hours} 小时 {minutes} 分钟后',
|
||
'quota.service.relative.hours': '{hours} 小时后',
|
||
'quota.service.relative.minutes': '{minutes} 分钟后',
|
||
'quota.service.duration.unknown': '未知周期',
|
||
'quota.service.duration.days': '{count} 天',
|
||
'quota.service.duration.hours': '{count} 小时',
|
||
'quota.service.duration.minutes': '{count} 分钟',
|
||
'quota.service.duration.seconds': '{count} 秒',
|
||
'quota.service.limit.fiveHours': '5 小时限额',
|
||
'quota.service.limit.week': '周限额',
|
||
'quota.service.limit.month': '月限额',
|
||
'quota.service.limit.duration': '{duration}限额',
|
||
'quota.service.codeReview': '代码审查',
|
||
'quota.service.additional': '附加 {index}',
|
||
'quota.service.window.fiveHour': '5 小时窗口',
|
||
'quota.service.window.sevenDay': '7 天窗口',
|
||
'quota.service.window.sevenDayOAuth': '7 天 OAuth 应用窗口',
|
||
'quota.service.window.sevenDayOpus': '7 天 Opus 窗口',
|
||
'quota.service.window.sevenDaySonnet': '7 天 Sonnet 窗口',
|
||
'quota.service.window.sevenDayCowork': '7 天 Cowork 窗口',
|
||
'quota.service.window.duration': '{duration}窗口',
|
||
'quota.service.extraUsage': '额外用量',
|
||
'quota.service.usedOf': '已用 {used} / {limit}',
|
||
'quota.service.weekly': '每周额度',
|
||
'quota.service.limit.numbered': '限制 {index}',
|
||
'quota.service.product.numbered': '产品 {index}',
|
||
'quota.service.monthlyIncluded': '月度包含额度',
|
||
'quota.service.onDemand': '按量付费额度',
|
||
'quota.service.quota': '配额',
|
||
'quota.service.quota.numbered': '配额 {index}',
|
||
'quota.service.error.missingAuthIndex': '缺少 auth-index,无法查询配额',
|
||
'quota.service.error.missingProject': '缺少 Antigravity project ID',
|
||
'quota.service.error.antigravityEmpty': 'Antigravity 返回成功,但没有可识别的配额分组',
|
||
'quota.service.error.upstreamEmpty': '上游返回了空配额数据',
|
||
'quota.service.error.noResponse': '配额接口无响应',
|
||
'quota.service.error.missingResetAuthIndex': '缺少 auth-index,无法查询主动重置次数',
|
||
'quota.service.error.unsupportedProvider': '暂不支持该提供商的配额查询',
|
||
'quota.service.error.unrecognized': '上游返回了配额数据,但无法识别',
|
||
'quota.service.error.codexResetOnly': '只有 Codex 凭据支持使用重置额度',
|
||
'quota.service.error.missingConsumeAuthIndex': '缺少 auth-index,无法使用重置额度',
|
||
} as const;
|
||
|
||
export type MessageKey = keyof typeof zhCN;
|
||
|
||
export const en: Record<MessageKey, string> = {
|
||
'app.language': 'Language',
|
||
'app.theme.light': 'Light mode',
|
||
'app.theme.dark': 'Dark mode',
|
||
'app.theme.switchToLight': 'Switch to light mode',
|
||
'app.theme.switchToDark': 'Switch to dark mode',
|
||
'app.desktopConsole': 'Desktop Console',
|
||
'app.navigation': 'Main navigation',
|
||
'app.nav.home': 'Home',
|
||
'app.nav.versions': 'Version Management',
|
||
'app.nav.kernel': 'Core',
|
||
'app.nav.config': 'Advanced Settings',
|
||
'app.nav.thinkingAliases': 'Model Aliases',
|
||
'app.nav.oauth': 'OAuth',
|
||
'app.nav.api': 'API Access',
|
||
'app.nav.authFiles': 'Auth Files',
|
||
'app.nav.quota': 'Quota Lookup',
|
||
'app.nav.usageRecords': 'Usage',
|
||
'app.nav.agents': 'Agents',
|
||
'app.coreRequired.title': 'Start the core first',
|
||
'app.coreRequired.description': 'Start the CPA core to use settings, OAuth, API access, and other features.',
|
||
'app.contact.title': 'Contact us on QQ',
|
||
'app.contact.label': 'Contact Us',
|
||
'app.close.title': 'What would you like to do?',
|
||
'app.close.description': 'Exit the app, or keep EasyCLIProxyAPI running in the system tray.',
|
||
'app.close.minimizing': 'Minimizing...',
|
||
'app.close.minimize': 'Minimize to Tray',
|
||
'app.close.exiting': 'Exiting...',
|
||
'app.close.exit': 'Exit App',
|
||
'error.render.title': 'Something went wrong while rendering this page',
|
||
'error.unknown': 'Unknown error',
|
||
'error.reload': 'Reload Page',
|
||
'quota.title': 'Quota Lookup',
|
||
'quota.queryableCredentials.one': '{count} queryable credential',
|
||
'quota.queryableCredentials.other': '{count} queryable credentials',
|
||
'quota.credentials.one': '{count} credential',
|
||
'quota.credentials.other': '{count} credentials',
|
||
'quota.readList': 'Load List',
|
||
'quota.refreshAll': 'Refresh All',
|
||
'quota.loadingFiles': 'Loading authentication files',
|
||
'quota.empty.title': 'No quota data available',
|
||
'quota.empty.description': 'Add a credential that supports quota queries under Auth Files first.',
|
||
'quota.unknownProvider': 'Unknown',
|
||
'quota.reset': 'Reset Quota',
|
||
'quota.fileDisabled': 'Authentication file is disabled',
|
||
'quota.refresh': 'Fetch or refresh quota',
|
||
'quota.notFetched': 'Quota has not been fetched',
|
||
'quota.disabled': 'Disabled',
|
||
'quota.fetch': 'Fetch Quota',
|
||
'quota.querying': 'Querying',
|
||
'quota.resetCredits': 'Manual resets',
|
||
'quota.earliestExpiry': 'Earliest expiry',
|
||
'quota.remaining': '{percent}% remaining',
|
||
'quota.confirm.title': 'Reset the Codex quota for “{name}”?',
|
||
'quota.confirm.cost': 'This will consume one manual reset credit.',
|
||
'quota.confirm.available': 'Currently available: {count}',
|
||
'quota.confirm.expiry': 'Earliest expiry: {time}',
|
||
'quota.confirm.warning': 'The reset runs only after you confirm. Canceling will not consume a reset credit.',
|
||
'oauth.title': 'OAuth Sign-In',
|
||
'oauth.loginSuccess': '{provider} sign-in succeeded',
|
||
'oauth.priorityApplyFailed': 'OAuth sign-in succeeded, but the new credential priority could not be set to 0: {error}',
|
||
'oauth.authFailed': 'Authentication failed',
|
||
'oauth.loginFailed': '{provider} sign-in failed{detail}',
|
||
'oauth.missingState': 'The core did not return an OAuth state',
|
||
'oauth.missingStatePolling': 'The core did not return an OAuth state, so sign-in status cannot be polled',
|
||
'oauth.openFailedDetail': 'The sign-in link is ready, but the browser could not be opened: {error}',
|
||
'oauth.openFailed': 'The sign-in link is ready, but the browser could not be opened. Open it manually.',
|
||
'oauth.linkCopied': 'Sign-in link copied',
|
||
'oauth.linkCopyFailed': 'Failed to copy the sign-in link',
|
||
'oauth.pasteCallback': 'Paste the callback URL',
|
||
'oauth.pasteXaiCallback': 'Paste the code or callback URL returned by xAI',
|
||
'oauth.invalidCallback': 'The callback is invalid',
|
||
'oauth.invalidXaiCallback': 'Could not build the xAI callback. Check the code and state.',
|
||
'oauth.callbackSubmittedNotice': 'Callback submitted. Waiting for authentication to finish.',
|
||
'oauth.loginAnother': 'Sign In Another Account',
|
||
'oauth.loggingIn': 'Signing in…',
|
||
'oauth.startLogin': 'Start Sign-In',
|
||
'oauth.hint': 'Starting sign-in opens your browser for authorization. If it does not open, use the link below.',
|
||
'oauth.authorizationLink': 'Authorization link',
|
||
'oauth.copyLink': 'Copy Link',
|
||
'oauth.openLink': 'Open Link',
|
||
'oauth.callbackPlaceholder': 'Paste the full callback URL',
|
||
'oauth.xaiCallbackPlaceholder': 'Paste the code or full callback URL',
|
||
'oauth.submitCallback': 'Submit Callback',
|
||
'oauth.callbackSubmitted': 'Callback submitted. Waiting for authentication.',
|
||
'oauth.callbackFailed': 'Callback submission failed{detail}',
|
||
'oauth.openBrowser': 'Open Browser',
|
||
'oauth.status.completed': 'Completed',
|
||
'oauth.status.failed': 'Failed',
|
||
'oauth.status.waiting': 'Waiting for Callback',
|
||
'oauth.status.signedOut': 'Not Signed In',
|
||
'usage.title': 'Usage History',
|
||
'usage.collector.collecting': 'Collecting Locally',
|
||
'usage.collector.error': 'Collection Error',
|
||
'usage.collector.waiting': 'Waiting for Core',
|
||
'usage.longTermRecords': '{count} stored records',
|
||
'usage.pageLabel': 'Usage history page',
|
||
'usage.tab.overview': 'Overview',
|
||
'usage.tab.analysis': 'Analysis',
|
||
'usage.tab.events': 'Request Details',
|
||
'usage.tab.pricing': 'Price Statistics',
|
||
'usage.filter.timeRange': 'Time range',
|
||
'usage.range.4h': 'Last 4 Hours',
|
||
'usage.range.24h': 'Last 24 Hours',
|
||
'usage.range.today': 'Today',
|
||
'usage.range.7d': 'Last 7 Days',
|
||
'usage.range.30d': 'Last 30 Days',
|
||
'usage.range.all': 'All Time',
|
||
'usage.range.custom': 'Custom',
|
||
'usage.filter.model': 'Model',
|
||
'usage.filter.allModels': 'All Models',
|
||
'usage.filter.allProviders': 'All Providers',
|
||
'usage.filter.source': 'Source',
|
||
'usage.filter.allSources': 'All Sources',
|
||
'usage.filter.allKeys': 'All Keys',
|
||
'usage.filter.result': 'Request result',
|
||
'usage.filter.allResults': 'All Results',
|
||
'usage.result.success': 'Success',
|
||
'usage.result.failed': 'Failed',
|
||
'usage.filter.startTime': 'Start time',
|
||
'usage.filter.endTime': 'End time',
|
||
'usage.filter.to': 'to',
|
||
'usage.loading': 'Loading local SQLite usage history',
|
||
'usage.stat.requests': 'Total Requests',
|
||
'usage.stat.requestMeta': '{success} succeeded · {failed} failed',
|
||
'usage.stat.tokens': 'Total Tokens',
|
||
'usage.stat.tokenMeta': 'Input {input} · Output {output}',
|
||
'usage.stat.successRate': 'Success Rate',
|
||
'usage.stat.reasoningMeta': 'Reasoning {tokens} tokens',
|
||
'usage.stat.averageLatency': 'Average Latency',
|
||
'usage.stat.tps': 'TPS',
|
||
'usage.stat.performanceMeta': '{rpm} RPM · Avg latency {latency} ms',
|
||
'usage.stat.cacheHitRate': 'Cache Hit Rate',
|
||
'usage.stat.cacheHitMeta': '{hit} hit / {input} input tokens',
|
||
'usage.stat.estimatedCost': 'Estimated Cost',
|
||
'usage.stat.costMeta': '{priced} / {total} requests priced · Estimate only',
|
||
'usage.pricing.coverage': '{priced} / {total} requests priced · {saved} model prices available',
|
||
'usage.pricing.search': 'Search model',
|
||
'usage.pricing.add': 'Add Manually',
|
||
'usage.pricing.sync': 'Sync Prices',
|
||
'usage.pricing.syncing': 'Syncing',
|
||
'usage.pricing.syncResult': 'Prices updated: {imported} imported, {skipped} manual prices kept, {unmatched} unmatched',
|
||
'usage.pricing.syncFallback': 'Remote prices could not be read; built-in prices remain active',
|
||
'usage.pricing.model': 'Model',
|
||
'usage.pricing.calls': 'Requests',
|
||
'usage.pricing.cost': 'Estimated Cost',
|
||
'usage.pricing.prompt': 'Input ($/1M)',
|
||
'usage.pricing.completion': 'Output ($/1M)',
|
||
'usage.pricing.cache': 'Legacy Cache ($/1M)',
|
||
'usage.pricing.cacheRead': 'Cache Read ($/1M)',
|
||
'usage.pricing.cacheCreation': 'Cache Creation ($/1M)',
|
||
'usage.pricing.actions': 'Actions',
|
||
'usage.pricing.optional': 'Optional; blank uses fallback',
|
||
'usage.pricing.modelRequired': 'Enter a model name',
|
||
'usage.pricing.saving': 'Saving',
|
||
'usage.pricing.saved': 'Model price saved; overview cost updated',
|
||
'usage.pricing.deleted': 'Model price deleted; overview cost updated',
|
||
'usage.pricing.deleteConfirm': 'Delete the price for {model}?',
|
||
'usage.trend.title': 'Request and Token Trend',
|
||
'usage.trend.description': 'Grouped by local system hour',
|
||
'usage.token.title': 'Token Breakdown',
|
||
'usage.token.description': 'Cache, reasoning, and generation usage',
|
||
'usage.token.input': 'Input',
|
||
'usage.token.output': 'Output',
|
||
'usage.token.reasoning': 'Reasoning',
|
||
'usage.token.cacheRead': 'Cache Read',
|
||
'usage.token.cacheCreation': 'Cache Creation',
|
||
'usage.trend.aria': 'Request trend',
|
||
'usage.analysis.models': 'Model Usage',
|
||
'usage.analysis.sources': 'Request Sources',
|
||
'usage.analysis.keys': 'Authentication Keys',
|
||
'usage.analysis.hours': 'Hourly Distribution',
|
||
'usage.analysis.sortedByTokens': 'Sorted by tokens',
|
||
'usage.analysis.itemMeta': '{requests} requests · {percent}% · {tokens} tokens',
|
||
'usage.events.total': '{count} records',
|
||
'usage.events.page': 'Page {page} of {total}',
|
||
'usage.column.time': 'Time',
|
||
'usage.column.model': 'Model',
|
||
'usage.column.source': 'Source',
|
||
'usage.column.result': 'Result',
|
||
'usage.column.latency': 'Total Duration',
|
||
'usage.column.ttft': 'First Token Latency',
|
||
'usage.column.input': 'Input',
|
||
'usage.column.output': 'Output',
|
||
'usage.column.reasoning': 'Reasoning',
|
||
'usage.column.cache': 'Cache',
|
||
'usage.column.total': 'Total',
|
||
'usage.key.noRemark': 'No remark',
|
||
'usage.previous': 'Previous',
|
||
'usage.next': 'Next',
|
||
'usage.empty': 'No usage records match the current filters',
|
||
'aliases.effort.low': 'Light',
|
||
'aliases.effort.medium': 'Balanced',
|
||
'aliases.effort.high': 'Deep',
|
||
'aliases.effort.xhigh': 'Extra High',
|
||
'aliases.effort.max': 'Maximum',
|
||
'aliases.source.openAiCompatible': 'OpenAI Compatible',
|
||
'aliases.source.other': 'Other Source',
|
||
'aliases.source.available': 'Models currently available from the core',
|
||
'aliases.error.selectModel': 'Select an original model first',
|
||
'aliases.error.emptyAlias': 'The model alias cannot be empty',
|
||
'aliases.error.emptyEffort': 'The reasoning effort cannot be empty',
|
||
'aliases.created': 'Created {alias} with reasoning effort fixed to {effort}',
|
||
'aliases.deleteConfirm': 'Delete the model alias “{alias}”?\nIts reasoning-effort override will also be removed.',
|
||
'aliases.deleted': 'Deleted {alias}',
|
||
'aliases.create.title': 'Create Reasoning Alias',
|
||
'aliases.create.description': 'Supports Codex OAuth, Codex API, and OpenAI-compatible connections',
|
||
'aliases.originalModel': 'Original Model',
|
||
'aliases.loadingModels': 'Loading models',
|
||
'aliases.searchModel': 'Search and select an original model',
|
||
'aliases.availableModels': 'Available original models',
|
||
'aliases.noMatch': 'No matching models or sources',
|
||
'aliases.noModels': 'No models are currently available',
|
||
'aliases.sourceLabel': 'Source: {source}',
|
||
'aliases.sourceHint': 'Models with the same name are listed separately for Codex OAuth, Codex API, and OpenAI-compatible sources',
|
||
'aliases.effort.title': 'Reasoning Effort',
|
||
'aliases.effort.description': 'Choose a common level or enter a custom value supported by the upstream provider',
|
||
'aliases.customLevel': 'Custom level: {effort}',
|
||
'aliases.customLevelHint': 'Enter another reasoning level supported by the model provider',
|
||
'aliases.custom': 'Custom',
|
||
'aliases.customPlaceholder': 'For example: minimal, auto, ultra, or a provider-specific level',
|
||
'aliases.collapseCustom': 'Collapse custom input',
|
||
'aliases.customHelp': 'Enter only a level name supported by the target model',
|
||
'aliases.aliasName.title': 'Model Alias',
|
||
'aliases.aliasName.description': 'Adds another entry point without renaming the original model',
|
||
'aliases.aliasName.example': 'For example: {model}-{effort}',
|
||
'aliases.aliasName.selectFirst': 'Select the original model, then enter the alias clients will use',
|
||
'aliases.notSelected': 'No model selected',
|
||
'aliases.enterAlias': 'Enter a model alias',
|
||
'aliases.notSet': 'Not set',
|
||
'aliases.creating': 'Creating',
|
||
'aliases.create': 'Create Alias',
|
||
'aliases.createdList.title': 'Created Aliases',
|
||
'aliases.createdList.description': 'Each alias retains its original model, source, and fixed reasoning effort',
|
||
'aliases.loadingConfig': 'Loading configuration',
|
||
'aliases.empty.title': 'No reasoning aliases yet',
|
||
'aliases.empty.description': 'Select a model and effort on the left to create one',
|
||
'aliases.unboundEffort': 'No effort bound',
|
||
'aliases.delete': 'Delete {alias}',
|
||
'config.routing.roundRobin': 'Round Robin',
|
||
'config.routing.fillFirst': 'Fill First',
|
||
'config.tabs.label': 'Advanced settings sections',
|
||
'config.tabs.general': 'General Settings',
|
||
'config.tabs.network': 'Network & Routing',
|
||
'config.error.emptyKey': 'The authentication key cannot be empty',
|
||
'config.error.invalidKey': 'Use visible ASCII characters only, without spaces',
|
||
'config.error.duplicateKey': 'This authentication key already exists',
|
||
'config.error.remarkTooLong': 'The remark cannot exceed 80 characters',
|
||
'config.error.portRange': 'The port must be an integer from 1 to 65535',
|
||
'config.error.networkRestartFailed': 'Settings were saved, but the core failed to restart: {error}',
|
||
'config.error.saveFailed': 'Failed to save: {error}',
|
||
'config.notice.keyAdded': 'Authentication key added',
|
||
'config.notice.keyUpdated': 'Authentication key updated',
|
||
'config.notice.keyDeleted': 'Authentication key deleted',
|
||
'config.notice.keyCopied': 'Authentication key copied',
|
||
'config.notice.keyCopyFailed': 'Failed to copy the authentication key',
|
||
'config.notice.routingUpdated': 'Routing strategy updated',
|
||
'config.notice.networkUpdated': 'Network and session routing settings saved',
|
||
'config.notice.networkRestarted': 'Network settings saved and the core restarted',
|
||
'config.notice.networkNextStart': 'Network settings saved and will apply on the next core start',
|
||
'config.notice.proxyUpdated': 'Proxy URL saved',
|
||
'config.notice.sessionAffinityEnabled': 'Session affinity enabled',
|
||
'config.notice.sessionAffinityDisabled': 'Session affinity disabled',
|
||
'config.notice.sessionTtlUpdated': 'Session affinity TTL saved',
|
||
'config.keys.title': 'Authentication Keys',
|
||
'config.keys.count': 'Key count',
|
||
'config.keys.add': 'Add Authentication Key',
|
||
'config.unavailable': 'Configuration Unavailable',
|
||
'common.retry': 'Retry',
|
||
'config.keys.noRemark': 'No remark',
|
||
'config.keys.copy': 'Copy authentication key',
|
||
'config.keys.copyNth': 'Copy authentication key {number}',
|
||
'config.keys.edit': 'Edit authentication key',
|
||
'config.keys.editNth': 'Edit authentication key {number}',
|
||
'config.keys.delete': 'Delete authentication key',
|
||
'config.keys.deleteNth': 'Delete authentication key {number}',
|
||
'config.keys.empty': 'No authentication keys',
|
||
'common.loading': 'Loading',
|
||
'common.unavailable': 'Unavailable',
|
||
'common.enabled': 'Enabled',
|
||
'common.disabled': 'Disabled',
|
||
'config.routing.title': 'Routing Strategy',
|
||
'config.network.title': 'Network & Session Routing',
|
||
'config.network.networkSection': 'Network Settings',
|
||
'config.network.routingSection': 'Session Routing',
|
||
'config.network.saving': 'Saving',
|
||
'config.network.saved': 'Saved',
|
||
'config.network.unsaved': 'Unsaved changes',
|
||
'config.network.confirmSave': 'Confirm & Save',
|
||
'config.network.port': 'Port',
|
||
'config.network.portHint': 'Range 1–65535; changing it restarts a running core',
|
||
'config.network.allowLan': 'Allow LAN',
|
||
'config.network.allowLanHint': 'Allow other devices on the LAN to access this proxy',
|
||
'config.network.proxyUrl': 'Proxy URL',
|
||
'config.network.proxyPlaceholder': 'For example, socks5://127.0.0.1:7890',
|
||
'config.network.proxyHint': 'Global upstream proxy; leave blank to disable',
|
||
'config.network.sessionAffinity': 'Session Affinity',
|
||
'config.network.sessionAffinityHint': 'Prefer the previously selected credential for the same session',
|
||
'config.network.sessionTtl': 'Session Affinity TTL',
|
||
'config.network.sessionTtlHint': 'For example, 1h; leave blank to use the core default',
|
||
'config.keys.addTitle': 'Add Authentication Key',
|
||
'config.keys.editTitle': 'Edit Authentication Key',
|
||
'common.close': 'Close',
|
||
'config.keys.label': 'Authentication Key',
|
||
'config.keys.hide': 'Hide key',
|
||
'config.keys.show': 'Show key',
|
||
'config.keys.remark': 'Remark',
|
||
'config.keys.remarkPlaceholder': 'For example: Development, Alice’s key',
|
||
'config.keys.generate': 'Generate Key',
|
||
'config.keys.adding': 'Adding',
|
||
'common.add': 'Add',
|
||
'config.keys.deleteTitle': 'Delete Authentication Key',
|
||
'config.keys.deleteAllWarning': 'Deleting all keys will allow all keys by default',
|
||
'common.cancel': 'Cancel',
|
||
'common.deleting': 'Deleting',
|
||
'common.delete': 'Delete',
|
||
'authFiles.unknownProvider': 'Unknown Provider',
|
||
'authFiles.status.disabled': 'Disabled',
|
||
'authFiles.status.unavailable': 'Unavailable',
|
||
'authFiles.status.ready': 'Ready',
|
||
'authFiles.quota.loading': 'Querying quota',
|
||
'authFiles.quota.failed': 'Failed to fetch quota',
|
||
'authFiles.quota.aria': 'Quota information',
|
||
'authFiles.quota.empty': 'No quota data',
|
||
'authFiles.quota.resets': '{count} manual resets',
|
||
'authFiles.quota.expiry': 'Earliest expiry {time}',
|
||
'authFiles.models.noneForProvider': 'This provider has no configurable model definitions',
|
||
'authFiles.models.updated': 'Open models updated for {provider}',
|
||
'authFiles.priority.button': 'Priority {priority}',
|
||
'authFiles.priority.title': 'Edit Credential Priority',
|
||
'authFiles.priority.label': 'Priority',
|
||
'authFiles.priority.placeholder': 'For example, 10 or -1',
|
||
'authFiles.priority.hint': 'Integers only. Larger values have higher priority. Leave blank or enter 0 to restore the default.',
|
||
'authFiles.priority.invalid': 'Enter a valid integer priority',
|
||
'authFiles.priority.updated': 'Priority updated for {name}',
|
||
'authFiles.uploaded': 'Uploaded {count} authentication files',
|
||
'authFiles.uploadFailed': '{count} files failed to upload: {errors}',
|
||
'authFiles.notice.enabled': 'Authentication file enabled',
|
||
'authFiles.notice.disabled': 'Authentication file disabled',
|
||
'authFiles.runtimeDeleteError': 'Runtime authentication files cannot be deleted from disk',
|
||
'authFiles.deleteConfirm': 'Delete “{name}”?',
|
||
'authFiles.deleted': 'Authentication file deleted',
|
||
'authFiles.deleteAllConfirm': 'Delete all on-disk authentication files? Runtime credentials will not be deleted.',
|
||
'authFiles.deletedAll': 'All on-disk authentication files deleted',
|
||
'common.copyFailed': 'Copy failed',
|
||
'authFiles.title': 'Authentication Files',
|
||
'authFiles.summary': '{files} files · {disabled} disabled',
|
||
'common.refresh': 'Refresh',
|
||
'authFiles.clearDisk': 'Clear Disk Files',
|
||
'common.upload': 'Upload',
|
||
'authFiles.searchPlaceholder': 'Search by file name, account, or provider',
|
||
'authFiles.filter.allProviders': 'All Providers',
|
||
'authFiles.filter.allStatuses': 'All Statuses',
|
||
'authFiles.filter.enabled': 'Enabled',
|
||
'authFiles.filter.disabled': 'Disabled',
|
||
'authFiles.filter.runtime': 'Runtime Only',
|
||
'authFiles.loading': 'Loading authentication files',
|
||
'authFiles.empty.filtered': 'No matching authentication files',
|
||
'authFiles.empty.none': 'No authentication files',
|
||
'authFiles.empty.tryFilter': 'Try different filters',
|
||
'authFiles.empty.upload': 'Uploaded JSON authentication files will appear here',
|
||
'authFiles.unknownSize': 'Unknown size',
|
||
'authFiles.runtime': 'Runtime',
|
||
'authFiles.quota.querying': 'Querying',
|
||
'authFiles.quota.refresh': 'Refresh Quota',
|
||
'authFiles.quota.fetch': 'Fetch Quota',
|
||
'authFiles.models.settings': 'Configure open models',
|
||
'authFiles.models.button': 'Models',
|
||
'authFiles.copyName': 'Copy file name',
|
||
'authFiles.openDirectory': 'Open credential folder',
|
||
'common.enable': 'Enable',
|
||
'common.disable': 'Disable',
|
||
'authFiles.runtimeFootnote': '{count} credentials come from runtime storage and can only be managed through their provider or authentication source.',
|
||
'authFiles.models.title': 'Open Models',
|
||
'authFiles.models.description': '{provider} · All models are open by default; disable any you do not need',
|
||
'authFiles.models.search': 'Search model names',
|
||
'authFiles.models.summary': '{total} total · {open} open',
|
||
'authFiles.models.closeVisible': 'Close Visible',
|
||
'authFiles.models.openVisible': 'Open Visible',
|
||
'authFiles.models.openAll': 'Open All',
|
||
'authFiles.models.closeAll': 'Close All',
|
||
'authFiles.models.loading': 'Loading model definitions',
|
||
'authFiles.models.loadFailed': 'Failed to load models',
|
||
'authFiles.models.noMatch': 'No matching models',
|
||
'authFiles.models.empty': 'No model definitions',
|
||
'common.saving': 'Saving',
|
||
'authFiles.models.save': 'Save ({count} open)',
|
||
'agents.description.claudeCode': 'Uses the CPA Anthropic-compatible API',
|
||
'agents.description.claudeDesktop': 'Uses the CPA third-party inference gateway on Windows, macOS, and Linux Beta',
|
||
'agents.description.codex': 'Uses the CPA Responses API',
|
||
'agents.description.opencode': 'Uses the CPA OpenAI-compatible provider',
|
||
'agents.description.openclaw': 'Uses the CPA model provider and default model',
|
||
'agents.description.hermes': 'Uses the CPA custom provider',
|
||
'agents.list.detecting': 'Detecting',
|
||
'agents.list.unsupported': 'Unsupported on this platform',
|
||
'agents.list.notInstalled': 'Installation not detected',
|
||
'agents.list.modified': 'Modified · {model}',
|
||
'agents.list.installedVersion': 'Installed · {version}',
|
||
'agents.list.installed': 'Installed · original configuration',
|
||
'agents.model.loading': 'Loading models',
|
||
'agents.model.loadFailed': 'Failed to load models',
|
||
'agents.model.select': 'Select a model',
|
||
'agents.model.none': 'Model list is empty',
|
||
'agents.model.search': 'Search model names or aliases',
|
||
'agents.model.clearSearch': 'Clear search',
|
||
'agents.model.refresh': 'Refresh models',
|
||
'agents.model.fetching': 'Fetching models',
|
||
'agents.model.noMatch': 'No matching models',
|
||
'agents.model.unavailable': 'Model list is empty',
|
||
'agents.model.tryKeywords': 'Try different keywords',
|
||
'agents.model.connectFirst': 'Connect an available model, then refresh',
|
||
'agents.model.available': 'Available model',
|
||
'agents.model.count': '{count} available models',
|
||
'agents.model.stale': 'Refresh failed; showing the previous results',
|
||
'agents.error.modelsLoading': 'The model list is still loading. Try again shortly.',
|
||
'agents.error.noModels': 'No models are available, so configuration changes cannot be applied',
|
||
'agents.error.selectionGone': 'The selected model is no longer available. Refresh and select it again.',
|
||
'agents.error.applyFirst': 'The selected model has not been applied. Click “Apply Configuration Changes” first.',
|
||
'agents.status.detecting': 'Detecting',
|
||
'agents.status.unsupported': 'Unsupported Platform',
|
||
'agents.status.notInstalled': 'Not Installed',
|
||
'agents.status.conflict': 'Configuration Conflict',
|
||
'agents.status.modified': 'Configuration Modified',
|
||
'agents.status.original': 'Original Configuration',
|
||
'agents.status.invalid': 'Invalid Configuration',
|
||
'agents.status.applied': 'Applied',
|
||
'agents.status.unconfigured': 'Not Configured',
|
||
'agents.title': 'Agent Configuration',
|
||
'agents.redetect': 'Detect Again',
|
||
'agents.tabs.label': 'Agent configuration sections',
|
||
'agents.tabs.core': 'Core Configuration',
|
||
'agents.tabs.sessions': 'Session Management',
|
||
'agents.sessions.title': 'Codex Session Management',
|
||
'agents.sessions.description': 'Scan local Codex sessions and safely restore historical sessions, back them up, or delete them.',
|
||
'agents.sessions.refresh': 'Refresh',
|
||
'agents.sessions.currentPage': 'Current page',
|
||
'agents.sessions.active': 'Active',
|
||
'agents.sessions.archived': 'Archived',
|
||
'agents.sessions.database': 'Database source',
|
||
'agents.sessions.databaseMissing': 'No session database found',
|
||
'agents.sessions.repairTitle': 'Restore Historical Sessions',
|
||
'agents.sessions.repairDescription': 'Sync sessions from other providers to the current session provider.',
|
||
'agents.sessions.autoRepair': 'Automatically restore historical sessions',
|
||
'agents.sessions.settingLoading': 'Loading',
|
||
'agents.sessions.settingOn': 'On',
|
||
'agents.sessions.settingOff': 'Off',
|
||
'agents.sessions.settingLoadFailed': 'Failed to load the automatic-restoration setting: {error}',
|
||
'agents.sessions.applyManagedFirst': 'Apply the managed CPA configuration for Codex first',
|
||
'agents.sessions.repairNow': 'Restore now',
|
||
'agents.sessions.repairing': 'Restoring',
|
||
'agents.sessions.loadFailed': 'Failed to load Codex sessions: {error}',
|
||
'agents.sessions.localSessions': 'Local sessions',
|
||
'agents.sessions.pageDescription': 'Page {page} · up to {size} items per page',
|
||
'agents.sessions.selected': '{count} selected',
|
||
'agents.sessions.selectAll': 'Select this page',
|
||
'agents.sessions.clearSelection': 'Clear selection',
|
||
'agents.sessions.deleteSelected': 'Delete selected',
|
||
'agents.sessions.multiSelect': 'Select multiple',
|
||
'agents.sessions.loading': 'Scanning local sessions…',
|
||
'agents.sessions.empty': 'No Codex sessions were found.',
|
||
'agents.sessions.selectSession': 'Select session {title}',
|
||
'agents.sessions.untitled': 'Untitled session',
|
||
'agents.sessions.noProject': 'No project path',
|
||
'agents.sessions.noProvider': 'Unknown provider',
|
||
'agents.sessions.noTime': 'Unknown update time',
|
||
'agents.sessions.activeBadge': 'Active',
|
||
'agents.sessions.archivedBadge': 'Archived',
|
||
'agents.sessions.previousPage': 'Previous page',
|
||
'agents.sessions.nextPage': 'Next page',
|
||
'agents.sessions.pageNumber': 'Page {page}',
|
||
'agents.sessions.deleteOneTitle': 'Delete this session?',
|
||
'agents.sessions.deleteManyTitle': 'Delete {count} sessions?',
|
||
'agents.sessions.deleteOneDescription': 'A backup will be created before “{title}” and its known related records are deleted. There is no in-app undo.',
|
||
'agents.sessions.deleteManyDescription': 'A backup will be created before these {count} sessions and their known related records are deleted: {preview}{extra}',
|
||
'agents.sessions.deleteMore': ', plus {count} more',
|
||
'agents.sessions.confirmDelete': 'Back up and delete',
|
||
'agents.sessions.deleteResult': 'Deleted {deleted}; failed {failed}. {details}{backup}',
|
||
'agents.sessions.deleteFailed': 'Failed to delete sessions: {error}',
|
||
'agents.sessions.backupAt': 'Backup: {path}',
|
||
'agents.sessions.settingFailed': 'Failed to save the automatic-restoration setting: {error}',
|
||
'agents.sessions.repairResult': 'Historical sessions restored to {provider}: migrated {files} rollout files, updated {rows} database rows, and skipped {skipped} locked files.',
|
||
'agents.sessions.repairFailed': 'Failed to restore historical sessions: {error}',
|
||
'agents.sessions.progressCount': '{processed}/{total}',
|
||
'agents.sessions.progress.scanning': 'Scanning sessions',
|
||
'agents.sessions.progress.backingUp': 'Creating backup',
|
||
'agents.sessions.progress.rewriting': 'Migrating historical sessions',
|
||
'agents.sessions.progress.updatingDatabase': 'Synchronizing databases',
|
||
'agents.sessions.progress.complete': 'Restoration complete',
|
||
'agents.sessions.scanIndex': 'Check invalid session records',
|
||
'agents.sessions.scanningIndex': 'Checking invalid records',
|
||
'agents.sessions.cleanupNoCandidates': 'No safely removable invalid session records were found.',
|
||
'agents.sessions.cleanupPreviewFailed': 'Failed to check invalid session records: {error}',
|
||
'agents.sessions.cleanupTitle': 'Removable invalid index entries',
|
||
'agents.sessions.cleanupDescription': 'Found {count} records that exist only in session_index.jsonl and no longer have a real session source. Nothing is selected by default. Exit Codex and ChatGPT, then confirm each item to remove. Unknown record formats are preserved.',
|
||
'agents.sessions.cleanupSelectAll': 'Select all candidates',
|
||
'agents.sessions.cleanupConfirm': 'Remove {count} selected',
|
||
'agents.sessions.cleanupResult': 'Removed {count} invalid session index entries. {backup}',
|
||
'agents.sessions.cleanupFailed': 'Failed to remove invalid session index entries: {error}',
|
||
'agents.localClients': 'Local Clients',
|
||
'agents.selectClient': 'Select an agent to manage',
|
||
'agents.installStatus': 'Installation Status',
|
||
'agents.clientDetected': 'Client detected',
|
||
'agents.clientNotDetected': 'Client not detected',
|
||
'agents.clientVersion': 'Client Version',
|
||
'agents.notFetched': 'Not available',
|
||
'agents.useModel': 'Model',
|
||
'agents.pending': 'Not Applied',
|
||
'agents.model.readingAvailable': 'Loading available models',
|
||
'agents.model.current': 'Currently applied: {model}',
|
||
'agents.model.firstSelection': '{count} models available; the first is selected by default',
|
||
'agents.modify.title': 'Configuration Changes',
|
||
'agents.modify.oauthConfiguration': 'OAuth configuration mode',
|
||
'agents.oauthLoginRequired.title': 'Codex sign-in required',
|
||
'agents.oauthLoginRequired.enableDescription': 'No valid Codex sign-in credentials were found, so OAuth configuration mode cannot be enabled. Sign in to your ChatGPT account in the Codex app. If the Codex app cannot trigger sign-in, use',
|
||
'agents.oauthLoginRequired.enableClearConfiguration': 'Clear Configuration',
|
||
'agents.oauthLoginRequired.enableDescriptionSuffix': 'first.',
|
||
'agents.oauthLoginRequired.applyDescription': 'OAuth configuration cannot be applied because no valid Codex sign-in credentials were found. Sign in to your ChatGPT account in Codex, then apply the configuration.',
|
||
'agents.oauthLoginRequired.launchDescription': 'OAuth configuration mode is enabled, but no valid Codex sign-in credentials were found. Sign in to your ChatGPT account in Codex before launching it.',
|
||
'agents.oauthLoginRequired.confirm': 'Got it',
|
||
'agents.modify.apply': 'Apply Configuration Changes',
|
||
'agents.modify.default': 'Default Configuration',
|
||
'agents.modify.clear': 'Clear Configuration',
|
||
'agents.modify.invalid': 'The current configuration cannot be parsed. Apply Configuration Changes rebuilds a minimal valid configuration; Default Configuration resets the whole file.',
|
||
'agents.modify.applied': 'The fields managed by the app are applied; all other user content remains unchanged.',
|
||
'agents.launch.enableFirst': 'Apply the configuration changes first',
|
||
'agents.launch.applyFirst': 'Apply the selected model first',
|
||
'agents.launch.starting': 'Starting',
|
||
'agents.launch.startCli': 'Start CLI',
|
||
'agents.launch.startApp': 'Start App',
|
||
'agents.launch.start': 'Start {target}',
|
||
'agents.launch.unavailable': 'Cannot Start',
|
||
'agents.launch.closeChatgpt': 'Close ChatGPT App',
|
||
'agents.launch.closingChatgpt': 'Closing',
|
||
'agents.default.title': 'Reset to Default Configuration',
|
||
'agents.default.description': 'This rewrites every related {name} configuration file using the selected model and deletes all other user content in those files. No backup is created and the operation cannot be undone.',
|
||
'agents.default.confirm': 'Write Default Configuration',
|
||
'agents.clear.title': 'Clear Codex Configuration',
|
||
'agents.clear.description': 'This permanently deletes auth.json and config.toml from the Codex configuration directory and resets the application state tracked by this app. No backup is created and the operation cannot be undone.',
|
||
'agents.clear.confirm': 'Clear Configuration',
|
||
'agents.clear.success': 'The Codex configuration has been cleared.',
|
||
'agents.closeApp.title': 'Close ChatGPT App',
|
||
'agents.closeApp.description': 'This closes all running ChatGPT App processes and their child processes on this computer. In-progress responses or unsaved state may be lost.',
|
||
'agents.closeApp.confirm': 'Close App',
|
||
'agents.closeApp.success': 'ChatGPT App was closed ({count} processes).',
|
||
'agents.closeApp.notRunning': 'ChatGPT App is not running.',
|
||
'apiAccess.compatibleName': 'OpenAI Compatible {number}',
|
||
'apiAccess.error.headerMissingColon': 'Custom header line {number} is missing a colon',
|
||
'apiAccess.error.headerInvalid': 'Custom header line {number} is invalid',
|
||
'apiAccess.error.partialLoad': 'Some connections could not be loaded: {errors}',
|
||
'apiAccess.error.requiredAll': 'Remark, Base URL, and key are required',
|
||
'apiAccess.error.requiredBaseKey': 'Base URL and API key are required',
|
||
'apiAccess.error.requiredKey': 'API key is required',
|
||
'apiAccess.error.baseRequired': 'A Base URL is required for {provider}',
|
||
'apiAccess.error.noModels': 'No models were discovered. Check the Base URL and API key.',
|
||
'apiAccess.error.stale': 'The connection configuration changed elsewhere. Refresh and try again.',
|
||
'apiAccess.error.duplicate': 'An identical connection already exists',
|
||
'apiAccess.error.remarkInvalid': 'The remark cannot exceed 80 characters or contain line breaks or control characters',
|
||
'apiAccess.notice.updated': 'Connection updated',
|
||
'apiAccess.notice.added': 'Connection added',
|
||
'apiAccess.deleteConfirm': 'Delete “{remark}”?',
|
||
'apiAccess.notice.deleted': 'Connection deleted',
|
||
'apiAccess.notice.enabled': 'Connection enabled',
|
||
'apiAccess.notice.disabled': 'Connection disabled',
|
||
'apiAccess.title': 'API Access',
|
||
'apiAccess.count': '{count} connections',
|
||
'apiAccess.add': 'Add',
|
||
'apiAccess.matches': '{count} matching connections',
|
||
'apiAccess.search': 'Search remarks, keys, or addresses',
|
||
'apiAccess.loading': 'Loading configuration',
|
||
'apiAccess.empty.filtered': 'No matching connections',
|
||
'apiAccess.empty.none': 'No API connections',
|
||
'apiAccess.empty.tryKeyword': 'Try a different keyword',
|
||
'apiAccess.empty.addFirst': 'Click “Add” in the upper-right to create your first connection',
|
||
'apiAccess.keys.count': '{count} keys',
|
||
'apiAccess.keys.summary': '{key} · {count} keys total',
|
||
'apiAccess.remarkValue': 'Remark: {remark}',
|
||
'apiAccess.defaultUrl': 'Using default address',
|
||
'apiAccess.models.summary': '{count} models · {models}',
|
||
'apiAccess.priorityValue': 'Priority {priority}',
|
||
'apiAccess.runtimeCredential': 'Runtime credential {index}…',
|
||
'apiAccess.enable': 'Enable connection',
|
||
'apiAccess.disable': 'Disable connection',
|
||
'apiAccess.status.disabled': 'Disabled',
|
||
'apiAccess.status.enabled': 'Enabled',
|
||
'apiAccess.toggleAria': '{remark} connection {action} switch',
|
||
'common.edit': 'Edit',
|
||
'apiAccess.error.enterBaseUrl': 'Enter a Base URL first',
|
||
'apiAccess.error.noAvailableModels': 'No available models found',
|
||
'apiAccess.error.baseBeforeModels': 'Enter a Base URL before fetching models',
|
||
'apiAccess.models.selected': '{count} models selected',
|
||
'apiAccess.models.restricted': 'Model restrictions configured',
|
||
'apiAccess.models.autoAll': 'All models will be opened by default when saved',
|
||
'apiAccess.models.upstreamDefault': 'Using upstream default models',
|
||
'apiAccess.models.hiddenHint': 'Unchecked models will be hidden from the available model list',
|
||
'apiAccess.models.autoHint': 'Models are fetched automatically when saving; you can deselect unneeded items in advance',
|
||
'apiAccess.models.allHint': 'All upstream models are currently open',
|
||
'apiAccess.dialog.edit': 'Edit API Connection',
|
||
'apiAccess.dialog.add': 'Add API Connection',
|
||
'apiAccess.field.keysMany': 'API Keys (one per line)',
|
||
'apiAccess.field.key': 'API Key',
|
||
'apiAccess.field.remark': 'Remark',
|
||
'apiAccess.remarkPlaceholder': 'For example, Production or Team primary account',
|
||
'apiAccess.baseRequiredPlaceholder': 'Required, for example https://api.example.com',
|
||
'apiAccess.baseOptionalPlaceholder': 'Optional; leave blank to use the default address',
|
||
'apiAccess.preset.title': 'OpenAI-Compatible Preset',
|
||
'apiAccess.preset.description': 'The official DeepSeek address is prefilled; all discovered models are opened when saved',
|
||
'apiAccess.thinking.builtIn': 'Built-in Reasoning Levels',
|
||
'apiAccess.thinking.builtInDescription': 'Applied automatically to all currently open models',
|
||
'apiAccess.thinking.title': 'Reasoning Levels',
|
||
'apiAccess.thinking.description': 'Add levels supported by the upstream provider',
|
||
'apiAccess.thinking.placeholder': 'For example: low, medium, or a custom level',
|
||
'apiAccess.thinking.add': 'Add',
|
||
'apiAccess.thinking.delete': 'Delete {level}',
|
||
'apiAccess.thinking.deleteAria': 'Delete reasoning level {level}',
|
||
'apiAccess.thinking.empty': 'thinking.levels is omitted when no levels are added',
|
||
'apiAccess.models.title': 'Models',
|
||
'apiAccess.models.description': 'Checked models are open; uncheck a model to hide it from the list',
|
||
'apiAccess.models.fetch': 'Fetch Models',
|
||
'apiAccess.field.priority': 'Priority',
|
||
'common.optional': 'Optional',
|
||
'apiAccess.advanced': 'Advanced Settings',
|
||
'apiAccess.field.prefix': 'Model Prefix',
|
||
'apiAccess.prefixPlaceholder': 'Optional, for example team-a',
|
||
'apiAccess.field.headers': 'Custom Headers (one Name: Value per line)',
|
||
'apiAccess.field.excludedModels': 'Excluded Models (one per line; wildcards supported)',
|
||
'apiAccess.field.testModel': 'Test Model',
|
||
'apiAccess.cloak.mode': 'Claude Cloaking Mode',
|
||
'apiAccess.cloak.default': 'Default (auto)',
|
||
'apiAccess.cloak.words': 'Cloaking Keywords (one per line)',
|
||
'apiAccess.cloak.strict': 'Strict Mode',
|
||
'apiAccess.cloak.strictDescription': 'Keep only the Claude Code system prompt',
|
||
'apiAccess.cloak.enableStrict': 'Enable strict mode',
|
||
'apiAccess.cloak.cacheUser': 'Cache User ID',
|
||
'apiAccess.cloak.cacheUserDescription': 'Reuse the cloaked user identifier',
|
||
'apiAccess.websocket.description': 'Enable WebSocket for this Codex connection',
|
||
'apiAccess.websocket.enable': 'Enable WebSocket',
|
||
'apiAccess.cooling.title': 'Disable Cooldown',
|
||
'apiAccess.cooling.description': 'Allow this connection to remain selectable after upstream rate limiting',
|
||
'common.save': 'Save',
|
||
'apiAccess.modelDialog.title': 'Select Models',
|
||
'apiAccess.modelDialog.summary': '{found} found · {selected} selected',
|
||
'apiAccess.modelDialog.deselectAll': 'Deselect All',
|
||
'apiAccess.modelDialog.selectVisible': 'Select Visible',
|
||
'common.clear': 'Clear',
|
||
'apiAccess.modelDialog.fetching': 'Fetching models',
|
||
'apiAccess.modelDialog.fetchFailed': 'Failed to fetch models',
|
||
'apiAccess.modelDialog.noMatch': 'No matching models',
|
||
'apiAccess.modelDialog.none': 'No models found',
|
||
'apiAccess.modelDialog.tryKeyword': 'Try a different keyword',
|
||
'apiAccess.modelDialog.checkCredentials': 'Check the Base URL and API key',
|
||
'apiAccess.modelDialog.apply': 'Apply Selection ({count})',
|
||
'kernel.install.completed': '{version} installed',
|
||
'kernel.error.progressListener': 'Failed to listen for download progress: {error}',
|
||
'kernel.action.start': 'start',
|
||
'kernel.action.stop': 'stop',
|
||
'kernel.action.restart': 'restart',
|
||
'kernel.notice.actionSuccess': 'Core {action} succeeded',
|
||
'kernel.notice.actionFailed': 'Core {action} failed: {error}',
|
||
'kernel.notice.networkRestarted': 'Network settings saved and the core restarted',
|
||
'kernel.notice.networkRestartFailed': 'Network settings saved, but the core failed to restart',
|
||
'kernel.notice.networkNextStart': 'Network settings saved and will take effect the next time the core starts',
|
||
'kernel.notice.networkSaveFailed': 'Failed to save network settings: {error}',
|
||
'kernel.error.port': 'The port must be between 1 and 65535',
|
||
'kernel.error.installTask': 'Failed to read the installation task: {error}',
|
||
'kernel.install.installingVersion': 'Installing {version}',
|
||
'kernel.phase.preparingDownload': 'Preparing Download',
|
||
'kernel.phase.downloading': 'Downloading',
|
||
'kernel.phase.extracting': 'Extracting',
|
||
'kernel.phase.completed': 'Installation Complete',
|
||
'kernel.install.installingBundled': 'Installing bundled core {version}',
|
||
'kernel.phase.preparingBundled': 'Preparing Bundled Core',
|
||
'kernel.install.bundledCompleted': 'Bundled core {version} installed',
|
||
'kernel.phase.failed': 'Installation Failed',
|
||
'kernel.phase.cancelled': 'Canceled',
|
||
'kernel.install.cancelling': 'Canceling download',
|
||
'kernel.notice.copyFailed': 'Failed to copy access information',
|
||
'kernel.error.openUpdate': 'Failed to open the update page: {error}',
|
||
'kernel.progress.completed': 'Completed',
|
||
'kernel.progress.extracting': 'Extracting files',
|
||
'kernel.progress.waiting': 'Waiting for progress information',
|
||
'kernel.status.running': 'Running',
|
||
'kernel.status.stopped': 'Stopped',
|
||
'kernel.status.notInstalled': 'Not Installed',
|
||
'common.detectionFailed': 'Detection Failed',
|
||
'common.detecting': 'Detecting',
|
||
'kernel.update.failedRetry': 'Check failed; retry',
|
||
'kernel.update.toVersion': 'Update to {version}',
|
||
'kernel.update.checking': 'Checking',
|
||
'kernel.update.failed': 'Check Failed',
|
||
'kernel.update.notChecked': 'Not Checked',
|
||
'kernel.update.statusChecking': 'Checking',
|
||
'kernel.update.notYetChecked': 'Not Checked Yet',
|
||
'kernel.update.latest': 'Up to Date',
|
||
'kernel.update.available': 'New Version Available',
|
||
'appUpdate.eyebrow': 'App Update',
|
||
'appUpdate.title': 'Application Version',
|
||
'appUpdate.current': 'Current Version',
|
||
'appUpdate.latest': 'Latest Version',
|
||
'appUpdate.status': 'Update Status',
|
||
'appUpdate.manualFallback': 'If detection fails, update manually from the GitHub page',
|
||
'appUpdate.upToDate': 'Up to Date',
|
||
'appUpdate.available': 'Version {version} is available',
|
||
'appUpdate.check': 'Check for Updates',
|
||
'appUpdate.checking': 'Checking',
|
||
'appUpdate.catalog.label': 'Codex Model Catalog',
|
||
'appUpdate.catalog.description': 'Silently syncs from GitHub when the app starts',
|
||
'appUpdate.catalog.update': 'Sync Model Catalog',
|
||
'appUpdate.catalog.updateHint': 'Check GitHub and update the Codex model catalog',
|
||
'appUpdate.catalog.updating': 'Syncing Model Catalog',
|
||
'appUpdate.catalog.updated': 'Model catalog synced from GitHub',
|
||
'appUpdate.catalog.unchanged': 'Model catalog is already up to date',
|
||
'appUpdate.installNow': 'Update Now',
|
||
'appUpdate.openRelease': 'Open Download Page',
|
||
'appUpdate.confirmTitle': 'Install Application Update',
|
||
'appUpdate.confirmDescription': 'Version {version} will be downloaded and installed. The app will restart, and a managed core will briefly stop and resume.',
|
||
'appUpdate.progressTitle': 'Updating Application',
|
||
'appUpdate.cancelDownload': 'Cancel Download',
|
||
'appUpdate.badgeAvailable': 'Application version {version} is available',
|
||
'appUpdate.phase.idle': 'Waiting',
|
||
'appUpdate.phase.checking': 'Checking',
|
||
'appUpdate.phase.available': 'Update Available',
|
||
'appUpdate.phase.downloading': 'Downloading',
|
||
'appUpdate.phase.verifying': 'Verifying',
|
||
'appUpdate.phase.staging': 'Preparing Update',
|
||
'appUpdate.phase.waitingForExit': 'Waiting for App to Exit',
|
||
'appUpdate.phase.restarting': 'Restarting',
|
||
'appUpdate.phase.completed': 'Update Complete',
|
||
'appUpdate.phase.cancelled': 'Download Canceled',
|
||
'appUpdate.phase.failed': 'Update Failed',
|
||
'kernel.install.inProgress': 'Installing',
|
||
'kernel.install.githubFailed': 'Cannot connect to GitHub. Use Offline Install.',
|
||
'kernel.install.titleCancelling': 'Canceling Download',
|
||
'kernel.install.titleInstalling': 'Installing Core',
|
||
'kernel.install.titleCompleted': 'Installation Complete',
|
||
'kernel.install.titleCancelled': 'Download Canceled',
|
||
'kernel.install.titleFailed': 'Installation Failed',
|
||
'kernel.install.waitingStop': 'Waiting for the download task to stop',
|
||
'kernel.install.taskRunning': 'Installation task in progress',
|
||
'kernel.install.cancellingShort': 'Canceling',
|
||
'kernel.install.cancel': 'Cancel Download',
|
||
'common.processing': 'Processing',
|
||
'kernel.overview.coreStatus': 'Core Status',
|
||
'kernel.overview.appVersion': 'App Version',
|
||
'kernel.update.openGithub': 'Open the latest release on GitHub',
|
||
'kernel.overview.coreVersion': 'Core Version',
|
||
'kernel.control.title': 'Runtime Control',
|
||
'kernel.control.installStatus': 'Installation Status',
|
||
'kernel.control.installed': 'Installed',
|
||
'kernel.control.runStatus': 'Runtime Status',
|
||
'kernel.control.pid': 'Process PID',
|
||
'kernel.control.notRunning': 'Not Running',
|
||
'kernel.control.noPid': 'None',
|
||
'kernel.control.allowLan': 'Allow LAN',
|
||
'kernel.control.lanRestartHint': 'Changing this automatically restarts a running core',
|
||
'kernel.control.allowLanAria': 'Allow LAN access',
|
||
'kernel.control.port': 'Port',
|
||
'kernel.control.portPlaceholder': 'Port number',
|
||
'kernel.control.portRange': 'Port range: 1–65535',
|
||
'kernel.notice.stopped': 'Core stopped',
|
||
'kernel.notice.started': 'Core started',
|
||
'kernel.notice.restarted': 'Core restarted',
|
||
'kernel.control.refresh': 'Refresh Status',
|
||
'kernel.versions.title': 'Core Version Management',
|
||
'kernel.versions.offlineHint': 'If GitHub is unavailable, use Offline Install to install the bundled core.',
|
||
'kernel.versions.current': 'Current Version',
|
||
'kernel.versions.latest': 'Latest Version',
|
||
'kernel.versions.bundled': 'Bundled Version',
|
||
'kernel.versions.notIncluded': 'Not Included',
|
||
'kernel.versions.platform': 'Platform',
|
||
'kernel.versions.updateStatus': 'Update Status',
|
||
'kernel.versions.check': 'Check for Updates',
|
||
'kernel.versions.installVersion': 'Install {version}',
|
||
'kernel.versions.installLatest': 'Install Latest',
|
||
'kernel.versions.reinstallTitle': 'Reinstall the current version',
|
||
'kernel.versions.reinstall': 'Reinstall',
|
||
'kernel.versions.noBundled': 'This release does not include a bundled core',
|
||
'kernel.versions.offlineInstall': 'Offline Install',
|
||
'kernel.access.firstKey': 'First key',
|
||
'kernel.access.noConfiguredKey': 'No key is configured; all keys are currently allowed by default',
|
||
'kernel.access.connectable': 'Connectable',
|
||
'kernel.access.waiting': 'Waiting for core startup',
|
||
'kernel.access.localUrl': 'Local URL',
|
||
'kernel.access.localCopied': '{name} local URL copied',
|
||
'kernel.access.copyLocal': 'Copy {name} local URL',
|
||
'kernel.access.lanUrl': 'LAN URL',
|
||
'kernel.access.detectingIp': 'Detecting LAN IP',
|
||
'kernel.access.noIp': 'No LAN IP detected',
|
||
'kernel.access.lanCopied': '{name} LAN URL copied',
|
||
'kernel.access.copyLan': 'Copy {name} LAN URL',
|
||
'kernel.dialog.install': 'Core Installation',
|
||
'kernel.dialog.phase': 'Current Phase',
|
||
'kernel.dialog.unknownProgress': 'Progress Unknown',
|
||
'kernel.access.openaiDescription': 'OpenAI-compatible format',
|
||
'kernel.access.claudeDescription': 'Anthropic-compatible format',
|
||
'kernel.access.geminiDescription': 'Gemini-compatible format',
|
||
'authFiles.unnamed': 'Unnamed credential file',
|
||
'management.notConfigured': 'Not configured',
|
||
'management.error.upstream': 'Upstream request failed',
|
||
'management.error.upstreamHttp': 'Upstream returned HTTP {status}',
|
||
'model.error.invalidBaseUrl': 'Base URL is invalid. Enter a URL such as https://api.example.com',
|
||
'model.error.unsupportedBaseUrl': 'Base URL must use http:// or https://',
|
||
'model.error.baseUrlRequired': 'Enter a Base URL first',
|
||
'model.error.noResponse': 'The models endpoint did not respond',
|
||
'quota.service.relative.daysHours': 'in {days}d {hours}h',
|
||
'quota.service.relative.days': 'in {days}d',
|
||
'quota.service.relative.hoursMinutes': 'in {hours}h {minutes}m',
|
||
'quota.service.relative.hours': 'in {hours}h',
|
||
'quota.service.relative.minutes': 'in {minutes}m',
|
||
'quota.service.duration.unknown': 'Unknown window',
|
||
'quota.service.duration.days': '{count} days',
|
||
'quota.service.duration.hours': '{count} hours',
|
||
'quota.service.duration.minutes': '{count} minutes',
|
||
'quota.service.duration.seconds': '{count} seconds',
|
||
'quota.service.limit.fiveHours': '5-hour limit',
|
||
'quota.service.limit.week': 'Weekly limit',
|
||
'quota.service.limit.month': 'Monthly limit',
|
||
'quota.service.limit.duration': '{duration} limit',
|
||
'quota.service.codeReview': 'Code review',
|
||
'quota.service.additional': 'Additional {index}',
|
||
'quota.service.window.fiveHour': '5-hour window',
|
||
'quota.service.window.sevenDay': '7-day window',
|
||
'quota.service.window.sevenDayOAuth': '7-day OAuth apps window',
|
||
'quota.service.window.sevenDayOpus': '7-day Opus window',
|
||
'quota.service.window.sevenDaySonnet': '7-day Sonnet window',
|
||
'quota.service.window.sevenDayCowork': '7-day Cowork window',
|
||
'quota.service.window.duration': '{duration} window',
|
||
'quota.service.extraUsage': 'Extra usage',
|
||
'quota.service.usedOf': 'Used {used} / {limit}',
|
||
'quota.service.weekly': 'Weekly quota',
|
||
'quota.service.limit.numbered': 'Limit {index}',
|
||
'quota.service.product.numbered': 'Product {index}',
|
||
'quota.service.monthlyIncluded': 'Monthly included quota',
|
||
'quota.service.onDemand': 'On-demand quota',
|
||
'quota.service.quota': 'Quota',
|
||
'quota.service.quota.numbered': 'Quota {index}',
|
||
'quota.service.error.missingAuthIndex': 'Missing auth-index; quota cannot be queried',
|
||
'quota.service.error.missingProject': 'Missing Antigravity project ID',
|
||
'quota.service.error.antigravityEmpty': 'Antigravity succeeded but returned no recognizable quota groups',
|
||
'quota.service.error.upstreamEmpty': 'Upstream returned empty quota data',
|
||
'quota.service.error.noResponse': 'The quota endpoint did not respond',
|
||
'quota.service.error.missingResetAuthIndex': 'Missing auth-index; reset credits cannot be queried',
|
||
'quota.service.error.unsupportedProvider': 'Quota queries are not supported for this provider',
|
||
'quota.service.error.unrecognized': 'Upstream returned quota data in an unrecognized format',
|
||
'quota.service.error.codexResetOnly': 'Only Codex credentials support reset credits',
|
||
'quota.service.error.missingConsumeAuthIndex': 'Missing auth-index; the reset credit cannot be used',
|
||
};
|
||
|
||
export const zhTW: Record<MessageKey, string> = createTraditionalMessages(zhCN);
|
||
export const ja: Record<MessageKey, string> = { ...en, ...jaOverrides };
|