diff --git a/src/calibre/srv/http_response.py b/src/calibre/srv/http_response.py index 320916c54b..ebee920967 100644 --- a/src/calibre/srv/http_response.py +++ b/src/calibre/srv/http_response.py @@ -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): diff --git a/src/calibre/srv/tests/http.py b/src/calibre/srv/tests/http.py index 41e3289883..f0dff627a7 100644 --- a/src/calibre/srv/tests/http.py +++ b/src/calibre/srv/tests/http.py @@ -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()) # }}} + diff --git a/src/calibre/utils/localization.py b/src/calibre/utils/localization.py index 33660cd324..44b1fbb967 100644 --- a/src/calibre/utils/localization.py +++ b/src/calibre/utils/localization.py @@ -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)