Railsのロケール切り替え完全ガイド|URL・サブドメイン・クッキーで多言語対応を実装しよう
生徒
「日本語と英語を切り替えられるWebサイトって、どうやって作っているんですか?」
先生
「Railsではi18nという仕組みを使って、言語や時間の表示を切り替えられます。」
生徒
「URLが /ja と /en で分かれているサイトもありますよね?」
先生
「それがロケール切り替えです。URLやクッキーなどを使って判定できます。順番に見ていきましょう。」
1. Railsのロケールとi18nとは?
Railsのi18nは「internationalization(国際化)」の略で、多言語対応を簡単に行うための仕組みです。
ロケールとは「言語や地域の設定」のことで、日本語ならja、英語ならenといった短い名前で表します。
例えるなら、同じ説明書を「日本語版」「英語版」に切り替えて読むようなイメージです。 Railsでは、この切り替えをプログラムで自動的に行えます。
Railsの仕組みを根本から理解し、現場で通用する 「設計のセオリー」を身につけたいならこの一冊。 MVC、テスト、Docker対応など、実践的な内容が凝縮されています。
パーフェクト Ruby on RailsをAmazonで見る※ Amazon広告リンク
2. ロケール切り替えの基本的な考え方
ロケール切り替えでは、まず「今どの言語を使うか」を決めます。 この判定方法として、主に次の3つがあります。
- URLで判定する方法
- サブドメインで判定する方法
- クッキーで判定する方法
Railsでは、コントローラという場所でロケールを設定するのが一般的です。
3. URLでロケールを切り替える方法
URLで切り替える方法は、初心者にとって一番わかりやすく、SEO対策としてもよく使われます。
例:
/ja/posts → 日本語
/en/posts → 英語
# config/routes.rb
scope "(:locale)", locale: /ja|en/ do
resources :posts
end
次に、コントローラでロケールを設定します。
# app/controllers/application_controller.rb
before_action :set_locale
def set_locale
I18n.locale = params[:locale] || :ja
end
これは「URLに言語があればそれを使い、なければ日本語にする」という意味です。
4. サブドメインでロケールを切り替える方法
サブドメインとは、en.example.com の「en」の部分です。
言語ごとに入り口を分けたいときに使われます。
# app/controllers/application_controller.rb
before_action :set_locale
def set_locale
I18n.locale = request.subdomain == 'en' ? :en : :ja
end
この場合、英語用と日本語用でURL構造が変わるため、企業サイトなどでよく利用されます。
5. クッキーでロケールを保存する方法
クッキーとは、ブラウザに保存される小さなメモ帳のようなものです。 一度選んだ言語を覚えておくのに向いています。
def set_locale
I18n.locale = cookies[:locale] || :ja
end
言語切り替えボタンを押したときに、クッキーへ保存します。
def change_locale
cookies[:locale] = params[:locale]
redirect_back(fallback_location: root_path)
end
6. タイムゾーンとロケールの関係
ロケールは言語、タイムゾーンは時間の基準です。 日本は「東京時間」、海外では国ごとに異なります。
# config/application.rb
config.time_zone = 'Tokyo'
config.active_record.default_timezone = :local
言語と時間をセットで考えることで、より自然な多言語対応になります。
7. 初心者がつまずきやすいポイント
よくある間違いは次の通りです。
- ロケールの指定を忘れて常に英語になる
- URLとクッキーの設定が混ざってしまう
- 翻訳ファイルが読み込まれていない
まずは「URLで切り替える方法」だけを実装するのがおすすめです。