2013-05-08 99 views
0

從我的Django文檔閱讀,這是LocaleMiddleware做什麼:Django的國際化與地理位置

LocaleMiddleware試圖通過下面這個算法來確定用戶的語言首選項:

首先,它查找語言前綴在請求的URL中。這是 僅在您的 根URLconf中使用i18n_patterns功能時才執行。請參閱國際化:有關URL模式的更多 有關語言前綴的信息以及如何國際化URL 模式。

如果失敗,它會在當前用戶的 會話中查找django_language鍵。

如果沒有,它會尋找一個cookie。

使用的cookie的名稱由LANGUAGE_COOKIE_NAME 設置設置。 (默認名稱是django_language。)

如果失敗,它將查看Accept-Language HTTP標頭。這個頭文件 由您的瀏覽器發送,並通過優先順序告訴服務器您偏好哪種語言(s)。 Django嘗試使用標題 中的每種語言,直到找到包含可用翻譯的語言。

失敗的是,它使用全局LANGUAGE_CODE設置。

我想讓我的django項目檢測用戶國家並在選擇默認語言時使用它?

如何做到這一點:

我心裏有兩個想法:

  • 寫一個新的中間件要LocaleMiddleware之前在這個中間件執行,如果沒有的cookie LANGUAGE_COOKIE_NAME使用設置它Django的GeoLocation中

  • 更換LocaleMiddleware和,而不是尋找的Accept-Language HTTP標頭使用Django GeoLocation中

您怎麼看?

或者可能還有另一種更簡單的方法?

編輯:我將有一個更改語言的選項,問題是隻有當您第一次打開網站(任何頁面,而不僅僅是首頁)時。我現在正在考慮爲默認網站語言/ bg /(如果沒有這樣的設置)設置django_language,並且還使用國際urls/en /,/ bg /。也必須有語言切換選項。這樣,搜索引擎就沒有問題,我根本不會使用地理定位。

編輯:也有,這裏(保加利亞)這個問題大多數瀏覽器標題設置爲喜歡英語這是不是一個好的選擇:(

回答

0

其實它不是整體一個非常好的主意。您應該很少希望設置爲客戶端的語言,這就是爲什麼大多數網站使用可選的語言表單。 (標誌按鈕或可能的下拉選擇)。

LocaleMiddleware沿着最有可能選擇正確翻譯(如果可用)的等級路徑運行。一個適當的解決方案是將您的客戶的表格設置或切換他們的偏好。如果處理表單,則可以填充django_language會話密鑰。

如果強制進行語言設置,爬網程序也不會正確地刮頁。

+0

我將可以選擇更改語言,問題僅在您第一次打開網站時出現。我現在正在考慮爲默認網站語言/ bg /(如果沒有這樣的設置)設置django_language,並且還使用國際urls/en /,/ bg /。也必須有語言切換選項。這樣,搜索引擎就沒有問題,我根本不會使用地理定位。 – 2013-05-08 08:24:50

+0

也有這個問題,在這裏(在保加利亞)大多數瀏覽器標題設置爲更喜歡英語語言,這不是一個好的選擇:( – 2013-05-08 08:32:41

0

我發現這一點,這是非常有用的:

中間件,這將迫使Django的使用settings.LANGUAGE_CODE爲默認語言,而不是使用equest.META [ 'HTTP_ACCEPT_LANGUAGE']

class ForceDefaultLanguageMiddleware(object): 
    """ 
    Ignore Accept-Language HTTP headers 

    This will force the I18N machinery to always choose settings.LANGUAGE_CODE 
    as the default initial language, unless another one is set via sessions or cookies 

    Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'], 
    namely django.middleware.locale.LocaleMiddleware 
    """ 
    def process_request(self, request): 
     if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
      del request.META['HTTP_ACCEPT_LANGUAGE'] 

來源: https://gist.github.com/vstoykov/1366794