为什么Python的gettext模块需要编译步骤(.po -> .mo)?
我觉得编译这个步骤没有什么用处。
3 个回答
0
我觉得编译的过程是从 .po 文件变成 .mo 文件。
.po 文件中的 PO 代表可移植对象,目的是和 .mo 文件区分开来,.mo 文件中的 MO 则代表机器对象。
MO 文件是为了让程序读取的,它们是二进制格式的。现在有一些系统提供了工具,可以用来创建和处理 MO 文件,这些工具是系统自带的本地语言支持的一部分。不过,不同系统的 MO 文件格式往往不一样,所以它们不能在不同的系统之间通用。
1
因为Python中的gettext模块遵循GNU gettext标准,这个标准要求使用PO文件来进行人们的翻译,而使用MO文件则是为了在应用程序运行时使用。当你使用gettext模块时,实际上是在使用GNUTranslations这个类,名字就说明它是GNU gettext的实现。
不过,你可以提供自己的翻译类,并从PO文件中加载翻译,这并没有什么特别的。实际上,Python的标准库中就有一些PO文件读取的实现,可以查看Tools目录下的msgfmt.py脚本。
5
快速了解了一下 .mo
文件,可以得出以下几点:
- 它是一种机器可读的表示方式
- 它是一个哈希表
考虑到 gettext 的功能是根据键在运行时查找字符串,所以这个查找过程需要高效实现,这样才合理。
另外,为了让 gettext 的性能影响微乎其微,英语国家的程序员们对国际化的兴趣才不会降低(毕竟我们都说英语,编程语言也是用英语)。
将 .mo
文件做成已经处理好的表示方式是个好主意,因为:
- 这种格式非常适合快速查找(哈希表)
- 这种格式在应用启动时需要的处理很少(自定义的二进制表示)