2006年09月15日

gettext 0.15更新に伴う複数形検査の厳密化と対策

先週のi18n meetingにて、Denis Barbierに「ja.po訳者に連絡しろ」とリストまで送り付けられて尻を叩かれたので、先先日から各方面のja.po訳者にコンタクトを取って更新をお願いした。ただ、Debianパッケージに存在しているパッケージでないと表に現れないので、見逃されているものは多いと思われる。ということで、ここでまとめておこう。未連絡の、該当される訳者の方には更新をお願いしたい。

gettext 0.15 以降では検査がより厳密になり、もし ja.po に複数かつ同内容の plural (複数形) フォームがある場合、「msgfmt -c ja.po」が次のようなエラーを返すようになっている。

ja.po:1969: `msgid' と `msgstr[0]' で指定した形式の数が合っていません
    あるいは
ja.po:16: nplurals = 1...
ja.po:287: ...but some messages have 2 plural forms

もっとも簡単な対策は、次のように同一内容の[1]のほうを削除する。

msgid "{0} more minute is needed on the media."
msgid_plural "{0} more minutes are needed on the media."
msgstr[0] "そのメディアの場合は {0}分以上かかります"
msgstr[1] "そのメディアの場合は {0}分以上かかります"
          ↓
msgid "{0} more minute is needed on the media."
msgid_plural "{0} more minutes are needed on the media."
msgstr[0] "そのメディアの場合は {0}分以上かかります"

ただし、msgid側で{0}なし、msgid_plural側で{0}ありだと、この対策だけではうまくいかないので、適当にmsgstr[0]、msgstr[1]を調整する必要がありそうである。いずれにせよ、ほかにもいろいろ検査は増えているようなので、gettext 0.15でmsgfmt -cして試すことをお勧めする。

なお、mo/poは相互変換可能なので、現在の/usr/share/locale/ja/LC_MESSAGES/にあるmoからunmsgfmt→msgfmt -cして調べることも可能である。