我正在製作一個將被翻譯成x種語言的網站。將Gettext字符串分配給班級成員
所有字符串都必須進行本地化。
有時我需要顯示從數據庫中檢索到的語言名稱,國家名稱或其他信息。以這種方式處理的數據很少會發生變化 - 如上我正在談論的語言名稱,國家等。
在這個例子中,我使用的數組包含網站的用戶界面已經使用的語言翻譯。爲了讓名字的翻譯(用於標題的文本時,「改變語言」標誌/鏈接懸停),我有一個像數組*:
Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English"));
我用它們來獲得相關的名稱字符串對於給定語言。
目前我使用一個全局數組:
$global_langNames = Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English"));
用法:
global $global_langNames;
echo $global_langNames[$code]; // $code = 'zh_CN'
輸出(區域= EN_GB):
中國簡體
歐tput的(區域= zh_CN的):
簡體中文
我寧願聲明這個(或其他)不變陣列作爲類的私有成員,但似乎PHP是不甘心:
class constants_lang{
private static $langNames = Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English"));
static function getLangName($code){
return self::$langNames($code);
}
}
結果:
Parse error: syntax error, unexpected '(', expecting ')' in /site/http/includes/classes/constants/lang.php on line 20
我應該掛我的頭低去巴ck到全局數組,還是有另一種更好的方法讓我有一個'常量'數組用於這種方式?
*數組鍵是從數據庫表中存儲的語言代碼,我們是否有一個UI翻譯:
code ui translation
zh_CN 1
en_GB 1
zh_TW 0
....
解決方案
class constants{
private $langNamesFromCode;
function __construct()
{
$this->langNamesFromCode = $this->initLangNamesFromCode();
}
/* INIT */
private static function initLangNamesFromCode()
{
return Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English"));
}
/* GETTERS */
public static function getLangNameFromCode($code)
{
if(self::isStatic()){
$langNamesFromCode = self::initLangNamesFromCode();
return $langNamesFromCode[$code];
}
else{
return $this->langNamesFromCode[$code];
}
}
/* UTILITY */
private static function isStatic()
{
return !(isset($this) && get_class($this) == __CLASS__);
}
}
查看[這個問題] [1]的替代方案。因人而異。 [1]:http://stackoverflow.com/questions/693691/php-how-to-initialize-static-variables – johndodo 2011-10-24 06:52:26