Symfony2实体字段类型:翻译列表项

时间:2015-07-06 08:40:31

标签: forms symfony translation

我有一个Symfony2表单,其实体字段类型带有国家/地区代码。现在,我想翻译该字段的每个项目,以当前用户区域设置的语言显示该语言的名称。

如何翻译这些项目?

         ->add('country', 'entity', array(
            'required'          => true,
            'property'          => 'countrycodeiso3166',
            'class'             => 'xxxDatabaseBundle:Country',
            'query_builder'     => function (EntityRepository $er) {
                return $er->createQueryBuilder('c')
                    ->orderBy('c.countrycodeiso3166', 'ASC');
            },
        ))

非常感谢!

2 个答案:

答案 0 :(得分:1)

根据docs,数据库内容的翻译应由Doctrine通过可翻译扩展或可翻译行为来处理。

但您也可以在实体本身内手动存储项目的翻译,例如作为关联数组。然后,您可以使用PropertyAccessor选项的choice_label功能(以前称为属性选项)。

另一种方法是回退到选择字段类型,自symfony 2.7以来有extended choice_label features。然后,您可以修改choice_label以适合翻译文件中每个国家/地区代码的翻译表示(例如messages.de.yml)。

编辑:我刚看到实体字段类型也支持扩展的choice_label功能。所以你可以做这样简单的事情(假设你有一个适当的countrycodeiso3166的getter)

->add('country', 'entity', array(
        'required'          => true,
        'choice_label'      => function ($entity) { return \Symfony\Component\Intl\Intl::getLanguageBundle()->getLanguageName($entity->getCountrycodeiso3166()); },
        'class'             => 'xxxDatabaseBundle:Country',
        'query_builder'     => function (EntityRepository $er) {
            return $er->createQueryBuilder('c')
                ->orderBy('c.countrycodeiso3166', 'ASC');
        },
    ))

答案 1 :(得分:0)

使用专为此任务设计的Symfony language字段类型可能会有所帮助。