根据本地动态翻译表单

Dynamically translate Forms depending on local

所以我正在使用 symfony 2.8 制作一个多语言网站,但我在翻译表单时遇到了这个问题,我设法使用 translation_domain 选项更改标签,如本例所示:

->add('save','submit',
            array('label'=>'btn.send',
                'translation_domain' => 'FrontBundle',
                'attr'=>array(
                    'class'=>'btn btn-blue',
        )))

但我在翻译实体类型时遇到问题,因为名称来自数据库,所以我添加了其他语言的字段 像这样:

name_fr ,name_en , name_es ,...

问题是如何将它们与表单一起使用,经过数小时的谷歌搜索,我找到了这个解决方案,尽管我不喜欢它。

使用 documentation 我将 _local 从请求传递到我的表单,如下所示:

联系人控制器:

 public function contactAction(Request $request)
{
    $contact = new contact();
    $contact->setSendTime(new \DateTime('now'));
    $form = $this->createForm(new contactType(), $contact,array('lang'=>$request->getLocale()));
    //...
}

联系人类型:

class TaskType extends AbstractType
{
    // ...

    public function configureOptions(OptionsResolver $resolver)
    {
        // ...

        $resolver->setRequired('lang');
    }
    //...
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $local = $options['lang'];
        // ...
        $builder

            ->add('civility', 'entity', array(
                'class'=>'BackBundle\Entity\civility',
                //use this
                'property' => $local == 'fr'?'name_fr':'name_en',
                //or this or dont use them both
                //'choice_label' => 'name',
                'label'=>'Civilité:',
                'expanded'=>true,
            ))
            /...
            ;

    }

}

我想知道是否有更好的解决方案来翻译表单中的实体

您可以使用 Symfony 表单事件来动态管理表单数据。看一下这个 https://symfony.com/doc/2.8/form/dynamic_form_modification.html

这似乎正是您所需要的。您可以将语言环境从您的控制器传递到您的表单(作为一个选项),并在表单 class 中添加一个监听事件的事件监听器(选择一个最适合您需要的,我最好的猜测是您需要PRE_SET_DATA 事件 - 操作数据库中数据的事件),根据传递的语言环境选项,您可以修改所需的表单字段。

所以我在管理端阅读了 Translatable from the DoctrineExtensions that @dbrumann give me and i use it side to side with Sonata Translation Bundle,它工作得很好。 如果有人对配置有任何疑问,请发表评论