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で定義したものである。