PHP ZF2翻译语言切换

时间:2014-07-29 15:26:56

标签: php internationalization zend-framework2 translation

使用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)。 有什么想法吗?

2 个答案:

答案 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.phponBootstrap方法在每个请求的发送事件开始时在zf2事件中定义/初始化您的语言环境。

在模块启动后,Zend\View\HelperPluginManager类通过ServiceManager加载,并按以下顺序注入每个ViewHelper$this->translate也是ViewHelper)实例转换器

  1. ServiceManager MvcTranslator实例注入viewhelper
  2. ServiceManager一个Zend\I18n\Translator\TranslatorInterface注入viewhelper
  3. ServiceManager一个Translator注入viewhelper
  4. 您更改了最后一个实例Translator,但是viewhelper有一个MvcTranslator的实例

    使用

    $translator = $this->getServiceLocator()->get('MvcTranslator');

    并且每个调用内部getTranslator getLocale的viewhelper都会返回新的语言环境并使用它来翻译$this->translate('someString');

    中的给定字符串