From 6fe36db477012828f0c8a3cd134c6d2e4f7a1a62 Mon Sep 17 00:00:00 2001
From: Kailash Nadh <kailash@nadh.in>
Date: Wed, 23 Feb 2022 20:50:35 +0530
Subject: [PATCH 1/5] Fix incorrect i18n tooltip in dashboard graph.

---
 frontend/src/views/Dashboard.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/frontend/src/views/Dashboard.vue b/frontend/src/views/Dashboard.vue
index d84068add..4397ee564 100644
--- a/frontend/src/views/Dashboard.vue
+++ b/frontend/src/views/Dashboard.vue
@@ -218,7 +218,7 @@ export default Vue.extend({
     // Pull the charts.
     this.$api.getDashboardCharts().then((data) => {
       this.isChartsLoading = false;
-      this.renderChart(this.$t('dashboard.linkClicks'), data.campaignViews, this.$refs['chart-views']);
+      this.renderChart(this.$t('dashboard.campaignViews'), data.campaignViews, this.$refs['chart-views']);
       this.renderChart(this.$t('dashboard.linkClicks'), data.linkClicks, this.$refs['chart-clicks']);
     });
   },

From 45878db35f14d50ba07b12df184bb2327dbd722b Mon Sep 17 00:00:00 2001
From: Kailash Nadh <kailash@nadh.in>
Date: Wed, 23 Feb 2022 20:53:39 +0530
Subject: [PATCH 2/5] Change list UI status counts to i18n plural. Ref: #717

---
 frontend/src/views/Lists.vue | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/frontend/src/views/Lists.vue b/frontend/src/views/Lists.vue
index df5661ccd..71c2ab4fd 100644
--- a/frontend/src/views/Lists.vue
+++ b/frontend/src/views/Lists.vue
@@ -98,7 +98,7 @@
         header-class="cy-subscribers" width="10%">
         <div class="fields stats">
           <p v-for="(count, status) in props.row.subscriberStatuses" :key="status">
-            <label>{{ $t(`subscribers.status.${status}`) }}</label>
+            <label>{{ $tc(`subscribers.status.${status}`, count) }}</label>
             <span :class="status">{{ $utils.formatNumber(count) }}</span>
           </p>
         </div>

From 76a86fa34afdd65b9c62640e3f72aa758369c9c1 Mon Sep 17 00:00:00 2001
From: Kailash Nadh <kailash@nadh.in>
Date: Thu, 24 Feb 2022 08:56:06 +0530
Subject: [PATCH 3/5] Add i18n translation to document titles in the router.

---
 frontend/src/main.js         | 16 +++++++++++++
 frontend/src/router/index.js | 46 +++++++++++++-----------------------
 2 files changed, 32 insertions(+), 30 deletions(-)

diff --git a/frontend/src/main.js b/frontend/src/main.js
index f85676a13..e78ab0898 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -19,6 +19,22 @@ Vue.config.productionTip = false;
 Vue.prototype.$utils = new Utils(i18n);
 Vue.prototype.$api = api;
 
+// Setup the router.
+router.beforeEach((to, from, next) => {
+  if (to.matched.length === 0) {
+    next('/404');
+  } else {
+    next();
+  }
+});
+
+router.afterEach((to) => {
+  Vue.nextTick(() => {
+    const t = to.meta.title ? `${i18n.tc(to.meta.title, 0)} /` : '';
+    document.title = `${t} listmonk`;
+  });
+});
+
 new Vue({
   router,
   store,
diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js
index 5fa106fb5..1659879da 100644
--- a/frontend/src/router/index.js
+++ b/frontend/src/router/index.js
@@ -14,97 +14,97 @@ const routes = [
   {
     path: '/',
     name: 'dashboard',
-    meta: { title: 'Dashboard' },
+    meta: { title: '' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Dashboard.vue'),
   },
   {
     path: '/lists',
     name: 'lists',
-    meta: { title: 'Lists', group: 'lists' },
+    meta: { title: 'globals.terms.lists', group: 'lists' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Lists.vue'),
   },
   {
     path: '/lists/forms',
     name: 'forms',
-    meta: { title: 'Forms', group: 'lists' },
+    meta: { title: 'forms.title', group: 'lists' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Forms.vue'),
   },
   {
     path: '/lists/:id',
     name: 'lists',
-    meta: { title: 'Lists', group: 'lists' },
+    meta: { title: 'globals.terms.lists', group: 'lists' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Lists.vue'),
   },
   {
     path: '/subscribers',
     name: 'subscribers',
-    meta: { title: 'Subscribers', group: 'subscribers' },
+    meta: { title: 'globals.terms.subscribers', group: 'subscribers' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Subscribers.vue'),
   },
   {
     path: '/subscribers/import',
     name: 'import',
-    meta: { title: 'Import subscribers', group: 'subscribers' },
+    meta: { title: 'import.title', group: 'subscribers' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Import.vue'),
   },
   {
     path: '/subscribers/bounces',
     name: 'bounces',
-    meta: { title: 'Bounces', group: 'subscribers' },
+    meta: { title: 'globals.terms.bounces', group: 'subscribers' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Bounces.vue'),
   },
   {
     path: '/subscribers/lists/:listID',
     name: 'subscribers_list',
-    meta: { title: 'Subscribers', group: 'subscribers' },
+    meta: { title: 'globals.terms.subscribers', group: 'subscribers' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Subscribers.vue'),
   },
   {
     path: '/subscribers/:id',
     name: 'subscriber',
-    meta: { title: 'Subscribers', group: 'subscribers' },
+    meta: { title: 'globals.terms.subscribers', group: 'subscribers' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Subscribers.vue'),
   },
   {
     path: '/campaigns',
     name: 'campaigns',
-    meta: { title: 'Campaigns', group: 'campaigns' },
+    meta: { title: 'globals.terms.campaigns', group: 'campaigns' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Campaigns.vue'),
   },
   {
     path: '/campaigns/media',
     name: 'media',
-    meta: { title: 'Media', group: 'campaigns' },
+    meta: { title: 'globals.terms.media', group: 'campaigns' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Media.vue'),
   },
   {
     path: '/campaigns/templates',
     name: 'templates',
-    meta: { title: 'Templates', group: 'campaigns' },
+    meta: { title: 'globals.terms.templates', group: 'campaigns' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Templates.vue'),
   },
   {
     path: '/campaigns/analytics',
     name: 'campaignAnalytics',
-    meta: { title: 'Campaign analytics', group: 'campaigns' },
+    meta: { title: 'analytics.title', group: 'campaigns' },
     component: () => import(/* webpackChunkName: "main" */ '../views/CampaignAnalytics.vue'),
   },
   {
     path: '/campaigns/:id',
     name: 'campaign',
-    meta: { title: 'Campaign', group: 'campaigns' },
+    meta: { title: 'globals.terms.campaign', group: 'campaigns' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Campaign.vue'),
   },
   {
     path: '/settings',
     name: 'settings',
-    meta: { title: 'Settings', group: 'settings' },
+    meta: { title: 'globals.terms.settings', group: 'settings' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Settings.vue'),
   },
   {
     path: '/settings/logs',
     name: 'logs',
-    meta: { title: 'Logs', group: 'settings' },
+    meta: { title: 'logs.title', group: 'settings' },
     component: () => import(/* webpackChunkName: "main" */ '../views/Logs.vue'),
   },
 ];
@@ -122,18 +122,4 @@ const router = new VueRouter({
   },
 });
 
-router.beforeEach((to, from, next) => {
-  if (to.matched.length === 0) {
-    next('/404');
-  } else {
-    next();
-  }
-});
-
-router.afterEach((to) => {
-  Vue.nextTick(() => {
-    document.title = `${to.meta.title} / listmonk`;
-  });
-});
-
 export default router;

From e87c80eee14856a0001c3734394a461e62f09aa8 Mon Sep 17 00:00:00 2001
From: Kailash Nadh <kailash@nadh.in>
Date: Tue, 1 Mar 2022 22:23:54 +0530
Subject: [PATCH 4/5] Refactor app init routines to load config/i18n before
 main app mount.

Move config/language loading outside the main Vue() instance mount
as the app dependencies require i18n before they are mounted.

This commit moves config/language loading outside the app routines
to plain API calls, which on success, initialize and mount the main
view App instance.
---
 frontend/src/main.js | 47 +++++++++++++++++++++++++-------------------
 1 file changed, 27 insertions(+), 20 deletions(-)

diff --git a/frontend/src/main.js b/frontend/src/main.js
index e78ab0898..b97058434 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -15,9 +15,7 @@ const i18n = new VueI18n();
 Vue.use(Buefy, {});
 Vue.config.productionTip = false;
 
-// Globals.
-Vue.prototype.$utils = new Utils(i18n);
-Vue.prototype.$api = api;
+
 
 // Setup the router.
 router.beforeEach((to, from, next) => {
@@ -30,12 +28,13 @@ router.beforeEach((to, from, next) => {
 
 router.afterEach((to) => {
   Vue.nextTick(() => {
-    const t = to.meta.title ? `${i18n.tc(to.meta.title, 0)} /` : '';
+    const t = to.meta.title && i18n.te(to.meta.title) ? `${i18n.tc(to.meta.title, 0)} /` : '';
     document.title = `${t} listmonk`;
   });
 });
 
-new Vue({
+
+const v = new Vue({
   router,
   store,
   i18n,
@@ -45,20 +44,28 @@ new Vue({
     isLoaded: false,
   },
 
-  methods: {
-    loadConfig() {
-      api.getServerConfig().then((data) => {
-        api.getLang(data.lang).then((lang) => {
-          i18n.locale = data.lang;
-          i18n.setLocaleMessage(i18n.locale, lang);
-          this.isLoaded = true;
-        });
-      });
-    },
+  mounted() {
+    v.isLoaded = true;
   },
+});
 
-  created() {
-    this.loadConfig();
-    api.getSettings();
-  },
-}).$mount('#app');
+
+// Load server side config and language before mounting the app.
+api.getServerConfig().then((data) => {
+  api.getLang(data.lang).then((lang) => {
+    i18n.locale = data.lang;
+    i18n.setLocaleMessage(i18n.locale, lang);
+
+    Vue.prototype.$utils = new Utils(i18n);
+    Vue.prototype.$api = api;
+
+    // Set the page title after i18n has loaded.
+    const to = router.history.current;
+    const t = to.meta.title ? `${i18n.tc(to.meta.title, 0)} /` : '';
+    document.title = `${t} listmonk`;
+
+    v.$mount('#app');
+  });
+});
+
+api.getSettings();

From c4f1bed517aa6777e8799e2ebf1bd9e529ab09e2 Mon Sep 17 00:00:00 2001
From: Kailash Nadh <kailash@nadh.in>
Date: Tue, 1 Mar 2022 22:24:31 +0530
Subject: [PATCH 5/5] Add missing i18n strings to dayjs. Closes #717.

---
 frontend/src/main.js  |  1 -
 frontend/src/utils.js | 22 ++++++++++++++++++++++
 i18n/cs-cz.json       |  7 +++++++
 i18n/de.json          |  7 +++++++
 i18n/en.json          | 19 +++++++++++++------
 i18n/es.json          |  7 +++++++
 i18n/fr.json          |  7 +++++++
 i18n/hu.json          |  7 +++++++
 i18n/it.json          |  7 +++++++
 i18n/ml.json          |  7 +++++++
 i18n/nl.json          |  7 +++++++
 i18n/pl.json          |  7 +++++++
 i18n/pt-BR.json       |  7 +++++++
 i18n/pt.json          |  7 +++++++
 i18n/ro.json          |  7 +++++++
 i18n/ru.json          |  7 +++++++
 i18n/tr.json          |  7 +++++++
 i18n/vi.json          |  7 +++++++
 18 files changed, 140 insertions(+), 7 deletions(-)

diff --git a/frontend/src/main.js b/frontend/src/main.js
index b97058434..21ce88faa 100644
--- a/frontend/src/main.js
+++ b/frontend/src/main.js
@@ -16,7 +16,6 @@ Vue.use(Buefy, {});
 Vue.config.productionTip = false;
 
 
-
 // Setup the router.
 router.beforeEach((to, from, next) => {
   if (to.matched.length === 0) {
diff --git a/frontend/src/utils.js b/frontend/src/utils.js
index e5276d9df..697c36f3c 100644
--- a/frontend/src/utils.js
+++ b/frontend/src/utils.js
@@ -4,7 +4,9 @@ import {
 } from 'buefy';
 import dayjs from 'dayjs';
 import relativeTime from 'dayjs/plugin/relativeTime';
+import updateLocale from 'dayjs/plugin/updateLocale';
 
+dayjs.extend(updateLocale);
 dayjs.extend(relativeTime);
 
 const reEmail = /(.+?)@(.+?)/ig;
@@ -25,6 +27,26 @@ export default class Utils {
   constructor(i18n) {
     this.i18n = i18n;
     this.intlNumFormat = new Intl.NumberFormat();
+
+    if (i18n) {
+      dayjs.updateLocale('en', {
+        relativeTime: {
+          future: '%s',
+          past: '%s',
+          s: `${i18n.tc('globals.terms.second', 2)}`,
+          m: `1 ${i18n.tc('globals.terms.minute', 1)}`,
+          mm: `%d ${i18n.tc('globals.terms.minute', 2)}`,
+          h: `1 ${i18n.tc('globals.terms.hour', 1)}`,
+          hh: `%d ${i18n.tc('globals.terms.hour', 2)}`,
+          d: `1 ${i18n.tc('globals.terms.day', 1)}`,
+          dd: `%d ${i18n.tc('globals.terms.day', 2)}`,
+          M: `1 ${i18n.tc('globals.terms.month', 1)}`,
+          MM: `%d ${i18n.tc('globals.terms.month', 2)}`,
+          y: `${i18n.tc('globals.terms.year', 1)}`,
+          yy: `%d ${i18n.tc('globals.terms.year', 2)}`,
+        },
+      });
+    }
   }
 
   // Parses an ISO timestamp to a simpler form.
diff --git a/i18n/cs-cz.json b/i18n/cs-cz.json
index 945d6d7ee..14352e3bc 100644
--- a/i18n/cs-cz.json
+++ b/i18n/cs-cz.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Čt",
     "globals.days.5": "Pá",
     "globals.days.6": "So",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Vytvořeno",
     "globals.fields.id": "ID",
     "globals.fields.name": "Jméno",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Kampaň | Kampaně",
     "globals.terms.campaigns": "Kampaně",
     "globals.terms.dashboard": "Řídicí panel",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Seznam | Seznamy",
     "globals.terms.lists": "Seznamy",
     "globals.terms.media": "Médium | Média",
     "globals.terms.messenger": "Kurýr | Kurýři",
     "globals.terms.messengers": "Kurýři",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Nastavení",
     "globals.terms.subscriber": "Odběratel | Odběratelé",
     "globals.terms.subscribers": "Odběratelé",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Značky",
     "globals.terms.template": "Šablona | Šablony",
     "globals.terms.templates": "Šablony",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Import již běží. Počkejte na jeho dokončení nebo jej zastavte před dalším pokusem.",
     "import.blocklist": "Seznam blokovaných",
     "import.csvDelim": "Oddělovač CSV",
diff --git a/i18n/de.json b/i18n/de.json
index 2e4f9c653..e3976af31 100644
--- a/i18n/de.json
+++ b/i18n/de.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Do",
     "globals.days.5": "Fr",
     "globals.days.6": "Sa",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Erstellt",
     "globals.fields.id": "ID",
     "globals.fields.name": "Name",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Kampagne | Kampagnen",
     "globals.terms.campaigns": "Kampagnen",
     "globals.terms.dashboard": "Überblick",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Liste | Listen",
     "globals.terms.lists": "Listen",
     "globals.terms.media": "Medien | Medien",
     "globals.terms.messenger": "Messenger | Messenger",
     "globals.terms.messengers": "Messenger",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Einstellungen",
     "globals.terms.subscriber": "Abonnent | Abonnenten",
     "globals.terms.subscribers": "Abonnenten",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Tags",
     "globals.terms.template": "Vorlage | Vorlagen",
     "globals.terms.templates": "Vorlagen",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Bitte warte bis der aktuelle Importvorgang beendet wurde.",
     "import.blocklist": "Sperrliste",
     "import.csvDelim": "CSV-Trennzeichen",
diff --git a/i18n/en.json b/i18n/en.json
index 419a8c69f..72b732336 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -134,12 +134,13 @@
     "globals.buttons.save": "Save",
     "globals.buttons.saveChanges": "Save changes",
     "globals.days.0": "Sun",
-    "globals.days.1": "Mon",
-    "globals.days.2": "Tue",
-    "globals.days.3": "Wed",
-    "globals.days.4": "Thu",
-    "globals.days.5": "Fri",
-    "globals.days.6": "Sat",
+    "globals.days.1": "Sun",
+    "globals.days.2": "Mon",
+    "globals.days.3": "Tue",
+    "globals.days.4": "Wed",
+    "globals.days.5": "Thu",
+    "globals.days.6": "Fri",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Created",
     "globals.fields.id": "ID",
     "globals.fields.name": "Name",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Campaign | Campaigns",
     "globals.terms.campaigns": "Campaigns",
     "globals.terms.dashboard": "Dashboard",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "List | Lists",
     "globals.terms.lists": "Lists",
     "globals.terms.media": "Media | Media",
     "globals.terms.messenger": "Messenger | Messengers",
     "globals.terms.messengers": "Messengers",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Settings",
     "globals.terms.subscriber": "Subscriber | Subscribers",
     "globals.terms.subscribers": "Subscribers",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Tags",
     "globals.terms.template": "Template | Templates",
     "globals.terms.templates": "Templates",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "An import is already running. Wait for it to finish or stop it before trying again.",
     "import.blocklist": "Blocklist",
     "import.csvDelim": "CSV delimiter",
diff --git a/i18n/es.json b/i18n/es.json
index 69329bd75..0a7dbc180 100644
--- a/i18n/es.json
+++ b/i18n/es.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Jueves",
     "globals.days.5": "Viernes",
     "globals.days.6": "Sábado",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Creado",
     "globals.fields.id": "ID",
     "globals.fields.name": "Nombre",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Campaña | Campañas",
     "globals.terms.campaigns": "Campañas",
     "globals.terms.dashboard": "Panel",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Lista | Listas",
     "globals.terms.lists": "Listas",
     "globals.terms.media": "Media | Media",
     "globals.terms.messenger": "Mensajero | Mensajeros",
     "globals.terms.messengers": "Mensajeros",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Configuraciones",
     "globals.terms.subscriber": "Subscriptor | Subscriptores",
     "globals.terms.subscribers": "Subscriptores",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Etiqueta",
     "globals.terms.template": "Plantilla | Plantillas",
     "globals.terms.templates": "Plantillas",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Se está ejecutándo una importación. Espere a que termine o deténgala antes de intentar otra vez.",
     "import.blocklist": "Lista de bloqueados",
     "import.csvDelim": "Delimitador CSV",
diff --git a/i18n/fr.json b/i18n/fr.json
index 82223fa7f..e1b7b209c 100644
--- a/i18n/fr.json
+++ b/i18n/fr.json
@@ -140,6 +140,7 @@
     "globals.days.4": "jeu.",
     "globals.days.5": "ven.",
     "globals.days.6": "sam.",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Créé·e le",
     "globals.fields.id": "ID",
     "globals.fields.name": "Nom",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Campagne | Campagnes",
     "globals.terms.campaigns": "Campagnes",
     "globals.terms.dashboard": "Tableau de bord",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Liste | Listes",
     "globals.terms.lists": "Listes",
     "globals.terms.media": "Médias | Médias",
     "globals.terms.messenger": "Service de messagerie | Services de messagerie",
     "globals.terms.messengers": "Services de messagerie",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Paramètres",
     "globals.terms.subscriber": "Abonné·e | Abonné·es",
     "globals.terms.subscribers": "Abonné·es",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Étiquettes",
     "globals.terms.template": "Modèle | Modèles",
     "globals.terms.templates": "Modèles",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Une importation est déjà en cours. Attendez qu'elle se termine ou arrêtez-la avant de réessayer.",
     "import.blocklist": "Bloquer les adresses importées",
     "import.csvDelim": "Délimiteur CSV",
diff --git a/i18n/hu.json b/i18n/hu.json
index 6a1be2b55..cc4fe4ca2 100644
--- a/i18n/hu.json
+++ b/i18n/hu.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Csütörtök",
     "globals.days.5": "Péntek",
     "globals.days.6": "Szombat",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Létrehozva",
     "globals.fields.id": "ID",
     "globals.fields.name": "Név",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Kampány | Kampányok",
     "globals.terms.campaigns": "Kampányok",
     "globals.terms.dashboard": "Irányítópult",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Lista | Listák",
     "globals.terms.lists": "Listák",
     "globals.terms.media": "Media | Media",
     "globals.terms.messenger": "Messenger | Messengers",
     "globals.terms.messengers": "Messengers",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Beállítások",
     "globals.terms.subscriber": "Feliratkozó | Feliratkozók",
     "globals.terms.subscribers": "Feliratkozók",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Címkék",
     "globals.terms.template": "Sablon | Sablonok",
     "globals.terms.templates": "Sablonok",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Már fut az importálás. Várja meg, amíg befejeződik, vagy állítsa le, mielőtt újra próbálkozna.",
     "import.blocklist": "Tiltólista",
     "import.csvDelim": "CSV határoló",
diff --git a/i18n/it.json b/i18n/it.json
index 16f013416..1309a6c1b 100644
--- a/i18n/it.json
+++ b/i18n/it.json
@@ -140,6 +140,7 @@
     "globals.days.4": "gio",
     "globals.days.5": "ven",
     "globals.days.6": "sab",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Creato il ",
     "globals.fields.id": "ID",
     "globals.fields.name": "Nome",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Campagna | Campagne",
     "globals.terms.campaigns": "Campagne",
     "globals.terms.dashboard": "Dashboard",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Lista | Liste",
     "globals.terms.lists": "Liste",
     "globals.terms.media": "Media | Media",
     "globals.terms.messenger": "Strumento di messaggeria | Strumenti di messaggeria",
     "globals.terms.messengers": "Strumento di messaggeria",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Impostazioni",
     "globals.terms.subscriber": "Iscritto | Iscritti",
     "globals.terms.subscribers": "Iscritti",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Etichette",
     "globals.terms.template": "Modello | Modelli",
     "globals.terms.templates": "Modelli",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Un'importazione è già in corso. Aspetta che finisca o interrompila prima di riprovare.",
     "import.blocklist": "Lista degli indirizzi bloccati",
     "import.csvDelim": "Delimitatore CSV",
diff --git a/i18n/ml.json b/i18n/ml.json
index 5fd349f12..f669c3835 100644
--- a/i18n/ml.json
+++ b/i18n/ml.json
@@ -140,6 +140,7 @@
     "globals.days.4": "വ്യാഴം",
     "globals.days.5": "വെള്ളി",
     "globals.days.6": "ശനി",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "നിർമ്മിച്ചത്",
     "globals.fields.id": "ഐഡി",
     "globals.fields.name": "പേര്",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "ക്യാമ്പേയ്ൻ | ക്യാമ്പേയ്നുകൾ",
     "globals.terms.campaigns": "ക്യാമ്പേയ്നുകൾ",
     "globals.terms.dashboard": "ഡാഷ്ബോഡ്",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "ലിസ്റ്റ് | ലിസ്റ്റുകൾ",
     "globals.terms.lists": "ലിസ്റ്റുകൾ",
     "globals.terms.media": "മീഡിയ | മീഡിയ",
     "globals.terms.messenger": "സന്ദേശ വാഹകൻ | സന്ദേശ വാഹകർ",
     "globals.terms.messengers": "സന്ദേശ വാഹകർ",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "ക്രമീകരണങ്ങൾ",
     "globals.terms.subscriber": "വരിക്കാരൻ | വരിക്കാർ",
     "globals.terms.subscribers": "വരിക്കാർ",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "ടാഗുകൾ",
     "globals.terms.template": "ടെംപ്ലേറ്റ് | ടെംപ്ലേറ്റുകൾ",
     "globals.terms.templates": "ടെംപ്ലേറ്റുകൾ",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "ഒരു ഇമ്പോർട്ട് ഇപ്പോൾ നടന്നുകൊണ്ടിരിക്കുന്നു. വീണ്ടും ശ്രമിക്കുന്നതിന് മുമ്പ് കാത്തിരിക്കുകയോ നടന്നുകൊണ്ടിരിക്കുന്ന ഇമ്പോർട്ട് നിർത്തുകയോ ചെയ്യുക.",
     "import.blocklist": "തടയുന്ന പട്ടിക",
     "import.csvDelim": "CSV യുടെ അതിർത്തി",
diff --git a/i18n/nl.json b/i18n/nl.json
index 3611cc193..abd80cad8 100644
--- a/i18n/nl.json
+++ b/i18n/nl.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Do",
     "globals.days.5": "Vr",
     "globals.days.6": "Za",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Aangemaakt",
     "globals.fields.id": "ID",
     "globals.fields.name": "Naam",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Campagne | Campagnes",
     "globals.terms.campaigns": "Campagnes",
     "globals.terms.dashboard": "Dashboard",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Lijst | Lijsten",
     "globals.terms.lists": "Lijsten",
     "globals.terms.media": "Media | Media",
     "globals.terms.messenger": "Messenger | Messengers",
     "globals.terms.messengers": "Messengers",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Instellingen",
     "globals.terms.subscriber": "Subscriber | Subscribers",
     "globals.terms.subscribers": "Subscribers",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Tags",
     "globals.terms.template": "Template | Templates",
     "globals.terms.templates": "Templates",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Er is al een importeeractie bezig. Wacht tot deze gedaan is of annuleer voor het opnieuw te proberen.",
     "import.blocklist": "Geblokkeerd",
     "import.csvDelim": "CSV scheidingsteken",
diff --git a/i18n/pl.json b/i18n/pl.json
index bd1cdfe28..1d3c834f1 100644
--- a/i18n/pl.json
+++ b/i18n/pl.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Czw",
     "globals.days.5": "Pt",
     "globals.days.6": "Sob",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Utworzone",
     "globals.fields.id": "ID",
     "globals.fields.name": "Nazwa",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Kampania | Kampanie",
     "globals.terms.campaigns": "Kampanie",
     "globals.terms.dashboard": "Przegląd",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Lista | Listy",
     "globals.terms.lists": "Listy",
     "globals.terms.media": "Media | Media",
     "globals.terms.messenger": "Komunikator | Komunikatory",
     "globals.terms.messengers": "Komunikatory",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Ustawienia",
     "globals.terms.subscriber": "Subskrypcja | Subskrypcje",
     "globals.terms.subscribers": "Subskrypcje",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Tagi",
     "globals.terms.template": "Szablon | Szablony",
     "globals.terms.templates": "Szablony",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Importowanie jest już uruchomione. Poczekaj, aż się zakończy, albo zatrzymaj je przed ponowną próbą.",
     "import.blocklist": "Lista zablokowanych",
     "import.csvDelim": "Separator CSV",
diff --git a/i18n/pt-BR.json b/i18n/pt-BR.json
index 8ac7be037..4bcbead8f 100644
--- a/i18n/pt-BR.json
+++ b/i18n/pt-BR.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Qui",
     "globals.days.5": "Sex",
     "globals.days.6": "Sáb",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Criado",
     "globals.fields.id": "ID",
     "globals.fields.name": "Nome",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Campanha | Campanhas",
     "globals.terms.campaigns": "Campanhas",
     "globals.terms.dashboard": "Painel",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Lista | Listas",
     "globals.terms.lists": "Listas",
     "globals.terms.media": "Mídia | Mídias",
     "globals.terms.messenger": "Mensageiro | Mensageiros",
     "globals.terms.messengers": "Mensageiros",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Configurações",
     "globals.terms.subscriber": "Assinante | Assinantes",
     "globals.terms.subscribers": "Assinantes",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Tags",
     "globals.terms.template": "Modelo | Modelos",
     "globals.terms.templates": "Modelos",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Uma importação já está em execução. Aguarde até que termine ou pare-a antes de tentar novamente.",
     "import.blocklist": "Lista de bloqueio",
     "import.csvDelim": "Delimitador CSV",
diff --git a/i18n/pt.json b/i18n/pt.json
index 55f56fd63..ea7dd5277 100644
--- a/i18n/pt.json
+++ b/i18n/pt.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Qui",
     "globals.days.5": "Sex",
     "globals.days.6": "Sáb",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Criado a",
     "globals.fields.id": "ID",
     "globals.fields.name": "Nome",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Campanha | Campanhas",
     "globals.terms.campaigns": "Campanha",
     "globals.terms.dashboard": "Dashboard",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Lista | Listas",
     "globals.terms.lists": "Listas",
     "globals.terms.media": "Mídia | Mídia",
     "globals.terms.messenger": "Mensageiro | Mensageiros",
     "globals.terms.messengers": "Mensageiros",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Definições",
     "globals.terms.subscriber": "Subscritor | Subcritores",
     "globals.terms.subscribers": "Subscritores",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Etiquetas",
     "globals.terms.template": "Modelo | Modelos",
     "globals.terms.templates": "Modelo",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Uma importação já está em curso. Aguarda que termine ou cancela-a antes de tentares novamente.",
     "import.blocklist": "Lista de bloqueio",
     "import.csvDelim": "Delimitador CSV",
diff --git a/i18n/ro.json b/i18n/ro.json
index ad4d77c0a..41d371c79 100644
--- a/i18n/ro.json
+++ b/i18n/ro.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Jo",
     "globals.days.5": "Vi",
     "globals.days.6": "Sa",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Creat",
     "globals.fields.id": "ID",
     "globals.fields.name": "Nume",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Campanie | Campanii",
     "globals.terms.campaigns": "Campanii",
     "globals.terms.dashboard": "Dashboard",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Listă | Liste",
     "globals.terms.lists": "Liste",
     "globals.terms.media": "Media | Media",
     "globals.terms.messenger": "Messenger | Messengers",
     "globals.terms.messengers": "Messengers",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Setări",
     "globals.terms.subscriber": "Abonat | Abonați",
     "globals.terms.subscribers": "Abonați",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Etichete",
     "globals.terms.template": "Șablon | Șabloane",
     "globals.terms.templates": "Șabloane",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Un import rulează deja. Așteptă să se termine sau oprește-l înainte de a încerca din nou.",
     "import.blocklist": "Lista de blocați",
     "import.csvDelim": "Delimitator CSV",
diff --git a/i18n/ru.json b/i18n/ru.json
index 2fb613b00..3616f093d 100644
--- a/i18n/ru.json
+++ b/i18n/ru.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Чт",
     "globals.days.5": "Пт",
     "globals.days.6": "Сб",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Создано",
     "globals.fields.id": "ID",
     "globals.fields.name": "Имя",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Компания | Компании",
     "globals.terms.campaigns": "Компании",
     "globals.terms.dashboard": "Панель",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Список | Списки",
     "globals.terms.lists": "Списки",
     "globals.terms.media": "Медиа | Медиа",
     "globals.terms.messenger": "Мессенджер | Мессенджеры",
     "globals.terms.messengers": "Мессенджеры",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Параметры",
     "globals.terms.subscriber": "Подписчик | Подписчики",
     "globals.terms.subscribers": "Подписчики",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Теги",
     "globals.terms.template": "Шаблон | Шаблоны",
     "globals.terms.templates": "Шаблоны",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Импорт уже выполняется. Подождите, пока он закончит, или остановите его, прежде чем пытаться снова. ",
     "import.blocklist": "Список блокировки",
     "import.csvDelim": "Разделитель CSV",
diff --git a/i18n/tr.json b/i18n/tr.json
index e8e0cff8f..aa6710152 100644
--- a/i18n/tr.json
+++ b/i18n/tr.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Per",
     "globals.days.5": "Cum",
     "globals.days.6": "Cts",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Yaratılma",
     "globals.fields.id": "ID",
     "globals.fields.name": "İsim",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Kampanya | Kampanyalar",
     "globals.terms.campaigns": "Kampanyalar",
     "globals.terms.dashboard": "Yönetim Paneli",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "Liste | Listeler",
     "globals.terms.lists": "Listeler",
     "globals.terms.media": "Medya | Medya",
     "globals.terms.messenger": "Messengelar | Messengerlar",
     "globals.terms.messengers": "Messengerlar",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Ayarlar",
     "globals.terms.subscriber": "Üye | Üyeler",
     "globals.terms.subscribers": "Üyeler",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Tag(lar)",
     "globals.terms.template": "Taslak | Taslaklar",
     "globals.terms.templates": "Taslaklar",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Bir içe aktarım halen sürüyor. Yeniden denemek için durdurun veya yeniden denemek için bekleyin.",
     "import.blocklist": "Engelli listesi",
     "import.csvDelim": "CSV ayıracı",
diff --git a/i18n/vi.json b/i18n/vi.json
index 2250d1c94..fc20d740f 100644
--- a/i18n/vi.json
+++ b/i18n/vi.json
@@ -140,6 +140,7 @@
     "globals.days.4": "Thứ 5",
     "globals.days.5": "Thứ 6",
     "globals.days.6": "Thứ 7",
+    "globals.days.7": "Sat",
     "globals.fields.createdAt": "Đã tạo",
     "globals.fields.id": "ID",
     "globals.fields.name": "Tên",
@@ -186,11 +187,16 @@
     "globals.terms.campaign": "Campaign | Campaigns",
     "globals.terms.campaigns": "Chiến dịch",
     "globals.terms.dashboard": "Bảng điều khiển",
+    "globals.terms.day": "Day | Days",
+    "globals.terms.hour": "Hour | Hours",
     "globals.terms.list": "List | Lists",
     "globals.terms.lists": "Danh sách",
     "globals.terms.media": "Media | Media",
     "globals.terms.messenger": "Messenger | Messengers",
     "globals.terms.messengers": "Tin nhắn",
+    "globals.terms.minute": "Minute | Minutes",
+    "globals.terms.month": "Month | Months",
+    "globals.terms.second": "Second | Seconds",
     "globals.terms.settings": "Cài đặt",
     "globals.terms.subscriber": "Subscriber | Subscribers",
     "globals.terms.subscribers": "Người đăng ký",
@@ -198,6 +204,7 @@
     "globals.terms.tags": "Thẻ",
     "globals.terms.template": "Template | Templates",
     "globals.terms.templates": "Mẫu",
+    "globals.terms.year": "Year | Years",
     "import.alreadyRunning": "Quá trình nhập đang chạy. Chờ quá trình hoàn tất hoặc dừng trước khi thử lại.",
     "import.blocklist": "Danh sách chặn",
     "import.csvDelim": "CSV dấu phân cách",