- 更新日: 2014年9月18日
- Rails
Railsで同一URLで多言語化していたページを言語毎にURLを分ける
一昨日公開した 英和・和英・英英辞典 Imagict ですが、最初の公開時のトップページは、同一の1つのURL(http://imagict.com/)で二ヶ国語対応(日本語/英語)をしていました。簡単に言うと、訪問して頂いたユーザーの HTTP_ACCEPT_LANGUAGE などで判別して、表示する言語を自動で日本語 or 英語に振り分けていました。
ところが… ここでちょっと問題発生。
Facebook のシェア投稿や検索エンジンのインデックスで問題発生
問題1つ目。http://imagict.com/ の URL を Facebook にシェア投稿しようとすると、シェアされる URL から Facebook が自動でタイトルやテキストを取得する際に、英語優先で取得されます。これは困りました。
問題2つ目。1つの URL で多言語対応(今回のケースでは、日本語と英語に対応)していると、検索エンジン(Google)に英語でインデックスされるようです。やはりここでも英語優先。
以上のように、ウェブサービスを取り巻く環境でちょっと問題が発生しました。本来は、同一URLで多言語対応するのは、ユーザーのことだけを考えると別に良いかとも思うのですけどね。
Lang-8 なんかは、トップページは1つのURLで沢山の言語に対応しています。ブラウザの言語設定を変えると、その言語で表示されます。検索エンジンには英語でインデックスされているようです。
私の場合、立ち上げたばかりのサービスですので、検索エンジンや Facebook からの流入も大切にしていきたい。なので、http://imagict.com/ を日本語用のトップページ、http://imagict.com/en/ を英語用のトップページに固定することにしました。
利用していた翻訳ファイル config/locales/views/home/en.yml, ja.yml には一切手を加えずに、/ を日本語トップページ、/en/ を英語トップページに分割しました。以下、そのやり方です。Rails で I18n を利用している場合の例です。
— 環境 —
rails (4.1.1)
i18n (0.6.9)
英語トップページ用の home#index_en アクションを追加
元々の root_path 用のアクション index の I18n.locale を :ja(日本語)に固定します。そして、英語トップページ用のアクション index_en を追加。
app/controllers/home_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class HomeController < ApplicationController # ... def index I18n.locale = :ja #... end def index_en index I18n.locale = :en render :action => "index" end # ... end |
index_en では index をそのまま呼んで、I18n.locale を :en(英語)で上書きして固定。テンプレートはそのまま index のものを流用します。
ルーティング設定
英語トップページ用のルーティングを追加。/en/ に home#index_en を対応させる。
config/routes.rb
1 2 3 4 5 6 |
Railsapp::Application.routes.draw do root 'home#index' get '/en', to: 'home#index_en' #... end |
サインアウト時のリダイレクト先を locale で変更
英語ロケールのログイン済みユーザーが、ログアウト時に日本語のトップページにリダイレクトされるとちょっと面食らうかと思いますので、ログアウト時のリダイレクト先を設定。Devise を利用している場合の例ですが、after_sign_out_path_for メソッドをオーバーライドします。
app/controllers/application_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class ApplicationController < ActionController::Base # ... def after_sign_out_path_for(resource) if I18n.locale == :ja root_path else en_path end end # ... end |
locale が日本語のユーザーは / にリダイレクト、locale が日本語以外のユーザーは /en/ にリダイレクトさせるようにしました。
/, /en/ に言語選択メニューを表示
/(日本語トップページ), /en/(英語トップページ)のそれぞれの言語のトップページの任意の箇所に、言語選択メニューを表示させる。私は、application.html.erb でヘッダー下あたりに追加。
views/layouts/application.html.erb
1 2 3 4 5 6 7 8 9 |
<% if controller.controller_name == 'home' && controller.action_name == 'index' %> <div class="top-language-menu"> Japanese Top | <%= link_to "English Top", "/en/" %> </div> <% elsif controller.controller_name == 'home' && controller.action_name == 'index_en' %> <div class="top-language-menu"> <%= link_to "Japanese Top", "/" %> | English Top </div> <% end %> |
これで、日本語トップページと英語トップページを分割することができました。今まで日本語でばかりのWEB作成で、本格的な多言語対応は初めて試みたので、色々つまづきがあります。これから多言語化の対応をしたり、多言語ウェブアプリケーションの開発に取り組まれる方は、注意してくださいね。
- – 参考リンク –
- 多地域、多言語のサイト – ウェブマスター ツール ヘルプ
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!