joppot

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

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

      2016/10/18

Pocket

topthumb

概要

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

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

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

前提

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

SPONSORED LINK


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をやってみました。
どうでしたでしょうか。

 - プログラミング