我希望在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
表包含所有语言环境独立数据,如
并且products_i18n
表包含所有本地化数据,如
这样,只有一条可用于关系的主记录,以及一个或多个本地化扩展。没有本地化扩展的记录将被视为不存在。
也许有办法实现这一目标?
-
说实话,到目前为止,我还没有找到关于这个特定主题的有用信息。我无法想象我是第一个遇到这个问题的人。
非常感谢任何有关此事的帮助!
============== 的更新
我决定采用自定义解决方案,将两张桌子绑在一起,就像我上面的示例所示。这个的主要原因(除了我需要的功能)是Translatable
将所有翻译的数据保存在一个表中。从绩效和危机情景的角度来看,这感觉不对。更有条理的是将每个表的本地化数据放在它自己的表中而不是聚合。
现在,我接受了彼得的答案,因为它是最有帮助的。如果有更好的答案,我会考虑转换。干杯!
答案 0 :(得分:1)
答案 1 :(得分:0)
这个问题似乎是一个误解的根源。如果您希望仅在某些地区(基于区域设置)提供产品,则不会询问翻译是否仅基于区域设置可用。
理论扩展坚持为您的产品提供默认翻译,这是非常完美的,否则您的应用程序将无法正确处理请求。
毕竟,该产品适用于所有地区或区域,因此如何提供翻译内容的信息,例如名称?
如果翻译的名称没有默认设置,则表示默认区域中显示的产品无法解析其名称。实体不完整,因为名称为null。
要仅将产品添加到某个区域设置区域,您必须向产品添加属性,如
/**
* @ORM\Column(type="string")
*/
private $localeZone;
然后给你一个过滤实体的可靠性。 您还可以将您的实体产品设置为MappedEntity并使用多个Subs for Local实体,这样您就可以在ItalianProducts中更改存储意大利产品,例如虽然我个人不喜欢这种想法,因为它是基于其中属性值的对象的区别,而不是行为或数据结构的差异。