Make translations based on the accept-language header available on the RequestData object

This commit is contained in:
Kovid Goyal 2015-06-13 09:54:09 +05:30
parent 748b18b599
commit 6e2c9c0001
3 changed files with 37 additions and 2 deletions

View File

@ -195,6 +195,8 @@ class RequestData(object): # {{{
self.opts = opts
self.status_code = httplib.CREATED if self.method == 'POST' else httplib.OK
self.outcookie = Cookie()
self.lang_code = self.gettext_func = self.ngettext_func = None
self.set_translator(self.get_preferred_language())
def generate_static_output(self, name, generator):
ans = self.static_cache.get(name)
@ -216,7 +218,20 @@ class RequestData(object): # {{{
return get_translator_for_lang(self.translator_cache, bcp_47_code)
def get_preferred_language(self):
return preferred_lang(self.outheaders.get('Accept-Language'), self.get_translator)
return preferred_lang(self.inheaders.get('Accept-Language'), self.get_translator)
def _(self, text):
return self.gettext_func(text)
def ngettext(self, singular, plural, n):
return self.ngettext_func(singular, plural, n)
def set_translator(self, lang_code):
if lang_code != self.lang_code:
found, lang, t = self.get_translator(lang_code)
self.lang_code = lang
self.gettext_func = t.ugettext
self.ngettext_func = t.ungettext
# }}}
class ReadableOutput(object):

View File

@ -69,6 +69,7 @@ class TestHTTP(BaseTest):
def test_accept_language(self): # {{{
'Test parsing of Accept-Language'
from calibre.srv.http_response import preferred_lang
from calibre.utils.localization import get_translator
def test(name, val, ans):
self.ae(preferred_lang(val, lambda x:(True, x, None)), ans, name + ' failed')
test('Empty field', '', 'en')
@ -76,6 +77,24 @@ class TestHTTP(BaseTest):
test('Case insensitive', 'Es', 'es')
test('Multiple', 'fr, es', 'fr')
test('Priority', 'en;q=0.1, de;q=0.7, fr;q=0.5', 'de')
def handler(data):
return data.lang_code + data._('Unknown')
with TestServer(handler, timeout=0.1) as server:
conn = server.connect()
def test(al, q):
conn.request('GET', '/', headers={'Accept-Language': al})
r = conn.getresponse()
self.ae(r.status, httplib.OK)
q += get_translator(q)[-1].ugettext('Unknown')
self.ae(r.read(), q)
test('en', 'en')
test('eng', 'en')
test('es', 'es')
# }}}
def test_range_parsing(self): # {{{
@ -377,3 +396,4 @@ class TestHTTP(BaseTest):
r = conn.getresponse()
self.assertEqual(data, r.read())
# }}}

View File

@ -115,7 +115,7 @@ def get_single_translator(mpath):
def get_translator(bcp_47_code):
parts = bcp_47_code.replace('-', '_').split('_')[:2]
parts[0] = lang_as_iso639_1(parts[0].lower())
parts[0] = lang_as_iso639_1(parts[0].lower()) or 'en'
if len(parts) > 1:
parts[1] = parts[1].upper()
lang = '_'.join(parts)