getQuantityStringを使って単数形/複数形/ 0のテキストを呼び分けるというのは良くある状況だと思う。
この時、単純に「%d」を一つ使うだけなら問題ないのだけど、「%1$d %2%s」等引数の位置を指定する時に罠にはまる。
getQuantityStringには「リソース IDと quantityによる切り分けのために数値、その他の引数」を指定するわけだけど、「%1$d %2%s」などで指定する引数に切り分けのための数値は含まれないという点が罠。
以下のように呼び出す時
getQuantityString(R.plurals.PhotoCount_Format,PicCount,NumberFormat.getInstance().format(PicCount)));
対応する xmlは以下のように書きたくなるけど…
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="PhotoCount_Format">
<item quantity="zero">no photo</item>
<item quantity="one">1 photo</item>
<item quantity="other">%2$s photos</item>
</plurals>
</resources>
正解は以下のようになる。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<plurals name="PhotoCount_Format">
<item quantity="zero">no photo</item>
<item quantity="one">1 photo</item>
<item quantity="other">%1$s photos</item>
</plurals>
</resources>
もう一点罠が。
itemタグの quantityプロパティの値として、「zero」が有効であり、「0 photos」の代わりに「no photo」という事が可能なのかと思いきや…
実際には oneと otherしか機能していないように見える。
どういう事かと調べてみると、String Resources | Android Developersに行き着いて、「文法上必要な場合にのみ切り分ける」的なことが書いてある。
要は「英語の文法上 1 booksは駄目だけど 0 books,2 booksは有効なので oneと otherは見るけど、zeroは見ないよ」という事らしい。
Issue 8287 – android – PluralRules does not handle quantity "zero" – Android Open Source Project – Issue Tracker – Google Project Hostingとか見ると「そういう仕様ならそもそも現在の仕様じゃ対応できない言語があるじゃん」とか突っ込まれてるよね。
とりあえず紹介されている android-i18n-pluralsを使って逃げることにする。