Globalize3 でジャパニーズに差をつける。

Gem の説明

例えばブログの記事のタイトルをとか言語別に対応させたいときとかに、便利にいける感じ。

いれてみる

Gemfile に以下を追加

gem 'globalize3'

設定とか

$ rails g migration create_article_translations
  • マイグレーションファイルの中身
    • 多言語化したいものを指定する
    • change メソッドは御法度らしい。
class CreateArticleTranslations < ActiveRecord::Migration
  def up
    Article.create_translation_table!({
      title: :string,
      content: :text
    }, {
      migrate_data: true
    })
  end

  def down
    Article.drop_translation_table! migrate_data: true
  end
end

マイグレーションのほか、モデルにも翻訳するフィールドを書く。

# app/models/article.rb
class Article < ActiveRecord::Base
  translates :title, :content
end

使用してみる

# 現在の言語の確認
> I18n.locale
=> :ja

# 記事を作成
> Article.create!(title: '工場女', content: '僕は女工好き')
=> #<Article id: 1, title: '工場女', content: '僕は女工好き'>

# 保存したもんをみてみる
> Article.first
=> #<Article id: 1, title: '工場女', content: '僕は女工好き'>

# 言語をかえてみる
> I18n.locale = :en
=> :en
> Article.first
=> #<Article id: 1, title: nil, content: nil>

上の例だと英語化されてない場合 nil がかえってくる。 だけど、application.rb に以下の設定を書き足すことで翻訳されてないのはデフォルトの言語のものがでるようになる。

# config/application.rb
config.i18n.fallbacks = true

> I18n.locale = :en
=> :en

# さっき保存したのをみてみるとデフォルトの :ja のものがかえってくる
> Article.first
=> #<Article id: 1, title: '工場女', content: '僕は女工好き'>

# :en の場合の title を設定してみる。
> Artictle.first.update_attributes(title: 'FactoryGirl')
=> #<Article id: 1, title: 'FactoryGirl', content: '僕は女工好き'>

> Article.first
=> #<Article id: 1, title: 'FactoryGirl', content: '僕は女工好き'>

# 日本語にもどすとかえってくるものももどる。
> I18n.locale = :ja
=> :ja

> Article.first
=> #<Article id: 1, title: '工場女', content: '僕は女工好き'>

最後に

自然な感じでとれるんだけど、dbへのアクセスとかどうなんだろう。 しらべないと

参考:#338 Globalize3 - RailsCasts

ちょっとしためも

  • database の構成
    • "article_id" integer
    • "locale" varchar(255)
    • "title" varchar(255)
    • "content" text