将gettext与本地目录一起使用无效

时间:2016-05-16 14:26:52

标签: c++ gettext

对于使用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消息。

1 个答案:

答案 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

此外,我从我生成的消息文件中获取了一个本地化的值。