使用Zend Framework 2和Zend \ I18n \ Translator \ Translator,我想在同一个动作中动态定义翻译的语言。 为什么?我需要向每个客户发送电子邮件,其中内容翻译语言取决于客户档案中定义的语言。这将由CRON执行。
我试过这段代码:
/** @var \Zend\I18n\Translator\Translator $translator */
$translator = $this->getServiceLocator()->get('translator');
$translator->setLocale('fr_FR');
AbstractValidator::setDefaultTranslator($translator);
/** @var \Zend\View\Renderer\PhpRenderer $renderer */
$renderer = $this->getServiceLocator()->get('Zend\View\Renderer\PhpRenderer');
$view = new ViewModel();
$view->setTemplate('templatename')->setVariables($data);
var_dump($renderer->render($view));
/** @var \Zend\I18n\Translator\Translator $translator */
$translator = $this->getServiceLocator()->get('translator');
$translator->setLocale('en_EN');
AbstractValidator::setDefaultTranslator($translator);
/** @var \Zend\View\Renderer\PhpRenderer $renderer */
$renderer = $this->getServiceLocator()->get('Zend\View\Renderer\PhpRenderer');
$view = new ViewModel();
$view->setTemplate('templatename')->setVariables($data);
var_dump($renderer->render($view));
但两个var_dump在同一种语言中显示相同的内容(在本例中为fr_FR)。 有什么想法吗?
答案 0 :(得分:0)
我还没有用zend框架2做过这个,但我找到了一个教程,可以帮助你实现你想要实现的目标。 tutorial
更新
好吧,我不明白。尽管如此,我尝试了你正在做的事情,我得到当前的语言环境为en_EN
$translator = $this->getServiceLocator()->get('translator');
$translator->setLocale('fr_FR');
$translator->setLocale('en_EN');
echo $translator->getLocale();die;
所以它可能无法加载英文翻译并获得后备区域设置(假设为fr_FR)?
更新2。
我想尝试在此工作,因为我很快就会需要它,所以我尝试创建一个小测试,以帮助您解决问题,并了解它。但我的方法与你的方法有所不同。我希望我能正确理解你想要做的事情。
控制器:
$translator = $this->getServiceLocator()->get('translator');
$translator->setLocale('fr_FR');
$locale = $translator->getLocale('fr_FR');
$textDomain = 'Users\Controller';
$view = new ViewModel(array(
'locale' => $locale,
'textDomain' => $textDomain,
'translator' => $translator,
));
return $view;
查看:
<?php echo $translator->translate('Home', $textDomain, $locale); ?>
module.config.php:
'translator' => array(
'locale' => 'en_US',
'translation_file_patterns' => array(
array(
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
'text_domain' => __NAMESPACE__,
),
),
),
根据我正在阅读的说明,声明text_domain应该是唯一的,所以我使用的是 NAMESPACE ,但我在上面的控制器示例中编写了很难,因为测试是在不同的命名空间上进行的,所以忽略这部分,只要记住你需要它。
因此,根据我的测试,我能够使用我设置的语言环境并将单词HOME翻译为Accueil。这就是你在寻找的地方吗?
答案 1 :(得分:0)
问题在于zf2中的依赖注入。在正常情况下,您可以通过module.php
和onBootstrap
方法在每个请求的发送事件开始时在zf2事件中定义/初始化您的语言环境。
在模块启动后,Zend\View\HelperPluginManager
类通过ServiceManager
加载,并按以下顺序注入每个ViewHelper
($this->translate
也是ViewHelper)实例转换器
ServiceManager
MvcTranslator
实例注入viewhelper ServiceManager
一个Zend\I18n\Translator\TranslatorInterface
注入viewhelper ServiceManager
一个Translator
注入viewhelper 您更改了最后一个实例Translator
,但是viewhelper有一个MvcTranslator
的实例
使用
$translator = $this->getServiceLocator()->get('MvcTranslator');
并且每个调用内部getTranslator
getLocale
的viewhelper都会返回新的语言环境并使用它来翻译$this->translate('someString');