Я пытаюсь найти способ перевести ярлыки и названия.
По его словам Руководство ZF2 все что мне нужно сделать:
Помощники по навигации поддерживают перевод меток и заголовков страниц. Вы можете установить переводчик типа Zend \ I18n \ Translator в помощнике, используя $ helper-> setTranslator ($ translationator).
Так что моя навигация выглядит так в конфигурационном файле
return array(
'navigation' => array(
'default' => array(
array(
'label' => 'Home',
'route' => 'home',
),
array(
'label' => 'Users',
'route' => 'tar-users',
),
),
),
);
Это в global.php
return array(
'service_manager' => array(
'factories' => array(
'navigation' => 'Zend\Navigation\Service\DefaultNavigationFactory',
),
),
//...
);
И в моем макете у меня есть:
<?php echo $this->navigation('navigation')
->setTranslator($this->plugin('translate')->getTranslator())
->menu()
->setUlClass('nav navbar-nav')
->setMaxDepth(0)
?>
Навигация работает, но не переводит.
Я уверен, что что-то пропустил или я сделал что-то не так. Я хотел бы знать что. Я не то, что вы пишете код, только некоторые советы.
Спасибо.
Zend использует .po
файлы в Application/language
папка, и вам нужно использовать PoEdit редактировать переводы gettext. Поедит сканирует.php
( или же .phtml
файлы в данном случае) для перевода фраз, точнее, ищет имя функции перевода ( translate
в этом случае ). Проверьте ВОТ как настроить poedit для Zend, и ВОТ простое решение для перевода меток меню. Я только начал изучать Zend, я не уверен, что это правильный подход, но это самое простое решение, с которым я столкнулся. Вам просто нужно добавить значения метки как $translator->translate( ... )
в Application/config/module.config.php
, настроить переводчик (в каркасном приложении, en_US
язык и gettext
тип ). После этого откройте .po
Каталог файлов и обновлений, необходимо добавить новые строки для перевода (также вы не можете и не должны добавлять новые переводы, которые программа не находит автоматически). Я проверил выше, и меню переводится автоматически без setTranslator( ... )
вызов.
Вы настраиваете службу переводчика и локаль в вашем module.config.php?
что-то вроде этого:
'translator' => array(
'locale' => 'it_IT',
'translation_files' => array(
array(
'type' => 'phpArray',
'filename' => __DIR__ . '/../language/Zend_Captcha.php',
'text_domain' => 'default'
),
array(
'type' => 'phpArray',
'filename' => __DIR__ . '/../language/Zend_Validate.php',
'text_domain' => 'default'
),
),
'translation_file_patterns' => array(
array(
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
),
),
),
Я столкнулся с удивительным обстоятельством, когда я также все правильно настроил, но перевод не был выполнен … потому что в ОС не был установлен соответствующий языковой стандарт. Я пытался перевести en_US на fr_CA. Это быстро исправило вещи для меня:
sudo locale-gen fr_CA
sudo locale-gen fr_CA.UTF-8
У меня была такая же проблема, и вот мое решение. (С помощью gettext
)
Пример:
module.config.php
array (
'label' => _('Home'),
'route' => 'home'
),
В представлении вы будете использовать что-то вроде этого:
$this->translate(HERE_COMES_THE_ITENS_OF_NAVIGATION)
В моем случае я использую это:
foreach ( $this->container as $page ) {
$this->translate($page->getlabel ());
}
В программе POEDIT вы вставите два источника ключевых слов
1 - translate
2 - _
«_» Предназначен для сопоставления ключевого слова с помощью POEDIT, а ZEND использует «перевод», чтобы заменить его значением, которое вы поместили в POEDIT.
Zend поставляется с переводом по навигации, но не до рендеринга.
Этот фрагмент сделает свое дело. (Zend 3)
$sm = $event->getApplication()->getServiceManager();
$vhm = $sm->get('ViewHelperManager');
$translator = $sm->get('translator');
$vhm->get('navigation')->setTranslator($translator);