目标是把 MongoDB 里存放的术语和定义,打包成可以在 macOS 自带“字典”应用中查询的本地词典。
成功步骤
用脚本实现1-2-3步骤即可. 代码: mongo_2_dictionary.py
- 把数据转成 Apple Dictionary 支持的 TSV 格式。
- ⚠️ 避坑:不要用
\t\n, 用 HTML 标签来控制排版,用<div>表示新行,用<br>来做分隔。这样避免了特殊字符被误解析。
- ⚠️ 避坑:不要用
- 用 PyGlossary 把
.tsv转成 AppleDict 的源文件。pyglossary dictionary_dump.tsv output.dictionary --read-format=Tabfile --write-format=AppleDict- ⚠️ 避坑:不要用 CSV, 一开始我试过 CSV,但 AppleDict 的编译脚本会直接解析失败。
- 编译 Apple Dictionary
- PyGlossary 会生成一个字典目录,里面包含:
.xml源文件,.css样式文件,.plist配置文件,Makefile - 正常情况下,进入目录直接运行:
make ; make install
- PyGlossary 会生成一个字典目录,里面包含:
- 安装完成后,打开 macOS 自带的“字典”应用,在settting里勾选新字典。
工具和坑点总结
- 需要安装 Dictionary Development Kit (DDK)
- 据说macOS 有自带的
dictutil我没有找到。 - DDK 要单独安装(Xcode 附带)。
- 据说macOS 有自带的
- 不要用 DDK 官方的
build_dict.sh, 用 PyGlossary 生成- 这个脚本里调用的
make_line.pl,perl 脚本里有 bug。无法解决. xml 格式也非常讨厌
- 这个脚本里调用的
- 样式限制
- Apple Dictionary 对标题样式是写死的,没法自定义。
- 调试
- 我在自己本地的dev版app上调试, 发现字典不是实时更新的, 需要重启之后才会加载新的 (可能是
DictionaryServices.framework的行为特性, 每个app单独一个缓存, 字典也在里面, 不会热更新)
- 我在自己本地的dev版app上调试, 发现字典不是实时更新的, 需要重启之后才会加载新的 (可能是
结果

- 效果和官方字典差不多
- 但是在一些网页的在线代码编辑器(可能用的是自绘控件, 而不是macos的Cocoa文本系统)和微信(lookup被软件禁用)不能用