def test_accept_mixin(): request = wrappers.Request( { "HTTP_ACCEPT": "text/xml,application/xml,application/xhtml+xml," "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5", "HTTP_ACCEPT_CHARSET": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "HTTP_ACCEPT_ENCODING": "gzip,deflate", "HTTP_ACCEPT_LANGUAGE": "en-us,en;q=0.5", } ) assert request.accept_mimetypes == MIMEAccept( [ ("text/xml", 1), ("image/png", 1), ("application/xml", 1), ("application/xhtml+xml", 1), ("text/html", 0.9), ("text/plain", 0.8), ("*/*", 0.5), ] ) strict_eq( request.accept_charsets, CharsetAccept([("ISO-8859-1", 1), ("utf-8", 0.7), ("*", 0.7)]), ) strict_eq(request.accept_encodings, Accept([("gzip", 1), ("deflate", 1)])) strict_eq(request.accept_languages, LanguageAccept([("en-us", 1), ("en", 0.5)])) request = wrappers.Request({"HTTP_ACCEPT": ""}) strict_eq(request.accept_mimetypes, MIMEAccept())
def test_accept_mixin(): request = wrappers.Request({ 'HTTP_ACCEPT': 'text/xml,application/xml,application/xhtml+xml,' 'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5', 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'HTTP_ACCEPT_ENCODING': 'gzip,deflate', 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5' }) assert request.accept_mimetypes == MIMEAccept([('text/xml', 1), ('image/png', 1), ('application/xml', 1), ('application/xhtml+xml', 1), ('text/html', 0.9), ('text/plain', 0.8), ('*/*', 0.5)]) strict_eq(request.accept_charsets, CharsetAccept([('ISO-8859-1', 1), ('utf-8', 0.7), ('*', 0.7)])) strict_eq(request.accept_encodings, Accept([('gzip', 1), ('deflate', 1)])) strict_eq(request.accept_languages, LanguageAccept([('en-us', 1), ('en', 0.5)])) request = wrappers.Request({'HTTP_ACCEPT': ''}) strict_eq(request.accept_mimetypes, MIMEAccept())
def test_accept(): request = wrappers.Request( { "HTTP_ACCEPT": "text/xml,application/xml,application/xhtml+xml," "text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5", "HTTP_ACCEPT_CHARSET": "ISO-8859-1,utf-8;q=0.7,*;q=0.7", "HTTP_ACCEPT_ENCODING": "gzip,deflate", "HTTP_ACCEPT_LANGUAGE": "en-us,en;q=0.5", "SERVER_NAME": "eggs", "SERVER_PORT": "80", } ) assert request.accept_mimetypes == MIMEAccept( [ ("text/xml", 1), ("application/xml", 1), ("application/xhtml+xml", 1), ("image/png", 1), ("text/html", 0.9), ("text/plain", 0.8), ("*/*", 0.5), ] ) assert request.accept_charsets == CharsetAccept( [("ISO-8859-1", 1), ("utf-8", 0.7), ("*", 0.7)] ) assert request.accept_encodings == Accept([("gzip", 1), ("deflate", 1)]) assert request.accept_languages == LanguageAccept([("en-us", 1), ("en", 0.5)]) request = wrappers.Request( {"HTTP_ACCEPT": "", "SERVER_NAME": "example.org", "SERVER_PORT": "80"} ) assert request.accept_mimetypes == MIMEAccept()
def inject_lang_from_header(): """Inject the language defined in the 'lang' into the accepted languages of the request if present.""" if 'lang' in request.headers: # inject language from custom header as first choice into request lang: str = request.headers.get('lang') values = (lang, 10), *request.accept_languages request.accept_languages = LanguageAccept(values) # Force refresh to make sure that the change is applied flask_babel_refresh()
def best_match(requested_langs: LanguageAccept, supported_langs: list) -> Optional[str]: result = requested_langs.best_match(supported_langs) if result is None: # Try again with just the language codes (no country/region codes). requested = [] for code, weight in requested_langs: code = code.split("-")[0] requested.append((code, weight)) supported_shorted = [code.split("-")[0] for code in supported_langs] result = LanguageAccept(requested).best_match(supported_shorted) # If match, convert back to the full language code. if result: idx = supported_shorted.index(result) result = supported_langs[idx] return result
def default_route(lang): if lang: # inject language from url as first choice into request values = (lang, 10), *request.accept_languages request.accept_languages = LanguageAccept(values) flask_babel_refresh() email_regex = APP.config.get('EMAIL_ADDRESS_FILTER', '.*') support_email = APP.config.get('SUPPORT_EMAIL', "") url_email_verification = url_for("api-v1.EmailVerification") url_account_creation = url_for("api-v1.AccountCreation") lang_used = "en" locale = get_locale() if locale is not None: lang_used = locale.language return render_template('index.html', email_regex=email_regex, lang = lang_used, support_email=support_email, url_api_endpoint_email_verification=url_email_verification, url_api_endpoint_account_creation=url_account_creation)
def inject_lang_from_header(): """Inject the language defined in the custom 'lang' Hader into the g context. This method can be used in a before request callback to read the custom header and use that to set the language for example for API requests. """ lang: Optional[str] = request.headers.get("lang") if lang: old_accepts: LanguageAccept = request.accept_languages if "lang" in g: # check LanguageAccept option in g context accepted_languages = g.get("lang") if accepted_languages and isinstance(accepted_languages, LanguageAccept): old_accepts = accepted_languages # inject language from custom header as first choice into request values = (lang, 10), *old_accepts g.lang = LanguageAccept(values) # Force refresh to make sure that the change is applied flask_babel_refresh()
def test_best_match_fallback(self, values, matches, default, expect): accept = LanguageAccept(values) best = accept.best_match(matches, default=default) assert best == expect
def test_set_best_lang_no_session_lang(): request.accept_languages = LanguageAccept([('en-PI', 1), ('fr_FR', 0.7)]) assert babel.locale_selector_func() == 'fr_FR' request.accept_languages = LanguageAccept([('fr-FR', 1)]) assert babel.locale_selector_func() == 'fr_FR'