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!
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 ... –
Cześć! Nie przeważam 'trans' w module (zrobiłem wyszukiwanie w Eclipse). Czy jest to możliwe z powodu zmiany nazwy? – Caumons
'_' 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. –