Django'da mevcut dili nasıl edinebilirim?


Yanıtlar:


142

Özel ilgi duyulan işlevler django.utils.translation.get_language(), geçerli iş parçacığında kullanılan dili döndüren işlevlerdir . Belgelere bakın .


2
Uyarı: Çeviriler geçici olarak devre dışı bırakılırsa (deactivate_all () tarafından veya geçersiz kılma () öğesine Hiçbiri iletildiğinde) Hiçbiri döndürür. Django 1.8'den önce, get_language () çeviriler devre dışı bırakıldığında her zaman LANGUAGE_CODE döndürürdü.
Pieter

91

Veya bunu görünümlerinizde de görebilirsiniz

request.LANGUAGE_CODE

6
Buna oy verdim (bazı nedenlerden dolayı -1'den). Aşağıdakileri ( docs.djangoproject.com/en/dev/topics/i18n/deployment/… "statik (ara katman yazılımsız) çeviriyle , dil ayarlardadır.LANGUAGE_CODE, dinamik (ara katman yazılımı) çevirisinde ise request.LANGUAGE_CODE. "
Alexander Marquardt

4
Bu bağlantı öldü, ve ben belgelenmiş kabul çözümü yukarıda kullanmamak için hiçbir neden görmüyorum:django.utils.translation.get_language()
qris

4
örneğin modellerde dili elde etmeye çalışmak henüz bir talep yoksa mümkün olmayacaktır. Her django.utils.translation.get_language()zaman daha iyi bir çözüm olduğunu düşünüyorum .
Hussam

Mevcut dili bir şablonda almaya ne dersiniz?
azmeuk


38

Dili öğrenmek için kullandığınız yönteme dikkat edin . Hangi yönteme bağlı olarak, Django, kullanılacak doğru dili belirlemek için farklı yollar ve bilgiler kullanır.

Fonksiyonu kullanırken, iş parçacığı diliyle django.utils.translation.get_language()bağlantılıdır . Django 1.8'den önce, çeviriler devre dışı bırakıldığında her zaman geri döndü . İş parçacığı dilini manuel olarak geçersiz kılmak istiyorsanız, çok açık bir şekilde adlandırılmayan, ancak yine de yararlı olan veya işlevlerini kullanabilirsiniz :settings.LANGUAGE_CODEoverride()activate()

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

Eğer django'nun çok daha yaygın olan yolu ve / veya isteği (dil çerezi, ...) kontrol etmesini istiyorsanız , örneğin www.example.com/en/<somepath>vs www.example.com/fr/<somepath>, kullanın django.utils.translation.get_language_from_request(request, check_path=False). Ayrıca, her zaman geçerli bir dil setini döndürecektir.settings.LANGUAGES

Bu konu hakkında Google aracılığıyla bu farklılıkları bulmanın çok kolay olmadığını buldum, bu yüzden burada daha fazla referans için burada.


Bunun django.utils.translationçeviriler olmadığını unutmayın . Sağlanan bağlantıda yazım hatası var. Parçacıkta doğru.
J0ANMM

4
+1 django.utils.translation.get_language()ve arasındaki fark için django.utils.translation.get_language_from_request(request, check_path). Görünümdeyseniz, check_path = Trueşablonunuzun oluşturulacağı dili elde etmek için ikincisini kullanmalısınız .
Ondrej Skalicka

7

Sadece şunu da eklemek için, eğer kullanırsanız django.utils.translation.get_language(), kodun bu bölümü eşzamansız olarak çağrılacaksa (örneğin, bir kereviz görevi olarak), bu yaklaşımın farklı bir iş parçacığında çalışması nedeniyle işe yaramayacağını aklınızda bulundurmalısınız.


2
Buradaki bariz yaklaşım, dili görev parametresi olarak geçirmek ve daha sonra çeviri ile dili ayarlamak olacaktır.activate (dil)
xyzman 02

1

bunu kullanabilirsin

from django.utils import  translation
translation.get_language()

Zaten micha480 tarafından cevaplandı. Cevabınız herhangi bir değer katmıyor.
Samuel Dauzon

0

Sistemin localedil bilgisi için okuyabilirsiniz .


5
-3 olarak yönetiliyorsunuz, ancak sorunun belirsiz olduğunu düşünüyorum - "web'imin mevcut dili". Bunun işletim sistemi anlamına geldiğini tahmin etmek sizin hatanız değil.
mikemaccana
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.