mdict.koplugin:在KOReader自带的查词弹窗里直接用MDict词典(竖排、真人发音)

用墨水屏阅读器看书,查词体验一直不太理想:KOReader 自带的查词弹窗很顺手,却只认 StarDict;想用 MDict 词典,就只能跳到外部 App,每查一个词屏幕都要闪好几下。

所以我写了 mdict.koplugin:一个让 KOReader 直接读取 .mdx / .mdd 的插件。在 Android 上,它用系统 WebView(Chromium 内核)来排版词条,再把词条切成一页一页放进 KOReader 自己的查词弹窗里。词典原本的样子基本都能保留,竖排日语、笔顺、公式、插图、折叠例句、真人发音都没问题。

查「犬」:双指张开切换大窗口,翻页,切换到其他词典的结果

项目地址:https://github.com/moopoint-dev/mdict.koplugin(开源,AGPL-3.0,当前版本 0.2.0)


为什么要做这个插件

KOReader 查词时,用内置的 sdcv 查 StarDict 词典,HTML 释义交给 MuPDF 排版。MuPDF 擅长 PDF,作为网页引擎就比较勉强:

  • CSS 只支持一部分:没有 flexbox / grid,很多现代词典的版式会乱掉。
  • 不支持竖排:writing-mode: vertical-rl 不起作用,日语国语辞典只能横着看。
  • 不执行 JavaScript:折叠的例句、「VERB FORMS」之类的展开区块、点开看大图,统统失效。
  • 不能放声音:词典里的 sound:// 发音和例句录音,点了没有反应。

