Railsでリスト系の記述をスマートにi18n対応させる。

More than 1 year has passed since last update.

この間思いついたRailsでのi18n対応の方法をメモメモ。
どこぞにもっと良い方法があるかもしれないが、わりかしスマートで応用効くんじゃなかろうか。

やりたいこと

  • テキストの記述メインのページで、YAML内の日本語テキストを適切な箇所で改行(及びリスト化・段落分け・その他加工等)したい。
  • ja.ymlファイルにはHTMLを含みたくない。
  • viewファイルからいくつもt("〜")を呼び出してviewを汚したくない。

YAMLについての予備知識

  • 通常YAMLで使用するnew:などの記述はYAMLのハッシュである。
  • 配列としても- arrayのようにハイフンで記述できる。
  • 勿論配列の中に配列を入れることが可能。

詳しくは下記参照
プログラマーのための YAML 入門 (初級編)

YAMLの配列の配列を利用してループ表示するソース

Viewに対応するYAMLファイルを下記のように記述。

config/locales/views/members/registrations/ja.yml
ja: # ja.ymlのファイル
  members:
    registrations:
      new: # app/views/members/registrations/new.hamlに対応するview用YAML
        story:
          -
            - "序章"
            -
              - "ごにょごにょ"
          -
            - "1章"
            -
              - "1.いちばんめ。"
              - "2.にばんめ。"
          -
            - "2章"
            -
              - "おわり"

*ポイント

  • story:で配列の配列を呼び出している。
  • 配列の配列の中に本文の配列がある。

上記の記述で次のような配列が出来る。

[ ["序章",["ごにょごにょ"]] , ["1章",["1.いちばんめ。","2.にばんめ"]] , ["2章",["おわり"]] ]

Viewファイル(HAML)からループで呼び出し

app/views/members/registrations/new.html.haml"
- t(".story").each do |title, texts|
  %h3=title
  - texts.each do |text|
    %p=text
    %hr

*ポイント

  • パスに対応したymlで記述しているのでt(".story")で呼び出せる。
  • t(".story")は配列が返ってくるのでそのまま.eachが使える。
  • 配列の配列としてtextsを取り出して本文をリストとしてバラしている。

※HTML(ERB)での記述が嫌なのでHAMLを使用していますが同様に出来ます。

ブラウザ出力HTMLイメージ

HTML
<h3>序章</h3>
<p>ごにょごにょ</p>
<hr>
<h3>1章</h3>
<p>1.いちばんめ。</p>
<p>2.にばんめ。</p>
<hr>
<h3>2章</h3>
<p>おわり</p>
<hr>

文章量の多い『規約』だとかの文章で、ずらずら並べるときに有用かと思います。
一部だけ配列じゃなくてハッシュだったりになっているとエラーになりますのでお気をつけて下さい。
ymlファイル自体も読やすくなる気がするので、良ければお試し下さい。