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


ZF2 - How To Translate Zend Form Validation Error Messages?

我有不同语言的。po和编译的。mo语言文件。但是语言翻译不能处理end form验证错误消息。我不想为它使用额外的。php文件,比如。php。

我从点击这里得到这段代码

$translator = new Zend'I18n'Translator'Translator();
$translator->addTranslationFile(
    'phpArray'
    'resources/languages/en.php',
    'default',
    'en_US'
);
Zend'Validator'AbstractValidator::setDefaultTranslator($translator);

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

我不赞成选择的答案:p

在配置中添加新的翻译器时,请而不是使用默认的translator-text-domain。语法如下:

$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进入Form?

这也很简单。简单的一种是使用constructor-injection,并将ServiceManagerServiceLocator注入您的表格的__construct()中。在控制器级别,它看起来像这样:

$serviceLocator = $this->getServiceLocator();
$form           = new My'Form($serviceLocator);
关于表单依赖关系的更深入的介绍可以在我的博客上找到,我在那里演示了在依赖的数据库连接上填充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__,
        ),
    ),
),

只需添加.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文件的方式比任何其他方法快。