首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Zend framework 3-翻译验证消息

Zend framework 3-翻译验证消息
EN

Stack Overflow用户
提问于 2018-09-22 16:42:57
回答 3查看 1K关注 0票数 0

我需要翻译验证信息。

我找到了这个链接

https://zendframework.github.io/zend-validator/messages/

在我的全局配置中,我拥有以下内容

代码语言:javascript
复制
'translator' => [
        'locale' => ['it_IT','en_US'],
        'translation_file_patterns' => [
            [
                'type'     => 'gettext',
                'base_dir' => getcwd() .  '/data/language',
                'pattern'  => '%s.mo',
            ],
        ],
    ],

在视图转换器中,使用__('key')可以很好地工作。但是验证消息仍然是英文的。

我使用了网站的指南来验证表单这是我的代码

代码语言:javascript
复制
<?php

namespace Admin\Model;

// Add the following import statements:
use DomainException;
use Zend\Filter\StringTrim;
use Zend\Filter\StripTags;
use Zend\Filter\ToInt;
use Zend\InputFilter\InputFilter;
use Zend\InputFilter\InputFilterAwareInterface;
use Zend\InputFilter\InputFilterInterface;
use Zend\Validator\NotEmpty;
use Zend\Validator\StringLength;

class LoginModel implements InputFilterAwareInterface
{
    public $username;
    public $user2;

    private $inputFilter;

    .....

    public function getInputFilter()
    {
        if ($this->inputFilter) {
            return $this->inputFilter;
        }

        $inputFilter = new InputFilter();

        $inputFilter->add([
            'name' => 'username',
            'required' => true,
            'validators' => [
                [
                    'name' => NotEmpty::class
                ],
            ],
        ]);

        $inputFilter->add([
            'name' => 'user2',
            'required' => true,
            'validators' => [
                [
                    'name' => NotEmpty::class,
                ],
            ],
        ]);

        $this->inputFilter = $inputFilter;
        return $this->inputFilter;
    }
}

我把链接的代码放哪了?

对评论的答复

我读取了一个zend i18n验证器文档。但我不明白这些代码在哪里。我有更多的表格要验证

代码语言:javascript
复制
$translator = new Zend\Mvc\I18n\Translator();
$translator->addTranslationFilePattern(
    'phpArray',
    Resources::getBasePath(),
    Resources::getPatternForValidator()
);

AbstractValidator::setDefaultTranslator($translator);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-25 08:43:11

您可以在验证器的选项中添加消息。就像这样:

代码语言:javascript
复制
$inputFilter->add([
    'name' => 'user2',
    'required' => true,
    'validators' => [
        [
            'name' => NotEmpty::class,
            'options' => [
                'messages' => [
                    'messageKey'  => 'non-translated message',
                    'messageKey2' => _('translated message'),
                ],
            ],
        ],
    ],
]);

要覆盖Zend的消息,您可能希望使用验证器中使用的常量。您的问题使用NotEmpty验证器。如果你看看那门课,你会发现:

代码语言:javascript
复制
/**
 * @var array
 */
protected $messageTemplates = [
    self::IS_EMPTY => "Value is required and can't be empty",
    self::INVALID  => "Invalid type given. String, integer, float, boolean or array expected",
];

因此,当您定义自定义消息时(如我前面所示),最好这样做:

代码语言:javascript
复制
'messages' => [
    NotEmpty::IS_EMPTY => 'non-translated message',
    NotEmpty::INVALID  => _('translated message'),
],

请注意:当然,除非您想要的语言不受支持,否则您不需要翻译所有ZF的默认消息。更多信息

zend-验证器附带了超过45个不同的验证器,其中包含200多条失败消息。翻译所有这些消息可能是一项繁琐的任务。为了您的方便,zendframework/zend-i18n-resources包中提供了预翻译的消息。

支持回购这里的语言

附加的问题添加到在何处放置配置以启用翻译器+翻译的问题

要确保翻译器知道在哪里找到翻译文件,请在module.config.php中的每个模块中添加以下内容

