From 7b03ee7cb31725389aa888e9d2856a92e2e9b28e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois-Xavier=20Algrain?= <fxalgrain@tiolive.com>
Date: Tue, 28 Jun 2011 12:45:35 +0200
Subject: [PATCH] Add Po File Generation from a Category File

Add an action on the category tool. See tips on the dialog to know how to use it.
This script is based on category file import
---
 .../generate_translation_file.xml             |  85 ++++++++++
 .../CategoryTool_generateTranslationFile.xml  | 152 ++++++++++++++++++
 ...Tool_viewGenerateTranslationFileDialog.xml | 134 +++++++++++++++
 .../category_import_tips.xml                  | 114 +++++++++++++
 .../your_error_report.xml                     | 101 ++++++++++++
 .../your_import_file.xml                      | 106 ++++++++++++
 .../your_translation_prefix.xml               | 101 ++++++++++++
 bt5/erp5_forge/bt/revision                    |   2 +-
 bt5/erp5_forge/bt/template_action_path_list   |   1 +
 9 files changed, 795 insertions(+), 1 deletion(-)
 create mode 100644 bt5/erp5_forge/ActionTemplateItem/portal_types/Category%20Tool/generate_translation_file.xml
 create mode 100644 bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_generateTranslationFile.xml
 create mode 100644 bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog.xml
 create mode 100644 bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/category_import_tips.xml
 create mode 100644 bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_error_report.xml
 create mode 100644 bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_import_file.xml
 create mode 100644 bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_translation_prefix.xml

