2010-08-17 68 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

你不能使用的功能。如果你需要这样做,将它移动到构造函数或静态函数中。