2009-10-06 115 views
3

我想部署一個英文網站&西班牙語並檢測用戶瀏覽器語言&重定向到正確的語言環境網站。檢測語言和django語言環境-url

我的網站是www.elmalabarista.com

我安裝django-localeurl,但我發現,語言不能正確檢測。

這是我的中間件:

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware',  
    'multilingual.middleware.DefaultLanguageMiddleware', 
    'middleware.feedburner.FeedburnerMiddleware', 
    'lib.threadlocals.ThreadLocalsMiddleware', 
    'middleware.url.UrlMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'maintenancemode.middleware.MaintenanceModeMiddleware', 
    'middleware.redirect.RedirectMiddleware', 
    'openidconsumer.middleware.OpenIDMiddleware', 
    'django.middleware.doc.XViewMiddleware', 
    'middleware.ajax_errors.AjaxMiddleware', 
    'pingback.middleware.PingbackMiddleware', 
    'localeurl.middleware.LocaleURLMiddleware', 
    'multilingual.flatpages.middleware.FlatpageFallbackMiddleware', 
    'django.middleware.common.CommonMiddleware', 
) 

但總是網站找到我們,儘管事實上我的OS &瀏覽器設置爲西班牙語。

LANGUAGES = (
    ('en', ugettext('English')), 
    ('es', ugettext('Spanish')), 
) 
DEFAULT_LANGUAGE = 1 

然後,我砍區域設置的URL的中間件和做到這一點:

def process_request(self, request): 
    locale, path = self.split_locale_from_request(request) 
    if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
     locale = utils.supported_language(request.META['HTTP_ACCEPT_LANGUAGE'].split(',')[0]) 
    locale_path = utils.locale_path(path, locale) 

    if locale_path != request.path_info: 
     if request.META.get("QUERY_STRING", ""): 
      locale_path = "%s?%s" % (locale_path, 
        request.META['QUERY_STRING']) 
     return HttpResponseRedirect(locale_path) 
    request.path_info = path 
    if not locale: 
     locale = settings.LANGUAGE_CODE 
    translation.activate(locale) 
    request.LANGUAGE_CODE = translation.get_language() 

然而,這種檢測精細的語言,但是重定向「EN」的網址爲「ES」。所以用英語導航是不可能的。

UPDATE:這是最後的代碼爲 「/」 的情況下的定位點(從卡爾邁耶輸入後):

def process_request(self, request): 
    locale, path = self.split_locale_from_request(request) 
    if (not locale) or (locale==''): 
     if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
      locale = utils.supported_language(request.META['HTTP_ACCEPT_LANGUAGE'].split(',')[0]) 
     else: 
      locale = settings.LANGUAGE_CODE 
    locale_path = utils.locale_path(path, locale) 
    if locale_path != request.path_info: 
     if request.META.get("QUERY_STRING", ""): 
      locale_path = "%s?%s" % (locale_path, request.META['QUERY_STRING']) 
     return HttpResponseRedirect(locale_path) 
    request.path_info = path 
    translation.activate(locale) 
    request.LANGUAGE_CODE = translation.get_language() 

回答

11

更新:DJANGO-localeurl的LocaleURLMiddleware現在直接支持HTTP接受語言作爲後備,如果LOCALEURL_USE_ACCEPT_LANGUAGE設置爲True。所以OP的期望的行爲是可無需編寫自定義的中間件)。

它沒有意義的同時擁有Django的內置LocaleMiddleware和LocaleURLMiddleware啓用。它們旨在作爲相互排斥的替代品,並且在選擇語言時有不同的邏輯。 Locale-url完成它在錫上所說的內容:語言環境由URL組件定義(因此不由Accept-Language頭部定義)。 Django的LocaleMiddleware將choose the language based on a session value or cookie or Accept-Language header。啓用這兩者意味着無論哪個人最後獲勝,這就是您看到LocaleURLMiddleware行爲的原因。

聽起來也許你想要某種兩個,其中選擇初始語言(訪問該網站的根網址是什麼時候?)的組合的基礎上接受語言,然後通過下面的網址定義?目前還不完全清楚你想要什麼行爲,所以澄清這是第一步。那麼你可能需要編寫你自己的LocaleMiddleware來實現這種行爲。您首次嘗試黑客入侵LocaleURLMiddleware時,始終使用Accept-Language代替URL中定義的內容。相反,您希望進一步向下檢查Accept-Language頭,在「if not locale:」部分中默認設置爲.LANGUAGE_CODE。更像這樣(未經測試的代碼):

def process_request(self, request): 
    locale, path = self.split_locale_from_request(request) 
    locale_path = utils.locale_path(path, locale) 

    if locale_path != request.path_info: 
     if request.META.get("QUERY_STRING", ""): 
      locale_path = "%s?%s" % (locale_path, request.META['QUERY_STRING']) 
     return HttpResponseRedirect(locale_path) 
    request.path_info = path 
    if not locale: 
     if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
      locale = utils.supported_language(request.META['HTTP_ACCEPT_LANGUAGE'].split(',')[0]) 
     else: 
      locale = settings.LANGUAGE_CODE 
    translation.activate(locale) 
    request.LANGUAGE_CODE = translation.get_language() 
+0

是的,我想BTOH的混合多國語言:獲取defaul語言形式接受語言的第一次,但在那之後使用URL風格。 我不知道將它存儲在cookie中是否也很重要......但我認爲更好的行爲是你描述的。 – mamcx 2009-10-07 14:54:41

+0

感謝您的意見。我把你的代碼,但修復的情況下,「/」 – mamcx 2009-10-07 17:42:41

+0

這是給我的錯誤。哪個文件我需要改變。它給出錯誤 區域設置,路徑= self.split_locale_from_request(請求) – ha22109 2010-06-10 13:39:32

1

我也需要這種行爲。 是您只使用自定義的中間件現在得到的語言或者你還在使用LocaleURLMiddleware和LocaleMiddleware結合在上面的代碼中間件?

+0

我發現智能補丁localeurl將被合併到主幹。它工作得很好。 http://code.google.com/p/django-localeurl/issues/detail?id=27&colspec=ID%20Type%20Status%20Priority%20Milestone%20Reporter%20Owner%20Summary – user276805 2010-02-24 15:16:35

0

實際上它應該是這樣的:

可以有按優先順序接受

def process_request(self, request): 
    locale, path = utils.strip_path(request.path_info) 
    if (not locale) or (locale==''): 
     if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
     l = [x.strip()[:2] for x in request.META['HTTP_ACCEPT_LANGUAGE'].split(',')] 
     for lang_code in l: 
       locale = utils.supported_language(lang_code) 
       if locale: 
      break 
     else: 
      locale = settings.LANGUAGE_CODE 
    locale_path = utils.locale_path(path, locale) 
    if locale_path != request.path_info: 
     if request.META.get("QUERY_STRING", ""): 
      locale_path = "%s?%s" % (locale_path, 
        request.META['QUERY_STRING']) 
     return HttpResponseRedirect(locale_path) 
    request.path_info = path 
    if not locale: 
     try: 
      locale = request.LANGUAGE_CODE 
     except AttributeError: 
      locale = settings.LANGUAGE_CODE 
    translation.activate(locale) 
    request.LANGUAGE_CODE = translation.get_language()