Zend Framework 2 — Перевод и текстовая область в представлениях

В настоящее время я работаю над переводом существующего проекта 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 Класс в контроллере и уже запрограммированный выше код, но плагины не доступны на этом этапе.

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

1

Решение

После бесконечного поиска я обнаружил, что рендерер по умолчанию — 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);
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]