ZF2 - 如何翻译Zend表单验证错误消息?

时间:2013-04-03 08:40:30

标签: php zend-framework2

我有.po和.mo语言文件用于不同的语言。 但语言翻译不适用于zend表单验证错误消息。 我不想像fr.php那样使用额外的.php文件。

我从click here

获得了此代码
$translator = new Zend\I18n\Translator\Translator();
$translator->addTranslationFile(
    'phpArray'
    'resources/languages/en.php',
    'default',
    'en_US'
);

Zend\Validator\AbstractValidator::setDefaultTranslator($translator);

如何在ZF2中实现它的任何解决方案。

2 个答案:

答案 0 :(得分:5)

我不赞成所选答案:P

在配置中添加新的翻译器时, NOT 使用默认的翻译器 - 文本域。语法如下:

$translator->addTranslationFile(
    $type,
    $resource,
    $textDomain, //<-- this is the important one
    $lang
);

在您的示例中,您已将文件添加到default-textdomain。遗憾的是,这会给它带来很多麻烦,因为它并不总是按预期工作。每当您添加翻译文件时,请将它们添加到您自己的文本域!

之后,您只需指定Zend\Form\View\Helper您的文本域即可。这可以通过以下方式完成:

// For Labels
$this->formLabel()->setTranslatorTextDomain('your-textdomain');

// For Buttons (input type submit)
$this->formButton()->setTranslatorTextDomain('your-textdomain');

// For Error-Messages
$this->formElementErrors()->setTranslatorTextDomain('your-textdomain');

如何将ServiceManager纳入表单?

这也很简单。简单的一个是使用constructor-injection并将ServiceManagerServiceLocator注入到表单的__construct()中。在Controller-Level上,这看起来像这样:

$serviceLocator = $this->getServiceLocator();
$form           = new My\Form($serviceLocator);

可以找到对Form-Dependencies的更深入的介绍on my Blog,其中我说明了Zend\Form\Element\Select - 依赖数据库连接上的元素的填充。

关于译者本身

需要注意的另一件事是:只要有一个名为translator的配置附加了Translator-Service,它就会自动作为默认翻译器附加到表单上。这是我定期在模块中使用的示例配置:

'translator' => array(
    'locale' => 'de_DE',
    'translation_file_patterns' => array(
        array(
            'type'     => 'phparray',
            'base_dir' => __DIR__ . '/lang',
            'pattern'  => '%s.php',
            'text_domain' => __NAMESPACE__,
        ),
    ),
),

答案 1 :(得分:1)

只需添加.po.mo个文件,而不是.php个文件,例如:

$translator = new Zend\I18n\Translator\Translator();
$translator->addTranslationFile(
    'gettext'
    'resources/languages/fr.mo',
    'default',
    'fr_FR'
);
Zend\Validator\AbstractValidator::setDefaultTranslator($translator);

然后翻译它,使用

echo $this->formElementErrors($form->get("username"),
                              array('message' => $this->translate("errormessage"))
);

我不知道ZF2中的翻译性能如何,但在ZF1中使用.php文件中的数组比任何其他方法都要快。