From 31c716d9274ab54d67e6322185970b4cca6b7ada Mon Sep 17 00:00:00 2001 From: Yusei Tahara <yusei@nexedi.com> Date: Wed, 27 Aug 2008 12:56:07 +0000 Subject: [PATCH] 2008-08-27 yusei * Improve pot file export. git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@23197 20353a03-c40f-0410-a6d1-a30d3c3de9de --- .../ExtensionTemplateItem/Glossary.py | 19 ++++++--- .../PythonScriptParserUtility.py | 33 +++++++++++++++ ...ase_findMessageListFromPythonInProduct.xml | 37 +++++++++++++++++ ...slatedMessageListFromEntireSystemAsPot.xml | 41 +++++++++++++++---- bt5/erp5_forge/bt/change_log | 3 ++ bt5/erp5_forge/bt/revision | 2 +- 6 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/Base_findMessageListFromPythonInProduct.xml diff --git a/bt5/erp5_forge/ExtensionTemplateItem/Glossary.py b/bt5/erp5_forge/ExtensionTemplateItem/Glossary.py index 1adf1beaab..0bf2952af9 100644 --- a/bt5/erp5_forge/ExtensionTemplateItem/Glossary.py +++ b/bt5/erp5_forge/ExtensionTemplateItem/Glossary.py @@ -11,7 +11,7 @@ def getPropertySheetAttributeList(name): def getActionTitleListFromAllActionProvider(portal): - result = {} + result = [] provider_list = [] for provider_id in portal.portal_actions.listActionProviders(): if provider_id in ('portal_types', 'portal_workflow'): @@ -24,13 +24,16 @@ def getActionTitleListFromAllActionProvider(portal): for typeinfo in portal.portal_types.objectValues(): provider_list.append(typeinfo) - for action in provider.listActions(): - result[action.title] = None - return result.keys() + for provider in provider_list: + for action in provider.listActions(): + result.append((action.title, provider.getId())) + return result from StringIO import StringIO from TAL.HTMLTALParser import HTMLTALParser +from TAL.TALParser import TALParser +from TAL.TALGenerator import TALGenerator def findStaticTranslationText(page_template): def iterate(node, target_name, function): if type(node) is list: @@ -56,7 +59,12 @@ def findStaticTranslationText(page_template): if interpreter._i18n_message_id_dict is not None: text_dict.update(interpreter._i18n_message_id_dict) - parser = HTMLTALParser() + if page_template.html(): + generator = TALGenerator(xml=0) + parser = HTMLTALParser(generator) + else: + generator = TALGenerator(xml=1) + parser = TALParser(generator) parser.parseString(page_template._text) iterate(parser.gen.program, 'insertTranslation', addText) return text_dict.keys() @@ -92,4 +100,3 @@ def setGuard(self, guard): self.guard = guard else: raise ValueError, "not a TransitionDefinition" - diff --git a/bt5/erp5_forge/ExtensionTemplateItem/PythonScriptParserUtility.py b/bt5/erp5_forge/ExtensionTemplateItem/PythonScriptParserUtility.py index bc23be3a19..91fb556217 100644 --- a/bt5/erp5_forge/ExtensionTemplateItem/PythonScriptParserUtility.py +++ b/bt5/erp5_forge/ExtensionTemplateItem/PythonScriptParserUtility.py @@ -21,6 +21,8 @@ class Visitor(compiler.visitor.ASTVisitor): value = concatenate_add_const_value(arg) if value is not None: self.result.append(value) + for child_node in node.args: + self.preorder(child_node, self) def concatenate_add_const_value(node): @@ -47,3 +49,34 @@ def getFunctionFirstArgumentValue(func_name, source): visitor = Visitor(func_name) compiler.walk(ast, visitor) return visitor.result + + +# +# Collect translation message from products +# +import os.path +import Products.ERP5 +def findMessageListFromPythonInProduct(function_name_list): + product_dir = os.path.dirname(Products.ERP5.__path__[0]) + erp5_product_list = ('CMFActivity', 'CMFCategory', + 'ERP5', 'ERP5Banking', 'ERP5Catalog', 'ERP5Configurator', + 'ERP5Form', 'ERP5OOo', 'ERP5Security', 'ERP5Subversion', + 'ERP5SyncML', 'ERP5Type', 'ERP5Wizard', 'ERP5Workflow', + 'HBTreeFolder2', 'MailTemplates', 'TimerService', + 'ZMySQLDA', 'ZMySQLDDA', 'ZSQLCatalog', + ) + result = [] + def findStaticMessage(file_path): + source = open(file_path).read() + for func_name in function_name_list: + call_func_name = '%s(' % func_name + if call_func_name in source: + for m in getFunctionFirstArgumentValue(func_name, source): + result.append((m, file_path)) + def visit(arg, dirname, filename_list): + for filename in filename_list: + if filename.endswith('.py'): + findStaticMessage(os.path.join(dirname, filename)) + for product_name in erp5_product_list: + os.path.walk(os.path.join(product_dir, product_name), visit, None) + return result diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/Base_findMessageListFromPythonInProduct.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/Base_findMessageListFromPythonInProduct.xml new file mode 100644 index 0000000000..08ae338c26 --- /dev/null +++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/Base_findMessageListFromPythonInProduct.xml @@ -0,0 +1,37 @@ +<?xml version="1.0"?> +<ZopeData> + <record id="1" aka="AAAAAAAAAAE="> + <pickle> + <tuple> + <global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/> + <tuple/> + </tuple> + </pickle> + <pickle> + <dictionary> + <item> + <key> <string>__ac_local_roles__</string> </key> + <value> + <none/> + </value> + </item> + <item> + <key> <string>_function</string> </key> + <value> <string>findMessageListFromPythonInProduct</string> </value> + </item> + <item> + <key> <string>_module</string> </key> + <value> <string>PythonScriptParserUtility</string> </value> + </item> + <item> + <key> <string>id</string> </key> + <value> <string>Base_findMessageListFromPythonInProduct</string> </value> + </item> + <item> + <key> <string>title</string> </key> + <value> <string></string> </value> + </item> + </dictionary> + </pickle> + </record> +</ZopeData> diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_getToBeTranslatedMessageListFromEntireSystemAsPot.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_getToBeTranslatedMessageListFromEntireSystemAsPot.xml index fff72366b3..fb47a422b2 100644 --- a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_getToBeTranslatedMessageListFromEntireSystemAsPot.xml +++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_toolbox/ERP5Site_getToBeTranslatedMessageListFromEntireSystemAsPot.xml @@ -92,12 +92,19 @@ def iterate(obj):\n form_list.append(i)\n elif i.meta_type==\'ListBox\' or i.id==\'listbox\':\n listbox_list.append(i)\n - elif i.meta_type==\'Page Template\' and i.content_type.startswith(\'text/html\'):\n + elif i.meta_type in (\'Page Template\',\n + \'ERP5 PDF Template\',\n + \'ERP5 OOo Template\'):\n page_template_list.append(i)\n if i.isPrincipiaFolderish:\n iterate(i)\n iterate(context.portal_skins)\n \n +# Collect python script from workflow objects.\n +for workflow in context.portal_workflow.objectValues():\n + for i in workflow.scripts.objectValues():\n + if i.meta_type==\'Script (Python)\':\n + python_script_list.append(i)\n \n #\n # Python Script\n @@ -116,6 +123,11 @@ for i in python_script_list:\n for m in Base_getFunctionFirstArgumentValue(func_name, source):\n add_message(m, portal_url.getRelativeContentURL(i))\n \n +#\n +# Python in Products\n +#\n +for message, path in context.Base_findMessageListFromPythonInProduct(FUNC_NAME_LIST):\n + add_message(message, path)\n \n #\n # ERP5 Form title\n @@ -129,9 +141,9 @@ for i in form_list:\n #\n for i in listbox_list:\n add_message(i.title(), portal_url.getRelativeContentURL(i))\n - for value, label in i.get_value(\'columns\'):\n + for value, label in i.get_value(\'columns\') or ():\n add_message(label, portal_url.getRelativeContentURL(i))\n - for value, label in i.get_value(\'all_columns\'):\n + for value, label in i.get_value(\'all_columns\') or ():\n add_message(label, portal_url.getRelativeContentURL(i))\n \n #\n @@ -146,6 +158,7 @@ for i in page_template_list:\n # Workflow\n #\n for i in context.portal_workflow.objectValues():\n + add_message(i.title_or_id(), portal_url.getRelativeContentURL(i))\n if not i.states:\n continue\n for s in i.states.values():\n @@ -157,6 +170,8 @@ for i in context.portal_workflow.objectValues():\n for t in i.transitions.values():\n if t.actbox_name:\n add_message(t.actbox_name, portal_url.getRelativeContentURL(t))\n + for worklist in i.worklists.objectValues():\n + add_message(worklist.actbox_name, portal_url.getRelativeContentURL(worklist))\n \n \n #\n @@ -169,8 +184,8 @@ for i in context.portal_types.objectValues():\n #\n # Action\n #\n -for action_title in context.Base_getActionTitleListFromAllActionProvider(context.getPortalObject()):\n - add_message(action_title, \'action\')\n +for action_title, action_provider_id in context.Base_getActionTitleListFromAllActionProvider(context.getPortalObject()):\n + add_message(action_title, action_provider_id)\n \n \n #\n @@ -262,24 +277,28 @@ return printed\n <string>listbox_list</string> <string>page_template_list</string> <string>iterate</string> - <string>FUNC_NAME_LIST</string> - <string>Base_getFunctionFirstArgumentValue</string> <string>_getiter_</string> + <string>workflow</string> <string>i</string> + <string>FUNC_NAME_LIST</string> + <string>Base_getFunctionFirstArgumentValue</string> <string>source</string> <string>func_name</string> <string>call_func_name</string> <string>m</string> + <string>message</string> + <string>path</string> <string>value</string> <string>label</string> <string>Base_findStaticTranslationText</string> <string>s</string> <string>t</string> + <string>worklist</string> <string>action_title</string> + <string>action_provider_id</string> <string>format</string> <string>MESSAGE_TEMPLATE</string> <string>message_list</string> - <string>message</string> <string>_getitem_</string> <string>comment_list</string> <string>append</string> @@ -304,6 +323,12 @@ return printed\n <key> <string>id</string> </key> <value> <string>ERP5Site_getToBeTranslatedMessageListFromEntireSystemAsPot</string> </value> </item> + <item> + <key> <string>uid</string> </key> + <value> + <none/> + </value> + </item> <item> <key> <string>warnings</string> </key> <value> diff --git a/bt5/erp5_forge/bt/change_log b/bt5/erp5_forge/bt/change_log index adc8b154bf..85478dde10 100644 --- a/bt5/erp5_forge/bt/change_log +++ b/bt5/erp5_forge/bt/change_log @@ -1,3 +1,6 @@ +2008-08-27 yusei +* Improve pot file export. + 2008-06-16 Nicolas Add external Method to see Security for arbitrary user diff --git a/bt5/erp5_forge/bt/revision b/bt5/erp5_forge/bt/revision index 194ba8cc75..9d239ff807 100644 --- a/bt5/erp5_forge/bt/revision +++ b/bt5/erp5_forge/bt/revision @@ -1 +1 @@ -320 \ No newline at end of file +321 \ No newline at end of file -- 2.30.9