LoginSignup
6
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-10-08

この間思いついた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ファイル自体も読やすくなる気がするので、良ければお試し下さい。

6
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
4