Почему я получаю предупреждение о неименованных аргументах строки формата msgid (только) при запуске mki18n.py для gettext на wxPython

Пытаясь запустить скрипт mki18n.py в моем коде Python, я получаю предупреждение в этой строке:

 >>> dlg = wx.MessageDialog(None, str (_("Attached device is \"%s\",\nschedule file header is for \"%s\"") % (rt_model, line)), _("Device mismatch"), wx.OK | wx.ICON_ERROR)

который тогда дает это:

warning: 'msgid' format string with unnamed arguments cannot be properly localized:
         The translator cannot reorder the arguments.
         Please consider using a format string with named arguments,
         and a mapping instead of a tuple for the arguments.

Скрипт mki18n.py не любит наличие двух последовательных s%, но я не могу расшифровать то, что написано в предупреждающем сообщении. В противном случае (запуск моей программы без заботы о i18n) я не получаю ошибок, и это диалоговое окно всегда отображается нормально.

Что не так в этой строке? (что можно улучшить?)

редактировать Используя geni18n.py (и связанный с ним файл из пакета i18nwxapp), я получаю ожидаемый результат без ошибок (т.е. создаю файл.pot для перевода). Тем не менее, я не знаю, есть ли проблема в моем коде, которую допускает geni18n, или есть ли у mki18n проблема, которая вызывается моей конкретной строкой кода (?).

1 ответ

Решение

Таким образом, в основном в сообщении говорится, что переводчик будет испытывать трудности при переупорядочении переменных, если он / она нуждается в этом. Итак, рассмотрим следующее:

my_string = "Hello %s, it is %s o'clock." % ('Foo', 'two')

Теперь предположим, что переводчик нуждается в two первый и Foo второй:

translated_string = "It is %s o'clock, Mr. %s" % ('Foo', 'two')

Без использования format string with named arguments, Foo все равно пойдет в первый %s, таким образом, давая вам:

print translated_string
# Output: It is Foo o'clock, Mr. two.

Чтобы решить проблему, просто используйте named arguments, Таким образом, приведенный выше пример будет:

my_string = "Hello %(person)s, it is %(time)s o'clock." % ({
    'person':'Foo', 
    'time':'two'
})

translated_string = "It is %(time)s o'clock, Mr. %(person)s" % ({
    'person':'Foo', 
    'time':'two'
})

Таким образом, переводчик может поставить person а также time где бы он ни хотел. Это также дает им представление о том, что представляет собой переменная, о которой они бы не узнали, если бы вы использовали %s только.

Надеюсь, что все проясняет.

Другие вопросы по тегам