如何使用本地操作系统环境使用 gettetxt() 初始化静态 char*?
C++ 中是否有标准或通用方法来处理需要通过 gettext() 设置的静态字符串?
这是一个使用 Complete C++ i18n gettext() 答案的示例“hello world”示例 作为基础,只需将文字 hello world
更改为静态 char* hws
和 char* hw
。 看起来 hws
在从设置语言环境之前被初始化为默认的英文文本 本地操作系统环境。 虽然 hw
在区域设置更改后被设置,从而生成西班牙语文本。
cat >hellostaticgt.cxx <<EOF
// hellostaticgt.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
char* hws = gettext("hello, world static!");
int main (){
setlocale(LC_ALL, "");
bindtextdomain("hellostaticgt", ".");
textdomain( "hellostaticgt");
char* hw = gettext("hello, world!");
std::cout << hws << std::endl;
std::cout << hw << std::endl;
}
EOF
g++ -o hellostaticgt hellostaticgt.cxx
xgettext --package-name hellostaticgt --package-version 1.0 --default-domain hellostaticgt --output hellostaticgt.pot hellostaticgt.cxx
msginit --no-translator --locale es_MX --output-file hellostaticgt_spanish.po --input hellostaticgt.pot
sed --in-place hellostaticgt_spanish.po --expression='/#: /,$ s/""/"hola mundo"/'
mkdir --parents ./es_MX.utf8/LC_MESSAGES
msgfmt --check --verbose --output-file ./es_MX.utf8/LC_MESSAGES/hellostaticgt.mo hellostaticgt_spanish.po
LANGUAGE=es_MX.utf8 ./hellostaticgt
Is there a standard or common way in C++ to handle static strings that need to be set by gettext()
?
Here is an example using the answer to Complete C++ i18n gettext() “hello world” example as a base just changing the literal hello world
to a static char* hws
and char* hw
.
It looks like hws
is getting initialized to the default English text before the locale is set from the
local operating system environment. While hw
is getting set after the locale is changed thus producing the Spanish text.
cat >hellostaticgt.cxx <<EOF
// hellostaticgt.cxx
#include <libintl.h>
#include <locale.h>
#include <iostream>
char* hws = gettext("hello, world static!");
int main (){
setlocale(LC_ALL, "");
bindtextdomain("hellostaticgt", ".");
textdomain( "hellostaticgt");
char* hw = gettext("hello, world!");
std::cout << hws << std::endl;
std::cout << hw << std::endl;
}
EOF
g++ -o hellostaticgt hellostaticgt.cxx
xgettext --package-name hellostaticgt --package-version 1.0 --default-domain hellostaticgt --output hellostaticgt.pot hellostaticgt.cxx
msginit --no-translator --locale es_MX --output-file hellostaticgt_spanish.po --input hellostaticgt.pot
sed --in-place hellostaticgt_spanish.po --expression='/#: /,$ s/""/"hola mundo"/'
mkdir --parents ./es_MX.utf8/LC_MESSAGES
msgfmt --check --verbose --output-file ./es_MX.utf8/LC_MESSAGES/hellostaticgt.mo hellostaticgt_spanish.po
LANGUAGE=es_MX.utf8 ./hellostaticgt
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要将 gettext 的用法分成两部分。 首先,您只需使用宏标记字符串,例如 gettext_noop,以便 xgettext 提取它。 然后,当您引用全局变量时,您可以使用真正的 gettext 调用来包装访问。
请参阅 gettext 手册中的特殊情况。
注意您的变量 hws 不是静态变量(没有“static 关键字”); 它是一个全局变量。
You need to split gettext usage into two parts. First, you just mark the string with a macro, such as gettext_noop, so that xgettext will extract it. Then, when you refer to the the global variable, you wrap the access with the true gettext call.
See Special Cases in the gettext manual.
N.B. Your variable hws is not a static variable (no "static keyword"); it is a global variable.
这是应用 Martin v. Löwis 的回答:
结果具有期望的和预期的输出:
This is the code after applying the answer from Martin v. Löwis:
The result has the desired and expected output: