我在从我的数据库中获取数据时遇到问题,我创建的数据完全是多语言的,我希望这里有人能帮助我。如何在多语言数据库模型中使用Yii?
我把所有的表格分成两部分, “通用”表(不包含任何需要翻译的文本)以及包含需要翻译的所有字段的表。
示例表:
base_material
id
picture
base_material_i18n
base_material_id
localization_id
name
description
review_status
review_notes
localization
id
language_name
查询来获取翻译(使用英语(en)作为后备语言,如果没有可用的翻译):
SELECT o.id
, o.type
, o.code
, o.position
, ifnull(t.name,d.name) name
, ifnull(t.description,d.description) description
FROM base_material o
INNER JOIN base_material_i18n d
ON (o.id=d.base_material_id)
LEFT OUTER JOIN base_material_i18n t
ON (d.base_material_id=t.base_material_id AND t.localization_id='nl')
WHERE d.localization_id='en'
我的问题是如何当我搜索base_material对象时,我可以自动将这些翻译(在此查询中使用后退语言)附加到Yii中的模型中? (这只是一个示例表,但几乎所有我的表(20+)都是以这种方式构建的,所以如果可能的话,我会需要灵活的东西)
使用我需要的现有系统的示例是Propel :http://propel.posterous.com/propel-gets-i18n-behavior-and-why-it-matters
任何想法如何去做呢?我已经检查了关于多语言站点的现有Yii扩展(如Multilingual Active Record),但它们都使用不同的数据库设计(主表中的一般信息+回退语言,国际化表中的翻译),我不确定如何更改这些扩展以使用我的数据库模型。
如果有人知道改变现有扩展的方法,以便它可以使用我的数据库方案,那么这将是绝对的辉煌,也许是最好的方式来做到这一点。
编辑:我添加了一个赏金,因为我仍然无法找到关于如何让Propel与Yii协同工作的任何内容(它确实存在对Doctrine的扩展,但Doctrine不支持这种带有翻译的DB模型也没有关于如何使用现有的Yii扩展或范围来处理这个问题的更多信息。
编辑:98次浏览,但只有3上传和1评论。我不禁感到自己在这里做错了什么,无论是在我的问题还是应用程序/数据库设计中;无论是我的问题还是我的问题都非常独特(这会让我感到惊讶,因为我不认为我的多语言数据库设计是荒谬的;-)。因此,如果有人知道Yii和/或Propel的多语言站点更好的全面解决方案(除了由于文本字段的重复,我真的不喜欢的当前扩展)或类似的东西,请告诉我以及。
在此先感谢!
如果有任何更多的问题关于为什么或什么,或者如果有什么不完全清楚,只要问:-) – Xuntar
对不起,你有这样一个很难找到答案。如果可以,我会尽力帮忙。所以基本上你只想要一个查询选择翻译和英语的任何值,其中该项目的翻译语言不存在的权利?我想确定我首先理解你的问题;) – Chiramisu
Hi Chiramusi,感谢您的帮助。我在我的问题中发布的查询在我的数据库中运行时发挥作用,但我想知道如何更“自动地”执行此操作。我已经链接到的扩展以自动方式将模型翻译添加到模型中,我想为我的数据库(扩展使用不同的数据库模式)提供类似的东西,或者想知道如何更改该扩展以使用我的表格和设计。否则,如果你知道用Yii来使用Propel的方法,那么它也会很棒(因为Propel有这种内置的数据库转换)。 – Xuntar