2010-08-17 63 views
3

我正在製作一個將被翻譯成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__); 
    } 
} 
+0

查看[這個問題] [1]的替代方案。因人而異。 [1]:http://stackoverflow.com/questions/693691/php-how-to-initialize-static-variables – johndodo 2011-10-24 06:52:26

回答

2

是的,你只能使用(大部分)文字變量初始化。

的解決辦法是這樣的:在成員聲明

class A { 
    private $var; 
    public function init() { 
     $this->var = func(); 
    } 
} 
A::init(); 
+0

將這樣做是優選的使用全局數組? – 2010-08-17 00:20:56

+0

@我想說是的。 – Artefacto 2010-08-17 00:49:47

+0

更新我的問題,並從您的答案中獲得解決方案。謝謝。 – 2010-08-17 00:52:57

0

你不能使用的功能。如果你需要這樣做,將它移動到構造函數或靜態函數中。