Como posso obter o idioma atual no Django?


92

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


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 .


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

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


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.


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.


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()

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.