我发现字符串 (msgid) 的翻译为空,所有 gettext 工具都会将该字符串视为未翻译。
有解决方法吗?我确实希望有一个空字符串作为该项目的翻译。
由于这似乎是 gettext 规范中的一个重大设计缺陷,我决定
Unicode Character 'ZERO WIDTH SPACE' (U+200B)
在这些字段中使用:
我意识到这是一个老问题,但我想指出另一种方法:
msgid "This is a string"
msgstr "\0"
由于 gettext 使用嵌入的空值来表示字符串的结束,并且它正确地翻译了 C 转义序列,我猜这可能会起作用并导致空字符串翻译?它似乎在我的程序中工作(基于 GNU libintl),但我不知道这是否真的是标准/系统允许的。据我了解 gettext PO 没有正式指定,所以除了查看源代码之外可能没有权威的答案......
https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html
程序员将嵌入的空值放入事物中通常不是一件好事,但它可能适用于您的情况?可以说它没有零宽度空间技巧那么邪恶,因为它实际上会产生一个大小为零的字符串。
编辑:
基本上,可能发生的最糟糕的事情是运行时出现段错误/不良行为msgfmt
,如果它对假定没有嵌入 null 的字符串的大小感到困惑,并在某处溢出缓冲区。
假设msgfmt
可以容忍这一点,libintl
则必须对其做正确的事情,因为它必须返回字符串的唯一方法是char *
,因此最终应用程序无论如何只能看到空字符。
对于它的价值,我的 po-parser 库spirit-po
明确支持这一点:)
https://github.com/cbeck88/spirit-po
编辑:在 gettext 文档中,他们似乎确实提到了在 MO 文件中嵌入空值的可能性,并说“这是激烈争论的”:
https://www.gnu.org/software/gettext/manual/html_node/MO-Files.html
没有什么可以阻止 MO 文件在字符串中嵌入 NUL。但是,当前使用的程序接口已经假定字符串是 NUL 终止的,因此嵌入式 NUL 有点没用。但是 MO 文件格式足够通用,因此以后可以使用其他接口,例如,如果我们想在 MO 文件中实现宽字符,其中 NUL 字节可能会意外出现。(不,我们不想在 MO 文件中使用宽字符。它们会使文件变得不必要地大,并且 'wchar_t' 类型依赖于平台,MO 文件也依赖于平台。)
这个特定的问题在 GNU gettext 开发论坛上已经引起了激烈的争论,并且可以预料 MO 文件格式会随着时间的推移而发展或改变。甚至有可能以后同时支持许多格式。但可以肯定的是,我们必须从某个地方开始,这里描述的 MO 文件格式是一个好的开始。没有什么是具体的,并且格式以后可能会相当容易地发展,所以我们应该对当前的方法感到满意。
所以,至少他们不会说“伙计,在消息字符串中嵌入空值?我们从来没想过!” 它很可能会起作用,如果msgfmt
没有崩溃,那么我会认为它是犹太洁食。
我有同样的问题很长时间了,实际上我认为你根本做不到。我最好的选择是插入评论,以便我可以从那里将其标记为“已翻译”:
# No translation needed / Translated
msgid "This is a string"
msgstr ""
到目前为止,这是最好的解决方法:/如果您最终找到了方法,请发布!