2013-05-12 7 views
5

Sto lavorando con Django 1.5.1 e sto sperimentando un "comportamento strano" con le traduzioni. Sto usando ugettext e ugettext_lazy nello stesso file Python. Se organizzo le importazioni come:funzioni ugettext e ugettext_lazy non riconosciute dai makemessages in Python Django

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

o

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

Le corde contrassegnate come trans("string") vengono saltati durante l'esecuzione makemessages comando.

Tuttavia, se non rinominare il ugettext funziona bene con entrambe le versioni:

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

o

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

Ora trans("string") funziona bene.

Quindi, qualcuno sa perché questa rinomina dell'importazione sta causando la chiamata della funzione rinominata? Si tratta di una vera e propria "limitazione" Python che non conoscevo quando si rinominava più di una funzione all'interno dello stesso modulo?


UPDATE

Dopo alcune prove, mi sono reso conto che anche la creazione di un modulo python vuoto all'interno di un app con il seguente codice non funziona:

from django.utils.translation import ugettext_lazy as translate 

a = translate("string") 

Tuttavia , se si utilizza _ per l'alias funziona:

from django.utils.translation import ugettext_lazy as _ 

a = _("string") 

mio conclusione è: È possibile utilizzare solo l'alias _ per ugettext e ugettext_lazy (o qualsiasi altra funzione di traduzione correlato) in Django altrimenti non sarà riconosciuto dal makemessages comando. La spiegazione tecnica può essere trovata nella risposta di Robert Lujo.

Grazie!

+0

si può "rinomina", come molti simboli (funzione o altro) come si desidera, Python i nomi sono solo alias e entrambe le forme di importazione (una riga o due righe) sono equivalenti, quindi il problema è altrove. FWIW Sospetto fortemente che tu ricolleghi il nome "trans" a qualcos'altro dopo l'importazione ... –

+0

Ciao! Non sto eseguendo l'override di 'trans' nel modulo (ho fatto una ricerca con Eclipse). Potrebbe essere possibile a causa della "_" ridenominazione? – Caumons

+0

'_' è un nome Python valido e non ha poteri magici. wrt/rinominare, 'da x import y as z' è l'equivalente esatto di' from x import y; z = y; così da qui non succede nulla di magico. wrt/la tua affermazione che "non stai sovrascrivendo' trans' ", una semplice ricerca di testo potrebbe non essere sufficiente. Un pattern (anti) molto comune è override di importazione delle stelle, cioè 'da x import y; da z import * ', dove capita che' z' esporti anche un simbolo 'y'.Inoltre, se non hai familiarità con Python, le funzioni di Python _don't_ vivono in uno spazio dei nomi isolato, sono variabili ordinarie. –

risposta

19

Django makemessages utilità di comando chiama internamente xgettext programma come questo:

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)) 

(fonte può essere trovato here). Così, alcune parole chiave sono predefiniti dal xgettext utility (controllare riferimento per --keyword):

  • per Python - gettext, ugettext, dgettext, ngettext, ungettext, dngettext, _

e alcuni sono aggiunto dal programma di utilità django:

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

Parola chiave trans non è in nessuno di questi gruppi di parole chiave, quindi non è consigliabile utilizzarlo per contrassegnare i testi per le traduzioni.

+0

Grazie per la tua risposta, ho appena aggiornato la mia domanda dopo ulteriori test. – Caumons

+0

Questo era esattamente il problema! Stavo rinominando le funzioni 'ugettext' e' ugettext_lazy' usando un alias che non è incluso come parola chiave e quindi è stato saltato. Non è una questione di importazioni. Quindi, per concludere, basta dire che l'unico alias consentito è '_'. Grazie per la tua risposta! :) – Caumons

0

Queste note su multi-language support for Django project potrebbero consentire di identificare ciò che è sbagliato. Molto probabilmente la rinomina non è la causa principale del fallimento.

Alcune avvertenze in queste note:

  • Ogni modello per il tuo sito web deve caricare la libreria di tag i18n usando il {% load %}

  • È necessario creare manualmente la directory locale prima di eseguire makemessages - che lo hai fatto normalmente, altrimenti riceverai un messaggio di errore

  • I file di lingua devono essere compilati nei file .mo prima di utilizzarli - che hai fatto anche tu

EDIT

Nella pagina ho collegato al mio post, stanno usando questa sintassi nei modelli:

{% trans "Hello" %} 

è qualcosa si è tentato già?

+0

Il problema non è legato a questo, poiché l'uso di ugettext_lazy as _ funziona perfettamente e utilizza ugettext anche senza alias. – Caumons

+0

Ho appena aggiornato la mia domanda dopo ulteriori test. – Caumons

+0

Ho appena accettato la risposta di @ RobertLujo mentre risponde perfettamente alla mia domanda. Grazie comunque :) – Caumons

Problemi correlati