有没有办法在控制器中翻译字符串而不是视图?
现在,在我的控制器中,如果我传递像:
这样的字符串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 :(得分: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);
}
}