2010-08-17 3 views
3

Я создаю сайт, который будет переведен на x языков.Назначение Gettext String классу Member

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

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

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

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' 

Output (локаль = 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 в глобальный массив, или есть другой, лучший способ для меня иметь «постоянный» массив, который будет использоваться таким образом?

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

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

См. [Этот вопрос] [1] для альтернативы. YMMV. [1]: http://stackoverflow.com/questions/693691/php-how-to-initialize-static-variables – johndodo

ответ

2

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

Работа вокруг что-то вроде:

class A { 
    private $var; 
    public function init() { 
     $this->var = func(); 
    } 
} 
A::init(); 
+0

Would делать это предпочтительнее использование глобального массива? –

+0

@Mich Я бы сказал, да. – Artefacto

+0

Обновлен мой вопрос с помощью решения, взятого из вашего ответа. Благодарю. –

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^