如何在控制器中使用翻译助手在zend框架2

问题描述:

是否有任何可能的方法来在控制器而不是视图中翻译字符串?如何在控制器中使用翻译助手在zend框架2

现在,在我的控制器,如果我通过类似的字符串:

public function indexAction() { 
    return array('message' => 'example message'); 
} 

它将在index.phtml翻译

<?php print $this->translate($message);?> 

它运作良好,但poeditor无法从找到字符串控制文件

想这将是冷静,如果我可以使用类似:

public function indexAction() { 
    return array('message' => $view->translate('example message')); 
} 
在控制器

预先感谢帮助

+0

此外,我想翻译为形式传递的字符串/元素属性(** **标题,** ALT **)等'自动翻译'只能在zf2中的表单元素**标签**上启用:(所以我必须在表单类中翻译这些字符串。现在我在表单构造中传递翻译助手,猜测不是一个好方法。 .. – Sanju

要在控制器使用视图助手,你可以使用 'getServiceLocator'

$helper = $this->getServiceLocator()->get('ViewHelperManager')->get('helperName'); 

要么你可以使用PHP的getText函数___(“我的自定义消息')并添加“_”作为poedit中的源关键字(在目录属性中),所以poedit将从控制器中过滤字符串。例如:

array('message' => _('my custom message')); 

而且按你的代码,你可以直接使用助手这样

$translate = $this->getServiceLocator()->get('ViewHelperManager')->get('translate'); 

array('message' => $translate('my custom message')); 
+0

这两种方法都在工作...... :)哪种方法应该是首选? – Sanju

+0

我更喜欢gettext方法,因为需要更少的努力:) – webcoder

你不应该使用视图的插件管理器去翻译帮手。像I have explained here already那样抓取翻译器。该职位的

复制/粘贴:

翻译通过Translator完成。翻译器是一个对象,例如在视图助手中注入,所以如果你调用视图助手,它会使用翻译器来翻译你的字符串。对于这个答案,我假设你已经配置了翻译器just the same as the skeleton application

最好的方法是使用工厂将它作为依赖注入到控制器中。控制器配置:

'controllers' => array(
    'factories' => array(
    'my-controller' => function($sm) { 
     $translator = $sm->getServiceLocator()->get('translator'); 
     $controller = new MyModule\Controller\FooController($translator); 
    } 
) 
) 

而且控制器本身:

namespace MyModule; 

use Zend\Mvc\Controller\AbstractActionController; 
use Zend\I18n\Translator\Translator; 

class FooController extends AbstractActionController 
{ 
    protected $translator; 

    public function __construct(Translator $translator) 
    { 
    $this->translator = $translator; 
    } 
} 

另一种方法是从你的行动服务管理器拉翻译,但这是不够灵活,更少的可测试性和难以维持:

public function fooAction() 
{ 
    $translator = $this->getServiceManager()->get('translator'); 
} 

在这两种情况下,您都可以使用$translator->translate('foo bar baz')来翻译字符串。

+0

谢谢:)你能否提一下使用第一块代码的位置(在哪个文件/函数中,请更具体)?在我的module.php文件中,函数'getServiceConfig()',它只是返回数组('工厂'=> ***) – Sanju

+0

@三居它是控制器的配置。你可以把它放在module.config.php中,或者替代方法是你跳过** controllers'键,然后从'factories'开始,直接把它放在'MyModule'的'getControllerConfig()'方法中\ Module'类。 –

+0

不工作?参数1传递给MyModule \ Controller \ MyController :: __ construct()必须是Zend \ I18n \ Translator \ Translator的一个实例,没有给出, – Oskar

我为此使用了一个简单的插件。然后在控制器中,您可以执行$ this-> translate('example message');

class Translate extends AbstractPlugin { 

    private $translator; 

    public function __construct(PluginManager $pm) { 
     $this->translator = $pm->getServiceLocator()->get('Translator');   
    } 

    public function __invoke($message, $textDomain = 'default', $locale = null) { 
     return $this->translator->translate($message, $textDomain, $locale); 
    } 

}