如何在zend框架2中的控制器中使用translate helper

时间:2013-01-09 11:14:05

标签: zend-framework2 zend-translate

有没有办法在控制器中翻译字符串而不是视图?

现在,在我的控制器中,如果我传递像:

这样的字符串
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'));
}
控制器中的

提前感谢您的帮助

3 个答案:

答案 0 :(得分:22)

要在控制器中使用视图助手,可以使用“getServiceLocator”

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

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

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

根据您的代码,您可以像这样直接使用帮助

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

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

答案 1 :(得分:4)

您不应该使用视图的插件管理器来访问翻译助手。抓住翻译器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')翻译字符串。

答案 2 :(得分:3)

我为此目的使用了一个简单的插件。然后在控制器中你可以做$ this-&gt; 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);
    }

}