Files
EasyCLIProxyAPI/src/i18n/resources.ts
T

1704 lines
95 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.
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 };