2014-10-02 73 views
1

我目前正致力於翻譯圍繞多個模塊傳播的現有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文件翻譯列表與ExampleModule一個text_domain。迄今爲止都很好。

現在,翻譯者本身需要知道哪個text_domain選擇翻譯,並且如果沒有提供翻譯,將使用default

因此,內部和所有的我的觀點*.phtml文件的頂部,我有:

$this->plugin('translate')->setTranslatorTextDomain('ExampleModule'); 
$this->formLabel()->setTranslatorTextDomain('ExampleModule'); 
$this->formText()->setTranslatorTextDomain('ExampleModule'); 

它告訴所有的出發$this->translate()塊和使用哪個text_domain表單元素。

這很棒,而且工作正常,但是它不能很好地滿足DRY原則,因爲我在每個視圖的頂部都有類似的代碼。我試圖擴展ViewModel類,以便我可以在控制器中選擇一個不同的ViewModel類,並且已經將上面的代碼插入,但插件在該階段不可用。

我如何將上述代碼包含在每個/大多數視圖中,而不必每次都輸入它?

回答

2

不休搜索後,我發現的默認渲染 - PhpRenderer - 可以通過的Module.phpreference)的onBootstrap方法進行訪問。

由於視圖腳本由PhpRenderer呈現,因此$this變量指向PhpRendererreference)。這意味着你可以將我需要Module.php如下面的代碼:由於當前的命名空間相匹配的text_domain我需要

// 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'); 

,上面可以通過__NAMESPACE__交換'ExampleModule'被簡化。

編輯:如果你正在尋找不同的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);