一. EPUB文件是什么?
- EPUB文件是电子出版物业务单位使用的一种文件格式。
- 通常用于存储和呈现电子书、杂志、报纸等电子出版物。
- 具有结构化的内容,包括文本、图片、表格等。
二. 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翻译功能, 可以参考