From 8b42f3edcc7aa68692288750edf1e6809ccdf9a8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <jerome@nexedi.com>
Date: Fri, 12 Jun 2020 14:46:00 +0900
Subject: [PATCH] web_renderjs_ui: rework "Update Translation Data" action

- user no longer have to choose the translation data script, it's
  selected automatically from the translation gadget configured on the
  web site
- add some notes in workflow history for traceability
- rename from "Create Translation Data" to *Update* Translation Data, as
  this script can be called multiple times to update
- rename the dialog and script to comply with naming conventions
- add a header to generated translation data script to explain that this
  is generated and that it should not be edited manually
- generate code passing jslint and typescript
---
 .../Web%20Site/create_translation_data.xml    |   4 +-
 .../rjs_gadget_translation_data_js.js         |  15 +-
 .../Base_createTranslateData.py               |  53 ----
 .../your_translation_data_file.xml            | 123 --------
 .../WebSite_getTranslationDataTextContent.py  |  50 +++
 ...WebSite_getTranslationDataTextContent.xml} |   4 +-
 ...ebSite_getTranslationDataWebScriptValue.py |  20 ++
 ...bSite_getTranslationDataWebScriptValue.xml |  62 ++++
 .../WebSite_updateTranslationData.py          |  30 ++
 .../WebSite_updateTranslationData.xml         |  62 ++++
 ...bSite_viewUpdateTranslationDataDialog.xml} |  14 +-
 .../your_translation_data_reference.xml       | 287 ++++++++++++++++++
 .../Base_createBaseLanguage.py                |   2 +-
 13 files changed, 535 insertions(+), 191 deletions(-)
 delete mode 100644 bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/Base_createTranslateData.py
 delete mode 100644 bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_createTranslationData/your_translation_data_file.xml
 create mode 100644 bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataTextContent.py
 rename bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/{Base_createTranslateData.xml => WebSite_getTranslationDataTextContent.xml} (93%)
 create mode 100644 bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataWebScriptValue.py
 create mode 100644 bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataWebScriptValue.xml
 create mode 100644 bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_updateTranslationData.py
 create mode 100644 bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_updateTranslationData.xml
 rename bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/{WebSite_createTranslationData.xml => WebSite_viewUpdateTranslationDataDialog.xml} (88%)
 create mode 100644 bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_viewUpdateTranslationDataDialog/your_translation_data_reference.xml

diff --git a/bt5/erp5_web_renderjs_ui/ActionTemplateItem/portal_types/Web%20Site/create_translation_data.xml b/bt5/erp5_web_renderjs_ui/ActionTemplateItem/portal_types/Web%20Site/create_translation_data.xml
index 1e10375aaf..5ab633f789 100644
--- a/bt5/erp5_web_renderjs_ui/ActionTemplateItem/portal_types/Web%20Site/create_translation_data.xml
+++ b/bt5/erp5_web_renderjs_ui/ActionTemplateItem/portal_types/Web%20Site/create_translation_data.xml
@@ -60,7 +60,7 @@
         </item>
         <item>
             <key> <string>title</string> </key>
-            <value> <string>Create Translation Data</string> </value>
+            <value> <string>Update Translation Data</string> </value>
         </item>
         <item>
             <key> <string>visible</string> </key>
@@ -77,7 +77,7 @@
       <dictionary>
         <item>
             <key> <string>text</string> </key>
-            <value> <string>string:${object_url}/WebSite_createTranslationData</string> </value>
+            <value> <string>string:${object_url}/WebSite_viewUpdateTranslationDataDialog</string> </value>
         </item>
       </dictionary>
     </pickle>
diff --git a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_translation_data_js.js b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_translation_data_js.js
index 6178c83f7d..365d97512d 100644
--- a/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_translation_data_js.js
+++ b/bt5/erp5_web_renderjs_ui/PathTemplateItem/web_page_module/rjs_gadget_translation_data_js.js
@@ -1,11 +1,16 @@
+/**
+ * This translation data is generated automatically and updated with upgrader in post-upgarde.
+ * Do not edit manually, but use "Update Translation Data" action on web site to update from
+ * Localizer and from data-i18n tags on web pages.
+ */
 /*globals window*/