KOReader 官方对 MDict 的建议(issue #5552)是:用 PyGlossary 转成 StarDict,或者调用外部 App。但这两条路都有代价:

  • 转换成 StarDict:音频和脚本都会丢掉,CSS 要手动处理,词典每次更新都要重新转换。
  • 调用外部 App(欧路、DictTango、GoldenDict 等):每次查词都会离开 KOReader,切换 Android 界面会让墨水屏整屏刷新好几次。外部 App 大多还是滚动式界面,在墨水屏上拖得很吃力。

我想要的其实很简单:不离开 KOReader,不做格式转换,词典原来什么样,弹窗里就是什么样,而且一页一页地翻。


这个插件能做什么

原版排版:交给 WebView,而不是 MuPDF

  • 在 Android 上用系统 WebView(Chromium)排版,完整支持现代 CSS(flexbox、grid、网页字体、MDD 里自带的字体)。
  • 竖排日语(vertical-rl)、注音假名(ruby)、纵中横、笔顺字表、SVG 数学公式,都按词典原本的设计显示。
  • 插图、示意图照常显示,彩色屏上还能看到彩色。

运行词典自带的脚本

  • 词典自己的 JavaScript 会正常运行:折叠或展开区块、点缩略图看大图等交互都能用。
  • 词条里的链接、#锚点、entry:// 交叉引用都能点。

发音和例句音频

  • 点喇叭图标就能播放单词发音和例句录音。支持 AAC、MP3、Ogg、WAV(Speex 暂不支持)。

为墨水屏设计的翻页

  • 词条按弹窗大小切成一页一页,没有滚动。横排词条上下滑或点左右半屏翻页;竖排词条左右滑翻页,上下滑切换词典。
  • 双指张开就切到 KOReader 的大窗口,一页能看更多内容。
  • 默认会在后台预先排好下一个结果,切换词典时更快。
  • 墨水屏模式:黑色文字,去掉浅色底纹,避免显示成一片灰。

和 KOReader 无缝结合

  • MDict 词典和 StarDict 词典出现在同一个「管理词典」列表里,一起启用、停用和排序。
  • 长按释义里的字词可以继续查;「在释义中查找」会搜索整个词条;查词记录、生词本照常可用。
  • 支持 MDict 1.2 / 2.0、zlib / LZO 压缩、加密的 key index。
  • 不需要改动或重新编译 KOReader:插件的 Java 部分在运行时加载,官方版 KOReader 就能用。
  • 自动更新:插件会从 GitHub Releases 检查新版本,每天最多一次,不会主动打开 Wi-Fi,也可以跳过某个版本。

给爱折腾的坛友

  • 覆盖文件:在 name.mdx 旁边放 name.koreader.css(追加 CSS)或 name.koreader.lua(改写 HTML),就能为墨水屏单独调整某部词典。放在文件夹里的 mdict.koreader.css / .lua 对整个文件夹生效。
  • 可以按词典设置横排或竖排,以及分栏或切片的分页方式(默认自动选择)。
  • 给词典制作者:大词典第一次使用时,插件会在后台建一次索引(每部几秒)。如果词条按插件的 kosort-1 顺序排好,并在 MDX 头部写上 KOReaderKeyOrder="kosort-1",就可以跳过建索引。参考实现和测试数据都在仓库的 tools/kosort.py 和 spec/data/kosort-1.tsv 里。

截图

以下截图来自模拟 7 英寸、300 ppi 阅读器的 Android 模拟器。

横排英汉:牛津高阶英汉双解第 10 版,「rabbit」,带插图

竖排汉字条目:三省堂 現代新国語辞典,「故」,有笔顺、注音和纵中横(大窗口)

横排日语:大辞泉,「双曲線」,有声调符号、发音按钮和彩色示意图(大窗口)

竖排日语:現代新国語辞典,「双曲線」,配图竖排(大窗口)

横排翻页演示:「watch」。双指张开切到大窗口,展开再收起 VERB FORMS,翻页,切换到下一个结果,点开插图大图再关闭

watch


安装

  1. 到 Releases 下载 mdict.koplugin-<版本>.zip,解压到 koreader/plugins/。
  2. 把词典放进 KOReader 的词典目录 koreader/data/dict/,也可以在 Search → Settings → MDict dictionaries → Dictionary folders 里添加其他文件夹。.mdx 要和它的 .mdd(name.mdd、name.1.mdd……)放在一起。
  3. 重启 KOReader。MDict 词典会出现在「管理词典」列表里。

插件的所有设置都在查找菜单的 MDict dictionaries 里。


已知限制

  • 暂不支持 MDict 3.0 格式,也不支持需要注册码的加密词典。
  • Speex 格式的音频暂时不能播放。
  • WebView 排版只在 Android 上可用。Kindle、Kobo、PocketBook 等设备会退回 KOReader 内置的 MuPDF 渲染:文字和图片能显示,但竖排、脚本、发音这些功能用不了。
  • 有些词典的 CSS 原本是为手机彩屏设计的,在墨水屏上可能需要用覆盖文件微调。

反馈

插件还很新,欢迎大家拿自己手头的词典来试。遇到显示不对、查不到词、翻页异常的情况,请到 GitHub Issues 反馈,或者直接在这个帖子里回复。附上词典名称、查询的词和截图,排查起来会快很多。

也欢迎分享你在墨水屏上用得顺手的词典,以及为它们写的 koreader.css 覆盖文件。

祝大家查词愉快!

反馈个问题,使用encarta词典时,不能下拉

如下图,我往下滑到一半也依然是最开始的内容

词典来自这里,Encarta English Dictionary 2009 css修改

我自己使用的CSS也一并上传

encarta2009.css (261.7 KB)

感谢反馈和截图!问题已经找到并修好了。

原因:Encarta 2009 的 CSS 里有一条规则,把所有 div 都设成了行内元素(display: inline)。插件用来分页的外层容器也是 div,被这条规则一起改掉了,所以翻页时右边的页码条在动,内容却一直停在第一页。

新版本 0.2.1 里,插件的分页容器不再使用 div,词典自己的 div 样式只会作用于词条内容,不会再影响分页。我用你提到的 Encarta 2009 测试过,现在可以正常往下翻页了。

更新方法:打开顶部菜单的「搜索」(放大镜图标)→ 设置 → MDict dictionaries → Updates → Check for updates,点 Update,然后重启 KOReader(安卓上要完全退出再重新打开)。如果开着自动检查,也会自动提示更新。

更新后如果还有问题,欢迎再发截图。