28

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?

k0pernikus
  • 60,309
  • 67
  • 216
  • 347
  • 1
    OK, weird. Now it just works. I don't as of yet know what changed but I will look into it. I suspect some weird cache issue that persisted even after cache:clear – k0pernikus Jan 20 '14 at 17:46
  • Currently having the same issue. Any idea what caused it? – ferdynator Jul 04 '14 at 11:09
  • 1
    @ferdynator For me, I suspect it was a caching error. If `clear:cache` does not work, try purging the dev cache manually via `rm -rf app/cache/dev/*`. Also, check if you have a typo in the yml-name. It also could be an lower-vs-uppercase issue. – k0pernikus Jul 05 '14 at 12:29
  • @ferdynator Was the upvote from you and did it resolve the issue you were facing? If so, I add it as an answer. – k0pernikus Jul 07 '14 at 10:55
  • 1
    An easy trap to fall into is also not activating it in the config: http://symfony.com/doc/current/book/translation.html#configuration – Dragony Feb 17 '15 at 18:31

4 Answers4

42

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
john Smith
  • 17,409
  • 11
  • 76
  • 117
  • for me unfortunately this approach did not work, but the translation was loaded. I checked this with the trans function of the translation helper The issue might be the way I use the form in the twig template. {{- form_label(child) -}} – Jakob Alexander Eichler Oct 23 '17 at 17:19
6

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:)

5

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.

Moris Finkel
  • 197
  • 2
  • 5
0

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

mapmalith
  • 1,303
  • 21
  • 38
  • 4
    You dont show how to actually translate the form label. You show a label being used and the translation files being set but the add does not translate by default and especially not if your message codes are in special domain files. – RichieHH May 27 '17 at 20:57