Translating content in twig templates seems easy and straightforward: I run bin/console translation:update
to populate translation files. The issue is that it seems to ignore forms.
After creating entities, repositories and forms/types, I use {{ form_row(form.field) }}
in twig templates to draw the form elements.
Is there a well-established practice on how to customize and translate form labels, placeholders and errors messages?
Must I use form_label
and form_widget
instead of form_row
to customize labels?
You could create for example a file named forms.es.yml
here, you can put you traductions in spanish, and in your forms you can chain it like this:
//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);
}
It works since symfony 2.
Another way is in your twig, only print the widget and translate the label:
//index.html.twig
<label>
{{'form.email'|trans({})}}
{{ form_widget('form.email') }} //It only prints the input tag
</label>
Is an easy way, but is less reusable.