翻译 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!
。
对于此迁移,你需要使用 up
和 down
,而不是 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