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コード内の文章を日本語にしたい

参考ページ
あとで読む