ฉันจะรับภาษาปัจจุบันใน Django ได้อย่างไร


95

ฉันจะรับภาษาปัจจุบันในเธรดปัจจุบันในโมเดลหรือในผู้ดูแลระบบได้อย่างไร


5
โปรดระบุ 'ภาษาของเว็บของฉัน' - คุณหมายถึงคำขอของเว็บเว็บเซิร์ฟเวอร์หรืออะไร?
mikemaccana

คำตอบ:


141

ฟังก์ชันที่สนใจเป็นพิเศษคือdjango.utils.translation.get_language()ส่งคืนภาษาที่ใช้ในเธรดปัจจุบัน โปรดดูเอกสาร


2
Caveat: ส่งคืนไม่มีหากการแปลถูกปิดใช้งานชั่วคราว (โดย deactivate_all () หรือเมื่อไม่มีการส่งผ่านไปยังการแทนที่ ()) ก่อน Django 1.8 get_language () จะส่งคืน LANGUAGE_CODE เสมอเมื่อปิดใช้งานการแปล
Pieter

91

หรือคุณสามารถรับสิ่งนี้ได้ในมุมมองของคุณ

request.LANGUAGE_CODE

6
ฉันโหวตสิ่งนี้ (จาก -1 ด้วยเหตุผลบางประการ) โปรดสังเกตสิ่งต่อไปนี้ (จากdocs.djangoproject.com/en/dev/topics/i18n/deployment/… "ด้วยการแปลแบบคงที่ (ไม่มีมิดเดิลแวร์) ภาษาอยู่ในการตั้งค่าLANGUAGE_CODEในขณะที่มีการแปลไดนามิก (มิดเดิลแวร์) อยู่ใน request.LANGUAGE_CODE. "
Alexander Marquardt

4
ลิงก์นั้นตายแล้วและฉันไม่เห็นเหตุผลที่จะไม่ใช้วิธีแก้ปัญหาที่ได้รับการยอมรับด้านบน:django.utils.translation.get_language()
qris

4
การพยายามรับภาษาในโมเดลเช่นจะเป็นไปไม่ได้หากยังไม่มีการร้องขอ ฉันคิดว่าวิธีdjango.utils.translation.get_language()นี้เป็นทางออกที่ดีกว่าเสมอ
Hussam

จะรับภาษาปัจจุบันในเทมเพลตได้อย่างไร?
azmeuk

2
@azmeuk สิ่งนี้อาจเป็นประโยชน์สำหรับคุณdocs.djangoproject.com/en/dev/topics/i18n/translation/…
Ignas Butėnas

38

ระวังของวิธีการที่คุณใช้เพื่อให้ได้ภาษา ขึ้นอยู่กับวิธีการใด Django จะใช้วิธีการและข้อมูลที่แตกต่างกันเพื่อกำหนดภาษาที่เหมาะสมที่จะใช้

เมื่อใช้django.utils.translation.get_language()ฟังก์ชันนี้จะเชื่อมโยงกับภาษาเธรด ก่อน Django 1.8 มันจะกลับมาเสมอ settings.LANGUAGE_CODEเมื่อปิดใช้งานการแปล หากคุณต้องการแทนที่ภาษาเธรดด้วยตนเองคุณสามารถใช้override()หรือ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

หากคุณต้องการให้ django ตรวจสอบเส้นทางและ / หรือคำขอ (คุกกี้ภาษา, ... )ซึ่งเป็นเรื่องธรรมดามากเช่นwww.example.com/en/<somepath>กับwww.example.com/fr/<somepath>ใช้django.utils.translation.get_language_from_request(request, check_path=False). นอกจากนี้จะส่งคืนชุดภาษาที่ถูกต้องเสมอsettings.LANGUAGES

ฉันพบว่ามันไม่ง่ายเลยที่จะค้นหาความแตกต่างเหล่านี้ผ่าน Google เกี่ยวกับเรื่องนี้ดังนั้นจึงมีไว้เพื่ออ้างอิงเพิ่มเติม


โปรดทราบว่าdjango.utils.translationไม่ใช่คำแปล มีการสะกดผิดในลิงค์ที่ให้มา ในตัวอย่างข้อมูลนั้นถูกต้อง
J0ANMM

4
+1 สำหรับความแตกต่างระหว่างและdjango.utils.translation.get_language() django.utils.translation.get_language_from_request(request, check_path)หากเป็นไปตามนี้คุณควรใช้ภาษาหลังcheck_path = Trueเพื่อให้ได้ภาษาที่เทมเพลตของคุณจะแสดงผล
Ondrej Skalicka

7

เพียงเพื่อเพิ่มว่าหากคุณใช้django.utils.translation.get_language()คุณควรจำไว้ว่าหากส่วนของรหัสนั้นจะถูกเรียกแบบอะซิงโครนัส (เช่นงานขึ้นฉ่าย) วิธีนี้จะไม่ได้ผลเนื่องจากมันทำงานในเธรดอื่น


2
แนวทางที่ชัดเจนในที่นี้คือการส่งภาษาเป็นพารามิเตอร์ของงานจากนั้นตั้งค่าภาษาด้วยการแปลเปิดใช้งาน (ภาษา)
xyzman


0

คุณสามารถอ่านlocaleข้อมูลภาษาของระบบได้


5
คุณได้รับการดูแลเป็น -3 แต่ฉันคิดว่าคำถามคลุมเครือ - "ภาษาปัจจุบันของเว็บของฉัน" ไม่ใช่ความผิดของคุณที่คาดเดาสิ่งนี้หมายถึง OS
mikemaccana
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.