В настоящее время я работаю над переводом существующего проекта Zend Framework 2, который распространяется на несколько модулей.
Я понимаю, что функциональность перевода ZF2 заключается в том, что вы можете иметь как можно больше файлов перевода, при условии, что каждый из них «пространственно распределен по именам» для разных text_domain
, Это прекрасно работает на практике, каждый модуль имеет следующее module.config.php
файл:
...
'translator' => array (
'locale' => 'en_US',
'translation_file_patterns' => array (
array (
'type' => 'phparray',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s_default.php',
'text_domain' => 'ExampleModule'
),
),
),
...
Который добавляет ../language/*_default.php
файл в список перевода с text_domain
из ExampleModule
, Пока все хорошо.
Теперь сам переводчик должен знать, какой text_domain
выбрать перевод и будет использовать default
если не предоставлено.
Итак, внутри и наверху все на мой взгляд *.phtml
файлы у меня есть:
$this->plugin('translate')->setTranslatorTextDomain('ExampleModule');
$this->formLabel()->setTranslatorTextDomain('ExampleModule');
$this->formText()->setTranslatorTextDomain('ExampleModule');
Который рассказывает все происходящее $this->translate()
блоки и элементы формы, которые text_domain
использовать.
Это замечательно и прекрасно работает, но не соответствует принципу СУХОГО, так как у меня есть похожий код в верхней части каждого представления. Я попытался продлить ViewModel
класс, чтобы я мог выбрать другой ViewModel
Класс в контроллере и уже запрограммированный выше код, но плагины не доступны на этом этапе.
Как бы я включил вышеуказанный код в каждое / большинство представлений, не вводя его каждый раз?
После бесконечного поиска я обнаружил, что рендерер по умолчанию — PhpRenderer
— можно получить доступ через onBootstrap
метод Module.php
(ссылка).
Поскольку сценарии представления предоставлены PhpRenderer
$this
переменная указывает на PhpRenderer
(ссылка). Это означает, что вы можете прикрепить код, который мне нужен Module.php
как показано ниже:
// Get the default ViewRenderer (PhpRenderer) and setup the correct text domain for derivative plugins
$viewRenderer = $e->getApplication()->getServiceManager()->get('ViewRenderer');
$viewRenderer->plugin('translate')->setTranslatorTextDomain('ExampleModule');
$viewRenderer->formLabel()->setTranslatorTextDomain('ExampleModule');
$viewRenderer->formText()->setTranslatorTextDomain('ExampleModule');
Поскольку текущее пространство имен соответствует text_domain
Мне нужно, выше можно упростить путем замены 'ExampleModule'
с __NAMESPACE__
,
РЕДАКТИРОВАТЬ: Если вы ищете другой text_domain
за модуль; вам понадобится только один Module.php
:
$viewRenderer = $e->getApplication()->getServiceManager()->get('ViewRenderer');
$eventManager->getSharedManager()->attach('Zend\Mvc\Controller\AbstractActionController', 'dispatch', function($e) use ($viewRenderer) {
$controller = $e->getTarget();
$controllerClass = get_class($controller);
$moduleNamespace = substr($controllerClass, 0, strpos($controllerClass, '\\'));
$viewRenderer->plugin('translate')->setTranslatorTextDomain($moduleNamespace);
$viewRenderer->formLabel()->setTranslatorTextDomain($moduleNamespace);
$viewRenderer->formText()->setTranslatorTextDomain($moduleNamespace);
}, 100);
Других решений пока нет …