如何翻译验证约束消息

3.4 版本
维护中的版本

如果你在使用表单组件的验证约束,那么在翻译错误信息时会很容易:直接创建一个翻译源给 validators 这个 即可。

第一步,假设你已经创建了一个要用在程序某处的传统PHP对象如下:

1
2
3
4
5
6
7
// src/AppBundle/Entity/Author.php
namespace AppBundle\Entity;
 
class Author
{
    public $name;
}

添加约束时可以使用任何一种受到支持的方法。然后设置翻译源的文本信息选项。例如,为了保证 $name 属性不为空,添加以下代码:

1
2
3
4
5
6
7
8
9
10
// src/AppBundle/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;
 
class Author
{
    /**
     * @Assert\NotBlank(message = "author.name.not_blank")
     */
    public $name;
}
1
2
3
4
5
# src/AppBundle/Resources/config/validation.yml
AppBundle\Entity\Author:
    properties:
        name:
            - NotBlank: { message: 'author.name.not_blank' }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- src/AppBundle/Resources/config/validation.xml -->
<?xml version="1.0" encoding="UTF-8" ?>
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping
        http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
 
    <class name="AppBundle\Entity\Author">
        <property name="name">
            <constraint name="NotBlank">
                <option name="message">author.name.not_blank</option>
            </constraint>
        </property>
    </class>
</constraint-mapping>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// src/AppBundle/Entity/Author.php
 
// ...
use Symfony\Component\Validator\Mapping\ClassMetadata;
use Symfony\Component\Validator\Constraints\NotBlank;
 
class Author
{
    public $name;
 
    public static function loadValidatorMetadata(ClassMetadata $metadata)
    {
        $metadata->addPropertyConstraint('name', new NotBlank(array(
            'message' => 'author.name.not_blank',
        )));
    }
}

接下来,在 validators 目录下,为约束信息创建一个翻译源,此 xliff 文件一般置于bundle的 Resources/translations/ 目录下。

1
2
3
4
5
6
7
8
9
10
11
12
<!-- validators.en.xlf -->
<?xml version="1.0"?>
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
    <file source-language="en" datatype="plaintext" original="file.ext">
        <body>
            <trans-unit id="author.name.not_blank">
                <source>author.name.not_blank</source>
                <target>Please enter an author name.</target>
            </trans-unit>
        </body>
    </file>
</xliff>
1
2
# validators.en.yml
author.name.not_blank: Please enter an author name.
1
2
3
4
// validators.en.php
return array(
    'author.name.not_blank' => 'Please enter an author name.',
);

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)