ошибка в "django-admin.py makemessages" или вызов xgettext? -> «предупреждение: неопределенная строка» - PullRequest
0 голосов
/ 20 июня 2009

django-admin.py makemessages умирает с ошибками «предупреждение: неопределенная строка» в случаях, когда переносятся действительно длинные строки:

string = "some text \
          more text\
          and even more"

Эти строки даже не нужно переводить - например, строки запроса sql. Проблема исчезает, когда я объединяю строку, но результат выглядит ужасно, и для их объединения требуется время ...

У кого-нибудь есть такая проблема? Вы нашли способ это исправить?

У меня есть следующие версии инструментов:

xgettext-0.17, gettext-0.17, django-1.0.2, python-2.6.2

Был тикет по этому вопросу, но он был закрыт, вероятно, потому что ошибка появляется только в некоторой комбинации версий компонента.

РЕДАКТИРОВАТЬ: обнаружен источник проблемы - xgettext печатает предупреждающие сообщения на sterr, а django принимает их как фатальные ошибки и завершает работу.

возвращаемый статус вызова xgettext - 0 - «успех». Я думаю, что Django должен признать это как успех, а не выйти из-за предупреждений.

Интересно, что xgettext по-прежнему извлекает строки с обратной косой чертой, если они должны быть переведены, но выдает предупреждения в stderr ( "неопределенная строка" ) и .po файле ( "интернационализированные сообщения не должны содержать `\ r 'escape-последовательность" )

Вызов xgettext следующий:

xgettext -d django -L Python --keyword=gettext_noop \
         --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 \
         --keyword=ugettext_noop --keyword=ugettext_lazy \
         --keyword=ungettext_lazy:1,2 
         --from-code UTF-8 -o - source_file.py

вызывается из django / core / management / commands / makemessages.py

1 Ответ

2 голосов
/ 20 июня 2009

Я могу представить две возможности: после обратной косой черты в конце строки у вас может быть дополнительное пространство; или вы можете каким-то образом получить неправильные символы конца строки в своем источнике (например, стиль Windows, когда ваш Python ожидает стиль Unix, таким образом отключая обратную косую черту).

В любом случае, я бы воспользовался автоматической конкатенацией строк в стиле C:

>>> string = ("some text "
...           "more text "
...           "and even more")
>>> string
'some text more text and even more'

В качестве альтернативы, если вы не возражаете, переводы строк заканчиваются там, используйте многострочные строки:

>>> string = """some text
...             more text
...             and even more"""

IMO они выглядят намного приятнее и гораздо менее хрупки при рефакторинге.

Помогает ли это?

...