2010-03-30 20 views
2

到現在爲止,我一直保持着「字典」表在我的數據庫,例如:我應該如何將翻譯的文本傳遞給我的多語言應用程序中的對象?

+-----------+---------------------------------------+-----------------------------------------------+--------+ 
| phrase | en         | fr           | etc... | 
+-----------+---------------------------------------+-----------------------------------------------+--------+ 
| generated | Generated in %1$01.2f seconds at %2$s | Créée en %1$01.2f secondes à %2$s aujourd'hui | ... | 
| submit | Submit...        | Envoyer...         | ... | 
+-----------+---------------------------------------+-----------------------------------------------+--------+ 

我會然後選擇我們感興趣的區域設置相匹配的列從數據庫中的所有行(或從文件讀取緩存以加快數據庫查找速度)並將字典轉儲到名爲$lng的數組中。

那我有這樣的HTML幫助對象在我看來:

$html->input(array('type' => 'submit', 'value' => $lng['submit'], etc...)); 
... 
$html->div(array('value' => sprintf($lng['generated'], $generated, date('H:i')), etc...)); 

的翻譯可以出現在PDF,XLS和AJAX響應了。

與我的方法的問題,到目前爲止,是我現在的每個班級都在那裏是吐出UI代碼的函數global $lng;負荷..

如何其他人得到翻譯成對象?全局變量實際上並不是那麼糟糕嗎?當字典條款都是靜態的時候,用訪問器創建一個類會是瘋狂的嗎?

附錄

正如我有一個HTML類,一個PDF類,一個JSON類等,它們都具有字典的依賴,這是一種情況,即我可以使用依賴注入的Lng類,以便更容易測試不同的翻譯?

回答

2

作爲一個快速和簡單的解決方案只是讓lng功能:

$html->input(array('type' => 'submit', 'value' => lng('submit'), etc...)); 

另一種思考:如果你使用HTML傭工,爲什麼不使他們認識到國際化的,這樣就可以只通過一個串ID,像

$html->input(array('type' => 'submit', 'value' => '@submit', etc...)); 

和在輸入()函數替換 '@xxx' 與 'LNG(XXX)'

gettext也可能是一種選擇。

+0

比使用'global'更有用。 – 2010-03-30 14:30:33

+0

如果'lng'成爲一個全局函數,那麼它肯定要麼在每個請求中查找數據庫,要麼從其他地方引用一個**全局**數組......如果不是,則會如何實現lng()? – boatingcow 2010-03-30 14:32:10

+0

@boatingcow - 如果一個全局是已知的並且在一個函數中被引用,我沒有看到任何錯誤,但是我會爲此使用一個靜態變量。 – user187291 2010-03-30 14:34:41

相關問題