Я подозреваю, что проблема вызвана тем, что _("string")
возвращает строку байтов, а не строку Unicode.
Очевидный обходной путь:
parser = optparse.OptionParser(
description=_('automates the dice rolling in the classic game "risk"').decode('utf-8'),
usage=_("usage: %prog attacking defending").decode('utf-8'))
Но это неправильно.
ugettext или install (True) может помочь.
Документы gettext Python дают следующие примеры:
import gettext
t = gettext.translation('spam', '/usr/share/locale')
_ = t.ugettext
или
import gettext
gettext.install('myapplication', '/usr/share/locale', unicode=1)
Я пытаюсь воспроизвести вашу проблему, и даже если я использую install(unicode=1)
, я получаю строку байтов (тип str
).
Либо я неправильно использую gettext, либо в моем файле .po / .mo отсутствует объявление кодировки символов.
Я обновлюсь, когда узнаю больше.
xlt = _('automates the dice rolling in the classic game "risk"')
print type(xlt)
if isinstance(xlt, str):
print 'gettext returned a str (wrong)'
print xlt
print xlt.decode('utf-8').encode('utf-8')
elif isinstance(xlt, unicode):
print 'gettext returned a unicode (right)'
print xlt.encode('utf-8')
(Еще одна возможность - использовать escape-коды или кодовые точки Unicode в .po-файле, но это не похоже на забаву.)
(Или вы можете посмотреть .po
файлы вашей системы, чтобы увидеть, как они обрабатывают не-ASCII символы.)