2013-09-02 47 views
6

Tôi đang xây dựng một ứng dụng Django sử dụng các tính năng dịch của Django để cung cấp bản địa hóa cho nhiều ngôn ngữ. Nhưng tôi cũng đang sử dụng các tính năng dịch của Django để dịch một số thuật ngữ nhất định thành các ngành khác nhau dựa trên cài đặt của người dùng hiện đã đăng nhập.Làm thế nào để rơi trở lại nhiều ngôn ngữ trong Django tại thời gian chạy?

Ví dụ, đối với một người dùng nói tiếng Anh làm việc trong ngành đánh giá học tập, tôi muốn các hành vi sau đây:

Đối với yêu cầu cụ thể tới trang:

  1. Tra cứu ngôn ngữ tự nhiên của người dùng (ví dụ: tiếng Đức)
  2. Tra cứu ngành của người dùng (ví dụ: đánh giá học tập)
  3. Kích hoạt ngôn ngữ Đánh giá học/tiếng Đức (ví dụ: translation.activate ("learning-evaluation-de")

Tệp "learning-evaluation-de" .po sẽ chỉ dịch một tập con của tất cả các chuỗi trong dự án, bởi vì nó chỉ ở đó để dịch một số thuật ngữ cụ thể theo ngành cụ thể.

Đây là câu hỏi:

Khi một chuỗi là mất tích, tôi muốn Django để rơi trở lại Đức (xác định trong bướC# 1 ở trên) chứ không phải là tiếng Anh (ngôn ngữ mặc định trong settings.py của tôi) .

Tệp tiếng Anh/tiếng Đức .po mặc định của tôi sẽ giả định một ngành nhất định.

Điều này có khả thi không?

+0

Tôi không hiểu, nếu chuỗi không bị thiếu trong tệp .po, thì còn thiếu chuỗi nào khác? – yuvi

+0

Thú vị, có vẻ là tốt nhất sẽ làm một gettext tùy chỉnh, có thể có được một đối tượng yêu cầu ´gettext ('Xin chào thế giới', yêu cầu) ´. –

Trả lời

1

Tôi nghĩ rằng nó có thể và một trong những cách nhanh nhất để làm điều này (ngay cả khi để kiểm tra xem nó hoạt động) sẽ được khỉ vá mô-đun dịch Django để hỗ trợ thêm ngôn ngữ dự phòng như thế này (không kiểm tra):

from django.utils.translation import trans_real 
... # Import other things 


# Added `fallback_language` parameter 
def do_translate(message, translation_function, fallback_language=None): 
    """ 
    Translates 'message' using the given 'translation_function' name -- which 
    will be either gettext or ugettext. It uses the current thread to find the 
    translation object to use. If no current translation is activated, the 
    message will be run through the default translation object. 
    """ 
    global _default 

    # str() is allowing a bytestring message to remain bytestring on Python 2 
    eol_message = message.replace(str('\r\n'), str('\n')).replace(str('\r'), str('\n')) 
    t = getattr(_active, "value", None) 
    if t is not None: 
     result = getattr(t, translation_function)(eol_message) 
    else: 

     # Use other language as fallback. 
     if fallback_language is not None: 
      fallback = translation(fallback_language) 
      result = getattr(_default, translation_function)(eol_message) 

     else: 
      if _default is None: 
       from django.conf import settings 
       _default = translation(settings.LANGUAGE_CODE) 
      result = getattr(_default, translation_function)(eol_message) 
    if isinstance(message, SafeData): 
     return mark_safe(result) 
    return result 

# Added `fallback_language` parameter 
def do_ntranslate(singular, plural, number, translation_function, fallback_language=None): 
    global _default 

    t = getattr(_active, "value", None) 
    if t is not None: 
     return getattr(t, translation_function)(singular, plural, number) 

    # Use other language as fallback. 
    if fallback_language is not None: 
     fallback = translation(fallback_language) 
     return getattr(fallback, translation_function)(singular, plural, number) 

    if _default is None: 
     from django.conf import settings 
     _default = translation(settings.LANGUAGE_CODE) 
    return getattr(_default, translation_function)(singular, plural, number) 


# Override Django functions with custom ones. 
trans_real.do_translate = do_translate 
trans_real.do_ntranslate = do_ntranslate 

Hai chức năng trên được lấy từ mô-đun django.utils.translation.trans_real. Chỉ cần thêm vài dòng vào các chức năng này. Bạn cũng sẽ cần phải sửa đổi các chức năng khác (ví dụ: gettext, ngettext, pgettext) để chấp nhận thông số fallback_language và chuyển cho hai hàm trên. Vui lòng thử nếu mã này hoạt động.

Lưu ý rằng bản vá lỗi trên toàn bộ dự án - nó cũng ảnh hưởng đến toàn bộ ứng dụng của bạn và các ứng dụng của bên thứ ba. Hoặc bạn có thể lấy nguồn của mô-đun django.utils.translation.trans_real làm cơ sở để tạo các hàm dịch tùy chỉnh sẽ chỉ được sử dụng ở một vài nơi trong ứng dụng của bạn.