diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/leap/base/pluggableconfig.py | 18 | ||||
| -rw-r--r-- | src/leap/base/specs.py | 6 | ||||
| -rw-r--r-- | src/leap/base/tests/test_providers.py | 10 | ||||
| -rw-r--r-- | src/leap/util/tests/test_translations.py | 22 | ||||
| -rw-r--r-- | src/leap/util/translations.py | 43 | 
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 | 
