Railsの多言語URL設計を完全ガイド!初心者でもわかるlocale・スラッグ・人間可読URL
生徒
「Railsで多言語対応する時、URLの設計ってどうすればいいんですか?」
先生
「それはとても大事な話ですね。Railsではlocaleという仕組みを使って、URLに言語を含める方法がありますよ。」
生徒
「URLに言語を含めるって、どんな感じですか?」
先生
「例えば/ja/productsや/en/productsのように、日本語と英語で切り替えができるようにするんです。人間が読んでもわかりやすいURLになりますよ!」
1. 多言語URLとは?
多言語URL(たげんごゆーあーるえる)とは、Webサイトを日本語や英語など複数の言語で表示するために、URLに言語コード(例:ja、en)を入れる設計のことです。例えば日本語なら/ja/products、英語なら/en/productsのようにします。
この設計をすることで、ユーザーが見ている言語が一目で分かり、SEO(検索エンジン最適化)にも効果的になります。
2. localeスコープでURLに言語を含める
Railsではscopeという機能を使って、URLに言語コードを入れることができます。これを「localeスコープ」と呼びます。以下はその実装例です。
Rails.application.routes.draw do
scope "(:locale)", locale: /ja|en/ do
resources :products
end
end
このように書くと、/ja/productsや/en/productsのようなURLが使えるようになります。
locale(ロケール)とは、「表示する言語や地域設定」のことです。
3. URLにスラッグを使って人間が読めるURLに
Railsでは、ID番号だけのURLではなく、スラッグ(slug)を使って/products/ruby-bookのように「人間が読めるURL」にすることもできます。
スラッグとは、記事のタイトルなどから生成した短くて分かりやすい英語の文字列です。
例えば、次のようにURLが変わります。
- 通常:
/products/1 - スラッグ使用:
/products/ruby-book
このようにすることで、SEOに強くなり、検索エンジンからも評価されやすくなります。
4. スラッグを使うためのルーティング設定
スラッグを使う場合、ルーティングでは通常のIDの代わりに:idの部分をスラッグで処理する必要があります。Railsでは特別な設定をしなくても、:idの部分にスラッグを渡せます。
get '/products/:id', to: 'products#show', as: 'product'
ただし、コントローラ側でIDではなくスラッグで検索するようにします。
def show
@product = Product.find_by(slug: params[:id])
end
5. localeとslugを組み合わせた多言語対応のURL例
多言語対応とスラッグを組み合わせると、以下のような人間が読みやすいURLが作れます。
/ja/products/ruby-book(日本語ページ)/en/products/ruby-book(英語ページ)
これにより、ユーザーにも分かりやすく、Googleなどの検索エンジンにも評価されやすくなります。
6. デフォルトの言語設定とリダイレクト制御
もしURLに言語コード(locale)がない場合、自動でリダイレクトして指定の言語に移動させたいこともあります。その場合はApplicationControllerでbefore_actionを使って制御します。
before_action :set_locale
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
I18n(アイ・エイ・チー・エヌ)は、Railsの多言語対応をするための仕組みです。I18n.localeに値を設定することで、表示する言語を切り替えることができます。
7. URLの自動生成にもlocaleを含めるには?
Railsでlink_toなどのURL生成時にもlocaleを含めたい場合、default_url_optionsを設定しておくと便利です。
def default_url_options
{ locale: I18n.locale }
end
これにより、Railsが自動で生成するすべてのURLに、今の言語コードが含まれるようになります。
8. 多言語URLとSEOの関係
Googleの検索エンジンは、URLの構造を見てページの内容や言語を判断します。そのため、/ja/や/en/を含めることで、Googleにも「これは日本語ページです」「これは英語ページです」と伝えることができます。
また、スラッグを使ってページの内容がわかるURLにすることで、検索キーワードとマッチしやすくなり、検索結果にも表示されやすくなります。
まとめ
これまでの内容を振り返ると、Ruby on Railsで多言語対応サイトを構築する際、単に翻訳ファイルを準備するだけでなく、「URL設計」がSEOやユーザー体験(UX)において極めて重要であることがわかります。特にlocaleスコープを利用したパスの構築と、人間が直感的に内容を理解できるslug(スラッグ)の導入は、モダンなWeb開発において欠かせない技術です。
Railsでの多言語ルーティングの実践的な実装
実際の開発現場では、データベースに保存された各製品の情報を、言語ごとに最適なURLで表示させる必要があります。ここでは、具体的なデータベースの状態と、それに基づいたSQL、およびRailsでの実装コードを改めて整理しましょう。
現在のproductsテーブル(多言語対応前)
id | name | slug | price | category
---+-------------------+----------------+-------+-----------
1 | Rails入門ガイド | rails-guide | 3200 | book
2 | Rubyの基本 | ruby-basics | 2800 | book
3 | Docker構築法 | docker-master | 4500 | movie
4 | API設計の教科書 | api-design | 3800 | book
5 | JavaScript応用 | js-advanced | 3500 | movie
このテーブル構造に対して、URLにlocaleとslugの両方を組み込むことで、検索エンジン(SEO)に対して「どの言語で、何について書かれたページか」を明確に伝えます。
発展的なルーティングの記述法
SEOを強化するために、特定の言語以外(例えばフランス語など)が指定された場合に404エラーを出すか、あるいはデフォルトの言語に飛ばすような制約を加えたルーティングが一般的です。
# config/routes.rb
Rails.application.routes.draw do
# 言語コードをURLの先頭に配置(ja、en、またはなし)
scope "(:locale)", locale: /ja|en/ do
resources :products, param: :slug, only: [:index, :show]
end
# トップページへのアクセスをデフォルト言語へリダイレクト
root to: redirect("/ja")
end
resources :products, param: :slugと記述することで、Railsのヘルパーメソッド(例:product_path(@product))が生成するURLの末尾が、IDではなく自動的にslugカラムの値を使用するようになります。
コントローラでの検索クエリ
URLが/ja/products/rails-guideとなった場合、コントローラ側では以下のようなSQLを発行してデータを取得します。IDではなく文字列(スラッグ)で検索を行うのがポイントです。
# app/controllers/products_controller.rb
class ProductsController < ApplicationController
def show
# URLの末尾(params[:slug])を使って検索
@product = Product.find_by!(slug: params[:slug])
end
end
実行されるSQLのイメージ
SELECT "products".*
FROM "products"
WHERE "products"."slug" = 'rails-guide'
LIMIT 1;
SQL実行後の取得レコード
id | name | slug | price | category
---+-------------------+----------------+-------+-----------
1 | Rails入門ガイド | rails-guide | 3200 | book
SEOを意識した多言語URLのメリット
なぜここまでURLにこだわるのでしょうか?それは、GoogleのクローラーがWebサイトを巡回する際、URLの構造からコンテンツの関連性を推測するからです。
- キーワードの包含: URLに
ruby-basicsといったキーワードが含まれることで、特定の検索語句に対してヒット率が高まります。 - 重複コンテンツの回避:
localeをURLに含めることで、同じ内容の日本語版と英語版を「別々の価値あるページ」として正しく認識させることができます。 - クリック率の向上: 検索結果に表示されたURLが意味不明な数字(/products/123)よりも、意味の通じる英単語(/products/rails-guide)である方が、ユーザーに安心感を与えクリックされやすくなります。
多言語対応は、単にI18n.tメソッドを使って文字を置き換える作業ではありません。このようにインフラとしてのURL設計を見直すことで、世界中のユーザーに届く、技術的に洗練されたアプリケーションへと進化させることができるのです。
生徒
「先生、まとめを読んで多言語URLの重要性がさらによくわかりました!でも、もし途中で新しい言語、例えば『中国語(zh)』を追加したくなったらどうすればいいんですか?」
先生
「いい質問ですね。その場合は、ルーティングのlocale: /ja|en/という正規表現の部分に|zhを足すだけでOKですよ。Railsの設計が柔軟なので、後からの拡張も簡単なんです。」
生徒
「なるほど。あと、スラッグを使うとURLが綺麗になりますが、もしタイトルを変えてスラッグも変わっちゃったら、古いURLにアクセスした人がエラーになっちゃいませんか?」
先生
「鋭いですね!確かにSEO的にはURLが変わるのは良くありません。実務では『friendly_id』というライブラリを使って履歴を管理したり、古いスラッグから新しいスラッグへ301リダイレクトをかける処理を実装したりするのが一般的です。」
生徒
「301リダイレクト……。URL一つとっても、SEOを考えると奥が深いですね。今回はdefault_url_optionsを使って、リンクを自動で多言語対応させる方法が一番の驚きでした。」
先生
「あれは便利ですよね。一度設定してしまえば、link_to "詳細", @productと書くだけで、勝手に/ja/products/rails-guideのようなURLを作ってくれますから。ケアレスミスも減ります。」
生徒
「Railsの仕組みをフル活用して、世界中の人に使ってもらえるサイトを作れるように頑張ります!ありがとうございました!」