QA@IT

Rails の config/locales/ja.yml での ! の機能とは?

4880 PV

i18n_generators gem を使うとconfig/locales/ja.yml で、以下のような I18n.l 用のフォーマットが設定されます。この ! (ビックリマーク)は何を意味するのでしょうか。なくても、I18n.l メソッドの出力は同じなのではないかと思います。

ja:
  date:
    ...
    formats:
      default: ! '%Y/%m/%d'
      long: ! '%Y年%m月%d日(%a)'
      short: ! '%m/%d'

プログラマーのための YAML 入門 (初級編) には ! にかんして、データの型の明示的な指定に使うとあるのですが、今回の例では ! を !str というように使っていないため、関係ないように思えます。

回答

同じ事を疑問に思って調べてみました。

http://stackoverflow.com/questions/9664113/what-does-a-single-exclamation-mark-do-in-yaml

に以下のようにあります。

none    : Unspecified tag (automatically resolved by application).
'!'     : Non-specific tag (by default, "!!map"/"!!seq"/"!!str").

これだけだとはっきり意味がわかりませんが、ja.yamlで「!」がついているところは記号から始まっている文言に限っているようなので、やはり質問にあるように !!strである事を明示するために使っているのでは無いかと思います。

編集 履歴 (0)
  • そうだったのですね。すっきりしました。回答をありがとうございます。 -

正確に把握しているわけではないのですが、自分も気になって調べたときにstackoverflow に同じ記事を発見したので、ポインタにでもなればと思い回答します。
ですのでツッコミがありましたら歓迎します。

!はYAMLの記号が行頭に来たときに、ただの文字列・ハッシュ・配列として扱うよう指定するための記号のようです。

この場合は文字列の先頭に%が来ていますが、これがDirective indicatorでないことを明示しているのではないかと。

編集 履歴 (0)
  • 回答をありがとうございます。ついさきほど、u1tnk さんからも同じ stackoverflow の URL を教わったところでした!

    ただ、"%" がディレクティブという解釈は のは、文脈的にぴんときませんでした。

    参考) http://www.yaml.org/spec/1.2/spec.html#directive/
    -
  • "%" は、きっとRails の解釈の過程のどこかで strftime にわたされて、そのとき用なのではないかと思います。違うかもしれません。

    参考) http://rurema.clear-code.com/1.9.3/method/Time/i/strftime.html
    -
  • 回答する際にリロードしてませんでした、すみませんー。

    > "%" は、きっとRails の解釈の過程のどこかで strftime にわたされて、そのとき用なのではないかと思います。

    そのとおりですね、`%Y`はstrftime用です。
    ロケールのファイルはYAMLとしてパースされたのちstrftimeに渡されるので、YAMLで解釈されないよう`!`で指定しているのだと思います。
    -
  • 「これがDirective indicatorでないこと」を「であること」と誤読してました... -
ウォッチ

この質問への回答やコメントをメールでお知らせします。