Как перевести формы Symfony 3?

Перевод контента в шаблонах twig кажется простым и понятным: я запускаю bin/console translation:update для заполнения файлов перевода. Проблема в том, что он, кажется, игнорирует формы.

После создания сущностей, репозиториев и форм/типов я использую {{ form_row(form.field) }} в шаблонах twig для рисования элементов формы.

Существует ли устоявшаяся практика настройки и перевода меток форм, заполнителей и сообщений об ошибках?

Должен ли я использовать form_label и form_widget вместо form_row для настройки ярлыков?


person user3429660    schedule 21.06.2017    source источник
comment
Вы не используете FormTypes? Попробуйте внедрить Translator в ваш FormType и перевести метки полей.   -  person Chris    schedule 21.06.2017


Ответы (2)


Вы можете создать, например, файл с именем forms.es.yml здесь, вы можете разместить переводы на испанском языке, а в своих формах вы можете связать их следующим образом:

//LoginType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('email',
            EmailType::class,
            [
                'translation_domain' => 'forms', //It's translate the label
                'constraints' => [
                    new Email([
                        'message' => 'email'
                    ])
                ]
            ]
        )
        ->add('password',
            RepeatedType::class,
            [
                'type' => PasswordType::class,
                'invalid_message' => 'cliente.password_not_equal',
                'first_options' => ['label' => 'cliente.password'],
                'second_options' => ['label' => 'cliente.repeat_password'],
                'translation_domain' => 'forms', //Here is again
                'constraints' => [
                    new NotBlank([
                        'message' => 'not_blank'
                    ])
                ]
            ]
        )
        ->add('current_uri', HiddenType::class);
}

Работает начиная с symfony 2.

Другой способ — в вашей ветке, только распечатать виджет и перевести метку:

//index.html.twig
<label> 
   {{'form.email'|trans({})}}
   {{ form_widget('form.email') }} //It only prints the input tag
</label>

Это простой способ, но менее пригодный для повторного использования.

person Koronos    schedule 22.06.2017
comment
Я думаю, что первый подход работает хорошо. Единственная проблема, с которой я сталкиваюсь: если я запускаю bin/console translation:update en, он, кажется, игнорирует все мои формы. Нужно ли мне вручную поддерживать файлы перевода? - person user3429660; 22.06.2017
comment
Извините, но я так думаю. Если есть способ сделать это автоматически, я его не знаю :c. На самом деле я поддерживаю его вручную. - person Koronos; 23.06.2017
comment
Существуют ли какие-либо новые способы создания всех записей xliff для translation_domain, используемых в FormType? Кажется, что команда translation:update игнорирует формы еще в 2020 году? Спасибо за вашу помощь! - person Raphaël Roux; 26.12.2020

Чтобы перевести ошибки формы, как описано в документации https://symfony.com/doc/current/validation/translations.html

Вам нужен файл validators.lang_used.format с ключом/значением пар. Затем передайте ключ через проверку Assert по ключу сообщения.

На объекте

// src/Entity/Author.php
use Symfony\Component\Validator\Constraints as Assert;

class Author
{
    /**
     * @Assert\NotBlank(message="author.name.not_blank")
     */
    public $name;
}

При создании формы

$form = $this->createFormBuilder()
    ->setMethod('GET')
    ->add('email', TextType::class, [
        'constraints' => [
            new NotBlank(['message' => 'error.not_blank']),
        ],
        'label' => 'label.email-domain'
    ])
    ->getForm();

Чтобы перевести Label, просто передайте ключи в 'label', ключи должны иметь префикс label в файле live on messages.*.

Переводить обычный текст при просмотре (ключ/значение определяются в файлах messages.*)

{{ 'save_button'|trans }}

Примеры перевода см. на странице https://github.com/symfony/demo. файл и тип формы

person Alex_Aleluia    schedule 07.03.2018