通过数据库列实现Rails的国际化(I18n)

4
我有一个遗留的数据库表,其中包含name_en和name_es两列。我想知道在ActiveRecord中根据用户的i18n偏好查询翻译的最佳方法是什么。
我看到Rails的i18n实现更多地涉及将翻译存储在单独的哈希或表中,但我不想改变数据库的结构。
目前,在旧的PHP应用程序中,我向mysql查询发送一个参数来替换name_lang,并返回name_enname_es AS name以便在调用行的id时显示。

使用作用域似乎是一个不错的方法。 - Zabba
@Zabba:在那里实现作用域会有点长。 - apneadiving
1个回答

12

您应该创建一个初始化器,在其中放置以下内容:

class ActiveRecord::Base
  def self.has_translation(*attributes)    
    attributes.each do |attribute|
      define_method "#{attribute}" do
        self.send "#{attribute}_#{I18n.locale}"
      end
    end
  end
end

然后在你的模型中:

has_translation :name, :whatever

这样它将根据当前的语言环境自动调用正确的列名。在您的视图中:

@variable.name # calling @variable.name_en if locale = :en
               #         @variable.name_es if locale = :es
当然,我假设不存在一个名为 name 的已有表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接