将 Gettext 字符串分配给类成员

Mic*_*son 5 php class gettext private-members

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

\n\n

所有字符串都必须本地化。

\n\n

有时我需要显示语言名称、国家/地区名称或从数据库检索的其他信息。以这种方式处理的数据很少会改变 - 如上所述,我正在谈论语言名称、国家/地区等。

\n\n

在此示例中,我使用的数组保存了网站 UI 已翻译成的语言。为了允许翻译名称(当“更改语言”标志/链接悬停时用于标题文本),我有一个像*这样的数组:

\n\n
Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English"));\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

目前我正在使用全局数组:

\n\n
$global_langNames = Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English"));\n
Run Code Online (Sandbox Code Playgroud)\n\n

用法:

\n\n
global $global_langNames;\n\necho $global_langNames[$code]; // $code = \'zh_CN\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出(区域设置 = en_GB):

\n\n
\n

简体中文

\n
\n\n

输出(语言环境 = zh_CN):

\n\n
\n

\xe7\xae\x80\xe4\xbd\x93\xe4\xb8\xad\xe6\x96\x87

\n
\n\n

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

\n\n
class constants_lang{\n\n private static $langNames = Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English"));\n\n static function getLangName($code){\n  return self::$langNames($code);\n }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是:

\n\n
Parse error: syntax error, unexpected \'(\', expecting \')\' in /site/http/includes/classes/constants/lang.php on line 20\n
Run Code Online (Sandbox Code Playgroud)\n\n

我应该低下头并返回到全局数组,还是有另一种更好的方法让我以这种方式使用“常量”数组?

\n\n

*数组键来自存储语言代码以及我们是否有 UI 翻译的数据库表:

\n\n
code     ui translation\nzh_CN       1\nen_GB       1\nzh_TW       0\n      ....\n
Run Code Online (Sandbox Code Playgroud)\n\n

解决方案

\n\n
class constants{\n\n     private $langNamesFromCode;\n\n     function __construct()\n     {\n          $this->langNamesFromCode = $this->initLangNamesFromCode();\n     }\n\n     /* INIT */\n\n     private static function initLangNamesFromCode()\n     {\n          return Array("zh_CN" => _("Chinese - Simplified"), "en_GB" => _("English"));\n     }\n\n     /* GETTERS */\n\n     public static function getLangNameFromCode($code)\n     {\n          if(self::isStatic()){\n               $langNamesFromCode = self::initLangNamesFromCode();\n               return $langNamesFromCode[$code];\n          }\n          else{\n               return $this->langNamesFromCode[$code];\n          }\n     }\n\n     /* UTILITY */\n\n     private static function isStatic()\n     {\n          return !(isset($this) && get_class($this) == __CLASS__);\n     }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Art*_*cto 3

是的,您只能在变量初始化中使用(大多数)文字。

解决方法是这样的:

class A  {
    private $var;
    public function init() {
        $this->var = func();
    }
}
A::init();
Run Code Online (Sandbox Code Playgroud)