Come posso ottenere la lingua corrente in Django?


93

Come posso ottenere la lingua corrente nel thread corrente in un modello o nell'amministratore?


5
Per favore sii specifico. "La lingua del mio web": intendi la richiesta web, il server web o cosa?
mikemaccana

Risposte:


139

Le funzioni di particolare interesse sono django.utils.translation.get_language()che restituiscono la lingua utilizzata nel thread corrente. Vedere la documentazione .


2
Avvertenza: restituisce None se le traduzioni sono temporaneamente disattivate (da disable_all () o quando None viene passato a override ()). Prima di Django 1.8, get_language () restituiva sempre LANGUAGE_CODE quando le traduzioni venivano disattivate.
Pieter

89

Oppure puoi anche ottenere questo nelle tue visualizzazioni

request.LANGUAGE_CODE

6
Ho votato a favore (da -1 per qualche motivo). Nota quanto segue (da docs.djangoproject.com/en/dev/topics/i18n/deployment/… "con traduzione statica (senza middleware), la lingua è nelle impostazioni.LANGUAGE_CODE, mentre con la traduzione dinamica (middleware), è in request.LANGUAGE_CODE. "
Alexander Marquardt

4
Quel collegamento è morto e non vedo alcun motivo per non utilizzare la soluzione accettata documentata sopra:django.utils.translation.get_language()
qris

4
cercare di ottenere la lingua, ad esempio, nei modelli non sarebbe possibile se non ci sono ancora richieste. Penso che django.utils.translation.get_language()sia sempre una soluzione migliore.
Hussam

Che ne dici di ottenere la lingua corrente in un modello?
azmeuk


37

Fai attenzione al metodo che usi per ottenere la lingua . A seconda del metodo, Django utilizzerà modi e informazioni diversi per determinare la lingua giusta da usare.

Quando si utilizza la django.utils.translation.get_language()funzione, è collegata alla lingua del thread . Prima di Django 1.8, veniva sempre restituito settings.LANGUAGE_CODEquando le traduzioni erano disabilitate. Se vuoi sovrascrivere manualmente il linguaggio del thread, puoi usare le funzioni override()o activate(), che non è molto esplicitamente chiamato, ma beh, ancora utile:

from django.utils import translation

with translation.override('fr'):
    print(_("Hello")) # <= will be translated inside the with block

translation.activate('fr') # <= will change the language for the whole thread.
# You then have to manually "restore" the language with another activate()
translation.activate('en') # <= change languages manually

Se vuoi che django controlli il percorso e / o la richiesta (cookie della lingua, ...) , che è molto più comune ad es. www.example.com/en/<somepath>Vs www.example.com/fr/<somepath>, usa django.utils.translation.get_language_from_request(request, check_path=False). Inoltre, restituirà sempre una lingua valida impostata insettings.LANGUAGES

Non ho trovato molto facile trovare queste differenze tramite Google su questo argomento, quindi eccolo qui per ulteriore riferimento.


Nota che lo è django.utils.translation, non le traduzioni. C'è un errore di ortografia nel collegamento fornito. Nello snippet è corretto.
J0ANMM

4
+1 per la differenza tra django.utils.translation.get_language()e django.utils.translation.get_language_from_request(request, check_path). Se in vista, dovresti usare quest'ultimo con check_path = Trueper ottenere la lingua in cui verrà visualizzato il tuo modello.
Ondrej Skalicka

7

Solo per aggiungere che, se si utilizza, django.utils.translation.get_language()è necessario tenere presente che se quella sezione di codice verrà chiamata in modo asincrono (ad esempio come attività di sedano), questo approccio non funzionerà perché viene eseguito in un thread diverso.


2
L'approccio ovvio qui sarebbe passare la lingua come parametro
dell'attività

1

puoi usare questo

from django.utils import  translation
translation.get_language()

Già risposto da micha480. La tua risposta non aggiunge alcun valore.
Samuel Dauzon,

0

È possibile leggere le localeinformazioni sulla lingua del sistema .


5
Sei moderato a -3, ma penso che la domanda sia vaga: "la lingua corrente del mio web". Non è colpa tua se indovini questo significa OS.
mikemaccana
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.