Keutelvocht
Keutelvocht

Reputation: 688

Symfony2.8 get locale in form types

How can I get the locale in a typeform?

This is in my controller:

$form = $this->createForm(new ConfiguratorClientType(), $configuratorClient);

I have this in my form builder:

->add('language',
    EntityType::class,
    array(
        'class' => 'CommonBundle:Language',
        'choice_label' => function ($language) {
            return $language->getName()[$locale];
        },
        'attr' => array(
            'class' => 'form-control'
        )
    )
)

but I cant figure out how to get the locale in there.

Upvotes: 3

Views: 3364

Answers (2)

yceruto
yceruto

Reputation: 9575

If you have installed the intl module, you can use \Locale::getDefault() safely to get the current locale value. Even though the method infers default only, it can be changed through \Locale::setDefault($locale) just what Symfony does in Request::setLocale method.

Therefore, this should work for you:

return $language->getName()[\Locale::getDefault()];

Update:

However, it's not advisable to use this stateful class in your final app. Instead, you should adhere to the Dependency Inversion Principle, injecting the request stack service into your constructor, and retrieving the current locale from there (refer to the other answer for more details), which will be easier to test.

Upvotes: 7

kunicmarko20
kunicmarko20

Reputation: 2180

You can register your form as a service and inject request stack:

services:
    form:
        class: YourBundle\Form\Type\YourType
        arguments: ["@request_stack"]
        tags:
            - { name: form.type }

and then get locale from your request.

More on request stack http://symfony.com/doc/current/service_container/request.html

or you can pass locale to your formType from your controller:

$locale = $request->getLocale();
$form = $this->createForm(new ConfiguratorClientType($locale), $configuratorClient);

and accept it in construct of your form.

Edit:

Contructor in the formtype:

private $locale = 'en';

   public function __construct($locale = 'en')
   {
       $this->locale = $locale;
   }

and then use the locale variable like this in the builder function:

$this->locale

Upvotes: 4

Related Questions