Mau*_*ice 7 php mysql internationalization symfony doctrine-orm
我希望在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;
...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法只用非默认语言添加记录?或者我在错误的地方寻找?
-
在使用Symfony和Doctrine之前,我习惯于在两个表中管理本地化数据,然后使用请求的语言环境将它们连接在一起.
例如,该products表包含所有与语言环境无关的数据
并且该products_i18n表包含所有本地化数据
这样,只有一个可用于关系的主记录,以及一个或多个本地化扩展.没有本地化扩展的记录将被视为不存在.
也许有办法实现这一目标呢?
-
说实话,到目前为止,我还没有找到关于这个特定主题的有用信息.我无法想象我是第一个遇到这个问题的人.
非常感谢任何有关此事的帮助!
============== 更新
我决定使用一个自定义解决方案,将两个表绑在一起,就像我上面的示例所示.这个的主要原因(除了我需要的功能)是Translatable将所有翻译的数据保存在单个表中.从绩效和危机情景的角度来看,这感觉不对.更有条理的是将每个表的本地化数据放在它自己的表中而不是聚合.
现在,我接受了彼得的答案,因为它是最有帮助的.如果有更好的答案,我会考虑转换.干杯!
这个问题似乎有点引起误解。当您想让产品仅在某些区域(基于区域设置)可用时,您并不是在询问翻译是否仅根据区域设置可用。
学说扩展坚持为您的产品提供默认翻译是非常完美的,否则您的应用程序将无法正确处理请求。
毕竟,该产品在所有地区或区域都可用,那么如何提供翻译内容的信息,例如名称?
如果翻译名称没有默认设置,则意味着默认区域中显示的产品无法解析其名称。该实体不完整,因为名称将为空。
要将产品仅添加到某个区域设置区域,您必须向您的产品添加一个属性,如下所示
/**
* @ORM\Column(type="string")
*/
private $localeZone;
Run Code Online (Sandbox Code Playgroud)
然后您就可以过滤实体。您还可以将您的实体产品设置为 MappedEntity 并使用本地实体的多个子实体,这将使您在 ItalianProducts 中存储意大利的产品发生变化,例如,尽管我个人不喜欢这种想法,因为它是基于对象的区分取决于其中属性的值,而不是行为或数据结构的差异。
| 归档时间: |
|
| 查看次数: |
1399 次 |
| 最近记录: |