imposta la lingua in una vista di Django

background: la vista viene richiamata quando un servizio di pagamento esegue il ping dei risultati dietro le quinte, dopodiché devo inviare un’email nella lingua corretta per confermare il pagamento e così via. Posso recuperare il codice della lingua nella richiesta dal server di pagamento e vorrei utilizzarlo insieme ai sistemi i18n di Django per determinare in quale lingua inviare le mie email.

Quindi ho bisogno di impostare la lingua della mia app django da una vista. E poi esegui il rendering del modello e l’invio via email tutto in una volta.

setting request.session['django_language'] = lang solo la vista successiva quando request.session['django_language'] = lang test.

c’è un altro modo per farlo?

Saluti,

    Tipo

    Per citare parti dal locale di Django’s Middleware ( django.middleware.locale.LocaleMiddleware ):

     from django.utils import translation class LocaleMiddleware(object): """ This is a very simple middleware that parses a request and decides what translation object to install in the current thread context. This allows pages to be dynamically translated to the language the user desires (if the language is available, of course). """ def process_request(self, request): language = translation.get_language_from_request(request) translation.activate(language) request.LANGUAGE_CODE = translation.get_language() 

    Il translation.activate(language) è il bit importante.

    Assicurati di aggiungere anche distriggersre in process_response, altrimenti avrai problemi con thread diversi.

     from django.utils import translation class LocaleMiddleware(object): """ This is a very simple middleware that parses a request and decides what translation object to install in the current thread context. This allows pages to be dynamically translated to the language the user desires (if the language is available, of course). """ def process_request(self, request): language = translation.get_language_from_request(request) translation.activate(language) request.LANGUAGE_CODE = translation.get_language() def process_response(self, request, response): translation.deactivate() return response 

    A volte si desidera applicare una determinata lingua per una determinata vista ma lasciare che le impostazioni della lingua del browser scelgano la lingua per il resto delle visualizzazioni. Non ho capito come cambiare la lingua nel codice della vista, ma puoi farlo implementando un semplice middleware

    lang_based_on_url_middleware.py:

     from django.utils import translation # Dictionary of urls that should use special language regardless of language set in browser # key = url # val = language code special_cases = { '/this/is/some/url/' : 'dk', '/his/is/another/special/case' : 'de', } class LangBasedOnUrlMiddleware(object): def process_request(self, request): if request.path_info in special_cases: lang = special_cases[request.path_info] translation.activate(lang) request.LANGUAGE_CODE = lang 

    In settings.py:

     MIDDLEWARE_CLASSES = ( ... 'django.middleware.locale.LocaleMiddleware', 'inner.lang_based_on_url_middleware.LangBasedOnUrlMiddleware', # remember that the order of LocaleMiddleware and LangBasedOnUrlMiddleware matters ... ) 

    Non è una soluzione elegante ma funziona.

    request.LANGUAGE_CODE se LocaleMiddleware è triggersto

    Puoi considerare di memorizzare la lingua nel modello utente e utilizzare questo middleware personalizzato django-user-language-middleware .

    Ciò consente una facile traduzione della tua app Django guardando la lingua selezionata nel campo user.language e puoi sempre conoscere la lingua preferita da qualsiasi utente.

    Uso:

    1. Aggiungi un campo di lingua al tuo modello utente:

       class User(auth_base.AbstractBaseUser, auth.PermissionsMixin): # ... language = models.CharField(max_length=10, choices=settings.LANGUAGES, default=settings.LANGUAGE_CODE) 
    2. Installa il middleware dal pip:

      pip install django-user-language-middleware

    3. Aggiungilo all’elenco delle classi del middleware nelle impostazioni per ascoltare le richieste:

       MIDDLEWARE = [ # Or MIDDLEWARE_CLASSES on Django < 1.10 ... 'user_language_middleware.UserLanguageMiddleware', ... ] 

    Spero che questo possa aiutare le persone ad affrontare questa domanda in futuro.

    Se vuoi solo ottenere le stringhe tradotte per una lingua per qualsiasi motivo, puoi usare l’ override come un decoratore come questo:

     from django.utils import translation from django.utils.translation import ugettext as _ with translation.override(language): welcome = _('welcome') 

    Se stai usando django 1.10 o versioni successive, c’è una nuova syntax per il middleware personalizzato:

     from django.utils import translation class LocaleMiddleware(object): def __init__(self, get_response): self.get_response = get_response def __call__(self, request): language_code = 'en' #TODO, your logic translation.activate(language_code) response = self.get_response(request) translation.deactivate() return response 

    Con le viste basate sulla class, questo dovrebbe funzionare:

     class YourView(SomeBuiltInView): def get(self, request, *args, **kwargs): setattr(request, 'LANGUAGE_CODE', 'YOUR_LANGUAGE_CODE') return super().get(self, request, *args, **kwargs) 

    Fondamentalmente tutto ciò che fai è fare in modo che il renderizzatore della vista pensi che la richiesta provenga da YOUR_LANGUAGE_CODE piuttosto che in origine.