根据本地动态翻译表单

时间:2018-04-18 10:36:21

标签: php symfony symfony-forms

所以我正在使用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从请求传递给我的表单,如下所示:

的ContactController:

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

contactType:

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,
            ))
            /...
            ;

    }

}

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

所以我读了Translatable from the DoctrineExtensions,@ dbrumann给了我,并且我在管理方面与Sonata Translation Bundle并排使用,它运行得很好。 如果任何人有任何关于配置的问题发表评论