我发现字符串的翻译(msgid)是空的,所有gettext工具都会将字符串视为未翻译的。
有解决方法吗?我确实希望有一个空字符串作为此项目的翻译。
答案 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 ""
到目前为止,最好的解决方法是:/如果你最终找到了办法,请发帖!