Zend Framework 2 - 视图中的翻译和文本域


Zend Framework 2 - Translation and text domain in views

我目前正在翻译一个现有的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_domainExampleModule 。到目前为止一切都很好。

现在,译员本身需要知道从哪个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);