2012-07-12 92 views
1

我有許多共享一些通用庫的應用程序。我正在嘗試使用boost :: locale國際化我的應用程序。我很容易爲每個通用庫和每個特定應用程序創建一個單獨的.mo文件。我是遊蕩,如果它是可以同時使用多個郵件域這樣的:你可以在boost :: locale中使用多個消息域嗎?

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 ::區域設置在兩個lib1.mo和lib2.mo進行搜索,但是這似乎並沒有工作。只發現添加的第一個域的消息,在本例中是lib1.mo。如果我在lib1之前添加lib2,則只會找到lib2的消息。

我知道你可以在這樣的調用明確使用域名:

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

這並不工作,但我想避免指定每次調用的域。我也不確定這對於用xgettext提取字符串很有效。

我想要做什麼?我錯過了什麼嗎?

如果您知道一個,請提出任何其他建議。

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

回答

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; 
} 
相關問題