diff --git a/bt5/erp5_forge/ActionTemplateItem/portal_types/Category%20Tool/generate_translation_file.xml b/bt5/erp5_forge/ActionTemplateItem/portal_types/Category%20Tool/generate_translation_file.xml
new file mode 100644
index 0000000000..906ebe9dc7
--- /dev/null
+++ b/bt5/erp5_forge/ActionTemplateItem/portal_types/Category%20Tool/generate_translation_file.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ActionInformation" module="Products.CMFCore.ActionInformation"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>action</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>categories</string> </key>
+            <value>
+              <tuple>
+                <string>action_type/object_exchange</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>category</string> </key>
+            <value> <string>object_exchange</string> </value>
+        </item>
+        <item>
+            <key> <string>condition</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>icon</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>generate_translation_file</string> </value>
+        </item>
+        <item>
+            <key> <string>permissions</string> </key>
+            <value>
+              <tuple>
+                <string>View</string>
+              </tuple>
+            </value>
+        </item>
+        <item>
+            <key> <string>portal_type</string> </key>
+            <value> <string>Action Information</string> </value>
+        </item>
+        <item>
+            <key> <string>priority</string> </key>
+            <value> <float>3.1</float> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Generate Translation File</string> </value>
+        </item>
+        <item>
+            <key> <string>visible</string> </key>
+            <value> <int>1</int> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="Expression" module="Products.CMFCore.Expression"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>text</string> </key>
+            <value> <string>string:${object_url}/CategoryTool_viewGenerateTranslationFileDialog</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_generateTranslationFile.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_generateTranslationFile.xml
new file mode 100644
index 0000000000..8695e52198
--- /dev/null
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_generateTranslationFile.xml
@@ -0,0 +1,152 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>Script_magic</string> </key>
+            <value> <int>3</int> </value>
+        </item>
+        <item>
+            <key> <string>_bind_names</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>_asgns</string> </key>
+                        <value>
+                          <dictionary>
+                            <item>
+                                <key> <string>name_container</string> </key>
+                                <value> <string>container</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_context</string> </key>
+                                <value> <string>context</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_m_self</string> </key>
+                                <value> <string>script</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_subpath</string> </key>
+                                <value> <string>traverse_subpath</string> </value>
+                            </item>
+                          </dictionary>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>_body</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+"""Return a po file from a spreadsheet of categories."""\n
+from Products.ERP5Type.Message import translateString\n
+from Products.ERP5Type.Document import newTempBase\n
+\n
+# Initialise some general variables\n
+detailed_report_result = []\n
+detailed_report_append = detailed_report_result.append\n
+category_dict = {}\n
+translation_dict = {}\n
+translated_attributes_list = ["title", "description", "short_title"]\n
+import_filename = getattr(import_file, \'filename\', \'?\')\n
+request = container.REQUEST\n
+response = request.RESPONSE\n
+\n
+if import_filename==\'\':\n
+  raise ValueError, "You must upload a file"\n
+\n
+def addReportLine(error, category, message):\n
+  report_line = newTempBase(context, \'item\')\n
+  report_line.edit(field_type=error, field_category=category, field_message=message)    \n
+  detailed_report_append(report_line)\n
+\n
+def invalid_category_spreadsheet_handler(message):\n
+  # action taken when an invalid spreadsheet is provided.\n
+  # we *raise* a Redirect, because we don\'t want the transaction to succeed\n
+  # note, we could make a dialog parameter to allow import invalid spreadsheet:\n
+  raise \'Redirect\', \'%s/view?portal_status_message=%s\' % (\n
+                         context.portal_categories.absolute_url(),\n
+                         message)\n
+\n
+category_list_mapping = context.Base_getCategoriesSpreadSheetMapping(import_file,\n
+                                    invalid_spreadsheet_error_handler=invalid_category_spreadsheet_handler)\n
+\n
+if category_list_mapping.has_key(\'error_list\'):\n
+  context.REQUEST.other[\'category_import_report\'] = initial_category_list_mapping[\'error_list\']\n
+  return context.CategoryTool_viewImportReport()\n
+\n
+\n
+\n
+#Process on each category\n
+for base_category, category_list in category_list_mapping.items():\n
+  for category in category_list:\n
+    #Take only needed attributes\n
+    for attribute in translated_attributes_list:\n
+      #Test attribute exist\n
+      if category.has_key(attribute) and category.has_key(translation_prefix+attribute):\n
+        initial_value = category.get(attribute,\'\').strip().replace(\'"\',"\'")\n
+        if initial_value != \'\':\n
+          translate_value = category.get(translation_prefix+attribute,\'\').strip().replace(\'"\',"\'")\n
+          if translate_value != \'\':\n
+            if translation_dict.has_key(initial_value):\n
+              #Test any duplicate  translation (\'car\' can\'t be translated to \'voiture\' and \'auto\', \n
+              #user should be choice \'voiture\' or \'car\')\n
+              if translation_dict[initial_value] != translate_value: \n
+                message = "\'%s\' can\'t be translated by \'%s\'. It\'s already translated by \'%s\'" % (initial_value, translate_value, translation_dict[initial_value])\n
+                addReportLine(error="Duplicate",category=category[\'path\'], message=message)\n
+            else:\n
+              translation_dict[initial_value] = translate_value\n
+          else:\n
+            message = "No translation for attribute " + attribute\n
+            addReportLine(error="No translation",category=category[\'path\'], message=message)  \n
+\n
+if len(translation_dict) == 0:\n
+  message = "Empty File"\n
+  addReportLine(error="No Results",category="General", message=message)\n
+\n
+if error_report and len(detailed_report_result) > 0:\n
+  context.REQUEST.other[\'category_import_report\'] = detailed_report_result\n
+  return context.CategoryTool_viewImportReport()\n
+\n
+#No error, we build the file\n
+po_data = ""\n
+for msgid, msgstr in translation_dict.items():\n
+  po_data += \'msgid "%s"\\nmsgstr "%s"\\n\\n\' % (msgid, msgstr)\n
+\n
+filename = "%s%s.po" % (translation_prefix,"".join(import_filename.split(\'.\')[:-1]))\n
+document = context.portal_contributions.newContent(data=po_data,\n
+                                                  temp_object=1,\n
+                                                  filename=filename)\n
+\n
+response.setHeader(\'Content-disposition\', \'attachment; filename="%s"\' % filename)\n
+return document.index_html(request, response, None)\n
+
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>_params</string> </key>
+            <value> <string>import_file, error_report, translation_prefix, **kw</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>CategoryTool_generateTranslationFile</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog.xml
new file mode 100644
index 0000000000..5035645ea1
--- /dev/null
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ERP5Form" module="Products.ERP5Form.Form"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_bind_names</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>_asgns</string> </key>
+                        <value>
+                          <dictionary/>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>_objects</string> </key>
+            <value>
+              <tuple/>
+            </value>
+        </item>
+        <item>
+            <key> <string>action</string> </key>
+            <value> <string>CategoryTool_generateTranslationFile</string> </value>
+        </item>
+        <item>
+            <key> <string>description</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>edit_order</string> </key>
+            <value>
+              <list/>
+            </value>
+        </item>
+        <item>
+            <key> <string>encoding</string> </key>
+            <value> <string>UTF-8</string> </value>
+        </item>
+        <item>
+            <key> <string>enctype</string> </key>
+            <value> <string>multipart/form-data</string> </value>
+        </item>
+        <item>
+            <key> <string>group_list</string> </key>
+            <value>
+              <list>
+                <string>left</string>
+                <string>center</string>
+              </list>
+            </value>
+        </item>
+        <item>
+            <key> <string>groups</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>center</string> </key>
+                    <value>
+                      <list>
+                        <string>your_import_file</string>
+                        <string>your_translation_prefix</string>
+                        <string>your_error_report</string>
+                        <string>category_import_tips</string>
+                      </list>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>left</string> </key>
+                    <value>
+                      <list/>
+                    </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>CategoryTool_viewGenerateTranslationFileDialog</string> </value>
+        </item>
+        <item>
+            <key> <string>method</string> </key>
+            <value> <string>POST</string> </value>
+        </item>
+        <item>
+            <key> <string>name</string> </key>
+            <value> <string>CategoryTool_viewGenerateTranslationFileDialog</string> </value>
+        </item>
+        <item>
+            <key> <string>pt</string> </key>
+            <value> <string>form_dialog</string> </value>
+        </item>
+        <item>
+            <key> <string>row_length</string> </key>
+            <value> <int>4</int> </value>
+        </item>
+        <item>
+            <key> <string>stored_encoding</string> </key>
+            <value> <string>UTF-8</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string>Generate Translation File</string> </value>
+        </item>
+        <item>
+            <key> <string>unicode_mode</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>update_action</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>update_action_title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/category_import_tips.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/category_import_tips.xml
new file mode 100644
index 0000000000..6c73aa51a2
--- /dev/null
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/category_import_tips.xml
@@ -0,0 +1,114 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>delegated_list</string> </key>
+            <value>
+              <list>
+                <string>default</string>
+                <string>editable</string>
+                <string>title</string>
+              </list>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>category_import_tips</string> </value>
+        </item>
+        <item>
+            <key> <string>message_values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>external_validator_failed</string> </key>
+                    <value> <string>The input failed the external validator.</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>overrides</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>tales</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>default</string> </key>
+                    <value> <string encoding="cdata"><![CDATA[
+
+Title, Description and Short Title can be translated.\n
+<br/>\n
+If your translation prefix is "french_", please add the column french_title to perform translation on this attribute.\n
+<br />\n
+Disable the error report will force to generate the file.
+
+]]></string> </value>
+                </item>
+                <item>
+                    <key> <string>editable</string> </key>
+                    <value> <int>0</int> </value>
+                </item>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string>my_editor_field</string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string>Base_viewFieldLibrary</string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string>Click to edit the target</string> </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value> <string>Tips</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_error_report.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_error_report.xml
new file mode 100644
index 0000000000..f39d69c27e
--- /dev/null
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_error_report.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>delegated_list</string> </key>
+            <value>
+              <list>
+                <string>default</string>
+                <string>title</string>
+              </list>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>your_error_report</string> </value>
+        </item>
+        <item>
+            <key> <string>message_values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>external_validator_failed</string> </key>
+                    <value> <string>The input failed the external validator.</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>overrides</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>tales</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>default</string> </key>
+                    <value> <int>1</int> </value>
+                </item>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string>my_checkbox</string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string>Base_viewFieldLibrary</string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string>Click to edit the target</string> </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value> <string>Display Error Report</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_import_file.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_import_file.xml
new file mode 100644
index 0000000000..258146f89c
--- /dev/null
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_import_file.xml
@@ -0,0 +1,106 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>delegated_list</string> </key>
+            <value>
+              <list>
+                <string>display_width</string>
+                <string>required</string>
+                <string>title</string>
+              </list>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>your_import_file</string> </value>
+        </item>
+        <item>
+            <key> <string>message_values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>external_validator_failed</string> </key>
+                    <value> <string>The input failed the external validator.</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>overrides</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>tales</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>display_width</string> </key>
+                    <value> <int>80</int> </value>
+                </item>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string>my_file_field</string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string>Base_viewFieldLibrary</string> </value>
+                </item>
+                <item>
+                    <key> <string>required</string> </key>
+                    <value> <int>1</int> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string>Click to edit the target</string> </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value> <string>Category Definition File</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_translation_prefix.xml b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_translation_prefix.xml
new file mode 100644
index 0000000000..704b157f70
--- /dev/null
+++ b/bt5/erp5_forge/SkinTemplateItem/portal_skins/erp5_forge/CategoryTool_viewGenerateTranslationFileDialog/your_translation_prefix.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ProxyField" module="Products.ERP5Form.ProxyField"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>delegated_list</string> </key>
+            <value>
+              <list>
+                <string>required</string>
+                <string>title</string>
+              </list>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>your_translation_prefix</string> </value>
+        </item>
+        <item>
+            <key> <string>message_values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>external_validator_failed</string> </key>
+                    <value> <string>The input failed the external validator.</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>overrides</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>tales</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>field_id</string> </key>
+                    <value> <string>your_string_field</string> </value>
+                </item>
+                <item>
+                    <key> <string>form_id</string> </key>
+                    <value> <string>Base_viewFieldLibrary</string> </value>
+                </item>
+                <item>
+                    <key> <string>required</string> </key>
+                    <value> <int>1</int> </value>
+                </item>
+                <item>
+                    <key> <string>target</string> </key>
+                    <value> <string>Click to edit the target</string> </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value> <string>Translation Prefix</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_forge/bt/revision b/bt5/erp5_forge/bt/revision
index 5cb222c0b2..9ecf271983 100644
--- a/bt5/erp5_forge/bt/revision
+++ b/bt5/erp5_forge/bt/revision
@@ -1 +1 @@
-659
\ No newline at end of file
+660
\ No newline at end of file
diff --git a/bt5/erp5_forge/bt/template_action_path_list b/bt5/erp5_forge/bt/template_action_path_list
index dc540318d6..6478f210dc 100644
--- a/bt5/erp5_forge/bt/template_action_path_list
+++ b/bt5/erp5_forge/bt/template_action_path_list
@@ -19,6 +19,7 @@ Business Template | svn_commit
 Business Template | update_vcs_bt
 Business Template | update_vcs_bt_norevert
 Business Template | view_svn_repos_info
+Category Tool | generate_translation_file
 Glossary Module | create_term_for_translation
 Glossary Module | export_po_file
 Glossary Module | find_duplicate_terms
-- 
2.30.9