如何在控制器中使用翻译助手在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'));
}
在控制器
预先感谢帮助
要在控制器使用视图助手,你可以使用 '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'));
你不应该使用视图的插件管理器去翻译帮手。像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')
来翻译字符串。
谢谢:)你能否提一下使用第一块代码的位置(在哪个文件/函数中,请更具体)?在我的module.php文件中,函数'getServiceConfig()',它只是返回数组('工厂'=> ***) – Sanju
@三居它是控制器的配置。你可以把它放在module.config.php中,或者替代方法是你跳过** controllers'键,然后从'factories'开始,直接把它放在'MyModule'的'getControllerConfig()'方法中\ Module'类。 –
不工作?参数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);
}
}
此外,我想翻译为形式传递的字符串/元素属性(** **标题,** ALT **)等'自动翻译'只能在zf2中的表单元素**标签**上启用:(所以我必须在表单类中翻译这些字符串。现在我在表单构造中传递翻译助手,猜测不是一个好方法。 .. – Sanju