Почему я получаю предупреждение о неименованных аргументах строки формата 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
только.
Надеюсь, что все проясняет.