예제 #1
0
파일: middleware.py 프로젝트: DavadDi/zulip
    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
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
    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)
예제 #5
0
 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()
예제 #6
0
파일: locale.py 프로젝트: angelgun/django
 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()
예제 #7
0
 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()
예제 #8
0
 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
예제 #9
0
    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()
예제 #10
0
파일: locale.py 프로젝트: ZekriSara/pfe
    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
예제 #11
0
    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()
예제 #12
0
 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)
예제 #13
0
 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)
예제 #14
0
    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()
예제 #15
0
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