从零开始制作一个简单的 Kindle 字典

Kindle 字典支持 PRC、AZW 和 MOBI 格式,制作 Kindle 字典和制作 Kindle 电子书基本没差别,所需要的文件也都一样,都要使用 OPF、HTML 以及封面图片。只不过和电子书相比,字典可以不用 CSS、字体等用于排版的文件。因此同样可以使用 Kindle Previewer 将这些文件转换成 MOBI 格式字典。

目前网络上的教程都是使用 KindleGen 命令行工具来转换,但该工具亚马逊官方已经不再提供下载,并建议我们使用 Kindle Previewer 来替代。Kindle Previewer 是图形化的软件,提供包含 KindleGen 相同的功能,此外还有其他增强功能,但对于字典的制作或许并没有优势。

Kindle Previewer 是亚马逊官方开发的软件,官方下载页面为:https://www.amazon.com/gp/feature.html?ie=UTF8&docId=1000765261

官方当前版本 3.47 要求在 Windows8 及其以上版本的操作系统上使用,但站长使用 Windows7 安装成功并可以正常使用。

从零开始制作一个简单的 Kindle 字典

改为中文界面:

从零开始制作一个简单的 Kindle 字典

制作 Kindle 字典所需要的文件

  • 一张 Kindle 字典封面图片(用来显示字典的封面)
  • 一份 HTML 格式的字典源文件(包含词条、释义等)
  • 一份包含字典详细信息的 OPF 文档(包括字典的元数据等)

可以点击这里下载 Kindle 字典模板文件。对这三个生成 Kindle 字典必需的文件,下面将会详细解释他们的代码构成细节以及相关注意事项,你可以参照这些解释对模板进行修改和扩充。

以下操作需要对 HTML 结构和标签等有一定的了解,并且建议使用 notepad++ 等高级文本编辑器来修改文档。

1、Kindle 字典封面图片

首先,你可以给你的字典制作一张精美的封面图片,规格建议如下:

格式:JPG、JPEG、PNG 或 TIFF 格式

尺寸:宽 758 像素,长 1024 像素(也可按此比例制作)

新建一个名为“images”的文件夹,把封面图片命名为“cover.png”放进去(这里只是以此为例,你可以选择其他的格式,请保证下面文件中的图片文件名和该格式一致)。

2、HTML 格式字典源文件

字典中的所有词条都以一种特殊的 HTML 代码格式存放在一份 HTML 文档中,我们只需要按照这种格式和规则把词条一条条添加进去即可。下面是一份简化了的“英汉字典” HTML 文档模板,挑选了一个具有代表性的、能代表大多数单词格式的单词“do”作为示例。其中标签 <!-- 注释 --> 以及被其包裹的内容仅起到注释说明的作用,对相关代码进行了详细解释,使用时可删除。

<html>

<head>
  <!-- 指定文件编码为 UTF-8 -->
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>

