我目前正致力于翻译遍布多个模块的现有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
要使用的表单元素。
这很好,并且工作正常,但它与DRY原则并不相符,因为我在每个视图的顶部都有类似的代码。我试图扩展ViewModel
类,这样我就可以在控制器中选择一个不同的ViewModel
类,并且上面的代码已经编入,但插件在那个阶段不可用。
如何在每个/大多数视图中包含上述代码,而无需每次都输入?
答案 0 :(得分:2)
在无休止地搜索之后,我发现可以通过PhpRenderer
(reference)的onBootstrap
方法访问默认渲染器Module.php
。
由于视图脚本由PhpRenderer
呈现,$this
变量指向PhpRenderer
(reference)。这意味着您可以将我需要的代码附加到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);