我正在寻找一些关于如何处理需要将字段翻译成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的可翻译行为扩展,但我不喜欢所有翻译都存储在一个表中的事实。
因此,我正在寻找国际化方面的最佳实践。任何关于这个主题的想法都非常感谢。
答案 0 :(得分:0)
您提到的的可翻译行为扩展允许每个类的翻译实体。查看translatable doc的高级示例部分下的“翻译实体”子标题。
缺点是:使用@Gedmo\TranslationEntity
注释指定用于存储翻译的特定实体。这样,您可以将负载拆分为多个表。
答案 1 :(得分:0)
顺便说一下:我知道Gediminas的可翻译行为延伸,但是 我不喜欢所有翻译都存储在一个表格中的事实。
我相信您解决此问题的方法主要与项目的大小和类型有关。如果要实现简单CMS,还可以使用数组来保存多语言字段的内容。然而,这种方法是有限的。
/**
* @var array
*
* @ORM\Column(name="title", type="array", nullable=true)
*/
private $title;
如果您的系统内容与一种语言完全不同,或者您的系统需要基于这些多语言字段的大量查询和报告,那么您提到的方法就会很好。