Ruby on Railsメモ|I18n

調べたもののメモです 随時更新

I18n入門的な事

[blogcard url=”https://rakuda3desu.net/out-of-rakudas-rails-tutorial-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: 'このページはRuby on Rails Tutorialのサンプルアプリです'

<%= t('.Welcome_Sample_App') %>

<%= t('.welcome_message_html') %>

<%= link_to "Sign up now!", signup_path, class: "btn btn-lg btn-primary" %>
<%= 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メソッドをオーバーライドして自分で定義することもできるそうだ。 スゴイ。 [blogcard url=”https://easyramble.com/leave-keys-on-controller-i18nt.html”]

モデルに追加したバリデーションのエラー文を日本語に

Tutorial本文のこの辺 [blogcard url=”https://railstutorial.jp/chapters/user_microposts?version=5.1#code-micropost_model_image_validation”]

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引数をシンボルで定義できるということも教えてもらいましたよ! これはコードもすっきり!! [blogcard url=”https://railsguides.jp/active_record_validations.html#%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B-errors-details”] と、いう事で 最終的にこう!

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

参考ページ あとで読む [blogcard url=”https://qiita.com/yosaprog/items/3b2c509cf5de94f89cdb”]

タグ: I18n、Ruby on Rails、参考サイト