def process_response(self, request: HttpRequest, response: HttpResponseBase) -> HttpResponseBase: # This is the same as the default LocaleMiddleware, minus the # logic that redirects 404's that lack a prefixed language in # the path into having a language. See # https://code.djangoproject.com/ticket/32005 language = translation.get_language() language_from_path = translation.get_language_from_path( request.path_info) urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF) i18n_patterns_used, _ = is_language_prefix_patterns_used(urlconf) if not (i18n_patterns_used and language_from_path): patch_vary_headers(response, ("Accept-Language", )) assert language is not None response.setdefault("Content-Language", language) # An additional responsibility of our override of this middleware is to save the user's language # preference in a cookie. That determination is made by code handling the request # and saved in the set_language flag so that it can be used here. set_language = get_request_notes(request).set_language if set_language is not None: response.set_cookie(settings.LANGUAGE_COOKIE_NAME, set_language) return response
def process_response(self, request, response): language = translation.get_language() language_from_path = translation.get_language_from_path( request.path_info) urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, prefixed_default_language = is_language_prefix_patterns_used( urlconf) if (response.status_code == 404 and not language_from_path and i18n_patterns_used and prefixed_default_language): # Maybe the language code is missing in the URL? Try adding the # language prefix and redirecting to that URL. language_path = '/%s%s' % (language, request.path_info) path_valid = is_valid_path(language_path, urlconf) path_needs_slash = ( not path_valid and (settings.APPEND_SLASH and not language_path.endswith('/') and is_valid_path('%s/' % language_path, urlconf))) if path_valid or path_needs_slash: script_prefix = get_script_prefix() # Insert language after the script prefix and before the # rest of the URL language_url = request.get_full_path( force_append_slash=path_needs_slash).replace( script_prefix, '%s%s/' % (script_prefix, language), 1) return self.response_redirect_class(language_url) if not (i18n_patterns_used and language_from_path): patch_vary_headers(response, ('Accept-Language', )) if 'Content-Language' not in response: response['Content-Language'] = language return response
def process_response(self, request, response): language = translation.get_language() language_from_path = translation.get_language_from_path(request.path_info) urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, prefixed_default_language = is_language_prefix_patterns_used(urlconf) if response.status_code == 404 and not language_from_path and i18n_patterns_used: language_path = '/%s%s' % (language, request.path_info) path_valid = is_valid_path(language_path, urlconf) path_needs_slash = ( not path_valid and ( settings.APPEND_SLASH and not language_path.endswith('/') and is_valid_path('%s/' % language_path, urlconf) ) ) if path_valid or path_needs_slash: script_prefix = get_script_prefix() # Insert language after the script prefix and before the # rest of the URL language_url = request.get_full_path(force_append_slash=path_needs_slash).replace( script_prefix, '%s%s/' % (script_prefix, language), 1 ) return self.response_redirect_class(language_url) if not (i18n_patterns_used and language_from_path): patch_vary_headers(response, ('Accept-Language',)) if 'Content-Language' not in response: response['Content-Language'] = language return response
def validate_local_url(self, value): value = self.clean_url(value) # If we have i18n pattern in the URLconf, by default it will be # resolved against default language by `LocaleRegexURLResolver`. In # this case, it won't resolve the path /de/catalogue/ when default # language code is "en-gb" and so that path validation won't pass, # which is incorrect. In order to work it around, we extract language # code from URL and override current locale within the locale prefix of # the URL. # # 如果我们在URLconf中有i18n模式,默认情况下它将通过`LocaleRegexURLResolver`解析 # 为默认语言。 在这种情况下,当默认语言代码为“en-gb”时,它将不会解析路 # 径/ de / catalog /,因此路径验证将不会通过,这是不正确的。 为了解决这个问题, # 我们从URL中提取语言代码并覆盖URL的语言环境前缀中的当前语言环境。 urlconf = get_urlconf() i18n_patterns_used, _ = is_language_prefix_patterns_used(urlconf) redefined_language = None if i18n_patterns_used: language = get_language_from_path(value) current_language = get_language() if language != current_language: redefined_language = language if redefined_language: with override(redefined_language): self._validate_url(value) else: self._validate_url(value)
def process_request(self, request): urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, _ = is_language_prefix_patterns_used(urlconf) language = translation.get_language_from_request( request, check_path=i18n_patterns_used) translation.activate(language) request.LANGUAGE_CODE = translation.get_language()
def process_request(self, request): urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, prefixed_default_language = is_language_prefix_patterns_used(urlconf) language = translation.get_language_from_request(request, check_path=i18n_patterns_used) if not language and i18n_patterns_used and not prefixed_default_language: language = settings.LANGUAGE_CODE translation.activate(language) request.LANGUAGE_CODE = translation.get_language()
def process_request(self, request): urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, prefixed_default_language = is_language_prefix_patterns_used(urlconf) language = translation.get_language_from_request(request, check_path=i18n_patterns_used) language_from_path = translation.get_language_from_path(request.path_info) if not language_from_path and i18n_patterns_used and not prefixed_default_language: language = settings.LANGUAGE_CODE translation.activate(language) request.LANGUAGE_CODE = translation.get_language()
def process_response(self, request: HttpRequest, response: HttpResponse) -> HttpResponse: # This is the same as the default LocaleMiddleware, minus the # logic that redirects 404's that lack a prefixed language in # the path into having a language. See # https://code.djangoproject.com/ticket/32005 language = translation.get_language() language_from_path = translation.get_language_from_path(request.path_info) urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, _ = is_language_prefix_patterns_used(urlconf) if not (i18n_patterns_used and language_from_path): patch_vary_headers(response, ('Accept-Language',)) response.setdefault('Content-Language', language) return response
def process_request(self, request): urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, prefixed_default_language = is_language_prefix_patterns_used(urlconf) # language_from_path = translation.get_language_from_path(request.path_info) # if not language_from_path and i18n_patterns_used and not prefixed_default_language: # language = settings.LANGUAGE_CODE language = re.match(r'^/[a-z]{2}/',request.path) if language: language = language.group().replace('/','') else: language = translation.get_language_from_request(request, check_path=i18n_patterns_used) or 'ua' translation.activate(language) request.LANGUAGE_CODE = translation.get_language()
def process_response(self, request, response): language = translation.get_language() language_from_path = translation.get_language_from_path(request.path_info) urlconf = getattr(request, "urlconf", settings.ROOT_URLCONF) ( i18n_patterns_used, prefixed_default_language, ) = is_language_prefix_patterns_used(urlconf) if ( response.status_code == 404 and not language_from_path and i18n_patterns_used and prefixed_default_language ): # Maybe the language code is missing in the URL? Try adding the # language prefix and redirecting to that URL. language_path = "/%s%s" % (language, request.path_info) path_valid = is_valid_path(language_path, urlconf) path_needs_slash = not path_valid and ( settings.APPEND_SLASH and not language_path.endswith("/") and is_valid_path("%s/" % language_path, urlconf) ) if path_valid or path_needs_slash: script_prefix = get_script_prefix() # Insert language after the script prefix and before the # rest of the URL language_url = request.get_full_path( force_append_slash=path_needs_slash ).replace(script_prefix, "%s%s/" % (script_prefix, language), 1) # Redirect to the language-specific URL as detected by # get_language_from_request(). HTTP caches may cache this # redirect, so add the Vary header. redirect = self.response_redirect_class(language_url) patch_vary_headers(redirect, ("Accept-Language", "Cookie")) return redirect if not (i18n_patterns_used and language_from_path): patch_vary_headers(response, ("Accept-Language",)) response.headers.setdefault("Content-Language", language) return response
def process_request(self, request): language_code = request.META.get(settings.LANGUAGE_CODE_HEADER_NAME, settings.LANGUAGE_CODE) if language_code not in dict(settings.LANGUAGES): language_code = settings.LANGUAGE_CODE urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, prefixed_default_language = is_language_prefix_patterns_used( urlconf) language = translation.get_language_from_request( request, check_path=i18n_patterns_used) language_from_path = translation.get_language_from_path( request.path_info) if not language_from_path and i18n_patterns_used and not prefixed_default_language: language = language_code if language == 'en' and language_code != 'en': language = language_code translation.activate(language) request.LANGUAGE_CODE = translation.get_language()
def validate_local_url(self, value): value = self.clean_url(value) # If we have i18n pattern in the URLconf, by default it will be # resolved against default language by `LocaleRegexURLResolver`. In # this case, it won't resolve the path /de/catalogue/ when default # language code is "en-gb" and so that path validation won't pass, # which is incorrect. In order to work it around, we extract language # code from URL and override current locale within the locale prefix of # the URL. urlconf = get_urlconf() i18n_patterns_used, _ = is_language_prefix_patterns_used(urlconf) redefined_language = None if i18n_patterns_used: language = get_language_from_path(value) current_language = get_language() if language != current_language: redefined_language = language if redefined_language: with override(redefined_language): self._validate_url(value) else: self._validate_url(value)
def process_request(self, request): language = request.session.get('language') if not language: urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, prefixed_default_language = is_language_prefix_patterns_used( urlconf) if request.user.is_authenticated: language = request.user.language or translation.get_language_from_request( request, check_path=i18n_patterns_used) language_from_path = translation.get_language_from_path( request.path_info) if not language_from_path and i18n_patterns_used and not prefixed_default_language: language = settings.LANGUAGE_CODE else: language = translation.get_language_from_request( request, check_path=i18n_patterns_used) request.session.setdefault('language', language) translation.activate(language) request.LANGUAGE_CODE = translation.get_language()
def get_prefixed_default_language(*, request): urlconf = getattr(request, 'urlconf', settings.ROOT_URLCONF) i18n_patterns_used, prefixed_default_language = ( is_language_prefix_patterns_used(urlconf)) return prefixed_default_language