2013-09-18 2 views
2

Я после способ перевода, указанный здесь: http://framework.zend.com/manual/2.2/en/modules/zend.i18n.translating.html#setting-a-localeZF2 Локализация Переводчик

Поскольку большинство моих строк уже существует в БД, и я не хотел, чтобы передать их PoEdit, я генерируя связка PHP массива файлов, таких как en_US.php, de_DE.php и т.д.

В модуле/Application/Config/module.config.php картина определяется как:

 array(
      'type'  => 'phparray', 
      'base_dir' => __DIR__ . '/../language', 
      'pattern' => '%s.php', 
     ), 

Установка переводчика, как это в модуле/Application/Module.ph р:

public function onBootstrap($e) 
    { 
    // ...snip... 

    $sm = $e->getApplication()->getServiceManager(); 
    $sm->get('translator') 
     ->setLocale(\Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE'])) 
     ->setFallbackLocale('en_US'); 

    // ...snip... 

}

И выполняя в Справочники зрения, как:

<th><?= $this->translate('Date Created'); ?></th> 

Все работает, кроме ... традиционный и упрощенный китайский. Если я правильно читаю документы, zh_CN.php должен быть выбран для пользователей с упрощенным китайским языком в качестве их настроек, а zh_HK следует подбирать для пользователей с традиционным китайским языком. Но это не работает. Он только поднимает zh.php, и я теряю свои вариации.

Я нахожусь на Mac, поэтому, чтобы проверить, я просто меняю свои системные настройки и перезапускаю свой браузер. Все мои западные языки (en_US.php, fr_FR.php, it_IT.php, nl_NL.php и т. Д.) Работают должным образом. Но для японцев я должен был назвать свой файл ja.php, и я не могу заставить китайцев использовать разные коды стран.

Любые идеи? Как я могу исключить, является ли проблема в моем соглашении об именах, дополнительным параметром (неправильный шаблон) или мне нужно передать больше параметров при вызове translate?

MORE РАССЛЕДОВАНИЕ Глядя на то, что возвращается из заголовков есть разница:

$locale = locale_accept_from_http($_SERVER['HTTP_ACCEPT_LANGUAGE']); 
var_dump($locale); 

напечатает строку (2) "ж" ж

var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']); 

напечатает строку (5) «zh-tw»

Так что, возможно, я должен использовать нижеследующее, но это абсолютно не то, что указано в документах

 ->setLocale($_SERVER['HTTP_ACCEPT_LANGUAGE']) 

ответ

2

Почему вы используете Locale::acceptFromHttp()? Вы можете легко написать собственный парсер с объектом запроса ZF2.

$headers = $request->getHeaders(); 
if ($headers->has('Accept-Language')) { 
    $locales = $headers->get('Accept-Language')->getPrioritized(); 
    $first = array_shift($locales); 

    // "language" here is the full locale, though it's quite confusing :s 
    return $first->getLanguage(); 
} 

Есть другие жалуются о магии acceptFromHttp() и очевидных ошибок в этой части.

Помните, что проверка этого кода (а также использование acceptFromHttp() не ищет альтернативы резервного копирования. Скажем, ваше приложение по умолчанию использует «fr-FR», а вы поддерживаете «fr-FR» и «en-US». делает запрос с Accept-Language «nl-NL» и «en-US». Ваш код проверяет «nl-NL», который не поддерживается, и использует резервный «fr-FR». Однако второй вариант от клиента («ru-US») поддерживается в вашем приложении. Таким образом, вы отправляете обратно язык, который клиент не может понять, в то время как у вас есть доступный доступный язык.

NB. Вы можете использовать SlmLocale для ZF2 для автоматического обнаружения локалей с помощью согласования и локализации. Локаль устанавливается в локальный объект php с помощью setDefault(), поэтому переводчики и тому подобное автоматически выбирают этот язык. Отказ от ответственности Я написал эту библиотеку :)

+0

+1 для объяснения о 'acceptFromHttp()' part. Другой модуль, который следует принять во внимание, я предполагаю;) – Sam

+0

Это был прекрасный ответ! Спасибо за информацию. Дополнительный модуль больше, чем мне нужно, поскольку у нас есть только очень определенное количество переводов, поэтому возвращение к английскому языку будет в порядке. Я не ожидаю, что кто-то, кто первым выбирает, - это упрощенный китайский, чем голландский, как следующий вариант. Языки, которые мы поддерживаем, не имеют большого количества вариантов, кроме китайского. – manisha

+0

О, и к вашему первому вопросу, -> setLocale (\ Locale :: acceptFromHttp ($ _ SERVER ['HTTP_ACCEPT_LANGUAGE])), как это записано в примере docs, на что я ссылался. Он работает, пока вы не доберетесь до региональных вариантов. – manisha