Como posso obter o idioma atual no Django?

92

Como posso obter o idioma atual no segmento atual em um modelo ou no admin?

diegueus9
fonte
5
Por favor, seja específico. 'O idioma da minha web' - você quer dizer a solicitação da web, o servidor da web ou o quê?
mikemaccana,

Respostas:

137

As funções de interesse particular são as django.utils.translation.get_language()que retornam o idioma usado no segmento atual. Veja a documentação .

micha480
fonte
2
Advertência: Retorna Nenhum se as traduções estão temporariamente desativadas (por deactivate_all () ou quando Nenhum é passado para override ()). Antes do Django 1.8, get_language () sempre retornava LANGUAGE_CODE quando as traduções eram desativadas.
Pieter
88

Ou você também pode obter isso em suas visualizações

request.LANGUAGE_CODE
Ignas Butėnas
fonte
6
Votei nisso (de -1 por algum motivo). Observe o seguinte (de docs.djangoproject.com/en/dev/topics/i18n/deployment/… "com tradução estática (sem middleware), o idioma está em settings.LANGUAGE_CODE, enquanto com tradução dinâmica (middleware), está em request.LANGUAGE_CODE. "
Alexander Marquardt
4
Esse link está django.utils.translation.get_language()
inativo
4
tentar obter o idioma em, por exemplo, modelos não seria possível se ainda não houvesse solicitação. Acho que django.utils.translation.get_language()é sempre a melhor solução.
Hussam
Que tal obter o idioma atual em um modelo?
azmeuk de
2
@azmeuk isso pode ser útil para você docs.djangoproject.com/en/dev/topics/i18n/translation/…
Ignas Butėnas
37

Tenha cuidado com o método que você usa para obter o idioma . Dependendo de qual método, Django usará diferentes formas e informações para determinar a linguagem correta a ser usada.

Ao usar a django.utils.translation.get_language()função, ela está vinculada à linguagem do thread . Antes do Django 1.8, ele sempre retornava settings.LANGUAGE_CODEquando as traduções eram desabilitadas. Se você deseja substituir manualmente a linguagem do thread, pode usar as funções override()ou activate(), que não são nomeadas de forma muito explícita, mas ainda são úteis:

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 você quiser django para verificar o caminho e / ou pedido (cookie de idioma, ...) , que é um monte exemplo mais comum www.example.com/en/<somepath>vs www.example.com/fr/<somepath>, uso django.utils.translation.get_language_from_request(request, check_path=False). Além disso, ele sempre retornará um idioma válido definido emsettings.LANGUAGES

Não achei muito fácil encontrar essas diferenças através do Google sobre este assunto, então aqui está para referência futura.

achedeuzot
fonte
Observe que é django.utils.translation, não traduções. Há um erro de ortografia no link fornecido. No trecho está correto.
J0ANMM
4
1 para a diferença entre django.utils.translation.get_language()e django.utils.translation.get_language_from_request(request, check_path). Se estiver visível, você deve usar o último com check_path = Truepara obter a linguagem em que seu modelo será renderizado.
Ondrej Skalicka
7

Apenas para adicionar que, se você usar django.utils.translation.get_language(), você deve ter em mente que se essa seção de código for chamada de forma assíncrona (por exemplo, como uma tarefa de aipo), essa abordagem não funcionará devido à execução em uma thread diferente.

Stefan Magnuson
fonte
2
A abordagem óbvia aqui seria passar o idioma como parâmetro da tarefa e, em seguida, definir o idioma com translation.activate (idioma)
xyzman
1

você pode usar isso

from django.utils import  translation
translation.get_language()
Sarath Ak
fonte
Já respondido por micha480. Sua resposta não agrega valor.
Samuel Dauzon
0

Você pode ler o sistema localepara obter informações sobre o idioma.

advait
fonte
5
Você está moderado para -3, mas acho que a questão é vaga - "a linguagem atual da minha web". Não é sua culpa por adivinhar que isso significa SO.
mikemaccana