关于php:将Gettext String分配给Class Member

Assigning Gettext String to Class Member

我正在制作一个将被翻译成X语言的网站。

所有字符串必须本地化。

有时我需要显示语言名、国家名或从数据库中检索到的其他信息。以这种方式处理的数据很少会被改变——如上所述,我指的是语言名称、国家等。

在这个例子中,我使用的数组保存了站点的UI被翻译成的语言。为了允许翻译名称(悬停"更改语言"标志/链接时用于标题文本),我有一个类似*的数组:

1
Array("zh_CN" => _("Chinese - Simplified"),"en_GB" => _("English"));

我使用它们来获取给定语言的相关名称字符串。

当前我使用的是全局数组:

1
$global_langNames = Array("zh_CN" => _("Chinese - Simplified"),"en_GB" => _("English"));

用法:

1
2
3
global $global_langNames;

echo $global_langNames[$code]; // $code = 'zh_CN'

输出(区域设置=en_GB):

Chinese Simplified

输出(locale=zh_-cn):

简体中文

我更愿意将这个(和其他)常量数组声明为类的私有成员,但似乎php不愿意:

1
2
3
4
5
6
7
8
9
class constants_lang{

 private static $langNames = Array("zh_CN" => _("Chinese - Simplified"),"en_GB" => _("English"));

 static function getLangName($code){
  return self::$langNames($code);
 }

}

结果:

1
Parse error: syntax error, unexpected '(', expecting ')' in /site/http/includes/classes/constants/lang.php on line 20

我是应该低下头,回到全局数组,还是有其他更好的方法来使用"常量"数组?

*数组键来自存储语言代码的数据库表以及是否有用户界面转换:

1
2
3
4
5
code     ui translation
zh_CN       1
en_GB       1
zh_TW       0
      ....

解决方案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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
2
3
4
5
6
7
class A  {
    private $var;
    public function init() {
        $this->var = func();
    }
}
A::init();


不能在成员声明中使用函数。如果需要这样做,请将其移动到构造函数或静态函数。