在zend框架2中转换控制器类变量

时间:2013-10-08 14:40:24

标签: internationalization zend-framework2

假设我有一个控制器,我想定义一些包含某些消息的const变量(例如错误消息等)。

有没有办法让它们被翻译? 下面定义了一个示例类:

<?php
namespace Test\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class AccountController extends AbstractActionController
{
    protected $testError = 'There was an error while testing some stuff';

    public function testAction(){

        // I know i can use the following approach but I don't want to
        // since I want to use a variable for readability issues.
        // $testError = $this->getTranslator()->translate('There was an error..');

        return new ViewModel();
    }

    /**
     * Retrieve the translator
     *
     * @return \Zend\I18n\Translator\Translator
     */
    public function getTranslator()
    {
        if (!$this->translator) {
            $this->setTranslator($this->getServiceLocator()->get('translator'));
        }
        return $this->translator;
    }

    /**
     * Set the translator
     *
     * @param $translator
     */
    public function setTranslator($translator)
    {
        $this->translator = $translator;
    }
}

所以我希望翻译testError。我知道我可以使用该消息并通过zend转换器将其翻译而不使用变量,但我仍然希望将其存储在变量中以便于读取性问题。有任何帮助或其他方法吗?

2 个答案:

答案 0 :(得分:1)

我不太明白你的意思:

$errorMessage = 'FooBarBazBat";

return new ViewModel(array(
    'error' => $this->getTranslator()->translate($errorMessage)
));

是一种将消息存储在变量中的方法。但我真的不明白你的问题在哪里。

或者您的意思是将翻译器变为变量吗?

$translator = $this->getServiceLocator()->get('viewhelpermanager')->get('translate');
$errorMessage = $translator('FooBarBazBat');

答案 1 :(得分:1)

只需在项目根目录的任何目录中创建一个translations.phtml文件,并填写类似的内容:

<?php

// Colors
_('Black');
_('White');
_('Green');
_('Light Green');
_('Blue');
_('Orange');
_('Red');
_('Pink');

在poedit中,检查目录属性&gt;源关键字列表确保_字符存在。 (gettext方法的别名)。在应用程序中,例如使用$this->translate($colorName)

当poedit扫描您的项目目录以查找需要翻译的关键字时,也会扫描translations.phtml文件。

另一种方便的方法是使用_方法(gettext别名)来提高代码可读性。例如:

$this->errorMsg = _('There was an error..');

但是,当你第一次在TranslatorServiceFactory或模块的onBootstrap方法中初始化你的翻译器实例时,不要忘记设置全局Locale object的默认语言环境值:

    ...
    $translator = \Zend\Mvc\I18n\Translator\Translator::factory($config['translator']);
    $locale = 'en_US';
    $translator->setLocale($locale);
    \Locale::setDefault($translator->getLocale());
    return $translator;
    ...