Назначение строки Gettext члену класса - PullRequest
4 голосов
/ 17 августа 2010

Я создаю сайт, который будет переведен на x языков.

Все строки должны быть локализованы.

В некоторых случаях мне нужно отобразить название языка, название страны илидругая информация, которая была получена из базы данных.Данные, которые обрабатываются таким образом, редко меняются - как указано выше, я говорю об именах языков, странах и т. Д.

В этом примере я использую массив, содержащий языки, на которых пользовательский интерфейс сайтабыл переведен.Чтобы разрешить перевод имен (используется для текста заголовка при наведении флага / ссылки «изменить язык»), у меня есть массив типа *:

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'

Вывод (locale = en_GB):

Китайский упрощенный

Вывод (locale = 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

Должен ли я опустить голову и уйтивернуться к глобальному массиву, или есть другой, лучший способ для меня использовать «постоянный» массив, который будет использоваться таким образом?

* Ключи массива взяты из таблицы базы данных, хранящей языковые коды, и можем ли мыесть перевод интерфейса:

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__);
     }
}

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Да, вы можете использовать (большинство) литералов только при инициализации переменных.

Обход это что-то вроде:

class A  {
    private $var;
    public function init() {
        $this->var = func();
    }
}
A::init();
0 голосов
/ 17 августа 2010

Вы не можете использовать функции в объявлениях членов.Если вам нужно сделать это, переместите его в конструктор или статическую функцию.

...