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

时间:2014-10-02 07:22:06

标签: php internationalization zend-framework2

我目前正致力于翻译遍布多个模块的现有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类,并且上面的代码已经编入,但插件在那个阶段不可用。

如何在每个/大多数视图中包含上述代码,而无需每次都输入?

1 个答案:

答案 0 :(得分:2)

在无休止地搜索之后,我发现可以通过PhpRendererreference)的onBootstrap方法访问默认渲染器Module.php

由于视图脚本由PhpRenderer呈现,$this变量指向PhpRendererreference)。这意味着您可以将我需要的代码附加到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);