項目中多語言處理

在玩家行爲操作時,某些情況下服務器判定客戶端的條件不通過時,需要將【被拒絕的原因】飄字提示給玩家的客戶端。由於不同地區的客戶端所用的語言不一樣,例如國服用漢語,韓服用韓語,美服用英語;這樣就涉及1個多語言的問題,在項目中設計了一個多語言功能來處理。

muil_lan.xlsm表有兩列,一列是飄字的key,一列是飄字的value內容。

例如: 【COPY_FAILED_1,你的等級<color=#CE2E00FF>%1v</color>,不滿足副本%2v的進入等級。】

在服務器系統邏輯代碼中,只要調用宏 LAN(COPY_FAILED_1,50,“龍淵”)就可以提示:【你的等級50,不滿足副本龍淵的進入等級】

其中%1v,%2v是我們約定好的格式,最終由客戶端lua代碼來解析,原則上可以是任意字符組合來確定某個格式,最終可以由客戶端按格式解析。

其中比較有意思的是掉落的金裝道具或者鍛造到+15等級的時候,在全服聊天頻道中展示出的那句話,其中道具名是帶下劃線的,玩家可以點擊,然後彈出道具的完整tips。道具的屬性有很多條:品質、等級、鍛造等級等等。這涉及到另外一個問題:需要下發服務器上的複雜結構到客戶端,而不是僅僅1個變量或者1個字符串。這裏就倚靠ConverString(),把複雜結構體(GDict)類型解析爲jsonString類型下發到客戶端。

【COPY_DROP_1,玩家<color=#CE2E00FF><plyname>%1v</plyname></color>在副本%2v拾取道具<item_info>%3v</item_info>】

這裏<item_info>就是我們約定好的格式,它把服務器上的一個GDict類型數據轉換爲jsonString,再塞入GString來發送到客戶端。

這裏的多語言的key,其實可以就是一個數字類型的自增idx,但是這樣的話,客戶端看到飄字【1】的話,不是很直觀。而飄字【COPY_DROP_1】的話,很容易就可以聯想到時副本掉落。

 

1、    其實就是個protobuf,定義了一個

           message LString()

           {

                   required string index = 1;

                   repeated string sParam = 2;

           }

2、然後 #define LAN(txt,...) GenLString(#txt,##__VA_ARGS__)

3、template<class T1,class T2>

inline CtmGame::Lstring GenLString(const char* idx,const T1& param1,const T2& param2)

{

         CtmGame::LString res;

         res.set_index(idx);

         res.add_sparam(ConverString(param1));

          res.add_sparam(ConverString(param2));

          return res;

}

這樣的話,在上層就可以使用 

LAN(COPY_DROP_INFO,copy_name.c_str(),copyId);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章