3

我有不同语言的 .po 和编译的 .mo 语言文件。但是语言翻译不适用于 zend 表单验证错误消息。我不想为此使用额外的 .php 文件,例如 fr.php。

我从单击此处获得此代码

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

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

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

4

2 回答 2

7

我不赞成所选的答案:P

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

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

在您的示例中,您已将文件添加到默认文本域。可悲的是,这带来了很多麻烦,因为它不会总是按预期工作。每当您添加翻译文件时,请将它们添加到您自己的文本域中!

之后,您需要做的就是分配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()

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

可以在我的博客上找到对 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__,
        ),
    ),
),
于 2013-04-03T13:01:39.527 回答
1

只需添加您的.poor.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文件中使用数组比任何其他方法都快。

于 2013-04-03T09:14:25.457 回答