我正在制作一个将被翻译成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