summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkali <kali@leap.se>2012-12-21 10:28:46 +0900
committerkali <kali@leap.se>2012-12-21 10:28:46 +0900
commitec0fc05e3918782dbb29f9f6901c0de22419134d (patch)
treee5e49bc7601e08cc604b54c1388c0fd0241f980b
parentea4a3b3396caeeaa2be4dc46aecf386a56a522c9 (diff)
magic translatable objects
-rw-r--r--src/leap/base/pluggableconfig.py18
-rw-r--r--src/leap/base/specs.py6
-rw-r--r--src/leap/base/tests/test_providers.py10
-rw-r--r--src/leap/util/tests/test_translations.py22
-rw-r--r--src/leap/util/translations.py43
5 files changed, 85 insertions, 14 deletions
diff --git a/src/leap/base/pluggableconfig.py b/src/leap/base/pluggableconfig.py
index 0ca985ea..3517db6b 100644
--- a/src/leap/base/pluggableconfig.py
+++ b/src/leap/base/pluggableconfig.py
@@ -10,6 +10,8 @@ import urlparse
import jsonschema
+from leap.util.translations import LEAPTranslatable
+
logger = logging.getLogger(__name__)
@@ -118,7 +120,6 @@ adaptors['json'] = JSONAdaptor()
# to proper python types.
# TODO:
-# - multilingual object.
# - HTTPS uri
@@ -132,6 +133,20 @@ class DateType(object):
return time.strftime(self.fmt, data)
+class TranslatableType(object):
+ """
+ a type that casts to LEAPTranslatable objects.
+ Used for labels we get from providers and stuff.
+ """
+
+ def to_python(self, data):
+ return LEAPTranslatable(data)
+
+ # needed? we already have an extended dict...
+ #def get_prep_value(self, data):
+ #return dict(data)
+
+
class URIType(object):
def to_python(self, data):
@@ -164,6 +179,7 @@ types = {
'date': DateType(),
'uri': URIType(),
'https-uri': HTTPSURIType(),
+ 'translatable': TranslatableType(),
}
diff --git a/src/leap/base/specs.py b/src/leap/base/specs.py
index 962aa07d..f57d7e9c 100644
--- a/src/leap/base/specs.py
+++ b/src/leap/base/specs.py
@@ -22,12 +22,16 @@ leap_provider_spec = {
#'required': True,
},
'name': {
- 'type': dict, # XXX multilingual object?
+ #'type': LEAPTranslatable,
+ 'type': dict,
+ 'format': 'translatable',
'default': {u'en': u'Test Provider'}
#'required': True
},
'description': {
+ #'type': LEAPTranslatable,
'type': dict,
+ 'format': 'translatable',
'default': {u'en': u'Test provider'}
},
'enrollment_policy': {
diff --git a/src/leap/base/tests/test_providers.py b/src/leap/base/tests/test_providers.py
index 9c11f270..f257f54d 100644
--- a/src/leap/base/tests/test_providers.py
+++ b/src/leap/base/tests/test_providers.py
@@ -15,10 +15,12 @@ from leap.base import providers
EXPECTED_DEFAULT_CONFIG = {
u"api_version": u"0.1.0",
- u"description": {u'en': u"Test provider"},
+ #u"description": "LEAPTranslatable<{u'en': u'Test provider'}>",
+ u"description": {u'en': u'Test provider'},
u"default_language": u"en",
#u"display_name": {u'en': u"Test Provider"},
u"domain": u"testprovider.example.org",
+ #u'name': "LEAPTranslatable<{u'en': u'Test Provider'}>",
u'name': {u'en': u'Test Provider'},
u"enrollment_policy": u"open",
#u"serial": 1,
@@ -66,6 +68,7 @@ class TestLeapProviderDefinition(BaseLeapTest):
self.definition.save(to=self.testfile, force=True)
deserialized = json.load(open(self.testfile, 'rb'))
self.maxDiff = None
+ #import ipdb;ipdb.set_trace()
self.assertEqual(deserialized, EXPECTED_DEFAULT_CONFIG)
def test_provider_dump_to_slug(self):
@@ -84,8 +87,9 @@ class TestLeapProviderDefinition(BaseLeapTest):
with open(self.testfile, 'w') as wf:
wf.write(json.dumps(EXPECTED_DEFAULT_CONFIG))
self.definition.load(fromfile=self.testfile)
- self.assertDictEqual(self.config,
- EXPECTED_DEFAULT_CONFIG)
+ #self.assertDictEqual(self.config,
+ #EXPECTED_DEFAULT_CONFIG)
+ self.assertItemsEqual(self.config, EXPECTED_DEFAULT_CONFIG)
def test_provider_validation(self):
self.definition.validate(self.config)
diff --git a/src/leap/util/tests/test_translations.py b/src/leap/util/tests/test_translations.py
new file mode 100644
index 00000000..794daeba
--- /dev/null
+++ b/src/leap/util/tests/test_translations.py
@@ -0,0 +1,22 @@
+import unittest
+
+from leap.util import translations
+
+
+class TrasnlationsTestCase(unittest.TestCase):
+ """
+ tests for translation functions and classes
+ """
+
+ def setUp(self):
+ self.trClass = translations.LEAPTranslatable
+
+ def test_trasnlatable(self):
+ tr = self.trClass({"en": "house", "es": "casa"})
+ eq = self.assertEqual
+ eq(tr.tr(to="es"), "casa")
+ eq(tr.tr(to="en"), "house")
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/src/leap/util/translations.py b/src/leap/util/translations.py
index c06aa947..14b8c020 100644
--- a/src/leap/util/translations.py
+++ b/src/leap/util/translations.py
@@ -1,6 +1,10 @@
import inspect
+import logging
from PyQt4.QtCore import QCoreApplication
+from PyQt4.QtCore import QLocale
+
+logger = logging.getLogger(__name__)
"""
here I could not do all that I wanted.
@@ -20,15 +24,12 @@ I guess we could generate the xml for ourselves as a last recourse.
qtTranslate = QCoreApplication.translate
-class LEAPTr:
- pass
-
-
-def translate(*args):
+def translate(*args, **kwargs):
"""
+ our magic function.
translate(Context, text, comment)
"""
- print 'translating...'
+ #print 'translating...'
klsname = None
try:
# get class value from instance
@@ -37,7 +38,7 @@ def translate(*args):
self = inspect.getargvalues(prev_frame).locals.get('self')
if self:
# XXX will this work with QObject wrapper??
- if isinstance(LEAPTr, self) and hasattr(self, 'tr'):
+ if isinstance(LEAPTranslatable, self) and hasattr(self, 'tr'):
print "we got a self in base class"
return self.tr(*args)
@@ -45,9 +46,10 @@ def translate(*args):
# but this is useless, the parser
# has already got the context.
klsname = self.__class__.__name__
- print 'KLSNAME -- ', klsname
+ #print 'KLSNAME -- ', klsname
except:
- print 'error getting stack frame'
+ logger.error('error getting stack frame')
+ #print 'error getting stack frame'
if klsname:
nargs = (klsname,) + args
@@ -56,3 +58,26 @@ def translate(*args):
else:
nargs = ('default', ) + args
return qtTranslate(*nargs)
+
+
+class LEAPTranslatable(dict):
+ """
+ An extended dict that implements a .tr method
+ so it can be translated on the fly by our
+ magic translate method
+ """
+
+ try:
+ locale = str(QLocale.system().name()).split('_')[0]
+ except:
+ logger.warning("could not get system locale!")
+ print "could not get system locale!"
+ locale = "en"
+
+ def tr(self, to=None):
+ if not to:
+ to = self.locale
+ _tr = self.get(to, None)
+ if not _tr:
+ _tr = self.get("en", None)
+ return _tr