4

x言語に翻訳されるサイトを作っています。

すべての文字列をローカライズする必要があります。

データベースから取得した言語名や国名などの情報を表示する必要がある場合があります。このように扱われるデータはめったに変更されません-上記のように、私は言語名、国などについて話しています。

この例では、サイトのUIが変換された言語を保持する配列を使用しています。名前の翻訳を許可するために(「言語の変更」フラグ/リンクがホバーされたときにタイトルテキストに使用されます)、次のような配列があります*:

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):

中国語(簡体字

出力(ロケール= zh_CN):

简体中文</p>

私はむしろこの(そして他の)定数配列をクラスのプライベートメンバーとして宣言したいのですが、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

頭を下げてグローバル配列に戻る必要がありますか、それともこの方法で使用する「定数」配列を使用するための別のより良い方法がありますか?

*配列キーは、言語コードと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__);
     }
}
4

2 に答える 2

2

はい、変数の初期化では(ほとんどの)リテラルのみを使用できます。

回避策は次のようなものです。

class A  {
    private $var;
    public function init() {
        $this->var = func();
    }
}
A::init();
于 2010-08-17T00:16:32.007 に答える
0

メンバー宣言で関数を使用することはできません。これを行う必要がある場合は、コンストラクターまたは静的関数に移動してください。

于 2010-08-17T00:17:38.060 に答える