def getLocaleFromHTTPRequest(request): """Retrieve the languages from an HTTP ``Accept-Language:`` header. Parse the languages from the header, use them to install a ``gettext.translation`` chain via :func:`installTranslations`, and lastly return the requested languages. :type request: :api:`twisted.web.server.Request` :param request: An incoming request from a client. :rtype: list :returns: All requested languages. """ header = request.getHeader('accept-language') if header is None: logging.debug("Client sent no 'Accept-Language' header. Using fallback.") header = 'en,en-US' langs = headers.parseAcceptLanguage(header) if not safelog.safe_logging: # pragma: no cover logging.debug("Client Accept-Language (top 5): %s" % langs[:5]) # Check if we got a ?lang=foo argument, and if we did, insert it first chosenLang = request.args.get("lang", [None,])[0] if chosenLang: logging.debug("Client requested language: %r" % chosenLang) langs.insert(0, chosenLang) installTranslations(langs) return langs
def getLocaleFromHTTPRequest(request): """Retrieve the languages from an HTTP ``Accept-Language:`` header. Parse the languages from the header, use them to install a ``gettext.translation`` chain via :func:`installTranslations`, and lastly return the requested languages. :type request: :api:`twisted.web.server.Request` :param request: An incoming request from a client. :rtype: list :returns: All requested languages. """ header = request.getHeader('accept-language') if header is None: logging.debug( "Client sent no 'Accept-Language' header. Using fallback.") header = 'en,en-US' langs = headers.parseAcceptLanguage(header) if not safelog.safe_logging: # pragma: no cover logging.debug("Client Accept-Language (top 5): %s" % langs[:5]) # Check if we got a ?lang=foo argument, and if we did, insert it first chosenLang = request.args.get("lang", [ None, ])[0] if chosenLang: logging.debug("Client requested language: %r" % chosenLang) langs.insert(0, chosenLang) installTranslations(langs) return langs
def test_defaultTBBHeader(self): """The header 'en-us,en;q=0.5' should return ['en_us', 'en'].""" header = 'en-us,en;q=0.5' langs = headers.parseAcceptLanguage(header) self.assertIsInstance(langs, list) self.assertEqual(len(langs), 2) self.assertEqual(langs[0], 'en_us') self.assertEqual(langs[1], 'en')
def test_addNonLocalizedVariant(self): """The header 'en-us,en-gb;q=0.5' should return ['en_us', 'en', 'en_gb']. """ header = 'en-us,en-gb;q=0.5' langs = headers.parseAcceptLanguage(header) self.assertIsInstance(langs, list) self.assertEqual(len(langs), 3) self.assertEqual(langs[0], 'en_us') self.assertEqual(langs[1], 'en') self.assertEqual(langs[2], 'en_gb')
def setLocaleFromRequestHeader(request): """Retrieve the languages from the accept-language header and install them. Parse the languages in the header, and attempt to install the first one in the list. If that fails, we receive a :class:`gettext.NullTranslation` object, if it worked then we have a :class:`gettext.GNUTranslation` object. Whichever one we end up with, get the other languages and add them as fallbacks to the first. Lastly, install this chain of translations. :type request: :api:`twisted.web.server.Request` :param request: An incoming request from a client. :rtype: list :returns: All requested languages. """ logging.debug("Getting client 'Accept-Language' header...") header = request.getHeader('accept-language') if header is None: logging.debug("Client sent no 'Accept-Language' header. Using fallback.") header = 'en,en-US' localedir = os.path.join(os.path.dirname(__file__), 'i18n/') langs = headers.parseAcceptLanguage(header) ## XXX the 'Accept-Language' header is potentially identifying logging.debug("Client Accept-Language (top 5): %s" % langs[:5]) try: language = gettext.translation("bridgedb", localedir=localedir, languages=langs, fallback=True) for lang in langs: language.add_fallback(gettext.translation("bridgedb", localedir=localedir, languages=langs, fallback=True)) except IOError as error: logging.error(error.message) language.install(unicode=True) return langs
def test_noHeaders(self): """No header should return an empty list.""" header = None langs = headers.parseAcceptLanguage(header) self.assertIsInstance(langs, list) self.assertEqual(len(langs), 0)