From 95bac3143effb047faa01815897cdc9375e0e14e Mon Sep 17 00:00:00 2001 From: Mike Hiretsky Date: Wed, 16 May 2012 12:09:46 +0400 Subject: [PATCH] Improve translate --- calculate/lib/cl_lang.py | 43 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/calculate/lib/cl_lang.py b/calculate/lib/cl_lang.py index 1941943..09da073 100644 --- a/calculate/lib/cl_lang.py +++ b/calculate/lib/cl_lang.py @@ -16,15 +16,10 @@ import os, gettext import threading +import types +import sys from cl_overriding import __findFileMO -class GlobalParam(type): - """ Metaclass for global parameters - """ - def __init__(cls, *args): - cls.GP = [] - cls.GP.append("") - #gettext.find = __findFileMO class lang: @@ -50,14 +45,13 @@ class lang: or lang(_local="calc",__setLang=sys.modules[__name__]) """ - __metaclass__ = GlobalParam + _modnames = {} + GP = [""] + def __init__(self): self.nameDomain = self.GP[0] #self.nameDomain = '' self.__catalog = None - # language autodetect - # dictionary modules - self.__modnames = {} # translate language for all modules self._translators = {} @@ -65,7 +59,7 @@ class lang: """Method return message without changes""" return self.__gettranslate()(message) - def setLanguage(self,module): + def setLanguage(self,module,glob=False): """Set translate language for modules 'module'. module - export python module @@ -73,21 +67,26 @@ class lang: set for them Method must be call after module for translate""" t = vars(module) - for i in dir(module): - q = str(t[i]) - if 'module' in q and not '__' in i and not '/usr/lib' in q\ - and not 'built-in' in q : - mod = vars(module)[i] - self.__setLang(mod) + if glob: + for name,mod in vars(module).items(): + if type(mod) == types.ModuleType and \ + not name.startswith('__') and \ + not name in sys.builtin_module_names and \ + (hasattr(mod,'__file__') and ( + "calculate" in mod.__file__ or + not mod.__file__.startswith('/usr/lib'))): + self.__setLang(mod) + self.setLanguage(mod,True) return self.__setLang(module) def __setLang(self,module): """ Set translate language for module 'module'. """ - if module.__name__ in self.__modnames.keys(): + if module.__name__ in self._modnames.keys(): return True module._ = self.__translate + self._modnames[module.__name__] = module._ def __gettranslate(self): env = os.environ @@ -117,8 +116,8 @@ class lang: def getTranslatorByName(self,namemodule): """Method for detect already imported translate modules """ - if self.__modnames.has_key(namemodule): - return self.__modnames[namemodule] + if self._modnames.has_key(namemodule): + return self._modnames[namemodule] return 0 def setGlobalDomain(self, nameDomain): @@ -138,7 +137,7 @@ def setGlobalTranslate(domain,*modules): _lang = lang() _lang.setGlobalDomain(domain) for mod in modules: - _lang.setLanguage(mod) + _lang.setLanguage(mod,glob=True) def setLocalTranslate(domain,*modules): _lang = lang()