在自定义FormType

时间:2016-02-10 16:48:58

标签: forms symfony localization symfony-forms symfony-validator

我目前情况

<?php

namespace MyBundle\Form\Type;

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints as Assert;

class MyFormType extends AbstractType implements ContainerAwareInterface
{
    use \Symfony\Component\DependencyInjection\ContainerAwareTrait;

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $translator = $this->container->get('translator');

        $builder->add('my-field', 'text', [
            'constraints' => [
                new Assert\NotBlank([
                    'message' => $translator->trans('%field% should not be blank.', ['%field%' => $translator->trans('MyFieldName')]),
                ]),
            ],
        ]);
    }

    public function getName()
    {
        return 'my_form';
    }
}

此示例已经有效,我正在尝试对其进行重构,因此我不必将容器(或翻译器)包含在其中。

挑战在于保持

  • &#39;%field%不应为空白。&#39;和
  • &#39; MyFieldName&#39;

作为唯一两个可翻译的字符串,因为它可能已经翻译了MyFieldName(就像标签一样),留下&#39;%field%不应该是空白的。&#39 ;作为对网站中任何字段有效的通用邮件。

2 个答案:

答案 0 :(得分:0)

过去陷入困境 'attr'=&gt;阵列(              'placeholder'=&gt; '信息',         )

答案 1 :(得分:0)

如果您通过取消注释此行,已在 symfony framework 配置中激活了翻译器:

#translator: { fallbacks: [%locale%] }

{p}在config.yml中,默认情况下会使用validators域中的值来转换验证程序设置的所有违规错误消息。

你应该app/Resources/translations/validators.(_format)或者。{ src/(Acme/)*Bundle/Resources/translations/validators.(_format)定义您的自定义消息,并在完成后清除缓存。

示例:

# app/Resources/translations/validators.yml
my_form:
    errors:
       my_field:
           not_blank: My field should not be blank

// FormType
$builder->add('my-field', 'text', [
        'constraints' => [
            new Assert\NotBlank([
                'message' => 'my_form.errors.my_field.not_blank',
            ]),
        ],
    ]);

验证程序的错误消息将自动翻译。

请参阅http://symfony.com/doc/current/book/translation.html#translating-constraint-messages