字串的多國語言支援解決方案 通用解決方案篇
阿新 • • 發佈:2018-11-15
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
write by 九天雁翎(JTianLing) -- blog.jtianling.com
在用Qt的時候,自然是使用Qt的解決方案,簡單易用,參考《字串的多國語言支援解決方案 Qt篇》。在不需要跨平臺開發iPhone的應用時,自然使用iOS提供的多國語言支援解決方案
但是,不能用Qt,也不是開發純iOS應用的時候呢?那就只能自己想個辦法解決這個問題了。
根據實際情況,該解決方案需要符合下面的條件: 1.程式碼中使用時,不應該有太多額外的負擔,不降低程式碼的可讀性
第一條很好解釋,假如為了多國語言而浪費太多的精力實在不值得,所以這裡放棄更加高效的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