読者です 読者をやめる 読者になる 読者になる

gettext, ngettext

Python

 今日ハマったコードたち。

message = gettext("You have a message from %s" % username)
count = len(mails)
message = ngettext("%d mail selected" % count, "%d mails selected" % count, count)


 なぜ意図した通り、日本語が表示されないだろうと結構な時間を使ってしまったのですが、正しくはこう。

message = gettext("You have a message from %s") % username
count = len(mails)
message = ngettext("%d mail selected", "%d mails selected", count) % count


 gettext, ngettextに与える文字列に対してではなく、それらが返した文字列に対して、format引数を評価するようにしなくてはならないのですね。かなり基本的な間違いっぽい。


 さらに言うならば、各国語ロケールを作っていると、どのプレースホルダーに何を入れるかがよく分からなくなってくるので、辞書型を与えるようにした方が管理し易そうだと思いました。

message = gettext("You have a message from %(username)s") % { 'username': username }
count = len(mails)
message = ngettext("one mail selected", "%(mail_count)d mails selected", count) % { 'mail_count': count }