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