<body>

  <div>
    <!-- 添加封面图片,注意确保路径正确 -->
    <p><img src="images/cover.png" width="100%" height="100%" alt="cover" /></p>
  </div>
  
  <mbp:pagebreak/><!-- 分页符 -->

    <!-- 字典扉页。不需要也可以忽略这一块内容 -->
    <p>《现代英汉》</p>
    <br/>
    <p>这里可以撰写字典介绍。</p>
    <br/>
    <p>版权信息</p>
    <p>© kindleer.com 202010</p>

  <mbp:pagebreak/>

    <!-- 字典说明。不需要也可以忽略这一块内容 -->
    <h2 align="center">说明</h2><!-- 标题 -->
    <!-- 说明条目1 -->
    <p><b>1.说明条目1</b></p>
    <blockquote>
      <p>1) 详细说明1。</p>
      <p>2) 详细说明2。</p>
      <p>3) 详细说明3</p>
      <!-- 如果小项还需要细分条目可以再嵌套一个 blockquote -->
      <blockquote>
        <p>详细说明</p>
        <p>详细说明</p>
      </blockquote>
    </blockquote>
    <!-- 说明条目2 -->
    <p><b>2.说明条目2</b></p>
    <blockquote>
      <p>1) 详细说明1。</p>
      <p>2) 详细说明2:</p>
    </blockquote>

  <mbp:pagebreak/>

  <!-- 起始位置标记 -->
  <a id="filepos1" />

  <!-- 分组 -->
  <mbp:frameset>
    <hr/>
    <!-- 词条块 -->
    <idx:entry scriptable="yes">
      <!-- 锚定单词 do -->
      <idx:orth value="do">
        <!--
          下面这些都是单词 do 的词形变化,当选取这些单词的时候都显示 do 的释义。如果单词只有一种形态,可以不添加<idx:infl></idx:infl>区块。
        -->
        <idx:infl>
          <idx:iform name="" value="did" />
          <idx:iform name="" value="does" />
          <idx:iform name="" value="doing" />
          <idx:iform name="" value="done" />
          <idx:iform name="" value="dos" />
          <idx:iform name="" value="done" />
          <!-- 除了词形的变化,还可以添加其他的比如带有 ' 的,还有词组 do something,这样当选取带 ' 的如 do's 或者 do sometings 时也会显示 do 的释义。-->
          <idx:iform name="" value="do's" />
          <idx:iform name="" value="'do" />
          <idx:iform name="" value="'dos" />
          <idx:iform name="" value="'do something" />
        </idx:infl>
      </idx:orth>
      <!-- 显示单词 do 的第一种解释,可以对其显示做一些简单的样式改变,如加粗<b>、上标<sup> -->
      <b><word homo_no="1">do<sup>1</sup></word></b>
      <br/><!-- 换行 -->
      <!-- 单词音标 -->
      <phonetic>/dʊ,də;duː/</phonetic>
      <!-- 单词释义 -->
      <category>
        <!-- 词性,同样可以进行一些简单的样式改变,如加粗<b>、斜体<i> -->
        <cat><b><i>vt</i></b></cat>
        <br/>
        <!-- do 的第 1 条释义 -->
        <sense>
          <!-- 标号 -->
          <b>1.</b>
          <!-- 含义 -->
          <description>做,办,干;尽(力)</description>
          <!-- 示例 -->
          <example>
            <!-- 源语言 -->
            <source><i>do</i> good deeds </source>
            <!-- 目标语言 -->
            <target>做好事</target>
          </example>
          <example>
            <source>I know what to <i>do</i>. </source>
            <target>我知道应该做什么。</target>
          </example>
        </sense>
        <br/>
        <!-- 第 2 条释义 -->
        <sense><b>2.</b>
          <description>担任,从事;学习,研究</description>
          <example>
            <source><i>do</i> carpentry </source>
            <target>做木工活</target>
          </example>
        </sense>
        <br/>
        <!-- 第 n 条释义 -->
        <sense><b>n.</b>
          <description>完成,做完</description>
          <example>
            <source>I have done my homework. </source>
            <target>我已经做完了家庭作业。</target>
          </example>
        </sense>
      </category>
    </idx:entry>
    <hr/><!-- 分割线 -->
    <!-- 词条块 -->
    <idx:entry scriptable="yes">
      <!-- 单词释义 -->
      <!--
        因为这里的锚定的 do 和上面的单词一样,所以 Kindle 会对该单词进行分页处理,也就是在单词释义面板上方出现箭头“<”和“>”,可以对同形不同义的单词进行切换。
      -->
      <idx:orth value="do">
        <idx:infl>
          <idx:iform name="" value="did" />
          <idx:iform name="" value="do's" />
          <idx:iform name="" value="does" />
          <idx:iform name="" value="doing" />
          <idx:iform name="" value="done" />
          <idx:iform name="" value="dos" />
          <idx:iform name="" value="done" />
          <idx:iform name="" value="'do" />
          <idx:iform name="" value="'dos" />
        </idx:infl>
      </idx:orth>
      <!-- 显示单词 do 的第二种解释,加粗、上标 -->
      <b><word homo_no="2">do<sup>2</sup></word></b>
      <br/>
      <phonetic>/dʊ,də;duː/</phonetic>
      <category>
        <cat><b><i>vt</i></b></cat>
        <br/>
        <sense><b>1.</b>
          <description>做,办,干;尽(力)</description>
          <example>
            <source><i>do</i> good deeds </source>
            <target>做好事</target>
          </example>
          <example>
            <source>I know what to <i>do</i>. </source>
            <target>我知道应该做什么。</target>
          </example>
          <example>
            <source><i>do</i> all one can </source>
            <target>竭尽全力</target>
          </example>
          <example>
            <source><i>do</i> one's duty </source>
            <target>尽本分</target>
          </example>
        </sense>
        <!-- 下面还可以继续添加 sense,这里不再重复 -->
      </category>
    </idx:entry>
    <hr/>
  </mbp:frameset>

  <mbp:pagebreak/>

