Assigning Gettext String to Class Member
我正在制作一个将被翻译成X语言的网站。
所有字符串必须本地化。
有时我需要显示语言名、国家名或从数据库中检索到的其他信息。以这种方式处理的数据很少会被改变——如上所述,我指的是语言名称、国家等。
在这个例子中,我使用的数组保存了站点的UI被翻译成的语言。为了允许翻译名称(悬停"更改语言"标志/链接时用于标题文本),我有一个类似*的数组:
1 |
我使用它们来获取给定语言的相关名称字符串。
当前我使用的是全局数组:
1 |
号
用法:
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(); |
不能在成员声明中使用函数。如果需要这样做,请将其移动到构造函数或静态函数。