代码语言:javascript
复制
'translator'      => [
    'translation_file_patterns' => [
        [
            'type'     => 'gettext',                // This uses the php-gettext module
            'base_dir' => __DIR__ . '/../language', // Where the folder with files is in relation to this config file
            'pattern'  => '%s.mo',                  // Update extension for what you use
        ],
    ],
],

要想使用它,必须安装一个翻译器包。我建议您使用Zend i18n包。

通过将命名空间添加到模块数组:config/modules.config.php'Zend\\Mvc\\I18n',,在您的'Zend\\Mvc\\I18n',文件中启用它

通过composer.json添加并安装模块,将其添加到require列表中。编写本报告时的现有版本包括:

代码语言:javascript
复制
"zendframework/zend-mvc-i18n": "^1.1"

为了确保它在将来能够工作,将这些添加到require中也是一个好主意:

代码语言:javascript
复制
"ext-intl":"*",
"ext-gettext":"*",

以上所述要求在当前运行的intl实例中安装gettextgettext PHP。

下面简单介绍模块文件/文件夹结构的设置

票数 1
EN

Stack Overflow用户

发布于 2018-10-04 20:46:46

好的,我找到了解决问题的方法,特别是感谢Rkeet的支持。

这些文件有些不精确。

这一行

代码语言:javascript
复制
$translator = new Zend\Mvc\I18n\Translator();

生成错误,因为构造函数需要参数。我确实用这种方式改变了这一排:

代码语言:javascript
复制
$translator = $e->getApplication()->getServiceManager()->get('MvcTranslator');

然后我意识到翻译器在这个目录中搜索

代码语言:javascript
复制
vendor\zendframework\zend-i18n-resources\src/../languages/

用于地区it_IT

在该路径中,没有it_IT文件夹,只有"it“。我给它重新命名了,一切都很好。

下面是我的Module.php文件的完整代码

代码语言:javascript
复制
<?php


namespace Admin;

use Zend\I18n\Translator\Resources;
use Zend\Validator\AbstractValidator;
use Zend\Mvc\MvcEvent;


class Module
{
    const VERSION = '3.0.3-dev';

    public function onBootstrap(MvcEvent $e)
    {
        /** @var \Zend\Mvc\I18n\Translator $translator */
        $translator = $e->getApplication()->getServiceManager()->get('MvcTranslator');
        $translator->addTranslationFilePattern(
            'phpArray',
            Resources::getBasePath(),
            Resources::getPatternForValidator()
        );
        AbstractValidator::setDefaultTranslator($translator);
    }

    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }
}
票数 0
EN

Stack Overflow用户

发布于 2019-04-26 21:18:11

如果您想使用默认的ZF3翻译作为验证消息,则必须修改"src“文件夹下的"Module.php”文件。

首先,使用"require“命令通过composer安装”zend i18n“模块:

代码语言:javascript
复制
composer require zendframework/zend-mvc-i18n

然后使用"Module.php“中的代码来查看意大利语的验证消息:

代码语言:javascript
复制
    <?php

    namespace Application;

    use Zend\I18n\Translator\Resources;
    use Zend\Mvc\I18n\Translator;
    use Zend\I18n\Translator\Translator as I18nTranslator;
    use Zend\Validator\AbstractValidator;
    use Zend\Mvc\MvcEvent;
    use Zend\Mvc\ModuleRouteListener;

    class Module
    {
        const VERSION = '3.0.3-dev';

        public function onBootstrap(MvcEvent $e)
        {
            $eventManager = $e->getApplication()->getEventManager();
            $moduleRouteListener = new ModuleRouteListener();
            $moduleRouteListener->attach($eventManager);
            $t = new I18nTranslator();
            $t->setLocale('it_IT');
            $translator = new Translator($t);
            $translator->addTranslationFile('phpArray', 'vendor/zendframework/zend-i18n-resources/languages/it/Zend_Validate.php', 'default', 'it_IT');
            AbstractValidator::setDefaultTranslator($translator);
        }
     }

您可以将"it_IT“更改为"es_ES”或"de_DE“,以查看其他语言中的验证消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52458738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档