有時候你想強制執行給定的觀點有一定的語言,但讓瀏覽器語言設置爲首選的意見,其餘的語言。我還沒有想出如何改變視圖代碼的語言,但你可以通過一個簡單的中間件做到這一點
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
在settings.py:
MIDDLEWARE_CLASSES = (
...
'django.middleware.locale.LocaleMiddleware',
'inner.lang_based_on_url_middleware.LangBasedOnUrlMiddleware', # remember that the order of LocaleMiddleware and LangBasedOnUrlMiddleware matters
...
)
不是一個優雅的解決方案,但它的工作原理。
偉大的提示。幫助我解決了一個非常不相關的問題(文檔測試失敗了,因爲之前的一些測試使用了django的測試客戶端,導致系統出現意外的語言環境值。在doctest開始處停用deactivate_all()修復了這個問題) – 2011-06-10 11:27:51
如何使用它,在我的自定義視圖中記錄用戶期間設置語言?語言代碼位於UserProfile表中。 – robos85 2011-06-21 19:38:13
警告,由於translation.activate,我剛剛修復了當前開發中的一個錯誤:線程在請求之間重複使用並保持最後一種語言被激活。這導致了像Django管理切換語言一樣奇怪的東西。 如果您手動觸發transaction.activate,請不要忘記在渲染完所有字符串(這是LocaleMiddleware在渲染後執行的操作)後使用translation.deactivate。 – vincent 2012-03-21 09:08:18