# HG changeset patch # User Goffi # Date 1555070882 -7200 # Node ID 97e850e6fae944e83723429fd0496ce330f57518 # Parent ea0caa7b1bcc1161a3c4fba453fa2e0e4f2f9533 pages (i18n): if locale is not specified, "accept-language" header is used to try to determine the best one diff -r ea0caa7b1bcc -r 97e850e6fae9 libervia/server/pages.py --- a/libervia/server/pages.py Fri Apr 12 14:06:50 2019 +0200 +++ b/libervia/server/pages.py Fri Apr 12 14:08:02 2019 +0200 @@ -1411,6 +1411,28 @@ return data + def setBestLocale(self, request): + """Guess the best locale when it is not specified explicitly by user + + This method will check "accept-language" header, and set locale to first + matching value with available translations. + """ + accept_language = request.getHeader("accept-language") + if not accept_language: + return + accepted = {a.strip() for a in accept_language.split(',')} + available = [unicode(l) for l in self.host.renderer.translations] + for lang in accepted: + lang = lang.split(';')[0].strip().lower() + if not lang: + continue + for a in available: + if a.lower().startswith(lang): + session_data = self.host.getSessionData(request, + session_iface.ISATSession) + session_data.locale = a + return + def renderPartial(self, request, template, template_data): """Render a template to be inserted in dynamic page @@ -1493,6 +1515,9 @@ locale = None session_data.locale = locale + # if locale is not specified, we try to find one requested by browser + if session_data.locale is None: + self.setBestLocale(request) d = defer.Deferred() d.addCallback(self._checkAccess, request)