PyGlossary:将其它格式的字典转换成 Kindle 字典

之前书伴曾写过一篇文章《如何把 MDX 格式词典转换成 Kindle 字典》,介绍了一种将 MDX 格式的字典转换成 Kindle 字典的方法。不过该方法有三个缺点:一是只能转换源格式为 MDX 的字典;二是步骤较多、操作较为繁琐;三是部分操作依赖 Windows 系统,对于使用其它系统的(如 macOS)的小伙伴来说不太方便。为解决这个问题,本文将会介绍一种跨平台且支持更多格式的 Kindle 字典转换方法。

目录

一、安装运行 PyGlossary
● Windows 系统
● macOS 系统
二、转换 Kindle 字典源码
三、修改 Kindle 字典源码
四、生成 Kindle 字典文件
五、附录:PyGlossary 支持的格式

本文会将用到 PyGlossaryKindleGen 这两款软件。PyGlossary 是一款开源跨平台的字典转换工具,可将多种字典格式转换成不同字典格式,这里我们主要用它转换 Kindle 字典格式。KindleGen 是亚马逊官方提供的 Kindle 电子书转换工具,我们用它来把源代码转换成 MOBI 格式的 Kindle 字典。

一、安装运行 PyGlossary

以下是针对各操作系统的安装方法,也可参考项目中的 README.md 文档提供的的步骤进行安装。

● Windows 系统

1、安装 Python3 及相关依赖:

PyGlossary 需要你的操作系统装有 3.8 或更新的 Python 版本,如此条件已具备可跳过此步骤。

从 Python 官方网站下载最新版 Python 并安装(3.8 或 3.9 版本皆可,推荐 3.9)。为确保可以直接在“命令提示符”中使用相关命令,安装开始时,请务必在安装界面上勾选“Add Python 3.9 to PATH”

Python 安装完成后,以管理员身份运行“命令提示符”(先按组合快捷键 Win + R 调出“运行”窗口,然后输入 cmd,最后同时按住 Ctrl + Shift 并按 Enter 键)。在命令提示符中输入以下命令并按 Enter 键:

pip3 --version

如果 pip 命令可用的话,应该可以看到类似如下所示的提示信息:

pip 21.0 from /usr/local/lib/python3.9/site-packages/pip (python 3.9)

注意:如果你的 Windows 系统曾安装过 Python 2.x 版本,可能会遇到环境变量冲突问题,解决方法是将新安装的 Python 3.x 程序目录中的 python.exe 复制一份并将其重命名为 python3.exe,这样就可以在命令提示符中使用 python3 命令来使用新版本的 Python,使用 python 命令使用旧版本的 Python。

2、安装 PyGlossary:

在命令提示符中输入以下命令并按 Enter 键安装 PyGlossary:

pip3 install pyglossary

安装完成后,在命令提示符中执行命令 pyglossary --version,如看到版本号就表示安装成功。

3、运行 PyGlossary:

在命令提示符中输入如下所示的命令并按 Enter 键即可启动带界面的 PyGlossary:

pyglossary --tk

* 提示:如果运行时出现了错误提示 FileNotFoundError: [Errno 2]反馈1反馈2),这是由于安装了项目作者最近引入 BUG 的版本导致的,解决此问题请运行命令 pip3 install pyglossary --upgrade --pre 安装已修复的版本。

● macOS 系统

1、安装 Homebrew:

对于 macOS 系统,书伴推荐使用包管理器 Homebrew 安装 Python3 及相关环境依赖。如果你的系统还未安装 Homebrew,请打开“应用程序 → 实用工具”中的“终端”程序,并输入如下所示的命令:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

安装完成后,输入命令 brew --version,如看到类似如下所示信息就表示安装成功:

brew --version

Homebrew 3.0.1
Homebrew/homebrew-core (git revision 013cd; last commit 2021-02-16)
Homebrew/homebrew-cask (git revision ef7151; last commit 2021-02-16)

2、安装 Python3 及相关依赖:

