2011-09-21 10 views
36

Nei modelli Django, è possibile utilizzare {{ _("Hello World") }} o {% trans "Hello World" %} per contrassegnare le stringhe da tradurre. In docs, l'approccio "ufficiale" sembra essere il tag {% trans %}, ma la sintassi _() è menzionata anche once._() o {% trans%} nei template di Django?

Come questi approcci differiscono (eccetto la sintassi) e perché dovrebbe essere preferibile piuttosto che l'altro?

Una differenza è che ovviamente non si può utilizzare {% trans %} con i tag e filtri. Ma questo significa che posso semplicemente usare _() ovunque, come {{ _("String") }}? Funziona e sembra molto più pulito e più coerente rispetto all'utilizzo di {% trans "String" %} con stringhe standalone e _() con tag e filtri.

risposta

42

Quindi sembra che tecnicamente non ci siano differenze a partire da Django 1.5. template engine segna internamente una variabile per la traduzione (impostando il suo attributo translate) in due casi:

Successivamente, quando la variabile è essere resolved, Django avvolge con ugettext o pgettext se vede l'attributo translate.

Tuttavia, come si può vedere dal codice sorgente, ci sono alcune considerazioni di flessibilità per {% trans %} tag:

  • si può fare {% trans "String" noop %}, che metterà la stringa per la traduzione in file .po, ma ha vinto in realtà traduce l'output durante il rendering (nessun attributo interno translate sulla variabile, nessuna chiamata ugettext);
  • è possibile specificare contesto del messaggio *, come {% trans "May" context "verb" %};
  • è possibile inserire il messaggio tradotto in una variabile per un utilizzo futuro *, come {% trans "String" as translated_string %}.

* A partire da Django 1.4.

Non esitate a correggermi o inviare una risposta migliore nel caso in cui mi manca nulla.

+1

+1 per andare alla fonte per verificarlo. –

1

Il tag del modello trans chiama la funzione ugettext(). In Django _() è un alias ugettext(). Questo è coperto nel django docs.

+2

Sono consapevole che '_()' è usato, per convenzione, come alias di 'ugettext()' _in Python code_, ma non nei template. E dal momento che non tutti inseriamo qualcosa come 'from django.utils.translation import ugettext as _' nei nostri template, non è chiaro come funzioni esattamente il carattere di sottolineatura. – Tony