From b2e27ad6e1ed39a1ad3ad716d3b805cdd18ffbd4 Mon Sep 17 00:00:00 2001
From: Lucas Brandstaetter <lucas@brandstaetter.tech>
Date: Sat, 7 Dec 2024 13:34:45 +0100
Subject: [PATCH] Refactor data table javascript

- Move the data table javascript to a separate file
- Update the translations to be more generic
---
 .../locale/de/LC_MESSAGES/django.po           | 78 +++++++++++--------
 .../locale/en/LC_MESSAGES/django.po           | 78 +++++++++++--------
 .../templates/backoffice/assembly_events.html | 32 +-------
 .../templates/backoffice/assembly_list.html   | 32 +-------
 .../backoffice/components/list_script.js      | 30 +++++++
 .../event/components/list_script.js           | 30 -------
 .../templates/backoffice/event/list.html      |  2 +-
 .../templates/backoffice/map_floor_list.html  | 32 +-------
 .../templates/backoffice/map_poi_list.html    | 32 +-------
 .../backoffice/moderation_assembly-list.html  | 32 +-------
 .../backoffice/moderation_badge-list.html     | 32 +-------
 .../backoffice/moderation_board-list.html     | 32 +-------
 .../backoffice/moderation_user-list.html      | 32 +-------
 .../backoffice/moderation_wiki-list.html      | 32 +-------
 .../project/components/list_script.js         | 30 -------
 .../templates/backoffice/project/list.html    |  2 +-
 src/backoffice/templates/backoffice/sos.html  |  4 +-
 .../backoffice/translation_stubs.html         | 17 ++++
 18 files changed, 150 insertions(+), 409 deletions(-)
 create mode 100644 src/backoffice/templates/backoffice/components/list_script.js
 delete mode 100644 src/backoffice/templates/backoffice/event/components/list_script.js
 delete mode 100644 src/backoffice/templates/backoffice/project/components/list_script.js
 create mode 100644 src/backoffice/templates/backoffice/translation_stubs.html

diff --git a/src/backoffice/locale/de/LC_MESSAGES/django.po b/src/backoffice/locale/de/LC_MESSAGES/django.po
index 858a6f949..4c4697b09 100644
--- a/src/backoffice/locale/de/LC_MESSAGES/django.po
+++ b/src/backoffice/locale/de/LC_MESSAGES/django.po
@@ -524,39 +524,6 @@ msgstr "Hiermit wird diese Veranstaltung gelöscht. Wenn du sie nur unsichtbar m
 msgid "Events"
 msgstr ""
 
-msgid "assembly_info_no_data"
-msgstr "Bisher keine Daten vorhanden"
-
-msgid "assembly_info_paginated"
-msgstr "Zeige _START_ bis _END_ von _TOTAL_ Einträgen"
-
-msgid "assembly_info_empty"
-msgstr "Zeige 0 Einträge"
-
-msgid "assembly_info_filtered"
-msgstr "(gefiltert, insgesamt _MAX_ Einträge)"
-
-msgid "assembly_paginate_menu"
-msgstr "Zeige _MENU_ Einträge"
-
-msgid "assembly_search"
-msgstr "Suche:"
-
-msgid "assembly_no_entries"
-msgstr "Keine Einträge."
-
-msgid "assembly_paginate_first"
-msgstr "Erste"
-
-msgid "assembly_paginate_last"
-msgstr "Letzte"
-
-msgid "assembly_paginate_next"
-msgstr "Nächste"
-
-msgid "assembly_paginate_previous"
-msgstr "Vorherige"
-
 msgid "Assemblies"
 msgstr ""
 
@@ -1487,6 +1454,51 @@ msgstr "Self-organized Session löschen"
 msgid "SoS__delete__introduction"
 msgstr "Hiermit wird diese Self-organized Session gelöscht. Wenn du sie nur unsichtbar machen möchtest gibt es weiter oben die Möglichkeit die Self-organized Session zurückzunehmen!"
 
