Fifteen changes aimed at the first day of real use: - Import and media jobs persist to <data>/jobs-*.json and reload on start (running ones settle as errors); the Register button no longer vanishes because the gateway restarted. - Docker ships the cortiq binary (built in the builder stage) — local .cmf chat models and image/video generation now work in containers, where auto-install never could (no cargo in the runtime image). libvulkan1 added for optional GPU offload. - Open admin console on 0.0.0.0 without a token now warns in the log and shows a dismissible banner — the VPS footgun is at least labeled. - "Restart gateway" button in Settings: stops managed model servers, spawns a fresh copy (bind retried while the port frees), Docker relies on the container restart policy instead. - Dashboard "System" panel: CPU sparkline + load, RAM (with the gateway's own RSS), free disk at the models dir — sampled by sysinfo every 2 s. - Featured model cards warn "not enough disk" / "may not fit in RAM" before the download, from the same live snapshot. - Log viewer in the sidebar: a 500-line in-memory ring fed by a second ANSI-free tracing layer; filter, level, pause, copy. - Update check: crates.io polled twice a day, the console shows an "update available" notice. - Media generations queue up (with position shown) instead of being rejected; progress gained an honest ETA from measured throughput. - Generation gallery under the image/video tabs: lazy PPM thumbnails, click to reopen with seed/steps, delete. - Playground chat is a real dialogue now: history is resent, bubbles, Clear, Cmd/Ctrl+Enter. - "Connect your app" snippets (curl / Python / JS) on the keys page, with the real key inlined right after creation. - One-click benchmark on the Models page via `cortiq bench --json`. - Config export now downloads the actual gateway.toml (comments intact); import accepts TOML (validated, hot-reloaded) and the legacy JSON. - Streaming token counts are exact when the model server provides usage (cortiq-server patch, shipped separately); the gateway fallback now counts content chunks (1/token on cortiq) instead of chars/4. Wizard's Finish lands on the Playground. 37 new strings in all 7 languages.
549 lines
28 KiB
JavaScript
Vendored
549 lines
28 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": "正在重启 — 网关恢复后页面会自动刷新……",
|
||
"bench.title": "本地模型速度",
|
||
"bench.hint": "在本机运行 `cortiq bench` — 真实 tok/s,一次一个模型。",
|
||
"bench.run": "测速",
|
||
"bench.running": "测速中……",
|
||
"bench.failed": "失败",
|
||
"bench.none": "还没有本地 .cmf 聊天模型。",
|
||
};
|