文档翻译 - 如何翻译EPUB文件?

563 阅读3分钟

一. EPUB文件是什么?

  1. EPUB文件是电子出版物业务单位使用的一种文件格式。
  2. 通常用于存储和呈现电子书、杂志、报纸等电子出版物。
  3. 具有结构化的内容,包括文本、图片、表格等。

二. EPUB文件的结构

简要结构:

META-INF 文件夹:该文件夹包含了 EPUB 文件的元数据信息,如容器文件、加密信息和版本号等。

OEBPS 文件夹:OEBPS(Open eBook Publication Structure)文件夹是 EPUB 文件的核心内容文件夹,包含了电子书的各个组成部分。

  • content.opf 文件:这是 EPUB 文件的主要元数据文件,包含了电子书的描述信息、章节结构、文本文件和媒体资源的引用等。
  • toc.ncx 文件:这是 EPUB 文件的目录文件,定义了电子书的章节和目录结构,提供了导航和定位功能。
  • HTML 文件:EPUB 文件的内容通常以 HTML 文件的形式存在,每个 HTML 文件代表一个章节或页面。
  • CSS 文件:EPUB 文件可以包含用于样式和布局的 CSS 文件,控制电子书的外观和排版。
  • 图像、音频和视频文件:EPUB 文件可以包含嵌入的图像、音频和视频文件,用于丰富内容和互动元素。
  • 其他文件:EPUB 文件可能还包含其他辅助文件,如字体文件、样式表、脚本文件等,用于定制和增强电子书的功能和外观。

EPUB 文件使用 ZIP 压缩格式进行打包,并采用了开放的标准化技术,如 XML、HTML 和 CSS,以实现内容的结构化、布局和呈现。这种文件结构使得 EPUB 文件易于创建、编辑、分发和阅读,并且可以在不同的电子阅读器和平台上提供统一的阅读体验。

三. 提取EPUB中需要翻译的文本

翻译EPUB并保留显示格式不变化, 最简单的方式, 就是定位所有文本所在的位置, 然后把对应位置的文本翻译并填充回去.

需要使用的第三方库:

jszip: 在JavaScript中创建、读取和操作ZIP文件的库。
Cheerio: 一个基于类似 jQuery 的快速、灵活和精简的 HTML 解析和操作库。

1. 使用 jszip 读取EPUB文件

const epubFile = 'epub文件路径'
const fileBuffer = fs.readFileSync(epubFile)
const zip = await JSZip.loadAsync(fileBuffer)

2. 根据文件后缀, 找到所有的HTML文件

for (let filePath of Object.keys(zip.files)) {
  if (filePath.endsWith('.html') || filePath.endsWith('.htm') || filePath.endsWith('.xhtml')) {
    const html = await zip.file(filePath)?.async('string')
    if (html) {
       // 读取html中的文字
    }
  }
}

3. 使用cheerio读取html中的文本节点, 并翻译

const $ = cheerio.load(html)
for (let selector of ['body', 'head']) {
    $(selector)
        .find('*')
        .contents()
        .each(
            function () {
                // nodeType === 3 是 Text 类型的节点, data就是对应的文本
                if (this.nodeType === 3 && this.data.trim() !== '') {
                    // 使用ChatGPT翻译 this.data ..., translate 代表需要的翻译函数, 可以使用ChatGPT翻译
                    this.data = translate(this.data)
                }
            }
        )
}

4. 把翻译后的HTML替换压缩包里的文件

EPUB中对html的格式验证很严格. 如果格式不对会导致"文档已损坏"的错误.
{xml:true} 选项可以保证HTML格式中的不会出现标签不匹配的问题.

await zip.file(filePath, $.html({ xml: true }), {
   compression: 'DEFLATE',
   compressionOptions: { level: 3 }
})

5. 优化建议

  • 翻译EPUB的元数据(元数据中包含EPUB的书名等资料). 元数据是XML格式, 翻译的方式和HTML类似.
  • 结合ChatGPT的上下文理解的方式翻译文本, 而不是单独翻译HTML中的每一处文本. 这个处理的优化空间很大, 也需要比较精细的处理.

如果需要现成的EPUB翻译功能, 可以参考

如何使用ChatGPT翻译文档(PDF/EPUB/Word/Excel/PowerPoint)?