l 방법을 사용할 때의 오류 해결 : translation missing [Rails, I18n]

9153 단어 루비I18n
Rails의 개발을 진행하는 중, l메소드를 이용했을 때에, 이하와 같은 에러가 발생했으므로, 그 원인과 해결에 대해서 기재하고 싶습니다.
덧붙여서 I18n이나 l메소드의 상세한 이용 방법에 대해서는, 참고 URL을 봐 주세요.



결론 ≒ 원인



이 에러의 원인은 l메소드의 인수인 @user.created_at 의 클래스가, ActiveSupport::TimeWithZone 이기 때문입니다.

I18n을 이용하는 경우, l메소드를 이용했을 때에는, 좋게 일본어화해 줍니다. (application.rb 등을 올바르게 설정할 수 있다면)
그러나 l 메소드의 인수를 번역하는 규칙이 이번 오류와 크게 관련되어 있으며,
l 방법을 사용하면,

Date 클래스의 인스턴스는 ja.date.formats 부하의 포맷을,
Time 클래스의 인스턴스는 ja.time.formats 부하의 포맷을,

각각 자동으로 찾아가는 사양이 되어 있습니다. (아마도

그래서 이번 오류는 l @user.created_at, format: :ja_ymd인수가 ActiveSupport::TimeWithZone 클래스이므로 Rails가 ja.time.formats 부하를 찾으러 갔는데,ja_ymd 형식이 정의되지 않았기 때문입니다.

해당 코드



config/locales/views/en.yml(오류 발생 시
ja:
  date:
    formats:
      ja_ymd: ! '%Y年%m月%d日' # ここを自動的に呼び出してくれると期待していた。
      ja_md: ! '%m月%d日'
      ja_ym: ! '%Y年%m月'
      hyphen: ! '%Y-%m-%d'
      wday: '(%a)'
  time:
    formats:
      ja_ymdhm: ! '%Y年%m月%d日 %H時%M分'
      hm: ! '%H:%M'
      ja_hm: ! '%H時%M分'
      ymdhm: ! '%Y/%m/%d %H:%M'
      mdhm: ! '%m/%d %H:%M'
      dot_ymd: ! '%Y.%m.%d'

config/application.rb
class Application < Rails::Application
  I18n.enforce_available_locales = true
  config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
  config.i18n.available_locales = :ja
  config.i18n.default_locale = :ja
end

app/views/users/show.html.erb
<td>
  <%= l @user.created_at, format: :ja_ymd %>  # ここでエラー発生        なぜならja.time.formats配下にja_ymdが定義されていないから。
  <%= l @user.created_at, format: :ja_hm %>   # ここはエラーが発生しない なぜならja.time.formats配下にja_hmが定義されているから。
</td>

콘솔에서 확인



콘솔
[2] pry(main)> @user.created_at.class
=> ActiveSupport::TimeWithZone
[3] pry(main)> I18n.l(Date.today, format: :ja_ymd)
=> "2021年09月22日"
[4] pry(main)> Date.today.class
=> Date
[5] pry(main)> I18n.l(Time.now, format: :ja_ymd) # エラー発生
I18n::MissingTranslationData: translation missing: ja.time.formats.ja_ymd
from /usr/local/bundle/gems/i18n-1.8.10/lib/i18n.rb:374:in `handle_exception`
[6] pry(main)> Time.now.class 
=> Time # なぜならTimeクラスだから

해결책



config/locales/views/en.yml(수정
ja:
  date:
    formats:
      ja_ymd: ! '%Y年%m月%d日'
      ja_md: ! '%m月%d日'
      ja_ym: ! '%Y年%m月'
      hyphen: ! '%Y-%m-%d'
      wday: '(%a)'
  time:
    formats:
      ja_ymdhm: ! '%Y年%m月%d日 %H時%M分'
      ja_ymd: ! '%Y年%m月%d日' # time配下に追記
      hm: ! '%H:%M'
      ja_hm: ! '%H時%M分'
      ymdhm: ! '%Y/%m/%d %H:%M'
      mdhm: ! '%m/%d %H:%M'
      dot_ymd: ! '%Y.%m.%d'

참고





끝까지 읽어 주셔서 감사합니다!

좋은 웹페이지 즐겨찾기