-/*jslint indent: 2, nomen: true, maxlen: 80*/
+/*jslint indent: 2, nomen: true */
+
 (function (window) {
   "use strict";
-
+  // @ts-ignore
   window.translation_data = {
-    en: {
+    "en": {
     }
   };
-
-}(window));
\ No newline at end of file
+}(window));
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/Base_createTranslateData.py b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/Base_createTranslateData.py
deleted file mode 100644
index 99b4e1f953..0000000000
--- a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/Base_createTranslateData.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import re
-import json
-
-portal = context.getPortalObject()
-
-Base_translateString = context.Base_translateString
-#(data-i18n)=["']{{((?:.(?!["']?(?:\S+)=|[>"']))+.)}}["']
-attribute_filter_re = re.compile(r"""(data-i18n)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?""")
-
-translate_word = []
-
-for web_page in portal.web_page_module.searchFolder(portal_type='Web Page',
-                                                    reference=context.Base_getTranslationSourceFileList(only_html=1)):
-  data = attribute_filter_re.findall(web_page.getTextContent())
-  for attribute in data:
-    a = re.sub(r'[{|}]', "", attribute[1])
-    a = re.sub(r'\[.*?\]', "", a)
-    if a:
-      translate_word.append(a)
-
-translate_word =  list(set(translate_word))
-
-
-language_list = context.getAvailableLanguageSet()
-
-content = """
-/*globals window*/\n
-/*jslint indent: 2, nomen: true, maxlen: 80*/\n
-(function (window) {\n
-  "use strict";\n
-"""
-
-tmp = {}
-
-for language in language_list:
-  tmp[language] = {}
-  for word in translate_word:
-    tmp[language][word] = Base_translateString(word, lang = language)
-
-
-
-content += "  window.translation_data = " + json.dumps(tmp, indent=3, ensure_ascii=False, separators=(',', ': '))
-content += ";\n}(window));"
-#return json.dumps(tmp, indent=3, ensure_ascii=False, separators=(',', ': '))
-translation_data_file=context.web_page_module.searchFolder(portal_type='Web Script',reference=translation_data_file)[0]
-translation_data_file.edit(text_content = content)
-
-# Edit web section modification date
-context.edit()
-
-if batch_mode:
-  return 'done'
-return context.Base_redirect('view', keep_items=dict(portal_status_message=Base_translateString("Translation Data Create")))
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_createTranslationData/your_translation_data_file.xml b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_createTranslationData/your_translation_data_file.xml
deleted file mode 100644
index 73d7ae53e9..0000000000
--- a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_createTranslationData/your_translation_data_file.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?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>first_item</string>
-                <string>items</string>
-                <string>title</string>
-              </list>
-            </value>
-        </item>
-        <item>
-            <key> <string>id</string> </key>
-            <value> <string>your_translation_data_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>
-              </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>first_item</string> </key>
-                    <value> <string></string> </value>
-                </item>
-                <item>
-                    <key> <string>form_id</string> </key>
-                    <value> <string></string> </value>
-                </item>
-                <item>
-                    <key> <string>items</string> </key>
-                    <value>
-                      <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
-                    </value>
-                </item>
-                <item>
-                    <key> <string>title</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>my_list_field</string> </value>
-                </item>
-                <item>
-                    <key> <string>first_item</string> </key>
-                    <value> <int>1</int> </value>
-                </item>
-                <item>
-                    <key> <string>form_id</string> </key>
-                    <value> <string>Base_viewFieldLibrary</string> </value>
-                </item>
-                <item>
-                    <key> <string>items</string> </key>
-                    <value>
-                      <list/>
-                    </value>
-                </item>
-                <item>
-                    <key> <string>title</string> </key>
-                    <value> <string>Translation Data File</string> </value>
-                </item>
-              </dictionary>
-            </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-  <record id="2" aka="AAAAAAAAAAI=">
-    <pickle>
-      <global name="TALESMethod" module="Products.Formulator.TALESField"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>_text</string> </key>
-            <value> <string>python: [ (x,x) for x in here.Base_getTranslationSourceFileList()]</string> </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-</ZopeData>
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataTextContent.py b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataTextContent.py
new file mode 100644
index 0000000000..1a5ff11f44
--- /dev/null
+++ b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataTextContent.py
@@ -0,0 +1,50 @@
+"""Returns the `text_content` that should be set on the translation data script for this RJS website.
+"""
+import re
+import json
+
+portal = context.getPortalObject()
+Base_translateString = context.Base_translateString
+
+# Collect all translatable messages from web pages referenced by this web sites.
+# The convention is to use data-i18n tags in HTML, like:
+#   <span data-18n="The message">The message</span>
+# or in comments, like this:
+#   <!-- data-i18n="The message" -->
+attribute_filter_re = re.compile(r"""(data-i18n)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?""")
+translatable_message_set = set([])
+for web_page in portal.web_page_module.searchFolder(portal_type='Web Page',
+                                                    reference=context.Base_getTranslationSourceFileList(only_html=1)):
+  data = attribute_filter_re.findall(web_page.getTextContent())
+  for attribute in data:
+    a = re.sub(r'[{|}]', "", attribute[1])
+    a = re.sub(r'\[.*?\]', "", a)
+    if a:
+      translatable_message_set.add(a)
+
+tmp = {}
+for language in context.getAvailableLanguageSet():
+  tmp[language] = {}
+  for word in translatable_message_set:
+    tmp[language][word] = Base_translateString(word, lang = language)
+
+return """/**
+ * This translation data is generated automatically and updated with upgrader in post-upgarde.
+ * Do not edit manually, but use "Update Translation Data" action on web site to update from
+ * Localizer and from data-i18n tags on web pages.
+ */
+/*globals window*/
+/*jslint indent: 2, nomen: true */
+
+(function (window) {
+  "use strict";
+  // @ts-ignore
+  window.translation_data = %s;
+}(window));
+""" % ("\n  ".join(
+        json.dumps(
+            tmp,
+            sort_keys=True,
+            indent=2,
+            ensure_ascii=False,
+            separators=(',', ': ')).splitlines()))
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/Base_createTranslateData.xml b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataTextContent.xml
similarity index 93%
rename from bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/Base_createTranslateData.xml
rename to bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataTextContent.xml
index faf1b9e6e5..c312ec74f4 100644
--- a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/Base_createTranslateData.xml
+++ b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataTextContent.xml
@@ -50,11 +50,11 @@
         </item>
         <item>
             <key> <string>_params</string> </key>
