如何在po gettext文件中标记空翻译(msgstr)?

时间:2012-12-07 09:21:14

标签: gettext po

我发现字符串的翻译(msgid)是空的,所有gettext工具都会将字符串视为未翻译的。

有解决方法吗?我确实希望有一个空字符串作为此项目的翻译。

3 个答案:

答案 0 :(得分:5)

由于这似乎是gettext规范中的一个重大设计缺陷,我决定使用:  Unicode Character 'ZERO WIDTH SPACE' (U+200B)在这些领域内。

答案 1 :(得分:2)

我意识到这是一个老问题,但我想指出另一种方法:

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文件格式是一个好的开始。没有什么是具体的,并且格式可能后来相当容易演变,所以我们应该对当前的方法感到满意。

所以,至少它们并不像他们会说'#34; man,在消息字符串中嵌入null?我们从没想过这个!"最有可能的是,如果msgfmt没有崩溃,那么我会假设它是犹太人。

答案 2 :(得分:0)

我长期遇到同样的问题,实际上我根本不认为你可以。我最好的选择是插入评论,以便我可以从那里标记为“翻译”:

# No translation needed / Translated
msgid "This is a string"
msgstr ""

到目前为止,最好的解决方法是:/如果你最终找到了办法,请发帖!