对于使用gettext的本地目录存储库,我是following an official i8n example:
#include <libintl.h>
#include <iostream>
#define _(str) gettext(str)
int
main()
{
setlocale (LC_ALL, "pt_PT");
bindtextdomain ("messages", "/home/pasousa/temp/i18n_test/lang/");
textdomain ("messages");
std::cout << _("Hello world!") << std::endl;
return 0;
}
葡萄牙语翻译字符串包含在./lang/pt_PT/LC_MESSAGES/messages.mo
中。但如果我使用所有这些代码,我就不会翻译Hello World
消息。
答案 0 :(得分:0)
您需要确保您设置的区域设置有效 - 如果您未在setlocale
中设置有效的区域设置,那么glibc将假设您正在C
或{{ 1}} locale并忽略POSIX
中指定的值,只返回未本地化的值。这似乎是gettext的一种无证的行为。
您可能希望将区域设置设置为bindtextdomain
,而不仅仅是pt_PT.UTF-8
。
在我的情况下,当我尝试时,我得到了:
pt_PT
但那是因为我没有安装葡萄牙语语言环境。当我设置我已安装的语言环境(char *from_setlocale = setlocale(LC_ALL, "pt_PT");
char *checked_setlocale = setlocale(LC_ALL, NULL);
std::cout << (from_setlocale ? from_setlocale : "NULL") << std::endl << (checked_setlocale ? checked_setlocale : "NULL") << std::endl;
)时,我得到一些有用的输出:
en_IE.UTF-8
此外,我从我生成的消息文件中获取了一个本地化的值。