2010-12-27 18 views
7

Da un segnale di salvataggio in Django voglio inviare una e-mail. La lingua dell'email deve essere impostata in base al contenuto che viene salvato (ha una bandiera lang). Come posso passare quella lingua all'assistente render_to_string di Djangos? Posso trovare solo le impostazioni della lingua per RequestContexts e non ci sono richieste o utenti disponibili qui.Come impostare la lingua nell'helper render_to_string?

Sinceramente Björn

+0

Ho appena incontrato qualcosa di simile durante l'esecuzione di uno script di gestione ... soluzione era quella di aggiungere can_import_settings e translation.activate run (settings.LANGUAGE_CODE) dopo. – benjaoming

+1

'translation.activate' ha funzionato anche per me (http: // stackoverflow.it/a/9283987 /) – dusan

risposta

1

appare come posso usare translation.activate (some_lang) prima di ogni messaggio che viene inviato. Non sono sicuro che sia efficiente o meno.

Vedo che è possibile inviare un'istanza di contesto a render_to_string. Se riesco a posizionare l'impostazione della lingua in quel contesto in qualche modo, sarebbe bello.

1

è possibile passare un Dictionnary personalizzato per render_to_string

render_to_string(template_name, dictionary=None, context_instance=None) 

la variabile di contesto predefinito per le lingue (visto in Django/middleware/context_processors.py) sono:

context_extras['LANGUAGES'] = settings.LANGUAGES 
context_extras['LANGUAGE_CODE'] = translation.get_language() 
context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi() 

quindi forse l'impostazione del LANGUAGE_CODE è sufficiente:

render_to_string('email-confirmation.html', {'LANGUAGE_CODE':'en'}) 

il tuo modello dovrebbe sembrare lik e questo:

{% load i18n %} 
{% trans "Welcome to our new webapp" %} 

Naturalmente avrete a che fare con i file .po, ma si deve essere consapevoli di che (se non controllare this)

Spero che questo aiuti.

10

risposta sulla base di Django docs:

from django.template.loader import render_to_string 
from django.utils import translation 

(...) 

cur_language = translation.get_language() 
try: 
    translation.activate(some_language) 
    text = render_to_string('email-confirmation.html') 
finally: 
    translation.activate(cur_language) 

E citando la documentazione (sottolineatura mia):

è possibile caricare un catalogo di traduzioni, attivarlo e tradurre il testo di lingua di vostra scelta, ma ricorda di tornare alla versione originale lingua, poiché l'attivazione di un catalogo di traduzione avviene su per-thread e tale modifica influirà sul codice in esecuzione nello stesso thread.

+0

Questo ha funzionato perfettamente per me, mentre cercavo di impostare LANGUAGE_CODE ecc in un nuovo oggetto Context (come suggerito in altre risposte) no. –

1

Da the documentation Ho trovato questo modo più bello:

per aiutare a scrivere codice più conciso, v'è anche un django.utils.translation.override contesto manager() che memorizza la lingua corrente in ingresso e ripristina all'uscita. Con esso, l'esempio precedente diventa:

from django.utils import translation 

def welcome_translated(language): 
    with translation.override(language): 
     return translation.ugettext('welcome') 
Problemi correlati