-            <value> <string> translation_data_file, batch_mode=0</string> </value>
+            <value> <string></string> </value>
         </item>
         <item>
             <key> <string>id</string> </key>
-            <value> <string>Base_createTranslateData</string> </value>
+            <value> <string>WebSite_getTranslationDataTextContent</string> </value>
         </item>
       </dictionary>
     </pickle>
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataWebScriptValue.py b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataWebScriptValue.py
new file mode 100644
index 0000000000..cf66c66f0c
--- /dev/null
+++ b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataWebScriptValue.py
@@ -0,0 +1,20 @@
+# type: () -> Optional[erp5.portal_type.WebScript]
+"""Returns the web script used to contain the translation data for this RJS web site.
+"""
+
+translation_gadget_url = context.getLayoutProperty(
+    "configuration_translation_gadget_url")
+if not translation_gadget_url:
+  return None
+translation_gadget = context.getDocumentValue(translation_gadget_url)
+if not translation_gadget:
+  return None
+
+# find the .js containing translation data
+for successor in translation_gadget.getImplicitSuccessorValueList():
+  successor = successor.getObject()
+  if successor.getReference() and successor.getReference().endswith(
+      'translation_data.js'):
+    return successor
+
+return None
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataWebScriptValue.xml b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataWebScriptValue.xml
new file mode 100644
index 0000000000..b60e22a069
--- /dev/null
+++ b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_getTranslationDataWebScriptValue.xml
@@ -0,0 +1,62 @@
+<?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>_params</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>WebSite_getTranslationDataWebScriptValue</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_updateTranslationData.py b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_updateTranslationData.py
new file mode 100644
index 0000000000..5a1226a07e
--- /dev/null
+++ b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_updateTranslationData.py
@@ -0,0 +1,30 @@
+from Products.ERP5Type.Message import translateString
+portal = context.getPortalObject()
+
+gadget_translation_data_js = context.WebSite_getTranslationDataWebScriptValue()
+if gadget_translation_data_js is None:
+  return context.Base_redirect(
+      form_id,
+      keep_items=dict(
+          portal_status_message=translateString("No translation data script.")))
+
+gadget_translation_data_js.setTextContent(
+    context.WebSite_getTranslationDataTextContent())
+portal.portal_workflow.doActionFor(
+    gadget_translation_data_js,
+    'edit_action',
+    comment=translateString(
+        "Translation data updated from web site ${web_site_id}.",
+        mapping={'web_site_id': context.getId()}))
+
+# Edit web section modification date
+portal.portal_workflow.doActionFor(
+    context,
+    'edit_action',
+    comment=translateString("Translation data updated.",))
+
+if REQUEST is not None:
+  return context.Base_redirect(
+      form_id,
+      keep_items=dict(
+          portal_status_message=translateString("Translation data updated.")))
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_updateTranslationData.xml b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_updateTranslationData.xml
new file mode 100644
index 0000000000..b500b5b313
--- /dev/null
+++ b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_updateTranslationData.xml
@@ -0,0 +1,62 @@
+<?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>_params</string> </key>
+            <value> <string>form_id=\'\', REQUEST=None</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>WebSite_updateTranslationData</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_createTranslationData.xml b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_viewUpdateTranslationDataDialog.xml
similarity index 88%
rename from bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_createTranslationData.xml
rename to bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_viewUpdateTranslationDataDialog.xml
index 5661006a6e..2357a4ed51 100644
--- a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_createTranslationData.xml
+++ b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_viewUpdateTranslationDataDialog.xml
@@ -14,7 +14,11 @@
         </item>
         <item>
             <key> <string>action</string> </key>
