Làm cách nào tôi có thể tải ngôn ngữ hiện tại trong Django?


93

Làm cách nào để lấy ngôn ngữ hiện tại trong luồng hiện tại trong một mô hình hoặc trong quản trị viên?


5
Hãy cụ thể. 'Ngôn ngữ web của tôi' - bạn có nghĩa là yêu cầu web, máy chủ web hay gì?
mikemaccana

Câu trả lời:


139

Các hàm được quan tâm đặc biệt sẽ django.utils.translation.get_language()trả về ngôn ngữ được sử dụng trong luồng hiện tại. Xem tài liệu .


2
Báo trước: Trả về Không có nếu bản dịch tạm thời bị vô hiệu hóa (bởi deactivate_all () hoặc khi Không có được chuyển sang ghi đè ()). Trước Django 1.8, get_language () luôn trả về LANGUAGE_CODE khi bản dịch bị hủy kích hoạt.
Pieter

89

Hoặc bạn cũng có thể nhận được điều này trong quan điểm của mình

yêu cầu.LANGUAGE_CODE

6
Tôi đã bỏ phiếu cho điều này (từ -1 vì một số lý do). Lưu ý điều sau (từ docs.djangoproject.com/en/dev/topics/i18n/deployment/… "với bản dịch tĩnh (middleware-less), ngôn ngữ ở trong cài đặt.LANGUAGE_CODE , trong khi với bản dịch động (middleware), ngôn ngữ ở request.LANGUAGE_CODE. "
Alexander Marquardt

4
Liên kết đó đã chết và tôi không thấy lý do gì để không sử dụng giải pháp được chấp nhận được ghi chép ở trên:django.utils.translation.get_language()
qris

4
cố gắng lấy ngôn ngữ trong mô hình ví dụ sẽ không thể thực hiện được nếu chưa có yêu cầu. Tôi nghĩ rằng django.utils.translation.get_language()luôn luôn là một giải pháp tốt hơn.
Hussam

Điều gì về việc lấy ngôn ngữ hiện tại trong một mẫu?
azmeuk

2
@azmeuk này có thể có ích cho bạn docs.djangoproject.com/en/dev/topics/i18n/translation/...
Ignas Butėnas

37

Hãy cẩn thận với phương pháp bạn sử dụng để lấy ngôn ngữ . Tùy thuộc vào phương pháp nào, Django sẽ sử dụng các cách và thông tin khác nhau để xác định ngôn ngữ phù hợp để sử dụng.

Khi sử dụng django.utils.translation.get_language()hàm, nó được liên kết với ngôn ngữ luồng . Trước Django 1.8, nó luôn quay lại settings.LANGUAGE_CODEkhi bản dịch bị tắt. Nếu bạn muốn ghi đè ngôn ngữ luồng theo cách thủ công, bạn có thể sử dụng các hàm override()hoặc activate(), không được đặt tên rõ ràng, nhưng tốt, vẫn hữu ích:

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

Nếu bạn muốn django kiểm tra đường dẫn và / hoặc yêu cầu (cookie ngôn ngữ, ...) , thông thường hơn rất nhiều, ví dụ: www.example.com/en/<somepath>vs www.example.com/fr/<somepath>, use django.utils.translation.get_language_from_request(request, check_path=False). Ngoài ra, nó sẽ luôn trả về một ngôn ngữ hợp lệ được đặt trongsettings.LANGUAGES

Tôi không dễ dàng tìm thấy những khác biệt này thông qua Google về chủ đề này, vì vậy đây là nó để tham khảo thêm.


Lưu ý rằng đó là django.utils.translation, không phải bản dịch. Có một lỗi chính tả trong liên kết được cung cấp. Trong đoạn mã, nó là chính xác.
J0ANMM

4
+1 cho sự khác biệt giữa django.utils.translation.get_language()django.utils.translation.get_language_from_request(request, check_path). Nếu theo quan điểm, bạn nên sử dụng sau này với check_path = Trueđể có được những mẫu ngôn ngữ của bạn sẽ nhận được kết xuất trong.
Ondrej Skalicka

7

Chỉ cần nói thêm rằng nếu bạn sử dụng django.utils.translation.get_language()thì bạn nên nhớ rằng nếu phần mã đó được gọi là không đồng bộ (ví dụ như tác vụ cần tây) thì cách tiếp cận này sẽ không hoạt động do nó chạy trong một chuỗi khác.


2
Cách tiếp cận rõ ràng đây sẽ là để vượt qua ngôn ngữ như tham số nhiệm vụ, và sau đó thiết lập ngôn ngữ với translation.activate (ngôn ngữ)
xyzman

1

bạn có thể sử dụng cái này

from django.utils import  translation
translation.get_language()

Đã được trả lời bởi micha480. Câu trả lời của bạn không thêm bất kỳ giá trị nào.
Samuel Dauzon

0

Bạn có thể đọc localethông tin ngôn ngữ của hệ thống .


5
Bạn được kiểm duyệt xuống -3, nhưng tôi nghĩ rằng câu hỏi là mơ hồ - "ngôn ngữ hiện tại trên web của tôi". Không phải lỗi của bạn khi đoán điều này có nghĩa là hệ điều hành.
mikemaccana
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.