翻譯 ActiveRecord 模型屬性

globalize gem 是為你的 ActiveRecord 模型新增翻譯的絕佳解決方案。你可以安裝它新增到你的 Gemfile

gem 'globalize', '~> 5.0.0'

如果你正在使用 Rails 5,你還需要新增 activemodel-serializers-xml

gem 'activemodel-serializers-xml'

模型翻譯允許你翻譯模型的屬性值,例如:

class Post < ActiveRecord::Base
  translates :title, :text
end

I18n.locale = :en
post.title # => Globalize rocks!

I18n.locale = :he
post.title # => גלובאלייז2 שולט!

定義了需要轉換的模型屬性後,必須通過遷移建立轉換表。globalize 提供 create_translation_table!drop_translation_table!

對於此遷移,你需要使用 updown,而不是 change。此外,為了成功執行此遷移,你必須首先在模型中定義已翻譯的屬性,如上所示。以前的 Post 模型的正確遷移是這樣的:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table! title: :string, text: :text
  end

  def down
    Post.drop_translation_table!
  end
end

你還可以傳遞特定選項的選項,例如:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table! title: :string,
      text: { type: :text, null: false, default: "Default text" }
  end

  def down
    Post.drop_translation_table!
  end
end

如果你在需要的翻譯列中已有任何現有資料,則可以通過調整遷移輕鬆將其遷移到翻譯表:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table!({
      title: :string,
      text: :text
    }, {
      migrate_data: true
    })
      
  end

  def down
    Post.drop_translation_table! migrate_data: true
  end
end

***確保在安全遷移所有資料後從父表中刪除已翻譯的列。***要在資料遷移後自動從父表中刪除已翻譯的列,請將選項 remove_source_columns 新增到遷移中:

class CreatePostsTranslationTable < ActiveRecord::Migration
  def up
    Post.create_translation_table!({
      title: :string,
      text: :text
    }, {
      migrate_data: true,
      remove_source_columns: true
    })
      
  end

  def down
    Post.drop_translation_table! migrate_data: true
  end
end

你還可以向以前建立的翻譯表新增新欄位:

class Post < ActiveRecord::Base
  # Remember to add your attribute here too.
  translates :title, :text, :author
end

class AddAuthorToPost < ActiveRecord::Migration
  def up
    Post.add_translation_fields! author: :text
  end

  def down
    remove_column :post_translations, :author
  end
end