2014-01-17 6 views
0

Спасибо за ваше время, пытаясь помочь мне.Перевод не работает с ZF2

Я следовал этому учебнику:

http://samminds.com/2012/09/zend-framework-2-translate-i18n-locale/

http://samminds.com/2012/09/create-po-language-files-using-poedit/

, и я думаю, что я выполнил все шаги, но механизм перевода не работает.

Расширение INLT установлено и активно в системе.

В модуле конфигурации я добавил:

'translator' => array(
    'locale' => 'es_ES', 
    'translation_file_patterns' => array(
     array(
      'type'  => 'gettext', 
      'base_dir' => __DIR__ . '/../language', 
      'pattern' => '%s.mo', 
      'text_domain' => __NAMESPACE__, 
     ), 
    ), 
), 

и внутри module.php добавил строку для определения способа перевода.

public function onBootstrap(MvcEvent $e) 
{ 
    $translator = $e->getApplication()->getServiceManager()->get('translator'); 
    $translator 
     ->setLocale(\Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE'])) 
     ->setFallbackLocale('fr_FR'); 

    ... 
    ... 

Я успешно создал файл po и mo и загрузил его на сервер в нужном месте.

[email protected]:/users/p0100/web/module/Application/language> ls -l 
total 20 
-rw-r--r-- 1 vmamp users 2652 Jan 16 23:46 es_ES.mo 
-rw-r--r-- 1 vmamp users 4582 Jan 16 23:46 es_ES.po 

, например, это snipset одного мнение, где перевод может произойти:

  <li class="moteur"><?php echo $this->translate('Moteur')?></li> 
      <li class="couleur"><?php echo $this->translate('Couleur')?></li> 
      <?php if (count($this->universeData['garnissage']) > 1):?> 
      <li class="selle"><?php echo $this->translate('Selle')?></li> 
      <?php endif;?> 
      <?php if (count($this->universeData['jonc']) > 1):?> 
      <li class="jonc"><?php echo $this->translate('Jonc')?></li> 
      <?php endif;?> 
      <?php if (count($this->universeData['retros']) > 1):?> 
      <li class="retros"><?php echo $this->translate('Retros')?></li> 
      <?php endif;?> 
      <?php if (count($this->universeData['signature']) > 1):?> 
      <li class="signature"><?php echo $this->translate('Signature')?></li> 
      <?php endif;?> 
      <li class="rangement"><?php echo $this->translate('Rangement')?></li> 
      <li class="confort"><?php echo $this->translate('Confort')?></li> 
      <li class="perso"><?php echo $this->translate('Perso')?></li> 

и это часть содержимого файла .po (es_ES.po)

msgid "Couleur" 
msgstr "Color" 

#: view/application/application/configure.phtml:56 
msgid "Selle" 
msgstr "Asiento" 

#: view/application/application/configure.phtml:59 
msgid "Jonc" 
msgstr "Embellecedores" 

#: view/application/application/configure.phtml:62 
msgid "Retros" 
msgstr "Retrovisores" 

#: view/application/application/configure.phtml:65 
msgid "Signature" 
msgstr "Luminosidad" 

#: view/application/application/configure.phtml:67 
msgid "Rangement" 
msgstr "Orden" 

#: view/application/application/configure.phtml:68 
msgid "Confort" 
msgstr "Confort" 

I'checked какие $ _SERVER [ ''] HTTP_ACCEPT_LANGUAGE возвращается и вот что это такое:

es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3 

, поэтому я предполагаю, что строки могут быть переведены на испанский, но они этого не делают. Поскольку файлы перевода назывались es_ES, и я вижу, что HTTP_ACCEPT_LANGUAGE возвращает ключ как es-ES, я пытался переименовать их в es-ES, но это не решило проблему.

Думая о проблеме с кодировкой Я проверил кодировку файлов, и они находятся на utf8, поскольку я установил их в соответствующем метатеге, и что это также кодировка, которую я выбрал для кодировки в poedit для кодировки и исходной кодировки.

[email protected]:/users/p0100/web/module/Application/language> file -i es_ES.po 
es_ES.po: text/x-po charset=utf-8 

Btw, когда я показываю файл со стороны сервера я ценю кодировки ошибок (если я изменить его с места, например, с помощью блокнота + специальные символы прав кодированный). Почему у меня такая проблема и как я могу ее исправить?

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

Любой опытный с этим полем ?

Поведение приложения похоже на то, что механизм traslation не был добавлен, ошибок нет.

Заранее благодарим за ваше время и усилие.

С наилучшими пожеланиями.

EDIT:

мне нужно, чтобы добавить текст домена к линиям переводов:

<?php echo $this->translate('Moteur', 'Application')?> 

после добавления, перевод работает отлично.

ответ

1

У меня была та же проблема. Может быть, мое решение тоже поможет.

В module.config.php у меня есть:

... 
'translator' => array(
    'translation_file_patterns' => array(
     array(
      'type'  => 'gettext', 
      'base_dir' => __DIR__ . '/../language', 
      'pattern' => '%s.mo', 
      'text_domain' => __NAMESPACE__, 
     ), 
    ), 
), 
... 

Убедитесь, что вы должны * .mo файлы, созданные (у вас есть, как вы уже показали, я пишу это, тем не менее, чтобы помочь другим..). Я прочитал в одном учебнике, что вы должны отключить автоматическое создание mo-файлов при сохранении в poedit. Оказалось, что у меня вообще нет мо-файлов. Вторая ошибка в моем коде была следующая. Я размещаю страницу тестирования для отображения отладочных сообщений. Здесь вы можете выводить использованный язык. Таким образом, вы можете увидеть, правильно ли вы выбрали. Внизу я добавил небольшой перевод-тест, чтобы увидеть, если он работает, как ожидалось:

<?php 
    echo "<br /><h1>DEBUG</h1><br />"; 
    echo "Translator-Textdomain: " . $this->formLabel()->getTranslatorTextDomain() . "<br />"; 
    echo "Translator-Locale: " . $this->formLabel()->getTranslator()->getLocale() . "<br />"; 
    echo "Translator->FallbackLocale: " . $this->formLabel()->getTranslator()->getFallbackLocale() . "<br />"; 
    echo "Translate-Test: Password -> ". $this->translate('Password'); 
?> 

Само собой разумеется это не сработало. Я искал два дня за ошибку. Вы видите ошибку? Я забыл поставить __NAMESPACE__ после текста для перевода. Правильно это следует читать:

<?php 
    echo "<br /><h1>DEBUG</h1><br />"; 
    echo "Translator-Textdomain: " . $this->formLabel()->getTranslatorTextDomain() . "<br />"; 
    echo "Translator-Locale: " . $this->formLabel()->getTranslator()->getLocale() . "<br />"; 
    echo "Translator->FallbackLocale: " . $this->formLabel()->getTranslator()->getFallbackLocale() . "<br />"; 
    echo "Translate-Test: Password -> ". $this->translate('Password', __NAMESPACE__); 
?> 

После этих изменений это сработало для меня.

Надежда, что помогает, Alex

+0

Привет, спасибо за ваши комментарии, мне нужно добавить ДОМЕН переводов цепей ... Посмотрите редактирование. – manou

+0

Привет! Кажется, проще использовать __NAMESPACE__ как textDomain, так как это имя модуля. Вам просто нужно напомнить себе, чтобы добавить 'namespace [MODULENAME],' ко всем вашим представлениям. Поскольку переводный текст не должен появляться ни в каком другом месте, это работает очень хорошо. – AlexWerz

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