2012-06-30 36 views
13

Tôi muốn quốc tế hóa cho dự án của mình. Tôi làm theo cách nó được mô tả trong tài liệu chính thức, nhưng nội địa hóa vẫn không hoạt động. Đây là cách tôi cố gắng có được sử dụng ngôn ngữ:Xác định ngôn ngữ người dùng trong Pyramid

def get_locale_name(request): 
    """ Return the :term:`locale name` associated with the current 
    request (possibly cached).""" 
    locale_name = getattr(request, 'locale_name', None) 
    if locale_name is None: 
     locale_name = negotiate_locale_name(request) 
     request.locale_name = locale_name 
    return locale_name 

Nhưng request không có attr "local_name", nhưng nó có "Accept-Language" và như vậy khi chức năng get_local_name không tìm thấy "local_name" trong yêu cầu , nó gọi chức năng khác:

def negotiate_locale_name(request): 
    """ Negotiate and return the :term:`locale name` associated with 
    the current request (never cached).""" 
    try: 
     registry = request.registry 
    except AttributeError: 
     registry = get_current_registry() 
    negotiator = registry.queryUtility(ILocaleNegotiator, 
             default=default_locale_negotiator) 
    locale_name = negotiator(request) 

    if locale_name is None: 
     settings = registry.settings or {} 
     locale_name = settings.get('default_locale_name', 'en') 

    return locale_name 

làm thế nào tôi có thể thấy negotiator cố gắng để có được địa phương từ môi trường toàn cầu nhưng nếu nó không thể làm điều đó giá trị đặt từ config. Và tôi không thể hiểu tại sao Kim tự tháp không lấy ngôn ngữ trực tiếp từ trường yêu cầu "Accept-Language"?

Và, làm thế nào tôi có thể xác định chính xác miền địa phương?

Trả lời

14

Kim tự tháp không chỉ ra cách một miền địa phương nên được thương lượng. Dựa vào ngôn ngữ trang web của bạn trên tiêu đề "Chấp nhận ngôn ngữ" có thể gây ra sự cố vì hầu hết người dùng không biết cách đặt ngôn ngữ trình duyệt ưa thích của họ. Đảm bảo người dùng của bạn có thể chuyển đổi ngôn ngữ dễ dàng và sử dụng cookie để lưu trữ tùy chọn đó cho các lần truy cập trong tương lai.

Bạn cần phải đặt _LOCALE_ key on the request (thông qua trình xử lý sự kiện chẳng hạn) hoặc cung cấp custom locale negotiator của riêng bạn.

Dưới đây là một ví dụ sử dụng NewRequest eventaccept_language header, đó là một thể hiện của các webob Accept class:

from pyramid.events import NewRequest 
from pyramid.events import subscriber 

@subscriber(NewRequest) 
def setAcceptedLanguagesLocale(event): 
    if not event.request.accept_language: 
     return 
    accepted = event.request.accept_language 
    event.request._LOCALE_ = accepted.best_match(('en', 'fr', 'de'), 'en') 
+0

Nhưng không cần tạo đối tượng được chấp nhận từ accept_language caus accept_language là allready instance of Accept() và có method best_match() của chính nó. Đó là cố gắng cho phiên bản kim tự tháp 1.2 cảm ơn nhiều – Denis

+1

@Denis: Bạn thực sự là chính xác; 'accept_language' đã là một thể hiện của' Accept'. Đã sửa. –

+0

@Martijin Pieters Dù sao thì cảm ơn bạn, tất cả đều hoạt động tốt)) – Denis

2

Đừng lưu ý request._LOCALE_ công trình chỉ vì theo mặc định nhà đàm phán locale là một default_locale_negotiator. Nếu bạn có các kiểm tra rất phức tạp, ví dụ bạn phải tìm nạp người dùng từ DB nếu một cookie không tồn tại, trình xử lý NewRequest không có các yêu cầu không cần bất kỳ bản dịch nào. Đối với họ bạn cũng có thể sử dụng một nhà đàm phán tùy chỉnh tên địa phương, như:

def my_locale_negotiator(request): 
    if not hasattr(request, '_LOCALE_'): 
     request._LOCALE_ = request.accept_language.best_match(
      ('en', 'fr', 'de'), 'en') 

    return request._LOCALE_ 


from pyramid.config import Configurator 
config = Configurator() 
config.set_locale_negotiator(my_locale_negotiator) 
0

Tính đến kim tự tháp 1.5, bạn có thể sử dụng các thuộc tính yêu cầu để truy cập vào miền địa phương hiện tại:

request.localizer một thể hiện của Localizer

request.locale giống như request.localizer.locale_name

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