【问题标题】:Symfony2 entity field type: translate list itemsSymfony2实体字段类型:翻译列表项
【发布时间】:2015-08-06 05:16:40
【问题描述】:

我有一个带有国家代码的实体字段类型的 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');
            },
        ))

非常感谢!

【问题讨论】:

  • 您在哪里存储了翻译后的实体名称?
  • 存储任何语言代码的翻译都不是必需的,因为 symfony/php 提供了 Intl-Package - 但我该如何使用它呢?
  • 等等,我听不懂你。你需要什么?当前语言中所有语言的列表?我说的对吗?
  • 是的,你是对的。我需要这个列表,但选择的语言必须是实体,因为我需要从我保存的实体到语言的关系(1:1 关系)。我想知道如何翻译字段类型/小部件的项目。
  • 所以,为了更清楚,您将每种语言都存储到一个表(实体)中?

标签: forms symfony translation


【解决方案1】:

根据docs,数据库内容的翻译应由Doctrine通过Translatable Extension或Translatable Behavior处理。

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

另一种方法是回退到选择字段类型,从 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');
        },
    ))

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是问题的解决方案,但不是我问题的答案;-)
    猜你喜欢
    • 2012-07-09
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多