在终端输入如下所示命令按 Enter 键安装 Python3 及相关依赖:

brew install python3 pygobject3 gtk+3

3、安装 PyGlossary:

在终端输入如下命令按 Enter 键安装 PyGlossary:

pip3 install pyglossary

安装完成后,在终端输入命令 pyglossary --version并按 Enter 键,如看到版本号就表示安装成功。

4、运行 PyGlossary:

运行如下所示的命令启动带界面的 PyGlossary:

pyglossary --gtk

* 提示:PyGlossary 提供了两种图形界面方案,一种是 Python3 内置的 Gtk3,另一种是 Tkinter,可以在运行 pyglossary 命令时附加参数 --gtk--tk 指定相应的界面方案。如果只运行 pyglossary 命令不附加参数,PyGlossary 会优先使用 Gtk3,若不满足条件则使用 Tkinter。对于 Gtk3 界面方案,Windows 系统安装起来可能比较麻烦,所以建议使用 Tkinter;对于 Tkinter 方案,由于 PyGlossary 使用了 Tix 扩展,在 macOS 系统中与 Python3 存在兼容问题,所以建议使用 Gtk3。此外 PyGlossary 还支持命令行界面,如喜欢这种使用方式,可通过 pyglossary --help 命令查看使用说明。

除 Windows 系统和 macOS 系统外,PyGlossary 还支持众多分发版本的 Linux 系统(如 Ubuntu)。如果你使用的是 Linux 系统,请根据自己使用的分发版本,参考官方文档相应内容进行安装。

二、转换 Kindle 字典源码

目前 PyGlossary 转换 Kindle 字典的功能还不太完善,无法直接将其它字典格式转换成最终的 Kindle 字典文件,因此需要一个中间过程:先将其它字典格式转换成 Kindle 字典源代码,然后对源代码做一些必要的修改,最后再用 KindleGen 把源代码转成最终的 Kindle 字典文件。以下是详细转换步骤。

  1. 点击“Input File”输入框后面的【Browse】按钮,在弹出的窗口中选择要转换的字典文件(软件会自动检测文件格式,如检测有误,可通过“Input Format”后面的【[Select Format]】手动选择)。
  2. 点击软件界面上的“Output File”输入框后面的【Browse】按钮,在弹出的窗口的“文件名”处输入转换后的源代码将要存放的文件夹名称(注意,为避免混淆,名称最好不要与当前路径中已存在的文件夹同名)。
  3. 点击“Output Format”后的【[Select Format]】,在弹出框中双击选定“MOBI E-Book”。
  4. 最后点击界面上的大按钮【Convert】开始转换,直至转换完毕。

注意,正如前面所提到的,PyGlossary 转换 Kindle 字典的功能还不够完善和健壮,如在转换过程中可能会遇到卡顿或命令提示符出现错误提示,都不必担心,只需要确保它成功输出了源文件即可。

三、修改 Kindle 字典源码

接下来使用代码编辑器打开转换后源码中的 content.opf 文件,修改必要的字典元数据。

首先是为字典的语言元数据设定语言代码,一般情况下字典的语言和要查询字词的语言一致。

假设字典为“英汉字典”,那么字典语言就应为“英语”,语言代码为“en”。该元数据会影响字典在 Kindle 中的某些行为。比如在 Kindle 设备的设置中为英语这一语言指定默认字典时,如果语言代码有误,就会找不到该字典。另外,错误的语言代码还会导致即便是英文电子书,查词时也无法自动调用该字典。

更改前:

<dc:Language></dc:Language>

更改后:

<dc:Language>en</dc:Language>

然后是设定字典的输入语言代码,即查询字词的语言。示例中为“英文”,语言代码为“en”。

更改前:

<DictionaryInLanguage></DictionaryInLanguage>

更改后:

<DictionaryInLanguage>en</DictionaryInLanguage>

最后是设定字典的输出语言代码,即释义内容的语言。示例中为“中文”,语言代码为“zh”。

