conf/messages
を書くときに、引数が 1 なら 1st, 2 なら 2nd, 3 なら 3rd, 4 なら 4th を出したい。
何もしなかった例
ranking={0}th
これでは 1th, 2th, 3th, 4th, になる。
解決法
Play の I18N は java.text.MessageFormat
を内部で使っているので、choice パターンを使うことができる。
ranking={0,choice,1#1st|2#2nd|3#3rd|3<{0,number,integer}th}
これで 1st, 2nd, 3rd, 4th, 5th, ... となる。
パターンの解釈
-
{
パターン開始 -
0,
最初の引数を対象にする -
choice,
次の選択肢から選ぶ -
1#1st
引数が 1 なら 1st -
|2#2nd
または引数が 2 なら 2nd -
|3#3rd
または引数が 3 なら 3rd -
|3<{0,number,integer}th
または引数が3より大きいなら、最初の引数を整数としてフォーマットして th をつけたもの -
}
パターン終了
どのパターンにも当てはまらない場合にどうなるか気になる。
choice
を指定した場合にはフォーマッタとして java.text.ChoiceFormat
が使われる。 ChoiceFormat には次のように書かれているので、きっとこれと同じ挙動だろう。
一致するものがない場合、数値 (X) が小さすぎるのか大きすぎるのかによって、最初または最後のインデックスが使用されます。
上で挙げたパターンに対して 0 を引数に与えると、最初のパターンより小さいので 1st が返される。
上記解決法がダメな場合
さて、既にお気づきだと思うが、20th までは大丈夫なものの 21st が望み通りに出せない。22nd, 23rd しかり。全パターンを書き出すことは不可能(無限)。
与えられる数の上限が決まっている場合や、ある程度大きい数の場合には後置文字列が間違ってても気にしない場合には使える。
もっと素敵な解決法はきっと誰かがコメントに書いてくれるだろう。
(すみません。書いてください。おねがいします。)