【问题标题】:Using gettext with local catalog has no effect将 gettext 与本地目录一起使用没有效果
【发布时间】:2016-05-16 14:26:51
【问题描述】:

我是 following an official i8n example 用于使用 gettext 的本地目录存储库:

#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 消息。

【问题讨论】:

  • 欢迎来到 StackOverflow!请务必包含所有信息,这意味着您的 messages.mo 文件 的内容(为了示例,应将其缩减为“Hello World!”)。此外,如果您检查调用的返回结果可能会有所帮助......我注意到bindtextdomain 可能会返回指向char* 的指针以用于目录或NULL——例如,并设置@ 987654328@如果有问题。

标签: c++ gettext


【解决方案1】:

您需要确保您设置的语言环境有效 - 如果您没有在 setlocale 中设置有效的语言环境,那么 glibc 将假定您在 CPOSIX 语言环境中运行并忽略bindtextdomain 中指定的值并简单地返回未本地化的值。这似乎是 gettext 的某种未记录的行为。

您可能希望将语言环境设置为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) 时,我会得到一些有用的输出:

char *from_setlocale = setlocale(LC_ALL, "en_IE.UTF-8");
char *checked_setlocale = setlocale(LC_ALL, NULL);
std::cout << (from_setlocale ? from_setlocale : "NULL") << std::endl << (checked_setlocale ? checked_setlocale : "NULL") << std::endl;

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

【讨论】:

  • 我已经尝试过了,还测试了语言环境是否有效,但我仍然只能获得系统设置。
  • 您很可能设置了LANGLANGUAGE 环境变量集,这会覆盖使用其他语言的尝试。
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2021-03-29
  • 2013-08-02
相关资源
最近更新 更多