From 6fe36db477012828f0c8a3cd134c6d2e4f7a1a62 Mon Sep 17 00:00:00 2001 From: Kailash Nadh 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 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%">

- + {{ $utils.formatNumber(count) }}

From 76a86fa34afdd65b9c62640e3f72aa758369c9c1 Mon Sep 17 00:00:00 2001 From: Kailash Nadh 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 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 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",