2009-06-19 9 views
0

django-admin.py makemessages stirbt mit Fehlern "Warnung: ungekündigten string" auf Fälle, in denen wirklich lange Ketten gewickelt werden:Fehler in "django-admin.py Makemessages" oder Xgettext-Aufruf? -> "Warnung: ungekündigten string"

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

Diese Strings brauchen noch nicht einmal übersetzt werden - zB SQL-Abfragezeichenfolgen. Das Problem verschwindet, wenn ich die Zeichenfolge verkette, aber das Ergebnis sieht hässlich aus und es braucht Zeit, sie zu verbinden ...

Hat jemand ein Problem wie dieses? Hast du einen Weg gefunden, es zu reparieren?

Ich habe folgende Versionen der beteiligten Werkzeuge:

xgettext-0,17, gettext-0,17, django-1.0.2, Python-2.6.2

Es gab eine ticket zu diesem Thema, aber Es wurde wahrscheinlich geschlossen, weil der Fehler nur in einer Kombination von Komponentenversionen auftritt.

EDIT: gefunden die Quelle des Problems - xgettext druckt Warnmeldungen an sterr und django nimmt sie als fatale Fehler und beendet.

Rückgabestatus von xgettext Anruf ist 0 - "Erfolg". Ich denke, dass Django es als Erfolg erkennen und nicht wegen Warnungen abbrechen sollte.

Interestinly xgettext extrahiert noch Backslash umwickelten Saiten, wenn sie müssen übersetzt werden, sondern gibt Warnungen in stderr ("ungekündigten string") und .po-Datei („internationalisierte Meldungen sollten nicht enthalten die` \ r escape‘ Sequenz“)

xgettext Anruf ist die folgende:

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 

von django genannt/core/Management/Befehle/makemessages.py

Antwort

2

Ich kann mir zwei Möglichkeiten vorstellen: Sie könnten nach dem Backslash am Ende der Zeile ein zusätzliches Leerzeichen haben; oder Sie könnten irgendwie mit den falschen Zeilenendenzeichen in Ihrer Quelle enden (z. B. Windows-Stil, wenn Ihr Python Unix-Stil erwartet, wodurch die Backslashes deaktiviert werden).

So oder so würde ich in Anspruch nehmen C-Stil automatische String-Verkettung:

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

Alternativ, wenn Sie dort enden nicht Zeilenumbrüche dagegen, verwenden Sie mehrzeiligen Strings:

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

IMO diese sehen viel schöner aus, und sind viel weniger anfällig beim Refactoring.

Hilft das?

+0

@chrispy Das hilft, danke. Nur doppelt überprüft - ich habe keinen Platz nach Backslash. Es ist entweder Django oder Xgettext, die den Backslash String Wrapping nicht erhalten. – Evgeny

+0

Von Ihrer nachfolgenden Bearbeitung über bin ich ziemlich zuversichtlich, dass es ein Zeilenende-Problem ist. Versuchen Sie einen Editor, mit dem Sie das Unix-Dateiformat anstelle von Windows angeben können. –

Verwandte Themen