joppot

コピペで絶対動く。説明を妥協しない

プログラミング

railsのwebrickでi18nの言語切り分けをサブドメインで設定する

投稿日:2016年10月18日更新日:

Pocket

topthumb

概要

みなさんこんにちはcandleです。最近では海外展開も視野に入れたwebアプリケーションの開発が行われることが多くなってきているような気がします。

そうなってくると、webアプリケーションの国際化ですが、一般にrailsの言語切り替えはサブドメインかURLの先頭に言語指定を入れる方法がとられます。

今回はサブドメインの方法を見ていきましょう。

前提

適当なrailsアプリケーションがある。


i18nの基本設定

i18nを設定する場合は何をdefault言語とするかが大事になります。
一般的には英語をデフォルト言語にして、日本語はサブドメインにする方法がよいかと思います。

config/application.rbを開いて、以下を記述します。

config.time_zone = 'Central Time (US & Canada)'
config.i18n.default_locale = :en
config.i18n.available_locales = [:en, :ja]
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]

タイムゾーンをアメリカにします。
デフォルトの言語は英語にします。
使用できる言語の設定でjaを加えます。
他言語用の言語ファイルを読み込む設定を最後に記述します。

appi18n

設定は以上です。

hostsでサブドメインを設定する

もしかするとwebrickの設定とかでサブドメインができるのかもしれないのですが、
それよりも簡単に、hostsファイルにサブドメインを設定する方が早いと思います。

/etc/hosts

をエディタで開いて、以下を記述します。

127.0.0.1 ja.localhost

保存しましょう。

http://ja.localhost:3000

にアクセスできるようになりました。


サブドメインをi18nのlocalesにする設定

サブドメインで言語指定をしてもrails側でそれを処理してi18nに設定しなければ、ただのサブドメインなので、設定します。
このサイトの内容を参考にさせて頂きました。

http://ruby-rails.hatenadiary.com/entry/20150226/1424937175
app/controllers/application_controller.rbを開きます。

以下を記述します。

  before_action :set_locale

  def set_locale
    I18n.locale = extract_locale_from_tld || I18n.default_locale
  end

  def extract_locale_from_tld
    parsed_locale = request.subdomains.first
    I18n.available_locales.map(&:to_s).include?(parsed_locale) ? parsed_locale : nil
  end

プログラムの説明としては

extra_locale_from_tldはrequestからサブドメインんだけを取り出し、
その名前がi18nで定義されていれば、サブドメインを返して、定義されていなければ、nilを返します。

返ってきた値をset_locale関数は受けとって、
もしもサブドメインがある場合はそれをi18nに設定し、
無ければ、デフォルト言語を設定します。

yamlを用意する

他言語用のyamlファイルを用意します。
一般に以下のようにします。

config/locales/views/コントローラー名/ja.yml
config/locales/views/コントローラー名/en.yml

例えばitems controllerのindexアクションに任意の文字列を表示したい場合は

config/locales/views/items/ja.yml

を作成し
中身を以下のようにします。

ja:
  items:
    index:
      header: アイテム一覧

jaitemsyml

そしたら、app/views/items/index.html.erb
を開いて、以下を記述すれば表示されます。

<%= t('.header') %>

konnnakannji

同様に、en.ymlを用意すれば、localesがenの時はenが表示されます。

実際にアクセスする

htpp://ja.localhost:3000

これで日本語が表示されます。

itemsjaname


まとめ

ローカルでサブドメインを使って、i18nをやってみました。
どうでしたでしょうか。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-プログラミング
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

phpとmysqlでアカウント管理する時のテストユーザーのパスワードの暗号化はmysqlのsha1でもできる

by brewbooks 概要 みなさんこんにちはcandleです。最近はphpでサービスを書いたりしています。その中でテストユーザーのアカウント管理でパスワードを暗号化してデータベースに収めています …

wordpressのget_categoriesでサブカテゴリーを含まないカテゴリー一覧を取得する

概要 みなさんこんにちはcandleです。今回はカテゴリー一覧にサブカテゴリーを含まない取得の仕方を紹介します。 サブカテゴリーを使用しているサイトの場合、場合によってはサブカテゴリーとトップの階層の …

railsのsimple-captcha gemを使用してform_forを使ったフォームを画像認証する

概要 みなさんこんにちはcandleです。公に開かれたフォームはスパムや総当り攻撃を受けやすいです。 そこで、画像認証を導入して、悪意のあるフォームを拒否してみましょう。 simple-captcha …

railsのaws-sdk gemを使ってs3のフォルダ(folder)を削除する

概要 みなさんこんにちはcandleです。今回はs3にあるフォルダを丸ごとrailsのaws-sdk gemを使用して削除してみたいと思います。 実はこの方法を確立するまですごく四苦八苦しました。なん …

Mysqlテーブルの照合順序を変更する

概要 みなさんこんにちはcandleです。今回はテーブルの照合順序を変更する方法を行います。 この方法はやっても、mysqlクエリー1行ですみます。早速やりましょう。 テーブルの照合順序を変更する 次 …

  • English
  • 日本語

プロフィール


ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー

スポンサードリンク

アーカイブ