I18nのデフォルトロケールを日本語に設定したらサーバーが起動しない
日本語への翻訳をデフォルトにしたい
RailsアプリでI18nの機能をつかってデフォルトの翻訳言語を日本語に設定したい。
I18nとは、Railsガイド
によると
アプリケーションの文言を英語以外の 別の1つの言語に翻訳 する機能や 多言語サポート 機能を簡単かつ拡張可能な方式で導入するためのフレームワークを提供します。
とあります。一言でいうと、「Rails で色々な言語に翻訳をしてくれるところ」となると思います。
Railsのデフォルトの言語は英語のような言語に設定されているので、このままエラーメッセージを表示させたら英語のような表記になってしまいます。またモデル名、カラム名(属性名)は英単語で設定していることが多いと思うので、デフォルトではそのまま表示されてしまいます。ユーザーを日本国内の人として想定しているなら、日本語で表示された方がわかりやすいので、ここでI18nをつかって日本語に翻訳されるように実装しなければいけません。
Railsガイドを参考にすると、I18nの仕組みは言語別に辞書のような、対応する値を定義した(Userモデルの日本語訳は'ユーザー'と定義するような)ファイルをつくっておき、その言語をデフォルトの翻訳言語(デフォルトロケール)として設定したときに翻訳された結果(自分で定義したもの)が表示されるというものです。つまり、このデフォルトの翻訳言語を設定しなければ、訳を定義したとしても読み込まれず表示されません。
今回はそのI18nを使ってアプリのデフォルトの翻訳言語を日本語に設定したいと思っています。
実装は、
・日本語訳の辞書ファイルを作成する(config/locales/ja.yml)。このファイルに訳を定義していく
・config/application.rbにデフォルトで読み込まれる翻訳言語(今回は日本語)を設定する文言を記述する
問題
実装が終わり、ブラウザで確認しようとターミナルでサーバーをたちあげようとしたら(bin/rails s)、エラーが出てしまった。エラーの内容は以下の文言だった。
undefined method default_locales=' for I18n:Module (NoMethodError)
Did you mean? default_locale=
default_locale**
仮説
エラー文の示すところはデフォルトの言語の設定のところ、config/application.rbの以下の部分だった。
config.i18n.default_locales = :ja
このエラー文の意味は「 default_localesというメソッドはI18nモジュールには定義されていません(ありません)。'default_locale='か'default_locale**'じゃないの?」。
I18nモジュールに対してメソッドを呼び出しているため、そこの意図はあっていると考え、エラー文通りdefault_localesメソッドが間違っていると考えた。
解決法
設定の記述は書き方が決まっているため、Railsガイドでしっかり正しい形を調べてコピペしようと考えた。
すると、4.3 ロケールの設定と受け渡しで default_localeが正しい形だと分かったので、先ほどのconfig/application.rbの箇所を
config.i18n.default_locale = :ja
と書き直した。そうするとサーバーが起動し、自分の翻訳も適用されていた。
学んだこと
・設定は文言が決まっているので公式の情報で正しい形をしっかり調べ、コピペするようにする。
・それでも誤入力はあると思うので、こういうエラーが来たら、こういう対処と思いつくように引き出しを増やす。
Bootstrapのドロップダウンが機能しない
Bootstrapのドロップダウンを適用したい
ヘッダーメニューにドロップダウンリスト(プルダウン)の機能を追加したく、BootstrapのDropdownsの機能を使うことにした。
実装の手順は、
- gem bootstrapをインストールし、READMEに記載された手順通り、cssやJavaScriptが使えるよう各ファイルに記述
- ヘッダーメニューにBootstrapを適用させるため、Bootstrapの公式サイト通り、属性を編集。
問題
ヘッダーメニューのドロップダウンが機能していない。
仮説
他の部分のデザインが変わったことからBootstrapは導入されている。
もう一度、DropdownsのサイトをみるとJavaScriptを使ってドロップダウン機能を実現しているみたいだった。したがって、自分の実装ではBootstrapの指定しているJavaScriptが使えていないのかと考えた。しかしgem bootstrapのREADMEの記載通りコードを書いているのでできているはず。
解決法
HTMLの属性の設定をBootstrapのver4系でしていたのに、Gemfile.lockをみると5.1.0というバージョンのgemでインストールされてしまっていた。
原因は、Gemfileでバージョン指定せず、gem名だけを記述していたことだとわかり、バージョンを4系になるよう明記してインストール。無事にドロップダウンが適用された。
学んだこと
- バージョンの大切さ。あるバージョンで設定するなら、インストールするときに明記するようにする(Gemfileに)。