Ruby on Railsメモ|I18n
調べたもののメモです
随時更新
I18n入門的な事
フラッシュメッセージの日本語化(controllerのリテラルを日本語化)
フォルダとファイルを作成
(最初にmodelsフォルダを作って仕分けをしたのでcontrollerも分ける)
#言語 ja: #controller名(_controller部分は付けない) users: #アクション名 create: #リテラル: '対応リテラル' welcome_message: 'サンプルアプリへようこそ!'
・
・
・
def create
@user = User.new(user_params)
if @user.save
#tメソッドで翻訳
flash[:success] = t('.welcome_message')
redirect_to @user
else
render 'new'
end
end
・
・
・
HTMLを含めた出力
キーに「_html」を付ける
(もちろんリンク以外でもOK)
static_pages: home: Welcome_Sample_App: 'サンプルアプリへようこそ!' welcome_message_html: 'このページは<a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>のサンプルアプリです'
<div class="center jumbotron"> <h1><%= t('.Welcome_Sample_App') %></h1> <h2> <%= t('.welcome_message_html') %> </h2> <%= link_to "Sign up now!", signup_path, class: "btn btn-lg btn-primary" %> </div> <%= link_to image_tag("rails.png", alt: "Rails logo"), 'http://rubyonrails.org/' %>
モデルの属性名を取得
モデルの属性名を他のリソースのviewから参照したい!
#参照元 ja: activerecord: models: user: ユーザー attributes: user: name: 名前 email: メールアドレス password: パスワード password_confirmation: パスワード(確認用)
・ ・ ・ #第二引数に表示したい文字を指定 #モデル名.human_attribute_name(属性名) <%= f.label :email, User.human_attribute_name(:email) %> <%= f.email_field :email, class: 'form-control' %> <%= f.label :password, User.human_attribute_name(:password) %> <%= f.password_field :password, class: 'form-control' %> ・ ・ ・
RoRT・8章のログインフォームと見比べて、emailとpasswordが日本語表示に変更できている!
→モデル名.human_attribute_name(属性名)
指定のモデルの属性名を表示
→モデル名.model_name.human
指定のモデル名を表示
同一コントローラー内のすべてのアクションから参照させたい
ja: users: #コントローラー名の直下に書く(アクション名は指定しない) please_log_in: 'ログインしてください' create: welcome_message: 'サンプルアプリへようこそ!' ・ ・ ・
・ ・ ・ # beforeアクション # ログイン済みユーザーかどうか確認 def logged_in_user # logged_in?がfalseの場合 unless logged_in? # flashsでエラーメッセージを表示 #コントローラー名.キーで変換の指定 flash[:danger] = t('users.please_log_in') # login_urlにリダイレクト redirect_to login_url end end end
これ、難しく考えなくてもネストの通りにキーを省略しないで指定すればどこからでも呼べるね。
上記のも間違いではなくて、I18nのymlの書き方は思ったより自由(?)臨機応変(?)で良さそう。
そしてtメソッドをオーバーライドして自分で定義することもできるそうだ。
スゴイ。
モデルに追加したバリデーションのエラー文を日本語に
Tutorial本文のこの辺
def picture_size if picture.size > 5.megabytes # この部分を日本語にしたい errors.add(:picture, "should be less than 5MB") end end
:pictureは属性名なので普通にする
ja: activerecord: models: user: ユーザー microposts: 投稿 attributes: user: name: 名前 email: メールアドレス password: パスワード password_confirmation: パスワード(確認用) micropost: content: 投稿内容 picture: 画像
次にエラー文を日本語にしたい
最初にやったことはこれ↓ これではNoMethodError
# /sample_app/config/locales/models/ja.yml該当部分 micropost: content: 投稿内容 picture: 画像 less_than_5MB: 'は5MB未満にしないとアップロードできません' # /sample_app/app/models/micropost.rb該当部分 errors.add(:picture, t('.less_than_5MB'))
うむわからん!となったのでにゅ〜ぶる会で質問
tだけで動かない場合は、I18n.tって省略せずに書こう!
との事でそのようにしてみる
→viewは表示されるようになったけどエラー文が表示されたい部分に「画像translation missing: ja.less_than_5MB」
!!(ピコーン)
# 階層を全部指定 errors.add(:picture, I18n.t('activerecord.attributes.micropost.less_than_5mb'))
できた!
けどこのままでは問題がある!
→現状の指定ではless_than_5mbは属性名として認識されている
今後less_than_5mbという名前の属性名が出来た時、エラーメッセージがそのまま表示されてしまう!!
エラーメッセージはエラーメッセージとして表示されたい!のでmicropost以下ではないところに移動しよう!
さらに、設定をしておけばerrors.addの第二2引数をシンボルで定義できるということも教えてもらいましたよ!
これはコードもすっきり!!
と、いう事で 最終的にこう!
ja: activerecord: models: user: ユーザー microposts: 投稿 attributes: user: name: 名前 email: メールアドレス password: パスワード password_confirmation: パスワード(確認用) micropost: content: 投稿内容 picture: 画像 errors: messages: less_than_5mb: は5MBより小さいファイルをアップロードしてください
・ ・ ・ private # アップロードされた画像のサイズをバリデーションする def picture_size if picture.size > 5.megabytes errors.add(:picture, :less_than_5mb) end end end
viewのJSコード内の文章を日本語にしたい
参考ページ
あとで読む