dsh-plugin-market-zh · DSH 插件市场汉化
把 DSH 接入的多个插件市场索引源,在本地机翻成中文镜像,直接显示在「插件 → 发现」里。源还是原来的源,只是标题、分类、标签和描述补成了中文,不用再对着满屏英文猜。
起因
给 DSH 接插件索引源之后,我发现一个问题:里面一大半是英文。看不懂,就判断不了这些源接得对不对、插件选得好不好。纠结了一阵,干脆换个思路——让 DS 做一个机翻的本地镜像:源还接原来的源,只把中文补齐,在本地起个服务给「发现」页读。于是有了这个插件。
它做了什么
- 本地镜像:为每个上游索引开一条本地路由,
/plugin-market-zh/index/<id>.json返回中文版索引(格式 1,结构与上游一致)。上游不用改,也不对外发布任何东西。 - 补中文,不覆盖中文:插件包名保留原文;索引里已有的中文原样保留;只有缺中文的标题、分类、标签、描述才走机翻。
- 聚合去重:额外注册一个「全部索引源 · 中文」市场,把各来源按包名合并,同一插件的版本取并集,重复来源只留一份。
- 零配置可用:默认内置 6 个公开索引源,启用后自动注册为市场来源;停用或卸载时自动移除。
实测效果
2026-10-23 在 DSH Desktop(Windows 10,中文界面)实测:
| 市场(镜像标题) | 插件数 |
|---|---|
| Awesome DSH Plugin 插件精选 · 镜像 | 3,261 |
| DSH 插件索引 · 镜像 | 7,413 |
| Bruce 的精选插件 · 镜像 | 1,000 |
| DSH 插件健康索引 · 镜像 | 300 |
| vlln 的 dsh 插件 · 镜像 | 9 |
| 贾维斯机制插件族(六插件) · 镜像 | 6 |
聚合市场「全部索引源 · 中文」:6 个来源合计 11,989 条记录,按包名去重后 8,233 个插件(重合 3,756 条)。机翻描述 5,452 条(4,911 + 541),检查时待译 0。
数字是快照,上游索引一直在变,重开后会跟着上游更新。
安装
克隆到本地任意目录:
git clone https://github.com/shwili/dsh-plugin-market-zh.git
在 DSH profile 的 package.json 里挂上这个包,并加进 bundles(以 Windows 路径为例,换成你的实际路径):
{
"dependencies": {
"dsh-plugin-market-zh": "link:D:/path/to/dsh-plugin-market-zh"
},
"dsh": {
"profile": {
"bundles": [
// ...原有条目
"dsh-plugin-market-zh"
]
}
}
}
重启 DSH,在「设置 → 插件」里启用。插件通过 inject 等待 webServer 与 pluginMarket 两个 Host 服务就绪后才激活,所以 bundles 里的顺序不影响加载。
使用
- 打开「插件」→「发现」。市场菜单第一个是「全部索引源 · 中文」,后面是每个来源各自的中文镜像。
- 首次启用会并行预取所有索引,再按来源顺序串行机翻。大来源(7,000+ 条)要几分钟,期间部分内容仍是英文,刷新后补齐。
- 诊断:
http://127.0.0.1:<端口>/plugin-market-zh/status.json,端口就是当前 Web GUI 的端口(例如 63499)。
如果自动注册市场来源失败(status.json 里 registered.sources=false),可以在「发现 → 市场菜单 → 管理索引来源…」里手动添加 sources[].mirrorUrl,或者聚合地址 http://127.0.0.1:<端口>/plugin-market-zh/all.json。
默认索引源
| 市场 | 上游索引 |
|---|---|
| Awesome DSH Plugin | https://dshmarket.com/index.json |
| DSH 插件索引 | https://realoiyo.github.io/dsh-plugin-market/index.json |
| Bruce 的精选插件 | https://bruc3van.com/dsh-plugins/index.json |
| DSH 插件健康索引 | https://easonmws.github.io/dsh-plugin-health/index.json |
| vlln 的 dsh 插件 | https://raw.githubusercontent.com/vlln/plugin-registry/main/index.json |
| 贾维斯机制插件族 | https://raw.githubusercontent.com/weft-audit/dsh-market/main/plugin_index.json |
dshmarket.com 是 dsh-plugin-catalog 自带的索引域名;cdn.jsdelivr.net/npm/dsh-plugin-catalog/index.json 与 awesome-dsh-plugin.com/index.json 是同一份目录的镜像,内容相同,所以没有重复添加。默认用 dshmarket.com 是因为 jsDelivr 在本机网络下出现过间歇性连接失败。
dsh.so、dsh.directory、DSH Get、OMDSH Hub 等也提供插件数据,但不是格式 1 索引,不能直接作为市场来源;要接需要单独的转换器。dsh.works/awesome-dsh-plugins 是另一个英文索引,默认不镜像,需要的话加进 sourceUrls 即可。
工作方式
- 每个来源预取一次上游索引,校验格式 1,解析图标(相对路径按上游 URL 解析;
http:图标因为镜像域名不同会被丢弃),再逐条补中文,生成内存文档并写入本地翻译缓存。 - 翻译优先走 Host 的
translator服务(匿名 Bing 通道);该实验服务未挂载时,直连同一个 Bing Edge 匿名端点。多个来源共用一条串行队列,避免同时压满匿名端点;失败后按冷却时间重试。 - 缓存按来源分开:
$DSH_HOME/cache/plugin-market-zh/translations-<hash>.json。已存在的中文不会被覆盖,只补缺失的部分。 - 聚合用
mergeMarketDocuments:按包名去重,版本取并集,标题/描述优先保留中文,分类/标签/排序键加s<slot>:命名空间,避免不同目录的同名 id 冲突。 - 只在本地起 HTTP 路由,不向模型发请求,不记录会话事件。翻译文本只发往匿名翻译端点,且只缓存在本地。
HTTP 路由
| 路由 | 说明 |
|---|---|
GET /plugin-market-zh/index/<id>.json |
单个来源的中文镜像,id 是上游 URL 的 SHA-256 前 10 位 |
GET /plugin-market-zh/index.json |
第一个来源的别名(兼容旧地址) |
GET /plugin-market-zh/all.json |
全部来源聚合去重后的中文市场 |
GET /plugin-market-zh/sources.json |
各来源的信息:上游 URL、镜像 URL、标题、插件数、翻译进度、注册状态 |
GET /plugin-market-zh/status.json |
诊断:路由/来源注册状态、服务挂载情况、翻译通道与统计 |
POST /plugin-market-zh/reconcile |
重新注册市场来源(插件自己调用,带进程内随机令牌) |
POST /plugin-market-zh/remove-source |
移除所有镜像来源(同上,带令牌) |
配置
在 cordis.patch.yml 的 plugin-market-zh 行里配置:
| 键 | 默认值 | 含义 |
|---|---|---|
sourceUrls |
上表 6 个索引 | 要镜像的索引列表,按顺序注册为市场来源 |
sourceUrl |
— | 旧版单来源配置,没有 sourceUrls 时使用 |
aggregate |
true |
是否额外注册「全部索引源」聚合市场 |
maxSources |
8 |
最多镜像多少个来源 |
targetLanguage |
zh |
目标语言,zh/zh-CN 映射为简体 |
provider |
bing |
匿名翻译通道;google 在部分网络不可达 |
transport |
auto |
auto 优先 Host 服务、缺失时直连;也支持 service、direct |
translateTitles |
false |
是否翻译插件标题(默认保留包名/品牌名) |
autoTranslate |
true |
后台继续翻译未命中的描述 |
warmupOnStart |
true |
启动预取完成后立即开始后台翻译 |
translateFirst |
80 |
每个来源首次请求同步翻译的条数 |
prefetch |
true |
启动时预取所有索引 |
autoRegister |
true |
自动把镜像地址加入市场来源 |
removeSourceOnDispose |
true |
停用/卸载时移除所有镜像来源 |
batchChars |
3200 |
单次翻译请求的最大字符数 |
maxBatchItems |
18 |
单次翻译请求的最大条数 |
requestTimeoutMs |
60000 |
上游索引请求超时 |
translateTimeoutMs |
5000 |
单次翻译请求超时 |
initialTranslateBudgetMs |
6000 |
首次请求里同步翻译的时间预算 |
routeWaitMs |
9000 |
镜像路由等待预取的最长时间(避免拖过市场服务的 15 秒期限) |
aggregateWaitMs |
8000 |
聚合路由等待各来源就绪的预算 |
documentTtlMs |
600000 |
每个来源内存文档的刷新间隔 |
maxSourceBytes |
67108864 |
单个上游索引的大小上限(64 MB) |
warmupChunk |
120 |
后台每批补译的条数 |
warmupPauseMs |
250 |
后台两批补译之间的停顿 |
已知限制
- 机器翻译质量有限,仅供浏览;安装插件前请以插件主页和仓库为准。
- 匿名翻译端点由第三方提供,可能限流或变更;失败时保留英文原文,并按冷却时间重试。
- 上游索引会变,README 里的数字只是 2026-10-23 的快照。
- 首次启用后的后台翻译需要几分钟;大索引在慢网络下预取可能超时(内置市场服务对单个来源有 15 秒读取期限)。
- 多个来源的文档同时驻留内存(原始 JSON 约 15–30 MB;聚合文档约 13 MB),内存占用高于单个来源。
- 汉化来源之间仍有重叠(
realoiyo与dshmarket/bruc3van收录同一批插件)。聚合按包名去重,但各目录自己的分类体系会保留,因此会看到两个「工具与能力」这类相似但来源不同的分类。 - 中文内容依赖 Web UI 当前语言为中文:镜像同时保留
en原文,英文界面下显示原文。 - 纯技术标识(例如
env ↔ JSON)会被翻译服务原样返回,此时保留原文而不生成中文。 - 翻译缓存写在
$DSH_HOME/cache,删掉它等于清空已机翻的内容,需要重新翻。
目录结构
index.js Host 侧入口:路由注册、来源注册、聚合、诊断
lib/source.js 抓取并校验上游格式 1 索引
lib/mirror.js 生成中文镜像文档
lib/translate.js 批量机翻(Host 服务 / Bing 直连)
lib/cache.js 本地翻译缓存
lib/dictionary.js 分类、标签、排序键的中文词表
lib/localized.js LocalizedText 的读写工具
lib/runtime.js 单个来源的运行时:预取、文档、缓存、后台补译
lib/aggregate.js 多来源按包名合并
cordis.patch.yml 插入一行 Host 插件配置
locale/zh.json 插件在市场里的中文标题与描述
locale/en.json 英文标题与描述
icon.svg 插件图标
许可证
MIT。索引内容与插件信息版权归各上游索引作者,本项目只做本地格式转换,不重新分发上游数据。
No comments yet. Be the first to write one.