2012-05-03 44 views
2

想了很多如何支持i18n我想出了一个公认的解决方案之一有一个单独的表。
问题与可翻译
我安装翻译从学说扩展作为建议,但没有工作,因为我想和有经验的用户劝我反对使用它。即使有单独的表格,它在主表格和翻译表格中都有可翻译的列,并以eav方式存储值。此外,如果默认语言环境更改(发生在我身上,可能会再次发生),它会使事情变得复杂,因为主表中的默认值似乎没有指定的语言环境。我还有几个可以翻译的字段(5〜)。那样会导致5或者在退后的情况下还有更多的加入。数据库与教条的翻译

其他解决方案
另一种解决方案我认为是仅具有为每个表与翻译一个单独的表,并通过负荷后事件listener.This方式我可以调用obj.getTitle设置默认语言环境和回退也许()没有obj.translations ['en']。getTitle(),不需要提供语言环境。

问题
这种方法的问题是fallback.One变通办法过程中加入添加“,在区域(‘恩’,‘德’)为example.This将返回其它更多的数据,但fallback会起作用,另一种方式是使用coalesce,但是它不可能在实体上映射它,有什么办法可以很好地实现回退:

回答

5

你可以看看https://github.com/KnpLabs/DoctrineBehaviors#translatable,这是我们最好的解决方案经过深入挖掘后发现它

我们目前正在使用它的许多实体,它工作得很好。 您可以使用DQL查询翻译为任何其他实体,连接,例如。

是的,你可以轻易想象一个使用现有api的备用机制。

+0

您能否更清楚地了解knplabs API的回退机制?我在文档上找不到任何东西。 –

+0

回退到默认语言环境已经在php级别提供:https://github.com/KnpLabs/DoctrineBehaviors/blob/master/src/Knp/DoctrineBehaviors/Model/Translatable/TranslatableMethods.php#L91 – Florian

+0

如果您想实现此在sql级别,使用coallesce或IF(例如),您可以使用原生查询。 – Florian