</body>
</html>


 

从上面的代码可以看出 <mbp:frameset> ... </mbp:frameset> 是大分组,这是可选的,如果你不需要分组可以删掉这两个标签。大分组包含每个用 <idx:entry scriptable="yes"> ... </idx:orth> 包裹着的单词块。单词块里面又细分为由 <idx:orth value="do"> ... </idx:orth> 包裹的锚定单词(作用是让点选单词与本词条相关联)、由 <idx:infl> ... </idx:infl> 包裹的同义不同形的单词(单词只有一种形式可删掉这块代码)、由 <category> ... </category> 包裹着的单词释义,不同的释义又被 <sense>... </sense> 区分开。

另外,大分组间用 <mbp:pagebreak/> 分页(当然如果你不用大分组,也可以用它把每个单词分页),单词与单词间用 <hr/> 添加分割线,不同段落或释义间用 <br/> 换行。

字典的结构就是这种很简单的嵌套关系。制作的时候只需要不断的复制 <idx:entry scriptable="yes"> 并修改其间的内容,就可以把新单词增加进去了。如果一个单词有多个释义,那就保证两个单词的代码块中的 <idx:orth value="do"></idx:orth> 是相同的就可以了。

需要特别说明一下,有很多小伙伴反应 Kindle 第三方字典如 “牛津高阶英语词典(英英&英汉双解)(第七版)Oxford Advanced Learner’s Dictionary 7th”会出现无法滚动、翻页的情况,而官方字典却正常。其实这是因为第三方字典的内部结构问题导致的。

上面的这段 HTML 源码就是从官方字典中析取出来的,可以看出官方的字典没有什么特别的,只是把很多释义分成了若干小段,用很多代码段组织了一下。但第三方字典就没这么讲究了,他们的内容其实并没有缺失,只是有些释义特别长,但是只用了一个 <p> .. </p> 标签简单包裹了一下,可能就是因为单个标签内的内容过多,导致 Kindle 在读取的时候丢失了信息的。

如果没有下载模板文件,可以把上面这段 HTML 代码复制到编辑器中,修改、添加完毕后另存为“My_Advanced_Dict.html”备用。注意后缀名是 .html。

3、OPF 格式字典配置文件

我们最终是需要用 Kindle Previewer 把上面编辑好的 HTML 字典源文件转换成适用于 Kindle 的 MOBI 格式字典的,所以还需要用一个配置文件告诉 Kindle Previewer 生成时该怎么样处理上面的 HTML 文件,否则直接转换出来的只是普通的 MOBI 电子书文件,不能作为字典使用。OPF 文件只是个简单的 XML 文件,下面是一个标准的模板,对于其中一些有用的参数也做了说明。

