How to Translate Validation Constraint Messages

If you’re using validation constraints with the Form component, you can translate the error messages by creating a translation resource for the validators domain.

To start, suppose you’ve created a plain-old-PHP object that you need to use somewhere in your application:

// src/Entity/Author.php
namespace App\Entity;

class Author
{
    public $name;
}

Add constraints through any of the supported methods. Set the message option to the translation source text. For example, to guarantee that the $name property is not empty, add the following:

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // src/Entity/Author.php
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Author
    {
        /**
         * @Assert\NotBlank(message="author.name.not_blank")
         */
        public $name;
    }
    
  • YAML
    1
    2
    3
    4
    5
    # config/validator/validation.yaml
    App\Entity\Author:
        properties:
            name:
                - NotBlank: { message: 'author.name.not_blank' }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- config/validator/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
            https://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
    
        <class name="App\Entity\Author">
            <property name="name">
                <constraint name="NotBlank">
                    <option name="message">author.name.not_blank</option>
                </constraint>
            </property>
        </class>
    </constraint-mapping>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    // src/Entity/Author.php
    
    // ...
    use Symfony\Component\Validator\Constraints\NotBlank;
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    
    class Author
    {
        public $name;
    
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('name', new NotBlank([
                'message' => 'author.name.not_blank',
            ]));
        }
    }
    

Now, create a validators catalog file in the translations/ directory:

  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- translations/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>
    
  • YAML
    1
    2
    # translations/validators.en.yaml
    author.name.not_blank: Please enter an author name.
    
  • PHP
    1
    2
    3
    4
    // translations/validators.en.php
    return [
        'author.name.not_blank' => 'Please enter an author name.',
    ];
    

You may need to clear your cache (even in the dev environment) after creating this file for the first time.