Ruby
Rails
I18n
translation-missing

RailsでI18nにtrue/false のキーを設定するとtranslation missing

I18n

Railsで多言語化や、表示文言の統一などで用いるRuby のgemです。
詳しいことはネット上にたくさんわかりやすい記事がありますので省略させていただきます。

問題

さっそく表題にある問題について書いていきます。
ソースコードは以下のとおりです。

config/locales/ja.yml
ja:
  example:
    true: "おk"
    false: "だめ"
app/views/example.html.erb
<div>
  <%= t('example.true') %>
  <%= t('example.false') %>
</div>

「おk/だめ」が表示されるのを期待したのですが以下のようなエラーが発生。

translation missing: ja.example.true
translation missing: ja.example.false

設定がミスっていないことを確認して原因を調べると、同じ問題に直面している方とそれに対する解決策が見つかりました。
https://github.com/rails/rails/issues/27829

解決策

つまるところ、キーのtrue/false をダブルクォーテーションで囲めば上手くいきます。

config/locales/ja.yml
ja:
  example:
    "true": "おk"   # 'true'でもいいよ
    "false": "だめ"  # 'false'でもいいよ

yes/no でも同じ現象が起きるみたいですが、同じようにダブルクォーテーションで囲ってあげれば大丈夫みたいです。

「enumerizeのI18nではまったこと」
https://qiita.com/runamoon@github/items/d0a953afc25ea4e9365b

「YAML: Keys like "yes" or "no" evaluate to true and false」
https://makandracards.com/makandra/24809-yaml-keys-like-yes-or-no-evaluate-to-true-and-false

以上です。

メモ

表題について調べてる途中に、i18n の小技集という記事があったのでメモとして残させていただきます。意外にこういう細かいことは検索しても出てきにくいので、とてもありがたいです。先人に感謝です。

「i18nロケールファイルの書き方小技集」
https://qiita.com/tomomomo1217/items/858f290a0dc1a817985c