学说2 - i18n的最佳实践?

时间:2011-09-12 20:13:55

标签: php orm internationalization doctrine doctrine-orm

我正在寻找一些关于如何处理需要将字段翻译成n种语言的表的建议。我已经读过最好的方法,它有一个基表,它包含所有非语言特定的字段,一个表包含所有带翻译的字段。

示例:


 PRODUCT             PRODUCT_TRANSLATIONS
+--------------+    +----------------------+
| id           |    | id                   |
+--------------+    +----------------------+
| category_id  |    | product_id           |
+--------------+    +----------------------+
| price        |    | language_id          |
+--------------+    +----------------------+
                    | name                 |
                    +----------------------+
                    | description          |
                    +----------------------+

因此,我们将拥有包含所有元数据的基表PRODUCT和包含所有需要翻译成多种语言的数据的PRODUCT_TRANSLATIONS表。 PRODUCT表与PRODUCT_TRANSLATIONS表具有OneToMany关系。

处理这种情况的学说方法是什么?如果我查询Products表,我会将所有翻译加入此表。但大多数时候我只想为给定的产品ID进行一次翻译。我可以使用存储库类来编写我自己的getter方法,将结果集限制为只有一种语言,但是我会有很多表都需要翻译。我敢打赌,这个问题有一个更通用的解决方案。另一个问题是,如果我查询与另一个对象相关的一个对象,我将获得该第二个对象的所有翻译。

顺便说一句:我知道Gediminas的可翻译行为扩展,但我不喜欢所有翻译都存储在一个表中的事实。

因此,我正在寻找国际化方面的最佳实践。任何关于这个主题的想法都非常感谢。

2 个答案:

答案 0 :(得分:0)

您提到的的可翻译行为扩展允许每个类的翻译实体。查看translatable doc的高级示例部分下的“翻译实体”子标题。

缺点是:使用@Gedmo\TranslationEntity注释指定用于存储翻译的特定实体。这样,您可以将负载拆分为多个表。

答案 1 :(得分:0)

  顺便说一下:我知道Gediminas的可翻译行为延伸,但是   我不喜欢所有翻译都存储在一个表格中的事实。

我相信您解决此问题的方法主要与项目的大小和类型有关。如果要实现简单CMS,还可以使用数组来保存多语言字段的内容。然而,这种方法是有限的。

/**
 * @var array
 *
 * @ORM\Column(name="title", type="array", nullable=true)
 */
private $title;

如果您的系统内容与一种语言完全不同,或者您的系统需要基于这些多语言字段的大量查询和报告,那么您提到的方法就会很好。