【发布时间】:2009-10-02 06:44:46
【问题描述】:
如何将类别表(带有名称列)国际化为不同的语言。产品表(由名称和描述列组成)怎么样。使用 Ruby on Rails 将这些数据库表的内容国际化的最佳方法是什么?
【问题讨论】:
标签: ruby-on-rails internationalization
如何将类别表(带有名称列)国际化为不同的语言。产品表(由名称和描述列组成)怎么样。使用 Ruby on Rails 将这些数据库表的内容国际化的最佳方法是什么?
【问题讨论】:
标签: ruby-on-rails internationalization
您是否看过: http://guides.rubyonrails.org/i18n.html
它详细描述了如何国际化您的应用程序和
"提供了一个易于使用和可扩展的 翻译你的框架 应用到单个自定义 英语以外的语言或 提供多语言支持 你的应用程序。”
一些有用的链接:
更新:2018 年
自从近九年前回答这个问题以来,i18n 的同一作者创建了 Globalize,它基于 Ruby on Rails 中的 I18n API 将模型转换添加到 ActiveRecord 模型。
【讨论】:
在 RailsCasts 上有一篇不错的文章,关于使用名为 Globalize3 的 gem。这只是让您设置要翻译的模型并管理每个模型的翻译表,就像 i18n 对静态页面一样......
看看
http://railscasts.com/episodes/338-globalize3?view=asciicast
【讨论】:
如果您想将不同语言的值存储在标准 Rails i18n (yml) 旁边的数据库中,您可以执行以下操作:
产品表名字段:
获取正确的值:
def i18n_db_value(object, attribute)
object.send("#{attribute.to_s}_#{I18n.locale}") if object
end
【讨论】:
“在模型中存储多个版本的内容并拥有一个站点”与 “模型中只存储一个版本的内容,但有多个站点”
【讨论】:
您可以覆盖模型类别中的“名称”方法,可以在另一个表中搜索正确的翻译。
因此,在类别表中,您应该在“名称”字段中包含默认翻译语言,例如“其他”。然后在如下表中查找“其他”:
transtations table
en_text "Other" <--- You search this (default language)
es_text "Otros" ---> You retrun this
ca_text "Altres" ---> or this
# Category table
class Category < ActiveRecord::Base
def name
Translation.translate(read_attribute("name"))
end
end
# Your transltation model
class Translation < ActiveRecord::Base
def self.translate(text)
locale=I18n.locale
if locale!="en" # default locale: what is on the table "category"
trad=self.find_by_en_text(text)
if trad
return eval("trad.#{locale}_text")
end
end
return text
end
end
【讨论】: