1

我正在创建一个应用程序,产品将由我的客户创建(类似于电子商务网站),所以我显然需要存储在数据库中的翻译描述,我不能强迫我的客户学习 git/yml。

关于如何正确本地化描述(以及最终产品名称)并将它们存储在数据库中,我有两个想法,但如果有一种我应该使用的众所周知的方法,我会很高兴知道它。

第一个想法对我来说似乎最合乎逻辑,但我想让它对我“透明”,我不想到处写连接,所以如果它是正确的,一些关于如何实现这一点的建议是赞赏。

想法1: 创建一个数据库表products(其中namedescription字段可能设置为默认语言环境),然后是一个products_translations包含以这种方式构造的表的表:

products_translations
- id
- locale
- product_id
- name
- description

举个例子:product_translation: { id: 1, locale: 'en', product_id: 3, name: 'toy', description: 'play' }

但我想访问翻译而不需要到处写很多 IF。所以如果我写 product.name 它应该返回 en 或者它基于当前的语言环境。

奖励:是否有任何宝石可以帮助我实现这一目标?

想法2:另一个想法是有一个表name_locale1name_it等等,但我不喜欢这种方法,因为会污染我的模型对象与字段,我将有一个巨大的表。

但是,通过这种方式,我可以避免加入该对象的每个查询。

如果有一种我不知道的更好的方法(数据库模式或类似方法),那也没关系,我不会被迫只对这两个想法严格,但是我必须在两者之间做出选择,我真的不知道哪个会更好。

重要提示:我想将翻译保存在 yml 文件中,动态内容除外,这显然需要在数据库中进行翻译。

4

2 回答 2

3

我同意 PinnyM 的观点,即第一种方法是两种方法中更好的方法,但我强烈建议您实施Globalize3,其中大部分结构决策已经为您做出(以及 Fuchs 先生本人),而不是实现您自己的模式)。此外,使用 rails 助手,您只需product.name在模型实例上调用类似的东西,gem 就会弄清楚如何在正确的语言环境中显示它,太棒了!

于 2013-01-27T21:47:04.517 回答
2

The first approach is the recommended one. As you surmised, the second approach is not as clean and requires more work on the coding end with no real gain since you still have to join on this monster table. To the contrary, the first method requires at most one join, while the second approach requires a join on each attribute you may want to add localization support.

You can simply append a scope on all your product calls such as:

scope :for_locale, lambda{|locale| joins(:product_translations).
                                   where(product_translations: {locale: locale || 'en'}) }

and pass in the session locale (or wherever you are storing it).

于 2013-01-27T20:34:17.623 回答