多語言的處理 乙個有用的快取擴充套件

2022-03-22 09:52:52 字數 1416 閱讀 6021

本文是工作中碰到多語言處理的經驗總結,將其分享,給碰到類似的問題的有一些幫助。

第一次碰到多語言處理是乙個網路廣告平台專案,類似於google的ansendse,阿里媽媽;因為是給國外的公司開發,所以當時基本要求是支援中英文,當然以後會新增其他的語言。當時系統是根據使用者使用的語言環境來確定使用何種語言,當然前端也有乙個使用者可以選擇的下拉列表。程式的實現方法是:將頁面上所有出現語言的地方在tpl模板裡面使用label標記替換,在程式裡面使用特定的語言將這些label換掉。

這些label和具體的語言就是乙個二維陣列,鍵是label,值就是這些具體的語言符號。當時這個系統大概有1000多條這樣資料,具體的處理的邏輯:將使用者的語言和這些label從資料庫中取出,組成陣列後放在global變數中,然後生成頁面的時候替換掉。

問題:每一次使用者請求使用者就要從資料庫中取出所有的值,然後替換。

最近在開發社群遊戲時,由於要實現國際化多語言版本,也要處理語言問題。我們在這個地方使用自己開發的檔案快取系統,這裡我將這個**(不是真實的)大概寫在下面:

**

function

_t($text

)$cache->set($lang, $lang_all);

}else

$global['lang'] = $lang_all;

returun $lang_all[$text];

}

程式的邏輯是: 每個請求如果需要多語言處理的時候,第一次就將所有的內容從資料庫中取得,建立乙個公用的檔案快取,然後每個請求會讀檔案快取,將所有的結果儲存在全域性變數中,而這個翻譯大概需要460k左右的記憶體,幾乎每個請求都需要使用到這個函式,所以每個請求就會占用460k的記憶體。

由於在更新語言的時候,需要將快取檔案刪除,此時如果多個訪問併發執行該函式的時候,就會有請求建立檔案失敗,造成記憶體洩漏,php crush了。

後來將這個檔案快取改為memcache,發現memcache占用的記憶體更多,當然我這個時候也把全域性變數也去掉。同時初始化memecache這個鍵值的時候,還常常設定失敗,嚴重影響系統穩定性。

最後發現chdb這個php擴充套件(官方位址

),它能很好地解決這些問題,整個陣列初始化好之後,當我們需要取出具體的某一條的時候,它只取出那一條,並放在記憶體中,可以供多個請求公用。

例如:$lang = array('a'=>'你好', 'b'=>'中國', 。。。。。);

chdb_create('data.chdb', $lang); //設定一次

$chdb = new chdb('data.chdb');

$value1 = $chdb->get('a');

$value2 = $chdb->get('b');    //獲取具體的值

後來經過測試在一次取200條的時候,這種方法要比上面的稍快10%,當然使用的記憶體也少很多。

這個外掛程式目前只有linux版,另外在編譯的時候需要libcmph

遊戲開發中的多語言處理

之前我寫過一遍 資料表的使用 的文章,今天繼續用文字處理為例講解一下資料表匯出工具的使用和多語言的使用方式。我們先定義乙個ui文字表,寫好表頭,新增幾個測試用對本文,注意型別使用lang。開啟build.bat檔案,修改資料表和專案路徑,雙擊執行,這時候如果不出問題你的專案下就會出現對應的資料和列舉...

遊戲開發中的多語言處理

之前我寫過一遍 資料表的使用 的文章,今天繼續用文字處理為例講解一下資料表匯出工具的使用和多語言的使用方式。我們先定義乙個ui文字表,寫好表頭,新增幾個測試用對本文,注意型別使用lang。開啟build.bat檔案,修改資料表和專案路徑,雙擊執行,這時候如果不出問題你的專案下就會出現對應的資料和列舉...

Flex多語言的實現方案一

效果圖 一 構建語言包。原來的flex builder plug in 可能只有 en us 和ja jp 兩種語言包,所以當我們需要使用中文語言包時,需要建立乙個中文包,並且命名為 zh cn 怎麼建立呢,在 sdks 3.2.0 下有個copylocale.exe 可執行程式。但是要注意的是,這...