更改前:

<DictionaryOutLanguage></DictionaryOutLanguage>

更改后:

<DictionaryOutLanguage>zh</DictionaryOutLanguage>

* 提示:language 标签中的“语言代码”需符合 RFC5646 标准(来源),如 enzh-CNDictionaryInLanguageDictionaryOutLanguage 标签中的“语言代码”需符合 ISO 639-1 标准(来源),如 en,可附加区域性代码,如 en-us

至此,字典的源代码已经准备完毕,接下来就需要将其转换成最终可用的 Kindle 字典文件。

四、生成 Kindle 字典文件

将源码转换成 MOBI 格式的字典需要用到亚马逊官方提供的电子书转换工具 KindleGen。请先按照《官方转换工具 Kindle Previewer 和 KindleGen》这篇文章准备好 KindleGen 程序并掌握其使用方法。

接下来就可以执行如下所示的命令将源代码转换成最终的 Kindle 字典文件(注意,Windows 系统中想要直接运行 kindlegen 命令,必须将其添加到系统的环境变量,具体方法参考上面提到的文章):

kindlegen /path/to/content.opf -dont_append_source

注意,命令中的 /path/to/content.opf 必须换成真实的 content.opf 文件路径,否则就是无效命令。假设输出的文件夹名为 sample,存放在桌面上,在 macOS 系统或 Linux 系统中,其路径应如下所示:

~/Desktop/OEBPS/content.opf

在 Windows 系统中,其路径应如下所示(YOURNAME 替换成真实的系统用户名):

C:\Users\YOUNAME\Desktop\sample\OEBPS\content.opf

五、附录:PyGlossary 支持的格式

PyGlossary 支持的输入格式:

名称简介扩展名
Aard2SlobAard 2 (.slob).slob
ABCMedicalNotesABC Medical Notes (SQLite3)
AlmaanyAlmaany.com (SQLite3)
AppleDictBinAppleDict Binary.dictionary .data
BabylonBglBabylon (.BGL).bgl
CC-CEDICTCC-CEDICT.u8
cc-kedictcc-kedict
CrawlerDirCrawler Directory.crawler
CsvCSV (.csv).csv
DicformidsDictionaryForMIDs.mids
DictccDict.cc (SQLite3)
Dictcc_splitDict.cc (SQLite3) – Split
DictOrgDICT.org file format (.index).index
Dictunformatdictunformat output file.dictunformat
DigitalNKDigitalNK (SQLite3, N-Korean)
ABBYYLingvoDSLABBYY Lingvo DSL (.dsl).dsl
DictfileKobo E-Reader Dictfile (.df).df
EdlinEDLIN.edlin
FreeDictFreeDict (.tei).tei
GettextPoGettext Source (.po).po
InfoGlossary Info (.info).info
JMDictJMDict
LingoesLDFLingoes Source (.ldf).ldf
OctopusMdictOctopus MDict (.mdx).mdx
SdictSdictionary Binary(dct).dct
StardictStarDict (.ifo).ifo
TabfileTabfile (.txt, .dic).txt .tab .tsv
WiktionaryDumpWiktionary Dump (.xml).xml
WordsetWordset.org JSON directory
XdxfXDXF (.xdxf).xdxf
ZimZim (.zim, for Kiwix).zim

PyGlossary 支持的输出格式:

名称简介扩展名
Aard2SlobAard 2 (.slob).slob
AppleDictAppleDict Source.apple
CrawlerDirCrawler Directory.crawler
CsvCSV (.csv).csv
DicformidsDictionaryForMIDs.mids
DictOrgDICT.org file format (.index).index
DictOrgSourceDICT.org dictfmt source file.dtxt
Epub2EPUB-2 E-Book.epub
KoboKobo E-Reader Dictionary.kobo
DictfileKobo E-Reader Dictfile (.df).df
MobiMOBI E-Book.mobi
EdlinEDLIN.edlin
FreeDictFreeDict (.tei).tei
GettextPoGettext Source (.po).po
HtmlDirHTML Directory.hdir
InfoGlossary Info (.info).info
JsonJSON (.json).json
LingoesLDFLingoes Source (.ldf).ldf
SdictSourceSdictionary Source (.sdct).sdct
SqlSQL (.sql).sql
StardictStarDict (.ifo).ifo
TabfileTabfile (.txt, .dic).txt .tab .tsv

