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

2021-08-31 20:58:11 字數 1821 閱讀 4215

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!

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

;

部分實現:

bool stringmanager::init( const char* filename )

return true;

}

std::string stringmanager::getlocalizedstring( const char* key )

else

}

一般情況下,直接通過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!

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

最近比較懶,公司的事情忙完後,在家也就是看看 game engine architecture 好久沒有寫部落格了,總算遭到報應了,昨晚腹瀉,發燒,冷汗,今天一天班都沒上,於是,閒話少說,還是寫篇部落格吧.在不久以前,軟體還是由一幫根本不知道世界上存在其他語言的美國人製作的,那時候他們只用ascii...

程式實現多國語言的動態切換解決方案

實現思想 傳統的做法是把所有的資源都放到動態庫中,一種語言乙個動態庫,程式執行的時候通重載入不同的動態庫來實現多語言功能。這樣做的缺點是不能動態切換語言,如果更換語言後必須重新啟動軟體。當然,沒有人會需要經常的切換語言玩兒,但是採用動態庫的方法,如果程式需要修改資源的話,就要更新所有的動態庫,這是乙...

使用全域性雜湊表實現字串變數的多國語言

1.建立乙個全域性的hash表 initialization g hash thashedstringlist.create finalization freeandnil g hash 2.往全域性hash表裡面寫入 ini檔案的指定小節 字串定義集中放在乙個小節裡面 讀取到的所有行,每次更選擇語...