2010-02-25 34 views
40

nền: Chế độ xem được gọi khi dịch vụ thanh toán ping lại kết quả thanh toán sau hậu trường - sau đó tôi cần gửi email bằng ngôn ngữ phù hợp để xác nhận thanh toán, v.v. Tôi có thể lấy lại mã ngôn ngữ trong yêu cầu từ máy chủ thanh toán và muốn sử dụng cùng với các hệ thống i18n của Django để xác định ngôn ngữ nào cần gửi email của tôi.đặt ngôn ngữ trong chế độ xem django

Vì vậy, tôi cần phải đặt ngôn ngữ của django của tôi ứng dụng từ trong chế độ xem. Và sau đó làm mẫu của tôi rendering và gửi email tất cả trong một đi.

đặt request.session['django_language'] = lang chỉ ảnh hưởng đến chế độ xem tiếp theo khi tôi thử nghiệm.

Có cách nào khác để làm điều đó không?

Chúc mừng,

Guy

Trả lời

69

Để trích dẫn phần từ Locale Middleware của Django (django.middleware.locale.LocaleMiddleware):

from django.utils import translation 

class LocaleMiddleware(object): 
    """ 
    This is a very simple middleware that parses a request 
    and decides what translation object to install in the current 
    thread context. This allows pages to be dynamically 
    translated to the language the user desires (if the language 
    is available, of course). 
    """ 

    def process_request(self, request): 
     language = translation.get_language_from_request(request) 
     translation.activate(language) 
     request.LANGUAGE_CODE = translation.get_language() 

Các translation.activate(language) là bit quan trọng.

+0

Gợi ý tuyệt vời. Giúp tôi giải quyết một vấn đề khá không liên quan tôi đã có (nơi một doctest đã thất bại vì một số thử nghiệm trước đây sử dụng khách hàng thử nghiệm của django, mà trái hệ thống với một giá trị bất ngờ của miền địa phương.deactivate_all() ở đầu tài liệu đã khắc phục sự cố) –

+0

Tôi có thể sử dụng nó như thế nào, để đặt ngôn ngữ trong khi người dùng đăng nhập trong chế độ xem tùy chỉnh của tôi? Mã ngôn ngữ được đặt trong bảng UserProfile. – robos85

+23

Cảnh báo, tôi vừa khắc phục lỗi trong quá trình phát triển hiện tại, do translation.activate: các chuỗi được sử dụng lại giữa các yêu cầu và giữ ngôn ngữ cuối được kích hoạt. Điều này dẫn đến những thứ kỳ lạ như ngôn ngữ chuyển đổi quản trị django mọi lúc. Nếu bạn kích hoạt transaction.activate theo cách thủ công, đừng quên sử dụng translation.deactivate sau khi tất cả các chuỗi đã được hiển thị (đó là những gì LocaleMiddleware thực hiện sau khi hiển thị). – vincent

2

request.LANGUAGE_CODE nếu LocaleMiddleware kích hoạt

3

Đôi khi bạn muốn thực thi một ngôn ngữ nhất định cho một cái nhìn được nhưng chúng ta hãy cài đặt ngôn ngữ trình duyệt lựa chọn ngôn ngữ cho phần còn lại của các quan điểm. Tôi chưa tìm ra cách để thay đổi ngôn ngữ trong các mã xem nhưng bạn có thể làm điều này bằng cách thực hiện một Middleware đơn giản

lang_based_on_url_middleware.py:

from django.utils import translation 

# Dictionary of urls that should use special language regardless of language set in browser 
# key = url 
# val = language code 
special_cases = { 
    '/this/is/some/url/' : 'dk', 
    '/his/is/another/special/case' : 'de', 
       } 

class LangBasedOnUrlMiddleware(object): 
    def process_request(self, request): 
     if request.path_info in special_cases: 
      lang = special_cases[request.path_info] 
      translation.activate(lang) 
      request.LANGUAGE_CODE = lang 

Trong settings.py:

MIDDLEWARE_CLASSES = (
    ... 
    'django.middleware.locale.LocaleMiddleware', 
    'inner.lang_based_on_url_middleware.LangBasedOnUrlMiddleware', # remember that the order of LocaleMiddleware and LangBasedOnUrlMiddleware matters 
    ... 
) 

Không phải là một giải pháp thanh lịch nhưng nó hoạt động.

10

Đảm bảo cũng thêm hủy kích hoạt trong process_response, nếu không bạn sẽ gặp sự cố với các luồng khác nhau.

from django.utils import translation 

class LocaleMiddleware(object): 
    """ 
    This is a very simple middleware that parses a request 
    and decides what translation object to install in the current 
    thread context. This allows pages to be dynamically 
    translated to the language the user desires (if the language 
    is available, of course). 
    """ 

    def process_request(self, request): 
     language = translation.get_language_from_request(request) 
     translation.activate(language) 
     request.LANGUAGE_CODE = translation.get_language() 

    def process_response(self, request, response): 
     translation.deactivate() 
     return response 
+0

Như tôi đã trải qua một hành vi kỳ lạ bằng cách sử dụng phần mềm trung gian mà không tắt dịch, tôi tự hỏi tại sao điều này tạo ra vấn đề với chủ đề. Nhưng dù sao, cảm ơn cho gợi ý quan trọng. +1 –

0

Nếu chỉ muốn để có được những chuỗi dịch cho một ngôn ngữ vì lý do gì, bạn có thể use override as a decorator như thế này:

from django.utils import translation 
from django.utils.translation import ugettext as _ 

with translation.override(language): 
    welcome = _('welcome') 
0

Nếu bạn đang sử dụng django 1.10 hoặc cao hơn, có một cú pháp mới cho tùy chỉnh middleware:

from django.utils import translation 

class LocaleMiddleware(object): 

    def __init__(self, get_response): 
     self.get_response = get_response 

    def __call__(self, request): 

     language_code = 'en' #TODO, your logic 

     translation.activate(language_code) 

     response = self.get_response(request) 

     translation.deactivate() 

     return response 
0

Với quan điểm dựa trên lớp, điều này sẽ làm việc:

class YourView(SomeBuiltInView): 
def get(self, request, *args, **kwargs): 
    setattr(request, 'LANGUAGE_CODE', 'YOUR_LANGUAGE_CODE') 
    return super().get(self, request, *args, **kwargs) 

Về cơ bản tất cả những gì bạn làm là làm cho trình xem kết xuất xem xét rằng yêu cầu đến từ YOUR_LANGUAGE_CODE thay vì những gì ban đầu là đúng.

Các vấn đề liên quan