From 557d3e8f8cfa547e485ad1f29b9d30cfe6a28ac1 Mon Sep 17 00:00:00 2001 From: lars Date: Tue, 28 Nov 2006 14:24:53 +0000 Subject: [PATCH] implemented gettext instead of old hdf style --- src/cryptobox/core/main.py | 3 +++ src/cryptobox/plugins/base.py | 29 +++++++----------------- src/cryptobox/web/sites.py | 42 +++++++++++++++++++++++++++++------ 3 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/cryptobox/core/main.py b/src/cryptobox/core/main.py index 58fcb84..f0f4a60 100644 --- a/src/cryptobox/core/main.py +++ b/src/cryptobox/core/main.py @@ -207,6 +207,9 @@ class CryptoBoxProps(CryptoBox): '''reads all files in path LangDir and returns a list of basenames from existing hdf files, that should are all available languages''' + # TODO: for now we hardcode it - change this! + return "en fr si de".split(" ") + # TODO: old implementation (before gettext) - remove it languages = [ f.rstrip(".hdf") for f in os.listdir(self.prefs["Locations"]["LangDir"]) if f.endswith(".hdf") ] diff --git a/src/cryptobox/plugins/base.py b/src/cryptobox/plugins/base.py index a900b82..7c9e1cf 100644 --- a/src/cryptobox/plugins/base.py +++ b/src/cryptobox/plugins/base.py @@ -81,28 +81,15 @@ class CryptoBoxPlugin: return None - def getLanguageData(self, lang="en"): - try: - import neo_cgi, neo_util - except: - raise CryptoBoxExceptions.CBEnvironmentError("couldn't import 'neo_*'! Try 'apt-get install python-clearsilver'.") - langdir = os.path.abspath(os.path.join(self.pluginDir, "lang")) - ## first: the default language file (english) - langFiles = [os.path.join(langdir, "en.hdf")] - ## maybe we have to load a translation afterwards - if lang != "en": - langFiles.append(os.path.join(langdir, lang + ".hdf")) - file_found = False + def getLanguageData(self): + import neo_cgi, neo_util lang_hdf = neo_util.HDF() - for langFile in langFiles: - if os.access(langFile, os.R_OK): - lang_hdf.readFile(langFile) - file_found = True - if file_found: - return lang_hdf - else: - self.cbox.log.debug("Couldn't find a valid plugin language file (%s)" % str(langFiles)) - return None + langFile = os.path.join(self.pluginDir, 'language.hdf') + try: + lang_hdf.readFile(langFile) + except (neo_util.Error, neo_util.ParseError), errMsg: + self.cbox.log.error("failed to load language file (%s) of plugin (%s):" % (langFile,self.getName())) + return lang_hdf def loadDataSet(self, hdf): diff --git a/src/cryptobox/web/sites.py b/src/cryptobox/web/sites.py index 9049e04..9549c6c 100644 --- a/src/cryptobox/web/sites.py +++ b/src/cryptobox/web/sites.py @@ -16,6 +16,8 @@ except ImportError: raise ImportError, errorMsg +GETTEXT_DOMAIN = 'cryptobox-server' + class PluginIconHandler: @@ -385,7 +387,40 @@ class WebInterfaceSites: return hdf.getValue(value, "") + def __substituteGettext(self, languages, textDomain, hdf): + import gettext + try: + translator = gettext.translation(textDomain, languages=languages) + except IOError, errMsg: + ## no translation found + self.cbox.log.warn("unable to load language file: %s" % errMsg) + return hdf + def walk_tree(hdf_node): + def translate_node(node): + for (key,value) in node.attrs(): + if key == 'LINK': return + node.setValue("",translator.ugettext(node.value())) + while hdf_node: + translate_node(hdf_node) + walk_tree(hdf_node.child()) + hdf_node = hdf_node.next() + walk_tree(hdf) + + def __getLanguageData(self, web_lang="en"): + hdf = neo_util.HDF() + hdf.readFile(os.path.join(self.prefs["Locations"]["TemplateDir"],"language.hdf")) + self.__substituteGettext([web_lang], GETTEXT_DOMAIN, hdf) + ## load the language data of all plugins + for p in self.pluginList.getPlugins(): + pl_lang = p.getLanguageData() + self.__substituteGettext([web_lang], "%s-feature-%s" % (GETTEXT_DOMAIN, p.getName()), pl_lang) + hdf.copy("Plugins.%s" % p.getName(), pl_lang) + self.cbox.log.debug("language data for plugin loaded: %s" % p.getName()) + return hdf + + + def __getLanguageData2(self, web_lang="en"): default_lang = "en" conf_lang = self.prefs["WebSettings"]["Language"] hdf = neo_util.HDF() @@ -427,12 +462,6 @@ class WebInterfaceSites: ## first: assume, that the template file is in the global template directory self.dataset["Settings.TemplateFile"] = os.path.abspath(os.path.join(self.prefs["Locations"]["TemplateDir"], template + ".cs")) - ## load the language data of all plugins - for p in self.pluginList.getPlugins(): - pl_lang = p.getLanguageData(self.dataset["Settings.Language"]) - if pl_lang: - hdf.copy("Lang.Plugins.%s" % p.getName(), pl_lang) - if plugin: ## check, if the plugin provides the template file -> overriding plugin_cs_file = plugin.getTemplateFileName(template) @@ -472,4 +501,3 @@ class WebInterfaceSites: else: yield line + "\n" -