2009-12-24 60 views
0

澄清:合併MO文件的緩存策略,它將成爲數組?

  • 我不使用gettext的PHP模塊 /擴展,原因是因爲我有對付沒有包括gettext的服務器,我知道的PHP的gettext的但是這使得我必須使用多個庫變得複雜。更進一步,我不想依賴於安裝了必要的語言環境的用戶,而有些服務器我不具有root訪問權限來執行此操作。我也意識到一般情況下有很多地區的問題。
  • 必須支持PHP4。是的,它已經死了。是的,我討厭它。但我沒有選擇。

我有解析通過每MSGID,msgstr等「服務器級」基於當前語言.mo gettext的文件(默認爲烯),進行迭代,並且填充的陣列與MSGID的鍵/值和一類msgstr。

之後我有一個方法解析「應用程序級」.mo文件,並將它們合併在初始數組中,因此應用程序級別轉換優先於服務器端通用轉換。

因爲我爲我的字符串翻譯使用合併數組,並且我不想讀取每個頁面上讀取的.mo文件,所以我需要一些方法來實際緩存這個並使用緩存版本如果正在讀取的頁面與緩存版本具有相同的語言/區域設置。

所以,如果我去了我的網站,默認語言是英語,它會讀取英文服務器/應用程序mo文件,合併它們,製作數組,緩存它。如果用戶點擊的下一頁是英文,則會使用緩存版本。否則,如果是西班牙語,則再次合併,並使用西班牙語緩存版本。

所以基本上,我將如何去緩存語言/特定於語言環境的合併數組?我從來沒有真正實現緩存自己,但我會假設我需要做的是serialize我的數組,然後將其寫入應用程序級緩存目錄,並將文件名保存爲'translation - {$ locale} '其中$ locale類似於'en',然後使用邏輯來確定我的應用中的區域設置是什麼,基於此來查看是否有可用的緩存版本 - 如果是,unserialize並且只是使用它?

這是通常它是如何完成的?我非常感謝代碼示例。該陣列我有大約有200-300鍵/值對,只是一個二級多維數組:

array(
    'en' => array(
    'Hello' => '', 
), 
    'es' => array(
    'Hello' => 'Hola', 
) 
); 

回答

1

我不理解爲什麼要緩存的多語言數組?您是否需要在應用程序的單個請求(其php)中提供對> 1語言的支持?

無論如何,你說的很好 - 序列化數組,將其粘貼到緩存中並在將來檢索。如果您緩存未命中,請重新計算該陣列。

然後將其寫入到一個 應用程序級緩存目錄, 保存的文件名,就像這樣 「翻譯 - {$區域}」,其中$區域 是像「恩」,然後用邏輯 以確定我的 應用中的區域設置是什麼,基於此查看是否有可用的 緩存版本。

文件I/O速度不如內存訪問速度快 - 如果您經歷緩存此問題,我會建議查看memcache。

+0

memcached是不可行的,因爲這個框架需要安裝在各種類型的環境中,其中很多(99%)不會,也可能不會有memcached。 – 2009-12-24 16:08:05

+0

該應用程序支持不同的語言環境,某些站點具有德語,英語和法語翻譯,這些語言環境/語言中的每一個均具有合併的服務器/客戶端mo文件。 – 2009-12-24 16:08:56