你可以在 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)