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

Arv*_*ind 3 php zend-framework2

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

我从这里得到这个代码

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

Zend\Validator\AbstractValidator::setDefaultTranslator($translator);
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*Sam 6

我不赞成所选答案:P

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

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

在您的示例中,您已将文件添加到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');
Run Code Online (Sandbox Code Playgroud)

如何将ServiceManager导入表单?

这也很容易.该simples一种是使用constructor-injection和注入ServiceManagerServiceLocator进入__construct()你的表格.在Controller-Level上,这看起来像这样:

$serviceLocator = $this->getServiceLocator();
$form           = new My\Form($serviceLocator);
Run Code Online (Sandbox Code Playgroud)

可以在我的博客上找到有关 Form-Dependencies的更深入的介绍,其中我说明了Zend\Form\Element\Select依赖Database-Connections上的-Element 的填充.

关于译者本身

另外需要注意的是:只要有一个Translator-Service附加到您的配置名称translator,它将自动作为默认翻译器附加到表单.这是我定期在模块中使用的示例配置:

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

  • @DominicWatson就是这个。基本上,这是对所有内容进行命名空间的常见最佳实践,其中包括语言资源。 (2认同)