+msgid "data_table__info__no_data"
+msgstr "Bisher keine Daten vorhanden"
+
+msgid "data_table__info__paginated"
+msgstr "Zeige _START_ bis _END_ von _TOTAL_ Einträgen"
+
+msgid "data_table__info__empty"
+msgstr "Zeige 0 Einträge"
+
+msgid "data_table__info__filtered"
+msgstr "(gefiltert, insgesamt _MAX_ Einträge)"
+
+msgid "data_table__paginate__menu"
+msgstr "Zeige _MENU_ Einträge"
+
+msgid "data_table__loading"
+msgstr "Laden im Gange..."
+
+msgid "data_table__processing"
+msgstr "Verarbeitung...."
+
+msgid "data_table_search"
+msgstr "Suche:"
+
+msgid "data_table__no_entries"
+msgstr "Keine Einträge."
+
+msgid "data_table__paginate__first"
+msgstr "Erste"
+
+msgid "data_table__paginate__last"
+msgstr "Letzte"
+
+msgid "data_table__paginate__next"
+msgstr "Nächste"
+
+msgid "data_table__paginate__previous"
+msgstr "Vorherige"
+
+msgid "data_table__aria__sort_ascending"
+msgstr "Aufsteigend nach dieser Spalte sortieren"
+
+msgid "data_table__aria__sort_descending"
+msgstr "Absteigend nach dieser Spalte sortieren"
+
 msgid "StaticPage-lock_drop"
 msgstr "Seitensperre aufheben"
 
diff --git a/src/backoffice/locale/en/LC_MESSAGES/django.po b/src/backoffice/locale/en/LC_MESSAGES/django.po
index 4318daf34..fd34abffa 100644
--- a/src/backoffice/locale/en/LC_MESSAGES/django.po
+++ b/src/backoffice/locale/en/LC_MESSAGES/django.po
@@ -524,39 +524,6 @@ msgstr "This deletes this event. If you only want to make it invisible, there is
 msgid "Events"
 msgstr ""
 
-msgid "assembly_info_no_data"
-msgstr "No data available in table"
-
-msgid "assembly_info_paginated"
-msgstr "Showing _START_ to _END_ of _TOTAL_ entries"
-
-msgid "assembly_info_empty"
-msgstr "Showing 0 out of 0 entries"
-
-msgid "assembly_info_filtered"
-msgstr "(filtered from _MAX_ total entries)"
-
-msgid "assembly_paginate_menu"
-msgstr "Show _MENU_ entries"
-
-msgid "assembly_search"
-msgstr "Search:"
-
-msgid "assembly_no_entries"
-msgstr "No entries."
-
-msgid "assembly_paginate_first"
-msgstr "First"
-
-msgid "assembly_paginate_last"
-msgstr "Last"
-
-msgid "assembly_paginate_next"
-msgstr "Next"
-
-msgid "assembly_paginate_previous"
-msgstr "Previous"
-
 msgid "Assemblies"
 msgstr ""
 
@@ -1492,6 +1459,51 @@ msgstr "Delete self-organized session"
 msgid "SoS__delete__introduction"
 msgstr "This removes this self-organized session. If you only want to make it invisible, there is an option above to recall the self-organized session above!"
 
+msgid "data_table__info__no_data"
+msgstr "No data available in table"
+
+msgid "data_table__info__paginated"
+msgstr "Showing _START_ to _END_ of _TOTAL_ entries"
+
+msgid "data_table__info__empty"
+msgstr "Showing 0 out of 0 entries"
+
+msgid "data_table__info__filtered"
+msgstr "(filtered from _MAX_ total entries)"
+
+msgid "data_table__paginate__menu"
+msgstr "Show _MENU_ entries"
+
+msgid "data_table__loading"
+msgstr "Loading..."
+
+msgid "data_table__processing"
+msgstr "Processing..."
+
+msgid "data_table_search"
+msgstr "Search:"
+
+msgid "data_table__no_entries"
+msgstr "No entries."
+
+msgid "data_table__paginate__first"
+msgstr "First"
+
+msgid "data_table__paginate__last"
+msgstr "Last"
+
+msgid "data_table__paginate__next"
+msgstr "Next"
+
+msgid "data_table__paginate__previous"
+msgstr "Previous"
+
+msgid "data_table__aria__sort_ascending"
+msgstr "activate to sort column ascending"
+
+msgid "data_table__aria__sort_descending"
+msgstr "activate to sort column descending"
+
 msgid "StaticPage-lock_drop"
 msgstr "drop page lock"
 