<?xml version="1.0" encoding="utf-8"?>
<package unique-identifier="uid" version="2.0" xmlns="http://www.idpf.org/2007/opf">
  <!-- 字典元数据 -->
  <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
    <dc-metadata xmlns:dc="http://purl.org/metadata/dublin_core" xmlns:oebpackage="http://openebook.org/namespaces/oeb-package/1.0/">
      <dc:Title>My First Dict</dc:Title><!-- 字典名称 -->
      <dc:Language>en</dc:Language><!-- 字典语言 -->
      <dc:Identifier id="uid">02FFA518EB</dc:Identifier><!-- 字典标识符 -->
      <dc:creator>Kindleer</dc:creator><!-- 创建人 -->
      <dc:publisher>kindleer.com</dc:publisher><!-- 发布商 -->
      <dc:date opf:event="publication">2020-10-20</dc:date><!-- 发布日期 -->
    </dc-metadata>
    <x-metadata>
      <output encoding="utf-8"/>
      <DictionaryInLanguage>en</DictionaryInLanguage><!-- 输入语言 -->
      <DictionaryOutLanguage>zh-cn</DictionaryOutLanguage><!-- 输出语言 -->
      <EmbeddedCover>images/cover.png</EmbeddedCover><!-- 封面图片 -->
    </x-metadata>
  </metadata>
  <!-- 资源列表 -->
  <manifest>
    <item href="My_Advanced_Dict.html" id="item1" media-type="text/x-oeb1-document"/><!-- HTML 文件 -->
    <item href="images/cover.png" id="item2" media-type="image/png"/><!-- 图片文件 -->
  </manifest>
  <!-- 骨架文件 -->
  <spine>
    <itemref idref="item1"/> <!-- 对应 <manifest> 中的 html 文件 -->
  </spine>
  <tours/>
  <!-- 页面指引 -->
  <guide>
    <reference href="My_Advanced_Dict.html#filepos1" title="Start Reading" type="start"/><!-- 打开起始位置,对应 HTML 文件中的相应 ID -->
  </guide>
</package>

注意:如果你的封面图片是 jpg 格式请把 <item href="images/cover.png" id="item2" media-type="image/png"/> 中的 cover.png 修改成 cover.jpg,再把 media-type=”image/png” 修改成 media-type=”image/jpeg”。

如果没有下载模板文件,请把上面这段代码复制到编辑器中,修改添加完毕后另存为“My_Advanced_Dict.opf”备用。注意后缀名是 .opf。

可能有的小伙伴会产生疑问,Kindle 是怎么区别字典文件和普通电子书文件的呢?秘密就在上面代码中的两段声明,如下所示,正是“DictionaryInLanguage(输入语言)”和“DictionaryOutLanguage(输出语言)”这两个声明告诉 Kindle 这是一本字典而不是普通电子书。

...
<DictionaryInLanguage>en</DictionaryInLanguage><!-- 输入语言 -->
<DictionaryOutLanguage>zh-cn</DictionaryOutLanguage><!-- 输出语言 -->
...

如果你想要做的字典不是“英汉字典”而是“汉语字典”,那就只需要把上面代码中与语言相关声明都改成中文即可(英文或其他语言如“日日字典”同理),如下所示:

...
<dc:Language>zh-cn</dc:Language><!-- 字典语言 -->
...
<DictionaryInLanguage>zh-cn</DictionaryInLanguage><!-- 输入语言 -->
<DictionaryOutLanguage>zh-cn</DictionaryOutLanguage><!-- 输出语言 -->
...

 

用 Kindle Previewer 生成 Kindle 字典

现在我们准备好了所有生成 Kindle 字典必需的文件:字典封面图片文件、HTML 格式字典源文件、OPF 格式配置文件,他们的放置位置关系应该如下所示:

├─── images
│     └──── cover.png
├─── My_Advanced_Dict.html
└─── My_Advanced_Dict.opf

“文件”“打开电子书”选择 opf 文件。

从零开始制作一个简单的 Kindle 字典

“文件”“导出”选择导出 mobi 格式。

从零开始制作一个简单的 Kindle 字典

把 Kindle 用 USB 连接到电脑,把字典文件拖到 documents 文件夹里的 dictionaries 文件夹中。断开 USB 连接。打开 Kindle,进入字典收藏夹,就可以看到名为“My First Dict”的字典了。随便打开一本英文电子书,找到单词“do”,点选调出字典解释面板。点击面板右下角的字典名,在字典列表中选择刚放进去的“My First Dict”。是不是你自定义的释义就出现了。你可以对字典内容进行上下滚动以及翻页的操作。效果如下所示:

从零开始制作一个简单的 Kindle 字典

一般面对一个稍微完整的字典的上万个词条这样一个一个写是枯燥繁琐的,普通人都不会去干吧,本教程对于日后修改第三方字典也是有帮助的。

匿名

发表评论

匿名网友填写信息

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: