概要
みなさんこんにちは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を加えます。
他言語用の言語ファイルを読み込む設定を最後に記述します。
設定は以上です。
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: アイテム一覧
そしたら、app/views/items/index.html.erb
を開いて、以下を記述すれば表示されます。
<%= t('.header') %>
同様に、en.ymlを用意すれば、localesがenの時はenが表示されます。
実際にアクセスする
htpp://ja.localhost:3000
これで日本語が表示されます。
まとめ
ローカルでサブドメインを使って、i18nをやってみました。
どうでしたでしょうか。