-            <value> <string>Base_createTranslateData</string> </value>
+            <value> <string>WebSite_updateTranslationData</string> </value>
+        </item>
+        <item>
+            <key> <string>action_title</string> </key>
+            <value> <string></string> </value>
         </item>
         <item>
             <key> <string>description</string> </key>
@@ -72,7 +76,7 @@
                     <key> <string>left</string> </key>
                     <value>
                       <list>
-                        <string>your_translation_data_file</string>
+                        <string>your_translation_data_reference</string>
                       </list>
                     </value>
                 </item>
@@ -87,7 +91,7 @@
         </item>
         <item>
             <key> <string>id</string> </key>
-            <value> <string>WebSite_createTranslationData</string> </value>
+            <value> <string>WebSite_viewUpdateTranslationDataDialog</string> </value>
         </item>
         <item>
             <key> <string>method</string> </key>
@@ -95,7 +99,7 @@
         </item>
         <item>
             <key> <string>name</string> </key>
-            <value> <string>WebSite_createTranslationData</string> </value>
+            <value> <string>WebSite_viewUpdateTranslationDataDialog</string> </value>
         </item>
         <item>
             <key> <string>pt</string> </key>
@@ -111,7 +115,7 @@
         </item>
         <item>
             <key> <string>title</string> </key>
-            <value> <string>Create Translation Data</string> </value>
+            <value> <string>Update Translation Data</string> </value>
         </item>
         <item>
             <key> <string>unicode_mode</string> </key>
