3
3

More than 5 years have passed since last update.

railsで i18nで他言語化した [目標]domain.com/signup をdomain.com/:locale/signupに。

Posted at

i18nを導入

1. config/initializers/i18n.rbにLAUNGUAGESというのを書く

I18n.default_locale = :en

LANGUAGES = [
  ['English', 'en'],
  ['日本語', 'ja'],
  ['中文', 'zh-CN']
]

今回は、この三言語を使う。

2.app/controllers/application_controllers.rbにset_i18n_locale_from_paramsを定義するとともに、urlのオプションもセットで定義しておく。

protected
def set_i18n_locale_from_params
  if params[:locale]
    if I18n.available_locales.map(&:to_s).includes?(params[:locale])
      I18n.locale = params[:locale]
    else
      flash.now[:danger] = "#{params[:locale]} translation not available"
    end
  end
end

def default_url_options
  { locale: I18n.locale }.merge(super)
end

とする。これで、paramsにlocaleがあった時に、そのlocaleが存在するかをチェックして、存在すれば、I18n.localeをそのlocaleにセットするというのができた。

3.config/routes.rbを設定する。

今回の目標は、www.domain.com/helloだったものを、日本語、英語、中国語をそれぞれwww.domain.com/ja/hello、www.domain.com/en/hello、www.domain.com/zh-CN/helloに対応させるので、routing の設定が必要である。

scope '(:locale)', locale: /en|ja|zh-CN/ do #localeがないもともとのrouteもそのまま使える
  # 上のようにlocaleをurlに入れたい部分を全て書く。よくわからなければ、全てこの中に入れて仕舞えば良い。以下に例を示す
  root 'home#index' # www.domain.com/:locale/ ホームに言語の情報がつく
  resources :users  # www.domain.com/:locale/users/new など
  get 'signup' => 'users#new' # www.domain/:locale/signup
end

4.対応する言葉を定義する

各言語の対応は、config/localesないのymlファイルに定義する。

ja.yml

ja:
  hello: "こんにちは"

  layouts: # viewsのlayouts内の
    header: # _header.html.haml内で使われている
      user: "ユーザ" # userを"ユーザ"と表示する
      profile: "プロフィール"
      settings: "設定"
      home: "ホーム"
      help: "ヘルプ"
      logout: "ログアウト"
      login: "ログイン"
      account: "アカウント"

同様に、en.yml, zh-CN.ymlも定義する。

他にも

ja:
...

  views:
    something: '何か'

と定義すると、

= t('views.something')

でどのviewからも呼び出せる。

5.viewsから定義したものを呼ぶ

例として、app/views/layouts/_header.html.haml(application.html.hamlの部分テンプレートで呼ばれてるとする)に上で定義したものを書いてみる

= t('.user') #日本語なら"ユーザ"と表示される。

6.言語変更のリンクを作る。

navbarないに以下を書く

- LANGUAGES.each do |language, locale|
  %li{class: "#{I18n.locale == locale} ? 'active' : 'inactive'"}=link_to language, locale: locale

これで、言語変更のリンクができた。

このLANGUAGUESは、一番最初のconfig/initializers/i18n.rbで定義したものである。

参考ページ

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3