29

I'm using a class form in Symfony2 Beta3 as follows:

namespace Partners\FrontendBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ConfigForm extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('no_containers', 'choice', array('choices' => array(1 => 'yes', 0 => 'no')));
        ...

I want to translate the 'yes' and 'no' options, but I don't know how to use the translator here.

Adexe Rivera
  • 414
  • 7
  • 12
Sergi
  • 1,224
  • 3
  • 15
  • 34

5 Answers5

88

You can use the translation resources as usual. This worked for me:

    $builder->add('sex', 'choice', array( 
        'choices'   => array(
            1 => 'profile.show.sex.male', 
            2 => 'profile.show.sex.female',
        ),
        'required' => false,
        'label'     => 'profile.show.sex.label',
        'translation_domain' => 'AcmeUserBundle'
    ));

And then add your translations to the Resources->translations directory of your Bundle.

Update from @CptSadface:

In symfony 2.7, using the choice_label argument, you can specify the translation domain like this:

'choice_label' => 'typeName',
'choice_translation_domain' => 'messages',

Without specifying the domain, options are not translated.

bingen
  • 1,191
  • 11
  • 9
  • 1
    This is the real answer. +1 – Carrie Kendall Jun 16 '13 at 03:07
  • I have saved a translation message with pluralization. Is it possible to define in a form type code (like the one of @bingen) which count to use? E.g. "[...] array(1 => 'profile.show.sex.male{count=3}', 2 => 'profile.show.sex.male') [...]". Because I have the problem, that just providing the message name shows the whole message instead of just a default one ( "{0}Links|{1} Link|]1,+Inf[ Links") – Stefan Dec 12 '13 at 10:27
  • I forgot: without needing to inject a container or the translator service explicitly. – Stefan Dec 12 '13 at 10:28
  • 7
    This is a bit meta, but shouldn't one of the choice items be "female"? I know we're on a computer science related website, but still… – zopieux Dec 30 '13 at 20:18
  • hy @bingen Where I put the translations of your example? – jcarlosweb Feb 22 '14 at 00:06
  • 1
    @webyseo As I said in my original answer, in Resources->translations folder (sorry for the late response, I have been a little bit disconnected) – bingen Mar 10 '15 at 13:29
  • @Zopieux female gender typo fixed. Thanks for noticing. ;-) – bingen Mar 10 '15 at 13:31
  • 'choice_label' and 'choice_translation_domain' continue to work in Symfony 3. You can also use the EntityType::class to read options from an entity (database) instead of manually adding them. The 'choice_label' would be the field in the database you want to display in the select options. For instance I use a Category entity which reads the category table and instead of reading the "name" field I created a "translation" field that holds the translation labels and I display them instead. – pogeybait Aug 11 '16 at 04:44
4

I searched a while to find an answer, but finally I found out how Symfony translates form content. The easiest way in your case seems to be to just add a translation for "yes" and "no" by adding a YAML or XLIFF translation file to your application (e.g. app/Resources/translations/messages.de.yml) or your bundle. This is described here: http://symfony.com/doc/current/book/translation.html

The problem - in my opinion - is that you don't seem to be able to use custom translation keys. The guys from FOSUserBundle solve this (or a similar) problem with "Form Themes" (http://symfony.com/doc/2.0/cookbook/form/form_customization.html). Here are two significant lines of code to achieve the usage of the form element id as translation key:

https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/views/Registration/register_content.html.twig#L1 / https://github.com/FriendsOfSymfony/FOSUserBundle/blob/50ab4d8fdfd324c1e722cb982e685abdc111be0b/Resources/views/form.html.twig#L4

By adding a Form Theme you're able to modify pretty much everything of the forms in the templates - this seems to be the right way of doing this.

(Sorry, I had to split two of the links b/c I don't have enough reputation to post more than two links. Sad.)

rkallensee
  • 1,994
  • 15
  • 12
3

In symfony 2.7, using the choice_label argument, you can specify the translation domain like this:

'choice_label' => 'typeName',
'choice_translation_domain' => 'messages',

Without specifying the domain, options are not translated.

CptSadface
  • 61
  • 3
0

CptSadface's answer was what helped me with translating my entity choices.

$builder
    ->add(
        'authorizationRoles',
        null,
        [
            'label' => 'app.user.fields.authorization_roles',
            'multiple' => true,
            'choice_label' => 'name', // entity field storing your translation key
            'choice_translation_domain' => 'messages',
        ]
    );
Krzysztof Karski
  • 749
  • 1
  • 12
  • 19
0

Symfony 5.2 adds translatable messages which simplifies this.

namespace Partners\FrontendBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class ConfigForm extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('no_containers', 'choice', [
            'choices' => ['yes' => 1, 'no' => 0],
            'choice_label' => function ($choice, $key) {
                return new TranslatableMessage($key);
            },
        ]);
        ...
Sean
  • 2,632
  • 2
  • 27
  • 35