您可以在boost::locale中使用多个消息域吗

Can you use multiple message domains in boost::locale?

本文关键字:消息 boost locale      更新时间:2023-10-16

我有许多应用程序,它们共享许多通用库。我正在尝试使用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。

由于这个问题没有答案,我认为这在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;
}