Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2012-11-17 00:58:33 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-11-17 02:42:12 (GMT)
commitb060c4cc925fe1b88002093d9d0a9f1d02a3dc7c (patch)
treeb3def50959232826d05e3bb221c6b2fe1802e80f
parent60fa4a35ecdca97fe5c18e3cf3e0960151d6530c (diff)
Strip langs to extend searching for translated strings
-rw-r--r--active_document/__init__.py2
-rw-r--r--active_document/commands.py4
-rw-r--r--active_document/document.py22
-rw-r--r--active_document/env.py35
-rw-r--r--active_document/index.py3
-rw-r--r--active_document/volume.py8
-rwxr-xr-xtests/units/env.py29
-rwxr-xr-xtests/units/index.py4
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])