* 注:以上内容也可通过执行命令 pyglossary --help 查看。

有帮助,分享给其他小伙伴:

发表评论

标注为 * 的是必填项。您填写的邮箱地址将会被保密。如果是在本站首次留言,审核后才能显示。
若提问,请务必描述清楚该问题的前因后果,提供尽可能多的对分析该问题有帮助的线索。

小伙伴们发表了 17 条评论

  1. 点击软件界面上的“Output File”输入框后面的【Browse】按钮,在弹出的窗口的“文件名”处输入源代码存放的文件夹名称(注意,为避免混淆,名称最好不要与当前路径中已存在的文件夹同名)。中的源代码存放文件怎么看啊

  2. kindlegen出现了【错误(kindlegen):E30010: 不受支持的自变量】提示,请问可以怎么解决呢?

      • 把kindlegen加入环境变量后执行kindlegen /path/to/content.opf -dont_append_source命令后出现的……

      • 如果用提供的另一种输入C:/Kindlegen/kindelgen.exe的方法的话则会出现错误【(kindlegen):E30005: 不能打开文件】这样的提示。

            • 【重新尝试又变成这样了…….】

              C:\Users\LLY>kindlegen D:\文档\杂项\kindle字典\dictionary\OEBPS\content.opf

              *************************************************************
              Amazon kindlegen(Windows) V2.9 build 1029-0897292
              命令行电子书制作软件
              Copyright Amazon.com and its Affiliates 2014
              *************************************************************

              信息(prcgen):I1047: 已添加的元数据dc:Title “西汉词典”
              信息(prcgen):I1047: 已添加的元数据BASICCode “REF008000”
              信息(prcgen):I1047: 已添加的元数据dc:Subject “Dictionaries”
              错误(core):E1005: 无法访问文件。
              文件中: D:\文档\杂项\kindle字典\dictionary\OEBPS\style.css
              信息(prcgen):I1002: 解析文件 0020100
              信息(cssparser):I10005: 没有发现 CSS 文件 “D:\文档\杂项\kindle字典\dictionary\OEBPS\style.css”
              警告(parser8):W26001: 索引不支持改进的 mobi 域名。
              错误(core):E1005: 无法访问文件。
              文件中: D:\文档\杂项\kindle字典\dictionary\OEBPS\g014748.xhtml

  3. 安装成功,但是执行命令 pyglossary –version 时出现

    Traceback (most recent call last):
      File "c:\users\administrator\appdata\local\programs\python\python39\lib\runpy.py", line 197, in _run_module_as_main
        return _run_code(code, main_globals, None,
      File "c:\users\administrator\appdata\local\programs\python\python39\lib\runpy.py", line 87, in _run_code
        exec(code, run_globals)
      File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\Scripts\pyglossary.exe\__main__.py", line 4, in 
        from pyglossary.ui.main import main
      File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\pyglossary\ui\main.py", line 30, in 
        from pyglossary.ui.base import UIBase
      File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\pyglossary\ui\base.py", line 46, in 
        aboutText = fread(join(dataDir, "about"))
      File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\pyglossary\ui\base.py", line 40, in fread
        with open(path, encoding="utf-8") as fp:
    FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python\\share\\pyglossary\\about'
    Traceback locals:
        path = 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Pytho...
        len(path) = 82

    是什么原因,有解决办法吗

    • 这是项目作者最近引入的一个 BUG。四天前有人在项目 Issues 中提出了这个问题(链接),作者给出了解决方法,运行下面这条命令安装已修复版本:

      pip3 install pyglossary --upgrade --pre