我有一个表单,其中包含一个元素的一些元素,我想在属性中使用翻译器(数据占位符,它是 JQuery 扩展的名称)。
$builder->add('items', 'entity', array(
'label' => 'MyBundle.items',
'required' => true,
'em' => $this->em,
'multiple' => true,
'expanded' => false,
'attr' => array(
'placeholder' => 'MyBundle.items.placeholder',
'data-placeholder' => 'MyBundle.items.placeholder.data',
),
));
是否可以将翻译器用于这样的属性?,占位符或标签都是可能的
这个问题有一个树枝解决方案,但我想知道实体类型中的一个解决方案。
如果有人需要 Twig 解决方案:
{{ form_widget(form.items, {'attr': {'data-placeholder': 'MyBundle.items.placeholder.data'|trans } }) }}
好吧,
如果您不是在谈论通过注释进行翻译,那么这就是您真正想做的,不是吗?
class SomeFormType extends AbstractType {
protected $container;
public function __construct($container){
$this->container = $container;
}
public function buildForm(FormBuilderInterface $builder, array $options){
$trans = $this->container->get('translator');
$builder->add('items', 'entity', array(
'label' => 'MyBundle.items',
required' => true,
'em' => $this->em,
'multiple' => 'true',
'expanded' => false,
'attr' => array(
'placeholder' => $trans->translate('MyBundle.items.placeholder'),
'data-placeholder' => $trans->translate('MyBundle.items.placeholder.data'),
),
));
}
}
服务
//resources/config/services.yml
services:
form.serivce:
class: SomeBundle'Form'SomeFormType;
arguments: ["@service_container"]
我今天遇到了同样的情况,并且使用了与Shushant的方法略有不同的方法。我直接将翻译器注入到FormType中(正如Zelazowy之前在评论中建议的那样)。所以我最终得到了这个:
<?php
namespace AppBundle'Form'Type;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
use Symfony'Component'Translation'TranslatorInterface;
class TranslatableType extends AbstractType
{
/**
* @var TranslatorInterface
*/
private $translator;
/**
* @param TranslatorInterface $translator
*/
public function __construct(TranslatorInterface $translator)
{
$this->translator = $translator;
}
}
通过相应的服务:
app.form.translatable:
class: AppBundle'Form'Type'TranslatableType
arguments:
- @translator
若要创建可翻译的标签,可以直接在 FormType 中调用$this->translator->trans()
,如下所示:
$builder->add('field', 'choice', array(
'choices' => array(
1 => $this->translator->trans(
'forms.choices.field.1', null, 'forms'
),
2 => $this->translator->trans(
'forms.choices.field.2', null, 'forms'
),
)
));
确保在创建窗体时在控制器中调用服务,如下所示:
$form = $this->createForm($this->get('app.form.translatable'));
这样,一切都应该翻译得很好。