2013-05-12 10 views
5

Pracuję z Django 1.5.1 i doświadczam "dziwnego zachowania" przy tłumaczeniach. Używam ugettext i ugettext_lazy w tym samym pliku Python. Gdybym zorganizować importu jak:Funkcje ugettext i ugettext_lazy nie są rozpoznawane przez makemessages w Pythonie Django

from django.utils.translation import ugettext as trans 
from django.utils.translation import ugettext_lazy as _ 

lub

from django.utils.translation import ugettext as trans, ugettext_lazy as _ 

strun oznaczonych jako trans("string") są pomijane podczas uruchamiania komendy makemessages.

Jednakże, jeśli nie to zmień nazwę ugettext dobrze współpracuje z obiema wersjami:

from django.utils.translation import ugettext 
from django.utils.translation import ugettext_lazy as _ 

lub

from django.utils.translation import ugettext, ugettext_lazy as _ 

Teraz trans("string") działa dobrze.

Więc, czy ktoś wie, dlaczego zmiana nazwy importu powoduje, że funkcja o zmienionej nazwie nie jest wywoływana? Czy jest to faktyczne "ograniczenie" Pythona, którego nie znałem podczas zmiany nazwy więcej niż jednej funkcji w tym samym module?


UPDATE

Po kilku testach, zdałem sobie sprawę, że nawet utworzenie pustej moduł Pythona wewnątrz aplikacji z następującego kodu nie działa:

from django.utils.translation import ugettext_lazy as translate 

a = translate("string") 

jednak , jeśli używasz _ dla aliasu działa:

from django.utils.translation import ugettext_lazy as _ 

a = _("string") 

Moja konkluzja jest: Można używać tylko _ alias ugettext i ugettext_lazy (lub innych związanych funkcji translacji) w Django albo nie zostanie rozpoznany przez makemessages polecenia. Techniczne wyjaśnienie można znaleźć w odpowiedzi Roberta Lujo.

Dzięki!

+0

Można „zmień”, jak wiele symboli (funkcja lub cokolwiek), jak chcesz, Python nazwy są po prostu aliasami, a obie formy importu (jedna liniowa lub dwie liniowce) są równoważne, więc problem jest gdzie indziej. FWIW Podejrzewam, że ponownie powiążesz nazwę "trans" z czymś innym po imporcie ... –

+0

Cześć! Nie przeważam 'trans' w module (zrobiłem wyszukiwanie w Eclipse). Czy jest to możliwe z powodu zmiany nazwy? – Caumons

+0

'_' jest poprawną nazwą Pythona i nie ma mocy magicznej. wrt/renaming, 'from x import y as z' jest dokładnym odpowiednikiem' from x import y; z = y; del y'io, więc znowu nie dzieje się nic magicznego. wrt/twoje stwierdzenie, że "nie przesłonisz' trans' ", proste wyszukiwanie tekstu może nie wystarczyć. Bardzo powszechnym (anty) wzorcem jest nadpisanie importu gwiazd, tj. 'From x import y; from z import * ', gdzie zdarza się, że' z' również eksportuje symbol 'y'.Ponadto, jeśli nie znasz Pythona, funkcja Pythona nie jest dostępna w odizolowanym obszarze nazw, są to zwykłe zmienne. –

Odpowiedz

19

Django makemessages użytkowych polecenie wewnętrznie wywołuje xgettext Program tak:

cmd = (
    'xgettext -d %s -L Python %s %s --keyword=gettext_noop ' 
    '--keyword=gettext_lazy --keyword=ngettext_lazy:1,2 ' 
    '--keyword=ugettext_noop --keyword=ugettext_lazy ' 
    '--keyword=ungettext_lazy:1,2 --keyword=pgettext:1c,2 ' 
    '--keyword=npgettext:1c,2,3 --keyword=pgettext_lazy:1c,2 ' 
    '--keyword=npgettext_lazy:1c,2,3 --from-code UTF-8 ' 
    '--add-comments=Translators -o - "%s"' % 
    (domain, wrap, location, work_file)) 

(źródło można znaleźć here). Tak, niektóre słowa kluczowe są predefiniowane przez narzędzie xgettext (sprawdzić odniesienia dla --keyword):

  • w Pythonie - gettext, ugettext, dgettext, ngettext, ungettext, dngettext, _

a niektóre są dodają narzędzia django:

  • gettext_lazy, ngettext_lazy, ugettext_noop, ugettext_lazy, ungettext_lazy, pgettext, npgettext, pgettext_lazy, npgettext_lazy

Słowo kluczowe trans nie znajduje się w żadnym z tych zestawów słów kluczowych, więc nie należy go używać do oznaczania tekstów tłumaczeń.

+0

Dzięki za odpowiedź, właśnie zaktualizowałem moje pytanie po dalszych testach. – Caumons

+0

To był dokładnie problem! Zmieniłem nazwy funkcji 'ugettext' i' ugettext_lazy' przy użyciu aliasu, który nie został uwzględniony jako słowo kluczowe i dlatego został pominięty. To nie jest kwestia importu. Podsumowując, po prostu powiedz, że jedynym dozwolonym aliasem jest '_'. Dzięki za odpowiedź! :) – Caumons

0

Te uwagi na temat multi-language support for Django project mogą pozwolić Ci określić, co jest nie tak. Najprawdopodobniej zmiana nazwy nie jest podstawową przyczyną niepowodzenia.

Niektóre ostrzeżenia w tych notach:

  • Każdy szablon dla swojej strony internetowej musi załadować biblioteki tag i18n pomocą {% load %}

  • trzeba ręcznie utworzyć katalog lokalizacji przed uruchomieniem makemessages - że Zwykle tak się stało, jeśli nie dostaniesz komunikatu o błędzie

  • Pliki językowe muszą być skompilowane do plików .mo zanim je użyjesz - tak samo jak

EDIT

Na stronie i związanej z mojego postu, są one za pomocą tej składni w szablonach:

{% trans "Hello" %} 

jest to coś, co już próbował?

+0

Problem nie jest związany z tym, ponieważ używanie ugettext_lazy jako _ działa idealnie i używa ugettext bez aliasu. – Caumons

+0

Właśnie zaktualizowałem moje pytanie po dalszych testach. – Caumons

+0

Właśnie przyjąłem odpowiedź @ RobertLujo, ponieważ doskonale odpowiada na moje pytanie. Dzięki i tak :) – Caumons