Symfony2 + Doctrine2:如何正确本地化记录?

时间:2014-01-11 21:38:00

标签: php mysql symfony doctrine-orm internationalization

我希望在Symfony2框架上使用Doctrine管理记录本地化。

要求是

  • 翻译记录的能力
  • 仅在一个区域设置中添加记录的能力
  • 开发人员友好的可重用模式,以实现此目的

到目前为止,我已实施DoctrineExtensions库以使用Translatable扩展名。我读到的任何地方都被视为处理翻译的首选方式。我意识到这与本地化不一样,但似乎这是我最接近的。

假设我有一个带有可翻译产品的产品表。我的默认语言是英语。在我在默认的英语语言环境中插入产品后,我可以稍后添加翻译,让我们说意大利语。 我对Translatable扩展无法做到的只是在意大利语语言环境中添加产品。如果我这样做,可翻译扩展程序还会使用默认语言(英语)添加产品,但使用意大利语内容。然后它继续添加意大利语翻译。

我的产品实体看起来像这样; (简化的)

<?php
namespace Acme\DemoBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="acmedemobundle_product")
 */
class Product
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column()
     * @Gedmo\Translatable
     */
    protected $name;
    ...
}

有没有办法用非默认语言添加记录?或者我找错了地方?

-

在使用Symfony&amp; Doctrine之前,我习惯于在两个表中管理本地化数据,然后使用请求的语言环境将它们连接在一起。

例如,products表包含所有语言环境独立数据,如

  • ID
  • CATEGORY_ID

并且products_i18n表包含所有本地化数据,如

  • PRODUCT_ID
  • 区域设置
  • 姓名
  • 描述
  • 蛞蝓

这样,只有一条可用于关系的主记录,以及一个或多个本地化扩展。没有本地化扩展的记录将被视为不存在。

也许有办法实现这一目标?

-

说实话,到目前为止,我还没有找到关于这个特定主题的有用信息。我无法想象我是第一个遇到这个问题的人。

非常感谢任何有关此事的帮助!

============== 的更新

我决定采用自定义解决方案,将两张桌子绑在一起,就像我上面的示例所示。这个的主要原因(除了我需要的功能)是Translatable将所有翻译的数据保存在一个表中。从绩效和危机情景的角度来看,这感觉不对。更有条理的是将每个表的本地化数据放在它自己的表中而不是聚合。

现在,我接受了彼得的答案,因为它是最有帮助的。如果有更好的答案,我会考虑转换。干杯!

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

这个问题似乎是一个误解的根源。如果您希望仅在某些地区(基于区域设置)提供产品,则不会询问翻译是否仅基于区域设置可用。
理论扩展坚持为您的产品提供默认翻译,这是非常完美的,否则您的应用程序将无法正确处理请求。
毕竟,该产品适用于所有地区或区域,因此如何提供翻译内容的信息,例如名称?
如果翻译的名称没有默认设置,则表示默认区域中显示的产品无法解析其名称。实体不完整,因为名称为null。
要仅将产品添加到某个区域设置区域,您必须向产品添加属性,如

/**
 * @ORM\Column(type="string")
 */
private $localeZone;

然后给你一个过滤实体的可靠性。 您还可以将您的实体产品设置为MappedEntity并使用多个Subs for Local实体,这样您就可以在ItalianProducts中更改存储意大利产品,例如虽然我个人不喜欢这种想法,因为它是基于其中属性值的对象的区别,而不是行为或数据结构的差异。