カテゴリ: Rails 更新日: 2026/01/31

Railsの多言語URL設計を完全ガイド!初心者でもわかるlocale・スラッグ・人間可読URL

多言語URLの設計:localeスコープ・スラッグ・人間可読URLの作り方
多言語URLの設計:localeスコープ・スラッグ・人間可読URLの作り方

先生と生徒の会話形式で理解しよう

生徒

「Railsで多言語対応する時、URLの設計ってどうすればいいんですか?」

先生

「それはとても大事な話ですね。Railsではlocaleという仕組みを使って、URLに言語を含める方法がありますよ。」

生徒

「URLに言語を含めるって、どんな感じですか?」

先生

「例えば/ja/products/en/productsのように、日本語と英語で切り替えができるようにするんです。人間が読んでもわかりやすいURLになりますよ!」

1. 多言語URLとは?

1. 多言語URLとは?
1. 多言語URLとは?

多言語URL(たげんごゆーあーるえる)とは、Webサイトを日本語や英語など複数の言語で表示するために、URLに言語コード(例:ja、en)を入れる設計のことです。例えば日本語なら/ja/products、英語なら/en/productsのようにします。

この設計をすることで、ユーザーが見ている言語が一目で分かり、SEO(検索エンジン最適化)にも効果的になります。

2. localeスコープでURLに言語を含める

2. localeスコープでURLに言語を含める
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に

3. URLにスラッグを使って人間が読めるURLに
3. URLにスラッグを使って人間が読めるURLに

Railsでは、ID番号だけのURLではなく、スラッグ(slug)を使って/products/ruby-bookのように「人間が読めるURL」にすることもできます。

スラッグとは、記事のタイトルなどから生成した短くて分かりやすい英語の文字列です。

例えば、次のようにURLが変わります。

  • 通常:/products/1
  • スラッグ使用:/products/ruby-book

このようにすることで、SEOに強くなり、検索エンジンからも評価されやすくなります。

4. スラッグを使うためのルーティング設定

4. スラッグを使うためのルーティング設定
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例

5. localeとslugを組み合わせた多言語対応のURL例
5. localeとslugを組み合わせた多言語対応のURL例

多言語対応とスラッグを組み合わせると、以下のような人間が読みやすいURLが作れます。

  • /ja/products/ruby-book(日本語ページ)
  • /en/products/ruby-book(英語ページ)

これにより、ユーザーにも分かりやすく、Googleなどの検索エンジンにも評価されやすくなります。

6. デフォルトの言語設定とリダイレクト制御

6. デフォルトの言語設定とリダイレクト制御
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を含めるには?

7. URLの自動生成にも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の関係

8. 多言語URLとSEOの関係
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にlocaleslugの両方を組み込むことで、検索エンジン(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の仕組みをフル活用して、世界中の人に使ってもらえるサイトを作れるように頑張ります!ありがとうございました!」

関連記事:
カテゴリの一覧へ
新着記事
New1
Ruby
“すべてはオブジェクト”を体感!初心者向けRubyのオブジェクト指向入門【irbで学ぶ】
New2
Ruby
Rubyの標準入出力を完全ガイド!puts・print・pの違いとデバッグ活用法
New3
Ruby
Gemとは?RubyGemsとBundlerを初心者向けに完全解説!依存関係管理も図解でわかりやすく理解
New4
Ruby
Rubyの文字エンコーディング入門!UTF-8・マジックコメント・外部/内部エンコーディングを完全解説
人気記事
No.1
Java&Spring記事人気No1
Ruby
Rubyのreduceとinject入門!合計計算や集計を初心者向けに分かりやすく解説
No.2
Java&Spring記事人気No2
Ruby
Rubyの文字列エンコーディング完全ガイド!Encoding・force_encoding・encodeを初心者向け解説
No.3
Java&Spring記事人気No3
Ruby
Rubyの始め方ガイド:インストールから最初のHello Worldまで(Windows/Mac/Linux)
No.4
Java&Spring記事人気No4
データベース
PostgreSQLのWHERE句を徹底解説!初心者でもわかるSQLデータ抽出の基本
No.5
Java&Spring記事人気No5
Ruby
Rubyのfind/detect/find_indexを徹底解説!目的のデータを素早く探す方法
No.6
Java&Spring記事人気No6
Ruby
Rubyで比較演算子を完全解説!==・===・<=>・eql? の使い分け
No.7
Java&Spring記事人気No7
Ruby
Rubyのselect/reject/filterの使い方を完全解説!初心者向けの条件抽出レシピ
No.8
Java&Spring記事人気No8
データベース
PostgreSQLで順位付け!ROW_NUMBER関数の使い方を初心者向けに徹底解説