将表单翻译为自定义设置区域设置

时间:2016-09-21 13:09:41

标签: php symfony

您好我有一个用例,我想将表单翻译成自定义语言环境,然后在请求中设置一个

我尝试做类似

的事情
$tmpLocale = $request->getLocale();
$request->setLocale('es');
$form = $this->createForm(new DataType());
$formView = $form->renderView();
$request->setLocale($tmpLocale);

return $this->render('AppBundle:Data:edit.html.twig', array(
    'data' => $data,
    'form' => $formView,
));

但它不起作用,我怎么能让它工作呢? 我需要将表单标签翻译为此自定义区域设置。

3 个答案:

答案 0 :(得分:1)

表单标签转换是在表单呈现中进行的。如果它是您应用程序中的常见用例,那么您可以考虑通过翻译标签来覆盖行为:

Create a new form type extension并将locale变量传递给模板布局:

class FormTypeExtension extends AbstractTypeExtension
{
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['locale'] = $options['locale'];
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        // define locale option for each form field.
        // if null the labels are translates to current locale.
        $resolver->setDefaults(array('locale' => null));
    }

    public function getExtendedType()
    {
        return 'form';
    }
}

服务:

services:
    app.form.extension.locale:
        class: AppBundle\Form\Extension\FormTypeExtension
        tags:
            - { name: form.type_extension, alias: form }

接下来,overrides all form blocks包含trans()功能并添加locale作为第三个参数:

{{ label|trans({}, translation_domain, locale) }}

Sample

{%- block form_label -%}
    {% if label is not same as(false) -%}
        {# ... #}
        <label ... >{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain, locale) }}</label>
    {%- endif -%}
{%- endblock form_label -%}

稍后,您可以为每个表单字段使用locale选项:

$form->add('name', null, array('locale' => 'es'));

答案 1 :(得分:0)

查看TranslatorInterface,其第四个参数是locale,您可以直接使用它来翻译邮件。 您需要将表单类型注册为服务,将translator(以及可能的自定义语言环境)注入其中,并使用此语言环境翻译所有内部消息。

答案 2 :(得分:-1)

我是通过翻译服务的简单更改区域设置来完成的。

$tmpLocale = $this->get('translator')->getLocale();
$this->get('translator')->setLocale('es');
$form = $this->createForm(new DataType());
$formView = $form->createView();
$this->get('translator')->setLocale($tmpLocale);

这很好用。无需先进的解决方案。