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

Php Symfony2+;Doctrine2:如何正确地本地化记录?,php,mysql,symfony,doctrine-orm,internationalization,Php,Mysql,Symfony,Doctrine Orm,Internationalization,我希望在Symfony2框架上使用条令管理记录本地化 要求是 翻译记录的能力 只能在一个区域设置中添加记录 任何类型的开发人员友好的可重用模式都可以实现这一点 到目前为止,我已经实现了这个库,以利用可翻译的扩展。无论我读到哪里,它都被认为是处理翻译的首选方式。我意识到这和本地化不一样,但这似乎是我最接近的一次 假设我有一个包含可翻译产品的产品表。我的默认语言是英语。在默认的英语语言环境中插入产品后,我可以稍后添加翻译,比如说意大利语。 对于可翻译扩展,我无法做到的是只添加意大利地区的产品。如

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

要求是

  • 翻译记录的能力
  • 只能在一个区域设置中添加记录
  • 任何类型的开发人员友好的可重用模式都可以实现这一点
到目前为止,我已经实现了这个库,以利用
可翻译的
扩展。无论我读到哪里,它都被认为是处理翻译的首选方式。我意识到这和本地化不一样,但这似乎是我最接近的一次

假设我有一个包含可翻译产品的产品表。我的默认语言是英语。在默认的英语语言环境中插入产品后,我可以稍后添加翻译,比如说意大利语。 对于可翻译扩展,我无法做到的是只添加意大利地区的产品。如果我这样做,可翻译扩展也会添加默认语言(英语)的产品,但内容是意大利语。然后再加上一个意大利语翻译

我的产品实体如下所示;(简体)


这个问题似乎有点误解。当您想使产品仅在某些地区(基于地区)可用时,您并不是在询问翻译是否仅基于地区可用。
doctrine扩展坚持为您的产品提供默认翻译是非常完美的,否则您的应用程序将无法正确处理请求。
毕竟,产品在所有地区或地区都可用,那么如何提供翻译内容的信息,比如名称?
如果翻译后的名称没有默认设置,这意味着默认区域内显示的产品无法解析其名称。实体不完整,因为名称为空
要仅将产品添加到特定区域设置区域,您必须向产品添加属性,如下所示:

/**
 * @ORM\Column(type="string")
 */
private $localeZone;
这就给了你过滤实体的可能性。
您还可以将您的实体产品设置为Mappedenty,并为本地实体使用多个Sub,这将使您可以更改将意大利产品存储在意大利语产品中的方式,例如,尽管我个人不喜欢这种想法,因为这是基于其中财产价值区分对象,而不是行为或数据结构上的差异。

查看

感谢您的回复。我的全部观点是使记录在所有地区都不可用。只要Dority不介意,我的应用程序就不会担心如何处理它。但我并没有设定一个具体的解决方案,只要这是可行的。从长远来看,我认为你的想法行不通,任何时候添加区域设置时,我都必须添加大量的实体。第一种方法是基于现有实体中的附加属性。基于存储库的实现,可以很容易地进行过滤,例如实现“findAllProductsByLocale()”之类的方法。属性不必在表单中公开,而是可以由处理表单的控制器插入。由于Symfony 2支持基于区域设置的URL,因此区域设置字符串是框架易于检索的参数。因此,这种方法非常简单。另一种方法是对条令扩展进行测试,以改变其默认行为,即在默认和特定区域设置中进行双重插入,从而使扩展不再可更新。这就像破解Symonfy-Core。如果你看一下,你会发现翻译是通过MappedSuperClass处理的。翻译存储在后台,您的实体被包装到一个文件中。因此,虽然有一些方法可以在不修改扩展本身的情况下提供自己的实现,但无法指定:只有特定区域设置的实体才可用。你必须在应用层实现它;
可翻译的
对我来说不起作用。除非你认为我用错了,但请详细说明你认为我应该做些什么。
/**
 * @ORM\Column(type="string")
 */
private $localeZone;