Zend framework 3 - 翻译验证信息
Zend framework 3 - Translate validation message
我需要翻译验证消息。
我找到了这个link
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',
],
],
],
在视图翻译器中,使用 __('key'),工作正常。但验证消息仍为英文
我使用网站的指南来验证表单这是我的代码
<?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;
}
}
上面link的代码放哪了?
回复评论
我阅读了 zend i18n 验证程序文档。但是我不明白这段代码放在哪里。我还有更多表格需要验证
$translator = new Zend\Mvc\I18n\Translator();
$translator->addTranslationFilePattern(
'phpArray',
Resources::getBasePath(),
Resources::getPatternForValidator()
);
AbstractValidator::setDefaultTranslator($translator);
您可以在验证器的选项中添加消息。像这样:
$inputFilter->add([
'name' => 'user2',
'required' => true,
'validators' => [
[
'name' => NotEmpty::class,
'options' => [
'messages' => [
'messageKey' => 'non-translated message',
'messageKey2' => _('translated message'),
],
],
],
],
]);
要覆盖 Zend 的消息,您可能希望改用验证器中使用的常量。例如。您的问题使用 NotEmpty
验证器。如果您查看 class,您会发现:
/**
* @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的所有默认消息,除非您想要的语言不受支持,课程。 More info
zend-validator is shipped with more than 45 different validators with more than 200 failure messages. It can be a tedious task to translate all of these messages. For your convenience, pre-translated messages are provided in the zendframework/zend-i18n-resources package
该存储库支持的语言 here
添加到何处放置配置以启用翻译器 + 翻译的问题
为确保翻译人员知道在哪里可以找到翻译文件,请将以下内容添加到 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
],
],
],
要使用它,您必须安装翻译程序包。我建议您使用 Zend Mvc i18n 包。
通过将命名空间添加到模块数组,在您的 config/modules.config.php
文件中启用它:'Zend\Mvc\I18n',
通过 composer.json
添加并安装模块,方法是将其添加到您的 require
列表中。撰写本文时的当前版本包括:
"zendframework/zend-mvc-i18n": "^1.1"
为确保它在未来能正常工作,最好将这些也添加到 require
:
"ext-intl":"*",
"ext-gettext":"*",
以上将要求 intl
和 gettext
PHP 模块安装在当前 运行 PHP 实例中。
下面是模块file/folder结构的简单设置
好的,我找到了问题的解决方案,特别感谢 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';
}
}
如果您想使用默认的 ZF3 翻译来验证消息,您必须修改 "src" 文件夹下的 "Module.php" 文件。
首先使用"require"命令通过composer安装"zend-mvc-i18n"模块:
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" 更改为 "es_ES" 或 "de_DE" 以查看其他语言的验证消息。
我需要翻译验证消息。
我找到了这个link
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',
],
],
],
在视图翻译器中,使用 __('key'),工作正常。但验证消息仍为英文
我使用网站的指南来验证表单这是我的代码
<?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;
}
}
上面link的代码放哪了?
回复评论
我阅读了 zend i18n 验证程序文档。但是我不明白这段代码放在哪里。我还有更多表格需要验证
$translator = new Zend\Mvc\I18n\Translator();
$translator->addTranslationFilePattern(
'phpArray',
Resources::getBasePath(),
Resources::getPatternForValidator()
);
AbstractValidator::setDefaultTranslator($translator);
您可以在验证器的选项中添加消息。像这样:
$inputFilter->add([
'name' => 'user2',
'required' => true,
'validators' => [
[
'name' => NotEmpty::class,
'options' => [
'messages' => [
'messageKey' => 'non-translated message',
'messageKey2' => _('translated message'),
],
],
],
],
]);
要覆盖 Zend 的消息,您可能希望改用验证器中使用的常量。例如。您的问题使用 NotEmpty
验证器。如果您查看 class,您会发现:
/**
* @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的所有默认消息,除非您想要的语言不受支持,课程。 More info
zend-validator is shipped with more than 45 different validators with more than 200 failure messages. It can be a tedious task to translate all of these messages. For your convenience, pre-translated messages are provided in the zendframework/zend-i18n-resources package
该存储库支持的语言 here
添加到何处放置配置以启用翻译器 + 翻译的问题
为确保翻译人员知道在哪里可以找到翻译文件,请将以下内容添加到 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
],
],
],
要使用它,您必须安装翻译程序包。我建议您使用 Zend Mvc i18n 包。
通过将命名空间添加到模块数组,在您的 config/modules.config.php
文件中启用它:'Zend\Mvc\I18n',
通过 composer.json
添加并安装模块,方法是将其添加到您的 require
列表中。撰写本文时的当前版本包括:
"zendframework/zend-mvc-i18n": "^1.1"
为确保它在未来能正常工作,最好将这些也添加到 require
:
"ext-intl":"*",
"ext-gettext":"*",
以上将要求 intl
和 gettext
PHP 模块安装在当前 运行 PHP 实例中。
下面是模块file/folder结构的简单设置
好的,我找到了问题的解决方案,特别感谢 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';
}
}
如果您想使用默认的 ZF3 翻译来验证消息,您必须修改 "src" 文件夹下的 "Module.php" 文件。
首先使用"require"命令通过composer安装"zend-mvc-i18n"模块:
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" 更改为 "es_ES" 或 "de_DE" 以查看其他语言的验证消息。