mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Make translations based on the accept-language header available on the RequestData object
This commit is contained in:
parent
748b18b599
commit
6e2c9c0001
@ -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):
|
||||
|
@ -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())
|
||||
# }}}
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user