Zend Framework 3 - Перевести сообщение проверки - PullRequest
0 голосов
/ 22 сентября 2018

Мне нужно перевести сообщение проверки.

Я нашел эту ссылку

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

В моем глобальном конфиге у меня есть

'translator' => [
        'locale' => ['it_IT','en_US'],
        'translation_file_patterns' => [
            [
                'type'     => 'gettext',
                'base_dir' => getcwd() .  '/data/language',
                'pattern'  => '%s.mo',
            ],
        ],
    ],

В переводчике представления, используя __ ('ключ'), работают нормально.Но сообщение для проверки остается на английском

Я использовал руководство сайта для проверки формы, это мой код

<?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.Но я не понимаю, где этот код.У меня есть форма для проверки

$translator = new Zend\Mvc\I18n\Translator();
$translator->addTranslationFilePattern(
    'phpArray',
    Resources::getBasePath(),
    Resources::getPatternForValidator()
);

AbstractValidator::setDefaultTranslator($translator);

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Хорошо, я нашел решение проблемы, особенно благодаря поддержке Rkeet (спасибо).

Документация имеет некоторую неточность.

В этой строке

$translator = new Zend\Mvc\I18n\Translator();

генерируется ошибка, поскольку в конструкторе требуется параметр.Я изменил строку следующим образом:

$translator = $e->getApplication()->getServiceManager()->get('MvcTranslator');

Затем я понимаю, что поиск переводчика в этом каталоге

vendor\zendframework\zend-i18n-resources\src/../languages/

для локали it_IT

На этом пути нетпапка it_IT, но только "it".Я переименовал его, и все работает нормально.

Ниже приведен полный код моего файла Module.php

<?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 голосов
/ 27 апреля 2019

Если вы хотите использовать переводы ZF3 по умолчанию для сообщения проверки, вы должны изменить файл «Module.php» в папке «src».

Прежде всего установите модуль «zend-mvc-i18n»через композитора с помощью команды require:

composer require zendframework/zend-mvc-i18n

Затем используйте этот код в "Module.php", например, для просмотра сообщения проверки на итальянском языке:

    <?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 "to" es_ES "или" de_DE "для просмотра сообщения проверки на других языках.

0 голосов
/ 25 сентября 2018

Вы можете добавить сообщения в опциях валидатора.Например:

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

Чтобы перезаписать сообщение Zend, вы можете использовать константы, используемые в валидаторах.Например, ваш вопрос использует валидатор NotEmpty.Если вы посмотрите на этот класс, вы найдете:

/**
 * @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",
];

Итак, когда вы определяете пользовательские сообщения, как я показал выше, вам лучше всего сделать:

'messages' => [
    NotEmpty::IS_EMPTY => 'non-translated message',
    NotEmpty::INVALID  => _('translated message'),
],

Обратите внимание: Вам не нужно переводить все сообщения ZF по умолчанию, если, конечно, нужный вам язык не поддерживается. Подробнее

Zend-валидатор поставляется с более чем 45 различными валидаторами с более чем 200 сообщениями о сбоях.Перевод всех этих сообщений может быть утомительным занятием.Для вашего удобства предварительно переведенные сообщения предоставляются в пакете zendframework / zend-i18n-resources

Поддерживаемые языки этого репозитория здесь


Добавлен дополнительный вопрос к вопросу о том, где разместить конфигурацию, чтобы включить переводчик + переводы

Чтобы убедиться, что переводчик знает, где искать файлы перевода, добавьте следующее к каждому модулю в module.config.php:

'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
        ],
    ],
],

Чтобы использовать это, у вас должен быть установлен пакет Translator.Я бы порекомендовал вам использовать пакет Zend Mvc i18n.

Включите его в файле config/modules.config.php, добавив пространство имен в массив модулей: 'Zend\\Mvc\\I18n',

Добавьте и установите модуль через composer.json, добавив его в requireсписок.Текущая версия на момент написания:

"zendframework/zend-mvc-i18n": "^1.1"

Чтобы убедиться, что она будет работать в будущем, неплохо было бы добавить их и к require:

"ext-intl":"*",
"ext-gettext":"*",

Выше потребуется, чтобы модули PHP intl и gettext были установлены в работающем в данный момент экземпляре PHP.


Ниже просто рассмотрим настройку структуры файла / папки модуля

Simplified setup

...