编译PO文件为MO文件的好处

4

将GNU gettext的.po(便携式对象)文件编译成.mo(机器对象)文件的好处和主要原因是什么?

我看到很多程序直接读取/解析.po

我没有使用WordPress,但在他们的文档中说:

https://codex.wordpress.org/I18n_for_WordPress_Developers

PO文件被编译为二进制MO文件,这样在运行时可以更快地访问字符串。

更快的访问是真的吗?PO文件只能读取一次并缓存在某些哈希表中,MO文件也可能是如此。

1个回答

5

有几个原因:

  1. 你应该始终使用 msgfmt --check 编译 PO 文件,它会对 PO 文件执行几个重要的检查,而不仅仅是语法检查。例如,如果你正在使用 printf 格式字符串,它将检查翻译中的 %-expansions 是否与原始字符串匹配。如果未能这样做,则可能导致运行时崩溃。根据(编程)语言的不同,还有更多的检查。
  2. 读取二进制 MO 文件通常比解析文本 PO 文件更快、更简单。
  3. PO 文件经常包含不应该用于生产的翻译条目,例如模糊或过时的条目。
  4. 许多 PO 解析器存在漏洞或不完整。
  5. 它是 gettext API 的一部分。翻译应该位于 /usr/share/locale/LOCALE/LC_MESSAGES/TEXTDOMAIN.mo 下,并且应该使用 MO 格式,而不是 PO 格式。当然,这并不适用于无数只实现了 gettext API 子集的库。

1
许多程序只在启动时加载翻译一次。我认为除非每次都要加载,否则性能并不那么重要。 - Konrad
在执行二进制文件之前即时编译C源代码只会增加启动时间,但这仍然是一种惯例。 - Guido Flohr
请参见我刚刚添加的第5个原因。 - Guido Flohr
1
@Konrad 我认为你只考虑了桌面应用程序或长时间运行的守护进程/服务。但对于CLI程序,启动性能确实很重要,因为它们经常从shell脚本中调用,甚至可能在循环中调用。 - Guido Flohr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接