1

我有许多共享许多通用库的应用程序。我正在尝试使用 boost::locale 将我的应用程序国际化。我很容易为每个通用库和每个特定应用程序创建一个单独的 .mo 文件。如果可以同时使用这样的多个消息域,我正在徘徊:

boost::locale::generator gen;
gen.add_messages_path(".");
gen.add_messages_domain("lib1");
gen.add_messages_domain("lib2");

std::locale::global(gen("zh_CN.UTF-8"));

.
.
.

boost::locale::gettext("Show image");

我期待 boost::locale 在 lib1.mo 和 lib2.mo 中都进行搜索,但这似乎不起作用。仅找到来自添加的第一个域的消息,在本例中来自 lib1.mo。如果我在 lib1 之前添加 lib2,则只能找到来自 lib2 的消息。

我知道您可以像这样在调用中明确使用域:

boost::locale::dgettext("lib2", "Show image");

这确实有效,但我想避免为每个调用指定域。我也不确定这是否适用于使用 xgettext 提取字符串。

我想做的事有可能吗?我错过了什么吗?

如果您知道,请提出任何替代方案。

我使用 msvc 9.0 (2008) 和 boost 1.48。

4

1 回答 1

0

由于没有发布此问题的答案,我认为 boost::locale 无法做到这一点。因此,我将很快概述我为实现所需功能所做的工作:

我创建了一个具有以下接口的单例类

class MY_GETTEXT
{
public:

    void SetPath(const std::string& i_path);
    void AddDomain(const std::string& i_domain);
    void ChangeLocale(const std::string& i_locale);
    std::string gettext(const std::string i_msg_id);
};

为您要使用的每个域调用 AddDomain,并将其添加到成员集 m_language_domains_a。ChangeLocale 做了一些语言环境操作,并在成员 m_locale 中存储了一个语言环境,这里我将忽略它的实现。

要翻译,您只需调用 MY_GETTEXT::gettext。它的实现如下所示:

std::string MY_GETTEXT::gettext(const std::string i_msg_id)
{
    BOOST_FOREACH(const std::string& domain , m_language_domains_a)
    {
        if (boost::locale::translate(i_msg_id).str(m_locale, domain) != i_msg_id)
        {
            return boost::locale::translate(i_msg_id).str(m_locale, domain);
        }
    }

    return i_msg_id;
}
于 2013-11-20T14:06:53.147 回答