4

有没有可能的方法来翻译控制器中的字符串而不是视图?

现在,在我的控制器中,如果我传递如下字符串:

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

在控制器中

提前感谢您的帮助

4

3 回答 3

23

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

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

您可以使用 php getText 函数 ___('my custom message') 并在 poedit 中添加“_”作为源关键字(在目录属性中),以便 poedit 过滤来自控制器的字符串。例如:

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

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

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

array('message' => $translate('my custom message'));
于 2013-01-09T11:23:36.647 回答
4

您不应该使用视图的插件管理器来访问翻译助手。抓住我已经解释过的翻译这里

该帖子的副本/粘贴:

翻译是通过Translator. 翻译器是一个对象,例如注入到视图助手中,因此如果您调用该视图助手,它会使用翻译器来翻译您的字符串。对于这个答案,我假设您已将翻译器配置为与骨架应用程序相同

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

'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')来翻译您的字符串。

于 2013-01-10T18:14:13.020 回答
3

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

}
于 2013-04-09T13:29:41.303 回答