diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2012-11-17 00:58:33 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2012-11-17 02:42:12 (GMT) |
commit | b060c4cc925fe1b88002093d9d0a9f1d02a3dc7c (patch) | |
tree | b3def50959232826d05e3bb221c6b2fe1802e80f | |
parent | 60fa4a35ecdca97fe5c18e3cf3e0960151d6530c (diff) |
Strip langs to extend searching for translated strings
-rw-r--r-- | active_document/__init__.py | 2 | ||||
-rw-r--r-- | active_document/commands.py | 4 | ||||
-rw-r--r-- | active_document/document.py | 22 | ||||
-rw-r--r-- | active_document/env.py | 35 | ||||
-rw-r--r-- | active_document/index.py | 3 | ||||
-rw-r--r-- | active_document/volume.py | 8 | ||||
-rwxr-xr-x | tests/units/env.py | 29 | ||||
-rwxr-xr-x | tests/units/index.py | 4 |
8 files changed, 72 insertions, 35 deletions
diff --git a/active_document/__init__.py b/active_document/__init__.py index cf21a3a..376f5d3 100644 --- a/active_document/__init__.py +++ b/active_document/__init__.py @@ -21,7 +21,7 @@ from active_document.env import ACCESS_CREATE, ACCESS_WRITE, ACCESS_READ, \ index_flush_timeout, index_flush_threshold, \ index_write_queue, \ BadRequest, NotFound, Forbidden, Seqno, DEFAULT_LANG, \ - uuid, default_lang + uuid, default_lang, gettext from active_document.metadata import Metadata, PropertyMeta, Property, \ StoredProperty, ActiveProperty, BlobProperty, BrowsableProperty, \ diff --git a/active_document/commands.py b/active_document/commands.py index 235b9af..f6aa681 100644 --- a/active_document/commands.py +++ b/active_document/commands.py @@ -170,6 +170,7 @@ class CommandsProcessor(object): } self.volume = volume self.parent = parent + self._lang = env.default_lang() for scope, kwargs in _scan_class(self.__class__, False): cmd = _Command((self,), **kwargs) @@ -196,6 +197,9 @@ class CommandsProcessor(object): request.commands = self request.response = response + if not request.accept_language: + request.accept_language = [self._lang] + for arg, cast in cmd.arguments.items(): if arg not in request: continue diff --git a/active_document/document.py b/active_document/document.py index 79685a9..9305283 100644 --- a/active_document/document.py +++ b/active_document/document.py @@ -80,7 +80,7 @@ class Document(object): if value is not None and accept_language: if isinstance(prop, StoredProperty) and prop.localized: - value = self._localize(value, accept_language) + value = env.gettext(value, accept_language) return value @@ -98,23 +98,3 @@ class Document(object): def __setitem__(self, prop, value): self.props[prop] = value - - def _localize(self, value, accept_language): - if not value: - return '' - if not isinstance(value, dict): - return value - - for lang in accept_language + [env.DEFAULT_LANG]: - result = value.get(lang) - if result is not None: - return result - lang = lang.split('-') - if len(lang) == 1: - continue - result = value.get(lang[0]) - if result is not None: - return result - - # TODO - return value[sorted(value.keys())[0]] diff --git a/active_document/env.py b/active_document/env.py index debf81b..f5e2d9c 100644 --- a/active_document/env.py +++ b/active_document/env.py @@ -90,11 +90,44 @@ def uuid(): def default_lang(): lang = locale.getdefaultlocale()[0] if lang: - return lang.replace('_', '-') + return lang.replace('_', '-').lower() else: return DEFAULT_LANG +def gettext(value, accept_language=None): + if not value: + return '' + if not isinstance(value, dict): + return value + + if isinstance(accept_language, basestring): + accept_language = [accept_language] + stripped_value = None + + for lang in (accept_language or []) + [DEFAULT_LANG]: + result = value.get(lang) + if result is not None: + return result + + prime_lang = lang.split('-')[0] + if prime_lang != lang: + result = value.get(prime_lang) + if result is not None: + return result + + if stripped_value is None: + stripped_value = {} + for k, v in value.items(): + if '-' in k: + stripped_value[k.split('-', 1)[0]] = v + result = stripped_value.get(prime_lang) + if result is not None: + return result + + return value[min(value.keys())] + + class BadRequest(Exception): """Bad requested resource.""" pass diff --git a/active_document/index.py b/active_document/index.py index 00b69b8..03adf8d 100644 --- a/active_document/index.py +++ b/active_document/index.py @@ -336,8 +336,7 @@ class IndexWriter(IndexReader): add_value = xapian.sortable_serialise(value) else: if prop.localized: - value = value.get(self._lang) or \ - value.get(env.DEFAULT_LANG) or '' + value = env.gettext(value, self._lang) or '' add_value = prop.to_string(value)[0] document.add_value(prop.slot, add_value) diff --git a/active_document/volume.py b/active_document/volume.py index c9fa81d..cd9132c 100644 --- a/active_document/volume.py +++ b/active_document/volume.py @@ -128,7 +128,6 @@ class VolumeCommands(CommandsProcessor): def __init__(self, volume): CommandsProcessor.__init__(self, volume) self.volume = volume - self._lang = [env.default_lang()] @directory_command(method='POST', permissions=env.ACCESS_AUTH, mime_type='application/json') @@ -205,7 +204,7 @@ class VolumeCommands(CommandsProcessor): prop.assert_access(env.ACCESS_READ) if isinstance(prop, StoredProperty): - value = doc.get(prop.name, request.accept_language or self._lang) + value = doc.get(prop.name, request.accept_language) value = prop.on_get(doc, value) if value is None: value = prop.default @@ -252,7 +251,7 @@ class VolumeCommands(CommandsProcessor): blobs.append((name, value)) else: if prop.localized and isinstance(value, basestring): - value = {(request.accept_language or self._lang)[0]: value} + value = {request.accept_language[0]: value} try: doc.props[name] = prop.decode(value) except Exception, error: @@ -278,12 +277,11 @@ class VolumeCommands(CommandsProcessor): def _get_props(self, doc, request): result = {} - lang = request.accept_language or self._lang metadata = doc.metadata doc.request = request for name in request['reply']: prop = metadata[name] - value = prop.on_get(doc, doc.get(name, lang)) + value = prop.on_get(doc, doc.get(name, request.accept_language)) if value is None: value = prop.default result[name] = value diff --git a/tests/units/env.py b/tests/units/env.py index e2bf54f..c5f0b56 100755 --- a/tests/units/env.py +++ b/tests/units/env.py @@ -5,13 +5,13 @@ from os.path import exists from __init__ import tests -from active_document.env import Seqno +from active_document import env class EnvTest(tests.Test): def test_Seqno_commit(self): - seqno = Seqno('seqno') + seqno = env.Seqno('seqno') self.assertEqual(False, seqno.commit()) assert not exists('seqno') @@ -22,10 +22,33 @@ class EnvTest(tests.Test): self.assertEqual(False, seqno.commit()) seqno.next() - seqno = Seqno('seqno') + seqno = env.Seqno('seqno') self.assertEqual(1, seqno.value) self.assertEqual(False, seqno.commit()) + def test_gettext(self): + # Fallback to default lang + env.DEFAULT_LANG = 'default' + self.assertEqual('foo', env.gettext({'lang': 'foo', 'default': 'bar'}, 'lang')) + self.assertEqual('bar', env.gettext({'lang': 'foo', 'default': 'bar'}, 'fake')) + + # Exact accept_language + self.assertEqual('', env.gettext(None, 'lang')) + self.assertEqual('foo', env.gettext('foo', 'lang')) + self.assertEqual('foo', env.gettext({'lang': 'foo', 'fake': 'bar', 'default': 'default'}, 'lang')) + self.assertEqual('foo', env.gettext({'lang': 'foo', 'fake': 'bar', 'default': 'default'}, ['lang', 'fake'])) + self.assertEqual('bar', env.gettext({'lang': 'foo', 'fake': 'bar', 'default': 'default'}, ['fake', 'lang'])) + + # Last resort + self.assertEqual('foo', env.gettext({'1': 'foo', '2': 'bar'}, 'fake')) + + # Primed accept_language + self.assertEqual('foo', env.gettext({'1': 'foo', '2': 'bar', 'default': 'default'}, '1-a')) + + # Primed i18n value + self.assertEqual('bar', env.gettext({'1-a': 'foo', '1': 'bar', 'default': 'default'}, '1-b')) + self.assertEqual('foo', env.gettext({'1-a': 'foo', '2': 'bar', 'default': 'default'}, '1-b')) + if __name__ == '__main__': tests.main() diff --git a/tests/units/index.py b/tests/units/index.py index 709b167..13d6d56 100755 --- a/tests/units/index.py +++ b/tests/units/index.py @@ -542,18 +542,18 @@ class IndexTest(tests.Test): db.store('3', {'prop': {current_lang: '3', 'foo': '7'}}, True) self.assertEqual([ - {'guid': '0'}, {'guid': '1'}, {'guid': '2'}, {'guid': '3'}, + {'guid': '0'}, ], db._find(order_by='prop')[0]) self.assertEqual([ + {'guid': '0'}, {'guid': '3'}, {'guid': '2'}, {'guid': '1'}, - {'guid': '0'}, ], db._find(order_by='-prop')[0]) |