Bagaimana saya bisa mendapatkan bahasa saat ini di Django?

95

Bagaimana saya bisa mendapatkan bahasa saat ini di utas saat ini di model atau di admin?

diegueus9
sumber
5
Harap lebih spesifik. 'Bahasa web saya' - maksud Anda permintaan web, server web, atau apa?
mikemaccana

Jawaban:

141

Fungsi minat tertentu adalah django.utils.translation.get_language()yang mengembalikan bahasa yang digunakan di utas saat ini. Lihat dokumentasi .

micha480.dll
sumber
2
Peringatan: Mengembalikan Tidak Ada jika terjemahan dinonaktifkan sementara (oleh deactivate_all () atau ketika Tidak Ada diteruskan ke override ()). Sebelum Django 1.8, get_language () selalu mengembalikan LANGUAGE_CODE saat terjemahan dinonaktifkan.
Pieter
91

Atau Anda juga bisa mendapatkan ini dalam pandangan Anda

request.LANGUAGE_CODE
Ignas Butėna
sumber
6
Saya memilih ini (dari -1 untuk beberapa alasan). Perhatikan hal berikut (dari docs.djangoproject.com/en/dev/topics/i18n/deployment/… "dengan terjemahan statis (tanpa middleware), bahasanya ada di pengaturan. BAHASA_CODE , sementara dengan terjemahan dinamis (middleware), request.LANGUAGE_CODE. "
Alexander Marquardt
4
Tautan itu mati, dan saya tidak melihat alasan untuk tidak menggunakan solusi yang diterima yang didokumentasikan di atas:django.utils.translation.get_language()
qris
4
mencoba untuk mendapatkan bahasa dalam model eg tidak akan mungkin jika belum ada permintaan. Saya pikir django.utils.translation.get_language()selalu ada solusi yang lebih baik.
Hussam
Bagaimana cara mendapatkan bahasa saat ini di template?
azmeuk
2
@azmeuk ini mungkin berguna untuk Anda docs.djangoproject.com/en/dev/topics/i18n/translation/…
Ignas Butėnas
38

Berhati-hatilah dengan metode yang Anda gunakan untuk memahami bahasa tersebut . Bergantung pada metode mana, Django akan menggunakan cara dan informasi berbeda untuk menentukan bahasa yang tepat untuk digunakan.

Saat menggunakan django.utils.translation.get_language()fungsinya, itu ditautkan ke bahasa utas . Sebelum Django 1.8, itu selalu dikembalikan settings.LANGUAGE_CODEketika terjemahan dimatikan. Jika Anda ingin mengganti bahasa utas secara manual, Anda dapat menggunakan fungsi override()atau activate(), yang namanya tidak terlalu eksplisit, tetapi masih berguna:

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

Jika Anda ingin django memeriksa jalur dan / atau permintaan (cookie bahasa, ...) , yang jauh lebih umum misalnya www.example.com/en/<somepath>vs www.example.com/fr/<somepath>, gunakan django.utils.translation.get_language_from_request(request, check_path=False). Selain itu, ini akan selalu mengembalikan set bahasa yang validsettings.LANGUAGES

Saya merasa tidak mudah untuk menemukan perbedaan ini melalui Google tentang subjek ini jadi ini dia untuk referensi lebih lanjut.

achedeuzot
sumber
Perhatikan bahwa ini django.utils.translation, bukan terjemahan. Ada kesalahan ejaan pada tautan yang disediakan. Dalam potongan itu benar.
J0ANMM
4
1 untuk perbedaan antara django.utils.translation.get_language()dan django.utils.translation.get_language_from_request(request, check_path). Jika terlihat, Anda harus menggunakan yang terakhir dengan check_path = Trueuntuk mendapatkan bahasa yang akan digunakan template Anda.
Ondrej Skalicka
7

Hanya untuk menambahkan bahwa jika Anda benar-benar menggunakan django.utils.translation.get_language()maka Anda harus ingat bahwa jika bagian kode itu akan dipanggil secara asinkron (misalnya sebagai tugas seledri) maka pendekatan ini tidak akan berfungsi karena berjalan di utas yang berbeda.

Stefan Magnuson
sumber
2
Pendekatan yang jelas di sini adalah dengan melewatkan bahasa sebagai parameter tugas, dan kemudian mengatur bahasa dengan terjemahan.
Aktifkan
1

kamu bisa menggunakan ini

from django.utils import  translation
translation.get_language()
Sarath Ak
sumber
Sudah dijawab oleh micha480. Jawaban Anda tidak menambah nilai apa pun.
Samuel Dauzon
0

Anda dapat membaca sistem localeuntuk informasi bahasa.

advait
sumber
5
Anda dimoderasi ke -3, tapi menurut saya pertanyaannya tidak jelas - "bahasa web saya saat ini". Bukan salahmu menebak ini berarti OS.
mikemaccana