diff --git a/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_viewUpdateTranslationDataDialog/your_translation_data_reference.xml b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_viewUpdateTranslationDataDialog/your_translation_data_reference.xml
new file mode 100644
index 0000000000..9455e6e6b4
--- /dev/null
+++ b/bt5/erp5_web_renderjs_ui/SkinTemplateItem/portal_skins/erp5_web_renderjs/WebSite_viewUpdateTranslationDataDialog/your_translation_data_reference.xml
@@ -0,0 +1,287 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="StringField" module="Products.Formulator.StandardFields"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>your_translation_data_reference</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>
+                <item>
+                    <key> <string>required_not_found</string> </key>
+                    <value> <string>Input is required but no input given.</string> </value>
+                </item>
+                <item>
+                    <key> <string>too_long</string> </key>
+                    <value> <string>Too much input was given.</string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>overrides</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>alternate_name</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>css_class</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>default</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>description</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>display_maxwidth</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>display_width</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>editable</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>enabled</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>external_validator</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>extra</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>hidden</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>input_type</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>max_length</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>required</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>truncate</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>unicode</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>whitespace_preserve</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>tales</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>alternate_name</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>css_class</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>default</string> </key>
+                    <value>
+                      <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+                    </value>
+                </item>
+                <item>
+                    <key> <string>description</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>display_maxwidth</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>display_width</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>editable</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>enabled</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>external_validator</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>extra</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>hidden</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>input_type</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>max_length</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>required</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>truncate</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>unicode</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>whitespace_preserve</string> </key>
+                    <value> <string></string> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+        <item>
+            <key> <string>values</string> </key>
+            <value>
+              <dictionary>
+                <item>
+                    <key> <string>alternate_name</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>css_class</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>default</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>description</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>display_maxwidth</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>display_width</string> </key>
+                    <value> <int>20</int> </value>
+                </item>
+                <item>
+                    <key> <string>editable</string> </key>
+                    <value> <int>0</int> </value>
+                </item>
+                <item>
+                    <key> <string>enabled</string> </key>
+                    <value> <int>1</int> </value>
+                </item>
+                <item>
+                    <key> <string>external_validator</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>extra</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>hidden</string> </key>
+                    <value> <int>0</int> </value>
+                </item>
+                <item>
+                    <key> <string>input_type</string> </key>
+                    <value> <string>text</string> </value>
+                </item>
+                <item>
+                    <key> <string>max_length</string> </key>
+                    <value> <string></string> </value>
+                </item>
+                <item>
+                    <key> <string>required</string> </key>
+                    <value> <int>0</int> </value>
+                </item>
+                <item>
+                    <key> <string>title</string> </key>
+                    <value> <string>Translation Data Script</string> </value>
+                </item>
+                <item>
+                    <key> <string>truncate</string> </key>
+                    <value> <int>0</int> </value>
+                </item>
+                <item>
+                    <key> <string>unicode</string> </key>
+                    <value> <int>0</int> </value>
+                </item>
+                <item>
+                    <key> <string>whitespace_preserve</string> </key>
+                    <value> <int>0</int> </value>
+                </item>
+              </dictionary>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="TALESMethod" module="Products.Formulator.TALESField"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_text</string> </key>
+            <value> <string>python: context.WebSite_getTranslationDataWebScriptValue().getReference() if context.WebSite_getTranslationDataWebScriptValue() else context.Base_translateString("No translation data script.")</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_web_renderjs_ui_test/SkinTemplateItem/portal_skins/erp5_web_renderjs_ui_test/Base_createBaseLanguage.py b/bt5/erp5_web_renderjs_ui_test/SkinTemplateItem/portal_skins/erp5_web_renderjs_ui_test/Base_createBaseLanguage.py
index 3a5e961f86..da8104b38f 100644
--- a/bt5/erp5_web_renderjs_ui_test/SkinTemplateItem/portal_skins/erp5_web_renderjs_ui_test/Base_createBaseLanguage.py
+++ b/bt5/erp5_web_renderjs_ui_test/SkinTemplateItem/portal_skins/erp5_web_renderjs_ui_test/Base_createBaseLanguage.py
@@ -85,6 +85,6 @@ for tmp in param_dict:
   context.Base_addUITestTranslation(message = tmp['message'], translation = tmp['translation'], language = tmp['language'])
 
 context.web_site_module.renderjs_runner.setAvailableLanguageSet(['en', 'fr', 'wo'])
-context.web_site_module.renderjs_runner.Base_createTranslateData(translation_data_file='gadget_translation_data.js',batch_mode=1)
+context.web_site_module.renderjs_runner.WebSite_updateTranslationData()
 context.ERP5Site_updateTranslationTable()
 return 'done'
-- 
2.30.9