根据本地动态翻译表单
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,它工作得很好。
如果有人对配置有任何疑问,请发表评论
所以我正在使用 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,它工作得很好。 如果有人对配置有任何疑问,请发表评论