我目前正在翻译一个现有的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
类并已经烘焙了上面的代码,但插件在该阶段不可用。
我将如何在每个/大多数视图上包含上述代码,而不必每次都键入它?
经过无休止的搜索,我发现默认渲染器 - PhpRenderer
- 可以通过Module.php
(参考(的onBootstrap
方法访问。
当视图脚本通过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);