Settings gains a second service button next to restart: stop every managed local model server and exit the gateway process (nothing is respawned; in Docker the restart policy decides). The SPA replaces itself with a static "gateway is off" screen since the API is gone. The restart button is relabeled "Restart everything" to say what it always did — the gateway re-execs itself and managed servers come back with it. Translated in all seven languages.
654 lines
34 KiB
JavaScript
Vendored
654 lines
34 KiB
JavaScript
Vendored
// 简体中文 — Simplified Chinese translation. Keys must match en.js exactly.
|
||
export default {
|
||
// brand / common
|
||
"brand.sub": "网关",
|
||
"common.loading": "加载中…",
|
||
"common.save": "保存",
|
||
"common.saving": "保存中…",
|
||
"common.cancel": "取消",
|
||
"common.add": "添加",
|
||
"common.edit": "编辑",
|
||
"common.delete": "删除",
|
||
"common.close": "关闭",
|
||
"common.test": "测试",
|
||
"common.copy": "复制",
|
||
"common.copied": "已复制",
|
||
"common.confirm": "确认",
|
||
"common.none": "无",
|
||
"common.saved": "已保存",
|
||
"common.error": "错误",
|
||
"common.ok": "确定",
|
||
"common.refresh": "刷新",
|
||
"common.actions": "操作",
|
||
"common.optional": "可选",
|
||
"common.search": "搜索",
|
||
"common.all": "全部",
|
||
|
||
// nav
|
||
"nav.dashboard": "仪表盘",
|
||
"nav.models": "模型",
|
||
"nav.routing": "路由",
|
||
"nav.protocols": "协议",
|
||
"nav.keys": "API 密钥",
|
||
"nav.playground": "沙盒",
|
||
"nav.settings": "设置",
|
||
"nav.foot": "网关 · v{v}",
|
||
"nav.billing": "路由器密钥与充值",
|
||
|
||
// topbar / status
|
||
"status.router": "路由器",
|
||
"status.gateway": "网关",
|
||
"status.online": "在线",
|
||
"status.offline": "离线",
|
||
"status.checking": "检测中…",
|
||
"status.noKey": "无密钥",
|
||
"theme.toggle": "主题",
|
||
"logout": "退出",
|
||
|
||
// login
|
||
"login.title": "allaigate Gateway",
|
||
"login.subtitle": "输入管理员令牌以管理此网关。",
|
||
"login.token": "管理员令牌",
|
||
"login.tokenPlaceholder": "粘贴管理员令牌",
|
||
"login.submit": "进入控制台",
|
||
"login.hint": "令牌将在网关启动日志中打印,或通过 [admin].token_env 设置。",
|
||
"login.failed": "无效的管理员令牌。",
|
||
|
||
// dashboard
|
||
"dash.title": "仪表盘",
|
||
"dash.subtitle": "模型池的实时流量、费用与路由分析。",
|
||
"dash.range": "时间范围",
|
||
"dash.range.1h": "1小时",
|
||
"dash.range.24h": "24小时",
|
||
"dash.range.7d": "7天",
|
||
"dash.kpi.requests": "请求数",
|
||
"dash.kpi.tokens": "Token 数",
|
||
"dash.kpi.cost": "费用",
|
||
"dash.kpi.latency": "平均延迟",
|
||
"dash.kpi.success": "成功率",
|
||
"dash.kpi.failovers": "故障转移",
|
||
"dash.series.title": "请求趋势",
|
||
"dash.series.cost": "费用趋势",
|
||
"dash.series.empty": "此时间段内暂无流量。",
|
||
"dash.breakdown.title": "明细",
|
||
"dash.groupby.model": "按模型",
|
||
"dash.groupby.tier": "按层级",
|
||
"dash.groupby.label": "按任务",
|
||
"dash.groupby.account": "按账号",
|
||
"dash.recent.title": "最近请求",
|
||
"dash.recent.empty": "暂无请求记录,请前往沙盒测试。",
|
||
"dash.col.time": "时间",
|
||
"dash.col.model": "模型",
|
||
"dash.col.tier": "层级",
|
||
"dash.col.task": "任务",
|
||
"dash.col.tokens": "Token",
|
||
"dash.col.cost": "费用",
|
||
"dash.col.latency": "延迟",
|
||
"dash.col.outcome": "结果",
|
||
"dash.col.requests": "请求数",
|
||
"dash.col.errors": "错误数",
|
||
"dash.health.title": "健康状态",
|
||
"dash.health.reachable": "可达",
|
||
"dash.health.unreachable": "不可达",
|
||
"dash.health.getKey": "获取路由器密钥",
|
||
|
||
// models
|
||
"models.title": "模型",
|
||
"models.subtitle": "模型池——本地低成本模型与云端 API 混合部署。",
|
||
"models.add": "添加模型",
|
||
"models.empty": "暂无模型,请添加第一个模型。",
|
||
"models.col.id": "ID",
|
||
"models.col.provider": "提供商",
|
||
"models.col.model": "模型",
|
||
"models.col.tier": "费用层级",
|
||
"models.col.key": "密钥",
|
||
"models.col.caps": "能力",
|
||
"models.col.price": "价格(输入/输出)",
|
||
"models.probe": "探测",
|
||
"models.probe.ok": "可达({ms} ms)",
|
||
"models.probe.fail": "失败:{err}",
|
||
"models.form.addTitle": "添加模型",
|
||
"models.form.editTitle": "编辑模型",
|
||
"models.form.id": "ID",
|
||
"models.form.idHint": "路由中使用的唯一 ID,例如 local-qwen",
|
||
"models.form.provider": "提供商",
|
||
"models.form.baseUrl": "Base URL",
|
||
"models.form.model": "模型名称",
|
||
"models.form.kind": "类型",
|
||
"models.form.costTier": "费用层级",
|
||
"models.form.priceIn": "输入价格($/1M)",
|
||
"models.form.priceOut": "输出价格($/1M)",
|
||
"models.form.apiKeyEnv": "API 密钥环境变量名",
|
||
"models.form.apiKeyEnvHint": "持有该提供商密钥的环境变量或存储机密名称。",
|
||
"models.form.caps": "能力",
|
||
"models.form.secret": "密钥值",
|
||
"models.form.secretStored": "已存储",
|
||
"models.form.secretEnv": "来自环境变量",
|
||
"models.form.secretMissing": "未设置",
|
||
"models.form.secretPlaceholder": "设置或替换密钥(只写)",
|
||
"models.deleteConfirm": "删除模型 \"{id}\"?",
|
||
|
||
// routing
|
||
"routing.title": "路由",
|
||
"routing.subtitle": "将复杂度层级映射到有序模型列表(优先级 = 回退顺序)。",
|
||
"routing.default": "默认模型",
|
||
"routing.defaultHint": "路由器不可达时使用。",
|
||
"routing.tiers": "层级",
|
||
"routing.tierHint": "拖动标签重新排序;第一个为首选,其余为回退。",
|
||
"routing.addModel": "+ 添加",
|
||
"routing.addTier": "添加层级",
|
||
"routing.tierName": "层级名称",
|
||
"routing.policy": "策略",
|
||
"routing.policy.mode": "模式",
|
||
"routing.policy.fixed": "固定表",
|
||
"routing.policy.costAware": "成本感知",
|
||
"routing.policy.maxCost": "单请求最大费用($)",
|
||
"routing.policy.minClass": "每层最低等级",
|
||
"routing.empty": "暂无可用模型,请先添加模型。",
|
||
|
||
// protocols
|
||
"protocols.title": "协议",
|
||
"protocols.subtitle": "仅启用所需的入站 API 接口,切换立即生效。",
|
||
"protocols.implemented": "已实现",
|
||
"protocols.planned": "计划中",
|
||
"protocols.openai_chat": "OpenAI Chat Completions",
|
||
"protocols.openai_chat.d": "POST /v1/chat/completions — 兼容 OpenAI SDK、LangChain、crewAI。",
|
||
"protocols.openai_completions": "OpenAI Completions(旧版)",
|
||
"protocols.openai_completions.d": "POST /v1/completions — 旧版集成。",
|
||
"protocols.openai_embeddings": "OpenAI Embeddings",
|
||
"protocols.openai_embeddings.d": "POST /v1/embeddings — RAG 管道。",
|
||
"protocols.openai_models": "OpenAI Models",
|
||
"protocols.openai_models.d": "GET /v1/models — 客户端自动发现。",
|
||
"protocols.anthropic_messages": "Anthropic Messages",
|
||
"protocols.anthropic_messages.d": "POST /v1/messages — Claude 原生智能体。",
|
||
"protocols.mcp": "MCP(模型上下文协议)",
|
||
"protocols.mcp.d": "JSON-RPC / SSE — MCP 原生编排器。",
|
||
"protocols.native_passthrough": "原生透传",
|
||
"protocols.native_passthrough.d": "POST /route — 直接访问路由决策。",
|
||
|
||
// keys
|
||
"keys.title": "API 密钥",
|
||
"keys.subtitle": "为您的智能体提供虚拟网关密钥,提供商密钥不离开网关。",
|
||
"keys.add": "新建密钥",
|
||
"keys.empty": "未配置密钥——网关处于开放模式(无需认证)。",
|
||
"keys.openMode": "开放模式:接受所有请求(无需密钥)。",
|
||
"keys.col.key": "密钥",
|
||
"keys.col.account": "账号",
|
||
"keys.col.rate": "速率/分钟",
|
||
"keys.col.models": "允许模型",
|
||
"keys.form.title": "新建 API 密钥",
|
||
"keys.form.account": "账号",
|
||
"keys.form.rate": "速率限制/分钟",
|
||
"keys.form.allow": "允许模型",
|
||
"keys.form.allowHint": "留空表示允许所有模型。",
|
||
"keys.form.custom": "自定义密钥(可选)",
|
||
"keys.form.customHint": "留空将自动生成 sk-gw-…",
|
||
"keys.created": "密钥已创建——请立即复制,之后将不再显示:",
|
||
"keys.revoke": "吊销",
|
||
"keys.revokeConfirm": "确认吊销此密钥?",
|
||
"keys.allowAll": "全部",
|
||
|
||
// playground
|
||
"pg.title": "沙盒",
|
||
"pg.subtitle": "通过实时管道发送提示并查看路由决策。",
|
||
"pg.system": "系统提示",
|
||
"pg.systemPlaceholder": "可选系统消息",
|
||
"pg.prompt": "提示",
|
||
"pg.promptPlaceholder": "请输入问题…",
|
||
"pg.mode": "模式",
|
||
"pg.mode.auto": "自动(路由)",
|
||
"pg.mode.pinned": "固定模型",
|
||
"pg.profile": "配置文件",
|
||
"pg.model": "模型",
|
||
"pg.temp": "温度",
|
||
"pg.maxTokens": "最大 Token 数",
|
||
"pg.send": "发送",
|
||
"pg.stream": "流式",
|
||
"pg.sending": "发送中…",
|
||
"pg.answer": "回答",
|
||
"pg.empty": "回答和路由决策将在此显示。",
|
||
"pg.decision": "路由决策",
|
||
"pg.task": "任务",
|
||
"pg.tier": "层级",
|
||
"pg.score": "复杂度",
|
||
"pg.selected": "已选模型",
|
||
"pg.source": "路由来源",
|
||
"pg.cost": "费用",
|
||
"pg.latency": "延迟",
|
||
"pg.tokens": "Token(输入/输出)",
|
||
"pg.failover": "故障转移",
|
||
"pg.error": "请求失败",
|
||
|
||
// settings
|
||
"settings.title": "设置",
|
||
"settings.subtitle": "网关连接、路由输入、可靠性与可观测性。",
|
||
"settings.router": "路由器连接",
|
||
"settings.router.url": "路由器 URL",
|
||
"settings.router.keyEnv": "路由器密钥环境变量名",
|
||
"settings.router.timeout": "超时(ms)",
|
||
"settings.router.verifyTls": "验证 TLS 证书",
|
||
"settings.router.taxonomy": "分类体系 ID",
|
||
"settings.router.getKey": "获取或充值路由器密钥:",
|
||
"settings.router.secret": "路由器密钥(值)",
|
||
"settings.router.test": "测试路由器",
|
||
"router.probe.ok": "路由器正常({ms} ms)",
|
||
"router.probe.noKey": "未设置路由器密钥",
|
||
"router.probe.auth": "密钥被拒绝——无效或已吊销",
|
||
"router.probe.payment": "需要付款——套餐到期或配额用尽",
|
||
"router.probe.quota": "超出速率限制",
|
||
"router.probe.timeout": "路由器响应超时",
|
||
"router.probe.unreachable": "路由器不可达",
|
||
"router.probe.error": "路由器错误",
|
||
"router.usage": "用量",
|
||
"settings.route": "路由输入",
|
||
"settings.route.strategy": "文本策略",
|
||
"settings.route.maxChars": "最大字符数",
|
||
"settings.route.cacheTtl": "缓存 TTL",
|
||
"settings.route.profile": "默认配置文件",
|
||
"settings.breaker": "熔断器",
|
||
"settings.breaker.threshold": "错误阈值",
|
||
"settings.breaker.cooldown": "冷却时间",
|
||
"settings.log": "日志",
|
||
"settings.log.level": "日志级别",
|
||
"settings.log.bodies": "记录消息体(隐私关闭)",
|
||
"settings.telemetry": "遥测",
|
||
"settings.telemetry.metrics": "暴露 Prometheus /metrics",
|
||
"settings.cortiq": "响应元数据",
|
||
"settings.cortiq.echo": "在响应中回显 cortiq 路由块",
|
||
"settings.stats": "统计",
|
||
"settings.stats.enabled": "记录请求统计",
|
||
"settings.stats.file": "统计文件(JSONL)",
|
||
"settings.stats.retention": "保留期",
|
||
"settings.listen": "监听地址",
|
||
"settings.export": "导出配置",
|
||
"settings.import": "导入配置",
|
||
"settings.needsRestart": "已保存。部分更改(监听地址)需要重启生效。",
|
||
|
||
// toasts / misc
|
||
"toast.saved": "更改已保存",
|
||
"toast.deleted": "已删除",
|
||
"toast.probing": "探测中…",
|
||
"toast.imported": "配置已导入",
|
||
"dash.cache": "语义缓存",
|
||
"dash.cache.hitRate": "命中率",
|
||
"dash.cache.hits": "命中",
|
||
"dash.cache.saved": "已节省",
|
||
"dash.cache.disabled": "语义缓存已禁用 — 在设置中启用。",
|
||
"settings.cache": "语义缓存",
|
||
"settings.cache.enabled": "启用语义缓存",
|
||
"settings.cache.threshold": "相似度阈值",
|
||
"settings.cache.ttl": "条目 TTL",
|
||
"settings.cache.embed": "嵌入模型",
|
||
"settings.cache.note": "缓存设置将在重启后生效。",
|
||
|
||
// ── translated from en.js (previously falling back to English) ──
|
||
// nav
|
||
"nav.import": "导入模型",
|
||
|
||
// dash
|
||
"dash.clear": "清空日志",
|
||
"dash.clearConfirm": "清空所有已记录的统计与日志?此操作无法撤销。",
|
||
"dash.cleared": "日志已清空",
|
||
|
||
// models
|
||
"models.form.idOrModel": "请输入 id 或模型名称",
|
||
"models.form.apiKey": "API 密钥",
|
||
"models.form.apiKeyPlaceholder": "粘贴你的 API 密钥",
|
||
"models.form.apiKeyNotNeeded": "无需密钥(本地服务器)",
|
||
"models.form.apiKeyHint": "安全保存在网关中,之后不会再次显示。",
|
||
"models.form.keyStored": "已保存一个密钥 — 留空表示保留,或粘贴新的密钥替换。",
|
||
"models.form.keyFromEnv": "正在使用环境变量中的密钥。",
|
||
"models.form.paramsTitle": "生成与思考参数(O(1)、MTP、温度)",
|
||
"models.form.temperature": "温度",
|
||
"models.form.temperatureHint": "生成温度(0.0 = 确定性,1.0+ = 更有创造性)。",
|
||
"models.form.topP": "Top-P(核采样)",
|
||
"models.form.topPHint": "采样阈值(0.0 .. 1.0)。",
|
||
"models.form.maxTokens": "最大 token 数",
|
||
"models.form.maxTokensHint": "生成内容的最大 token 数。",
|
||
"models.form.thinkBudget": "思考模式 / 思考预算",
|
||
"models.form.thinkBudgetHint": "推理 token 预算(0 = 关闭,N > 0 = 推理 token 上限)。",
|
||
"models.form.systemPrompt": "默认系统提示词",
|
||
"models.form.systemPromptHint": "当请求中没有系统提示词时自动添加到前面。",
|
||
"models.form.systemPromptPlaceholder": "你是一个乐于助人的助手……",
|
||
"models.form.testKey": "测试并加载模型",
|
||
"models.form.testing": "检查中……",
|
||
"models.form.foundModels": "已加载 {n} 个模型",
|
||
"models.form.modelPlaceholder": "输入以搜索……",
|
||
"models.form.modelHint": "点击“测试并加载模型”用你的密钥拉取列表,然后选择一个。",
|
||
"models.managed": "托管",
|
||
"models.managedHint": "由托管的 CMF 服务器提供(设置 → 本地模型)。请在那里配置。",
|
||
|
||
// settings
|
||
"settings.router.enabled": "使用路由器(关闭 = 仅本地模型)",
|
||
"settings.cmf": "本地模型(CMF)",
|
||
"settings.cmf.localOnly": "仅使用本地模型",
|
||
"settings.cmf.manage": "运行本地模型服务器",
|
||
"settings.cmf.autoInstall": "自动安装 cortiq(crates.io)",
|
||
"settings.cmf.autoUpdate": "自动更新 cortiq",
|
||
"settings.cmf.model": "本地 .cmf 模型路径",
|
||
"settings.cmf.port": "本地服务器端口",
|
||
"settings.cmf.modelId": "模型在池中的 id",
|
||
"settings.cmf.note": "通过 cortiq 提供本地 .cmf 服务(github.com/infosave2007/cmf)。即使路由器不可用也能工作。",
|
||
"settings.cmf.threads": "工作线程",
|
||
"settings.cmf.gpu": "使用 GPU(Metal / wgpu)",
|
||
"settings.cmf.speedNote": "线程会并行化解码阶段的矩阵向量乘法(约快 3 倍;0 = 运行时默认值)。GPU 卸载主要加速长提示词的 prefill — 解码受内存带宽限制,因此在 Apple Silicon 上基本持平。",
|
||
"settings.cmf.pick": "选择一个模型",
|
||
"settings.cmf.models": "本地模型",
|
||
"settings.cmf.modelsHelp": "每一行都是网关运行的一个模型(各自独立的 cortiq serve,各占一个端口)并注册到模型池。有多少 .cmf 文件和空闲端口就可以加多少行。",
|
||
"settings.cmf.rowHint": "id · .cmf 文件 · 端口 · 线程 · GPU。改动在重启后生效;删除一行会停止对应的服务器。",
|
||
"settings.cmf.addServer": "+ 添加本地模型",
|
||
"settings.cmf.checkPort": "检查端口",
|
||
"settings.cmf.portFree": "端口空闲",
|
||
"settings.cmf.portBusy": "端口被占用",
|
||
"settings.cmf.useSuggested": "使用 {port}",
|
||
"settings.cmf.serving": "{model} 正在 :{port} 提供服务",
|
||
"settings.cmf.intro": "用 cortiq 引擎在本地运行模型 — 即使离线或路由器故障也能工作。",
|
||
"settings.cmf.runtime": "cortiq 运行时",
|
||
"settings.cmf.runtimeHelp": "用于加载和运行 .cmf 模型的命令行工具 `cortiq`。启动本地服务器前先安装一次。",
|
||
"settings.cmf.install": "安装 cortiq",
|
||
"settings.cmf.reinstall": "重新安装 / 更新",
|
||
"settings.cmf.installing": "安装中……(需要编译,几分钟)",
|
||
"settings.cmf.installedOk": "cortiq 已安装",
|
||
"settings.cmf.notInstalled": "未安装",
|
||
"settings.cmf.addModel": "添加模型",
|
||
"settings.cmf.addModelHelp": "模型在“导入模型”标签页下载并转换(HuggingFace → .cmf)。然后把下面的本地服务器指向该 .cmf 文件。",
|
||
"settings.cmf.importNote": "还没有模型?去导入一个:",
|
||
"settings.cmf.importLink": "打开导入",
|
||
"settings.cmf.modelHelp": "要提供服务的 .cmf 文件路径(例如 models/qwen.cmf),由导入标签页生成。要为不同任务准备多个模型?导入它们并切换此路径。",
|
||
"settings.cmf.portHelp": "本地模型服务器监听的 TCP 端口(默认 8081)。仅在与其他服务冲突时修改。",
|
||
"settings.cmf.threadsHelp": "生成时使用多少个 CPU 核心。越多越快(相比单核约快 3 倍);0 表示交给运行时决定。",
|
||
"settings.cmf.gpuHelp": "把矩阵运算卸载到 GPU(Metal/wgpu)。在 Apple Silicon 上主要加速长提示词 — 解码受内存带宽限制。",
|
||
"settings.cmf.localOnlyHelp": "把每个请求都发往本地模型,忽略路由器和所有云端供应商。",
|
||
"settings.cmf.manageHelp": "网关启动时会为下面的 .cmf 启动 `cortiq serve` 并把请求路由过去。需要已安装 cortiq(第 1 步)。重启后生效。",
|
||
"settings.cmf.autoInstallHelp": "如果启动时缺少 cortiq,自动从 crates.io 安装。",
|
||
"settings.cmf.autoUpdateHelp": "启动时如有更新版本,将 cortiq 升级到最新发布版。",
|
||
"settings.router.enabledHelp": "让 cortiq 路由器对每个请求分类(任务类型 + 复杂度)并挑选模型。关闭 = 仅使用本地路由表。",
|
||
"settings.router.verifyTlsHelp": "校验路由器的 TLS 证书。仅在使用自签名或绑定 IP 的证书时关闭。",
|
||
"settings.telemetry.metricsHelp": "在 GET /metrics 暴露 Prometheus 指标。",
|
||
"settings.cortiq.echoHelp": "在每个响应体中加入 `cortiq` 字段(任务、模型、成本)。响应头始终会发送。",
|
||
"settings.stats.enabledHelp": "记录最近的请求,为仪表盘和图表提供数据。",
|
||
"settings.cache.enabledHelp": "语义缓存:当新提示词与过去的某个非常相似时直接返回已保存的回答,跳过模型调用。需要池中有一个嵌入模型。",
|
||
"settings.log.bodiesHelp": "记录请求/响应的完整消息体。出于隐私考虑默认关闭。",
|
||
"settings.router.saveKey": "保存密钥",
|
||
"settings.router.keySaved": "路由器密钥已保存",
|
||
"settings.router.keyEmpty": "请先粘贴密钥",
|
||
"settings.router.secretHelp": "粘贴 api.allaigate.com 邮件中的密钥,然后点击“保存密钥”。这不是“API 密钥”页中的值 — 那些是给调用你网关的客户端用的。",
|
||
"settings.router.keyStoredMask": "•••••••••••• — 密钥已保存(再次粘贴可替换)",
|
||
"settings.route.strategyHelp": "发送给路由器用于分类的文本:last_user = 仅最后一条用户消息;last_user_plus_system = 最后一条用户消息 + 系统提示词;concat_all = 整段对话。",
|
||
"settings.route.maxCharsHelp": "发送给路由器的文本最大字符数(超出会截断)。越多分类越准,但路由器调用更慢也更贵。",
|
||
"settings.route.cacheTtlHelp": "相同请求的路由决策缓存多久后才再次询问路由器(例如 60s、5m)。",
|
||
"settings.route.profileHelp": "请求未指定时使用的默认路由档位:cost-saver(最省钱)、balanced 或 quality-first(最好的模型)。会影响路由器挑选哪个模型。",
|
||
|
||
// import
|
||
"import.subtitle": "在 HuggingFace 上搜索模型,转换为本地 .cmf 并提供服务。",
|
||
"import.searchPlaceholder": "搜索 HuggingFace 模型(例如 qwen3、llama)……",
|
||
"import.searching": "搜索中……",
|
||
"import.noResults": "未找到模型。",
|
||
"import.configure": "配置转换",
|
||
"import.outName": "输出名称",
|
||
"import.outNameHint": ".cmf 文件名(字母、数字、- 和 _)。",
|
||
"import.quant": "量化",
|
||
"import.convert": "转换并加载",
|
||
"import.converting": "转换中",
|
||
"import.started": "转换已开始",
|
||
"import.failed": "转换失败 — 请查看日志。",
|
||
"import.register": "注册为本地模型",
|
||
"import.registered": "已注册为 “{id}”。运行 cortiq-server 即可提供服务。",
|
||
"import.jobs": "下载与转换",
|
||
"import.cancel": "取消",
|
||
"import.cancelling": "正在取消 — 清理未完成的文件……",
|
||
"import.delete": "删除",
|
||
"import.deleteConfirm": "从磁盘删除该模型及其转换好的 .cmf 文件?",
|
||
"import.deleted": "已连同文件一起删除",
|
||
"import.state.running": "进行中",
|
||
"import.state.done": "完成",
|
||
"import.state.error": "错误",
|
||
"import.state.cancelled": "已取消",
|
||
"import.featuredTitle": "推荐的开箱即用 .cmf 模型",
|
||
"import.featuredSub": "来自 HuggingFace 上 infosave 账号的预转换 .cmf 模型 — 列表实时读取,新模型会自动出现。",
|
||
"import.readyCmfBadge": "现成 .cmf",
|
||
"import.directDownload": "下载",
|
||
"import.q.q8_2f": "8 位双场(𝒲×θ)— 推荐:质量与体积的最佳平衡。",
|
||
"import.q.q8_row": "8 位按行 — 简单稳健。",
|
||
"import.q.q4": "4 位分块 — 体积最小,质量较低。",
|
||
"import.q.q4_tiled": "4 位分块平铺(Q4_TILED)— 在 Metal GPU 上快 1.66 倍。",
|
||
"import.q.vbit": "可变 3–8 位 — 按专家分配位宽预算。",
|
||
"import.q.q1t": "1.58 位三值(Q1T)— BitNet b1.58,带稀疏离群值。",
|
||
"import.q.q1s": "1 位稀疏(Q1S)— 1 位基底,带全息离群值。",
|
||
"import.q.q1p": "1 位 PTQ(Q1P)— 1 位,带误差扩散。",
|
||
"import.q.q1": "1 位(Q1)— 纯二值格式。",
|
||
"import.q.f16": "16 位 — 不量化。",
|
||
"import.q.f32": "32 位 — 全精度(文件很大)。",
|
||
"import.adv.title": "高级设置",
|
||
"import.adv.auto": "自动",
|
||
"import.adv.linearCore": "线性核",
|
||
"import.adv.linearHint": "线性注意力层如何被保留或折叠。",
|
||
"import.adv.nphase": "vmf_phase 每头相位数",
|
||
"import.adv.vbitShape": "VBIT 预算形状",
|
||
"import.adv.meanBits": "VBIT 平均位宽",
|
||
"import.adv.shard": "分片上限(GB)",
|
||
"import.adv.noShard": "不分片",
|
||
"import.adv.skipMtp": "跳过 MTP 头",
|
||
"import.adv.o1": "O(1) 注意力",
|
||
"import.adv.o1Hint": "常量内存的流式注意力:prefill 之后释放 KV 缓存,因此长上下文不会持续增加内存。权重保持逐字节一致 — 只记录一个加载时的提示;随时可以切回(启动时加 --o1 off)。已在 Qwen3-0.6B 上验证:全部层约为 ×1.18 困惑度。",
|
||
"import.adv.o1Off": "关闭 — 精确注意力(默认)",
|
||
"import.adv.o1All": "all — 转换所有 softmax 层",
|
||
"import.adv.o1Deep": "deep N — 仅最深的 N 层",
|
||
"import.adv.o1Custom": "自定义 — 显式指定层列表",
|
||
"import.adv.o1DeepN": "最深的 N 层",
|
||
"import.adv.o1Layers": "层(用逗号分隔)",
|
||
"import.adv.o1mHint": "landmark 预算(默认 32)",
|
||
"import.adv.o1windowHint": "精确窗口宽度(默认 128)",
|
||
"import.adv.o1sinkHint": "常驻精确 sink key 数(默认 4)",
|
||
|
||
// onboarding
|
||
"onboarding.title": "初始设置",
|
||
"onboarding.welcome": "欢迎使用 Cortiq Gateway",
|
||
"onboarding.welcomeSub": "选择你的语言 — 随时可以在顶栏更改。",
|
||
"onboarding.next": "下一步",
|
||
"onboarding.back": "上一步",
|
||
"onboarding.skip": "暂时跳过",
|
||
"onboarding.skipSetup": "跳过",
|
||
"onboarding.finish": "完成设置",
|
||
"onboarding.featuredTitle": "开箱即用的模型(一键)",
|
||
"onboarding.featuredSub": "这些是 HuggingFace 上 infosave 发布的、已经转换好的 .cmf 模型 — 直接下载即可,无需转换。选择一个或多个即可立即开始。",
|
||
"onboarding.download": "下载",
|
||
"onboarding.hfTitle": "任意 HuggingFace 模型 — 自动转换",
|
||
"onboarding.hfSub": "搜索任意模型,选择量化方式,我们会自动把它转换为 .cmf。无需手动修改配置。",
|
||
"onboarding.noJobs": "还没有下载任务。",
|
||
"onboarding.doneTitle": "全部就绪",
|
||
"onboarding.doneSub": "下载好的模型会自动注册。之后可以在“导入模型”或“模型”中添加更多。",
|
||
"onboarding.doneHint": "“完成设置”会把每个下载完成的模型接入为本地模型,启动它的 .cmf 服务器并把路由指向它。这些之后都可以在“模型”中修改。",
|
||
"onboarding.willRegister": "将接入为本地模型",
|
||
"onboarding.nothingToRegister": "还没有下载完成的模型 — 没有可接入的内容。返回上一步选一个模型。",
|
||
"onboarding.registeredN": "已接入 {n} 个模型:{ids}",
|
||
"onboarding.runtimeMissing": "cortiq 运行时尚未安装 — 请在 设置 → 本地模型 中安装后才能运行这些模型。",
|
||
"onboarding.downloaded": "已下载",
|
||
"onboarding.update": "更新",
|
||
"onboarding.deleteFile": "从磁盘删除该 .cmf 文件",
|
||
"onboarding.confirmDelete": "删除 “{id}”?该 .cmf 文件将从磁盘移除。",
|
||
"onboarding.unregistered": "同时已取消注册:{ids}",
|
||
|
||
// playground: media generation + streaming metrics
|
||
"pg.tab.chat": "对话",
|
||
"pg.tab.image": "图像",
|
||
"pg.tab.video": "视频",
|
||
"pg.generate": "生成",
|
||
"pg.generating": "生成中……",
|
||
"pg.genFailed": "生成失败 — 请查看日志。",
|
||
"pg.result": "结果",
|
||
"pg.genMetrics": "生成指标",
|
||
"pg.imagePromptPlaceholder": "夕阳下雪地里的红狐狸,照片级真实感,毛发细节丰富",
|
||
"pg.videoPromptPlaceholder": "戴厨师帽的柯基翻煎饼,滋滋声和欢快的犬吠",
|
||
"pg.imageEmpty": "生成的图像将显示在这里。",
|
||
"pg.videoEmpty": "生成的短片(含音频)将显示在这里。",
|
||
"pg.width": "宽度",
|
||
"pg.height": "高度",
|
||
"pg.steps": "步数",
|
||
"pg.seed": "Seed",
|
||
"pg.randomSeed": "随机 seed",
|
||
"pg.cfgHint": "引导强度;≤ 1 关闭 CFG,工作量减半。",
|
||
"pg.frames": "帧数",
|
||
"pg.framesHint": "24 fps;按模型网格取整。",
|
||
"pg.quality": "JPEG 质量",
|
||
"pg.videoSizeHint": "32 的倍数;训练短边为 768。",
|
||
"pg.videoStepsHint": "Turbo LoRA 按 4 步训练。",
|
||
"pg.firstFrame": "首帧(可选)",
|
||
"pg.lastFrame": "末帧(可选)",
|
||
"pg.keyframeHint": "使运行变为关键帧生视频。",
|
||
"pg.resolution": "分辨率",
|
||
"pg.genTime": "生成耗时",
|
||
"pg.timePerStep": "每步",
|
||
"pg.timePerFrame": "每帧",
|
||
"pg.fileSize": "文件大小",
|
||
"pg.duration": "时长",
|
||
"pg.play": "播放",
|
||
"pg.noMediaModels": "还没有本地{kind}模型。请在“导入模型”中下载一个(例如 infosave 合集):",
|
||
"pg.tokSpeed": "速度",
|
||
"pg.ttft": "首个 token",
|
||
|
||
// ops: logs, system, notices, gallery, chat, snippets, bench
|
||
"nav.logs": "日志",
|
||
"logs.subtitle": "网关最近的日志 — 终端里会看到的内容。",
|
||
"logs.filterPlaceholder": "过滤……",
|
||
"logs.pause": "暂停",
|
||
"logs.resume": "继续",
|
||
"logs.empty": "没有匹配内容。",
|
||
"notice.openAdmin": "管理控制台未设置令牌即可从其他机器访问。若这台机器不是私有的,请设置令牌。",
|
||
"notice.update": "有可用更新:v{v}。",
|
||
"dash.sys.title": "系统",
|
||
"dash.sys.cores": "核",
|
||
"dash.sys.disk": "磁盘(模型)",
|
||
"dash.sys.free": "可用",
|
||
"dash.sys.gateway": "网关",
|
||
"fit.disk": "磁盘空间不足",
|
||
"fit.diskTitle": "下载大小超过模型磁盘的可用空间。",
|
||
"fit.ram": "可能超出内存",
|
||
"fit.ramTitle": "模型接近或超过本机内存 — 可能无法运行。",
|
||
"pg.eta": "剩余",
|
||
"pg.min": "分钟",
|
||
"pg.queued": "排队中 — 第 {n} 位。当前生成结束后立即开始。",
|
||
"pg.gallery": "最近的生成",
|
||
"pg.galDeleteConfirm": "删除这次生成及其文件?",
|
||
"pg.clearChat": "清空",
|
||
"keys.snip.title": "接入你的应用",
|
||
"keys.snip.hint": "把示例粘贴到你的项目里 — 只需替换密钥占位符。",
|
||
"keys.snip.withKey": "下面的示例已包含你刚创建的密钥。",
|
||
"keys.snip.openMode": "未配置 API 密钥 — 网关接受任意密钥值。",
|
||
"keys.snip.keyPh": "你的 API 密钥",
|
||
"settings.restart": "全部重启",
|
||
"settings.restartConfirm": "重启网关和所有本地模型服务器?正在处理的请求将被中断。",
|
||
"settings.restarting": "正在重启 — 网关恢复后页面会自动刷新……",
|
||
"settings.shutdown": "全部停止并关机",
|
||
"settings.shutdownConfirm": "停止所有本地模型服务器并关闭网关?在你重新启动网关之前,API 和此面板都将无法响应。",
|
||
"settings.shutdownDone": "网关已关闭。",
|
||
"settings.shutdownHint": "所有本地模型服务器已停止,进程已退出。请在服务器上重新启动网关以恢复面板。",
|
||
"bench.title": "本地模型速度",
|
||
"bench.hint": "在本机运行 `cortiq bench` — 真实 tok/s,一次一个模型。",
|
||
"bench.run": "测速",
|
||
"bench.running": "测速中……",
|
||
"bench.failed": "失败",
|
||
"bench.none": "还没有本地 .cmf 聊天模型。",
|
||
|
||
// task-based routing
|
||
"task.chitchat": "闲聊",
|
||
"task.code": "代码",
|
||
"task.creative-writing": "创意写作",
|
||
"task.extraction": "数据提取",
|
||
"task.math": "数学",
|
||
"task.qa": "问答",
|
||
"task.summarization": "摘要",
|
||
"task.translation": "翻译",
|
||
"routing.tasks.title": "按任务路由",
|
||
"routing.tasks.hint": "规则中的模型对该任务优先;下方的复杂度链仍作为回退。留空 = 仅按复杂度。",
|
||
"routing.tasks.inherit": "按复杂度(无规则)",
|
||
"routing.tasks.share": "{p}% 的请求(7 天)",
|
||
"routing.tasks.fromRouter": "标签实时来自路由器",
|
||
"routing.tasks.builtin": "路由器不可达 — 使用内置标签集",
|
||
"routing.tasks.addCustom": "添加任务",
|
||
"routing.tasks.addPlaceholder": "自定义标签……",
|
||
|
||
// benchmark view
|
||
"nav.benchmark": "基准测试",
|
||
"bm.title": "基准测试",
|
||
"bm.subtitle": "通过实时管线做质量与速度探测:按关键词核对答案、检测循环输出,并按模型测量 tok/s 与首个 token 时间。",
|
||
"bm.models": "要测试的模型",
|
||
"bm.quickMode": "快速测试",
|
||
"bm.quickHint": "答案简短的快速子集 — 每个本地模型约一分钟。",
|
||
"bm.suiteInfo": "内置套件:{q} 个快速 / {f} 个完整测试,另加你自己的。",
|
||
"bm.run": "运行",
|
||
"bm.pickModel": "请至少选择一个模型。",
|
||
"bm.testOf": "第 {i}/{n} 个测试",
|
||
"bm.results": "结果",
|
||
"bm.quick": "快速",
|
||
"bm.test": "测试",
|
||
"bm.cellHint": "点击单元格查看模型的完整回答。",
|
||
"bm.history": "历史运行(保存在本浏览器)",
|
||
"bm.custom": "自定义测试",
|
||
"bm.customHint": "提示词 + 逗号分隔的关键词,回答必须包含它们(| 表示同义词)。保存在本浏览器。",
|
||
"bm.promptPh": "提示词……",
|
||
"bm.checkPh": "关键词,逗号分隔",
|
||
"bm.addTest": "添加测试",
|
||
"bm.emptyAnswer": "回答为空",
|
||
"bm.loopDetected": "检测到循环",
|
||
|
||
// benchmark: routing mode, cost, live
|
||
"bm.mode.routing": "智能路由",
|
||
"bm.mode.models": "单独模型",
|
||
"bm.mode.routingDesc": "测试产品核心能力:每个探测都经过 cortiq-auto — 可以看到路由器识别的任务、选中的模型、是否符合预期,以及花费了多少。",
|
||
"bm.mode.modelsDesc": "同一套测试固定在所选模型上 — 绕过路由器,直接对比它们的质量、速度与成本。",
|
||
"bm.answersOk": "回答正确",
|
||
"bm.classAcc": "任务分类",
|
||
"bm.modelDist": "请求流向",
|
||
"bm.expectedLbl": "预期:",
|
||
"bm.answer": "回答",
|
||
"bm.liveRunning": "进行中……",
|
||
"bm.spent": "花费",
|
||
"bm.verdict": "🏁 完成:回答 {p},花费 {s}",
|
||
"bm.clearHistory": "全部清除",
|
||
|
||
// harness auto-setup (API keys view)
|
||
"keys.h.claude": "Claude Code — 粘贴到终端(网关原生支持 Anthropic 协议):",
|
||
"keys.h.codex": "Codex — 将提供商追加到 ~/.codex/config.toml 并启动:",
|
||
"keys.h.opencode": "OpenCode — 写入 ~/.config/opencode/opencode.json(会覆盖!)并启动:",
|
||
"keys.h.continue": "Continue(VS Code / JetBrains)— 将模型追加到 ~/.continue/config.yaml:",
|
||
"keys.h.cline1": "Cline(VS Code)— 在扩展设置中选择:",
|
||
"keys.h.cline2": "设置 → API Provider → OpenAI Compatible,然后粘贴上面的值。",
|
||
"keys.h.note": "cortiq-auto = 智能路由:路由器为每个请求选择模型。要固定某个模型,请填写其精确名称。Windows 上请在 Git Bash / WSL 中运行脚本,或通过系统环境变量设置相同的值。",
|
||
"keys.h.protoOff": "Anthropic 协议(/v1/messages)已关闭 — Claude Code 无法连接。",
|
||
"keys.h.enableProto": "启用",
|
||
"keys.h.st.installed": "已安装在网关所在机器上",
|
||
"keys.h.st.configured": "已配置为使用此网关",
|
||
"keys.h.st.notFound": "网关所在机器上未找到",
|
||
"bm.degraded": "路由器降级",
|
||
"bm.routerDegraded": "路由器未及时响应 — 请求走了备用链路;分类不计入统计。",
|
||
"bm.cutByCap": "预算全用于思考——未能给出答案",
|
||
"shell.uiStale": "网关已更新 — 此页面运行的是旧界面。",
|
||
"shell.reload": "重新加载",
|
||
"keys.col.requests": "请求数",
|
||
"keys.col.tokens": "Token 入/出",
|
||
"keys.col.costAll": "$ 累计",
|
||
"routing.tasks.tier": "复杂度",
|
||
"routing.tasks.tierAuto": "自动(路由器)",
|
||
"routing.tasks.tierHint": "哪个模型在哪个复杂度上处理该任务;「任意」在所有层级领先。顺序即回退顺序。high 判定仍会越过「任意」条目升级。",
|
||
"routing.tasks.tierAny": "任意复杂度",
|
||
"routing.tasks.addModel": "模型",
|
||
"routing.bands.enable": "自定义复杂度边界",
|
||
"routing.bands.hint": "拖动手柄设定 low 到哪里结束、high 从哪里开始 — 手柄会相互推动,数字实时更新。路由器的连续得分将按你的边界重新划分;取消勾选则使用路由器自身的边界。",
|
||
"tier.low": "简单",
|
||
"tier.medium": "中等",
|
||
"tier.high": "困难",
|
||
"bm.scoreHint": "路由器的连续复杂度得分(0..1)— 路由页面上的边界滑块将其划分为层级。",
|
||
"settings.cache.noEmbed": "缓存已启用,但没有可用的 embedding 模型 — 它没有任何作用。请向模型池添加 kind = \"embedding\" 的模型(如 OpenAI text-embedding),或在下方选择。",
|
||
"settings.cache.entries": "条目",
|
||
"settings.cache.hits": "命中",
|
||
"settings.cache.saved": "已节省",
|
||
"keys.form.budget": "每月预算,$(0 = 不限)",
|
||
"keys.form.budgetHint": "当账户当月支出超过上限时,请求将被拒绝并返回 429 insufficient_quota。",
|
||
"keys.budgetOf": "预算 {b}/月",
|
||
"dash.kpi.orBalance": "OpenRouter 余额",
|
||
"keys.h.install": "安装:",
|
||
"keys.snip.keyInputPh": "粘贴你的 API 密钥",
|
||
"keys.snip.apply": "插入密钥",
|
||
};
|