k0pernikus
k0pernikus

Reputation: 66430

How to translate labels in symfony2 forms with messages.en.yml?

I am trying to get translation of form fields to work. I have messages.en.yml in my Bundle's Ressource folder.

test: it works
form:
    description: Add a description.

I want to build a form in an EntityType which translates the labels of the form fields accordingly.

$builder->add(
    'description',
    null,
    array('label' => 'form.description', 'required' => false)
);

Yet only the literal string 'form.description' gets shown, not the expected translation of Add a description.

The translation service and the messages.en.yml are loaded correctly as I can call

var_dump($this->get('translator')->trans('test'));

in a controller and get the translated result.

What am I missing when I want to treat the string 'form.description' as something that should be translated?

I suppose I have to call the trans function on them anyhow, yet how can I make it in one go automatically?

Upvotes: 28

Views: 42936

Answers (4)

Michał Zwierzyński
Michał Zwierzyński

Reputation: 101

In symfony 3.1 You don't need to pass translator to form type constructor. It will be translated automatically by form field name like this:

Controller action:

$form = $this->createForm(LoginType::class);

FormType class:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('username',
            TextType::class, ['label_format' => '%name%',]
        );
}

And your translations file (yml):

username: Your translation for username field

Hope it will help someone:)

Upvotes: 6

mapmath
mapmath

Reputation: 1522

Let say you want to translate into French. Then you have filename.en.xlf and filename.fr.xlf.

now for the following form element you want to make description translatable.

$builder->add(
    'description',
    null,
    array('label' => 'form.description', 'required' => false)
);

so in the filename.en.xlf

<trans-unit id="17">
    <source>description</source>
    <target>description</target>
</trans-unit>

and for French, so in the filename.fr.xlf as below

<trans-unit id="17">
    <source>description</source>
    <target>fr descrip</target>
</trans-unit>

hope this will help for someone

Upvotes: 0

john Smith
john Smith

Reputation: 17906

i had to explicitly set the translation domain

e.g

->add('description','hidden',
 array(
   "label"=>"form.description",
   "required"=>true,
   'translation_domain' => 'fooo'
 )
);

in case of

fooo.de.xlf

Upvotes: 42

Moris Finkel
Moris Finkel

Reputation: 307

Add translation in form for is best idea - because found if in twig much more easy

{% trans_default_domain 'YourNameBundle' %}

{{'shot.tag.for.transle'|trans }}

also you must remember about translation file in your bundle, if you extend bundle from another (example - you extends FosUserBundle) you can take translate from this bundle or use func trans with params

{{'shot.tag.for.transle'|trans({}, 'TranslationNameBundle') }}

Have a nice localisation.

Upvotes: 5

Related Questions