diff --git a/src/backoffice/templates/backoffice/assembly_events.html b/src/backoffice/templates/backoffice/assembly_events.html
index 414c99697..0d2ef37c9 100644
--- a/src/backoffice/templates/backoffice/assembly_events.html
+++ b/src/backoffice/templates/backoffice/assembly_events.html
@@ -13,37 +13,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">
-      $(document).ready(function() {
-          $('#events').DataTable({
-            pageLength: 100,
-            language: {
-                "decimal":        "",
-                "emptyTable":     "{% trans "assembly_info_no_data" %}",
-                "info":           "{% trans "assembly_info_paginated" %}",
-                "infoEmpty":      "{% trans "assembly_info_empty" %}",
-                "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-                "infoPostFix":    "",
-                "thousands":      " ",
-                "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-                "loadingRecords": "LOADING ...",
-                "processing":     "Processing...",
-                "search":         "{% trans "assembly_search" %}",
-                "zeroRecords":    "{% trans "assembly_no_entries" %}",
-                "paginate": {
-                    "first":      "{% trans "assembly_paginate_first" %}",
-                    "last":       "{% trans "assembly_paginate_last" %}",
-                    "next":       "{% trans "assembly_paginate_next" %}",
-                    "previous":   "{% trans "assembly_paginate_previous" %}"
-                },
-                "aria": {
-                    "sortAscending":  ": activate to sort column ascending",
-                    "sortDescending": ": activate to sort column descending"
-                }
-            }
-          });
-      });
-  </script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='events' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/assembly_list.html b/src/backoffice/templates/backoffice/assembly_list.html
index 2105ce2f2..09acf28e2 100644
--- a/src/backoffice/templates/backoffice/assembly_list.html
+++ b/src/backoffice/templates/backoffice/assembly_list.html
@@ -10,37 +10,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">
-      $(document).ready(function() {
-          $('#assemblies').DataTable({
-            pageLength: 100,
-            language: {
-              "decimal":        "",
-                "emptyTable":     "{% trans "assembly_info_no_data" %}",
-                "info":           "{% trans "assembly_info_paginated" %}",
-                "infoEmpty":      "{% trans "assembly_info_empty" %}",
-                "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-                "infoPostFix":    "",
-                "thousands":      " ",
-                "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-                "loadingRecords": "LOADING ...",
-                "processing":     "Processing...",
-                "search":         "{% trans "assembly_search" %}",
-                "zeroRecords":    "{% trans "assembly_no_entries" %}",
-                "paginate": {
-                    "first":      "{% trans "assembly_paginate_first" %}",
-                    "last":       "{% trans "assembly_paginate_last" %}",
-                    "next":       "{% trans "assembly_paginate_next" %}",
-                    "previous":   "{% trans "assembly_paginate_previous" %}"
-                },
-                "aria": {
-                    "sortAscending":  ": activate to sort column ascending",
-                    "sortDescending": ": activate to sort column descending"
-                }
-            }
-          });
-      });
-  </script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='assemblies' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/components/list_script.js b/src/backoffice/templates/backoffice/components/list_script.js
new file mode 100644
index 000000000..5373e510c
--- /dev/null
+++ b/src/backoffice/templates/backoffice/components/list_script.js
@@ -0,0 +1,30 @@
+{% load i18n %}
+$(document).ready(function() {
+  $('#{{ table_id }}').DataTable({
+    pageLength: 100,
+    language: {
+      "decimal":        "",
+        "emptyTable":     "{% trans "data_table__info__no_data" %}",
+        "info":           "{% trans "data_table__info__paginated" %}",
+        "infoEmpty":      "{% trans "data_table__info__empty" %}",
+        "infoFiltered":   "{% trans "data_table__info__filtered" %}",
+        "infoPostFix":    "",
+        "thousands":      " ",
+        "lengthMenu":     "{% trans "data_table__paginate__menu" %}",
+        "loadingRecords": "{% trans "data_table__loading" %}",
+        "processing":     "{% trans "data_table__processing" %}",
+        "search":         "{% trans "data_table_search" %}",
+        "zeroRecords":    "{% trans "data_table__no_entries" %}",
+        "paginate": {
+            "first":      "{% trans "data_table__paginate__first" %}",
+            "last":       "{% trans "data_table__paginate__last" %}",
+            "next":       "{% trans "data_table__paginate__next" %}",
+            "previous":   "{% trans "data_table__paginate__previous" %}"
+        },
+        "aria": {
+            "sortAscending":  ": {% trans "data_table__aria__sort_ascending" %}", {#activate to sort column ascending#}
+            "sortDescending":  ": {% trans "data_table__aria__sort_descending" %}", {#activate to sort column descending#}
+        }
+    }
+  });
+});
diff --git a/src/backoffice/templates/backoffice/event/components/list_script.js b/src/backoffice/templates/backoffice/event/components/list_script.js
deleted file mode 100644
index 6fadf5dc7..000000000
--- a/src/backoffice/templates/backoffice/event/components/list_script.js
+++ /dev/null
@@ -1,30 +0,0 @@
-{% load i18n %}
-$(document).ready(function() {
-  $('#events').DataTable({
-    pageLength: 100,
-    language: {
-      "decimal":        "",
-        "emptyTable":     "{% trans "assembly_info_no_data" %}",
-        "info":           "{% trans "assembly_info_paginated" %}",
-        "infoEmpty":      "{% trans "assembly_info_empty" %}",
-        "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-        "infoPostFix":    "",
-        "thousands":      " ",
-        "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-        "loadingRecords": "LOADING ...",
-        "processing":     "Processing...",
-        "search":         "{% trans "assembly_search" %}",
-        "zeroRecords":    "{% trans "assembly_no_entries" %}",
-        "paginate": {
-            "first":      "{% trans "assembly_paginate_first" %}",
-            "last":       "{% trans "assembly_paginate_last" %}",
-            "next":       "{% trans "assembly_paginate_next" %}",
-            "previous":   "{% trans "assembly_paginate_previous" %}"
-        },
-        "aria": {
-            "sortAscending":  ": activate to sort column ascending",
-            "sortDescending": ": activate to sort column descending"
-        }
-    }
-  });
-});
diff --git a/src/backoffice/templates/backoffice/event/list.html b/src/backoffice/templates/backoffice/event/list.html
index 14df4bad6..1a2021a8f 100644
--- a/src/backoffice/templates/backoffice/event/list.html
+++ b/src/backoffice/templates/backoffice/event/list.html
@@ -10,7 +10,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/event/components/list_script.js" %}</script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='events' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/map_floor_list.html b/src/backoffice/templates/backoffice/map_floor_list.html
index b48715424..145670858 100644
--- a/src/backoffice/templates/backoffice/map_floor_list.html
+++ b/src/backoffice/templates/backoffice/map_floor_list.html
@@ -10,37 +10,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">
-      $(document).ready(function() {
-          $('#pois').DataTable({
-            pageLength: 100,
-            language: {
-              "decimal":        "",
-                "emptyTable":     "{% trans "assembly_info_no_data" %}",
-                "info":           "{% trans "assembly_info_paginated" %}",
-                "infoEmpty":      "{% trans "assembly_info_empty" %}",
-                "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-                "infoPostFix":    "",
-                "thousands":      " ",
-                "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-                "loadingRecords": "LOADING ...",
-                "processing":     "Processing...",
-                "search":         "{% trans "assembly_search" %}",
-                "zeroRecords":    "{% trans "assembly_no_entries" %}",
-                "paginate": {
-                    "first":      "{% trans "assembly_paginate_first" %}",
-                    "last":       "{% trans "assembly_paginate_last" %}",
-                    "next":       "{% trans "assembly_paginate_next" %}",
-                    "previous":   "{% trans "assembly_paginate_previous" %}"
-                },
-                "aria": {
-                    "sortAscending":  ": activate to sort column ascending",
-                    "sortDescending": ": activate to sort column descending"
-                }
-            }
-          });
-      });
-  </script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='pois' %}</script>
 {% endblock title %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/map_poi_list.html b/src/backoffice/templates/backoffice/map_poi_list.html
index 9fb3218ae..b69330cfb 100644
--- a/src/backoffice/templates/backoffice/map_poi_list.html
+++ b/src/backoffice/templates/backoffice/map_poi_list.html
@@ -10,37 +10,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">
-      $(document).ready(function() {
-          $('#pois').DataTable({
-            pageLength: 100,
-            language: {
-              "decimal":        "",
-                "emptyTable":     "{% trans "assembly_info_no_data" %}",
-                "info":           "{% trans "assembly_info_paginated" %}",
-                "infoEmpty":      "{% trans "assembly_info_empty" %}",
-                "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-                "infoPostFix":    "",
-                "thousands":      " ",
-                "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-                "loadingRecords": "LOADING ...",
-                "processing":     "Processing...",
-                "search":         "{% trans "assembly_search" %}",
-                "zeroRecords":    "{% trans "assembly_no_entries" %}",
-                "paginate": {
-                    "first":      "{% trans "assembly_paginate_first" %}",
-                    "last":       "{% trans "assembly_paginate_last" %}",
-                    "next":       "{% trans "assembly_paginate_next" %}",
-                    "previous":   "{% trans "assembly_paginate_previous" %}"
-                },
-                "aria": {
-                    "sortAscending":  ": activate to sort column ascending",
-                    "sortDescending": ": activate to sort column descending"
-                }
-            }
-          });
-      });
-  </script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='pois' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/moderation_assembly-list.html b/src/backoffice/templates/backoffice/moderation_assembly-list.html
index 42cbfceea..a49612a1a 100644
--- a/src/backoffice/templates/backoffice/moderation_assembly-list.html
+++ b/src/backoffice/templates/backoffice/moderation_assembly-list.html
@@ -10,37 +10,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">
-      $(document).ready(function() {
-          $('#assemblies').DataTable({
-            pageLength: 100,
-            language: {
-              "decimal":        "",
-                "emptyTable":     "{% trans "assembly_info_no_data" %}",
-                "info":           "{% trans "assembly_info_paginated" %}",
-                "infoEmpty":      "{% trans "assembly_info_empty" %}",
-                "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-                "infoPostFix":    "",
-                "thousands":      " ",
-                "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-                "loadingRecords": "LOADING ...",
-                "processing":     "Processing...",
-                "search":         "{% trans "assembly_search" %}",
-                "zeroRecords":    "{% trans "assembly_no_entries" %}",
-                "paginate": {
-                    "first":      "{% trans "assembly_paginate_first" %}",
-                    "last":       "{% trans "assembly_paginate_last" %}",
-                    "next":       "{% trans "assembly_paginate_next" %}",
-                    "previous":   "{% trans "assembly_paginate_previous" %}"
-                },
-                "aria": {
-                    "sortAscending":  ": activate to sort column ascending",
-                    "sortDescending": ": activate to sort column descending"
-                }
-            }
-          });
-      });
-  </script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='assemblies' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/moderation_badge-list.html b/src/backoffice/templates/backoffice/moderation_badge-list.html
index ee5f65b8e..4203f50fb 100644
--- a/src/backoffice/templates/backoffice/moderation_badge-list.html
+++ b/src/backoffice/templates/backoffice/moderation_badge-list.html
@@ -10,37 +10,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">
-      $(document).ready(function() {
-          $('#badges').DataTable({
-            pageLength: 100,
-            language: {
-              "decimal":        "",
-                "emptyTable":     "{% trans "assembly_info_no_data" %}",
-                "info":           "{% trans "assembly_info_paginated" %}",
-                "infoEmpty":      "{% trans "assembly_info_empty" %}",
-                "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-                "infoPostFix":    "",
-                "thousands":      " ",
-                "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-                "loadingRecords": "LOADING ...",
-                "processing":     "Processing...",
-                "search":         "{% trans "assembly_search" %}",
-                "zeroRecords":    "{% trans "assembly_no_entries" %}",
-                "paginate": {
-                    "first":      "{% trans "assembly_paginate_first" %}",
-                    "last":       "{% trans "assembly_paginate_last" %}",
-                    "next":       "{% trans "assembly_paginate_next" %}",
-                    "previous":   "{% trans "assembly_paginate_previous" %}"
-                },
-                "aria": {
-                    "sortAscending":  ": activate to sort column ascending",
-                    "sortDescending": ": activate to sort column descending"
-                }
-            }
-          });
-      });
-  </script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='badges' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/moderation_board-list.html b/src/backoffice/templates/backoffice/moderation_board-list.html
index 4ec666f2a..b24f357df 100644
--- a/src/backoffice/templates/backoffice/moderation_board-list.html
+++ b/src/backoffice/templates/backoffice/moderation_board-list.html
@@ -10,37 +10,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">
-      $(document).ready(function() {
-          $('#entries').DataTable({
-            pageLength: 100,
-            language: {
-              "decimal":        "",
-                "emptyTable":     "{% trans "assembly_info_no_data" %}",
-                "info":           "{% trans "assembly_info_paginated" %}",
-                "infoEmpty":      "{% trans "assembly_info_empty" %}",
-                "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-                "infoPostFix":    "",
-                "thousands":      " ",
-                "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-                "loadingRecords": "LOADING ...",
-                "processing":     "Processing...",
-                "search":         "{% trans "assembly_search" %}",
-                "zeroRecords":    "{% trans "assembly_no_entries" %}",
-                "paginate": {
-                    "first":      "{% trans "assembly_paginate_first" %}",
-                    "last":       "{% trans "assembly_paginate_last" %}",
-                    "next":       "{% trans "assembly_paginate_next" %}",
-                    "previous":   "{% trans "assembly_paginate_previous" %}"
-                },
-                "aria": {
-                    "sortAscending":  ": activate to sort column ascending",
-                    "sortDescending": ": activate to sort column descending"
-                }
-            }
-          });
-      });
-  </script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='entries' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/moderation_user-list.html b/src/backoffice/templates/backoffice/moderation_user-list.html
index cfbc6a49a..f44d3494d 100644
--- a/src/backoffice/templates/backoffice/moderation_user-list.html
+++ b/src/backoffice/templates/backoffice/moderation_user-list.html
@@ -10,37 +10,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">
-      $(document).ready(function() {
-          $('#users').DataTable({
-            pageLength: 100,
-            language: {
-              "decimal":        "",
-                "emptyTable":     "{% trans "assembly_info_no_data" %}",
-                "info":           "{% trans "assembly_info_paginated" %}",
-                "infoEmpty":      "{% trans "assembly_info_empty" %}",
-                "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-                "infoPostFix":    "",
-                "thousands":      " ",
-                "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-                "loadingRecords": "LOADING ...",
-                "processing":     "Processing...",
-                "search":         "{% trans "assembly_search" %}",
-                "zeroRecords":    "{% trans "assembly_no_entries" %}",
-                "paginate": {
-                    "first":      "{% trans "assembly_paginate_first" %}",
-                    "last":       "{% trans "assembly_paginate_last" %}",
-                    "next":       "{% trans "assembly_paginate_next" %}",
-                    "previous":   "{% trans "assembly_paginate_previous" %}"
-                },
-                "aria": {
-                    "sortAscending":  ": activate to sort column ascending",
-                    "sortDescending": ": activate to sort column descending"
-                }
-            }
-          });
-      });
-  </script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='users' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/moderation_wiki-list.html b/src/backoffice/templates/backoffice/moderation_wiki-list.html
index 2ff55a276..352334cfa 100644
--- a/src/backoffice/templates/backoffice/moderation_wiki-list.html
+++ b/src/backoffice/templates/backoffice/moderation_wiki-list.html
@@ -10,37 +10,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">
-      $(document).ready(function() {
-          $('#pages').DataTable({
-            pageLength: 100,
-            language: {
-              "decimal":        "",
-                "emptyTable":     "{% trans "assembly_info_no_data" %}",
-                "info":           "{% trans "assembly_info_paginated" %}",
-                "infoEmpty":      "{% trans "assembly_info_empty" %}",
-                "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-                "infoPostFix":    "",
-                "thousands":      " ",
-                "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-                "loadingRecords": "LOADING ...",
-                "processing":     "Processing...",
-                "search":         "{% trans "assembly_search" %}",
-                "zeroRecords":    "{% trans "assembly_no_entries" %}",
-                "paginate": {
-                    "first":      "{% trans "assembly_paginate_first" %}",
-                    "last":       "{% trans "assembly_paginate_last" %}",
-                    "next":       "{% trans "assembly_paginate_next" %}",
-                    "previous":   "{% trans "assembly_paginate_previous" %}"
-                },
-                "aria": {
-                    "sortAscending":  ": activate to sort column ascending",
-                    "sortDescending": ": activate to sort column descending"
-                }
-            }
-          });
-      });
-  </script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='pages' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/project/components/list_script.js b/src/backoffice/templates/backoffice/project/components/list_script.js
deleted file mode 100644
index 251081429..000000000
--- a/src/backoffice/templates/backoffice/project/components/list_script.js
+++ /dev/null
@@ -1,30 +0,0 @@
-{% load i18n %}
-$(document).ready(function() {
-  $('#projects').DataTable({
-    pageLength: 100,
-    language: {
-      "decimal":        "",
-        "emptyTable":     "{% trans "assembly_info_no_data" %}",
-        "info":           "{% trans "assembly_info_paginated" %}",
-        "infoEmpty":      "{% trans "assembly_info_empty" %}",
-        "infoFiltered":   "{% trans "assembly_info_filtered" %}",
-        "infoPostFix":    "",
-        "thousands":      " ",
-        "lengthMenu":     "{% trans "assembly_paginate_menu" %}",
-        "loadingRecords": "LOADING ...",
-        "processing":     "Processing...",
-        "search":         "{% trans "assembly_search" %}",
-        "zeroRecords":    "{% trans "assembly_no_entries" %}",
-        "paginate": {
-            "first":      "{% trans "assembly_paginate_first" %}",
-            "last":       "{% trans "assembly_paginate_last" %}",
-            "next":       "{% trans "assembly_paginate_next" %}",
-            "previous":   "{% trans "assembly_paginate_previous" %}"
-        },
-        "aria": {
-            "sortAscending":  ": activate to sort column ascending",
-            "sortDescending": ": activate to sort column descending"
-        }
-    }
-  });
-});
diff --git a/src/backoffice/templates/backoffice/project/list.html b/src/backoffice/templates/backoffice/project/list.html
index 868c9b2f7..65a3dd54d 100644
--- a/src/backoffice/templates/backoffice/project/list.html
+++ b/src/backoffice/templates/backoffice/project/list.html
@@ -16,7 +16,7 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/project/components/list_script.js" %}</script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" with table_id='projects' %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/sos.html b/src/backoffice/templates/backoffice/sos.html
index 1dcb9f2c3..e3499927e 100644
--- a/src/backoffice/templates/backoffice/sos.html
+++ b/src/backoffice/templates/backoffice/sos.html
@@ -13,8 +13,8 @@
 
 {% block scripts %}
   <script src="{% static 'vendor/datatables/datatables.min.js' %}"></script>
-  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/event/components/list_script.js" %}</script>
-  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/project/components/list_script.js" %}</script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" %}</script>
+  <script nonce="{{ request.csp_nonce }}">{% include "backoffice/components/list_script.js" %}</script>
 {% endblock scripts %}
 
 {% block content %}
diff --git a/src/backoffice/templates/backoffice/translation_stubs.html b/src/backoffice/templates/backoffice/translation_stubs.html
new file mode 100644
index 000000000..d05d5df3a
--- /dev/null
+++ b/src/backoffice/templates/backoffice/translation_stubs.html
@@ -0,0 +1,17 @@
+{% load i18n %}
+
+{% trans "data_table__info__no_data" %}",
+{% trans "data_table__info__paginated" %}",
+{% trans "data_table__info__empty" %}",
+{% trans "data_table__info__filtered" %}",
+{% trans "data_table__paginate__menu" %}",
+{% trans "data_table__loading" %}",
+{% trans "data_table__processing" %}",
+{% trans "data_table_search" %}",
+{% trans "data_table__no_entries" %}",
+{% trans "data_table__paginate__first" %}",
+{% trans "data_table__paginate__last" %}",
+{% trans "data_table__paginate__next" %}",
+{% trans "data_table__paginate__previous" %}"
+{% trans "data_table__aria__sort_ascending" %}", {#activate to sort column ascending#}
+{% trans "data_table__aria__sort_descending" %}", {#activate to sort column descending#}
-- 
GitLab