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コード内の文章を日本語にしたい
参考ページ
あとで読む




