请看下面的答案,Django 1.10本身支持它
我遇到了这个问题并以这种方式解决了:
创建了一个
i18n_patterns
不加前缀网站主要语言(在中定义settings.LANGUAGE_CODE
)的替代方法。创建了仅使用URL前缀语言来激活当前语言的备用中间件。
使用此技术我没有看到任何副作用。
代码:
# coding: utf-8"""Cauê Thenório - cauelt(at)gmail.comThis snippet makes Django do not create URL languages prefix (i.e. /en/)for the default language (settings.LANGUAGE_CODE).It also provides a middleware that activates the language based only on the URL.This middleware ignores user session data, cookie and 'Accept-Language' HTTP header.Your urls will be like:In your default language (english in example): /contact /news /articlesIn another languages (portuguese in example): /pt/contato /pt/noticias /pt/artigosTo use it, use the 'simple_i18n_patterns' instead the 'i18n_patterns'in your urls.py: from this_sinppet import simple_i18n_patterns as i18n_patternsAnd use the 'SimpleLocaleMiddleware' instead the Django's 'LocaleMiddleware'in your settings.py: MIDDLEWARE_CLASSES = ( ... 'this_snippet.SimpleLocaleMiddleware' ... )Works on Django >=1.4"""import refrom django.conf import settingsfrom django.conf.urls import patternsfrom django.core.urlresolvers import LocaleRegexURLResolverfrom django.middleware.locale import LocaleMiddlewarefrom django.utils.translation import get_language, get_language_from_pathfrom django.utils import translationclass SimpleLocaleMiddleware(LocaleMiddleware): def process_request(self, request): if self.is_language_prefix_patterns_used(): lang_pre = (get_language_from_path(request.path_info) or settings.LANGUAGE_CODE) translation.activate(lang_pre) request.LANGUAGE_CODE = translation.get_language()class NoPrefixLocaleRegexURLResolver(LocaleRegexURLResolver): @property def regex(self): language_pre = get_language() if language_pre not in self._regex_dict: regex_compiled = (re.compile('', re.UNICODE) if language_pre == settings.LANGUAGE_CODE else re.compile('^%s/' % language_pre, re.UNICODE)) self._regex_dict[language_pre] = regex_compiled return self._regex_dict[language_pre]def simple_i18n_patterns(prefix, *args): """ Adds the language pre prefix to every URL pattern within this function, when the language not is the main language. This may only be used in the root URLconf, not in an included URLconf. """ pattern_list = patterns(prefix, *args) if not settings.USE_I18N: return pattern_list return [NoPrefixLocaleRegexURLResolver(pattern_list)]


