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

スポンサードリンク

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

-プログラミング
-

執筆者:


comment

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

関連記事

wysiwygエディタのSquire editorのサンプルを作成する

概要 みなさんこんにちはcandleです。 今回オープンソースのsquireエディタをhtmlに手動で導入したいと思います。 squireはオープンソースの便利なwysiwygエディタです。 カスタマ …

javascriptでのJSONの大きさ(サイズ)の取得

概要 みなさんこんにちはcandleです。今回はプログラミングで少し手間取ったJSONサイズ取得の問題について書いていこうと思います。 JSONはjavascirptでわりと多く使われるオブジェクト型 …

ElastiCacheのmemcachedとEC2上のrailsとdalli-elasticacheを使ってキャッシュ管理する

概要 皆さんこんにちはcandleです。今回はaws上にあるElastiCacheというサービスを使って railsのキャッシュを管理したいと思います。 キャッシュというのはwebサービス上でよく使う …

正規表現を極めるその1

概要 みなさんこんにちはcandleです。今回から正規表現を1から100まで極めようと思います。 正規表現って、使えると便利ですが、それを勉強して使いこなせている人って少ないと思います。この機会にぜひ …

railsのaws-sdk gemを使ってs3に画像ファイルをフォームからアップロードする

概要 みなさんこんにちはcandleです。比較的難しいrailsからs3に画像をアップロードする方法を試してみましょう。 一般にサーバ環境にはスケーラビリティ(アクセスの規模に応じて、動的にサーバを動 …

  • English
  • 日本語

プロフィール


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

スポンサードリンク

アーカイブ