1. 程式人生 > >字串的多國語言支援解決方案 通用解決方案篇

字串的多國語言支援解決方案 通用解決方案篇

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

write by 九天雁翎(JTianLing) -- blog.jtianling.com

新浪微博 -- 討論新聞組 -- 

程式碼庫 -- 豆瓣

    在用Qt的時候,自然是使用Qt的解決方案,簡單易用,參考《字串的多國語言支援解決方案 Qt篇》。
    在不需要跨平臺開發iPhone的應用時,自然使用iOS提供的多國語言支援解決方案
    但是,不能用Qt,也不是開發純iOS應用的時候呢?那就只能自己想個辦法解決這個問題了。

根據實際情況,該解決方案需要符合下面的條件: 1.程式碼中使用時,不應該有太多額外的負擔,不降低程式碼的可讀性
2.不用單獨的工具也能使用
第一條很好解釋,假如為了多國語言而浪費太多的精力實在不值得,所以這裡放棄更加高效的int編碼索引字串的方式,那種方式的確更加高效,但是程式碼中需要使用巨集/常量來索引字串。 第二條就完全處於開發簡單的考慮,不要神馬分析,生成等亂七八糟的東西,所以也不會如很多解決方案一樣使用啥excel,然後通過工具解析成二進位制的格式,然後程式中去解析二進位制資料,那不是自虐嗎? 那麼方案其實就慢慢出來了,以文字配置來儲存多國語言的文字,一種語言一個檔案。在文字配置的格式選擇上,使用json。用字串Key來索引字串,索引失敗時,就直接顯示Key字串。

首先,json的格式就是最簡單的以key為索引的字串組合,比如,我現在建立一個en.json表示英文,一個cn.json表示中文。

然後實現如下StringManager,該類為Singleton:(用jsoncpp為json的解析庫) 標頭檔案: class StringManager : public Singleton<StringManager> { public:   bool Init(const char* filename);
  std::string GetLocalizedString(const char* key);
private:   Json::Value string_map_; };
部分實現:

bool StringManager::Init( const char* filename ) {   if ( !ReadJsonFromFile(filename, string_map_) ) {     return false;   }
  return true; }
std::string StringManager::GetLocalizedString( const char* key ) {   if (string_map_.isMember(key)) {     return string_map_[key].asString();   }   else {     return std::string(key);  // 當查詢不到key時,直接顯示key   } }
一般情況下,直接通過StringManager的GetLocalizedString函式來獲取字串即可,為了更加簡單,定義如下的巨集: #define LS(key) StringManager::Instance()->GetLocalizedString(key)

使用時,先需要以字串的配置檔名初始化StringManager,讀取字串資訊。 以後,使用起來就和Qt中很類似了。即以LS()方式包含你需要顯示的文字。 比如下面這樣,為了減少其他無關資訊,就沒有新增顯示部分的程式碼了:
在以上的例子中,我是使用utf8來儲存多國語言,假如你是使用UTF16的話,請將相應的字串表示改為寬位元組即可。
小結: 因為沒有額外的工具支援,這樣的方式也許沒有qt,iOS裡面那麼便捷,但是實現簡單,容易理解,同時使用起來也足夠的方便,最最重要的是,除了C++編譯器,這套方案不依賴於平臺或者其他神馬東西,你隨時隨地都可以使用。(本例中用jsoncpp解析json,jsoncpp也僅依賴C++編譯器存在)


原創文章作者保留版權 轉載請註明原作者 並給出連結

write by 九天雁翎(JTianLing) -- blog.jtianling.com

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述