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

Posted

技术标签:

【中文标题】你可以在 boost::locale 中使用多个消息域吗?【英文标题】:Can you use multiple message domains in boost::locale? 【发布时间】:2012-07-12 15:54:14 【问题描述】:

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

【问题讨论】:

【参考方案1】:

由于没有发布此问题的答案,我假设 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;

【讨论】:

以上是关于你可以在 boost::locale 中使用多个消息域吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 iconv 为 iOS 构建 Boost.Locale

将 boost locale 与 Firebreath 一起使用

获取 boost::locale::conv 中函数的用户代码页名称

boost::locale 1.57.0 和 Windows 下的 ICU 库 54.1 (VC++ 2010)

用于字符串编码的 boost::locale to_utf 函数,喜欢抛出

如何为 android 构建 boost::locale