Symfony:如何在实体__toString中使用翻译组件?

时间:2017-08-28 19:35:43

标签: symfony localization internationalization symfony2-easyadmin

是的,我知道之前已经被问过并且气馁,但我有一个很好的用例。我有兴趣学习面向视图的补充方法。

用例:

我有一个实体,说Venue (id, name, capacity)我在EasyAdmin中用作集合。为了呈现选择,我要求该实体具有字符串表示。

我希望显示屏显示%name% (%capacity% places)

正如您所猜测的那样,我需要翻译“地方”这个词。

我可以这样做

  1. 直接在实体的__toString()方法
  2. 中 通过正确呈现__toString()输出在表单视图中
  3. 我不知道如何实现,但我同意第一种方法违反了MVC模式。

    请告知。

2 个答案:

答案 0 :(得分:1)

将其显示为%name% (%capacity% places)只是一个"可能"在表单视图中的表示,所以我会将这个非常具体的表示转换为您的表单类型。

Venue 实体的__toString()方法中包含哪些内容:

class Venue 
{
    private $name;

    ... setter & getter method

    public function __toString()
    {
        return $this->getName();
    }
}

<强> messages.en.yml

my_translation: %name% (%capacity% places)

使用choice_label(也值得了解:choice_translation_domain表单类型

use Symfony\Component\Translation\TranslatorInterface;

class YourFormType extends AbstractType
{
    private $translator;

    public function __construct(TranslatorInterface $translator)
    {
        $this->translator = $translator;
    }

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'venue',
                EntityType::class,
                array(
                    'choice_label' => function (Venue $venue, $key, $index) {
                        // Translatable choice labels
                        return $this->translator->trans('my_translation', array(
                            '%name%' => $venue->getName(),
                            '%capacity%' => $venue->getCapacity(),
                        ));
                    }
                )
            );
    }

}

&安培;还会在 services.yml

中将您的表单类型注册为服务
your_form_type:
  class: Your\Bundle\Namespace\Form\YourFormType
  arguments: ["@translator"]
  tags:
    - { name: form.type }

答案 1 :(得分:0)

我为该问题实施了一个或多或少复杂的解决方案,请参见以下相关问题的答案:https://stackoverflow.com/a/54038948/2564552