+
{{ $t('AGENT_MGMT.SEARCH.NO_RESULTS') }}
@@ -57,11 +65,13 @@
import { mapGetters } from 'vuex';
import MoreActions from './MoreActions';
import Thumbnail from '../Thumbnail';
+import AvailabilityStatusBadge from '../conversation/AvailabilityStatusBadge';
export default {
components: {
MoreActions,
Thumbnail,
+ AvailabilityStatusBadge,
},
props: {
@@ -83,8 +93,8 @@ export default {
computed: {
...mapGetters({
- getAgents: 'inboxMembers/getMembersByInbox',
- uiFlags: 'inboxMembers/getUIFlags',
+ getAgents: 'inboxAssignableAgents/getAssignableAgents',
+ uiFlags: 'inboxAssignableAgents/getUIFlags',
currentChat: 'getSelectedChat',
}),
@@ -126,7 +136,6 @@ export default {
bus.$emit('newToastMessage', this.$t('CONVERSATION.CHANGE_AGENT'));
});
},
-
removeAgent() {},
},
};
@@ -142,4 +151,17 @@ export default {
.conv-header {
flex: 0 0 var(--space-jumbo);
}
+
+.option__desc {
+ display: flex;
+ align-items: center;
+}
+
+.option__desc {
+ &::v-deep .status-badge {
+ margin-right: var(--space-small);
+ min-width: 0;
+ flex-shrink: 0;
+ }
+}
diff --git a/app/javascript/dashboard/components/widgets/conversation/Message.vue b/app/javascript/dashboard/components/widgets/conversation/Message.vue
index 00dc6a500..bf39087cf 100644
--- a/app/javascript/dashboard/components/widgets/conversation/Message.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/Message.vue
@@ -109,12 +109,14 @@ export default {
);
const {
- email: { html_content: { full: fullHTMLContent } = {} } = {},
+ email: {
+ html_content: { full: fullHTMLContent, reply: replyHTMLContent } = {},
+ } = {},
} = this.contentAttributes;
- if (fullHTMLContent && this.isIncoming) {
+ if ((replyHTMLContent || fullHTMLContent) && this.isIncoming) {
let parsedContent = new DOMParser().parseFromString(
- fullHTMLContent || '',
+ replyHTMLContent || fullHTMLContent || '',
'text/html'
);
if (!parsedContent.getElementsByTagName('parsererror').length) {
diff --git a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
index ae3ba444a..81c94640f 100644
--- a/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
+++ b/app/javascript/dashboard/components/widgets/conversation/ReplyBox.vue
@@ -186,10 +186,12 @@ export default {
if (this.isPrivate) {
return MESSAGE_MAX_LENGTH.GENERAL;
}
-
if (this.isAFacebookInbox) {
return MESSAGE_MAX_LENGTH.FACEBOOK;
}
+ if (this.isATwilioWhatsappChannel) {
+ return MESSAGE_MAX_LENGTH.TWILIO_WHATSAPP;
+ }
if (this.isATwilioSMSChannel) {
return MESSAGE_MAX_LENGTH.TWILIO_SMS;
}
diff --git a/app/javascript/dashboard/helper/actionCable.js b/app/javascript/dashboard/helper/actionCable.js
index 73b3e7213..6103ee915 100644
--- a/app/javascript/dashboard/helper/actionCable.js
+++ b/app/javascript/dashboard/helper/actionCable.js
@@ -10,8 +10,7 @@ class ActionCableConnector extends BaseActionCableConnector {
'message.created': this.onMessageCreated,
'message.updated': this.onMessageUpdated,
'conversation.created': this.onConversationCreated,
- 'conversation.opened': this.onStatusChange,
- 'conversation.resolved': this.onStatusChange,
+ 'conversation.status_changed': this.onStatusChange,
'user:logout': this.onLogout,
'page:reload': this.onReload,
'assignee.changed': this.onAssigneeChanged,
diff --git a/app/javascript/dashboard/i18n/default-sidebar.js b/app/javascript/dashboard/i18n/default-sidebar.js
index 7faa7d2e8..6488c022e 100644
--- a/app/javascript/dashboard/i18n/default-sidebar.js
+++ b/app/javascript/dashboard/i18n/default-sidebar.js
@@ -8,6 +8,7 @@ export const getSidebarItems = accountId => ({
'inbox_conversation',
'conversation_through_inbox',
'contacts_dashboard',
+ 'contacts_dashboard_manage',
'notifications_dashboard',
'settings_account_reports',
'profile_settings',
diff --git a/app/javascript/dashboard/i18n/locale/ar/campaign.json b/app/javascript/dashboard/i18n/locale/ar/campaign.json
new file mode 100644
index 000000000..d8943ac0f
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ar/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "إلغاء",
+ "CREATE_BUTTON_TEXT": "إنشاء",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "رسالة",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "أرسلت بواسطة",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "الرجاء إدخال عنوان URL صالح"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "تحديث",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "حدث خطأ، الرجاء المحاولة مرة أخرى"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "رسالة",
+ "STATUS": "الحالة",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "تعديل",
+ "DELETE": "حذف"
+ },
+ "STATUS": {
+ "ENABLED": "مفعل",
+ "DISABLED": "معطّل"
+ },
+ "SENDER": {
+ "BOT": "رد آلي"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/ar/chatlist.json b/app/javascript/dashboard/i18n/locale/ar/chatlist.json
index bce751c61..53fc3bd4e 100644
--- a/app/javascript/dashboard/i18n/locale/ar/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/ar/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "تم تلقيه عبر البريد الإلكتروني",
"VIEW_TWEET_IN_TWITTER": "عرض التغريدة في تويتر",
"REPLY_TO_TWEET": "الرد على هذه التغريدة",
- "NO_MESSAGES": "لا توجد رسائل"
+ "NO_MESSAGES": "لا توجد رسائل",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ar/contact.json b/app/javascript/dashboard/i18n/locale/ar/contact.json
index ca7b8e9a5..2218c93c4 100644
--- a/app/javascript/dashboard/i18n/locale/ar/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ar/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "الوسوم المتاحة في الحساب",
"REMOVE": "انقر على أيقونة X لإزالة الوسم",
"ADD": "اضغط على أيقونة + لإضافة وسوم",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "تحديث الوسوم",
"UPDATE_ERROR": "تعذر تحديث الوسوم، الرجاء المحاولة مرة أخرى."
},
"NO_LABELS_TO_ADD": "لا يوجد وسوم في الحساب.",
- "NO_AVAILABLE_LABELS": "لا يوجد وسوم مضافة لهذه المحادثة."
+ "NO_AVAILABLE_LABELS": "لا يوجد وسوم مضافة لهذه المحادثة.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "كتم المحادثة",
"UNMUTE_CONTACT": "إلغاء كتم المحادثة",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "عرض التفاصيل"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
index e88239138..f438d84da 100644
--- a/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ar/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "الإعدادات",
"COLLABORATORS": "المتعاونون",
"CONFIGURATION": "الإعدادات",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "نموذج ما قبل الدردشة",
"BUSINESS_HOURS": "ساعات العمل"
},
diff --git a/app/javascript/dashboard/i18n/locale/ar/index.js b/app/javascript/dashboard/i18n/locale/ar/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/ar/index.js
+++ b/app/javascript/dashboard/i18n/locale/ar/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/ar/report.json b/app/javascript/dashboard/i18n/locale/ar/report.json
index 078d09bc1..4f153ec11 100644
--- a/app/javascript/dashboard/i18n/locale/ar/report.json
+++ b/app/javascript/dashboard/i18n/locale/ar/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "آخر 30 يوماً"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/ca/campaign.json b/app/javascript/dashboard/i18n/locale/ca/campaign.json
new file mode 100644
index 000000000..4ca3b69b8
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ca/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Cancel·la",
+ "CREATE_BUTTON_TEXT": "Crear",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Missatge",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Enviat per",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Introduïu una URL vàlid"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Actualitza",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "S'ha produït un error; tornau-ho a provar"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Missatge",
+ "STATUS": "Estat",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Edita",
+ "DELETE": "Esborrar"
+ },
+ "STATUS": {
+ "ENABLED": "Habilita",
+ "DISABLED": "Inhabilita"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/ca/chatlist.json b/app/javascript/dashboard/i18n/locale/ca/chatlist.json
index a6d6f335c..d5af19650 100644
--- a/app/javascript/dashboard/i18n/locale/ca/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/ca/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Rebut per correu electrònic",
"VIEW_TWEET_IN_TWITTER": "Veure el tuit a Twitter",
"REPLY_TO_TWEET": "Respon a aquest tuit",
- "NO_MESSAGES": "Cap Missatge"
+ "NO_MESSAGES": "Cap Missatge",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ca/contact.json b/app/javascript/dashboard/i18n/locale/ca/contact.json
index 30849ca49..996adbfc2 100644
--- a/app/javascript/dashboard/i18n/locale/ca/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ca/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Etiquetes disponibles al compte",
"REMOVE": "Fes clic a la icona X per eliminar l'etiqueta",
"ADD": "Fes clic a la icona + per afegir l'etiqueta",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Actualitza les etiquetes",
"UPDATE_ERROR": "No s'han pogut actualitzar les etiquetes, torna-ho a provar."
},
"NO_LABELS_TO_ADD": "No hi ha cap etiqueta definida al compte.",
- "NO_AVAILABLE_LABELS": "No hi ha etiquetes afegides a aquesta conversa."
+ "NO_AVAILABLE_LABELS": "No hi ha etiquetes afegides a aquesta conversa.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Silencia la conversa",
"UNMUTE_CONTACT": "Desactiva el silenci de la conversa",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
index d5c18acf7..04eaacf40 100644
--- a/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ca/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Configuracions",
"COLLABORATORS": "Col·laboradors",
"CONFIGURATION": "Configuració",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/ca/index.js b/app/javascript/dashboard/i18n/locale/ca/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/ca/index.js
+++ b/app/javascript/dashboard/i18n/locale/ca/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/ca/report.json b/app/javascript/dashboard/i18n/locale/ca/report.json
index 7dabbcb7e..b4cdbb96b 100644
--- a/app/javascript/dashboard/i18n/locale/ca/report.json
+++ b/app/javascript/dashboard/i18n/locale/ca/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Últims 30 dies"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/cs/campaign.json b/app/javascript/dashboard/i18n/locale/cs/campaign.json
new file mode 100644
index 000000000..b6b1008cb
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/cs/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Zrušit",
+ "CREATE_BUTTON_TEXT": "Create",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Zpráva",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Odeslal",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Zadejte prosím platnou URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Aktualizovat",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Došlo k chybě, zkuste to prosím znovu"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Zpráva",
+ "STATUS": "Stav",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Upravit",
+ "DELETE": "Vymazat"
+ },
+ "STATUS": {
+ "ENABLED": "Povoleno",
+ "DISABLED": "Zakázáno"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/cs/chatlist.json b/app/javascript/dashboard/i18n/locale/cs/chatlist.json
index 6c01bb340..5a9e42761 100644
--- a/app/javascript/dashboard/i18n/locale/cs/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/cs/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Obdrženo e-mailem",
"VIEW_TWEET_IN_TWITTER": "Zobrazit tweet na Twitteru",
"REPLY_TO_TWEET": "Odpovědět na tento tweet",
- "NO_MESSAGES": "Žádné zprávy"
+ "NO_MESSAGES": "Žádné zprávy",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/cs/contact.json b/app/javascript/dashboard/i18n/locale/cs/contact.json
index 3b6a25635..46bb54580 100644
--- a/app/javascript/dashboard/i18n/locale/cs/contact.json
+++ b/app/javascript/dashboard/i18n/locale/cs/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Štítky dostupné v účtu",
"REMOVE": "Kliknutím na ikonu X odstraníte štítek",
"ADD": "Kliknutím na ikonu + přidáte štítek",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Aktualizovat štítky",
"UPDATE_ERROR": "Nelze aktualizovat štítky, zkuste to znovu."
},
"NO_LABELS_TO_ADD": "V účtu nejsou definovány žádné další štítky.",
- "NO_AVAILABLE_LABELS": "Do této konverzace nebyly přidány žádné štítky."
+ "NO_AVAILABLE_LABELS": "Do této konverzace nebyly přidány žádné štítky.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Ztlumit konverzaci",
"UNMUTE_CONTACT": "Zrušit ztlumení konverzace",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Zobrazit detaily"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
index 6a0a8d003..4cd8a58e2 100644
--- a/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/cs/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Nastavení",
"COLLABORATORS": "Spolupracující",
"CONFIGURATION": "Nastavení",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Formulář před chatem",
"BUSINESS_HOURS": "Pracovní doba"
},
diff --git a/app/javascript/dashboard/i18n/locale/cs/index.js b/app/javascript/dashboard/i18n/locale/cs/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/cs/index.js
+++ b/app/javascript/dashboard/i18n/locale/cs/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/cs/report.json b/app/javascript/dashboard/i18n/locale/cs/report.json
index 87cd03db2..fb8d544c5 100644
--- a/app/javascript/dashboard/i18n/locale/cs/report.json
+++ b/app/javascript/dashboard/i18n/locale/cs/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Posledních 30 dní"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/da/campaign.json b/app/javascript/dashboard/i18n/locale/da/campaign.json
new file mode 100644
index 000000000..c1a829bc4
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/da/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Annuller",
+ "CREATE_BUTTON_TEXT": "Opret",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Angiv en gyldig URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Opdater",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Der opstod en fejl. Prøv venligst igen"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Rediger",
+ "DELETE": "Slet"
+ },
+ "STATUS": {
+ "ENABLED": "Aktiveret",
+ "DISABLED": "Deaktiveret"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/da/chatlist.json b/app/javascript/dashboard/i18n/locale/da/chatlist.json
index 52a8f919c..862a19495 100644
--- a/app/javascript/dashboard/i18n/locale/da/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/da/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Modtaget via e-mail",
"VIEW_TWEET_IN_TWITTER": "Se tweet på Twitter",
"REPLY_TO_TWEET": "Svar på dette tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/da/contact.json b/app/javascript/dashboard/i18n/locale/da/contact.json
index 5e8068ce8..ef1f5595e 100644
--- a/app/javascript/dashboard/i18n/locale/da/contact.json
+++ b/app/javascript/dashboard/i18n/locale/da/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Etiketter tilgængelige på kontoen",
"REMOVE": "Klik på X-ikonet for at fjerne etiketten",
"ADD": "Klik på + ikonet for at tilføje etiketten",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Opdater etiketter",
"UPDATE_ERROR": "Etiketter kunne ikke opdateres. Prøv igen."
},
"NO_LABELS_TO_ADD": "Der er ikke defineret flere etiketter på kontoen.",
- "NO_AVAILABLE_LABELS": "Der er ingen etiketter tilføjet til denne samtale."
+ "NO_AVAILABLE_LABELS": "Der er ingen etiketter tilføjet til denne samtale.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Gør Samtale Lydløs",
"UNMUTE_CONTACT": "Fjern Lydløs",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
index bfc712182..f1930095b 100644
--- a/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/da/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Indstillinger",
"COLLABORATORS": "Samarbejdspartnere",
"CONFIGURATION": "Konfiguration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/da/index.js b/app/javascript/dashboard/i18n/locale/da/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/da/index.js
+++ b/app/javascript/dashboard/i18n/locale/da/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/da/report.json b/app/javascript/dashboard/i18n/locale/da/report.json
index 44d645fbf..3eeb40f7f 100644
--- a/app/javascript/dashboard/i18n/locale/da/report.json
+++ b/app/javascript/dashboard/i18n/locale/da/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Seneste 30 dage"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/de/campaign.json b/app/javascript/dashboard/i18n/locale/de/campaign.json
new file mode 100644
index 000000000..18b8cfe4c
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/de/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Kampagnen",
+ "SIDEBAR_TXT": "Proaktive Nachrichten erlauben dem Kunden, ausgehende Nachrichten an seine Kontakte zu senden, was weitere Unterhaltungen auslösen würde. Klicke auf Kampagne hinzufügen um eine neue Kampagne zu erstellen. Sie können auch eine bestehende Kampagne bearbeiten oder löschen, indem Sie auf die Schaltfläche Bearbeiten oder Löschen klicken.",
+ "HEADER_BTN_TXT": "Kampagne erstellen",
+ "ADD": {
+ "TITLE": "Kampagne erstellen",
+ "DESC": "Proaktive Nachrichten erlauben dem Kunden, ausgehende Nachrichten an seine Kontakte zu senden, was weitere Unterhaltungen auslösen würde.",
+ "CANCEL_BUTTON_TEXT": "Stornieren",
+ "CREATE_BUTTON_TEXT": "Erstellen",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Titel",
+ "PLACEHOLDER": "Bitte geben Sie den Titel der Kampagne ein",
+ "ERROR": "Titel ist erforderlich"
+ },
+ "MESSAGE": {
+ "LABEL": "Nachricht",
+ "PLACEHOLDER": "Bitte geben Sie die Nachricht der Kampagne ein",
+ "ERROR": "Nachricht ist erforderlich"
+ },
+ "SENT_BY": {
+ "LABEL": "Gesendet von",
+ "PLACEHOLDER": "Bitte wählen Sie den Inhalt der Kampagne aus",
+ "ERROR": "Absender ist erforderlich"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Bitte URL eingeben",
+ "ERROR": "Bitte geben Sie eine gültige URL ein"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Zeit auf Seite (Sekunden)",
+ "PLACEHOLDER": "Bitte die Uhrzeit eingeben",
+ "ERROR": "Uhrzeit auf Seite ist erforderlich"
+ },
+ "ENABLED": "Kampagne aktivieren",
+ "SUBMIT": "Kampagne hinzufügen"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Kampagne erfolgreich erstellt",
+ "ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Kampagne bearbeiten",
+ "UPDATE_BUTTON_TEXT": "Aktualisieren",
+ "API": {
+ "SUCCESS_MESSAGE": "Kampagne erfolgreich aktualisiert",
+ "ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Lade Kampagnen...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Titel",
+ "MESSAGE": "Nachricht",
+ "STATUS": "Status",
+ "SENDER": "Absender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Zeit (Sekunden)",
+ "CREATED_AT": "Erstellt am"
+ },
+ "BUTTONS": {
+ "ADD": "Hinzufügen",
+ "EDIT": "Bearbeiten",
+ "DELETE": "Löschen"
+ },
+ "STATUS": {
+ "ENABLED": "Aktiviert",
+ "DISABLED": "Behindert"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/de/chatlist.json b/app/javascript/dashboard/i18n/locale/de/chatlist.json
index 675427da4..874ed5f19 100644
--- a/app/javascript/dashboard/i18n/locale/de/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/de/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Per E-Mail empfangen",
"VIEW_TWEET_IN_TWITTER": "Tweet auf Twitter anzeigen",
"REPLY_TO_TWEET": "Auf diesen Tweet antworten",
- "NO_MESSAGES": "Keine Nachrichten"
+ "NO_MESSAGES": "Keine Nachrichten",
+ "NO_CONTENT": "Kein Inhalt verfügbar"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/de/contact.json b/app/javascript/dashboard/i18n/locale/de/contact.json
index b208bc95b..341d905cb 100644
--- a/app/javascript/dashboard/i18n/locale/de/contact.json
+++ b/app/javascript/dashboard/i18n/locale/de/contact.json
@@ -12,7 +12,7 @@
"INITIATED_FROM": "Initiiert von",
"INITIATED_AT": "Initiiert bei",
"IP_ADDRESS": "IP-Adresse",
- "NEW_MESSAGE": "New message",
+ "NEW_MESSAGE": "Neue Nachricht",
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "Es sind keine vorherigen Gespräche mit diesem Kontakt verbunden.",
"TITLE": "Vorherige Gespräche"
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Verfügbare Labels im Konto",
"REMOVE": "Klicken Sie auf das X-Symbol, um das Label zu entfernen",
"ADD": "Klicken Sie auf das + Symbol, um ein Label hinzuzufügen",
+ "ADD_BUTTON": "Label hinzufügen",
"UPDATE_BUTTON": "Labels aktualisieren",
"UPDATE_ERROR": "Etiketten konnten nicht aktualisiert werden. Versuchen Sie es erneut."
},
"NO_LABELS_TO_ADD": "Es sind keine weiteren Labels im Konto definiert.",
- "NO_AVAILABLE_LABELS": "Zu dieser Unterhaltung wurden noch keine Labels hinzugefügt."
+ "NO_AVAILABLE_LABELS": "Zu dieser Unterhaltung wurden noch keine Labels hinzugefügt.",
+ "LABEL_SELECT": {
+ "TITLE": "Label hinzufügen",
+ "PLACEHOLDER": "Labels suchen",
+ "NO_RESULT": "Keine Labels gefunden"
+ }
},
"MUTE_CONTACT": "Unterhaltung stummschalten",
"UNMUTE_CONTACT": "Unterhaltung entmuten",
@@ -73,8 +79,8 @@
"PHONE_NUMBER": {
"PLACEHOLDER": "Geben Sie die Telefonnummer des Kontakts ein",
"LABEL": "Telefonnummer",
- "HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]",
- "ERROR": "Phone number should be either empty or of E.164 format"
+ "HELP": "Telefonnummer sollte im E.164-Format sein, z. B.: +1415555555 [+][Landesvorwahl][Landesvorwahl][Ortsvorwahl]",
+ "ERROR": "Telefonnummer muss leer sein oder im E.164-Format"
},
"LOCATION": {
"PLACEHOLDER": "Geben Sie den Standort des Kontakts ein",
@@ -108,27 +114,27 @@
"ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuche es erneut"
},
"NEW_CONVERSATION": {
- "BUTTON_LABEL": "Start conversation",
+ "BUTTON_LABEL": "Gespräch starten",
"TITLE": "Neue Unterhaltung",
- "DESC": "Start a new conversation by sending a new message.",
- "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
+ "DESC": "Starte eine Unterhaltung mit einer neuen Nachricht",
+ "NO_INBOX": "Konnte keinen Posteingang finden, um eine neue Unterhaltung mit diesem Kontakt zu starten.",
"FORM": {
"TO": {
- "LABEL": "To"
+ "LABEL": "An"
},
"INBOX": {
- "LABEL": "Inbox",
- "ERROR": "Select an inbox"
+ "LABEL": "Posteingang",
+ "ERROR": "Posteingang auswählen"
},
"MESSAGE": {
"LABEL": "Nachricht",
- "PLACEHOLDER": "Write your message here",
- "ERROR": "Message can't be empty"
+ "PLACEHOLDER": "Schreiben Sie Ihre Nachricht hier",
+ "ERROR": "Nachricht darf nicht leer sein"
},
- "SUBMIT": "Send message",
+ "SUBMIT": "Nachricht senden",
"CANCEL": "Stornieren",
- "SUCCESS_MESSAGE": "Message sent!",
- "ERROR_MESSAGE": "Couldn't send! try again"
+ "SUCCESS_MESSAGE": "Nachricht gesendet!",
+ "ERROR_MESSAGE": "Senden fehlgeschlagen! Bitte erneut versuchen"
}
},
"CONTACTS_PAGE": {
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Details anzeigen"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notizen"
+ },
+ "ADD": {
+ "BUTTON": "Hinzufügen",
+ "PLACEHOLDER": "Notiz hinzufügen",
+ "TITLE": "Shift + Enter um eine Notiz zu erstellen"
+ },
+ "FOOTER": {
+ "BUTTON": "Alle Notizen anzeigen"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
index 18dbd9505..36e162e77 100644
--- a/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/de/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Einstellungen",
"COLLABORATORS": "Mitarbeitende",
"CONFIGURATION": "Konfiguration",
+ "CAMPAIGN": "Kampagnen",
"PRE_CHAT_FORM": "Pre-Chat-Formular",
"BUSINESS_HOURS": "Öffnungszeiten"
},
diff --git a/app/javascript/dashboard/i18n/locale/de/index.js b/app/javascript/dashboard/i18n/locale/de/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/de/index.js
+++ b/app/javascript/dashboard/i18n/locale/de/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/de/report.json b/app/javascript/dashboard/i18n/locale/de/report.json
index 6afde7b68..0d458f43c 100644
--- a/app/javascript/dashboard/i18n/locale/de/report.json
+++ b/app/javascript/dashboard/i18n/locale/de/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Letzte 30 Tage"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/de/teamsSettings.json b/app/javascript/dashboard/i18n/locale/de/teamsSettings.json
index 1efb940b6..780baf225 100644
--- a/app/javascript/dashboard/i18n/locale/de/teamsSettings.json
+++ b/app/javascript/dashboard/i18n/locale/de/teamsSettings.json
@@ -43,7 +43,7 @@
},
"AGENTS": {
"BUTTON_TEXT": "Agenten im Team aktualisieren",
- "TITLE": "Agenten zu Team hinzufügen - %{teamName}",
+ "TITLE": "Agenten zu Team %{teamName} hinzufügen",
"DESC": "Fügen Sie Agenten zu Ihrem neu erstellten Team hinzu. Alle hinzugefügten Agenten werden benachrichtigt, wenn diesem Team eine Unterhaltung zugewiesen wird."
},
"WIZARD": [
@@ -77,8 +77,8 @@
"SELECTED_COUNT": "%{selected} von %{total} Agenten ausgewählt."
},
"ADD": {
- "TITLE": "Agenten zu Team hinzufügen - %{teamName}",
- "DESC": "Fügen Sie Agenten zu Ihrem neu erstellten Team hinzu. So können Sie bei Gesprächen als Team zusammenarbeiten, erhalten Sie Benachrichtigungen über neue Ereignisse in der gleichen Unterhaltung.",
+ "TITLE": "Agenten zu Team %{teamName} hinzufügen",
+ "DESC": "Fügen Sie Agenten zu Ihrem neu erstellten Team hinzu. So können Sie bei Gesprächen als Team zusammenarbeiten und erhalten Benachrichtigungen über neue Ereignisse in der gleichen Unterhaltung.",
"SELECT": "auswählen",
"SELECT_ALL": "alle Agenten auswählen",
"SELECTED_COUNT": "%{selected} von %{total} Agenten ausgewählt.",
diff --git a/app/javascript/dashboard/i18n/locale/el/campaign.json b/app/javascript/dashboard/i18n/locale/el/campaign.json
new file mode 100644
index 000000000..b44520dd4
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/el/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Καμπάνιες",
+ "SIDEBAR_TXT": "Τα προληπτικά μηνύματα επιτρέπουν την αποστολή εξερχόμενων μηνυμάτων στις επαφές, που θα ενεργοποιούν περισσότερες συνομιλίες. Κάντε κλικ στο Προσθήκη Καμπάνιας για να δημιουργήσετε μια νέα καμπάνια. Μπορείτε επίσης να επεξεργαστείτε ή να διαγράψετε μια ήδη υπάρχουσα καμπάνια κάνοντας κλικ στο κουμπί Επεξεργασία ή Διαγραφή.",
+ "HEADER_BTN_TXT": "Δημιουργία Καμπάνιας",
+ "ADD": {
+ "TITLE": "Δημιουργία Καμπάνιας",
+ "DESC": "Τα προληπτικά μηνύματα επιτρέπουν την αποστολή εξερχόμενων μηνυμάτων στις επαφές, που θα ενεργοποιούν περισσότερες συνομιλίες.",
+ "CANCEL_BUTTON_TEXT": "Άκυρο",
+ "CREATE_BUTTON_TEXT": "Δημιουργία",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Τίτλος",
+ "PLACEHOLDER": "Παρακαλώ εισάγετε τον τίτλο της καμπάνιας",
+ "ERROR": "Ο τίτλος είναι απαραίτητος"
+ },
+ "MESSAGE": {
+ "LABEL": "Μήνυμα",
+ "PLACEHOLDER": "Παρακαλώ εισάγετε το μήνυμα της καμπάνιας",
+ "ERROR": "Το μήνυμα είναι απαραίτητο"
+ },
+ "SENT_BY": {
+ "LABEL": "Αποστολή από",
+ "PLACEHOLDER": "Παρακαλώ επιλέξτε το περιεχόμενο της καμπάνιας",
+ "ERROR": "Ο αποστολέας είναι απαραίτητος"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Παρακαλώ εισάγετε το URL",
+ "ERROR": "Παρακαλώ εισάγετε ένα έγκυρο URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Χρόνος στη σελίδα(δευτερόλεπτα)",
+ "PLACEHOLDER": "Παρακαλώ εισάγετε το χρόνο",
+ "ERROR": "Ο χρόνος στη σελίδα είναι απαραίτητος"
+ },
+ "ENABLED": "Ενεργοποίηση καμπάνιας",
+ "SUBMIT": "Προσθήκη Καμπάνιας"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Η καμπάνια δημιουργήθηκε επιτυχώς",
+ "ERROR_MESSAGE": "Παρουσιάστηκε σφάλμα. Παρακαλώ δοκιμάστε ξανά."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Ενημέρωση",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Υπήρξε ένα σφάλμα, παρακαλώ προσπαθήστε ξανά"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Φόρτωση καμπάνιας...",
+ "404": "Δεν υπάρχουν εκστρατείες για αυτό το κιβώτιο εισερχόμενων.",
+ "TABLE_HEADER": {
+ "TITLE": "Τίτλος",
+ "MESSAGE": "Μήνυμα",
+ "STATUS": "Κατάσταση",
+ "SENDER": "Αποστολέας",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Χρόνος (δευτερόλεπτα)",
+ "CREATED_AT": "Δημιουργήθηκε στις"
+ },
+ "BUTTONS": {
+ "ADD": "Προσθήκη",
+ "EDIT": "Επεξεργασία",
+ "DELETE": "Διαγραφή"
+ },
+ "STATUS": {
+ "ENABLED": "Ενεργό",
+ "DISABLED": "Ανενεργό"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/el/chatlist.json b/app/javascript/dashboard/i18n/locale/el/chatlist.json
index 23eee7635..eb068a51e 100644
--- a/app/javascript/dashboard/i18n/locale/el/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/el/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Παραλήφθηκε από email",
"VIEW_TWEET_IN_TWITTER": "Προβολή του tweet στο Twitter",
"REPLY_TO_TWEET": "Απάντηση στο tweet",
- "NO_MESSAGES": "Κανένα Μήνυμα"
+ "NO_MESSAGES": "Κανένα Μήνυμα",
+ "NO_CONTENT": "Μη διαθέσιμο περιεχόμενο"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/el/contact.json b/app/javascript/dashboard/i18n/locale/el/contact.json
index a296c8d77..03af6312f 100644
--- a/app/javascript/dashboard/i18n/locale/el/contact.json
+++ b/app/javascript/dashboard/i18n/locale/el/contact.json
@@ -12,7 +12,7 @@
"INITIATED_FROM": "Αρχικοποίηση από",
"INITIATED_AT": "Αρχικοποίηση τις",
"IP_ADDRESS": "Διεύθυνση IP",
- "NEW_MESSAGE": "New message",
+ "NEW_MESSAGE": "Νέο Μήνυμα",
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "Δεν υπάρχουν προηγούμενες συνομιλίες που σχετίζονται με αυτήν την επαφή.",
"TITLE": "Προηγούμενες συνομιλίες"
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Υπάρχουν διαθέσιμες ετικέτες στον λογαριασμό",
"REMOVE": "Πατήστε στο εικονίδιο X για να απομακρύνετε την ετικέτα",
"ADD": "Πατήστε στο εικονίδιο + για να προσθέστε την ετικέτα",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Ενημέρωση Ετικετών",
"UPDATE_ERROR": "Δεν μπορούν να ενημερωθούν οι ετικέτες, προσπαθήστε ξανά."
},
"NO_LABELS_TO_ADD": "Δεν υπάρχουν άλλες ετικέτες στον λογαριασμό.",
- "NO_AVAILABLE_LABELS": "Δεν υπάρχουν προστεθεί ετικέτες στην συνομιλία."
+ "NO_AVAILABLE_LABELS": "Δεν υπάρχουν προστεθεί ετικέτες στην συνομιλία.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Σίγαση Συνομιλίας",
"UNMUTE_CONTACT": "Επαναφορά Συνομιλίας",
@@ -108,27 +114,27 @@
"ERROR_MESSAGE": "Υπήρξε ένα σφάλμα, παρακαλώ προσπαθήστε ξανά"
},
"NEW_CONVERSATION": {
- "BUTTON_LABEL": "Start conversation",
+ "BUTTON_LABEL": "Έναρξη Συνομιλίας",
"TITLE": "Νέα συνομιλία",
- "DESC": "Start a new conversation by sending a new message.",
- "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
+ "DESC": "Ξεκινήστε μια νέα συνομιλία στέλνοντας ένα νέο μήνυμα.",
+ "NO_INBOX": "Δεν βρέθηκε ένα κιβώτιο εισερχόμενων για να ξεκινήσει μια νέα συνομιλία με αυτήν την επαφή.",
"FORM": {
"TO": {
- "LABEL": "To"
+ "LABEL": "Προς"
},
"INBOX": {
- "LABEL": "Inbox",
- "ERROR": "Select an inbox"
+ "LABEL": "Εισερχόμενα",
+ "ERROR": "Επιλέξτε ένα κιβώτιο εισερχόμενων"
},
"MESSAGE": {
"LABEL": "Μήνυμα",
- "PLACEHOLDER": "Write your message here",
- "ERROR": "Message can't be empty"
+ "PLACEHOLDER": "Γράψτε το μήνυμά σας εδώ",
+ "ERROR": "Το μήνυμα δεν μπορεί να είναι άδειο"
},
- "SUBMIT": "Send message",
+ "SUBMIT": "Αποστολή μηνύματος",
"CANCEL": "Άκυρο",
- "SUCCESS_MESSAGE": "Message sent!",
- "ERROR_MESSAGE": "Couldn't send! try again"
+ "SUCCESS_MESSAGE": "Το μήνυμα στάλθηκε!",
+ "ERROR_MESSAGE": "Αδυναμία αποστολής! Προσπαθήστε ξανά"
}
},
"CONTACTS_PAGE": {
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Προβολή λεπτομεριών"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Σημειώσεις"
+ },
+ "ADD": {
+ "BUTTON": "Προσθήκη",
+ "PLACEHOLDER": "Προσθήκη σημείωσης",
+ "TITLE": "Shift + Enter για δημιουργία σημείωσης"
+ },
+ "FOOTER": {
+ "BUTTON": "Εμφάνιση όλων των σημειώσεων"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
index f5a13e3a7..38a134024 100644
--- a/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/el/inboxMgmt.json
@@ -92,7 +92,7 @@
"DESC": "Ενσωματώστε το Twilio και αρχίστε να υποστηρίζετε τους πελάτες σας μέσω SMS.",
"ACCOUNT_SID": {
"LABEL": "SID Λογαριασμού",
- "PLACEHOLDER": "Παρακαλώ εισάγετε το SID του Λογαριασμού Twillio",
+ "PLACEHOLDER": "Παρακαλώ εισάγετε το SID του Λογαριασμού Twilio",
"ERROR": "Το πεδίο είναι απαραίτητο"
},
"CHANNEL_TYPE": {
@@ -118,7 +118,7 @@
"TITLE": "URL επανάκλησης",
"SUBTITLE": "Πρέπει να ρυθμίσετε το callback URL στο Twilio με το URL που αναφέρεται εδώ."
},
- "SUBMIT_BUTTON": "Δημιουργία Καναλιού Twillio",
+ "SUBMIT_BUTTON": "Δημιουργία Καναλιού Twilio",
"API": {
"ERROR_MESSAGE": "Δεν ήταν δυνατή η πιστοποίηση των διαπιστευτηρίων Twilio. Δοκιμάστε ξανά"
}
@@ -227,6 +227,7 @@
"SETTINGS": "Ρυθμίσεις",
"COLLABORATORS": "Συνεργάτες",
"CONFIGURATION": "Διαμόρφωση",
+ "CAMPAIGN": "Καμπάνιες",
"PRE_CHAT_FORM": "Φόρμα Προ-Συνομιλίας",
"BUSINESS_HOURS": "Ώρες Εργασίας"
},
diff --git a/app/javascript/dashboard/i18n/locale/el/index.js b/app/javascript/dashboard/i18n/locale/el/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/el/index.js
+++ b/app/javascript/dashboard/i18n/locale/el/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/el/report.json b/app/javascript/dashboard/i18n/locale/el/report.json
index 1878b6e05..62cf653bb 100644
--- a/app/javascript/dashboard/i18n/locale/el/report.json
+++ b/app/javascript/dashboard/i18n/locale/el/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Τελευταίες 30 ημέρες"
+ },
+ {
+ "id": 2,
+ "name": "Τελευταίοι 3 μήνες"
+ },
+ {
+ "id": 3,
+ "name": "Τελευταίοι 6 μήνες"
+ },
+ {
+ "id": 4,
+ "name": "Τελευταίο έτος"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/en/campaign.json b/app/javascript/dashboard/i18n/locale/en/campaign.json
new file mode 100644
index 000000000..2eed61b19
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/en/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Cancel",
+ "CREATE_BUTTON_TEXT": "Create",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Please enter a valid URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Update",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "There was an error, please try again"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Edit",
+ "DELETE": "Delete"
+ },
+ "STATUS": {
+ "ENABLED": "Enabled",
+ "DISABLED": "Disabled"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/en/chatlist.json b/app/javascript/dashboard/i18n/locale/en/chatlist.json
index 228554789..ef4e0629a 100644
--- a/app/javascript/dashboard/i18n/locale/en/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/en/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/en/contact.json b/app/javascript/dashboard/i18n/locale/en/contact.json
index b8d936d22..6a94011a5 100644
--- a/app/javascript/dashboard/i18n/locale/en/contact.json
+++ b/app/javascript/dashboard/i18n/locale/en/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Labels available in the account",
"REMOVE": "Click on X icon to remove the label",
"ADD": "Click on + icon to add the label",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Update labels",
"UPDATE_ERROR": "Couldn't update labels, try again."
},
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
- "NO_AVAILABLE_LABELS": "There are no labels added to this conversation."
+ "NO_AVAILABLE_LABELS": "There are no labels added to this conversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json
index a1184f5db..4d0fcdffc 100644
--- a/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/en/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Settings",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/en/index.js b/app/javascript/dashboard/i18n/locale/en/index.js
index 53d1438c2..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/en/index.js
+++ b/app/javascript/dashboard/i18n/locale/en/index.js
@@ -1,35 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/en/report.json b/app/javascript/dashboard/i18n/locale/en/report.json
index 22e4a1c75..cf2c14a57 100644
--- a/app/javascript/dashboard/i18n/locale/en/report.json
+++ b/app/javascript/dashboard/i18n/locale/en/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Last 30 days"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/es/campaign.json b/app/javascript/dashboard/i18n/locale/es/campaign.json
new file mode 100644
index 000000000..2c11ca20e
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/es/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campañas",
+ "SIDEBAR_TXT": "Los mensajes proactivos permiten al cliente enviar mensajes a sus contactos, lo que generaría más conversaciones. Haga clic en Añadir Campaña para crear una nueva campaña. También puede editar o borrar una campaña existente haciendo clic en el botón de Editar o Borrar.",
+ "HEADER_BTN_TXT": "Crear campaña",
+ "ADD": {
+ "TITLE": "Crear campaña",
+ "DESC": "Los mensajes proactivos permiten al cliente enviar mensajes a sus contactos, lo que generaría más conversaciones.",
+ "CANCEL_BUTTON_TEXT": "Cancelar",
+ "CREATE_BUTTON_TEXT": "Crear",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Título",
+ "PLACEHOLDER": "Por favor escriba un título para la campaña",
+ "ERROR": "El título es obligatorio"
+ },
+ "MESSAGE": {
+ "LABEL": "Mensaje",
+ "PLACEHOLDER": "Por favor escriba el mensaje para la campaña",
+ "ERROR": "El mensaje es obligatorio"
+ },
+ "SENT_BY": {
+ "LABEL": "Enviado por",
+ "PLACEHOLDER": "Por favor seleccione el contenido de la campaña",
+ "ERROR": "El remitente es obligatorio"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Por favor escriba el URL",
+ "ERROR": "Por favor, introduzca una URL válida"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Tiempo en la página (segundos)",
+ "PLACEHOLDER": "Por favor escriba la hora",
+ "ERROR": "La hora en la página es obligatoria"
+ },
+ "ENABLED": "Habilitar campaña",
+ "SUBMIT": "Añadir campaña"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "campaña creada satisfactoriamente",
+ "ERROR_MESSAGE": "Se presentó un error. Por favor intente nuevamente."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Editar campaña",
+ "UPDATE_BUTTON_TEXT": "Actualizar",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaña actualizada satisfactoriamente",
+ "ERROR_MESSAGE": "Hubo un error, por favor inténtelo de nuevo"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Cargando campañas...",
+ "404": "No hay campañas creadas en esta bandeja.",
+ "TABLE_HEADER": {
+ "TITLE": "Título",
+ "MESSAGE": "Mensaje",
+ "STATUS": "Estado",
+ "SENDER": "Remitente",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Tiempo (segundos)",
+ "CREATED_AT": "Creado el"
+ },
+ "BUTTONS": {
+ "ADD": "Añadir",
+ "EDIT": "Editar",
+ "DELETE": "Eliminar"
+ },
+ "STATUS": {
+ "ENABLED": "Activado",
+ "DISABLED": "Deshabilitado"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/es/chatlist.json b/app/javascript/dashboard/i18n/locale/es/chatlist.json
index afab2cb25..a3be57b99 100644
--- a/app/javascript/dashboard/i18n/locale/es/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/es/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Recibido por correo electrónico",
"VIEW_TWEET_IN_TWITTER": "Ver trino en Twitter",
"REPLY_TO_TWEET": "Responder a éste trino",
- "NO_MESSAGES": "No hay mensajes"
+ "NO_MESSAGES": "No hay mensajes",
+ "NO_CONTENT": "No hay contenido disponible"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/es/contact.json b/app/javascript/dashboard/i18n/locale/es/contact.json
index 0f0a74ae6..4b795bac1 100644
--- a/app/javascript/dashboard/i18n/locale/es/contact.json
+++ b/app/javascript/dashboard/i18n/locale/es/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Etiquetas disponibles en la cuenta",
"REMOVE": "Haga clic en el icono X para quitar la etiqueta",
"ADD": "Haga clic en el icono + para añadir la etiqueta",
+ "ADD_BUTTON": "Añadir etiquetas",
"UPDATE_BUTTON": "Actualizar etiquetas",
"UPDATE_ERROR": "No se han podido actualizar las etiquetas, inténtelo de nuevo."
},
"NO_LABELS_TO_ADD": "No hay más etiquetas definidas en la cuenta.",
- "NO_AVAILABLE_LABELS": "No hay etiquetas añadidas a esta conversación."
+ "NO_AVAILABLE_LABELS": "No hay etiquetas añadidas a esta conversación.",
+ "LABEL_SELECT": {
+ "TITLE": "Añadir etiquetas",
+ "PLACEHOLDER": "Buscar etiquetas",
+ "NO_RESULT": "No se encontraron etiquetas"
+ }
},
"MUTE_CONTACT": "Silenciar Conversación",
"UNMUTE_CONTACT": "Dessilenciar conversación",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Ver detalles"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notas"
+ },
+ "ADD": {
+ "BUTTON": "Añadir",
+ "PLACEHOLDER": "Añadir nota",
+ "TITLE": "Shift + Enter para crear una nota"
+ },
+ "FOOTER": {
+ "BUTTON": "Ver todas las notas"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/es/conversation.json b/app/javascript/dashboard/i18n/locale/es/conversation.json
index 02e72b9b9..580875007 100644
--- a/app/javascript/dashboard/i18n/locale/es/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/es/conversation.json
@@ -11,7 +11,7 @@
"TITLE": "Buscar mensajes",
"LOADING_MESSAGE": "Cruzando datos...",
"PLACEHOLDER": "Escriba cualquier texto para buscar mensajes",
- "NO_MATCHING_RESULTS": "No results found."
+ "NO_MATCHING_RESULTS": "No se encontraron resultados."
},
"UNREAD_MESSAGES": "Mensajes no leídos",
"UNREAD_MESSAGE": "Mensaje sin leer",
@@ -57,7 +57,7 @@
"VISIBLE_TO_AGENTS": "Nota privada: solo visible para ti y tu equipo",
"CHANGE_STATUS": "Estado de la conversación cambiado",
"CHANGE_AGENT": "Conversación cambiada de asignatario",
- "CHANGE_TEAM": "Conversation team changed",
+ "CHANGE_TEAM": "Equipo de conversación cambiado",
"FILE_SIZE_LIMIT": "El archivo excede el límite de los archivos adjuntos {MAXIMUM_FILE_UPLOAD_SIZE}",
"SENT_BY": "Enviado por:",
"ASSIGNMENT": {
@@ -108,11 +108,11 @@
}
},
"CONVERSATION_SIDEBAR": {
- "DETAILS_TITLE": "Conversations Details",
- "ASSIGNEE_LABEL": "Assigned Agent",
- "TEAM_LABEL": "Assigned Team",
+ "DETAILS_TITLE": "Detalles de la conversación",
+ "ASSIGNEE_LABEL": "Agente asignado",
+ "TEAM_LABEL": "Equipo asignado",
"SELECT": {
- "PLACEHOLDER": "None"
+ "PLACEHOLDER": "Ninguna"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
index ad233e6e9..0e4fa0824 100644
--- a/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/es/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Ajustes",
"COLLABORATORS": "Colaboradores",
"CONFIGURATION": "Configuración",
+ "CAMPAIGN": "Campañas",
"PRE_CHAT_FORM": "Pre-formulario de chat",
"BUSINESS_HOURS": "Horarios"
},
diff --git a/app/javascript/dashboard/i18n/locale/es/index.js b/app/javascript/dashboard/i18n/locale/es/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/es/index.js
+++ b/app/javascript/dashboard/i18n/locale/es/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/es/report.json b/app/javascript/dashboard/i18n/locale/es/report.json
index df62659a1..ec9cdacbd 100644
--- a/app/javascript/dashboard/i18n/locale/es/report.json
+++ b/app/javascript/dashboard/i18n/locale/es/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Últimos 30 días"
+ },
+ {
+ "id": 2,
+ "name": "Últimos 3 meses"
+ },
+ {
+ "id": 3,
+ "name": "Últimos 6 meses"
+ },
+ {
+ "id": 4,
+ "name": "Último año"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/es/settings.json b/app/javascript/dashboard/i18n/locale/es/settings.json
index a0fa85ab6..7eab53122 100644
--- a/app/javascript/dashboard/i18n/locale/es/settings.json
+++ b/app/javascript/dashboard/i18n/locale/es/settings.json
@@ -3,7 +3,7 @@
"LINK": "Ajustes del perfil",
"TITLE": "Ajustes del perfil",
"BTN_TEXT": "Actualizar perfil",
- "UPDATE_SUCCESS": "Your profile has been updated successfully",
+ "UPDATE_SUCCESS": "Tu perfil se ha actualizado correctamente",
"PASSWORD_UPDATE_SUCCESS": "Su contraseña se ha cambiado correctamente",
"AFTER_EMAIL_CHANGED": "Su perfil ha sido actualizado con éxito, por favor inicie sesión de nuevo cuando sus credenciales de inicio de sesión se hayan cambiado",
"FORM": {
@@ -19,7 +19,7 @@
"PASSWORD_SECTION": {
"TITLE": "Contraseña",
"NOTE": "Actualizar tu contraseña restablecería tus entradas en varios dispositivos.",
- "BTN_TEXT": "Change password"
+ "BTN_TEXT": "Cambiar contraseña"
},
"ACCESS_TOKEN": {
"TITLE": "Token de acceso",
diff --git a/app/javascript/dashboard/i18n/locale/fa/campaign.json b/app/javascript/dashboard/i18n/locale/fa/campaign.json
new file mode 100644
index 000000000..07ef8ee5c
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/fa/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "انصراف",
+ "CREATE_BUTTON_TEXT": "ايجاد كردن",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "عنوان",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "پیام",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "ارسال شده توسط",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "لطفا آدرس URL صحیحی وارد کنید"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "اعمال شود",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "خطایی پیش آمد. لطفا دوباره امتحان کنید"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "عنوان",
+ "MESSAGE": "پیام",
+ "STATUS": "وضعیت",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "افزودن",
+ "EDIT": "ویرایش",
+ "DELETE": "حذف"
+ },
+ "STATUS": {
+ "ENABLED": "فعال",
+ "DISABLED": "غیرفعال"
+ },
+ "SENDER": {
+ "BOT": "ربات"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/fa/chatlist.json b/app/javascript/dashboard/i18n/locale/fa/chatlist.json
index 5a5ac3d04..03fdf41d7 100644
--- a/app/javascript/dashboard/i18n/locale/fa/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/fa/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "از طریق ایمیل دریافت شد",
"VIEW_TWEET_IN_TWITTER": "مشاهده توییت در توییتر",
"REPLY_TO_TWEET": "پاسخ به این توییت",
- "NO_MESSAGES": "هیچ پیامی وجود ندارد"
+ "NO_MESSAGES": "هیچ پیامی وجود ندارد",
+ "NO_CONTENT": "هیچ محتوایی موجود نیست"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fa/contact.json b/app/javascript/dashboard/i18n/locale/fa/contact.json
index bc0d9c630..c95629749 100644
--- a/app/javascript/dashboard/i18n/locale/fa/contact.json
+++ b/app/javascript/dashboard/i18n/locale/fa/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "برچسبهای موجود در حسابکاربری",
"REMOVE": "برای پاک کردن برچسب، روی آیکون X کلیک کنید",
"ADD": "برای افزودن برچسب بر روی آیکون + کلیک کنید",
+ "ADD_BUTTON": "افزودن برچسبها",
"UPDATE_BUTTON": "تغییر برچسبها",
"UPDATE_ERROR": "برچسبها تغییری نکردند، لطفا بعدا امتحان کنید."
},
"NO_LABELS_TO_ADD": "هیچ برچسبی در حسابکاربری تعریف نشده است.",
- "NO_AVAILABLE_LABELS": "هیچ برچسبی به این گفتگو اضافه نشده است."
+ "NO_AVAILABLE_LABELS": "هیچ برچسبی به این گفتگو اضافه نشده است.",
+ "LABEL_SELECT": {
+ "TITLE": "افزودن برچسبها",
+ "PLACEHOLDER": "جستجو برچسبها",
+ "NO_RESULT": "هیچ برچسبی یافت نشد"
+ }
},
"MUTE_CONTACT": "بیصدا کردن گفتگو",
"UNMUTE_CONTACT": "خارج کردن از حالت بی صدا",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "مشاهده جزئیات"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "افزودن",
+ "PLACEHOLDER": "افزودن یادداشت",
+ "TITLE": "برای ایجاد یادداشت Shift + Enter را فشار دهید"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
index fb7cdc6de..fba260284 100644
--- a/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fa/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "تنظیمات",
"COLLABORATORS": "همکاران",
"CONFIGURATION": "پیکربندی",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "ساعت کاری"
},
diff --git a/app/javascript/dashboard/i18n/locale/fa/index.js b/app/javascript/dashboard/i18n/locale/fa/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/fa/index.js
+++ b/app/javascript/dashboard/i18n/locale/fa/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/fa/report.json b/app/javascript/dashboard/i18n/locale/fa/report.json
index 4a0ef7e8c..208dc152b 100644
--- a/app/javascript/dashboard/i18n/locale/fa/report.json
+++ b/app/javascript/dashboard/i18n/locale/fa/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "در ۳۰ روز گذشته"
+ },
+ {
+ "id": 0,
+ "name": "۳ ماه گذشته"
+ },
+ {
+ "id": 0,
+ "name": "۶ ماه گذشته"
+ },
+ {
+ "id": 0,
+ "name": "پارسال"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/fa/teamsSettings.json b/app/javascript/dashboard/i18n/locale/fa/teamsSettings.json
index 35c837717..1983e9614 100644
--- a/app/javascript/dashboard/i18n/locale/fa/teamsSettings.json
+++ b/app/javascript/dashboard/i18n/locale/fa/teamsSettings.json
@@ -1,16 +1,16 @@
{
"TEAMS_SETTINGS": {
- "NEW_TEAM": "Create new team",
+ "NEW_TEAM": "ایجاد تیم جدید",
"HEADER": "تیمها",
"SIDEBAR_TXT": "
Teams
Teams let you organize your agents into groups based on their responsibilities. A user can be part of multiple teams. You can assign conversations to a team when you are working collaboratively.
",
"LIST": {
"404": "There are no teams created on this account.",
- "EDIT_TEAM": "Edit team"
+ "EDIT_TEAM": "ویرایش تیم"
},
"CREATE_FLOW": {
"CREATE": {
- "TITLE": "Create a new team",
- "DESC": "Add a title and description to your new team."
+ "TITLE": "ایجاد تیم جدید",
+ "DESC": "عنوان و توضیحاتی به تیم جدید خود اضافه کنید."
},
"AGENTS": {
"BUTTON_TEXT": "Add agents to team",
@@ -37,9 +37,9 @@
},
"EDIT_FLOW": {
"CREATE": {
- "TITLE": "Edit your team details",
- "DESC": "Edit title and description to your team.",
- "BUTTON_TEXT": "Update team"
+ "TITLE": "ویرایش جزئیات تیم خود",
+ "DESC": "ویرایش عنوان و توضیحات تیم خود.",
+ "BUTTON_TEXT": "بهروزرسانی تیم"
},
"AGENTS": {
"BUTTON_TEXT": "Update agents in team",
@@ -48,7 +48,7 @@
},
"WIZARD": [
{
- "title": "Team details",
+ "title": "جزئیات تیم",
"route": "settings_teams_edit",
"body": "Change name, description and other details."
},
@@ -105,20 +105,20 @@
},
"SETTINGS": "تنظیمات",
"FORM": {
- "UPDATE": "Update team",
- "CREATE": "Create team",
+ "UPDATE": "بهروزرسانی تیم",
+ "CREATE": "ایجاد تیم",
"NAME": {
- "LABEL": "Team name",
+ "LABEL": "نام تیم",
"PLACEHOLDER": "Example: Sales, Customer Support"
},
"DESCRIPTION": {
- "LABEL": "Team Description",
+ "LABEL": "توضیحات تیم",
"PLACEHOLDER": "Short description about this team."
},
"AUTO_ASSIGN": {
"LABEL": "Allow auto assign for this team."
},
- "SUBMIT_CREATE": "Create team"
+ "SUBMIT_CREATE": "ایجاد تیم"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fi/campaign.json b/app/javascript/dashboard/i18n/locale/fi/campaign.json
new file mode 100644
index 000000000..57e3bcf44
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/fi/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Peruuta",
+ "CREATE_BUTTON_TEXT": "Luo",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Lähettäjä",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Anna kelvollinen URL-osoite"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Päivitä",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Tapahtui virhe, yritä uudelleen"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Tila",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Muokkaa",
+ "DELETE": "Poista"
+ },
+ "STATUS": {
+ "ENABLED": "Käytössä",
+ "DISABLED": "Pois käytöstä"
+ },
+ "SENDER": {
+ "BOT": "Botti"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/fi/chatlist.json b/app/javascript/dashboard/i18n/locale/fi/chatlist.json
index f274c34ab..7529e32eb 100644
--- a/app/javascript/dashboard/i18n/locale/fi/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/fi/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Vastaanotettu sähköpostitse",
"VIEW_TWEET_IN_TWITTER": "Näytä twiitti Twitterissä",
"REPLY_TO_TWEET": "Vastaa tähän twiittiin",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "Ei Viestejä",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fi/contact.json b/app/javascript/dashboard/i18n/locale/fi/contact.json
index 021fad300..9f4783221 100644
--- a/app/javascript/dashboard/i18n/locale/fi/contact.json
+++ b/app/javascript/dashboard/i18n/locale/fi/contact.json
@@ -12,7 +12,7 @@
"INITIATED_FROM": "Aloitettu lähteestä",
"INITIATED_AT": "Aloitettu lähteestä",
"IP_ADDRESS": "IP-osoite",
- "NEW_MESSAGE": "New message",
+ "NEW_MESSAGE": "Uusi viesti",
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "Tähän yhteystietoon ei liity aikaisempia keskusteluja.",
"TITLE": "Edelliset keskustelut"
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Tilissä saatavilla olevat tunnisteet",
"REMOVE": "Napsauta X-kuvaketta poistaaksesi tunnisteen",
"ADD": "Napsauta + kuvaketta lisätäksesi tunnisteen",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Päivitä tunnisteet",
"UPDATE_ERROR": "Tunnisteita ei voitu päivittää, yritä uudelleen."
},
"NO_LABELS_TO_ADD": "Tällä tilillä ei ole enempää tunnisteita.",
- "NO_AVAILABLE_LABELS": "Tälle keskustelulle ei ole lisätty tunnisteita."
+ "NO_AVAILABLE_LABELS": "Tälle keskustelulle ei ole lisätty tunnisteita.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mykistä Keskustelu",
"UNMUTE_CONTACT": "Poista keskustelun mykistys",
@@ -47,9 +53,9 @@
"DESC": "Muokkaa yhteystietoja"
},
"CREATE_CONTACT": {
- "BUTTON_LABEL": "New Contact",
- "TITLE": "Create new contact",
- "DESC": "Add basic information details about the contact."
+ "BUTTON_LABEL": "Uusi kontakti",
+ "TITLE": "Luo uusi kontakti",
+ "DESC": "Lisää kontaktin yhteystiedot."
},
"CONTACT_FORM": {
"FORM": {
@@ -103,14 +109,14 @@
}
}
},
- "SUCCESS_MESSAGE": "Contact saved successfully",
+ "SUCCESS_MESSAGE": "Kontakti tallennettu onnistuneesti",
"CONTACT_ALREADY_EXIST": "Tämä sähköpostiosoite on käytössä toiselle yhteyshenkilölle.",
"ERROR_MESSAGE": "Tapahtui virhe, yritä uudelleen"
},
"NEW_CONVERSATION": {
- "BUTTON_LABEL": "Start conversation",
- "TITLE": "New conversation",
- "DESC": "Start a new conversation by sending a new message.",
+ "BUTTON_LABEL": "Aloita keskustelu",
+ "TITLE": "Uusi keskustelu",
+ "DESC": "Aloita uusi keskustelu lähettämällä uusi viesti.",
"NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
"FORM": {
"TO": {
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fi/conversation.json b/app/javascript/dashboard/i18n/locale/fi/conversation.json
index 33c45eb8c..16bd54c4b 100644
--- a/app/javascript/dashboard/i18n/locale/fi/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/fi/conversation.json
@@ -32,7 +32,7 @@
"RESOLVE_ACTION": "Ratkaise",
"REOPEN_ACTION": "Uudelleenavaa",
"OPEN_ACTION": "Avaa",
- "OPEN": "Lisää",
+ "OPEN": "Näytä",
"CLOSE": "Sulje",
"DETAILS": "tiedot"
},
diff --git a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
index 2fdcc5b2c..b858cd044 100644
--- a/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fi/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Asetukset",
"COLLABORATORS": "Yhteistyökumppanit",
"CONFIGURATION": "Määritykset",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/fi/index.js b/app/javascript/dashboard/i18n/locale/fi/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/fi/index.js
+++ b/app/javascript/dashboard/i18n/locale/fi/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/fi/report.json b/app/javascript/dashboard/i18n/locale/fi/report.json
index 5901cc1f6..268c8c890 100644
--- a/app/javascript/dashboard/i18n/locale/fi/report.json
+++ b/app/javascript/dashboard/i18n/locale/fi/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Viimeiset 30 päivää"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/fr/campaign.json b/app/javascript/dashboard/i18n/locale/fr/campaign.json
new file mode 100644
index 000000000..80a2b1796
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/fr/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Annuler",
+ "CREATE_BUTTON_TEXT": "Créer",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Envoyé par",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Veuillez entrer une URL valide"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Mettre à jour",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Une erreur est survenue, veuillez réessayer"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "État",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Modifier",
+ "DELETE": "Supprimer"
+ },
+ "STATUS": {
+ "ENABLED": "Activé",
+ "DISABLED": "Désactivé"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/fr/chatlist.json b/app/javascript/dashboard/i18n/locale/fr/chatlist.json
index 9dc4e14bf..4319d6466 100644
--- a/app/javascript/dashboard/i18n/locale/fr/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/fr/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Reçu par courriel",
"VIEW_TWEET_IN_TWITTER": "Voir le tweet sur Twitter",
"REPLY_TO_TWEET": "Répondre à ce tweet",
- "NO_MESSAGES": "Pas de messages"
+ "NO_MESSAGES": "Pas de messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fr/contact.json b/app/javascript/dashboard/i18n/locale/fr/contact.json
index 675138d2a..715eda37d 100644
--- a/app/javascript/dashboard/i18n/locale/fr/contact.json
+++ b/app/javascript/dashboard/i18n/locale/fr/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Étiquettes disponibles dans le compte",
"REMOVE": "Cliquez sur l'icône X pour supprimer l'étiquette",
"ADD": "Cliquez sur l'icône + pour ajouter l'étiquette",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Mettre à jour les étiquettes",
"UPDATE_ERROR": "Impossible de mettre à jour les étiquettes. Veuillez réessayer."
},
"NO_LABELS_TO_ADD": "Il n'y a pas d'autres étiquettes définies dans le compte.",
- "NO_AVAILABLE_LABELS": "Aucune étiquette n'a été ajoutée à cette conversation."
+ "NO_AVAILABLE_LABELS": "Aucune étiquette n'a été ajoutée à cette conversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mettre la conversation en sourdine",
"UNMUTE_CONTACT": "Réactiver le son de conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Voir les détails"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
index d204a58b0..82a6d7dff 100644
--- a/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/fr/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Paramètres",
"COLLABORATORS": "Collaborateurs",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Formulaire avant chat",
"BUSINESS_HOURS": "Heures de bureau"
},
diff --git a/app/javascript/dashboard/i18n/locale/fr/index.js b/app/javascript/dashboard/i18n/locale/fr/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/fr/index.js
+++ b/app/javascript/dashboard/i18n/locale/fr/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/fr/report.json b/app/javascript/dashboard/i18n/locale/fr/report.json
index ed05c942c..82d3dd070 100644
--- a/app/javascript/dashboard/i18n/locale/fr/report.json
+++ b/app/javascript/dashboard/i18n/locale/fr/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "30 derniers jours"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/hi/campaign.json b/app/javascript/dashboard/i18n/locale/hi/campaign.json
new file mode 100644
index 000000000..2eed61b19
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/hi/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Cancel",
+ "CREATE_BUTTON_TEXT": "Create",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Please enter a valid URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Update",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "There was an error, please try again"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Edit",
+ "DELETE": "Delete"
+ },
+ "STATUS": {
+ "ENABLED": "Enabled",
+ "DISABLED": "Disabled"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/hi/chatlist.json b/app/javascript/dashboard/i18n/locale/hi/chatlist.json
index 228554789..ef4e0629a 100644
--- a/app/javascript/dashboard/i18n/locale/hi/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/hi/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/hi/contact.json b/app/javascript/dashboard/i18n/locale/hi/contact.json
index b8d936d22..6a94011a5 100644
--- a/app/javascript/dashboard/i18n/locale/hi/contact.json
+++ b/app/javascript/dashboard/i18n/locale/hi/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Labels available in the account",
"REMOVE": "Click on X icon to remove the label",
"ADD": "Click on + icon to add the label",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Update labels",
"UPDATE_ERROR": "Couldn't update labels, try again."
},
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
- "NO_AVAILABLE_LABELS": "There are no labels added to this conversation."
+ "NO_AVAILABLE_LABELS": "There are no labels added to this conversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
index 13d97f3b0..e03e40f39 100644
--- a/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hi/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Settings",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/hi/index.js b/app/javascript/dashboard/i18n/locale/hi/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/hi/index.js
+++ b/app/javascript/dashboard/i18n/locale/hi/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/hi/report.json b/app/javascript/dashboard/i18n/locale/hi/report.json
index 22e4a1c75..cf2c14a57 100644
--- a/app/javascript/dashboard/i18n/locale/hi/report.json
+++ b/app/javascript/dashboard/i18n/locale/hi/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Last 30 days"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/hu/campaign.json b/app/javascript/dashboard/i18n/locale/hu/campaign.json
new file mode 100644
index 000000000..3dd1c8833
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/hu/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Mégse",
+ "CREATE_BUTTON_TEXT": "Létrehozás",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Üzenet",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Küldő",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Kérjük helyes URL-t adj meg"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Frissítés",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Hiba történt, kérjük próbáld újra"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Üzenet",
+ "STATUS": "Státusz",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Szerkesztés",
+ "DELETE": "Törlés"
+ },
+ "STATUS": {
+ "ENABLED": "Engedélyezve",
+ "DISABLED": "Letiltva"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/hu/chatlist.json b/app/javascript/dashboard/i18n/locale/hu/chatlist.json
index ad92ed50a..35f293fc6 100644
--- a/app/javascript/dashboard/i18n/locale/hu/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/hu/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "E-mailen keresztül érkezett",
"VIEW_TWEET_IN_TWITTER": "Üzenet megtekintése Twitteren",
"REPLY_TO_TWEET": "Válasz",
- "NO_MESSAGES": "Nincs üzenet"
+ "NO_MESSAGES": "Nincs üzenet",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/hu/contact.json b/app/javascript/dashboard/i18n/locale/hu/contact.json
index f6253f06a..378a2413a 100644
--- a/app/javascript/dashboard/i18n/locale/hu/contact.json
+++ b/app/javascript/dashboard/i18n/locale/hu/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "A fiókhoz tartozó cimkék",
"REMOVE": "Kattints az X ikonra a cimke eltávolításához",
"ADD": "Kattints a + ikonra a cimke hozzáadásához",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Cimkék frissítése",
"UPDATE_ERROR": "Cimke frissítés sikertelen, kérjük próbáld később."
},
"NO_LABELS_TO_ADD": "Ebben a fiókban már nincsenek további cimkék.",
- "NO_AVAILABLE_LABELS": "Nincs több cimke ehhez a beszélgetéshez."
+ "NO_AVAILABLE_LABELS": "Nincs több cimke ehhez a beszélgetéshez.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Beszélgetés elnémítása",
"UNMUTE_CONTACT": "Beszélgetés elnémításának feloldása",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Részletek megtekintése"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
index a0a9c777a..615516429 100644
--- a/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/hu/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Beállítások",
"COLLABORATORS": "Csapattagok",
"CONFIGURATION": "Beállítások",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Chat előtti űrlap",
"BUSINESS_HOURS": "Nyitvatartás"
},
diff --git a/app/javascript/dashboard/i18n/locale/hu/index.js b/app/javascript/dashboard/i18n/locale/hu/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/hu/index.js
+++ b/app/javascript/dashboard/i18n/locale/hu/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/hu/report.json b/app/javascript/dashboard/i18n/locale/hu/report.json
index c039c0d82..1a537be20 100644
--- a/app/javascript/dashboard/i18n/locale/hu/report.json
+++ b/app/javascript/dashboard/i18n/locale/hu/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Utolsó 30 nap"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/id/campaign.json b/app/javascript/dashboard/i18n/locale/id/campaign.json
new file mode 100644
index 000000000..9703a7ce0
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/id/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Batalkan",
+ "CREATE_BUTTON_TEXT": "Buat",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Pesan",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Dikirim oleh",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Harap masukkan URL yang valid"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Perbarui",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Terjadi kesalahan, harap coba lagi"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Pesan",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Edit",
+ "DELETE": "Hapus"
+ },
+ "STATUS": {
+ "ENABLED": "Diaktifkan",
+ "DISABLED": "Nonaktif"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/id/chatlist.json b/app/javascript/dashboard/i18n/locale/id/chatlist.json
index 2550d9cfc..0fa657567 100644
--- a/app/javascript/dashboard/i18n/locale/id/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/id/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Diterima melalui email",
"VIEW_TWEET_IN_TWITTER": "Lihat tweet di Twitter",
"REPLY_TO_TWEET": "Balas tweet ini",
- "NO_MESSAGES": "Tidak Ada Pesan"
+ "NO_MESSAGES": "Tidak Ada Pesan",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/id/contact.json b/app/javascript/dashboard/i18n/locale/id/contact.json
index 4bb39dc7a..56f590502 100644
--- a/app/javascript/dashboard/i18n/locale/id/contact.json
+++ b/app/javascript/dashboard/i18n/locale/id/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Label tersedia di akun",
"REMOVE": "Klik ikon X untuk menghapus label",
"ADD": "Klik ikon + untuk menambah label",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Memperbaharui label",
"UPDATE_ERROR": "Tidak dapat memperbarui label, coba lagi."
},
"NO_LABELS_TO_ADD": "Tidak ada lagi label yang ditentukan di akun.",
- "NO_AVAILABLE_LABELS": "Tidak ada label yang ditambahkan ke percakapan ini."
+ "NO_AVAILABLE_LABELS": "Tidak ada label yang ditambahkan ke percakapan ini.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Percakapan",
"UNMUTE_CONTACT": "Unmute Percakapan",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Lihat detail"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
index 668661cac..aa79cbbc8 100644
--- a/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/id/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Pengaturan",
"COLLABORATORS": "Kolaborator",
"CONFIGURATION": "Konfigurasi",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Formulir Pra Obrolan",
"BUSINESS_HOURS": "Jam Kerja"
},
diff --git a/app/javascript/dashboard/i18n/locale/id/index.js b/app/javascript/dashboard/i18n/locale/id/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/id/index.js
+++ b/app/javascript/dashboard/i18n/locale/id/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/id/report.json b/app/javascript/dashboard/i18n/locale/id/report.json
index bdd2f8b44..27790ae5d 100644
--- a/app/javascript/dashboard/i18n/locale/id/report.json
+++ b/app/javascript/dashboard/i18n/locale/id/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "30 hari terakhir"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/it/campaign.json b/app/javascript/dashboard/i18n/locale/it/campaign.json
new file mode 100644
index 000000000..3059eaa28
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/it/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "annulla",
+ "CREATE_BUTTON_TEXT": "Create",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Messaggio",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Inserisci un URL valido"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Aggiornamento",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "There was an error, please try again"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Messaggio",
+ "STATUS": "Stato",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Modifica",
+ "DELETE": "Cancellare"
+ },
+ "STATUS": {
+ "ENABLED": "Abilitato",
+ "DISABLED": "Disabilitato"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/it/chatlist.json b/app/javascript/dashboard/i18n/locale/it/chatlist.json
index 1c5ae61b5..f4bcd187c 100644
--- a/app/javascript/dashboard/i18n/locale/it/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/it/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/it/contact.json b/app/javascript/dashboard/i18n/locale/it/contact.json
index be4a7e8ec..1bb13b561 100644
--- a/app/javascript/dashboard/i18n/locale/it/contact.json
+++ b/app/javascript/dashboard/i18n/locale/it/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Labels available in the account",
"REMOVE": "Click on X icon to remove the label",
"ADD": "Click on + icon to add the label",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Update labels",
"UPDATE_ERROR": "Couldn't update labels, try again."
},
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
- "NO_AVAILABLE_LABELS": "There are no labels added to this conversation."
+ "NO_AVAILABLE_LABELS": "There are no labels added to this conversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
index d48bd44c9..7e55f017e 100644
--- a/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/it/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Impostazioni",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/it/index.js b/app/javascript/dashboard/i18n/locale/it/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/it/index.js
+++ b/app/javascript/dashboard/i18n/locale/it/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/it/report.json b/app/javascript/dashboard/i18n/locale/it/report.json
index 134ba9e4e..e8dc548a3 100644
--- a/app/javascript/dashboard/i18n/locale/it/report.json
+++ b/app/javascript/dashboard/i18n/locale/it/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Ultimi 30 giorni"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/ja/campaign.json b/app/javascript/dashboard/i18n/locale/ja/campaign.json
new file mode 100644
index 000000000..d1553b40f
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ja/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "キャンセル",
+ "CREATE_BUTTON_TEXT": "作成",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "メッセージ",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "有効な URL を入力してください"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "更新",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "エラーが発生しました。もう一度お試しください。"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "メッセージ",
+ "STATUS": "状況",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "編集",
+ "DELETE": "削除"
+ },
+ "STATUS": {
+ "ENABLED": "有効です",
+ "DISABLED": "無効です"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/ja/chatlist.json b/app/javascript/dashboard/i18n/locale/ja/chatlist.json
index 71aa0a41b..b46ac89eb 100644
--- a/app/javascript/dashboard/i18n/locale/ja/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/ja/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "メールで受信しました",
"VIEW_TWEET_IN_TWITTER": "ツイートをTwitterで見る",
"REPLY_TO_TWEET": "このつぶやきに返信",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ja/contact.json b/app/javascript/dashboard/i18n/locale/ja/contact.json
index addffbe89..4975d8f6d 100644
--- a/app/javascript/dashboard/i18n/locale/ja/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ja/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "アカウントで利用可能なラベル名",
"REMOVE": "ラベルを削除するには×アイコンをクリックします",
"ADD": "+アイコンをクリックしてラベルを追加",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "ラベルの更新",
"UPDATE_ERROR": "ラベルを更新できませんでした。再度お試し下さい。"
},
"NO_LABELS_TO_ADD": "アカウントに定義されているラベルがありません。",
- "NO_AVAILABLE_LABELS": "この会話に追加されたラベルはありません。"
+ "NO_AVAILABLE_LABELS": "この会話に追加されたラベルはありません。",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "会話をミュート",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -121,7 +127,7 @@
"ERROR": "Select an inbox"
},
"MESSAGE": {
- "LABEL": "Message",
+ "LABEL": "メッセージ",
"PLACEHOLDER": "Write your message here",
"ERROR": "Message can't be empty"
},
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
index 9de7d7b1d..47bd7eaa6 100644
--- a/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ja/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "設定",
"COLLABORATORS": "共同編集者",
"CONFIGURATION": "設定",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/ja/index.js b/app/javascript/dashboard/i18n/locale/ja/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/ja/index.js
+++ b/app/javascript/dashboard/i18n/locale/ja/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/ja/report.json b/app/javascript/dashboard/i18n/locale/ja/report.json
index ceb6e7fa8..e2dd96880 100644
--- a/app/javascript/dashboard/i18n/locale/ja/report.json
+++ b/app/javascript/dashboard/i18n/locale/ja/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "過去 30 日間"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/ko/campaign.json b/app/javascript/dashboard/i18n/locale/ko/campaign.json
new file mode 100644
index 000000000..d8a2ed7ac
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ko/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "취소",
+ "CREATE_BUTTON_TEXT": "만들기",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "보낸 사람",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "올바른 URL을 입력하십시오."
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "업데이트",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "오류가 발생했습니다. 다시 시도하십시오."
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "상태",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "수정",
+ "DELETE": "삭제"
+ },
+ "STATUS": {
+ "ENABLED": "사용함",
+ "DISABLED": "사용 안 함"
+ },
+ "SENDER": {
+ "BOT": "봇"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/ko/chatlist.json b/app/javascript/dashboard/i18n/locale/ko/chatlist.json
index ecd98b66c..2078a2193 100644
--- a/app/javascript/dashboard/i18n/locale/ko/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/ko/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "이메일을 통해 수신됨",
"VIEW_TWEET_IN_TWITTER": "트위터에서 트윗 보기",
"REPLY_TO_TWEET": "트윗에 응답하기",
- "NO_MESSAGES": "메시지 없음"
+ "NO_MESSAGES": "메시지 없음",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ko/contact.json b/app/javascript/dashboard/i18n/locale/ko/contact.json
index 67b8758ac..52ac02c1b 100644
--- a/app/javascript/dashboard/i18n/locale/ko/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ko/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "계정에서 사용할 수 있는 라벨",
"REMOVE": "라벨을 제거하려면 X 아이콘을 클릭하십시오.",
"ADD": "라벨을 추가하려면 + 아이콘을 클릭하십시오.",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "라벨 업데이트",
"UPDATE_ERROR": "라벨을 업데이트할 수 없습니다. 다시 시도하십시오."
},
"NO_LABELS_TO_ADD": "계정에는 더 이상 라벨이 정의되어 있지 않습니다.",
- "NO_AVAILABLE_LABELS": "이 대화에 추가된 라벨이 없습니다."
+ "NO_AVAILABLE_LABELS": "이 대화에 추가된 라벨이 없습니다.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "대화 음소거",
"UNMUTE_CONTACT": "대화 음소거 해제",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "상세보기"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
index eacde87d4..f492f69f9 100644
--- a/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ko/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "설정",
"COLLABORATORS": "협력자",
"CONFIGURATION": "설치",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "대화 전 설문",
"BUSINESS_HOURS": "영업시간"
},
diff --git a/app/javascript/dashboard/i18n/locale/ko/index.js b/app/javascript/dashboard/i18n/locale/ko/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/ko/index.js
+++ b/app/javascript/dashboard/i18n/locale/ko/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/ko/report.json b/app/javascript/dashboard/i18n/locale/ko/report.json
index f69473303..57f0786af 100644
--- a/app/javascript/dashboard/i18n/locale/ko/report.json
+++ b/app/javascript/dashboard/i18n/locale/ko/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "지난 30일"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/ml/campaign.json b/app/javascript/dashboard/i18n/locale/ml/campaign.json
new file mode 100644
index 000000000..34628226f
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ml/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "റദ്ദാക്കുക",
+ "CREATE_BUTTON_TEXT": "സൃഷ്ടിക്കുക",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "ദയവായി സാധുവായ ഒരു യുആർഎൽ നൽകുക"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "അപ്ഡേറ്റ്",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "ഒരു പിശക് ഉണ്ടായിരുന്നു, ദയവായി വീണ്ടും ശ്രമിക്കുക"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "സ്റ്റാറ്റസ്",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "എഡിറ്റുചെയ്യുക",
+ "DELETE": "ഇല്ലാതാക്കുക"
+ },
+ "STATUS": {
+ "ENABLED": "പ്രവർത്തനക്ഷമമാക്കി",
+ "DISABLED": "പ്രവർത്തനരഹിതമാക്കി"
+ },
+ "SENDER": {
+ "BOT": "ബോട്ട്"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/ml/chatlist.json b/app/javascript/dashboard/i18n/locale/ml/chatlist.json
index 7a0db1357..06ce7caeb 100644
--- a/app/javascript/dashboard/i18n/locale/ml/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/ml/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "ഇമെയിൽ വഴി ലഭിച്ചു",
"VIEW_TWEET_IN_TWITTER": "ട്വിറ്ററിൽ ട്വീറ്റ് കാണുക",
"REPLY_TO_TWEET": "ഈ ട്വീറ്റിന് മറുപടി നൽകുക",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ml/contact.json b/app/javascript/dashboard/i18n/locale/ml/contact.json
index a12cf2ea6..d2af1ebb6 100644
--- a/app/javascript/dashboard/i18n/locale/ml/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ml/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "അക്കൗണ്ടിൽ ലേബലുകൾ ലഭ്യമാണ്",
"REMOVE": "ലേബൽ നീക്കംചെയ്യുന്നതിന് എക്സ് ഐക്കണിൽ ക്ലിക്കുചെയ്യുക",
"ADD": "ലേബൽ ചേർക്കാൻ + ഐക്കണിൽ ക്ലിക്കുചെയ്യുക",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "ലേബലുകൾ അപ്ഡേറ്റുചെയ്യുക",
"UPDATE_ERROR": "ലേബലുകൾ അപ്ഡേറ്റ് ചെയ്യാൻ കഴിഞ്ഞില്ല, വീണ്ടും ശ്രമിക്കുക."
},
"NO_LABELS_TO_ADD": "അക്കൗണ്ടിൽ കൂടുതൽ ലേബലുകൾ നിർവചിച്ചിട്ടില്ല.",
- "NO_AVAILABLE_LABELS": "ഈ സംഭാഷണത്തിലേക്ക് ലേബലുകളൊന്നും ചേർത്തിട്ടില്ല."
+ "NO_AVAILABLE_LABELS": "ഈ സംഭാഷണത്തിലേക്ക് ലേബലുകളൊന്നും ചേർത്തിട്ടില്ല.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "സംഭാഷണം ഒച്ചയിലാതാക്കുക",
"UNMUTE_CONTACT": "സംഭാഷണം നിശബ്ദമാക്കുക",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
index 41adc4945..341b1a217 100644
--- a/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ml/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "ക്രമീകരണങ്ങൾ",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/ml/index.js b/app/javascript/dashboard/i18n/locale/ml/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/ml/index.js
+++ b/app/javascript/dashboard/i18n/locale/ml/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/ml/report.json b/app/javascript/dashboard/i18n/locale/ml/report.json
index 4a598143c..41080ccd0 100644
--- a/app/javascript/dashboard/i18n/locale/ml/report.json
+++ b/app/javascript/dashboard/i18n/locale/ml/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "കഴിഞ്ഞ 30 ദിവസം"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/ne/campaign.json b/app/javascript/dashboard/i18n/locale/ne/campaign.json
new file mode 100644
index 000000000..2eed61b19
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ne/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Cancel",
+ "CREATE_BUTTON_TEXT": "Create",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Please enter a valid URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Update",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "There was an error, please try again"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Edit",
+ "DELETE": "Delete"
+ },
+ "STATUS": {
+ "ENABLED": "Enabled",
+ "DISABLED": "Disabled"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/ne/chatlist.json b/app/javascript/dashboard/i18n/locale/ne/chatlist.json
index 228554789..ef4e0629a 100644
--- a/app/javascript/dashboard/i18n/locale/ne/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/ne/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ne/contact.json b/app/javascript/dashboard/i18n/locale/ne/contact.json
index 52e42bc60..b00c7c3d4 100644
--- a/app/javascript/dashboard/i18n/locale/ne/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ne/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Labels available in the account",
"REMOVE": "Click on X icon to remove the label",
"ADD": "Click on + icon to add the label",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Update labels",
"UPDATE_ERROR": "Couldn't update labels, try again."
},
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
- "NO_AVAILABLE_LABELS": "There are no labels added to this conversation."
+ "NO_AVAILABLE_LABELS": "There are no labels added to this conversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
index a1184f5db..4d0fcdffc 100644
--- a/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ne/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Settings",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/ne/index.js b/app/javascript/dashboard/i18n/locale/ne/index.js
new file mode 100644
index 000000000..cf1dda7fe
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ne/index.js
@@ -0,0 +1,37 @@
+import { default as _agentMgmt } from './agentMgmt.json';
+import { default as _campaign } from './campaign.json';
+import { default as _cannedMgmt } from './cannedMgmt.json';
+import { default as _chatlist } from './chatlist.json';
+import { default as _contact } from './contact.json';
+import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
+import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _login } from './login.json';
+import { default as _report } from './report.json';
+import { default as _resetPassword } from './resetPassword.json';
+import { default as _setNewPassword } from './setNewPassword.json';
+import { default as _settings } from './settings.json';
+import { default as _signup } from './signup.json';
+import { default as _teamsSettings } from './teamsSettings.json';
+
+export default {
+ ..._agentMgmt,
+ ..._campaign,
+ ..._cannedMgmt,
+ ..._chatlist,
+ ..._contact,
+ ..._conversation,
+ ..._generalSettings,
+ ..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
+ ..._login,
+ ..._report,
+ ..._resetPassword,
+ ..._setNewPassword,
+ ..._settings,
+ ..._signup,
+ ..._teamsSettings,
+};
diff --git a/app/javascript/dashboard/i18n/locale/ne/report.json b/app/javascript/dashboard/i18n/locale/ne/report.json
index 22e4a1c75..cf2c14a57 100644
--- a/app/javascript/dashboard/i18n/locale/ne/report.json
+++ b/app/javascript/dashboard/i18n/locale/ne/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Last 30 days"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/nl/campaign.json b/app/javascript/dashboard/i18n/locale/nl/campaign.json
new file mode 100644
index 000000000..6314848a8
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/nl/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Annuleren",
+ "CREATE_BUTTON_TEXT": "Aanmaken",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Voer een geldige URL in"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Vernieuwen",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Er is een fout opgetreden, probeer het opnieuw"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Bewerken",
+ "DELETE": "Verwijderen"
+ },
+ "STATUS": {
+ "ENABLED": "Ingeschakeld",
+ "DISABLED": "Uitgeschakeld"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/nl/chatlist.json b/app/javascript/dashboard/i18n/locale/nl/chatlist.json
index 9457f267c..24d6d4865 100644
--- a/app/javascript/dashboard/i18n/locale/nl/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/nl/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/nl/contact.json b/app/javascript/dashboard/i18n/locale/nl/contact.json
index f5b168577..848a1523c 100644
--- a/app/javascript/dashboard/i18n/locale/nl/contact.json
+++ b/app/javascript/dashboard/i18n/locale/nl/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Labels beschikbaar in het account",
"REMOVE": "Klik op het X-pictogram om het label te verwijderen",
"ADD": "Klik op + pictogram om het label toe te voegen",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Labels bijwerken",
"UPDATE_ERROR": "Kon labels niet updaten, probeer het opnieuw."
},
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
- "NO_AVAILABLE_LABELS": "Er zijn geen labels toegevoegd aan dit gesprek."
+ "NO_AVAILABLE_LABELS": "Er zijn geen labels toegevoegd aan dit gesprek.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Gesprek dempen",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
index e7372877a..f136d7153 100644
--- a/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/nl/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Instellingen",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/nl/index.js b/app/javascript/dashboard/i18n/locale/nl/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/nl/index.js
+++ b/app/javascript/dashboard/i18n/locale/nl/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/nl/report.json b/app/javascript/dashboard/i18n/locale/nl/report.json
index bbe2293ab..96d77ba49 100644
--- a/app/javascript/dashboard/i18n/locale/nl/report.json
+++ b/app/javascript/dashboard/i18n/locale/nl/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Laatste 30 dagen"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/no/campaign.json b/app/javascript/dashboard/i18n/locale/no/campaign.json
new file mode 100644
index 000000000..f3d9c1dc2
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/no/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Avbryt",
+ "CREATE_BUTTON_TEXT": "Opprett",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sendt av",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Vennligst skriv inn en gyldig URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Oppdater",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Det oppstod en feil. Prøv igjen"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Satus",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Rediger",
+ "DELETE": "Slett"
+ },
+ "STATUS": {
+ "ENABLED": "Aktivert",
+ "DISABLED": "Deaktivert"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/no/chatlist.json b/app/javascript/dashboard/i18n/locale/no/chatlist.json
index 1d021333f..d174f0454 100644
--- a/app/javascript/dashboard/i18n/locale/no/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/no/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Mottatt via e-post",
"VIEW_TWEET_IN_TWITTER": "Vis tweet i Twitter",
"REPLY_TO_TWEET": "Svar på denne tweeten",
- "NO_MESSAGES": "Ingen meldinger"
+ "NO_MESSAGES": "Ingen meldinger",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/no/contact.json b/app/javascript/dashboard/i18n/locale/no/contact.json
index fa51cea65..2da471d42 100644
--- a/app/javascript/dashboard/i18n/locale/no/contact.json
+++ b/app/javascript/dashboard/i18n/locale/no/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Etiketter tilgjengelig i kontoen",
"REMOVE": "Klikk på X ikonet for å fjerne etiketten",
"ADD": "Klikk på + ikonet for å legge til etiketten",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Oppdater etiketter",
"UPDATE_ERROR": "Kunne ikke oppdatere etiketter, prøv på nytt."
},
"NO_LABELS_TO_ADD": "Det er ingen flere etiketter definert i kontoen.",
- "NO_AVAILABLE_LABELS": "Det er ingen etiketter lagt til i denne samtalen."
+ "NO_AVAILABLE_LABELS": "Det er ingen etiketter lagt til i denne samtalen.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Demp samtale",
"UNMUTE_CONTACT": "Skru av demping",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
index 37a1ccd8a..ba825fb6d 100644
--- a/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/no/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Innstillinger",
"COLLABORATORS": "Samarbeidspartnere",
"CONFIGURATION": "Konfigurasjon",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/no/index.js b/app/javascript/dashboard/i18n/locale/no/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/no/index.js
+++ b/app/javascript/dashboard/i18n/locale/no/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/no/report.json b/app/javascript/dashboard/i18n/locale/no/report.json
index 97ca6b427..578a2012f 100644
--- a/app/javascript/dashboard/i18n/locale/no/report.json
+++ b/app/javascript/dashboard/i18n/locale/no/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Siste 30 dager"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/pl/campaign.json b/app/javascript/dashboard/i18n/locale/pl/campaign.json
new file mode 100644
index 000000000..581f2fd4e
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/pl/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Kampania",
+ "SIDEBAR_TXT": "Proaktywne wiadomości pozwalają klientowi wysyłać wiadomości do swoich kontaktów, co powoduje więcej rozmów. Kliknij na Dodaj kampanię, aby stworzyć nową kampanię. Możesz też edytować lub usunąć istniejącą kampanię poprzez kliknięcie na przycisk Edytuj lub Usuń.",
+ "HEADER_BTN_TXT": "Stwórz kampanię",
+ "ADD": {
+ "TITLE": "Stwórz kampanię",
+ "DESC": "Proaktywne wiadomości pozwalają klientowi wysyłać wiadomości do swoich kontaktów, co powoduje więcej rozmów.",
+ "CANCEL_BUTTON_TEXT": "Anuluj",
+ "CREATE_BUTTON_TEXT": "Stwórz",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Tytuł",
+ "PLACEHOLDER": "Wprowadź tytuł kampanii",
+ "ERROR": "Tytuł jest wymagany"
+ },
+ "MESSAGE": {
+ "LABEL": "Wiadomość",
+ "PLACEHOLDER": "Wprowadź wiadomość dla kampanii",
+ "ERROR": "Wiadomość jest wymagana"
+ },
+ "SENT_BY": {
+ "LABEL": "Wysłane przez",
+ "PLACEHOLDER": "Proszę wybrać treść kampanii",
+ "ERROR": "Nadawca jest wymagany"
+ },
+ "END_POINT": {
+ "LABEL": "Adres URL",
+ "PLACEHOLDER": "Wprowadź adres URL",
+ "ERROR": "Wprowadź poprawny adres URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Czas na stronie (w sekundach)",
+ "PLACEHOLDER": "Wprowadź czas",
+ "ERROR": "Czas na stronie jest wymagany"
+ },
+ "ENABLED": "Włącz kampanię",
+ "SUBMIT": "Dodaj kampanię"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Kampania została utworzona pomyślnie",
+ "ERROR_MESSAGE": "Wystąpił błąd, spróbuj ponownie."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Aktualizuj",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Wystąpił błąd, spróbuj ponownie"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "Brak kampanii stworzonych dla tej skrzynki odbiorczej.",
+ "TABLE_HEADER": {
+ "TITLE": "Tytuł",
+ "MESSAGE": "Wiadomość",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "Adres URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Dodaj",
+ "EDIT": "Edytuj",
+ "DELETE": "Usuń"
+ },
+ "STATUS": {
+ "ENABLED": "Włączone",
+ "DISABLED": "Wyłączone"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/pl/chatlist.json b/app/javascript/dashboard/i18n/locale/pl/chatlist.json
index 4cdc30cec..358b592d6 100644
--- a/app/javascript/dashboard/i18n/locale/pl/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/pl/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Otrzymano przez e-mail",
"VIEW_TWEET_IN_TWITTER": "Zobacz tweet na Twitterze",
"REPLY_TO_TWEET": "Odpowiedz na ten tweet",
- "NO_MESSAGES": "Brak wiadomości"
+ "NO_MESSAGES": "Brak wiadomości",
+ "NO_CONTENT": "Brak treści"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pl/contact.json b/app/javascript/dashboard/i18n/locale/pl/contact.json
index 82305f6c1..f761ab4fc 100644
--- a/app/javascript/dashboard/i18n/locale/pl/contact.json
+++ b/app/javascript/dashboard/i18n/locale/pl/contact.json
@@ -12,7 +12,7 @@
"INITIATED_FROM": "Zainicjowano z",
"INITIATED_AT": "Zainicjowano w",
"IP_ADDRESS": "Adres IP",
- "NEW_MESSAGE": "New message",
+ "NEW_MESSAGE": "Nowa wiadomość",
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "Brak poprzednich rozmów powiązanych z tym kontaktem.",
"TITLE": "Poprzednie rozmowy"
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Etykiety dostępne na koncie",
"REMOVE": "Kliknij na ikonę X, aby usunąć etykietę",
"ADD": "Kliknij na ikonę +, aby dodać etykietę",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Zaktualizuj etykiety",
"UPDATE_ERROR": "Nie udało się zaktualizować etykiet, spróbuj ponownie."
},
"NO_LABELS_TO_ADD": "Nie ma więcej etykiet zdefiniowanych na koncie.",
- "NO_AVAILABLE_LABELS": "Do tej rozmowy nie dodano żadnych etykiet."
+ "NO_AVAILABLE_LABELS": "Do tej rozmowy nie dodano żadnych etykiet.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Wycisz rozmowę",
"UNMUTE_CONTACT": "Wyłącz wyciszenie rozmowy",
@@ -73,8 +79,8 @@
"PHONE_NUMBER": {
"PLACEHOLDER": "Wprowadź numer telefonu kontaktu",
"LABEL": "Numer telefonu",
- "HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]",
- "ERROR": "Phone number should be either empty or of E.164 format"
+ "HELP": "Numer telefonu powinien mieć format E.164, np. +1415555555 [+][kod krajowy][kod kierunkowy][numer telefonu]",
+ "ERROR": "Numer telefonu powinien być pusty lub w formacie E.164"
},
"LOCATION": {
"PLACEHOLDER": "Wprowadź lokalizację kontaktu",
@@ -108,27 +114,27 @@
"ERROR_MESSAGE": "Wystąpił błąd, spróbuj ponownie"
},
"NEW_CONVERSATION": {
- "BUTTON_LABEL": "Start conversation",
+ "BUTTON_LABEL": "Rozpocznij rozmowę",
"TITLE": "Nowa rozmowa",
- "DESC": "Start a new conversation by sending a new message.",
- "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
+ "DESC": "Rozpocznij nową rozmowę wysyłając wiadomość.",
+ "NO_INBOX": "Nie można odnaleźć skrzynki odbiorczej do rozpoczęcia nowej rozmowy z tym kontaktem.",
"FORM": {
"TO": {
- "LABEL": "To"
+ "LABEL": "Do"
},
"INBOX": {
- "LABEL": "Inbox",
- "ERROR": "Select an inbox"
+ "LABEL": "Skrzynka odbiorcza",
+ "ERROR": "Wybierz skrzynkę odbiorczą"
},
"MESSAGE": {
"LABEL": "Wiadomość",
- "PLACEHOLDER": "Write your message here",
- "ERROR": "Message can't be empty"
+ "PLACEHOLDER": "Wpisz swoją wiadomość tutaj",
+ "ERROR": "Wiadomość nie może być pusta"
},
- "SUBMIT": "Send message",
+ "SUBMIT": "Wyślij wiadomość",
"CANCEL": "Anuluj",
- "SUCCESS_MESSAGE": "Message sent!",
- "ERROR_MESSAGE": "Couldn't send! try again"
+ "SUCCESS_MESSAGE": "Wiadomość wysłana!",
+ "ERROR_MESSAGE": "Nie udało się wysłać! Spróbuj ponownie"
}
},
"CONTACTS_PAGE": {
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Wyświetl szczegóły"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notatki"
+ },
+ "ADD": {
+ "BUTTON": "Dodaj",
+ "PLACEHOLDER": "Dodaj notatkę",
+ "TITLE": "Shift + Enter by utworzyć notatkę"
+ },
+ "FOOTER": {
+ "BUTTON": "Wyświetl wszystkie notatki"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pl/conversation.json b/app/javascript/dashboard/i18n/locale/pl/conversation.json
index 240806fb8..15593e198 100644
--- a/app/javascript/dashboard/i18n/locale/pl/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pl/conversation.json
@@ -20,7 +20,7 @@
"LOADING_CONVERSATIONS": "Ładowanie konwersacji",
"CANNOT_REPLY": "Nie możesz odpowiedzieć z powodu",
"24_HOURS_WINDOW": "Ograniczenie 24-godzinnego okna wiadomości",
- "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
+ "TWILIO_WHATSAPP_CAN_REPLY": "Możesz odpowiedzieć na tę rozmowę tylko za pomocą szablonu wiadomości, ponieważ",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "Ograniczenie 24-godzinnego okna wiadomości",
"LAST_INCOMING_TWEET": "Odpowiadasz na ostatniego przychodzącego tweeta",
"REPLYING_TO": "Osoba, której odpowiadasz to:",
@@ -58,7 +58,7 @@
"CHANGE_STATUS": "Status konwersacji zmieniony",
"CHANGE_AGENT": "Osoba przypisana do konwersacji zmieniona",
"CHANGE_TEAM": "Zespół konwersacji został zmieniony",
- "FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit",
+ "FILE_SIZE_LIMIT": "Plik przekracza limit {MAXIMUM_FILE_UPLOAD_SIZE} dla załącznika",
"SENT_BY": "Wysłane przez:",
"ASSIGNMENT": {
"SELECT_AGENT": "Wybierz Agenta",
diff --git a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
index bd5e75e9f..d17ab4b97 100644
--- a/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pl/inboxMgmt.json
@@ -79,7 +79,7 @@
"IN_A_FEW_MINUTES": "W ciągu kilku minut",
"IN_A_FEW_HOURS": "W ciągu kilku godzin",
"IN_A_DAY": "W ciągu dnia",
- "HELP_TEXT": "This reply time will be displayed on the live chat widget"
+ "HELP_TEXT": "Ten czas odpowiedzi będzie wyświetlany na widżecie czatu na żywo"
},
"WIDGET_COLOR": {
"LABEL": "Kolor widżetu",
@@ -88,8 +88,8 @@
"SUBMIT_BUTTON": "Utwórz skrzynkę odbiorczą"
},
"TWILIO": {
- "TITLE": "Twilio SMS/Whatsapp Channel",
- "DESC": "Integrate Twilio and start supporting your customers via SMS or Whatsapp.",
+ "TITLE": "Kanał Twilio SMS/WhatsApp",
+ "DESC": "Zintegruj Twilio i zacznij wspierać swoich klientów poprzez SMS lub WhatsApp.",
"ACCOUNT_SID": {
"LABEL": "Karta SID konta",
"PLACEHOLDER": "Wprowadź SID konta Twilio",
@@ -151,14 +151,14 @@
},
"EMAIL": {
"LABEL": "E-mail",
- "SUBTITLE": "Email where your customers sends you support tickets",
+ "SUBTITLE": "Adres e-mail, na który Twoi klienci wysyłają Ci zgłoszenia",
"PLACEHOLDER": "E-mail"
},
"SUBMIT_BUTTON": "Utwórz kanał e-mail",
"API": {
- "ERROR_MESSAGE": "We were not able to save the email channel"
+ "ERROR_MESSAGE": "Nie udało nam się zapisać kanału e-mail"
},
- "FINISH_MESSAGE": "Start forwarding your emails to the following email address."
+ "FINISH_MESSAGE": "Zacznij przekierowywać swoje wiadomości na następujący adres e-mail."
},
"AUTH": {
"TITLE": "Kanały",
@@ -167,8 +167,8 @@
"AGENTS": {
"TITLE": "Agenci",
"DESC": "Tutaj możesz dodać agentów do zarządzania swoją nowo utworzoną skrzynką odbiorczą. Tylko ci wybrani agenci będą mieli dostęp do Twojej skrzynki odbiorczej. Agenci, którzy nie są częścią tej skrzynki odbiorczej nie będą mogli zobaczyć ani odpowiadać na wiadomości w tej skrzynce odbiorczej podczas logowania. PS: Jako administrator, jeśli potrzebujesz dostępu do wszystkich skrzynek odbiorczych, powinieneś dodać siebie jako agenta do wszystkich skrzynek odbiorczych, które tworzysz.",
- "VALIDATION_ERROR": "Add atleast one agent to your new Inbox",
- "PICK_AGENTS": "Pick agents for the inbox"
+ "VALIDATION_ERROR": "Dodaj co najmniej jednego agenta do swojej nowej skrzynki odbiorczej",
+ "PICK_AGENTS": "Wybierz agentów dla skrzynki odbiorczej"
},
"DETAILS": {
"TITLE": "Szczegóły skrzynki odbiorczej",
@@ -194,7 +194,7 @@
"TITLE": "Twoja skrzynka odbiorcza jest gotowa!",
"MESSAGE": "Teraz możesz współpracować ze swoimi klientami poprzez swój nowy kanał. Szczęśliwego wsparcia ",
"BUTTON_TEXT": "Zabierz mnie tam",
- "MORE_SETTINGS": "More settings",
+ "MORE_SETTINGS": "Więcej ustawień",
"WEBSITE_SUCCESS": "Pomyślnie zakończyłeś tworzenie kanału internetowego. Skopiuj poniższy kod i wklej go na swojej stronie. Następnym razem, gdy klient korzysta z czatu na żywo, konwersacja pojawi się automatycznie na twojej skrzynce odbiorczej."
},
"REAUTH": "Ponowna autoryzacja",
@@ -227,14 +227,15 @@
"SETTINGS": "Ustawienia",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Konfiguracja",
+ "CAMPAIGN": "Kampania",
"PRE_CHAT_FORM": "Pre Chat Form",
- "BUSINESS_HOURS": "Business Hours"
+ "BUSINESS_HOURS": "Godziny pracy"
},
"SETTINGS": "Ustawienia",
"FEATURES": {
- "LABEL": "Features",
- "DISPLAY_FILE_PICKER": "Display file picker on the widget",
- "DISPLAY_EMOJI_PICKER": "Display emoji picker on the widget"
+ "LABEL": "Funkcje",
+ "DISPLAY_FILE_PICKER": "Wyświetl selektor plików w widżecie",
+ "DISPLAY_EMOJI_PICKER": "Wyświetl selektor emoji w widżecie"
},
"SETTINGS_POPUP": {
"MESSENGER_HEADING": "Skrypt Messengera",
@@ -246,7 +247,7 @@
"INBOX_UPDATE_TITLE": "Ustawienia skrzynki odbiorczej",
"INBOX_UPDATE_SUB_TEXT": "Zaktualizuj ustawienia skrzynki odbiorczej",
"AUTO_ASSIGNMENT_SUB_TEXT": "Włącz lub wyłącz automatyczne przypisywanie nowych rozmów do agentów dodanych do tej skrzynki odbiorczej.",
- "HMAC_VERIFICATION": "User Identity Validation",
+ "HMAC_VERIFICATION": "Weryfikacja tożsamości użytkownika",
"HMAC_DESCRIPTION": "Inorder validate the users identity, the SDK allows you to pass an `identity_hash` for each user. You can generate HMAC using 'sha256' with the key shown here."
},
"FACEBOOK_REAUTHORIZE": {
@@ -260,8 +261,8 @@
"ENABLE": {
"LABEL": "Enable pre chat form",
"OPTIONS": {
- "ENABLED": "Yes",
- "DISABLED": "No"
+ "ENABLED": "Tak",
+ "DISABLED": "Nie"
}
},
"PRE_CHAT_MESSAGE": {
@@ -275,19 +276,19 @@
"BUSINESS_HOURS": {
"TITLE": "Set your availability",
"SUBTITLE": "Set your availability on your livechat widget",
- "WEEKLY_TITLE": "Set your weekly hours",
- "TIMEZONE_LABEL": "Select timezone",
- "UPDATE": "Update business hours settings",
+ "WEEKLY_TITLE": "Ustaw swoje godziny tygodniowe",
+ "TIMEZONE_LABEL": "Wybierz strefę czasową",
+ "UPDATE": "Zaktualizuj ustawienia godzin pracy",
"TOGGLE_AVAILABILITY": "Enable business availability for this inbox",
- "UNAVAILABLE_MESSAGE_LABEL": "Unavailable message for vistors",
- "UNAVAILABLE_MESSAGE_DEFAULT": "We are unavailable at the moment. Leave a message we will respond once we are back.",
+ "UNAVAILABLE_MESSAGE_LABEL": "Wiadomość niedostępna dla odwiedzających",
+ "UNAVAILABLE_MESSAGE_DEFAULT": "W tej chwili jesteśmy niedostępni. Pozostaw wiadomość, a odpowiemy, gdy będzie to możliwe.",
"TOGGLE_HELP": "Enabling business availability will show the available hours on live chat widget even if all the agents are offline. Outside available hours vistors can be warned with a message and a pre-chat form.",
"DAY": {
- "ENABLE": "Enable availability for this day",
- "UNAVAILABLE": "Unavailable",
- "HOURS": "hours",
- "VALIDATION_ERROR": "Starting time should be before closing time.",
- "CHOOSE": "Choose"
+ "ENABLE": "Włącz dostępność w tym dniu",
+ "UNAVAILABLE": "Niedostępny",
+ "HOURS": "godzin",
+ "VALIDATION_ERROR": "Czas rozpoczęcia powinien być przed czasem zakończenia.",
+ "CHOOSE": "Wybierz"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pl/index.js b/app/javascript/dashboard/i18n/locale/pl/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/pl/index.js
+++ b/app/javascript/dashboard/i18n/locale/pl/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/pl/report.json b/app/javascript/dashboard/i18n/locale/pl/report.json
index c31fdfe6f..ef88c0251 100644
--- a/app/javascript/dashboard/i18n/locale/pl/report.json
+++ b/app/javascript/dashboard/i18n/locale/pl/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Ostatnie 30 dni"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/pl/teamsSettings.json b/app/javascript/dashboard/i18n/locale/pl/teamsSettings.json
index d756d754e..6b60eb857 100644
--- a/app/javascript/dashboard/i18n/locale/pl/teamsSettings.json
+++ b/app/javascript/dashboard/i18n/locale/pl/teamsSettings.json
@@ -15,21 +15,21 @@
"AGENTS": {
"BUTTON_TEXT": "Dodaj agentów do zespołu",
"TITLE": "Dodaj agentów do zespołu - %{teamName}",
- "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation."
+ "DESC": "Dodaj agentów do swojego nowo utworzonego zespołu. Dzięki temu możesz współpracować jako zespół w rozmowach oraz otrzymywać powiadomienia o nowych wydarzeniach w tej samej rozmowie."
},
"WIZARD": [
{
- "title": "Create",
+ "title": "Stwórz",
"route": "settings_teams_new",
- "body": "Create a new team of agents."
+ "body": "Stwórz nowy zespół agentów."
},
{
"title": "Dodaj agentów",
"route": "settings_teams_add_agents",
- "body": "Add agents to the team."
+ "body": "Dodaj agentów do zespołu."
},
{
- "title": "Finish",
+ "title": "Zakończ",
"route": "settings_teams_finish",
"body": "Wszystko jest gotowe!"
}
@@ -37,28 +37,28 @@
},
"EDIT_FLOW": {
"CREATE": {
- "TITLE": "Edit your team details",
- "DESC": "Edit title and description to your team.",
- "BUTTON_TEXT": "Update team"
+ "TITLE": "Edytuj dane swojego zespołu",
+ "DESC": "Edytuj tytuł i opis swojego zespołu.",
+ "BUTTON_TEXT": "Aktualizuj zespół"
},
"AGENTS": {
- "BUTTON_TEXT": "Update agents in team",
+ "BUTTON_TEXT": "Aktualizuj agentów w zespole",
"TITLE": "Dodaj agentów do zespołu - %{teamName}",
- "DESC": "Add Agents to your newly created team. All the added agents will be notified when a conversation is assigned to this team."
+ "DESC": "Dodaj agentów do swojego nowo utworzonego zespołu. Wszyscy dodani agenci zostaną powiadomieni, gdy rozmowa zostanie przypisana do tego zespołu."
},
"WIZARD": [
{
- "title": "Team details",
+ "title": "Szczegóły zespołu",
"route": "settings_teams_edit",
- "body": "Change name, description and other details."
+ "body": "Zmień nazwę, opis i inne dane."
},
{
- "title": "Edit Agents",
+ "title": "Edytuj agentów",
"route": "settings_teams_edit_members",
- "body": "Edit agents in your team."
+ "body": "Edytuj agentów w zespole."
},
{
- "title": "Finish",
+ "title": "Zakończ",
"route": "settings_teams_edit_finish",
"body": "Wszystko jest gotowe!"
}
@@ -72,14 +72,14 @@
"EMAIL": "EMAIL",
"BUTTON_TEXT": "Dodaj agentów",
"ADD_AGENTS": "Adding Agents to your Team...",
- "SELECT": "select",
+ "SELECT": "wybierz",
"SELECT_ALL": "select all agents",
"SELECTED_COUNT": "%{selected} out of %{total} agents selected."
},
"ADD": {
"TITLE": "Dodaj agentów do zespołu - %{teamName}",
- "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation.",
- "SELECT": "select",
+ "DESC": "Dodaj agentów do swojego nowo utworzonego zespołu. Dzięki temu możesz współpracować jako zespół w rozmowach oraz otrzymywać powiadomienia o nowych wydarzeniach w tej samej rozmowie.",
+ "SELECT": "wybierz",
"SELECT_ALL": "select all agents",
"SELECTED_COUNT": "%{selected} out of %{total} agents selected.",
"BUTTON_TEXT": "Dodaj agentów",
@@ -88,7 +88,7 @@
"FINISH": {
"TITLE": "Your team is ready!",
"MESSAGE": "You can now collaborate as a team on conversations. Happy supporting ",
- "BUTTON_TEXT": "Finish"
+ "BUTTON_TEXT": "Zakończ"
},
"DELETE": {
"BUTTON_TEXT": "Usuń",
@@ -105,7 +105,7 @@
},
"SETTINGS": "Ustawienia",
"FORM": {
- "UPDATE": "Update team",
+ "UPDATE": "Aktualizuj zespół",
"CREATE": "Utwórz zespół",
"NAME": {
"LABEL": "Team name",
diff --git a/app/javascript/dashboard/i18n/locale/pt/campaign.json b/app/javascript/dashboard/i18n/locale/pt/campaign.json
new file mode 100644
index 000000000..24a073a2c
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/pt/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "cancelar",
+ "CREATE_BUTTON_TEXT": "Criar",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Por favor, insira uma URL válida"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Atualização",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Ocorreu um erro, por favor tente novamente"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "SItuação",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Alterar",
+ "DELETE": "excluir"
+ },
+ "STATUS": {
+ "ENABLED": "Ativado",
+ "DISABLED": "Desabilitado"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/pt/chatlist.json b/app/javascript/dashboard/i18n/locale/pt/chatlist.json
index b02a91286..15590aa0b 100644
--- a/app/javascript/dashboard/i18n/locale/pt/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/pt/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pt/contact.json b/app/javascript/dashboard/i18n/locale/pt/contact.json
index ea6232f20..b167c9f50 100644
--- a/app/javascript/dashboard/i18n/locale/pt/contact.json
+++ b/app/javascript/dashboard/i18n/locale/pt/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Labels available in the account",
"REMOVE": "Click on X icon to remove the label",
"ADD": "Click on + icon to add the label",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Update labels",
"UPDATE_ERROR": "Não foi possível atualizar os rótulos, tente novamente."
},
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
- "NO_AVAILABLE_LABELS": "There are no labels added to this conversation."
+ "NO_AVAILABLE_LABELS": "There are no labels added to this conversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
index 5657bc424..b7a59b7b4 100644
--- a/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pt/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Confirgurações",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/pt/index.js b/app/javascript/dashboard/i18n/locale/pt/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/pt/index.js
+++ b/app/javascript/dashboard/i18n/locale/pt/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/pt/report.json b/app/javascript/dashboard/i18n/locale/pt/report.json
index 357928271..94cf1019d 100644
--- a/app/javascript/dashboard/i18n/locale/pt/report.json
+++ b/app/javascript/dashboard/i18n/locale/pt/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Últimos 30 Dias"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json b/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json
new file mode 100644
index 000000000..273032356
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Cancelar",
+ "CREATE_BUTTON_TEXT": "Criar",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Messagem",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Enviado por",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Por favor, insira uma URL válida"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Atualizar",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Ocorreu um erro, por favor tente novamente"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Messagem",
+ "STATUS": "SItuação",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Alterar",
+ "DELETE": "Excluir"
+ },
+ "STATUS": {
+ "ENABLED": "Ativado",
+ "DISABLED": "Desativado"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json b/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json
index b2d27a5ad..10aa664fa 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Recebido por e-mail",
"VIEW_TWEET_IN_TWITTER": "Ver tweet no Twitter",
"REPLY_TO_TWEET": "Responder a este tweet",
- "NO_MESSAGES": "Nova Mensagem"
+ "NO_MESSAGES": "Nova Mensagem",
+ "NO_CONTENT": "Nenhum conteúdo disponível"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json
index 9887f3f12..813542830 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/contact.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/contact.json
@@ -12,7 +12,7 @@
"INITIATED_FROM": "A partir de",
"INITIATED_AT": "Iniciado em",
"IP_ADDRESS": "Endereço IP",
- "NEW_MESSAGE": "New message",
+ "NEW_MESSAGE": "Nova Mensagem",
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "Não há conversas anteriores associadas a este contato.",
"TITLE": "Conversas anteriores"
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Marcadores disponíveis na conta",
"REMOVE": "Clique no ícone X para remover o marcador",
"ADD": "Clique no ícone + para adicionar o marcador",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Atualizar marcadores",
"UPDATE_ERROR": "Não foi possível atualizar os marcadores, tente novamente."
},
"NO_LABELS_TO_ADD": "Não há mais marcadores definidos na conta.",
- "NO_AVAILABLE_LABELS": "Não há marcadores adicionados a esta conversa."
+ "NO_AVAILABLE_LABELS": "Não há marcadores adicionados a esta conversa.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Silenciar Conversa",
"UNMUTE_CONTACT": "Reativar Conversa",
@@ -73,8 +79,8 @@
"PHONE_NUMBER": {
"PLACEHOLDER": "Adicione o número de telefone do contato",
"LABEL": "Número de Telefone",
- "HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]",
- "ERROR": "Phone number should be either empty or of E.164 format"
+ "HELP": "O número de telefone deve ser do formato E.164, por exemplo: +1415555555 [+][código do país][código de área][número de telefone local]",
+ "ERROR": "O número de telefone deve estar vazio ou no formato E.164"
},
"LOCATION": {
"PLACEHOLDER": "Enter the location of the contact",
@@ -108,27 +114,27 @@
"ERROR_MESSAGE": "Ocorreu um erro, por favor tente novamente"
},
"NEW_CONVERSATION": {
- "BUTTON_LABEL": "Start conversation",
+ "BUTTON_LABEL": "Iniciar Conversa",
"TITLE": "Nova conversa",
- "DESC": "Start a new conversation by sending a new message.",
- "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
+ "DESC": "Iniciar uma nova conversa enviando uma nova mensagem.",
+ "NO_INBOX": "Não foi possível encontrar uma caixa de entrada para iniciar uma nova conversa com este contato.",
"FORM": {
"TO": {
- "LABEL": "To"
+ "LABEL": "Para"
},
"INBOX": {
- "LABEL": "Inbox",
- "ERROR": "Select an inbox"
+ "LABEL": "Caixa de Entrada",
+ "ERROR": "Selecione uma caixa de entrada"
},
"MESSAGE": {
"LABEL": "Messagem",
- "PLACEHOLDER": "Write your message here",
- "ERROR": "Message can't be empty"
+ "PLACEHOLDER": "Escreva sua mensagem aqui",
+ "ERROR": "A mensagem não pode estar vazia"
},
- "SUBMIT": "Send message",
+ "SUBMIT": "Enviar mensagem",
"CANCEL": "Cancelar",
- "SUCCESS_MESSAGE": "Message sent!",
- "ERROR_MESSAGE": "Couldn't send! try again"
+ "SUCCESS_MESSAGE": "Mensagem enviada!",
+ "ERROR_MESSAGE": "Não foi possível enviar! Tente novamente"
}
},
"CONTACTS_PAGE": {
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Ver detalhes"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json
index 02a318e43..49c893a3b 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/conversation.json
@@ -58,7 +58,7 @@
"CHANGE_STATUS": "Estado da conversa mudou",
"CHANGE_AGENT": "Responsável da conversa alterado",
"CHANGE_TEAM": "Estado da conversa mudou",
- "FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit",
+ "FILE_SIZE_LIMIT": "O arquivo excede o limite de anexos {MAXIMUM_FILE_UPLOAD_SIZE}",
"SENT_BY": "Enviado por:",
"ASSIGNMENT": {
"SELECT_AGENT": "Selecione Agente",
@@ -85,25 +85,25 @@
},
"ONBOARDING": {
"TITLE": "Olá, 👋. Bem-vindo ao %{installationName}!",
- "DESCRIPTION": "Thanks for signing up. We want you to get the most out of %{installationName}. Here are a few things you can do in %{installationName} to make the experience delightful.",
+ "DESCRIPTION": "Obrigado por se inscrever. Queremos que você aproveite o máximo de %{installationName}. Aqui estão algumas coisas que você consegue fazer no(a) %{installationName} para que tenha uma experiência agradável.",
"READ_LATEST_UPDATES": "Leia as últimas atualizações",
"ALL_CONVERSATION": {
"TITLE": "Todas as suas conversas em um só lugar",
- "DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status."
+ "DESCRIPTION": "Veja todas as conversas dos seus clientes em um único painel. Você pode filtrar as conversas pelo canal de entrada, rótulo e status."
},
"TEAM_MEMBERS": {
"TITLE": "Convidar membros da sua equipe",
- "DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email address to the agent list.",
+ "DESCRIPTION": "Já que você está se preparando para conversar com seu cliente, traga seus colegas para ajudá-lo. Você pode convidar seus colegas de equipe adicionando o endereço de e-mail deles na lista de agentes.",
"NEW_LINK": "Clique aqui para convidar um membro da equipe"
},
"INBOXES": {
"TITLE": "Conectar caixas de entrada",
- "DESCRIPTION": "Connect various channels through which your customers would be talking to you. It can be a website live-chat, your Facebook or Twitter page or even your WhatsApp number.",
+ "DESCRIPTION": "Conecte vários canais através dos quais seus clientes estariam conversando com você. Podendo ser a partir de um chat ao vivo no seu website, sua página do Facebook ou Twitter ou até mesmo seu número do WhatsApp.",
"NEW_LINK": "Clique aqui para criar uma caixa de entrada"
},
"LABELS": {
"TITLE": "Organizar conversas com marcadores",
- "DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
+ "DESCRIPTION": "Etiquetas fornecem uma forma mais fácil de organizar a sua conversa. Criar algumas estiquetas como #solicitação-suporte, #fatura-assunto etc., assim você poderá futuramente utiliza-las em uma conversa posteriormente.",
"NEW_LINK": "Clique aqui para criar marcadores"
}
},
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
index 19e620464..d2696a4cb 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/inboxMgmt.json
@@ -194,7 +194,7 @@
"TITLE": "Sua caixa de entrada está pronta!",
"MESSAGE": "Agora você ja pode oferecer uma excelente experiência no atendimento de seus clientes através do seu novo Canal ",
"BUTTON_TEXT": "Leva-me lá",
- "MORE_SETTINGS": "More settings",
+ "MORE_SETTINGS": "Mais configurações",
"WEBSITE_SUCCESS": "Você concluiu a criação de um canal de site. Copie o código mostrado abaixo e cole-o no seu site. Na próxima vez que um cliente usar o bate-papo ao vivo, a conversa aparecerá automaticamente na sua caixa de entrada."
},
"REAUTH": "Reautorizar",
@@ -227,6 +227,7 @@
"SETTINGS": "Configurações",
"COLLABORATORS": "Colaboradores",
"CONFIGURATION": "Configuração",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Horário de funcionamento"
},
@@ -279,8 +280,8 @@
"TIMEZONE_LABEL": "Selecionar fuso horário",
"UPDATE": "Atualizar configurações do horário comercial",
"TOGGLE_AVAILABILITY": "Enable business availability for this inbox",
- "UNAVAILABLE_MESSAGE_LABEL": "Unavailable message for vistors",
- "UNAVAILABLE_MESSAGE_DEFAULT": "We are unavailable at the moment. Leave a message we will respond once we are back.",
+ "UNAVAILABLE_MESSAGE_LABEL": "Mensagem indisponível para vistores",
+ "UNAVAILABLE_MESSAGE_DEFAULT": "Nós estamos indisponíveis no momento. Deixe uma mensagem a ser respondida assim que voltarmos.",
"TOGGLE_HELP": "Enabling business availability will show the available hours on live chat widget even if all the agents are offline. Outside available hours vistors can be warned with a message and a pre-chat form.",
"DAY": {
"ENABLE": "Permitir a disponibilidade para este dia",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/index.js b/app/javascript/dashboard/i18n/locale/pt_BR/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/index.js
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/report.json b/app/javascript/dashboard/i18n/locale/pt_BR/report.json
index a63e2dd52..878b59eff 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/report.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Últimos 30 dias"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json
index c19bb22d8..11b6e066a 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/settings.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/settings.json
@@ -3,7 +3,7 @@
"LINK": "Configurações do Perfil",
"TITLE": "Configurações do Perfil",
"BTN_TEXT": "Atualizar o Perfil",
- "UPDATE_SUCCESS": "Your profile has been updated successfully",
+ "UPDATE_SUCCESS": "Seu perfil foi atualizado com sucesso",
"PASSWORD_UPDATE_SUCCESS": "A sua senha foi alterada com sucesso",
"AFTER_EMAIL_CHANGED": "Seu perfil foi atualizado com sucesso. Faça login novamente, pois suas credenciais de login foram alteradas",
"FORM": {
@@ -19,7 +19,7 @@
"PASSWORD_SECTION": {
"TITLE": "Senha",
"NOTE": "A atualização da sua senha redefiniria o seu login em vários dispositivos.",
- "BTN_TEXT": "Change password"
+ "BTN_TEXT": "Mudar Senha"
},
"ACCESS_TOKEN": {
"TITLE": "Token de acesso",
diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/teamsSettings.json b/app/javascript/dashboard/i18n/locale/pt_BR/teamsSettings.json
index 780f1195b..d0f91f7b0 100644
--- a/app/javascript/dashboard/i18n/locale/pt_BR/teamsSettings.json
+++ b/app/javascript/dashboard/i18n/locale/pt_BR/teamsSettings.json
@@ -1,20 +1,20 @@
{
"TEAMS_SETTINGS": {
- "NEW_TEAM": "Criar novo departamento",
+ "NEW_TEAM": "Criar nova equipe",
"HEADER": "Times",
"SIDEBAR_TXT": "
Departamentos
As equipes permitem que você organize seus agentes em grupos baseados em suas responsabilidades. Um usuário pode fazer parte de várias equipes. Você pode atribuir conversas a uma equipe quando você estiver trabalhando colaborativamente.
",
"LIST": {
"404": "Não existem agentes associados a esta conta.",
- "EDIT_TEAM": "Editar Departamento"
+ "EDIT_TEAM": "Editar equipe"
},
"CREATE_FLOW": {
"CREATE": {
- "TITLE": "Criar novo departamento",
+ "TITLE": "Criar nova equipe",
"DESC": "Adicione um título e uma descrição à sua nova equipe."
},
"AGENTS": {
"BUTTON_TEXT": "Adicionar agente ao seu time",
- "TITLE": "Adicionar agentes ao departamento - %{teamName}",
+ "TITLE": "Adicionar agentes a equipe: %{teamName}",
"DESC": "Adicione agentes à sua equipe recém-criada. Isso permite que você colabore como uma equipe em conversas, seja notificado sobre novos eventos na mesma conversa."
},
"WIZARD": [
@@ -25,41 +25,41 @@
},
{
"title": "Adicionar Agentes",
- "route": "settings_teams_add_agents",
- "body": "Adicionar agentes ao departamento."
+ "route": "ajustes_equipes_adicionar_agentes",
+ "body": "Adicionar agentes a equipe."
},
{
"title": "Finalizar",
- "route": "settings_teams_finish",
+ "route": "ajustes_equipes_finalizar",
"body": "Está tudo pronto para começar!"
}
]
},
"EDIT_FLOW": {
"CREATE": {
- "TITLE": "Editar detalhes de seu departamento",
- "DESC": "Adicione um título e uma descrição ao seu novo departamento",
- "BUTTON_TEXT": "Atualizar departamento"
+ "TITLE": "Editar detalhes da sua equipe",
+ "DESC": "Edite o título e a descrição da sua equipe.",
+ "BUTTON_TEXT": "Atualizar equipe"
},
"AGENTS": {
"BUTTON_TEXT": "Atualizar agentes no departamento",
- "TITLE": "Adicionar agentes ao departamento - %{teamName}",
+ "TITLE": "Adicionar agentes a equipe: %{teamName}",
"DESC": "Adicionar agentes à sua equipe recém-criada. Todos os agentes adicionados serão notificados quando uma conversa for atribuída a esta equipe."
},
"WIZARD": [
{
"title": "Detalhes do departamento",
- "route": "settings_teams_edit",
+ "route": "ajustes_equipes_editar",
"body": "Alterar nome, descrição e outros detalhes."
},
{
"title": "Editar agente",
- "route": "settings_teams_edit_members",
+ "route": "ajustes_equipes_editar_membros",
"body": "Gerenciar agentes de seu departamento"
},
{
"title": "Finalizar",
- "route": "settings_teams_edit_finish",
+ "route": "ajustes_equipes_editar_finalizar",
"body": "Está tudo pronto para começar!"
}
]
@@ -77,7 +77,7 @@
"SELECTED_COUNT": "%{selected} de %{total} agentes selecionados."
},
"ADD": {
- "TITLE": "Adicionar agentes ao departamento - %{teamName}",
+ "TITLE": "Adicionar agentes a equipe: %{teamName}",
"DESC": "Adicione agentes à sua equipe recém-criada. Isso permite que você colabore como uma equipe em conversas, seja notificado sobre novos eventos na mesma conversa.",
"SELECT": "Selecionar",
"SELECT_ALL": "Selecionar todos os agentes",
@@ -105,7 +105,7 @@
},
"SETTINGS": "Confirgurações",
"FORM": {
- "UPDATE": "Atualizar departamento",
+ "UPDATE": "Atualizar equipe",
"CREATE": "Criar novo departamento",
"NAME": {
"LABEL": "Nome do departamento",
diff --git a/app/javascript/dashboard/i18n/locale/ro/campaign.json b/app/javascript/dashboard/i18n/locale/ro/campaign.json
new file mode 100644
index 000000000..3498e39b6
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ro/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Renunță",
+ "CREATE_BUTTON_TEXT": "Creeaza",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Te rog introdu un URL valid"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Actualizare",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "A apărut o eroare, încercați din nou"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Editare",
+ "DELETE": "Şterge"
+ },
+ "STATUS": {
+ "ENABLED": "Activat",
+ "DISABLED": "Dezactivat"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/ro/chatlist.json b/app/javascript/dashboard/i18n/locale/ro/chatlist.json
index 80130cb08..f267e4275 100644
--- a/app/javascript/dashboard/i18n/locale/ro/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/ro/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ro/contact.json b/app/javascript/dashboard/i18n/locale/ro/contact.json
index 6008dc9ef..95c92cc76 100644
--- a/app/javascript/dashboard/i18n/locale/ro/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ro/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Etichete disponibile în cont",
"REMOVE": "Faceți clic pe pictograma X pentru a elimina eticheta",
"ADD": "Faceți clic pe + pictogramă pentru a adăuga eticheta",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Actualizare etichete",
"UPDATE_ERROR": "Nu s-au putut actualiza etichetele, încercați din nou."
},
"NO_LABELS_TO_ADD": "Nu mai sunt etichete definite în cont.",
- "NO_AVAILABLE_LABELS": "Nu există etichete adăugate la această conversație."
+ "NO_AVAILABLE_LABELS": "Nu există etichete adăugate la această conversație.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
index e6ddf8b30..0a6ce34fb 100644
--- a/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ro/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Setări",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/ro/index.js b/app/javascript/dashboard/i18n/locale/ro/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/ro/index.js
+++ b/app/javascript/dashboard/i18n/locale/ro/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/ro/report.json b/app/javascript/dashboard/i18n/locale/ro/report.json
index 9b23d543b..e28b44fbd 100644
--- a/app/javascript/dashboard/i18n/locale/ro/report.json
+++ b/app/javascript/dashboard/i18n/locale/ro/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Ultimele 30 zile"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/ru/campaign.json b/app/javascript/dashboard/i18n/locale/ru/campaign.json
new file mode 100644
index 000000000..f355be5bb
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ru/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Кампании",
+ "SIDEBAR_TXT": "Активные сообщения позволяют клиенту отправлять исходящие сообщения своим контактам, что повлечет за собой более активное общение. Нажмите на Добавить кампанию для создания новой кампании. Вы также можете редактировать или удалять существующую кампанию, нажав на кнопку Изменить или Удалить.",
+ "HEADER_BTN_TXT": "Создать Кампанию",
+ "ADD": {
+ "TITLE": "Создать кампанию",
+ "DESC": "Активные сообщения позволяют клиенту отправлять исходящие сообщения своим контактам, что повлечет за собой более активное общение.",
+ "CANCEL_BUTTON_TEXT": "Отменить",
+ "CREATE_BUTTON_TEXT": "Создать",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Название",
+ "PLACEHOLDER": "Пожалуйста, введите название кампании",
+ "ERROR": "Необходимо указать название"
+ },
+ "MESSAGE": {
+ "LABEL": "Сообщение",
+ "PLACEHOLDER": "Пожалуйста, введите сообщение кампании",
+ "ERROR": "Необходимо ввести сообщение"
+ },
+ "SENT_BY": {
+ "LABEL": "Отправитель",
+ "PLACEHOLDER": "Пожалуйста, выберите содержание кампании",
+ "ERROR": "Необходимо указать отправителя"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Пожалуйста, введите правильный URL",
+ "ERROR": "Пожалуйста, введите правильный URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Время на страницах (в секундах)",
+ "PLACEHOLDER": "Пожалуйста, введите время",
+ "ERROR": "Укажите время на странице"
+ },
+ "ENABLED": "Запустить кампанию",
+ "SUBMIT": "Добавить кампанию"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Кампания успешно создана",
+ "ERROR_MESSAGE": "Произошла ошибка. Пожалуйста, попробуйте еще раз."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Редактировать кампанию",
+ "UPDATE_BUTTON_TEXT": "Обновить",
+ "API": {
+ "SUCCESS_MESSAGE": "Кампания успешно обновлена",
+ "ERROR_MESSAGE": "Произошла ошибка, попробуйте еще раз"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Загрузка кампаний...",
+ "404": "Нет кампаний, связанных с этим каналом.",
+ "TABLE_HEADER": {
+ "TITLE": "Название",
+ "MESSAGE": "Сообщение",
+ "STATUS": "Статус",
+ "SENDER": "Отправитель",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Время (секунды)",
+ "CREATED_AT": "Дата создания"
+ },
+ "BUTTONS": {
+ "ADD": "Добавить",
+ "EDIT": "Редактировать",
+ "DELETE": "Удалить"
+ },
+ "STATUS": {
+ "ENABLED": "Включено",
+ "DISABLED": "Выключено"
+ },
+ "SENDER": {
+ "BOT": "Бот"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/ru/chatlist.json b/app/javascript/dashboard/i18n/locale/ru/chatlist.json
index b1c70411a..79a290c32 100644
--- a/app/javascript/dashboard/i18n/locale/ru/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/ru/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Получено по email",
"VIEW_TWEET_IN_TWITTER": "Просмотреть твит в Twitter",
"REPLY_TO_TWEET": "Ответить на этот твит",
- "NO_MESSAGES": "Нет сообщений"
+ "NO_MESSAGES": "Нет сообщений",
+ "NO_CONTENT": "Содержимое отсутствует"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ru/contact.json b/app/javascript/dashboard/i18n/locale/ru/contact.json
index e8176f967..c85c67794 100644
--- a/app/javascript/dashboard/i18n/locale/ru/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ru/contact.json
@@ -12,7 +12,7 @@
"INITIATED_FROM": "Начат из",
"INITIATED_AT": "Начат в",
"IP_ADDRESS": "IP адрес",
- "NEW_MESSAGE": "New message",
+ "NEW_MESSAGE": "Новое сообщение",
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "Нет предыдущих диалогов, связанных с этим контактом.",
"TITLE": "Предыдущие диалоги"
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Все категории",
"REMOVE": "Нажмите на иконку X для удаления категории",
"ADD": "Нажмите на значок +, чтобы добавить категорию",
+ "ADD_BUTTON": "Добавить метки",
"UPDATE_BUTTON": "Изменить категории",
"UPDATE_ERROR": "Не удалось обновить категории, попробуйте снова."
},
"NO_LABELS_TO_ADD": "У вас больше нет категорий.",
- "NO_AVAILABLE_LABELS": "У диалога больше нет категорий."
+ "NO_AVAILABLE_LABELS": "У диалога больше нет категорий.",
+ "LABEL_SELECT": {
+ "TITLE": "Добавить метки",
+ "PLACEHOLDER": "Поиск меток",
+ "NO_RESULT": "Метки не найдены"
+ }
},
"MUTE_CONTACT": "Заглушить диалог",
"UNMUTE_CONTACT": "Включить звук диалога",
@@ -73,8 +79,8 @@
"PHONE_NUMBER": {
"PLACEHOLDER": "Введите номер телефона контакта",
"LABEL": "Номер телефона",
- "HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]",
- "ERROR": "Phone number should be either empty or of E.164 format"
+ "HELP": "Номер телефона должен быть в формате E.164, например: +1415555555 [+] [код страны][код города] [локальный номер телефона]",
+ "ERROR": "Номер телефона должен быть пустым или в формате E.164"
},
"LOCATION": {
"PLACEHOLDER": "Введите местоположение контакта",
@@ -108,27 +114,27 @@
"ERROR_MESSAGE": "Произошла ошибка, попробуйте еще раз"
},
"NEW_CONVERSATION": {
- "BUTTON_LABEL": "Start conversation",
- "TITLE": "New conversation",
- "DESC": "Start a new conversation by sending a new message.",
- "NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
+ "BUTTON_LABEL": "Начать диалог",
+ "TITLE": "Новый диалог",
+ "DESC": "Начните новую беседу, отправив новое сообщение.",
+ "NO_INBOX": "Не удалось найти электронную почту для начала нового разговора с этим контактом.",
"FORM": {
"TO": {
- "LABEL": "To"
+ "LABEL": "Кому"
},
"INBOX": {
- "LABEL": "Inbox",
- "ERROR": "Select an inbox"
+ "LABEL": "Электронная почта",
+ "ERROR": "Выберите электронную почту"
},
"MESSAGE": {
"LABEL": "Сообщение",
- "PLACEHOLDER": "Write your message here",
- "ERROR": "Message can't be empty"
+ "PLACEHOLDER": "Напишите здесь ваше сообщение",
+ "ERROR": "Сообщение не может быть пустым"
},
- "SUBMIT": "Send message",
+ "SUBMIT": "Отправить сообщение",
"CANCEL": "Отменить",
- "SUCCESS_MESSAGE": "Message sent!",
- "ERROR_MESSAGE": "Couldn't send! try again"
+ "SUCCESS_MESSAGE": "Сообщение отправлено!",
+ "ERROR_MESSAGE": "Не удалось отправить! Попробуйте еще раз"
}
},
"CONTACTS_PAGE": {
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Просмотреть подробности"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Заметки"
+ },
+ "ADD": {
+ "BUTTON": "Добавить",
+ "PLACEHOLDER": "Добавить заметку",
+ "TITLE": "Shift + Enter для создания заметки"
+ },
+ "FOOTER": {
+ "BUTTON": "Показать все заметки"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ru/conversation.json b/app/javascript/dashboard/i18n/locale/ru/conversation.json
index 9706585c3..4fd56f744 100644
--- a/app/javascript/dashboard/i18n/locale/ru/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/ru/conversation.json
@@ -11,7 +11,7 @@
"TITLE": "Поиск сообщений",
"LOADING_MESSAGE": "Сохранение данных...",
"PLACEHOLDER": "Введите любой текст для поиска сообщений",
- "NO_MATCHING_RESULTS": "No results found."
+ "NO_MATCHING_RESULTS": "Результаты не найдены."
},
"UNREAD_MESSAGES": "Непрочитанные сообщения",
"UNREAD_MESSAGE": "Непрочитанное сообщение",
@@ -20,7 +20,7 @@
"LOADING_CONVERSATIONS": "Загрузка диалогов",
"CANNOT_REPLY": "Вы не можете ответить из-за",
"24_HOURS_WINDOW": "Ограничение на 24 часа",
- "TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
+ "TWILIO_WHATSAPP_CAN_REPLY": "Вы можете ответить в этой беседе только с помощью шаблона сообщения",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "Ограничение на 24 часа",
"LAST_INCOMING_TWEET": "Вы отвечаете на последний входящий твит",
"REPLYING_TO": "Вы отвечаете на:",
@@ -37,7 +37,7 @@
"DETAILS": "подробности"
},
"RESOLVE_DROPDOWN": {
- "OPEN_BOT": "Open with bot"
+ "OPEN_BOT": "Открыть с помощью бота"
},
"FOOTER": {
"MSG_INPUT": "Shift + enter чтобы начать новую строку. Начните с '/', чтобы выбрать шаблонный ответ.",
@@ -57,8 +57,8 @@
"VISIBLE_TO_AGENTS": "Приватная заметка: видна только вам и вашей команде",
"CHANGE_STATUS": "Статус разговора изменен",
"CHANGE_AGENT": "Назначенный оператор изменен",
- "CHANGE_TEAM": "Conversation team changed",
- "FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit",
+ "CHANGE_TEAM": "Команда назначенная в беседу изменена",
+ "FILE_SIZE_LIMIT": "Превышен размер загружаемого файла - {MAXIMUM_FILE_UPLOAD_SIZE}",
"SENT_BY": "Отправитель:",
"ASSIGNMENT": {
"SELECT_AGENT": "Выбрать Агента",
@@ -89,22 +89,22 @@
"READ_LATEST_UPDATES": "Читайте о наших последних обновлениях",
"ALL_CONVERSATION": {
"TITLE": "Все ваши диалоги в одном месте",
- "DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status."
+ "DESCRIPTION": "Посмотреть все разговоры с клиентами в одной панели управления. Вы можете отфильтровать разговоры по входящему каналу, метке и статусу."
},
"TEAM_MEMBERS": {
- "TITLE": "Invite your team members",
- "DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email address to the agent list.",
- "NEW_LINK": "Click here to invite a team member"
+ "TITLE": "Пригласить членов вашей команды",
+ "DESCRIPTION": "Так как вы готовы общаться с клиентом, пригласите в команду своих товарищей, чтобы помочь вам. Вы можете пригласить своих коллег по команде, добавив их адреса электронной почты в список агентов.",
+ "NEW_LINK": "Нажмите здесь, чтобы пригласить члена команды"
},
"INBOXES": {
- "TITLE": "Connect Inboxes",
- "DESCRIPTION": "Connect various channels through which your customers would be talking to you. It can be a website live-chat, your Facebook or Twitter page or even your WhatsApp number.",
- "NEW_LINK": "Click here to create an inbox"
+ "TITLE": "Подключить входящие",
+ "DESCRIPTION": "Подключите различные каналы, с помощью которых ваши клиенты будут общаться с вами. Это может быть веб-чат в live-чате, Facebook или Twitter, или даже ваш номер WhatsApp.",
+ "NEW_LINK": "Нажмите здесь, чтобы создать входящий канал"
},
"LABELS": {
- "TITLE": "Organize conversations with labels",
- "DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
- "NEW_LINK": "Click here to create tags"
+ "TITLE": "Сгруппировать беседы с помощью меток",
+ "DESCRIPTION": "Метки дают более простой способ классифицировать разговор. Создайте несколько меток, например #support-enquiry, #billing-question и т.д., чтобы позже использовать их в беседе.",
+ "NEW_LINK": "Нажмите здесь, чтобы создать метки"
}
},
"CONVERSATION_SIDEBAR": {
@@ -112,7 +112,7 @@
"ASSIGNEE_LABEL": "Назначенный агент",
"TEAM_LABEL": "Назначенная команда",
"SELECT": {
- "PLACEHOLDER": "None"
+ "PLACEHOLDER": "Ничего"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ru/generalSettings.json b/app/javascript/dashboard/i18n/locale/ru/generalSettings.json
index ecf2f1f33..db6905092 100644
--- a/app/javascript/dashboard/i18n/locale/ru/generalSettings.json
+++ b/app/javascript/dashboard/i18n/locale/ru/generalSettings.json
@@ -54,10 +54,10 @@
},
"NOTIFICATIONS_PAGE": {
"HEADER": "Уведомления",
- "MARK_ALL_DONE": "Mark All Done",
+ "MARK_ALL_DONE": "Отметить все прочитанными",
"LIST": {
- "LOADING_MESSAGE": "Loading notifications...",
- "404": "No Notifications",
+ "LOADING_MESSAGE": "Загрузка уведомлений...",
+ "404": "Уведомления отсутствуют",
"TABLE_HEADER": [
"Имя",
"Номер телефона",
@@ -66,8 +66,8 @@
]
},
"TYPE_LABEL": {
- "conversation_creation": "New conversation",
- "conversation_assignment": "Conversation Assigned",
+ "conversation_creation": "Новая беседа",
+ "conversation_assignment": "Беседа назначена",
"assigned_conversation_new_message": "Новое сообщение",
"conversation_mention": "Упоминание"
}
diff --git a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
index 2a6e9b1dc..4a96cb928 100644
--- a/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ru/inboxMgmt.json
@@ -39,7 +39,7 @@
},
"TWITTER": {
"HELP": "Чтобы добавить свой Twitter профиль в качестве источника, вам нужно авторизоваться при помощи входа через Twitter ",
- "ERROR_MESSAGE": "There was an error connecting to Twitter, please try again"
+ "ERROR_MESSAGE": "Произошла ошибка при подключении к Twitter, попробуйте еще раз"
},
"WEBSITE_CHANNEL": {
"TITLE": "Сайт",
@@ -194,7 +194,7 @@
"TITLE": "Истоник готов!",
"MESSAGE": "Теперь вы можете взаимодействовать с вашими клиентами через ваш новый канал. Удачной поддержки ",
"BUTTON_TEXT": "Перейти",
- "MORE_SETTINGS": "More settings",
+ "MORE_SETTINGS": "Больше параметров",
"WEBSITE_SUCCESS": "Вы успешно создали источник-сайт. Скопируйте указанный ниже код и вставьте его на ваш сайт. В следующий раз, когда клиент напишет в чат, диалог автоматически появится здесь."
},
"REAUTH": "Войти заново",
@@ -227,8 +227,9 @@
"SETTINGS": "Настройки",
"COLLABORATORS": "Соавторы",
"CONFIGURATION": "Настройки",
+ "CAMPAIGN": "Кампании",
"PRE_CHAT_FORM": "Форма, показываемая перед стартом диалога",
- "BUSINESS_HOURS": "Business Hours"
+ "BUSINESS_HOURS": "Время работы"
},
"SETTINGS": "Настройки",
"FEATURES": {
@@ -256,9 +257,9 @@
"MESSAGE_ERROR": "Произошла ошибка, попробуйте еще раз"
},
"PRE_CHAT_FORM": {
- "DESCRIPTION": "Pre chat forms enable you to capture user information before they start conversation with you.",
+ "DESCRIPTION": "Предварительные формы позволяют получить информацию о пользователе, прежде чем они начнут разговор.",
"ENABLE": {
- "LABEL": "Enable pre chat form",
+ "LABEL": "Включить форму сбора предварительной информации",
"OPTIONS": {
"ENABLED": "Да",
"DISABLED": "Нет"
@@ -266,22 +267,22 @@
},
"PRE_CHAT_MESSAGE": {
"LABEL": "Сообщение для формы, показываемой перед стартом диалога",
- "PLACEHOLDER": "This message would be visible to the users along with the form"
+ "PLACEHOLDER": "Это сообщение будет отображаться вместе с формой для пользователя"
},
"REQUIRE_EMAIL": {
- "LABEL": "Visitors should provide their name and email address before starting the chat"
+ "LABEL": "Посетители должны указать свое имя и адрес электронной почты перед началом общения"
}
},
"BUSINESS_HOURS": {
"TITLE": "Настройте ваши рабочие часы",
"SUBTITLE": "Настройте ваши рабочие часы для общения через виджет на сайте",
"WEEKLY_TITLE": "Укажите ваши рабочие часы",
- "TIMEZONE_LABEL": "Select timezone",
- "UPDATE": "Update business hours settings",
- "TOGGLE_AVAILABILITY": "Enable business availability for this inbox",
- "UNAVAILABLE_MESSAGE_LABEL": "Unavailable message for vistors",
- "UNAVAILABLE_MESSAGE_DEFAULT": "We are unavailable at the moment. Leave a message we will respond once we are back.",
- "TOGGLE_HELP": "Enabling business availability will show the available hours on live chat widget even if all the agents are offline. Outside available hours vistors can be warned with a message and a pre-chat form.",
+ "TIMEZONE_LABEL": "Выберите часовой пояс",
+ "UPDATE": "Обновить настройки часов работы",
+ "TOGGLE_AVAILABILITY": "Включить доступность бизнеса для этого входящего канала",
+ "UNAVAILABLE_MESSAGE_LABEL": "Сообщение для посетителей о недоступности",
+ "UNAVAILABLE_MESSAGE_DEFAULT": "В данный момент мы недоступны. Оставьте сообщение, мы вам ответим, как только будем на связи.",
+ "TOGGLE_HELP": "Включение доступности для бизнеса покажет часы работы в виджете онлайн общения, даже если все менеджеры не в сети. Вне доступных часов работы - посетители могут быть предупреждены сообщением и формой предварительного чата.",
"DAY": {
"ENABLE": "Я работаю в этот день",
"UNAVAILABLE": "Я не работаю в этот день",
diff --git a/app/javascript/dashboard/i18n/locale/ru/index.js b/app/javascript/dashboard/i18n/locale/ru/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/ru/index.js
+++ b/app/javascript/dashboard/i18n/locale/ru/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/ru/report.json b/app/javascript/dashboard/i18n/locale/ru/report.json
index c349e11b8..9ab726c09 100644
--- a/app/javascript/dashboard/i18n/locale/ru/report.json
+++ b/app/javascript/dashboard/i18n/locale/ru/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Последние 30 дней"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/ru/settings.json b/app/javascript/dashboard/i18n/locale/ru/settings.json
index b9399259a..0c9535b72 100644
--- a/app/javascript/dashboard/i18n/locale/ru/settings.json
+++ b/app/javascript/dashboard/i18n/locale/ru/settings.json
@@ -3,7 +3,7 @@
"LINK": "Настройки профиля",
"TITLE": "Настройки профиля",
"BTN_TEXT": "Обновить профиль",
- "UPDATE_SUCCESS": "Your profile has been updated successfully",
+ "UPDATE_SUCCESS": "Ваши данные успешно обновлены",
"PASSWORD_UPDATE_SUCCESS": "Ваш пароль успешно изменен",
"AFTER_EMAIL_CHANGED": "Ваш профиль был успешно обновлен, пожалуйста, войдите снова, так как ваши учетные данные были изменены",
"FORM": {
@@ -19,7 +19,7 @@
"PASSWORD_SECTION": {
"TITLE": "Пароль",
"NOTE": "Обновление пароля сбросит вашу авторизацию на всех устройствах.",
- "BTN_TEXT": "Change password"
+ "BTN_TEXT": "Изменить пароль"
},
"ACCESS_TOKEN": {
"TITLE": "Токен доступа",
@@ -27,8 +27,8 @@
},
"AUDIO_NOTIFICATIONS_SECTION": {
"TITLE": "Звуковые уведомления",
- "NOTE": "Enable audio notifications in dashboard for new messages and conversations.",
- "ENABLE_AUDIO": "Play audio notification when a new conversation is created or new messages arrives"
+ "NOTE": "Включить звуковые уведомления в панели управления для новых сообщений и разговоров.",
+ "ENABLE_AUDIO": "Воспроизводить звуковое уведомление при создании новой беседы или получении новых сообщений"
},
"EMAIL_NOTIFICATIONS_SECTION": {
"TITLE": "Email Уведомления",
@@ -47,7 +47,7 @@
"NOTE": "Редактируйте настройки push-уведомлений здесь",
"CONVERSATION_ASSIGNMENT": "Отправлять push уведомление при назначении мне диалога",
"CONVERSATION_CREATION": "Отправлять push уведомление, когда новый диалог создан",
- "CONVERSATION_MENTION": "Send push notifications when you are mentioned in a conversation",
+ "CONVERSATION_MENTION": "Отправлять уведомления при упоминании в разговоре",
"ASSIGNED_CONVERSATION_NEW_MESSAGE": "Отправлять push уведомления при создании нового сообщения в назначенном диалоге",
"HAS_ENABLED_PUSH": "Вы включили push уведомления для этого браузера.",
"REQUEST_PUSH": "Включить push-уведомления"
diff --git a/app/javascript/dashboard/i18n/locale/ru/teamsSettings.json b/app/javascript/dashboard/i18n/locale/ru/teamsSettings.json
index 32bc187b6..fa7236b31 100644
--- a/app/javascript/dashboard/i18n/locale/ru/teamsSettings.json
+++ b/app/javascript/dashboard/i18n/locale/ru/teamsSettings.json
@@ -1,35 +1,35 @@
{
"TEAMS_SETTINGS": {
- "NEW_TEAM": "Create new team",
+ "NEW_TEAM": "Создать новую команду",
"HEADER": "Команды",
- "SIDEBAR_TXT": "
Teams
Teams let you organize your agents into groups based on their responsibilities. A user can be part of multiple teams. You can assign conversations to a team when you are working collaboratively.
",
+ "SIDEBAR_TXT": "
Команды
Команды позволяют вам организовывать своих операторов в группы в зависимости от их обязанностей. Пользователь может быть частью нескольких команд. Вы можете назначить разговоры команде, когда вы работаете совместно.
",
"LIST": {
- "404": "There are no teams created on this account.",
- "EDIT_TEAM": "Edit team"
+ "404": "В этом аккаунте нет ни одной команды.",
+ "EDIT_TEAM": "Редактировать команду"
},
"CREATE_FLOW": {
"CREATE": {
- "TITLE": "Create a new team",
- "DESC": "Add a title and description to your new team."
+ "TITLE": "Создать новую команду",
+ "DESC": "Добавьте название и описание в вашу новую команду."
},
"AGENTS": {
- "BUTTON_TEXT": "Add agents to team",
- "TITLE": "Add agents to team - %{teamName}",
- "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation."
+ "BUTTON_TEXT": "Добавить операторов в команду",
+ "TITLE": "Добавить операторов в команду - %{teamName}",
+ "DESC": "Добавьте операторов в вашу только что созданную команду. Это позволит вам сотрудничать как команде при разговорах, получать уведомления о новых событиях в том же разговоре."
},
"WIZARD": [
{
"title": "Создать",
"route": "settings_teams_new",
- "body": "Create a new team of agents."
+ "body": "Создайте новую команду операторов."
},
{
"title": "Добавить операторов",
"route": "settings_teams_add_agents",
- "body": "Add agents to the team."
+ "body": "Добавить операторов в команду."
},
{
- "title": "Finish",
+ "title": "Завершить",
"route": "settings_teams_finish",
"body": "Все готово!"
}
@@ -37,88 +37,88 @@
},
"EDIT_FLOW": {
"CREATE": {
- "TITLE": "Edit your team details",
- "DESC": "Edit title and description to your team.",
- "BUTTON_TEXT": "Update team"
+ "TITLE": "Редактировать данные вашей команды",
+ "DESC": "Редактировать название и описание для вашей команды.",
+ "BUTTON_TEXT": "Обновить команду"
},
"AGENTS": {
- "BUTTON_TEXT": "Update agents in team",
- "TITLE": "Add agents to team - %{teamName}",
- "DESC": "Add Agents to your newly created team. All the added agents will be notified when a conversation is assigned to this team."
+ "BUTTON_TEXT": "Обновить операторов в команде",
+ "TITLE": "Добавить операторов в команду - %{teamName}",
+ "DESC": "Добавьте операторов в вашу только что созданную команду. Все добавленные операторы будут уведомлены, когда беседа будет назначена этой команде."
},
"WIZARD": [
{
- "title": "Team details",
+ "title": "Информация о команде",
"route": "settings_teams_edit",
- "body": "Change name, description and other details."
+ "body": "Изменить имя, описание и другие сведения."
},
{
- "title": "Edit Agents",
+ "title": "Редактировать операторов",
"route": "settings_teams_edit_members",
- "body": "Edit agents in your team."
+ "body": "Управляйте операторами вашей команды."
},
{
- "title": "Finish",
+ "title": "Завершить",
"route": "settings_teams_edit_finish",
"body": "Все готово!"
}
]
},
"TEAM_FORM": {
- "ERROR_MESSAGE": "Couldn't save the team details. Try again."
+ "ERROR_MESSAGE": "Не удалось сохранить информацию о команде. Попробуйте еще раз."
},
"AGENTS": {
- "AGENT": "AGENT",
+ "AGENT": "Оператор",
"EMAIL": "Email",
"BUTTON_TEXT": "Добавить операторов",
- "ADD_AGENTS": "Adding Agents to your Team...",
- "SELECT": "select",
- "SELECT_ALL": "select all agents",
- "SELECTED_COUNT": "%{selected} out of %{total} agents selected."
+ "ADD_AGENTS": "Добавление операторов в вашу команду...",
+ "SELECT": "выбрать",
+ "SELECT_ALL": "выбрать всех операторов",
+ "SELECTED_COUNT": "Выбрано %{selected} из %{total} операторов."
},
"ADD": {
- "TITLE": "Add agents to team - %{teamName}",
- "DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation.",
- "SELECT": "select",
- "SELECT_ALL": "select all agents",
- "SELECTED_COUNT": "%{selected} out of %{total} agents selected.",
+ "TITLE": "Добавить операторов в команду - %{teamName}",
+ "DESC": "Добавьте операторов в вашу только что созданную команду. Это позволит вам сотрудничать как команде при разговорах, получать уведомления о новых событиях в том же разговоре.",
+ "SELECT": "выбрать",
+ "SELECT_ALL": "выбрать всех операторов",
+ "SELECTED_COUNT": "Выбрано %{selected} из %{total} операторов.",
"BUTTON_TEXT": "Добавить операторов",
- "AGENT_VALIDATION_ERROR": "Select atleaset one agent."
+ "AGENT_VALIDATION_ERROR": "Выберите хотя бы одного оператора."
},
"FINISH": {
- "TITLE": "Your team is ready!",
- "MESSAGE": "You can now collaborate as a team on conversations. Happy supporting ",
- "BUTTON_TEXT": "Finish"
+ "TITLE": "Ваша команда готова!",
+ "MESSAGE": "Теперь вы можете сотрудничать как команда в беседах. Удачной вам поддержки",
+ "BUTTON_TEXT": "Завершить"
},
"DELETE": {
"BUTTON_TEXT": "Удалить",
"API": {
- "SUCCESS_MESSAGE": "Team deleted successfully.",
- "ERROR_MESSAGE": "Couldn't delete the team. Try again."
+ "SUCCESS_MESSAGE": "Команда успешно удалена.",
+ "ERROR_MESSAGE": "Не удалось удалить команду. Повторите попытку."
},
"CONFIRM": {
- "TITLE": "Are you sure want to delete - %{teamName}",
- "MESSAGE": "Deleting the team will remove the team assignment from the conversations assigned to this team.",
+ "TITLE": "Вы уверены, что хотите удалить - %{teamName}",
+ "MESSAGE": "Удаление команды снимет назначение команды из бесед, связанных с этой командой.",
"YES": "Удалить ",
"NO": "Отменить"
}
},
"SETTINGS": "Настройки",
"FORM": {
- "UPDATE": "Update team",
- "CREATE": "Create team",
+ "UPDATE": "Обновить команду",
+ "CREATE": "Создать команду",
"NAME": {
- "LABEL": "Team name",
- "PLACEHOLDER": "Example: Sales, Customer Support"
+ "LABEL": "Название команды",
+ "PLACEHOLDER": "Пример: Продажи, Поддержка клиентов"
},
"DESCRIPTION": {
- "LABEL": "Team Description",
- "PLACEHOLDER": "Short description about this team."
+ "LABEL": "Описание команды",
+ "PLACEHOLDER": "Краткое описание этой команды."
},
"AUTO_ASSIGN": {
- "LABEL": "Allow auto assign for this team."
+ "LABEL": "Разрешить автоматическое назначение для этой команды."
},
- "SUBMIT_CREATE": "Create team"
+ "SUBMIT_CREATE": "Создать команду"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sk/campaign.json b/app/javascript/dashboard/i18n/locale/sk/campaign.json
new file mode 100644
index 000000000..2eed61b19
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/sk/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Cancel",
+ "CREATE_BUTTON_TEXT": "Create",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Please enter a valid URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Update",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "There was an error, please try again"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Edit",
+ "DELETE": "Delete"
+ },
+ "STATUS": {
+ "ENABLED": "Enabled",
+ "DISABLED": "Disabled"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/sk/chatlist.json b/app/javascript/dashboard/i18n/locale/sk/chatlist.json
index 228554789..ef4e0629a 100644
--- a/app/javascript/dashboard/i18n/locale/sk/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/sk/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sk/contact.json b/app/javascript/dashboard/i18n/locale/sk/contact.json
index b8d936d22..6a94011a5 100644
--- a/app/javascript/dashboard/i18n/locale/sk/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sk/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Labels available in the account",
"REMOVE": "Click on X icon to remove the label",
"ADD": "Click on + icon to add the label",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Update labels",
"UPDATE_ERROR": "Couldn't update labels, try again."
},
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
- "NO_AVAILABLE_LABELS": "There are no labels added to this conversation."
+ "NO_AVAILABLE_LABELS": "There are no labels added to this conversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
index 13d97f3b0..e03e40f39 100644
--- a/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sk/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Settings",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/sk/index.js b/app/javascript/dashboard/i18n/locale/sk/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/sk/index.js
+++ b/app/javascript/dashboard/i18n/locale/sk/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/sk/report.json b/app/javascript/dashboard/i18n/locale/sk/report.json
index 22e4a1c75..cf2c14a57 100644
--- a/app/javascript/dashboard/i18n/locale/sk/report.json
+++ b/app/javascript/dashboard/i18n/locale/sk/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Last 30 days"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/sv/campaign.json b/app/javascript/dashboard/i18n/locale/sv/campaign.json
new file mode 100644
index 000000000..86fa42ea3
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/sv/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Avbryt",
+ "CREATE_BUTTON_TEXT": "Skapa",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Skickat av",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Ange en giltig URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Uppdatera",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Ett fel uppstod, vänligen försök igen"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Status",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Redigera",
+ "DELETE": "Radera"
+ },
+ "STATUS": {
+ "ENABLED": "Aktiverad",
+ "DISABLED": "Inaktiverad"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/sv/chatlist.json b/app/javascript/dashboard/i18n/locale/sv/chatlist.json
index 673e34ad5..8b606813f 100644
--- a/app/javascript/dashboard/i18n/locale/sv/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/sv/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Mottaget via e-post",
"VIEW_TWEET_IN_TWITTER": "Visa tweet i Twitter",
"REPLY_TO_TWEET": "Svara på detta tweet",
- "NO_MESSAGES": "Inga meddelanden"
+ "NO_MESSAGES": "Inga meddelanden",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sv/contact.json b/app/javascript/dashboard/i18n/locale/sv/contact.json
index f8007cb79..e522d6958 100644
--- a/app/javascript/dashboard/i18n/locale/sv/contact.json
+++ b/app/javascript/dashboard/i18n/locale/sv/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Etiketter tillgängliga på kontot",
"REMOVE": "Klicka på X-ikonen för att ta bort etiketten",
"ADD": "Klicka på + ikonen för att lägga till etiketten",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Uppdatera etiketter",
"UPDATE_ERROR": "Kunde inte uppdatera etiketter, försök igen."
},
"NO_LABELS_TO_ADD": "Det finns inga fler etiketter definierade på kontot.",
- "NO_AVAILABLE_LABELS": "Det finns inga etiketter tillagda till denna konversation."
+ "NO_AVAILABLE_LABELS": "Det finns inga etiketter tillagda till denna konversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Tysta konversation",
"UNMUTE_CONTACT": "Avtysta konversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
index e4363b948..39a68c725 100644
--- a/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/sv/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Inställningar",
"COLLABORATORS": "Medarbetare",
"CONFIGURATION": "Konfiguration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/sv/index.js b/app/javascript/dashboard/i18n/locale/sv/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/sv/index.js
+++ b/app/javascript/dashboard/i18n/locale/sv/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/sv/report.json b/app/javascript/dashboard/i18n/locale/sv/report.json
index f22abfac0..b402521b6 100644
--- a/app/javascript/dashboard/i18n/locale/sv/report.json
+++ b/app/javascript/dashboard/i18n/locale/sv/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Senaste 30 dagarna"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/ta/campaign.json b/app/javascript/dashboard/i18n/locale/ta/campaign.json
new file mode 100644
index 000000000..b1f2b0a66
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/ta/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "ரத்துசெய்",
+ "CREATE_BUTTON_TEXT": "Create",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "சரியான URL ஐ பதிவிடவும்"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "புதுப்பிப்பு",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "There was an error, please try again"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "நிலை",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "திருத்து",
+ "DELETE": "Delete"
+ },
+ "STATUS": {
+ "ENABLED": "இயக்கப்பட்டது",
+ "DISABLED": "முடக்கப்பட்டது"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/ta/chatlist.json b/app/javascript/dashboard/i18n/locale/ta/chatlist.json
index e27a9c1b0..dca53b420 100644
--- a/app/javascript/dashboard/i18n/locale/ta/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/ta/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ta/contact.json b/app/javascript/dashboard/i18n/locale/ta/contact.json
index 1d6991916..567af1644 100644
--- a/app/javascript/dashboard/i18n/locale/ta/contact.json
+++ b/app/javascript/dashboard/i18n/locale/ta/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Labels available in the account",
"REMOVE": "Click on X icon to remove the label",
"ADD": "Click on + icon to add the label",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Update labels",
"UPDATE_ERROR": "லேபிள்களைப் புதுப்பிக்க முடியவில்லை, மீண்டும் முயற்சிக்கவும்."
},
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
- "NO_AVAILABLE_LABELS": "There are no labels added to this conversation."
+ "NO_AVAILABLE_LABELS": "There are no labels added to this conversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
index 4f500305f..d9253bd77 100644
--- a/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/ta/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "அமைப்புகள்",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/ta/index.js b/app/javascript/dashboard/i18n/locale/ta/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/ta/index.js
+++ b/app/javascript/dashboard/i18n/locale/ta/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/ta/report.json b/app/javascript/dashboard/i18n/locale/ta/report.json
index 44ebe628d..c36ed1f9a 100644
--- a/app/javascript/dashboard/i18n/locale/ta/report.json
+++ b/app/javascript/dashboard/i18n/locale/ta/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "கடந்த 30 நாட்கள்"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/th/campaign.json b/app/javascript/dashboard/i18n/locale/th/campaign.json
new file mode 100644
index 000000000..2550d305c
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/th/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "ยกเลิก",
+ "CREATE_BUTTON_TEXT": "Create",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Please enter a valid URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Update",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "เกิดข้อผิดพลาดกรุณาลองใหม่อีกครั้ง"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "สถานะ",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "เเก้ไข",
+ "DELETE": "ลบ"
+ },
+ "STATUS": {
+ "ENABLED": "เปิด",
+ "DISABLED": "ปิด"
+ },
+ "SENDER": {
+ "BOT": "บอท"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/th/chatlist.json b/app/javascript/dashboard/i18n/locale/th/chatlist.json
index 96e82d019..914b66ada 100644
--- a/app/javascript/dashboard/i18n/locale/th/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/th/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "ได้รับทางอีเมลล์",
"VIEW_TWEET_IN_TWITTER": "ดูทวิตในทวิตเตอร์",
"REPLY_TO_TWEET": "ตอบกลับทวิตนี้",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/th/contact.json b/app/javascript/dashboard/i18n/locale/th/contact.json
index 5fd0f7df8..17044bcc6 100644
--- a/app/javascript/dashboard/i18n/locale/th/contact.json
+++ b/app/javascript/dashboard/i18n/locale/th/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "ป้ายกำกับที่ใช้ได้ในบัญชีนี้",
"REMOVE": "คลิกที่ X เพื่อลบป้ายกำกับ",
"ADD": "คลิกที่ + เพื่อเพิ่มป้ายกำกับ",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "อัพเดทป้ายกำกับ",
"UPDATE_ERROR": "ไม่สามารถอัพเดทป้านกำกับได้กรุณาลองใหม่"
},
"NO_LABELS_TO_ADD": "ไม่มีป้ายกำกับที่กำหนดให้บัญชีนี้",
- "NO_AVAILABLE_LABELS": "ไม่มีป้ายกำกับที่เพิ่มให้การสนทนานี้"
+ "NO_AVAILABLE_LABELS": "ไม่มีป้ายกำกับที่เพิ่มให้การสนทนานี้",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "ระงับการสนทนา",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
index c2eeccdae..c91e4d2e2 100644
--- a/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/th/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Settings",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/th/index.js b/app/javascript/dashboard/i18n/locale/th/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/th/index.js
+++ b/app/javascript/dashboard/i18n/locale/th/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/th/report.json b/app/javascript/dashboard/i18n/locale/th/report.json
index 0e8e66de2..0018a50da 100644
--- a/app/javascript/dashboard/i18n/locale/th/report.json
+++ b/app/javascript/dashboard/i18n/locale/th/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Last 30 days"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/tr/campaign.json b/app/javascript/dashboard/i18n/locale/tr/campaign.json
new file mode 100644
index 000000000..99727f30a
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/tr/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "İptal Et",
+ "CREATE_BUTTON_TEXT": "Yarat",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Tarafından gönderildi",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Lütfen geçerli bir adres girin"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Güncelleme",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Bir hata oluştu, lütfen tekrar deneyin"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Durum",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Düzenle",
+ "DELETE": "Sil"
+ },
+ "STATUS": {
+ "ENABLED": "Etkin",
+ "DISABLED": "Devre dışı"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/tr/chatlist.json b/app/javascript/dashboard/i18n/locale/tr/chatlist.json
index 0068db064..f12fbed41 100644
--- a/app/javascript/dashboard/i18n/locale/tr/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/tr/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "E-posta ile alındı",
"VIEW_TWEET_IN_TWITTER": "Twitter'da tweet'i görüntüleyin",
"REPLY_TO_TWEET": "Bu tweet'i yanıtla",
- "NO_MESSAGES": "Mesaj yok"
+ "NO_MESSAGES": "Mesaj yok",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/tr/contact.json b/app/javascript/dashboard/i18n/locale/tr/contact.json
index 25ff26d73..cc6055f3b 100644
--- a/app/javascript/dashboard/i18n/locale/tr/contact.json
+++ b/app/javascript/dashboard/i18n/locale/tr/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Hesapta bulunan etiketler",
"REMOVE": "Etiketi kaldırmak için X simgesine tıklayın",
"ADD": "Etiketi eklemek için + simgesine tıklayın",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Etiketleri güncelle",
"UPDATE_ERROR": "Etiketler güncellenemedi, tekrar deneyin."
},
"NO_LABELS_TO_ADD": "Hesapta tanımlanmış başka etiket yok.",
- "NO_AVAILABLE_LABELS": "Bu görüşmeye eklenen etiket yok."
+ "NO_AVAILABLE_LABELS": "Bu görüşmeye eklenen etiket yok.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Konuşmayı Sessize Al",
"UNMUTE_CONTACT": "Konuşmanın Sesini Aç",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "Detayları göster"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
index d685b608a..78422565c 100644
--- a/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/tr/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Ayarlar",
"COLLABORATORS": "Ortak çalışanlar",
"CONFIGURATION": "Yapılandırma",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/tr/index.js b/app/javascript/dashboard/i18n/locale/tr/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/tr/index.js
+++ b/app/javascript/dashboard/i18n/locale/tr/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/tr/report.json b/app/javascript/dashboard/i18n/locale/tr/report.json
index 4fdde60fe..01392b0db 100644
--- a/app/javascript/dashboard/i18n/locale/tr/report.json
+++ b/app/javascript/dashboard/i18n/locale/tr/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Son 30 gün"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/uk/campaign.json b/app/javascript/dashboard/i18n/locale/uk/campaign.json
new file mode 100644
index 000000000..b934debaa
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/uk/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Скасувати",
+ "CREATE_BUTTON_TEXT": "Create",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Будь ласка, введіть правильний URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Оновити",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "There was an error, please try again"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Статус",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Редагувати",
+ "DELETE": "Видалити"
+ },
+ "STATUS": {
+ "ENABLED": "Увімкнено",
+ "DISABLED": "Вимкнено"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/uk/chatlist.json b/app/javascript/dashboard/i18n/locale/uk/chatlist.json
index c5abfba0c..b008fa6ce 100644
--- a/app/javascript/dashboard/i18n/locale/uk/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/uk/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Received via email",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/uk/contact.json b/app/javascript/dashboard/i18n/locale/uk/contact.json
index 7a5217b70..4afbf67ff 100644
--- a/app/javascript/dashboard/i18n/locale/uk/contact.json
+++ b/app/javascript/dashboard/i18n/locale/uk/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Labels available in the account",
"REMOVE": "Click on X icon to remove the label",
"ADD": "Click on + icon to add the label",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Update labels",
"UPDATE_ERROR": "Не вдалося оновити мітки, спробуйте ще раз."
},
"NO_LABELS_TO_ADD": "There are no more labels defined in the account.",
- "NO_AVAILABLE_LABELS": "There are no labels added to this conversation."
+ "NO_AVAILABLE_LABELS": "There are no labels added to this conversation.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
index 33b7bb735..05dfe7da1 100644
--- a/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/uk/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Налаштування",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/uk/index.js b/app/javascript/dashboard/i18n/locale/uk/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/uk/index.js
+++ b/app/javascript/dashboard/i18n/locale/uk/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/uk/report.json b/app/javascript/dashboard/i18n/locale/uk/report.json
index fc1a408f7..5ff21f034 100644
--- a/app/javascript/dashboard/i18n/locale/uk/report.json
+++ b/app/javascript/dashboard/i18n/locale/uk/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "Останні 30 днів"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/vi/campaign.json b/app/javascript/dashboard/i18n/locale/vi/campaign.json
new file mode 100644
index 000000000..93c6acba2
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/vi/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "Huỷ",
+ "CREATE_BUTTON_TEXT": "Tạo",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "Vui lòng nhập một URL hợp lệ"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "Cập nhật",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "Đã có lỗi, vui lòng thử lại"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "Trạng thái",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "Chỉnh sửa",
+ "DELETE": "Xoá"
+ },
+ "STATUS": {
+ "ENABLED": "Bật",
+ "DISABLED": "Không bật"
+ },
+ "SENDER": {
+ "BOT": "Bot"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/vi/chatlist.json b/app/javascript/dashboard/i18n/locale/vi/chatlist.json
index 930bfb402..34a077990 100644
--- a/app/javascript/dashboard/i18n/locale/vi/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/vi/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "Nhận được từ email",
"VIEW_TWEET_IN_TWITTER": "Xem tweet trên Twitter",
"REPLY_TO_TWEET": "Trả lời cho tweet này",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "No Messages",
+ "NO_CONTENT": "No content available"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/vi/contact.json b/app/javascript/dashboard/i18n/locale/vi/contact.json
index dfb67be01..a101e7b01 100644
--- a/app/javascript/dashboard/i18n/locale/vi/contact.json
+++ b/app/javascript/dashboard/i18n/locale/vi/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "Các nhãn có sẵn trong tài khoản",
"REMOVE": "Click vào X icon xóa nhãn",
"ADD": "Click vào + icon thêm nhãn",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "Cập nhật nhãn",
"UPDATE_ERROR": "Không thể cập nhật nhãn, hãy thử lại."
},
"NO_LABELS_TO_ADD": "Không có thêm nhãn nào được xác định trong tài khoản.",
- "NO_AVAILABLE_LABELS": "Không có nhãn nào được thêm vào cuộc trò chuyện này."
+ "NO_AVAILABLE_LABELS": "Không có nhãn nào được thêm vào cuộc trò chuyện này.",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Tắt tiếng cuộc trò chuyện",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
index 057ec995d..9e87d5f93 100644
--- a/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/vi/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "Cài đặt",
"COLLABORATORS": "Cộng tác viên",
"CONFIGURATION": "Cấu hình",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/vi/index.js b/app/javascript/dashboard/i18n/locale/vi/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/vi/index.js
+++ b/app/javascript/dashboard/i18n/locale/vi/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/vi/report.json b/app/javascript/dashboard/i18n/locale/vi/report.json
index d881013cf..e8b7924ed 100644
--- a/app/javascript/dashboard/i18n/locale/vi/report.json
+++ b/app/javascript/dashboard/i18n/locale/vi/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "30 ngày cuối"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/zh/index.js b/app/javascript/dashboard/i18n/locale/zh/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/zh/index.js
+++ b/app/javascript/dashboard/i18n/locale/zh/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json b/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json
new file mode 100644
index 000000000..4eeda5d60
--- /dev/null
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/campaign.json
@@ -0,0 +1,79 @@
+{
+ "CAMPAIGN": {
+ "HEADER": "Campaigns",
+ "SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on Add Campaign to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
+ "HEADER_BTN_TXT": "Create a campaign",
+ "ADD": {
+ "TITLE": "Create a campaign",
+ "DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
+ "CANCEL_BUTTON_TEXT": "取消",
+ "CREATE_BUTTON_TEXT": "创建",
+ "FORM": {
+ "TITLE": {
+ "LABEL": "Title",
+ "PLACEHOLDER": "Please enter the title of campaign",
+ "ERROR": "Title is required"
+ },
+ "MESSAGE": {
+ "LABEL": "Message",
+ "PLACEHOLDER": "Please enter the message of campaign",
+ "ERROR": "Message is required"
+ },
+ "SENT_BY": {
+ "LABEL": "Sent by",
+ "PLACEHOLDER": "Please select the the content of campaign",
+ "ERROR": "Sender is required"
+ },
+ "END_POINT": {
+ "LABEL": "URL",
+ "PLACEHOLDER": "Please enter the URL",
+ "ERROR": "请输入一个有效的 URL"
+ },
+ "TIME_ON_PAGE": {
+ "LABEL": "Time on page(Seconds)",
+ "PLACEHOLDER": "Please enter the time",
+ "ERROR": "Time on page is required"
+ },
+ "ENABLED": "Enable campaign",
+ "SUBMIT": "Add Campaign"
+ },
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign created successfully",
+ "ERROR_MESSAGE": "There was an error. Please try again."
+ }
+ },
+ "EDIT": {
+ "TITLE": "Edit campaign",
+ "UPDATE_BUTTON_TEXT": "更新",
+ "API": {
+ "SUCCESS_MESSAGE": "Campaign updated successfully",
+ "ERROR_MESSAGE": "出现错误,请重试"
+ }
+ },
+ "LIST": {
+ "LOADING_MESSAGE": "Loading campaigns...",
+ "404": "There are no campaigns created for this inbox.",
+ "TABLE_HEADER": {
+ "TITLE": "Title",
+ "MESSAGE": "Message",
+ "STATUS": "状态",
+ "SENDER": "Sender",
+ "URL": "URL",
+ "TIME_ON_PAGE": "Time(Seconds)",
+ "CREATED_AT": "Created at"
+ },
+ "BUTTONS": {
+ "ADD": "Add",
+ "EDIT": "编辑",
+ "DELETE": "删除"
+ },
+ "STATUS": {
+ "ENABLED": "已启用",
+ "DISABLED": "已禁用"
+ },
+ "SENDER": {
+ "BOT": "机器人"
+ }
+ }
+ }
+}
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json b/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json
index 4b220d70e..438ad4f58 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/chatlist.json
@@ -80,6 +80,7 @@
"RECEIVED_VIA_EMAIL": "通过电子邮件接收",
"VIEW_TWEET_IN_TWITTER": "在 Twitter 中查看 tweet",
"REPLY_TO_TWEET": "回复此推文",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "没有信息",
+ "NO_CONTENT": "没有可用的内容"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json
index d5803427a..468689530 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/contact.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/contact.json
@@ -28,11 +28,17 @@
"INACTIVE_LABELS": "账户中可用的标签",
"REMOVE": "点击 X 图标删除标签",
"ADD": "点击 + 图标添加标签",
+ "ADD_BUTTON": "Add Labels",
"UPDATE_BUTTON": "更新标签",
"UPDATE_ERROR": "无法更新标签,请重试。"
},
"NO_LABELS_TO_ADD": "帐户中没有更多标签。",
- "NO_AVAILABLE_LABELS": "没有标签添加到此对话。"
+ "NO_AVAILABLE_LABELS": "没有标签添加到此对话。",
+ "LABEL_SELECT": {
+ "TITLE": "Add Labels",
+ "PLACEHOLDER": "Search labels",
+ "NO_RESULT": "No labels found"
+ }
},
"MUTE_CONTACT": "Mute Conversation",
"UNMUTE_CONTACT": "Unmute Conversation",
@@ -151,5 +157,18 @@
},
"VIEW_DETAILS": "View details"
}
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "Notes"
+ },
+ "ADD": {
+ "BUTTON": "Add",
+ "PLACEHOLDER": "Add a note",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "View all notes"
+ }
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
index e5d653e35..b040d5bfd 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/inboxMgmt.json
@@ -227,6 +227,7 @@
"SETTINGS": "设置",
"COLLABORATORS": "Collaborators",
"CONFIGURATION": "Configuration",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours"
},
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/index.js b/app/javascript/dashboard/i18n/locale/zh_CN/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/index.js
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/zh_CN/report.json b/app/javascript/dashboard/i18n/locale/zh_CN/report.json
index 1ce4e4362..0fd7d92c0 100644
--- a/app/javascript/dashboard/i18n/locale/zh_CN/report.json
+++ b/app/javascript/dashboard/i18n/locale/zh_CN/report.json
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "最近30天"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json
index 79e5a1671..90337cc93 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/agentMgmt.json
@@ -1,18 +1,18 @@
{
"AGENT_MGMT": {
- "HEADER": "客服代理們",
- "HEADER_BTN_TXT": "建立客服代理",
- "LOADING": "正在獲取客服代理列表",
- "SIDEBAR_TXT": "
",
"LIST": {
- "404": "此帳戶中没有預設的回覆。",
- "TITLE": "管理預設回覆",
- "DESC": "預設的回覆是預定義的回覆模板,可以用來快速發送對工單的答覆。",
+ "404": "此帳戶中沒有可用的罐頭回覆。",
+ "TITLE": "管理罐頭回覆",
+ "DESC": "罐頭回覆是預定義的回覆模板,可以用來快速發送對工單的回覆。",
"TABLE_HEADER": [
- "短码",
+ "簡碼",
"内容",
"操作"
]
},
"ADD": {
- "TITLE": "建立預設回覆",
- "DESC": "預設的回覆是保存的回覆模板,可以用來快速發送回覆到對話中。",
+ "TITLE": "建立罐頭回覆",
+ "DESC": "罐頭回覆是保存的回覆模板,可以用來快速發送回覆到對話中。",
"CANCEL_BUTTON_TEXT": "取消操作",
"FORM": {
"SHORT_CODE": {
- "LABEL": "短码",
- "PLACEHOLDER": "請輸入短码",
- "ERROR": "必須輸入短代碼"
+ "LABEL": "簡碼",
+ "PLACEHOLDER": "請輸入簡碼",
+ "ERROR": "必須輸入簡碼"
},
"CONTENT": {
"LABEL": "内容",
@@ -33,18 +33,18 @@
"SUBMIT": "送出"
},
"API": {
- "SUCCESS_MESSAGE": "已成功建立預設回覆",
+ "SUCCESS_MESSAGE": "已成功新增罐頭回覆",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
}
},
"EDIT": {
- "TITLE": "編輯預設回覆",
+ "TITLE": "編輯罐頭回覆",
"CANCEL_BUTTON_TEXT": "取消操作",
"FORM": {
"SHORT_CODE": {
- "LABEL": "短码",
- "PLACEHOLDER": "請輸入短码",
- "ERROR": "必須輸入短代碼"
+ "LABEL": "簡碼",
+ "PLACEHOLDER": "請輸入簡碼",
+ "ERROR": "必須輸入簡碼"
},
"CONTENT": {
"LABEL": "内容",
@@ -55,19 +55,19 @@
},
"BUTTON_TEXT": "編輯",
"API": {
- "SUCCESS_MESSAGE": "預設回覆已成功更新",
+ "SUCCESS_MESSAGE": "罐頭回覆已成功更新",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
}
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "預設回覆已成功刪除",
+ "SUCCESS_MESSAGE": "罐頭回覆已成功刪除",
"ERROR_MESSAGE": "無法連接伺服器,請稍後再試"
},
"CONFIRM": {
"TITLE": "確認刪除",
- "MESSAGE": "您確定要刪除吗? ",
+ "MESSAGE": "您確定要刪除嗎? ",
"YES": "是,刪除 ",
"NO": "不,保留 "
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json b/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json
index 43d5eba7a..328e8500d 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/chatlist.json
@@ -1,14 +1,14 @@
{
"CHAT_LIST": {
- "LOADING": "正在獲取對話",
- "LOAD_MORE_CONVERSATIONS": "加載更多對話",
- "EOF": "所有對話已加載 🎉",
+ "LOADING": "正在取得對話",
+ "LOAD_MORE_CONVERSATIONS": "載入更多對話",
+ "EOF": "所有對話已載入 🎉",
"LIST": {
- "404": "没有有效的對話在這個群组里面"
+ "404": "這個群組中無有效對話"
},
- "TAB_HEADING": "會話",
+ "TAB_HEADING": "對話",
"SEARCH": {
- "INPUT": "搜索人、聊天室、保存回覆"
+ "INPUT": "搜尋人、聊天室、保存回覆"
},
"STATUS_TABS": [
{
@@ -27,7 +27,7 @@
"COUNT_KEY": "mineCount"
},
{
- "NAME": "未分配的",
+ "NAME": "未指派的",
"KEY": "unassigned",
"COUNT_KEY": "unAssignedCount"
},
@@ -47,22 +47,22 @@
"VALUE": "resolved"
},
{
- "TEXT": "机器人",
- "VALUE": "机器人"
+ "TEXT": "機器人",
+ "VALUE": "機器人"
}
],
"ATTACHMENTS": {
"image": {
"ICON": "ion-image",
- "CONTENT": "图片消息"
+ "CONTENT": "圖片訊息"
},
"audio": {
"ICON": "ion-volume-high",
- "CONTENT": "音频消息"
+ "CONTENT": "聲音訊息"
},
"video": {
"ICON": "ion-ios-videocam",
- "CONTENT": "视频消息"
+ "CONTENT": "影片訊息"
},
"file": {
"ICON": "ion-document",
@@ -77,9 +77,10 @@
"CONTENT": "分享了一個網址"
}
},
- "RECEIVED_VIA_EMAIL": "Received via email",
+ "RECEIVED_VIA_EMAIL": "使用電子郵件接收",
"VIEW_TWEET_IN_TWITTER": "View tweet in Twitter",
"REPLY_TO_TWEET": "Reply to this tweet",
- "NO_MESSAGES": "No Messages"
+ "NO_MESSAGES": "沒有訊息",
+ "NO_CONTENT": "沒有可用內容"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json
index 89edf5fcd..b1b4e6e43 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/contact.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/contact.json
@@ -1,43 +1,49 @@
{
"CONTACT_PANEL": {
- "NOT_AVAILABLE": "Not Available",
+ "NOT_AVAILABLE": "無法使用",
"EMAIL_ADDRESS": "電子信箱地址",
"PHONE_NUMBER": "電話號碼",
- "COPY_SUCCESSFUL": "Copied to clipboard successfully",
- "COMPANY": "Company",
+ "COPY_SUCCESSFUL": "成功複製到剪貼簿",
+ "COMPANY": "公司",
"LOCATION": "位置",
- "CONVERSATION_TITLE": "對話詳情",
+ "CONVERSATION_TITLE": "對話詳細資訊",
"BROWSER": "瀏覽器",
- "OS": "操作系统",
- "INITIATED_FROM": "啟動自:",
+ "OS": "作業系统",
+ "INITIATED_FROM": "發起自:",
"INITIATED_AT": "發起於",
- "IP_ADDRESS": "IP Address",
- "NEW_MESSAGE": "New message",
+ "IP_ADDRESS": "IP 位置",
+ "NEW_MESSAGE": "新訊息",
"CONVERSATIONS": {
- "NO_RECORDS_FOUND": "此聯繫人没有關聯到以前的會話。",
+ "NO_RECORDS_FOUND": "此聯絡人没有關聯到以前的對話。",
"TITLE": "上一次對話"
},
"CUSTOM_ATTRIBUTES": {
- "TITLE": "Custom Attributes"
+ "TITLE": "自訂屬性"
},
"LABELS": {
"TITLE": "對話標記",
"MODAL": {
"TITLE": "標記為",
- "ACTIVE_LABELS": "建立到對話的標籤",
+ "ACTIVE_LABELS": "將標籤新增至對話",
"INACTIVE_LABELS": "帳戶中可用的標籤",
- "REMOVE": "點擊 X 圖示刪除標籤",
- "ADD": "點擊 + 圖示建立標籤",
+ "REMOVE": "點擊 X 圖示以刪除標籤",
+ "ADD": "點擊 + 圖示以新增標籤",
+ "ADD_BUTTON": "新增標籤",
"UPDATE_BUTTON": "更新標籤",
"UPDATE_ERROR": "無法更新標籤,請重試。"
},
- "NO_LABELS_TO_ADD": "帳戶中没有更多標籤。",
- "NO_AVAILABLE_LABELS": "没有標籤建立到此對話。"
+ "NO_LABELS_TO_ADD": "帳戶中沒有更多標籤。",
+ "NO_AVAILABLE_LABELS": "此對話沒有被新增任何標籤。",
+ "LABEL_SELECT": {
+ "TITLE": "新增標籤",
+ "PLACEHOLDER": "搜尋標籤",
+ "NO_RESULT": "查無標籤"
+ }
},
- "MUTE_CONTACT": "Mute Conversation",
- "UNMUTE_CONTACT": "Unmute Conversation",
- "MUTED_SUCCESS": "This conversation is muted for 6 hours",
- "UNMUTED_SUCCESS": "This conversation is unmuted",
+ "MUTE_CONTACT": "將對話靜音",
+ "UNMUTE_CONTACT": "將對話解除靜音",
+ "MUTED_SUCCESS": "將對話靜音 6 小時",
+ "UNMUTED_SUCCESS": "對話已解除靜音",
"SEND_TRANSCRIPT": "Send Transcript",
"EDIT_LABEL": "編輯"
},
@@ -47,14 +53,14 @@
"DESC": "編輯聯絡人資訊"
},
"CREATE_CONTACT": {
- "BUTTON_LABEL": "New Contact",
- "TITLE": "Create new contact",
- "DESC": "Add basic information details about the contact."
+ "BUTTON_LABEL": "新聯絡人",
+ "TITLE": "新增聯絡人",
+ "DESC": "為聯絡人增加基本資訊"
},
"CONTACT_FORM": {
"FORM": {
"SUBMIT": "送出",
- "CANCEL": "取消操作",
+ "CANCEL": "取消",
"AVATAR": {
"LABEL": "連絡人頭像"
},
@@ -103,14 +109,14 @@
}
}
},
- "SUCCESS_MESSAGE": "Contact saved successfully",
+ "SUCCESS_MESSAGE": "聯絡人儲存成功",
"CONTACT_ALREADY_EXIST": "這個電子信箱已經被其他聯絡人使用了。",
"ERROR_MESSAGE": "出現錯誤,請重試"
},
"NEW_CONVERSATION": {
- "BUTTON_LABEL": "Start conversation",
- "TITLE": "New conversation",
- "DESC": "Start a new conversation by sending a new message.",
+ "BUTTON_LABEL": "開始對話",
+ "TITLE": "新的對話",
+ "DESC": "傳送一則新訊息以開始新的對話",
"NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
"FORM": {
"TO": {
@@ -121,35 +127,48 @@
"ERROR": "Select an inbox"
},
"MESSAGE": {
- "LABEL": "Message",
- "PLACEHOLDER": "Write your message here",
- "ERROR": "Message can't be empty"
+ "LABEL": "訊息",
+ "PLACEHOLDER": "在此填寫你的訊息",
+ "ERROR": "訊息不得為空"
},
- "SUBMIT": "Send message",
- "CANCEL": "取消操作",
- "SUCCESS_MESSAGE": "Message sent!",
- "ERROR_MESSAGE": "Couldn't send! try again"
+ "SUBMIT": "傳送訊息",
+ "CANCEL": "取消",
+ "SUCCESS_MESSAGE": "訊息已傳送",
+ "ERROR_MESSAGE": "無法傳送!請重新嘗試。"
}
},
"CONTACTS_PAGE": {
- "HEADER": "Contacts",
- "SEARCH_BUTTON": "Search",
- "SEARCH_INPUT_PLACEHOLDER": "Search for contacts",
+ "HEADER": "聯絡人",
+ "SEARCH_BUTTON": "搜尋",
+ "SEARCH_INPUT_PLACEHOLDER": "搜尋聯絡人",
"LIST": {
"LOADING_MESSAGE": "Loading contacts...",
"404": "No contacts matches your search 🔍",
"TABLE_HEADER": {
- "NAME": "姓名:",
+ "NAME": "姓名",
"PHONE_NUMBER": "聯絡人電話",
- "CONVERSATIONS": "會話",
+ "CONVERSATIONS": "對話",
"LAST_ACTIVITY": "Last Activity",
- "COUNTRY": "Country",
- "CITY": "City",
+ "COUNTRY": "國家",
+ "CITY": "城市",
"SOCIAL_PROFILES": "Social Profiles",
- "COMPANY": "Company",
+ "COMPANY": "公司",
"EMAIL_ADDRESS": "電子信箱地址"
},
- "VIEW_DETAILS": "View details"
+ "VIEW_DETAILS": "查看詳細資訊"
+ }
+ },
+ "NOTES": {
+ "HEADER": {
+ "TITLE": "筆記"
+ },
+ "ADD": {
+ "BUTTON": "建立",
+ "PLACEHOLDER": "建立筆記",
+ "TITLE": "Shift + Enter to create a note"
+ },
+ "FOOTER": {
+ "BUTTON": "查看所有筆記"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
index 85a6c298b..3f0f294bc 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/conversation.json
@@ -5,16 +5,16 @@
"NO_MESSAGE_2": " 向您的頁面發送一條消息!",
"NO_INBOX_1": "看來你還没有建立任何收件匣。",
"NO_INBOX_2": " 開始吧",
- "NO_INBOX_AGENT": "看起來您還没有分配到收件匣。請聯繫您的管理員",
+ "NO_INBOX_AGENT": "看起來你還沒有分配到收件匣。請聯絡你的管理員",
"SEARCH_MESSAGES": "Search for messages in conversations",
"SEARCH": {
- "TITLE": "Search messages",
+ "TITLE": "搜尋訊息",
"LOADING_MESSAGE": "Crunching data...",
- "PLACEHOLDER": "Type any text to search messages",
- "NO_MATCHING_RESULTS": "No results found."
+ "PLACEHOLDER": "輸入任何文字以搜尋訊息",
+ "NO_MATCHING_RESULTS": "查無結果。"
},
- "UNREAD_MESSAGES": "Unread Messages",
- "UNREAD_MESSAGE": "Unread Message",
+ "UNREAD_MESSAGES": "未讀訊息",
+ "UNREAD_MESSAGE": "未讀訊息",
"CLICK_HERE": "點擊這裡",
"LOADING_INBOXES": "正在加載收件匣",
"LOADING_CONVERSATIONS": "加載更多對話",
@@ -23,11 +23,11 @@
"TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 小時消息視窗限制",
"LAST_INCOMING_TWEET": "You are replying to the last incoming tweet",
- "REPLYING_TO": "You are replying to:",
- "REMOVE_SELECTION": "Remove Selection",
+ "REPLYING_TO": "你正在回覆到:",
+ "REMOVE_SELECTION": "移除選擇項目",
"DOWNLOAD": "下載",
"UPLOADING_ATTACHMENTS": "Uploading attachments...",
- "NO_RESPONSE": "No response",
+ "NO_RESPONSE": "無回應",
"HEADER": {
"RESOLVE_ACTION": "已解決",
"REOPEN_ACTION": "重新打開",
@@ -37,7 +37,7 @@
"DETAILS": "詳情"
},
"RESOLVE_DROPDOWN": {
- "OPEN_BOT": "Open with bot"
+ "OPEN_BOT": "使用 bot 開啟"
},
"FOOTER": {
"MSG_INPUT": "輸入“/”開始選擇快捷回覆",
@@ -50,20 +50,20 @@
"CREATE": "建立筆記",
"TWEET": "推特",
"TIP_FORMAT_ICON": "Show rich text editor",
- "TIP_EMOJI_ICON": "Show emoji selector",
- "TIP_ATTACH_ICON": "Attach files",
- "ENTER_TO_SEND": "Enter to send"
+ "TIP_EMOJI_ICON": "顯示 emoji 選擇器",
+ "TIP_ATTACH_ICON": "附件",
+ "ENTER_TO_SEND": "按下 Enter 傳送"
},
"VISIBLE_TO_AGENTS": "私人筆記:僅對您和您的團隊可以看見",
"CHANGE_STATUS": "對話狀態已更改",
- "CHANGE_AGENT": "對話分配人已更改",
+ "CHANGE_AGENT": "對話指派人已更改",
"CHANGE_TEAM": "Conversation team changed",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit",
- "SENT_BY": "Sent by:",
+ "SENT_BY": "寄送者:",
"ASSIGNMENT": {
- "SELECT_AGENT": "Select Agent",
+ "SELECT_AGENT": "選擇客服",
"REMOVE": "刪除",
- "ASSIGN": "Assign"
+ "ASSIGN": "指派"
}
},
"EMAIL_TRANSCRIPT": {
@@ -84,7 +84,7 @@
}
},
"ONBOARDING": {
- "TITLE": "Hey 👋, Welcome to %{installationName}!",
+ "TITLE": "Hey 👋, 歡迎來到 %{installationName}!",
"DESCRIPTION": "Thanks for signing up. We want you to get the most out of %{installationName}. Here are a few things you can do in %{installationName} to make the experience delightful.",
"READ_LATEST_UPDATES": "Read our latest updates",
"ALL_CONVERSATION": {
@@ -92,27 +92,27 @@
"DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status."
},
"TEAM_MEMBERS": {
- "TITLE": "Invite your team members",
+ "TITLE": "邀請團隊成員",
"DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email address to the agent list.",
- "NEW_LINK": "Click here to invite a team member"
+ "NEW_LINK": "按此邀請一個新成員"
},
"INBOXES": {
"TITLE": "Connect Inboxes",
"DESCRIPTION": "Connect various channels through which your customers would be talking to you. It can be a website live-chat, your Facebook or Twitter page or even your WhatsApp number.",
- "NEW_LINK": "Click here to create an inbox"
+ "NEW_LINK": "按此建立一個收件匣"
},
"LABELS": {
"TITLE": "Organize conversations with labels",
"DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
- "NEW_LINK": "Click here to create tags"
+ "NEW_LINK": "按此建立標籤"
}
},
"CONVERSATION_SIDEBAR": {
- "DETAILS_TITLE": "Conversations Details",
- "ASSIGNEE_LABEL": "Assigned Agent",
- "TEAM_LABEL": "Assigned Team",
+ "DETAILS_TITLE": "對話詳細資訊",
+ "ASSIGNEE_LABEL": "指派客服",
+ "TEAM_LABEL": "指派團隊",
"SELECT": {
- "PLACEHOLDER": "None"
+ "PLACEHOLDER": "無"
}
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json b/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json
index 1b874112c..8a57603b8 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/generalSettings.json
@@ -47,28 +47,28 @@
},
"FORMS": {
"MULTISELECT": {
- "ENTER_TO_SELECT": "Press enter to select",
- "ENTER_TO_REMOVE": "Press enter to remove",
+ "ENTER_TO_SELECT": "按下 enter 以選擇",
+ "ENTER_TO_REMOVE": "按下 enter 以移除",
"SELECT_ONE": "Select one"
}
},
"NOTIFICATIONS_PAGE": {
- "HEADER": "Notifications",
- "MARK_ALL_DONE": "Mark All Done",
+ "HEADER": "通知",
+ "MARK_ALL_DONE": "全部標記完成",
"LIST": {
- "LOADING_MESSAGE": "Loading notifications...",
- "404": "No Notifications",
+ "LOADING_MESSAGE": "載入更多通知...",
+ "404": "沒有通知",
"TABLE_HEADER": [
- "姓名:",
+ "姓名",
"聯絡人電話",
- "會話",
+ "對話",
"Last Contacted"
]
},
"TYPE_LABEL": {
- "conversation_creation": "New conversation",
+ "conversation_creation": "新對話",
"conversation_assignment": "Conversation Assigned",
- "assigned_conversation_new_message": "New Message",
+ "assigned_conversation_new_message": "新訊息",
"conversation_mention": "Mention"
}
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
index 34caf18ce..d8870e9e7 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/inboxMgmt.json
@@ -17,7 +17,7 @@
"body": "驗證您的帳戶並建立建立收件匣。"
},
{
- "title": "建立客服代理",
+ "title": "建立客服",
"route": "settings_inboxes_add_agents",
"body": "將客服增加到建立的收件匣。"
},
@@ -75,10 +75,10 @@
"DISABLED": "已停用"
},
"REPLY_TIME": {
- "TITLE": "Set Reply time",
- "IN_A_FEW_MINUTES": "In a few minutes",
- "IN_A_FEW_HOURS": "In a few hours",
- "IN_A_DAY": "In a day",
+ "TITLE": "設定回覆時間",
+ "IN_A_FEW_MINUTES": "幾分鐘內",
+ "IN_A_FEW_HOURS": "幾小時內",
+ "IN_A_DAY": "一天內",
"HELP_TEXT": "This reply time will be displayed on the live chat widget"
},
"WIDGET_COLOR": {
@@ -165,8 +165,8 @@
"DESC": "目前我們支持網站線上聊天小元件、Facebook 頁面和 Twitter 配置文件作為平台。 我們在工作中擁有更多平台,如 Whatsapp、Email、Telegram 和 Line,這些平台將很快支援。"
},
"AGENTS": {
- "TITLE": "客服代理們",
- "DESC": "在這裡您可以建立代理來管理您新建立的收件匣。只有這些選定的代理才能訪問您的收件匣。 不屬於此收件匣的代理人在登入時將無法看到或回覆此收件匣中的消息。 PS: 作為管理員,如果您需要訪問所有收件匣, 您應該將自己建立到您建立的所有收件匣中。",
+ "TITLE": "客服",
+ "DESC": "在這裡您可以建立客服來管理您新建立的收件匣。只有這些選定的客服才能訪問您的收件匣。 不屬於此收件匣的客服在登入時將無法看到或回覆此收件匣中的消息。 PS: 作為管理員,如果您需要訪問所有收件匣, 您應該將自己建立到您建立的所有收件匣中。",
"VALIDATION_ERROR": "Add atleast one agent to your new Inbox",
"PICK_AGENTS": "Pick agents for the inbox"
},
@@ -187,14 +187,14 @@
"DESC": ""
},
"AGENTS": {
- "BUTTON_TEXT": "建立客服代理",
- "ADD_AGENTS": "正在向收件匣建立代理..."
+ "BUTTON_TEXT": "新增客服",
+ "ADD_AGENTS": "正在新增客服到你的收件匣..."
},
"FINISH": {
"TITLE": "您的收件匣已準備就緒!",
"MESSAGE": "您現在可以通過您的新頻道與您的客户聯繫。開心的支援客戶吧 ",
"BUTTON_TEXT": "带我到這裡",
- "MORE_SETTINGS": "More settings",
+ "MORE_SETTINGS": "更多設定",
"WEBSITE_SUCCESS": "您已成功完成建立網站頻道。複製下面顯示的代碼並將其黏貼在您的網站上。 下次客户使用即時聊天時,對話將自動出現在您的收件匣中。"
},
"REAUTH": "重新授權",
@@ -227,14 +227,15 @@
"SETTINGS": "設定",
"COLLABORATORS": "客服人員",
"CONFIGURATION": "組態",
+ "CAMPAIGN": "Campaigns",
"PRE_CHAT_FORM": "Pre Chat Form",
- "BUSINESS_HOURS": "Business Hours"
+ "BUSINESS_HOURS": "營業時間"
},
"SETTINGS": "設定",
"FEATURES": {
"LABEL": "Features",
- "DISPLAY_FILE_PICKER": "Display file picker on the widget",
- "DISPLAY_EMOJI_PICKER": "Display emoji picker on the widget"
+ "DISPLAY_FILE_PICKER": "在小工具上顯示檔案選擇器",
+ "DISPLAY_EMOJI_PICKER": "在小工具上顯示 emoji 選擇器"
},
"SETTINGS_POPUP": {
"MESSENGER_HEADING": "Messenger 脚本",
@@ -245,14 +246,14 @@
"AUTO_ASSIGNMENT": "啟用自動分配",
"INBOX_UPDATE_TITLE": "收件匣設定",
"INBOX_UPDATE_SUB_TEXT": "更新收件匣設定",
- "AUTO_ASSIGNMENT_SUB_TEXT": "啟用或停用建立到此收件匣的代理人自動分配新的會話。",
+ "AUTO_ASSIGNMENT_SUB_TEXT": "啟用或停用此收件匣客服的對話自動分配。",
"HMAC_VERIFICATION": "User Identity Validation",
"HMAC_DESCRIPTION": "Inorder validate the users identity, the SDK allows you to pass an `identity_hash` for each user. You can generate HMAC using 'sha256' with the key shown here."
},
"FACEBOOK_REAUTHORIZE": {
"TITLE": "重新授權",
"SUBTITLE": "Your Facebook connection has expired, please reconnect your Facebook page to continue services",
- "MESSAGE_SUCCESS": "Reconnection successful",
+ "MESSAGE_SUCCESS": "重新連接成功",
"MESSAGE_ERROR": "出現錯誤,請重試"
},
"PRE_CHAT_FORM": {
@@ -276,7 +277,7 @@
"TITLE": "Set your availability",
"SUBTITLE": "Set your availability on your livechat widget",
"WEEKLY_TITLE": "Set your weekly hours",
- "TIMEZONE_LABEL": "Select timezone",
+ "TIMEZONE_LABEL": "選擇時區",
"UPDATE": "Update business hours settings",
"TOGGLE_AVAILABILITY": "Enable business availability for this inbox",
"UNAVAILABLE_MESSAGE_LABEL": "Unavailable message for vistors",
@@ -284,7 +285,7 @@
"TOGGLE_HELP": "Enabling business availability will show the available hours on live chat widget even if all the agents are offline. Outside available hours vistors can be warned with a message and a pre-chat form.",
"DAY": {
"ENABLE": "Enable availability for this day",
- "UNAVAILABLE": "Unavailable",
+ "UNAVAILABLE": "無法使用",
"HOURS": "hours",
"VALIDATION_ERROR": "Starting time should be before closing time.",
"CHOOSE": "Choose"
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/index.js b/app/javascript/dashboard/i18n/locale/zh_TW/index.js
index 5dfc44e4b..cf1dda7fe 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/index.js
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/index.js
@@ -1,33 +1,37 @@
import { default as _agentMgmt } from './agentMgmt.json';
-import { default as _labelsMgmt } from './labelsMgmt.json';
+import { default as _campaign } from './campaign.json';
import { default as _cannedMgmt } from './cannedMgmt.json';
import { default as _chatlist } from './chatlist.json';
import { default as _contact } from './contact.json';
import { default as _conversation } from './conversation.json';
+import { default as _generalSettings } from './generalSettings.json';
import { default as _inboxMgmt } from './inboxMgmt.json';
+import { default as _integrations } from './integrations.json';
+import { default as _labelsMgmt } from './labelsMgmt.json';
import { default as _login } from './login.json';
import { default as _report } from './report.json';
import { default as _resetPassword } from './resetPassword.json';
import { default as _setNewPassword } from './setNewPassword.json';
import { default as _settings } from './settings.json';
import { default as _signup } from './signup.json';
-import { default as _integrations } from './integrations.json';
-import { default as _generalSettings } from './generalSettings.json';
+import { default as _teamsSettings } from './teamsSettings.json';
export default {
..._agentMgmt,
+ ..._campaign,
..._cannedMgmt,
..._chatlist,
..._contact,
..._conversation,
+ ..._generalSettings,
..._inboxMgmt,
+ ..._integrations,
+ ..._labelsMgmt,
..._login,
..._report,
- ..._labelsMgmt,
..._resetPassword,
..._setNewPassword,
..._settings,
..._signup,
- ..._integrations,
- ..._generalSettings,
+ ..._teamsSettings,
};
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/report.json b/app/javascript/dashboard/i18n/locale/zh_TW/report.json
index 1cb98291f..b808b432e 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/report.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/report.json
@@ -3,7 +3,7 @@
"HEADER": "報表",
"LOADING_CHART": "正在載入图表數據...",
"NO_ENOUGH_DATA": "我們没有收到足夠的數據來生成報表,請稍後再試。",
- "DOWNLOAD_AGENT_REPORTS": "Download agent reports",
+ "DOWNLOAD_AGENT_REPORTS": "下載客服報告",
"METRICS": {
"CONVERSATIONS": {
"NAME": "會話",
@@ -38,6 +38,18 @@
{
"id": 1,
"name": "最近30天"
+ },
+ {
+ "id": 2,
+ "name": "Last 3 months"
+ },
+ {
+ "id": 3,
+ "name": "Last 6 months"
+ },
+ {
+ "id": 4,
+ "name": "Last year"
}
]
}
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json
index b51fc3bac..d5ea67521 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/settings.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/settings.json
@@ -19,7 +19,7 @@
"PASSWORD_SECTION": {
"TITLE": "密碼",
"NOTE": "更新您的密碼會在多個設備中重置您的登入資訊。",
- "BTN_TEXT": "Change password"
+ "BTN_TEXT": "變更密碼"
},
"ACCESS_TOKEN": {
"TITLE": "訪問 token",
@@ -56,12 +56,12 @@
"LABEL": "頭像"
},
"NAME": {
- "LABEL": "Your full name",
+ "LABEL": "你的姓名",
"ERROR": "Please enter a valid full name",
"PLACEHOLDER": "Please enter your full name"
},
"DISPLAY_NAME": {
- "LABEL": "Display name",
+ "LABEL": "顯示名稱",
"ERROR": "Please enter a valid display name",
"PLACEHOLDER": "Please enter a display name, this would be displayed in conversations"
},
@@ -123,17 +123,17 @@
"SIDEBAR": {
"CONVERSATIONS": "會話",
"REPORTS": "報表",
- "CONTACTS": "Contacts",
+ "CONTACTS": "聯絡人",
"SETTINGS": "設定",
"HOME": "首頁",
- "AGENTS": "客服代理們",
+ "AGENTS": "客服",
"INBOXES": "收件匣",
- "NOTIFICATIONS": "Notifications",
+ "NOTIFICATIONS": "通知",
"CANNED_RESPONSES": "預設回覆",
"INTEGRATIONS": "整合方式",
"ACCOUNT_SETTINGS": "帳戶設定",
"LABELS": "標籤",
- "TEAMS": "Teams"
+ "TEAMS": "團隊"
},
"CREATE_ACCOUNT": {
"NEW_ACCOUNT": "新帳戶",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/signup.json b/app/javascript/dashboard/i18n/locale/zh_TW/signup.json
index e2d730eb0..fa4d03f4a 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/signup.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/signup.json
@@ -9,9 +9,9 @@
"ERROR": "Account name is too short"
},
"FULL_NAME": {
- "LABEL": "Full name",
- "PLACEHOLDER": "Enter your full name. eg: Bruce Wayne",
- "ERROR": "Full name is too short"
+ "LABEL": "姓名",
+ "PLACEHOLDER": "請輸入您的完整姓名,如:王大明",
+ "ERROR": "姓名太短了"
},
"EMAIL": {
"LABEL": "Work email",
diff --git a/app/javascript/dashboard/i18n/locale/zh_TW/teamsSettings.json b/app/javascript/dashboard/i18n/locale/zh_TW/teamsSettings.json
index 41485acd6..cf0a7dfaf 100644
--- a/app/javascript/dashboard/i18n/locale/zh_TW/teamsSettings.json
+++ b/app/javascript/dashboard/i18n/locale/zh_TW/teamsSettings.json
@@ -1,20 +1,20 @@
{
"TEAMS_SETTINGS": {
- "NEW_TEAM": "Create new team",
- "HEADER": "Teams",
+ "NEW_TEAM": "建立新團隊",
+ "HEADER": "團隊",
"SIDEBAR_TXT": "
Teams
Teams let you organize your agents into groups based on their responsibilities. A user can be part of multiple teams. You can assign conversations to a team when you are working collaboratively.
",
"LIST": {
"404": "There are no teams created on this account.",
- "EDIT_TEAM": "Edit team"
+ "EDIT_TEAM": "編輯團隊"
},
"CREATE_FLOW": {
"CREATE": {
- "TITLE": "Create a new team",
+ "TITLE": "建立一個新團隊",
"DESC": "Add a title and description to your new team."
},
"AGENTS": {
- "BUTTON_TEXT": "Add agents to team",
- "TITLE": "Add agents to team - %{teamName}",
+ "BUTTON_TEXT": "將客服加入團隊",
+ "TITLE": "將客服加入團隊 - %{teamName}",
"DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation."
},
"WIZARD": [
@@ -24,12 +24,12 @@
"body": "Create a new team of agents."
},
{
- "title": "建立客服代理",
+ "title": "建立客服",
"route": "settings_teams_add_agents",
- "body": "Add agents to the team."
+ "body": "將客服加入團隊"
},
{
- "title": "Finish",
+ "title": "完成",
"route": "settings_teams_finish",
"body": "您已設定狀態為離開"
}
@@ -37,28 +37,28 @@
},
"EDIT_FLOW": {
"CREATE": {
- "TITLE": "Edit your team details",
+ "TITLE": "編輯團隊詳細資訊",
"DESC": "Edit title and description to your team.",
- "BUTTON_TEXT": "Update team"
+ "BUTTON_TEXT": "更新團隊"
},
"AGENTS": {
- "BUTTON_TEXT": "Update agents in team",
- "TITLE": "Add agents to team - %{teamName}",
+ "BUTTON_TEXT": "更新團隊客服",
+ "TITLE": "將客服加入團隊 - %{teamName}",
"DESC": "Add Agents to your newly created team. All the added agents will be notified when a conversation is assigned to this team."
},
"WIZARD": [
{
- "title": "Team details",
+ "title": "團隊詳細資訊",
"route": "settings_teams_edit",
"body": "Change name, description and other details."
},
{
- "title": "Edit Agents",
+ "title": "編輯客服",
"route": "settings_teams_edit_members",
"body": "Edit agents in your team."
},
{
- "title": "Finish",
+ "title": "完成",
"route": "settings_teams_edit_finish",
"body": "您已設定狀態為離開"
}
@@ -68,57 +68,57 @@
"ERROR_MESSAGE": "Couldn't save the team details. Try again."
},
"AGENTS": {
- "AGENT": "AGENT",
+ "AGENT": "客服",
"EMAIL": "電子信箱",
- "BUTTON_TEXT": "建立客服代理",
- "ADD_AGENTS": "Adding Agents to your Team...",
- "SELECT": "select",
- "SELECT_ALL": "select all agents",
+ "BUTTON_TEXT": "新增客服",
+ "ADD_AGENTS": "正在將客服加入到你的團隊...",
+ "SELECT": "選擇",
+ "SELECT_ALL": "選取所有客服",
"SELECTED_COUNT": "%{selected} out of %{total} agents selected."
},
"ADD": {
- "TITLE": "Add agents to team - %{teamName}",
+ "TITLE": "將客服加入團隊 - %{teamName}",
"DESC": "Add Agents to your newly created team. This lets you collaborate as a team on conversations, get notified on new events in the same conversation.",
- "SELECT": "select",
- "SELECT_ALL": "select all agents",
+ "SELECT": "選擇",
+ "SELECT_ALL": "選取所有克服",
"SELECTED_COUNT": "%{selected} out of %{total} agents selected.",
- "BUTTON_TEXT": "建立客服代理",
+ "BUTTON_TEXT": "新增客服",
"AGENT_VALIDATION_ERROR": "Select atleaset one agent."
},
"FINISH": {
- "TITLE": "Your team is ready!",
+ "TITLE": "你的團隊已經準備好了",
"MESSAGE": "You can now collaborate as a team on conversations. Happy supporting ",
- "BUTTON_TEXT": "Finish"
+ "BUTTON_TEXT": "完成"
},
"DELETE": {
"BUTTON_TEXT": "刪除",
"API": {
- "SUCCESS_MESSAGE": "Team deleted successfully.",
- "ERROR_MESSAGE": "Couldn't delete the team. Try again."
+ "SUCCESS_MESSAGE": "團隊刪除成功",
+ "ERROR_MESSAGE": "無法刪除團隊,請再試一次"
},
"CONFIRM": {
- "TITLE": "Are you sure want to delete - %{teamName}",
+ "TITLE": "確定要刪除 - %{teamName} ?",
"MESSAGE": "Deleting the team will remove the team assignment from the conversations assigned to this team.",
"YES": "刪除 ",
- "NO": "取消操作"
+ "NO": "取消"
}
},
"SETTINGS": "設定",
"FORM": {
- "UPDATE": "Update team",
- "CREATE": "Create team",
+ "UPDATE": "更新團隊",
+ "CREATE": "建立團隊",
"NAME": {
- "LABEL": "Team name",
+ "LABEL": "團隊名稱",
"PLACEHOLDER": "Example: Sales, Customer Support"
},
"DESCRIPTION": {
- "LABEL": "Team Description",
- "PLACEHOLDER": "Short description about this team."
+ "LABEL": "團隊描述",
+ "PLACEHOLDER": "對此團隊的簡短描述"
},
"AUTO_ASSIGN": {
- "LABEL": "Allow auto assign for this team."
+ "LABEL": "允許在團隊中自動指派"
},
- "SUBMIT_CREATE": "Create team"
+ "SUBMIT_CREATE": "建立團隊"
}
}
}
diff --git a/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue b/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue
new file mode 100644
index 000000000..dd02ac338
--- /dev/null
+++ b/app/javascript/dashboard/modules/contact/components/ContactAttribute.vue
@@ -0,0 +1,125 @@
+
+
import { IFrameHelper } from 'widget/helpers/utils';
-import AgentBubble from 'widget/components/AgentMessageBubble.vue';
+import UnreadMessage from 'widget/components/UnreadMessage.vue';
+
import configMixin from '../mixins/configMixin';
import { mapGetters } from 'vuex';
export default {
name: 'Unread',
components: {
- AgentBubble,
+ UnreadMessage,
},
mixins: [configMixin],
props: {
@@ -64,6 +68,10 @@ export default {
showCloseButton() {
return this.unreadMessageCount && this.hideMessageBubble;
},
+ sender() {
+ const [firstMessage] = this.unreadMessages;
+ return firstMessage.sender || {};
+ },
},
methods: {
openFullView() {
diff --git a/app/jobs/hook_job.rb b/app/jobs/hook_job.rb
index 6fc8934d2..46d10c464 100644
--- a/app/jobs/hook_job.rb
+++ b/app/jobs/hook_job.rb
@@ -1,11 +1,29 @@
class HookJob < ApplicationJob
queue_as :integrations
- def perform(hook, message)
- return unless hook.slack?
-
- Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform
+ def perform(hook, event_name, event_data = {})
+ case hook.app_id
+ when 'slack'
+ process_slack_integration(hook, event_name, event_data)
+ when 'dialogflow'
+ process_dialogflow_integration(hook, event_name, event_data)
+ end
rescue StandardError => e
Raven.capture_exception(e)
end
+
+ private
+
+ def process_slack_integration(hook, event_name, event_data)
+ return unless ['message.created'].include?(event_name)
+
+ message = event_data[:message]
+ Integrations::Slack::SendOnSlackService.new(message: message, hook: hook).perform
+ end
+
+ def process_dialogflow_integration(hook, event_name, event_data)
+ return unless ['message.created', 'message.updated'].include?(event_name)
+
+ Integrations::Dialogflow::ProcessorService.new(event_name: event_name, hook: hook, event_data: event_data).perform
+ end
end
diff --git a/app/listeners/action_cable_listener.rb b/app/listeners/action_cable_listener.rb
index 8ce2461a8..3efae0b30 100644
--- a/app/listeners/action_cable_listener.rb
+++ b/app/listeners/action_cable_listener.rb
@@ -32,25 +32,11 @@ class ActionCableListener < BaseListener
broadcast(account, tokens, MESSAGE_UPDATED, message.push_event_data)
end
- def conversation_resolved(event)
+ def conversation_status_changed(event)
conversation, account = extract_conversation_and_account(event)
tokens = user_tokens(account, conversation.inbox.members) + [conversation.contact&.pubsub_token]
- broadcast(account, tokens, CONVERSATION_RESOLVED, conversation.push_event_data)
- end
-
- def conversation_opened(event)
- conversation, account = extract_conversation_and_account(event)
- tokens = user_tokens(account, conversation.inbox.members) + [conversation.contact&.pubsub_token]
-
- broadcast(account, tokens, CONVERSATION_OPENED, conversation.push_event_data)
- end
-
- def conversation_lock_toggle(event)
- conversation, account = extract_conversation_and_account(event)
- tokens = user_tokens(account, conversation.inbox.members)
-
- broadcast(account, tokens, CONVERSATION_LOCK_TOGGLE, conversation.lock_event_data)
+ broadcast(account, tokens, CONVERSATION_STATUS_CHANGED, conversation.push_event_data)
end
def conversation_typing_on(event)
diff --git a/app/listeners/campaign_listener.rb b/app/listeners/campaign_listener.rb
new file mode 100644
index 000000000..1405911c2
--- /dev/null
+++ b/app/listeners/campaign_listener.rb
@@ -0,0 +1,14 @@
+class CampaignListener < BaseListener
+ def campaign_triggered(event)
+ contact_inbox = event.data[:contact_inbox]
+ campaign_display_id = event.data[:event_info][:campaign_id]
+
+ return if campaign_display_id.blank?
+
+ ::Campaigns::CampaignConversationBuilder.new(
+ contact_inbox_id: contact_inbox.id,
+ campaign_display_id: campaign_display_id,
+ conversation_additional_attributes: event.data[:event_info].except(:campaign_id)
+ ).perform
+ end
+end
diff --git a/app/listeners/hook_listener.rb b/app/listeners/hook_listener.rb
index efe1c74e8..a98de860a 100644
--- a/app/listeners/hook_listener.rb
+++ b/app/listeners/hook_listener.rb
@@ -4,7 +4,16 @@ class HookListener < BaseListener
return unless message.reportable?
message.account.hooks.each do |hook|
- HookJob.perform_later(hook, message)
+ HookJob.perform_later(hook, event.name, message: message)
+ end
+ end
+
+ def message_updated(event)
+ message = extract_message_and_account(event)[0]
+ return unless message.reportable?
+
+ message.account.hooks.each do |hook|
+ HookJob.perform_later(hook, event.name, message: message)
end
end
end
diff --git a/app/listeners/webhook_listener.rb b/app/listeners/webhook_listener.rb
index a463fea00..f688d7763 100644
--- a/app/listeners/webhook_listener.rb
+++ b/app/listeners/webhook_listener.rb
@@ -1,4 +1,5 @@
class WebhookListener < BaseListener
+ # FIXME: deprecate the opened and resolved events in future in favor of status changed event.
def conversation_resolved(event)
conversation = extract_conversation_and_account(event)[0]
inbox = conversation.inbox
@@ -6,6 +7,7 @@ class WebhookListener < BaseListener
deliver_webhook_payloads(payload, inbox)
end
+ # FIXME: deprecate the opened and resolved events in future in favor of status changed event.
def conversation_opened(event)
conversation = extract_conversation_and_account(event)[0]
inbox = conversation.inbox
@@ -13,6 +15,13 @@ class WebhookListener < BaseListener
deliver_webhook_payloads(payload, inbox)
end
+ def conversation_status_changed(event)
+ conversation = extract_conversation_and_account(event)[0]
+ inbox = conversation.inbox
+ payload = conversation.webhook_data.merge(event: __method__.to_s)
+ deliver_webhook_payloads(payload, inbox)
+ end
+
def message_created(event)
message = extract_message_and_account(event)[0]
inbox = message.inbox
@@ -50,7 +59,9 @@ class WebhookListener < BaseListener
WebhookJob.perform_later(webhook.url, payload)
end
- # Deliver for API Inbox
- WebhookJob.perform_later(inbox.channel.webhook_url, payload) if inbox.channel_type == 'Channel::Api'
+ return unless inbox.channel_type == 'Channel::Api'
+ return if inbox.channel.webhook_url.blank?
+
+ WebhookJob.perform_later(inbox.channel.webhook_url, payload)
end
end
diff --git a/app/models/account.rb b/app/models/account.rb
index 35a731aba..b7a023bda 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -36,6 +36,7 @@ class Account < ApplicationRecord
has_many :data_imports, dependent: :destroy
has_many :users, through: :account_users
has_many :inboxes, dependent: :destroy
+ has_many :campaigns, dependent: :destroy
has_many :conversations, dependent: :destroy
has_many :messages, dependent: :destroy
has_many :contacts, dependent: :destroy
@@ -104,4 +105,8 @@ class Account < ApplicationRecord
trigger.after(:insert).for_each(:row) do
"execute format('create sequence IF NOT EXISTS conv_dpid_seq_%s', NEW.id);"
end
+
+ trigger.name('camp_dpid_before_insert').after(:insert).for_each(:row) do
+ "execute format('create sequence IF NOT EXISTS camp_dpid_seq_%s', NEW.id);"
+ end
end
diff --git a/app/models/campaign.rb b/app/models/campaign.rb
new file mode 100644
index 000000000..bde63ce10
--- /dev/null
+++ b/app/models/campaign.rb
@@ -0,0 +1,51 @@
+# == Schema Information
+#
+# Table name: campaigns
+#
+# id :bigint not null, primary key
+# description :text
+# enabled :boolean default(TRUE)
+# message :text not null
+# title :string not null
+# trigger_rules :jsonb
+# created_at :datetime not null
+# updated_at :datetime not null
+# account_id :bigint not null
+# display_id :integer not null
+# inbox_id :bigint not null
+# sender_id :integer
+#
+# Indexes
+#
+# index_campaigns_on_account_id (account_id)
+# index_campaigns_on_inbox_id (inbox_id)
+#
+# Foreign Keys
+#
+# fk_rails_... (account_id => accounts.id)
+# fk_rails_... (inbox_id => inboxes.id)
+#
+class Campaign < ApplicationRecord
+ validates :account_id, presence: true
+ validates :inbox_id, presence: true
+ validates :title, presence: true
+ validates :message, presence: true
+ belongs_to :account
+ belongs_to :inbox
+ belongs_to :sender, class_name: 'User', optional: true
+
+ has_many :conversations, dependent: :nullify, autosave: true
+
+ after_commit :set_display_id, unless: :display_id?
+
+ private
+
+ def set_display_id
+ reload
+ end
+
+ # creating db triggers
+ trigger.before(:insert).for_each(:row) do
+ "NEW.display_id := nextval('camp_dpid_seq_' || NEW.account_id);"
+ end
+end
diff --git a/app/models/channel/api.rb b/app/models/channel/api.rb
index baa6015d3..672d8f383 100644
--- a/app/models/channel/api.rb
+++ b/app/models/channel/api.rb
@@ -3,7 +3,7 @@
# Table name: channel_api
#
# id :bigint not null, primary key
-# webhook_url :string not null
+# webhook_url :string
# created_at :datetime not null
# updated_at :datetime not null
# account_id :integer not null
diff --git a/app/models/contact.rb b/app/models/contact.rb
index 47eb5352d..34d54bee6 100644
--- a/app/models/contact.rb
+++ b/app/models/contact.rb
@@ -7,6 +7,7 @@
# custom_attributes :jsonb
# email :string
# identifier :string
+# last_activity_at :datetime
# name :string
# phone_number :string
# pubsub_token :string
diff --git a/app/models/conversation.rb b/app/models/conversation.rb
index bb210f6bc..613e2a1c1 100644
--- a/app/models/conversation.rb
+++ b/app/models/conversation.rb
@@ -8,13 +8,13 @@
# contact_last_seen_at :datetime
# identifier :string
# last_activity_at :datetime not null
-# locked :boolean default(FALSE)
# status :integer default("open"), not null
# uuid :uuid not null
# created_at :datetime not null
# updated_at :datetime not null
# account_id :integer not null
# assignee_id :integer
+# campaign_id :bigint
# contact_id :bigint
# contact_inbox_id :bigint
# display_id :integer not null
@@ -25,11 +25,13 @@
#
# index_conversations_on_account_id (account_id)
# index_conversations_on_account_id_and_display_id (account_id,display_id) UNIQUE
+# index_conversations_on_campaign_id (campaign_id)
# index_conversations_on_contact_inbox_id (contact_inbox_id)
# index_conversations_on_team_id (team_id)
#
# Foreign Keys
#
+# fk_rails_... (campaign_id => campaigns.id)
# fk_rails_... (contact_inbox_id => contact_inboxes.id)
# fk_rails_... (team_id => teams.id)
#
@@ -55,6 +57,7 @@ class Conversation < ApplicationRecord
belongs_to :contact
belongs_to :contact_inbox
belongs_to :team, optional: true
+ belongs_to :campaign, optional: true
has_many :messages, dependent: :destroy, autosave: true
@@ -104,14 +107,6 @@ class Conversation < ApplicationRecord
Redis::Alfred.get(mute_key).present?
end
- def lock!
- update!(locked: true)
- end
-
- def unlock!
- update!(locked: false)
- end
-
def unread_messages
messages.unread_since(agent_last_seen_at)
end
@@ -147,7 +142,7 @@ class Conversation < ApplicationRecord
end
def set_bot_conversation
- self.status = :bot if inbox.agent_bot_inbox&.active?
+ self.status = :bot if inbox.agent_bot_inbox&.active? || inbox.hooks.pluck(:app_id).include?('dialogflow')
end
def notify_conversation_creation
@@ -187,8 +182,8 @@ class Conversation < ApplicationRecord
{
CONVERSATION_OPENED => -> { saved_change_to_status? && open? },
CONVERSATION_RESOLVED => -> { saved_change_to_status? && resolved? },
+ CONVERSATION_STATUS_CHANGED => -> { saved_change_to_status? },
CONVERSATION_READ => -> { saved_change_to_contact_last_seen_at? },
- CONVERSATION_LOCK_TOGGLE => -> { saved_change_to_locked? },
CONVERSATION_CONTACT_CHANGED => -> { saved_change_to_contact_id? }
}.each do |event, condition|
condition.call && dispatcher_dispatch(event)
diff --git a/app/models/inbox.rb b/app/models/inbox.rb
index 398af0352..e1b330bbf 100644
--- a/app/models/inbox.rb
+++ b/app/models/inbox.rb
@@ -36,6 +36,7 @@ class Inbox < ApplicationRecord
belongs_to :channel, polymorphic: true, dependent: :destroy
+ has_many :campaigns, dependent: :destroy
has_many :contact_inboxes, dependent: :destroy
has_many :contacts, through: :contact_inboxes
diff --git a/app/models/integrations/app.rb b/app/models/integrations/app.rb
index 7861cc5c8..bae1ca02f 100644
--- a/app/models/integrations/app.rb
+++ b/app/models/integrations/app.rb
@@ -38,6 +38,8 @@ class Integrations::App
case params[:id]
when 'slack'
ENV['SLACK_CLIENT_SECRET'].present?
+ when 'dialogflow'
+ false
else
true
end
diff --git a/app/models/integrations/hook.rb b/app/models/integrations/hook.rb
index 2df57ec2a..55e64410c 100644
--- a/app/models/integrations/hook.rb
+++ b/app/models/integrations/hook.rb
@@ -5,7 +5,7 @@
# id :bigint not null, primary key
# access_token :string
# hook_type :integer default("account")
-# settings :text
+# settings :jsonb
# status :integer default("disabled")
# created_at :datetime not null
# updated_at :datetime not null
@@ -17,8 +17,13 @@
class Integrations::Hook < ApplicationRecord
include Reauthorizable
+ attr_readonly :app_id, :account_id, :inbox_id, :hook_type
+ before_validation :ensure_hook_type
validates :account_id, presence: true
validates :app_id, presence: true
+ validates :inbox_id, presence: true, if: -> { hook_type == 'inbox' }
+ validate :validate_settings_json_schema
+ validates :app_id, uniqueness: { scope: [:account_id], unless: -> { app.present? && app.params[:allow_multiple_hooks].present? } }
enum status: { disabled: 0, enabled: 1 }
@@ -39,4 +44,16 @@ class Integrations::Hook < ApplicationRecord
def disable
update(status: 'disabled')
end
+
+ private
+
+ def ensure_hook_type
+ self.hook_type = app.params[:hook_type] if app.present?
+ end
+
+ def validate_settings_json_schema
+ return if app.blank? || app.params[:settings_json_schema].blank?
+
+ errors.add(:settings, ': Invalid settings data') unless JSONSchemer.schema(app.params[:settings_json_schema]).valid?(settings)
+ end
end
diff --git a/app/models/message.rb b/app/models/message.rb
index 8c834e2ed..ea41b15fa 100644
--- a/app/models/message.rb
+++ b/app/models/message.rb
@@ -133,6 +133,11 @@ class Message < ApplicationRecord
dispatch_create_events
send_reply
execute_message_template_hooks
+ update_contact_activity
+ end
+
+ def update_contact_activity
+ sender.update(last_activity_at: DateTime.now) if sender&.is_a?(Contact)
end
def dispatch_create_events
diff --git a/app/policies/campaign_policy.rb b/app/policies/campaign_policy.rb
new file mode 100644
index 000000000..b210fdd99
--- /dev/null
+++ b/app/policies/campaign_policy.rb
@@ -0,0 +1,21 @@
+class CampaignPolicy < ApplicationPolicy
+ def index?
+ @account_user.administrator?
+ end
+
+ def update?
+ @account_user.administrator?
+ end
+
+ def show?
+ @account_user.administrator?
+ end
+
+ def create?
+ @account_user.administrator?
+ end
+
+ def destroy?
+ @account_user.administrator?
+ end
+end
diff --git a/app/policies/hook_policy.rb b/app/policies/hook_policy.rb
new file mode 100644
index 000000000..3f25cf8e4
--- /dev/null
+++ b/app/policies/hook_policy.rb
@@ -0,0 +1,13 @@
+class HookPolicy < ApplicationPolicy
+ def create?
+ @account_user.administrator?
+ end
+
+ def update?
+ @account_user.administrator?
+ end
+
+ def destroy?
+ @account_user.administrator?
+ end
+end
diff --git a/app/policies/inbox_policy.rb b/app/policies/inbox_policy.rb
index 2968129db..927ff9435 100644
--- a/app/policies/inbox_policy.rb
+++ b/app/policies/inbox_policy.rb
@@ -27,6 +27,10 @@ class InboxPolicy < ApplicationPolicy
true
end
+ def campaigns?
+ @account_user.administrator?
+ end
+
def create?
@account_user.administrator?
end
diff --git a/app/presenters/conversations/event_data_presenter.rb b/app/presenters/conversations/event_data_presenter.rb
index 1e3ff66ae..57c96558e 100644
--- a/app/presenters/conversations/event_data_presenter.rb
+++ b/app/presenters/conversations/event_data_presenter.rb
@@ -1,8 +1,4 @@
class Conversations::EventDataPresenter < SimpleDelegator
- def lock_data
- { id: display_id, locked: locked? }
- end
-
def push_data
{
additional_attributes: additional_attributes,
diff --git a/app/presenters/mail_presenter.rb b/app/presenters/mail_presenter.rb
index 5e92ba528..cd17eb76f 100644
--- a/app/presenters/mail_presenter.rb
+++ b/app/presenters/mail_presenter.rb
@@ -8,7 +8,7 @@ class MailPresenter < SimpleDelegator
end
def subject
- encode_to_unicode(@mail.subject)
+ encode_to_unicode(@mail.subject || '')
end
def text_content
diff --git a/app/services/message_templates/hook_execution_service.rb b/app/services/message_templates/hook_execution_service.rb
index 6d4c9ddd7..53c334f88 100644
--- a/app/services/message_templates/hook_execution_service.rb
+++ b/app/services/message_templates/hook_execution_service.rb
@@ -3,9 +3,11 @@ class MessageTemplates::HookExecutionService
def perform
return if inbox.agent_bot_inbox&.active?
+ return if conversation.campaign.present?
# TODO: let's see whether this is needed and remove this and related logic if not
# ::MessageTemplates::Template::OutOfOffice.new(conversation: conversation).perform if should_send_out_of_office_message?
+
::MessageTemplates::Template::Greeting.new(conversation: conversation).perform if should_send_greeting?
::MessageTemplates::Template::EmailCollect.new(conversation: conversation).perform if should_send_email_collect?
end
diff --git a/app/views/api/v1/accounts/campaigns/create.json.jbuilder b/app/views/api/v1/accounts/campaigns/create.json.jbuilder
new file mode 100644
index 000000000..bd136a8a2
--- /dev/null
+++ b/app/views/api/v1/accounts/campaigns/create.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/campaign.json.jbuilder', resource: @campaign
diff --git a/app/views/api/v1/accounts/campaigns/index.json.jbuilder b/app/views/api/v1/accounts/campaigns/index.json.jbuilder
new file mode 100644
index 000000000..c0e90acd7
--- /dev/null
+++ b/app/views/api/v1/accounts/campaigns/index.json.jbuilder
@@ -0,0 +1,3 @@
+json.array! @campaigns do |campaign|
+ json.partial! 'api/v1/models/campaign.json.jbuilder', resource: campaign
+end
diff --git a/app/views/api/v1/accounts/campaigns/show.json.jbuilder b/app/views/api/v1/accounts/campaigns/show.json.jbuilder
new file mode 100644
index 000000000..bd136a8a2
--- /dev/null
+++ b/app/views/api/v1/accounts/campaigns/show.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/campaign.json.jbuilder', resource: @campaign
diff --git a/app/views/api/v1/accounts/campaigns/update.json.jbuilder b/app/views/api/v1/accounts/campaigns/update.json.jbuilder
new file mode 100644
index 000000000..bd136a8a2
--- /dev/null
+++ b/app/views/api/v1/accounts/campaigns/update.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/campaign.json.jbuilder', resource: @campaign
diff --git a/app/views/api/v1/accounts/inboxes/campaigns.json.jbuilder b/app/views/api/v1/accounts/inboxes/campaigns.json.jbuilder
new file mode 100644
index 000000000..c0e90acd7
--- /dev/null
+++ b/app/views/api/v1/accounts/inboxes/campaigns.json.jbuilder
@@ -0,0 +1,3 @@
+json.array! @campaigns do |campaign|
+ json.partial! 'api/v1/models/campaign.json.jbuilder', resource: campaign
+end
diff --git a/app/views/api/v1/accounts/integrations/apps/index.json.jbuilder b/app/views/api/v1/accounts/integrations/apps/index.json.jbuilder
index dca7a4fdc..09acda0cb 100644
--- a/app/views/api/v1/accounts/integrations/apps/index.json.jbuilder
+++ b/app/views/api/v1/accounts/integrations/apps/index.json.jbuilder
@@ -1,10 +1,5 @@
json.payload do
json.array! @apps do |app|
- json.id app.id
- json.name app.name
- json.description app.description
- json.logo app.logo
- json.enabled app.enabled?(@current_account)
- json.action app.action
+ json.partial! 'api/v1/models/app.json.jbuilder', resource: app
end
end
diff --git a/app/views/api/v1/accounts/integrations/apps/show.json.jbuilder b/app/views/api/v1/accounts/integrations/apps/show.json.jbuilder
index 93d139e9a..442b50a49 100644
--- a/app/views/api/v1/accounts/integrations/apps/show.json.jbuilder
+++ b/app/views/api/v1/accounts/integrations/apps/show.json.jbuilder
@@ -1,7 +1 @@
-json.id @app.id
-json.name @app.name
-json.logo @app.logo
-json.description @app.description
-json.fields @app.fields
-json.enabled @app.enabled?(@current_account)
-json.button @app.action
+json.partial! 'api/v1/models/app.json.jbuilder', resource: @app
diff --git a/app/views/api/v1/accounts/integrations/hooks/create.json.jbuilder b/app/views/api/v1/accounts/integrations/hooks/create.json.jbuilder
new file mode 100644
index 000000000..6362fabd4
--- /dev/null
+++ b/app/views/api/v1/accounts/integrations/hooks/create.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/hook.json.jbuilder', resource: @hook
diff --git a/app/views/api/v1/accounts/integrations/hooks/update.json.jbuilder b/app/views/api/v1/accounts/integrations/hooks/update.json.jbuilder
new file mode 100644
index 000000000..6362fabd4
--- /dev/null
+++ b/app/views/api/v1/accounts/integrations/hooks/update.json.jbuilder
@@ -0,0 +1 @@
+json.partial! 'api/v1/models/hook.json.jbuilder', resource: @hook
diff --git a/app/views/api/v1/models/_app.json.jbuilder b/app/views/api/v1/models/_app.json.jbuilder
new file mode 100644
index 000000000..6fce9fee2
--- /dev/null
+++ b/app/views/api/v1/models/_app.json.jbuilder
@@ -0,0 +1,6 @@
+json.call(resource.params, *resource.params.keys)
+json.name resource.name
+json.description resource.description
+json.enabled resource.enabled?(@current_account)
+json.button resource.action
+json.hooks @current_account.hooks.where(app_id: resource.id)
diff --git a/app/views/api/v1/models/_campaign.json.jbuilder b/app/views/api/v1/models/_campaign.json.jbuilder
new file mode 100644
index 000000000..ecadb7b9e
--- /dev/null
+++ b/app/views/api/v1/models/_campaign.json.jbuilder
@@ -0,0 +1,15 @@
+json.id resource.display_id
+json.title resource.title
+json.description resource.description
+json.account_id resource.account_id
+json.inbox do
+ json.partial! 'api/v1/models/inbox.json.jbuilder', resource: resource.inbox
+end
+json.sender do
+ json.partial! 'api/v1/models/agent.json.jbuilder', resource: resource.sender if resource.sender.present?
+end
+json.message resource.message
+json.enabled resource.enabled
+json.trigger_rules resource.trigger_rules
+json.created_at resource.created_at
+json.updated_at resource.updated_at
diff --git a/app/views/api/v1/models/_contact.json.jbuilder b/app/views/api/v1/models/_contact.json.jbuilder
index eaf4012f4..95d761e10 100644
--- a/app/views/api/v1/models/_contact.json.jbuilder
+++ b/app/views/api/v1/models/_contact.json.jbuilder
@@ -7,7 +7,7 @@ json.phone_number resource.phone_number
json.thumbnail resource.avatar_url
json.custom_attributes resource.custom_attributes
json.conversations_count resource.conversations_count if resource[:conversations_count].present?
-json.last_seen_at resource.last_seen_at.to_i if resource[:last_seen_at].present?
+json.last_activity_at resource.last_activity_at.to_i if resource[:last_activity_at].present?
# we only want to output contact inbox when its /contacts endpoints
if defined?(with_contact_inboxes) && with_contact_inboxes.present?
diff --git a/app/views/api/v1/models/_hook.json.jbuilder b/app/views/api/v1/models/_hook.json.jbuilder
new file mode 100644
index 000000000..d9860b8a2
--- /dev/null
+++ b/app/views/api/v1/models/_hook.json.jbuilder
@@ -0,0 +1,4 @@
+json.id resource.id
+json.app resource.app.params.to_h
+json.enabled resource.enabled?
+json.inbox_id resource.inbox_id
diff --git a/app/views/api/v1/widget/campaigns/index.json.jbuilder b/app/views/api/v1/widget/campaigns/index.json.jbuilder
new file mode 100644
index 000000000..0d7aa24e3
--- /dev/null
+++ b/app/views/api/v1/widget/campaigns/index.json.jbuilder
@@ -0,0 +1,4 @@
+json.array! @campaigns do |campaign|
+ json.id campaign.display_id
+ json.trigger_rules campaign.trigger_rules
+end
diff --git a/app/views/super_admin/application/index.html.erb b/app/views/super_admin/application/index.html.erb
index 80a5ae24c..951792711 100644
--- a/app/views/super_admin/application/index.html.erb
+++ b/app/views/super_admin/application/index.html.erb
@@ -46,7 +46,7 @@ It renders the `_table` partial to display details about the resources.
"administrate.actions.new_resource",
name: page.resource_name.titleize.downcase
),
- [:new, namespace, page.resource_path],
+ [:new, namespace, page.resource_path.to_sym],
class: "button",
) if valid_action?(:new) && show_action?(:new, new_resource) %>
diff --git a/app/views/super_admin/users/index.html.erb b/app/views/super_admin/users/index.html.erb
index 80a5ae24c..951792711 100644
--- a/app/views/super_admin/users/index.html.erb
+++ b/app/views/super_admin/users/index.html.erb
@@ -46,7 +46,7 @@ It renders the `_table` partial to display details about the resources.
"administrate.actions.new_resource",
name: page.resource_name.titleize.downcase
),
- [:new, namespace, page.resource_path],
+ [:new, namespace, page.resource_path.to_sym],
class: "button",
) if valid_action?(:new) && show_action?(:new, new_resource) %>
diff --git a/config/app.yml b/config/app.yml
index e77e8891e..3956f6e56 100644
--- a/config/app.yml
+++ b/config/app.yml
@@ -1,5 +1,5 @@
shared: &shared
- version: '1.15.1'
+ version: '1.16.0'
development:
<<: *shared
diff --git a/config/integration/apps.yml b/config/integration/apps.yml
index d58254bde..1c6276894 100644
--- a/config/integration/apps.yml
+++ b/config/integration/apps.yml
@@ -1,10 +1,53 @@
+###### Attributes Supported by Integration Apps #######
+# id: Internal Id for the integrations, used by the hooks
+# logo: place the image in /public/dashboard/images/integrations and reference here
+# i18n_key: the key under which translations for the integration is placed in en.yml
+# action: if integration requires external redirect url
+# hook_type: ( account / inbox )
+# allow_multiple_hooks: whether multiple hooks can be created for the integration
+# settings_json_schema: the json schema used to validate the settings hash (https://json-schema.org/)
+# settings_form_schema: the formulate schema used in frontend to render settings form (https://vueformulate.com/)
+########################################################
+
slack:
id: slack
logo: slack.png
i18n_key: slack
action: https://slack.com/oauth/v2/authorize?scope=commands,chat:write,channels:read,channels:manage,channels:join,groups:write,im:write,mpim:write,users:read,users:read.email,chat:write.customize,channels:history,groups:history,mpim:history,im:history
+ hook_type: account
+ allow_multiple_hooks: false
webhooks:
id: webhook
logo: cable.svg
i18n_key: webhooks
action: /webhook
+ hook_type: account
+ allow_multiple_hooks: true
+dialogflow:
+ id: dialogflow
+ logo: dialogflow.svg
+ i18n_key: dialogflow
+ action: /dialogflow
+ hook_type: inbox
+ allow_multiple_hooks: true
+ settings_json_schema: {
+ "type": "object",
+ "properties": {
+ "project_id": { "type": "string" },
+ "credentials": { "type": "object" }
+ },
+ "required": ["project_id", "credentials"],
+ "additionalProperties": false
+ }
+ settings_form_schema: [
+ {
+ "label": "Dialogflow Project ID",
+ "type": "text",
+ "name": "project_id"
+ },
+ {
+ "label": "Dialogflow Project Key File",
+ "type": "textarea",
+ "name": "credentials",
+ }
+ ]
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 5f06fe953..173f7dfc0 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -76,3 +76,6 @@ ar:
webhooks:
name: "Webhook"
description: "أحداث Webhook توفر لك معلومات في الوقت الحقيقي حول ما يحدث في حساب Chatwoot الخاص بك. يمكنك استخدام خاصية الـ Webhook لإيصال الأحداث إلى تطبيقاتك المفضلة مثل Slack أو Github. انقر على \"تهيئة\" لإعداد الـ Webhooks الخاصة بك."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 028b05768..b1e668cff 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -76,3 +76,6 @@ ca:
webhooks:
name: "Webhooks"
description: "Els esdeveniments de Webhook us proporcionen informació en temps real sobre el que passa al vostre compte de Chatwoot. Podeu utilitzar els webhooks per comunicar els esdeveniments a les vostres aplicacions preferides com Slack o Github. Feu clic a Configura per configurar els enllaços web."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 3d7058547..c89ae1d28 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -76,3 +76,6 @@ cs:
webhooks:
name: "Webhooky"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/da.yml b/config/locales/da.yml
index c1d072660..2e44e61fc 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -76,3 +76,6 @@ da:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/de.yml b/config/locales/de.yml
index dca877e48..7e3effdb4 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -76,3 +76,6 @@ de:
webhooks:
name: "Webhooks"
description: "Webhook-Ereignisse bieten Ihnen Echtzeitinformationen darüber, was in Ihrem Chatwoot-Konto passiert. Sie können die Webhooks verwenden, um die Ereignisse an Ihre Lieblings-Apps wie Slack oder Github zu kommunizieren. Klicken Sie auf Konfigurieren, um Ihre Webhooks einzurichten."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Schließen Sie Ihren Dialogflow-Bot an Ihren Posteingang an. Lassen Sie die Bots die Abfragen bearbeiten, bevor Sie ihn an den Kundendienst-Agent übergeben."
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 02920b084..67d75369f 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -76,3 +76,6 @@ el:
webhooks:
name: "Webhooks"
description: "Τα συμβάντα Webhook μας εφοδιάζουν με πληροφορίες πραγματικού χρόνου σχετικά με το τι συμβαίνει στο λογαριασμό σας. Μπορείτε να χρησιμοποιήσετε τα webhooks για να μεταφέρετε τα συμβάντα σε άλλες εφαρμογές ή υπηρεσίες όπως το Slack ή Github. Πατήστε στην Διαμόρφωση για να ενημερώστε τα δικά σας webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Συνδέστε το Dialogflow bot στα εισερχόμενά σας. Αφήστε τα bots να χειριστούν τα ερωτήματα πριν τα παραδώσουν στον πράκτορα εξυπηρέτησης πελατών."
diff --git a/config/locales/en.yml b/config/locales/en.yml
index b0aa0ef53..ecea2c545 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -93,3 +93,6 @@ en:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 2a88d4fab..d767c6564 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -76,3 +76,6 @@ es:
webhooks:
name: "Webhook"
description: "Los eventos Webhook le proporcionan información en tiempo real sobre lo que está sucediendo en su cuenta de Chatwoot. Puede hacer uso de los webhooks para comunicar los eventos a sus aplicaciones favoritas como Slack o Github. Haga clic en Configurar para configurar sus webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Conecte su bot de Dialogflow a su bandeja de entrada. Deje que los bots manejen las preguntas antes de entregarlo al agente de servicio al cliente."
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 171f10b30..c54f88eee 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -76,3 +76,6 @@ fa:
webhooks:
name: "وب هوک"
description: "رویدادهای Webhook اطلاعات واقعی در مورد آنچه در حساب شما اتفاق می افتد را به شما ارائه می دهند. برای برقراری ارتباط رویدادها با برنامه های مورد علاقه خود مانند Slack یا Github می توانید از وب بوک ها استفاده کنید. برای تنظیم webhooks خود روی تنظیمات کلیک کنید."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 57e2f530e..f4e8acc24 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -76,3 +76,6 @@ fi:
webhooks:
name: "Webhookit"
description: "Webhook-tapahtumat antavat sinulle reaaliaikaista tietoa siitä, mitä Chatwoot-tililläsi tapahtuu. Voit käyttää webhookeja ja välittää tapahtumat suosikkiohjelmillesi, kuten Slackiin tai Githubiiin. Klikkaa \"Määrittele\" määrittääksesi webhookisi."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index c61e3f6cf..be61cd964 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -76,3 +76,6 @@ fr:
webhooks:
name: "Webhooks"
description: "Les événements Webhook vous fournissent des informations en temps réel sur ce qui se passe dans votre compte. Vous pouvez utiliser les webhooks pour communiquer les événements à vos applications préférées comme Slack ou Github. Cliquez sur Configurer pour configurer vos webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/hi.yml b/config/locales/hi.yml
index f41c4124a..e95095e69 100644
--- a/config/locales/hi.yml
+++ b/config/locales/hi.yml
@@ -76,3 +76,6 @@ hi:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index af9d466f1..39fba0317 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -76,3 +76,6 @@ hu:
webhooks:
name: "Webhook"
description: "A Webhook események valós idejű információt adnak arról, hogy mi történik a fiókodban. Webhookokat használhatsz arra, hogy az eseményeket a kedvenc appjaidban, pl. a Slackben vagy a Githubban használd. Kattints hogy beállíthast a Webhookjaidat."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 4ccdf3b62..17a3dafd0 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -76,3 +76,6 @@ id:
webhooks:
name: "Webhooks"
description: "Webhook event memberi Anda informasi realtime tentang apa yang terjadi di akun Anda. Anda dapat menggunakan webhook untuk mengkomunikasikan acara ke aplikasi favorit Anda seperti Slack atau GitHub. Klik Konfigurasi untuk mengatur webhook Anda."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 94236ea9b..2f3a35229 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -76,3 +76,6 @@ it:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index d7687a12f..2363623c9 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -76,3 +76,6 @@ ja:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index ace331ca3..3855ac9bb 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -76,3 +76,6 @@ ko:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/ml.yml b/config/locales/ml.yml
index 51f8de550..f0468010e 100644
--- a/config/locales/ml.yml
+++ b/config/locales/ml.yml
@@ -76,3 +76,6 @@ ml:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/ne.yml b/config/locales/ne.yml
index 6f22d1f4a..99d2afd98 100644
--- a/config/locales/ne.yml
+++ b/config/locales/ne.yml
@@ -76,3 +76,6 @@ ne:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index ec9e86c9c..76c42c075 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -76,3 +76,6 @@ nl:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 81923a706..d8a99d271 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -76,3 +76,6 @@
webhooks:
name: "Webhooks"
description: "Webhook-hendelser gir deg sanntidsinformasjon om hva som skjer med kontoen din. Du kan bruke webhooks for å sende hendelsene til favorittappene dine, som Slack eller Github. Klikk på Konfigurer for å sette opp webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index e814d2718..38fada5d3 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -30,10 +30,10 @@ pl:
reports:
period: Okres raportowania od %{since} do %{until}
agent_csv:
- agent_name: Agent name
- conversations_count: Conversations count
- avg_first_response_time: Avg first response time (Minutes)
- avg_resolution_time: Avg resolution time (Minutes)
+ agent_name: Nazwa agenta
+ conversations_count: Liczba rozmów
+ avg_first_response_time: Średni czas pierwszej odpowiedzi (minuty)
+ avg_resolution_time: Średni czas do rozwiązania problemu (minuty)
notifications:
notification_title:
conversation_creation: "[Nowa rozmowa] - #%{display_id} został utworzony w %{inbox_name}"
@@ -47,7 +47,7 @@ pl:
status:
resolved: "Rozmowa została oznaczona przez %{user_name}"
open: "Rozmowa została ponownie otwarta przez %{user_name}"
- bot: "Conversation was transferred to bot by %{user_name}"
+ bot: "Rozmowa została przeniesiona do bota przez %{user_name}"
auto_resolved: "Rozmowa została oznaczona przez system jako rozwiązana z powodu %{duration} dni bezczynności"
assignee:
self_assigned: "%{user_name} przypisał się do tej rozmowy"
@@ -72,7 +72,10 @@ pl:
integration_apps:
slack:
name: "Slack"
- description: "Slack is a chat tool that brings all your communication together in one place. By integrating Slack, you can get notified of all the new conversations in your account right inside your Slack."
+ description: "Slack to narzędzie czatu, które łączy całą Twoją komunikację w jednym miejscu. Integrując Slack, możesz otrzymywać powiadomienia o wszystkich nowych rozmowach na swoim koncie bezpośrednio wewnątrz Slack."
webhooks:
- name: "Webhooks"
- description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ name: "Webhooki"
+ description: "Webhooki dostarczają informacji o tym, co dzieje się na Twoim koncie do usług zewnętrznych. Możesz wykorzystać webhooki do przekazywania wydarzeń do ulubionych aplikacji, takich jak Slack lub Github. Kliknij na Konfiguruj, aby skonfigurować webhooki."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index 814512cc5..dc41ca866 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -76,3 +76,6 @@ pt:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml
index 5183116f5..a05d1400a 100644
--- a/config/locales/pt_BR.yml
+++ b/config/locales/pt_BR.yml
@@ -47,7 +47,7 @@ pt_BR:
status:
resolved: "Conversa foi marcada como resolvida por %{user_name}"
open: "Conversa foi reaberta por %{user_name}"
- bot: "Conversation was transferred to bot by %{user_name}"
+ bot: "Conversa foi marcada como resolvida por %{user_name}"
auto_resolved: "Conversa foi marcada como resolvida pelo sistema por ter %{duration} dias de inatividade"
assignee:
self_assigned: "%{user_name} atribuiu a si mesmo essa conversa"
@@ -76,3 +76,6 @@ pt_BR:
webhooks:
name: "Webhooks"
description: "Webhooks fornecem informações em tempo real sobre o que está acontecendo em sua conta. Você pode usar os webhooks para comunicar eventos com seus aplicativos favoritos como Slack ou Github. Clique em Configurar para configurar seus webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/ro.yml b/config/locales/ro.yml
index 1e0d5f502..17d69bea5 100644
--- a/config/locales/ro.yml
+++ b/config/locales/ro.yml
@@ -76,3 +76,6 @@ ro:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index 229abee83..ff3f8693c 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -30,16 +30,16 @@ ru:
reports:
period: Отчётный период с %{since} по %{until}
agent_csv:
- agent_name: Agent name
- conversations_count: Conversations count
- avg_first_response_time: Avg first response time (Minutes)
- avg_resolution_time: Avg resolution time (Minutes)
+ agent_name: Имя оператора
+ conversations_count: Количество бесед
+ avg_first_response_time: Среднее время первого ответа (в минутах)
+ avg_resolution_time: Среднее время решения (в минутах)
notifications:
notification_title:
- conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}"
- conversation_assignment: "[Assigned to you] - #%{display_id} has been assigned to you"
- assigned_conversation_new_message: "[New message] - #%{display_id} %{content}"
- conversation_mention: "You have been mentioned in conversation [ID - %{display_id}] by %{name}"
+ conversation_creation: "[Новая беседа] - #%{display_id} была создана в %{inbox_name}"
+ conversation_assignment: "[Назначено Вам] - #%{display_id} была назначена Вам"
+ assigned_conversation_new_message: "[Новое сообщение] - #%{display_id} %{content}"
+ conversation_mention: "Вас упомянули в разговоре [ID - %{display_id}] %{name}"
conversations:
messages:
deleted: Это сообщение было удалено
@@ -47,7 +47,7 @@ ru:
status:
resolved: "%{user_name} завершил диалог"
open: "%{user_name} открыл заново диалог"
- bot: "Conversation was transferred to bot by %{user_name}"
+ bot: "Разговор передан боту %{user_name}"
auto_resolved: "Разговор был помечен системой решённым из-за неактивности в течение %{duration} дней"
assignee:
self_assigned: "%{user_name} назначил(а) разговор себе"
@@ -55,8 +55,8 @@ ru:
removed: "Ответственный снят %{user_name}"
team:
assigned: "%{user_name} назначил %{team_name} ответственным"
- assigned_with_assignee: "Assigned to %{assignee_name} via %{team_name} by %{user_name}"
- removed: "Unassigned from %{team_name} by %{user_name}"
+ assigned_with_assignee: "%{user_name} назначил %{assignee_name} в %{team_name}"
+ removed: "%{user_name} исключил из %{team_name}"
labels:
added: "%{user_name} добавил %{labels}"
removed: "%{user_name} удалил %{labels}"
@@ -76,3 +76,6 @@ ru:
webhooks:
name: "Webhooks"
description: "События webhook позволяют получать информацию о происходящем в вашем аккаунте в реальном времени. Вы можете использовать webhook в связке с вашими приложениями, такими как Slack или Github. Нажмите на Настроить для настройки webhook."
+ dialogflow:
+ name: "Диалог"
+ description: "Подключите бот к диалогам вашего канала. Предоставьте ботам доступ к обработке запросов, прежде чем для предварительного общения с вашими операторами."
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 2bbe9eee2..536a7ee66 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -76,3 +76,6 @@ sk:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index ab213a3a3..7f79452e4 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -76,3 +76,6 @@ sv:
webhooks:
name: "Webhookar"
description: "Webhook-händelser ger dig realtidsinformation om vad som händer i ditt konto. Du kan använda webhooks för att kommunicera händelser till dina favoritappar som Slack eller Github. Klicka på Konfigurera för att konfigurera dina webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/ta.yml b/config/locales/ta.yml
index 7369f335c..7f9426cfc 100644
--- a/config/locales/ta.yml
+++ b/config/locales/ta.yml
@@ -76,3 +76,6 @@ ta:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/th.yml b/config/locales/th.yml
index 2eb2f7921..033ad1621 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -76,3 +76,6 @@ th:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index b02ca4ccf..1f57cc436 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -76,3 +76,6 @@ tr:
webhooks:
name: "Webhooks"
description: "Webhook olayları size hesabınızda gerçekleşen gerçek zamanlı bilgileri getirmenizi sağlar. Bu webhookları kullanarak olaylar ile favori uygulamalarınızı haberleştirebilirsiniz(ör: Slack , \n Github). Yapılandıra basarak webhooklarınızı ayarlayabilirsiniz."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index df85b146f..df363f271 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -76,3 +76,6 @@ uk:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
index 3a8ed10a6..6e05c3011 100644
--- a/config/locales/vi.yml
+++ b/config/locales/vi.yml
@@ -76,3 +76,6 @@ vi:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml
index acd97eb73..6caff7a98 100644
--- a/config/locales/zh_CN.yml
+++ b/config/locales/zh_CN.yml
@@ -76,3 +76,6 @@ zh_CN:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml
index ad65ca124..cc2f1bdd5 100644
--- a/config/locales/zh_TW.yml
+++ b/config/locales/zh_TW.yml
@@ -30,10 +30,10 @@ zh_TW:
reports:
period: Reporting period %{since} to %{until}
agent_csv:
- agent_name: Agent name
- conversations_count: Conversations count
- avg_first_response_time: Avg first response time (Minutes)
- avg_resolution_time: Avg resolution time (Minutes)
+ agent_name: 客服名稱
+ conversations_count: 對話數量
+ avg_first_response_time: 平均第一次回覆時間(分鐘)
+ avg_resolution_time: 平均解決時間(分鐘)
notifications:
notification_title:
conversation_creation: "[New conversation] - #%{display_id} has been created in %{inbox_name}"
@@ -76,3 +76,6 @@ zh_TW:
webhooks:
name: "Webhooks"
description: "Webhook events provide you the realtime information about what's happening in your account. You can make use of the webhooks to communicate the events to your favourite apps like Slack or Github. Click on Configure to set up your webhooks."
+ dialogflow:
+ name: "Dialogflow"
+ description: "Connect your Dialogflow bot to your inbox. Let the bots handle the queries before handing it off to the customer service agent."
diff --git a/config/routes.rb b/config/routes.rb
index 74a778d55..140e19400 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -42,6 +42,8 @@ Rails.application.routes.draw do
end
end
resources :canned_responses, except: [:show, :edit, :new]
+ resources :campaigns, only: [:index, :create, :show, :update]
+
namespace :channels do
resource :twilio_channel, only: [:create]
end
@@ -89,6 +91,7 @@ Rails.application.routes.draw do
resources :inboxes, only: [:index, :create, :update, :destroy] do
get :assignable_agents, on: :member
+ get :campaigns, on: :member
post :set_agent_bot, on: :member
end
resources :inbox_members, only: [:create, :show], param: :inbox_id
@@ -118,6 +121,7 @@ Rails.application.routes.draw do
resources :webhooks, except: [:show]
namespace :integrations do
resources :apps, only: [:index, :show]
+ resources :hooks, only: [:create, :update, :destroy]
resource :slack, only: [:create, :update, :destroy], controller: 'slack'
end
resources :working_hours, only: [:update]
@@ -145,6 +149,7 @@ Rails.application.routes.draw do
resources :agent_bots, only: [:index]
namespace :widget do
+ resources :campaigns, only: [:index]
resources :events, only: [:create]
resources :messages, only: [:index, :create, :update]
resources :conversations, only: [:index, :create] do
diff --git a/db/migrate/20210306170117_add_last_activity_at_to_contacts.rb b/db/migrate/20210306170117_add_last_activity_at_to_contacts.rb
new file mode 100644
index 000000000..b35c064fc
--- /dev/null
+++ b/db/migrate/20210306170117_add_last_activity_at_to_contacts.rb
@@ -0,0 +1,22 @@
+class AddLastActivityAtToContacts < ActiveRecord::Migration[6.0]
+ def up
+ # rubocop:disable Rails/SkipsModelValidations
+ add_column :contacts, :last_activity_at, :datetime, index: true, default: nil
+ Conversation.find_in_batches do |conversation_batch|
+ conversation_batch.each do |conversation|
+ contact = conversation.contact
+ if contact.last_activity_at.nil? || conversation.updated_at > contact.last_activity_at
+ contact.update_columns(last_activity_at: conversation.updated_at)
+ end
+ end
+ end
+
+ Contact.where(additional_attributes: nil).update_all(additional_attributes: {})
+ Contact.where(phone_number: '').update_all(phone_number: nil)
+ # rubocop:enable Rails/SkipsModelValidations
+ end
+
+ def down
+ remove_column :contacts, :last_activity_at, :datetime, index: true, default: nil
+ end
+end
diff --git a/db/migrate/20210425093724_convert_integration_hook_settings_field.rb b/db/migrate/20210425093724_convert_integration_hook_settings_field.rb
new file mode 100644
index 000000000..3ba021291
--- /dev/null
+++ b/db/migrate/20210425093724_convert_integration_hook_settings_field.rb
@@ -0,0 +1,6 @@
+class ConvertIntegrationHookSettingsField < ActiveRecord::Migration[6.0]
+ def change
+ remove_column :integrations_hooks, :settings, :text
+ add_column :integrations_hooks, :settings, :jsonb, default: {}
+ end
+end
diff --git a/db/migrate/20210426191914_migration_remove_locked_from_conversation.rb b/db/migrate/20210426191914_migration_remove_locked_from_conversation.rb
new file mode 100644
index 000000000..402935f28
--- /dev/null
+++ b/db/migrate/20210426191914_migration_remove_locked_from_conversation.rb
@@ -0,0 +1,5 @@
+class MigrationRemoveLockedFromConversation < ActiveRecord::Migration[6.0]
+ def change
+ remove_column :conversations, :locked, :boolean
+ end
+end
diff --git a/db/migrate/20210428135041_add_campaigns.rb b/db/migrate/20210428135041_add_campaigns.rb
new file mode 100644
index 000000000..7df93a347
--- /dev/null
+++ b/db/migrate/20210428135041_add_campaigns.rb
@@ -0,0 +1,18 @@
+class AddCampaigns < ActiveRecord::Migration[6.0]
+ def change
+ create_table :campaigns do |t|
+ t.integer :display_id, null: false
+ t.string :title, null: false
+ t.text :description
+ t.text :content, null: false
+ t.integer :sender_id
+ t.boolean :enabled, default: true
+ t.references :account, null: false, foreign_key: true
+ t.references :inbox, null: false, foreign_key: true
+ t.column :trigger_rules, :jsonb, default: {}
+ t.timestamps
+ end
+
+ add_reference :conversations, :campaign, foreign_key: true
+ end
+end
diff --git a/db/migrate/20210428151147_create_triggers_accounts_insert_or_campaigns_insert.rb b/db/migrate/20210428151147_create_triggers_accounts_insert_or_campaigns_insert.rb
new file mode 100644
index 000000000..3fdc4f18e
--- /dev/null
+++ b/db/migrate/20210428151147_create_triggers_accounts_insert_or_campaigns_insert.rb
@@ -0,0 +1,28 @@
+# This migration was auto-generated via `rake db:generate_trigger_migration'.
+# While you can edit this file, any changes you make to the definitions here
+# will be undone by the next auto-generated trigger migration.
+
+class CreateTriggersAccountsInsertOrCampaignsInsert < ActiveRecord::Migration[6.0]
+ def up
+ create_trigger('camp_dpid_before_insert', generated: true, compatibility: 1)
+ .on('accounts')
+ .name('camp_dpid_before_insert')
+ .after(:insert)
+ .for_each(:row) do
+ "execute format('create sequence IF NOT EXISTS camp_dpid_seq_%s', NEW.id);"
+ end
+
+ create_trigger('campaigns_before_insert_row_tr', generated: true, compatibility: 1)
+ .on('campaigns')
+ .before(:insert)
+ .for_each(:row) do
+ "NEW.display_id := nextval('camp_dpid_seq_' || NEW.account_id);"
+ end
+ end
+
+ def down
+ drop_trigger('camp_dpid_before_insert', 'accounts', generated: true)
+
+ drop_trigger('campaigns_before_insert_row_tr', 'campaigns', generated: true)
+ end
+end
diff --git a/db/migrate/20210430095748_add_camp_dp_id_seq_for_existing_accounts.rb b/db/migrate/20210430095748_add_camp_dp_id_seq_for_existing_accounts.rb
new file mode 100644
index 000000000..1b37e8345
--- /dev/null
+++ b/db/migrate/20210430095748_add_camp_dp_id_seq_for_existing_accounts.rb
@@ -0,0 +1,20 @@
+class AddCampDpIdSeqForExistingAccounts < ActiveRecord::Migration[6.0]
+ def up
+ ::Account.find_in_batches do |accounts_batch|
+ Rails.logger.info "migrated till #{accounts_batch.first.id}\n"
+ accounts_batch.each do |account|
+ display_id = account.campaigns.count
+ ActiveRecord::Base.connection.exec_query("create sequence IF NOT EXISTS camp_dpid_seq_#{account.id} START #{display_id + 1}")
+ end
+ end
+ end
+
+ def down
+ ::Account.find_in_batches do |accounts_batch|
+ Rails.logger.info "migrated till #{accounts_batch.first.id}\n"
+ accounts_batch.each do |account|
+ ActiveRecord::Base.connection.exec_query("drop sequence IF EXISTS camp_dpid_seq_#{account.id}")
+ end
+ end
+ end
+end
diff --git a/db/migrate/20210430100138_rename_campaign_content_to_message.rb b/db/migrate/20210430100138_rename_campaign_content_to_message.rb
new file mode 100644
index 000000000..161ef299e
--- /dev/null
+++ b/db/migrate/20210430100138_rename_campaign_content_to_message.rb
@@ -0,0 +1,5 @@
+class RenameCampaignContentToMessage < ActiveRecord::Migration[6.0]
+ def change
+ rename_column :campaigns, :content, :message
+ end
+end
diff --git a/db/migrate/20210513083044_remove_not_null_from_webhook_url_channel_api.rb b/db/migrate/20210513083044_remove_not_null_from_webhook_url_channel_api.rb
new file mode 100644
index 000000000..790c52ec5
--- /dev/null
+++ b/db/migrate/20210513083044_remove_not_null_from_webhook_url_channel_api.rb
@@ -0,0 +1,5 @@
+class RemoveNotNullFromWebhookUrlChannelApi < ActiveRecord::Migration[6.0]
+ def change
+ change_column :channel_api, :webhook_url, :string, null: true
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 13c8a69a1..60f080d5c 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 2021_03_15_101919) do
+ActiveRecord::Schema.define(version: 2021_05_13_083044) do
# These are extensions that must be enabled in order to support this database
enable_extension "pg_stat_statements"
@@ -113,6 +113,22 @@ ActiveRecord::Schema.define(version: 2021_03_15_101919) do
t.string "extension"
end
+ create_table "campaigns", force: :cascade do |t|
+ t.integer "display_id", null: false
+ t.string "title", null: false
+ t.text "description"
+ t.text "message", null: false
+ t.integer "sender_id"
+ t.boolean "enabled", default: true
+ t.bigint "account_id", null: false
+ t.bigint "inbox_id", null: false
+ t.jsonb "trigger_rules", default: {}
+ t.datetime "created_at", precision: 6, null: false
+ t.datetime "updated_at", precision: 6, null: false
+ t.index ["account_id"], name: "index_campaigns_on_account_id"
+ t.index ["inbox_id"], name: "index_campaigns_on_inbox_id"
+ end
+
create_table "canned_responses", id: :serial, force: :cascade do |t|
t.integer "account_id", null: false
t.string "short_code"
@@ -123,7 +139,7 @@ ActiveRecord::Schema.define(version: 2021_03_15_101919) do
create_table "channel_api", force: :cascade do |t|
t.integer "account_id", null: false
- t.string "webhook_url", null: false
+ t.string "webhook_url"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
end
@@ -212,6 +228,7 @@ ActiveRecord::Schema.define(version: 2021_03_15_101919) do
t.jsonb "additional_attributes", default: {}
t.string "identifier"
t.jsonb "custom_attributes", default: {}
+ t.datetime "last_activity_at"
t.index ["account_id"], name: "index_contacts_on_account_id"
t.index ["email", "account_id"], name: "uniq_email_per_account_contact", unique: true
t.index ["identifier", "account_id"], name: "uniq_identifier_per_account_contact", unique: true
@@ -229,15 +246,16 @@ ActiveRecord::Schema.define(version: 2021_03_15_101919) do
t.integer "display_id", null: false
t.datetime "contact_last_seen_at"
t.datetime "agent_last_seen_at"
- t.boolean "locked", default: false
t.jsonb "additional_attributes", default: {}
t.bigint "contact_inbox_id"
t.uuid "uuid", default: -> { "gen_random_uuid()" }, null: false
t.string "identifier"
t.datetime "last_activity_at", default: -> { "CURRENT_TIMESTAMP" }, null: false
t.bigint "team_id"
+ t.bigint "campaign_id"
t.index ["account_id", "display_id"], name: "index_conversations_on_account_id_and_display_id", unique: true
t.index ["account_id"], name: "index_conversations_on_account_id"
+ t.index ["campaign_id"], name: "index_conversations_on_campaign_id"
t.index ["contact_inbox_id"], name: "index_conversations_on_contact_inbox_id"
t.index ["team_id"], name: "index_conversations_on_team_id"
end
@@ -321,12 +339,12 @@ ActiveRecord::Schema.define(version: 2021_03_15_101919) do
t.integer "inbox_id"
t.integer "account_id"
t.string "app_id"
- t.text "settings"
t.integer "hook_type", default: 0
t.string "reference_id"
t.string "access_token"
t.datetime "created_at", precision: 6, null: false
t.datetime "updated_at", precision: 6, null: false
+ t.jsonb "settings", default: {}
end
create_table "kbase_articles", force: :cascade do |t|
@@ -593,8 +611,11 @@ ActiveRecord::Schema.define(version: 2021_03_15_101919) do
add_foreign_key "account_users", "accounts"
add_foreign_key "account_users", "users"
add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
+ add_foreign_key "campaigns", "accounts"
+ add_foreign_key "campaigns", "inboxes"
add_foreign_key "contact_inboxes", "contacts"
add_foreign_key "contact_inboxes", "inboxes"
+ add_foreign_key "conversations", "campaigns"
add_foreign_key "conversations", "contact_inboxes"
add_foreign_key "conversations", "teams"
add_foreign_key "data_imports", "accounts"
@@ -615,4 +636,19 @@ ActiveRecord::Schema.define(version: 2021_03_15_101919) do
"NEW.display_id := nextval('conv_dpid_seq_' || NEW.account_id);"
end
+ create_trigger("camp_dpid_before_insert", :generated => true, :compatibility => 1).
+ on("accounts").
+ name("camp_dpid_before_insert").
+ after(:insert).
+ for_each(:row) do
+ "execute format('create sequence IF NOT EXISTS camp_dpid_seq_%s', NEW.id);"
+ end
+
+ create_trigger("campaigns_before_insert_row_tr", :generated => true, :compatibility => 1).
+ on("campaigns").
+ before(:insert).
+ for_each(:row) do
+ "NEW.display_id := nextval('camp_dpid_seq_' || NEW.account_id);"
+ end
+
end
diff --git a/db/seeds.rb b/db/seeds.rb
index 49227aef9..115a27108 100644
--- a/db/seeds.rb
+++ b/db/seeds.rb
@@ -31,7 +31,7 @@ unless Rails.env.production?
inbox = Inbox.create!(channel: web_widget, account: account, name: 'Acme Support')
InboxMember.create!(user: user, inbox: inbox)
- contact = Contact.create!(name: 'jane', email: 'jane@example.com', phone_number: '0000', account: account)
+ contact = Contact.create!(name: 'jane', email: 'jane@example.com', phone_number: '+2320000', account: account)
contact_inbox = ContactInbox.create!(inbox: inbox, contact: contact, source_id: user.id, hmac_verified: true)
conversation = Conversation.create!(
account: account,
diff --git a/lib/events/types.rb b/lib/events/types.rb
index d63255379..4d027f6f8 100644
--- a/lib/events/types.rb
+++ b/lib/events/types.rb
@@ -6,15 +6,20 @@ module Events::Types
ACCOUNT_CREATED = 'account.created'
#### Account Events ###
+ # campaign events
+ CAMPAIGN_TRIGGERED = 'campaign.triggered'
+
# channel events
WEBWIDGET_TRIGGERED = 'webwidget.triggered'
# conversation events
CONVERSATION_CREATED = 'conversation.created'
CONVERSATION_READ = 'conversation.read'
+ # FIXME: deprecate the opened and resolved events in future in favor of status changed event.
CONVERSATION_OPENED = 'conversation.opened'
CONVERSATION_RESOLVED = 'conversation.resolved'
- CONVERSATION_LOCK_TOGGLE = 'conversation.lock_toggle'
+
+ CONVERSATION_STATUS_CHANGED = 'conversation.status_changed'
CONVERSATION_CONTACT_CHANGED = 'conversation.contact_changed'
ASSIGNEE_CHANGED = 'assignee.changed'
TEAM_CHANGED = 'team.changed'
diff --git a/lib/integrations/dialogflow/processor_service.rb b/lib/integrations/dialogflow/processor_service.rb
new file mode 100644
index 000000000..cb75bc78f
--- /dev/null
+++ b/lib/integrations/dialogflow/processor_service.rb
@@ -0,0 +1,69 @@
+class Integrations::Dialogflow::ProcessorService
+ pattr_initialize [:event_name!, :hook!, :event_data!]
+
+ def perform
+ message = event_data[:message]
+ return if message.private?
+ return unless processable_message?(message)
+ return unless message.conversation.bot?
+
+ response = get_dialogflow_response(message.conversation.contact_inbox.source_id, message_content(message))
+ process_response(message, response)
+ end
+
+ private
+
+ def message_content(message)
+ return message.content_attributes['submitted_values'].first['value'] if event_name == 'message.updated'
+
+ message.content
+ end
+
+ def processable_message?(message)
+ return unless message.reportable?
+ return if message.outgoing? && !processable_outgoing_message?(message)
+
+ true
+ end
+
+ def processable_outgoing_message?(message)
+ event_name == 'message.updated' && ['input_select'].include?(message.content_type)
+ end
+
+ def get_dialogflow_response(session_id, message)
+ Google::Cloud::Dialogflow.configure { |config| config.credentials = hook.settings['credentials'] }
+ session_client = Google::Cloud::Dialogflow.sessions
+ session = session_client.session_path project: hook.settings['project_id'], session: session_id
+ query_input = { text: { text: message, language_code: 'en-US' } }
+ session_client.detect_intent session: session, query_input: query_input
+ end
+
+ def process_response(message, response)
+ text_response = response.query_result['fulfillment_text']
+
+ content_params = { content: text_response } if text_response.present?
+ content_params ||= response.query_result['fulfillment_messages'].first['payload'].to_h
+
+ process_action(message, content_params['action']) and return if content_params['action'].present?
+
+ create_conversation(message, content_params)
+ end
+
+ def create_conversation(message, content_params)
+ return if content_params.blank?
+
+ conversation = message.conversation
+ conversation.messages.create(content_params.merge({
+ message_type: :outgoing,
+ account_id: conversation.account_id,
+ inbox_id: conversation.inbox_id
+ }))
+ end
+
+ def process_action(message, action)
+ case action
+ when 'handoff'
+ message.conversation.open!
+ end
+ end
+end
diff --git a/lib/integrations/slack/hook_builder.rb b/lib/integrations/slack/hook_builder.rb
index 93bff9656..f898905fa 100644
--- a/lib/integrations/slack/hook_builder.rb
+++ b/lib/integrations/slack/hook_builder.rb
@@ -12,7 +12,6 @@ class Integrations::Slack::HookBuilder
access_token: token,
status: 'enabled',
inbox_id: params[:inbox_id],
- hook_type: hook_type,
app_id: 'slack'
)
diff --git a/package.json b/package.json
index 1b6054b88..de064438e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@chatwoot/chatwoot",
- "version": "1.15.1",
+ "version": "1.16.0",
"license": "MIT",
"scripts": {
"eslint": "eslint app/javascript --fix",
@@ -9,88 +9,98 @@
"test:watch": "jest -w 1 --watch --no-cache",
"test:coverage": "jest -w 1 --no-cache --collectCoverage",
"webpacker-start": "webpack-dev-server -d --config webpack.dev.config.js --content-base public/ --progress --colors",
- "start:dev": "foreman start -f ./Procfile.dev"
+ "start:dev": "foreman start -f ./Procfile.dev",
+ "start:dev-overmind": "overmind start -f ./Procfile.dev",
+ "storybook": "start-storybook -p 6006",
+ "build-storybook": "build-storybook"
},
"dependencies": {
"@chatwoot/prosemirror-schema": "https://github.com/chatwoot/prosemirror-schema.git#7e8acadd10d7b932c0dc0bd0a18f804434f83517",
- "@rails/actioncable": "^6.0.0",
- "@rails/webpacker": "^5.2.0",
+ "@rails/actioncable": "6.1.3",
+ "@rails/webpacker": "5.3.0",
"@sentry/vue": "^5.30.0",
"axios": "^0.21.1",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-vue-jsx": "^3.7.0",
"bourbon": "^6.0.0",
- "chart.js": "~2.5.0",
- "copy-text-to-clipboard": "^2.1.1",
- "core-js": "3",
+ "chart.js": "~2.9.4",
+ "copy-text-to-clipboard": "2.2.0",
+ "core-js": "3.11.0",
"country-code-emoji": "^1.0.0",
- "date-fns": "^2.16.1",
- "dompurify": "^2.2.6",
+ "date-fns": "2.21.1",
+ "dompurify": "2.2.7",
"dotenv": "^8.0.0",
"foundation-sites": "~6.5.3",
"highlight.js": "~10.4.1",
"ionicons": "~2.0.1",
"js-cookie": "^2.2.1",
"lodash.groupby": "^4.6.0",
- "marked": "^2.0.0",
+ "marked": "2.0.3",
"md5": "^2.3.0",
- "prosemirror-markdown": "^1.5.0",
- "prosemirror-state": "^1.3.3",
- "prosemirror-view": "^1.16.5",
+ "prosemirror-markdown": "1.5.1",
+ "prosemirror-state": "1.3.4",
+ "prosemirror-view": "1.18.4",
"query-string": "5",
- "semver": "^7.3.4",
+ "semver": "7.3.5",
"spinkit": "~1.2.5",
"tailwindcss": "^1.9.6",
"tween.js": "~16.6.0",
"url-loader": "^2.0.0",
"v-tooltip": "~2.1.3",
- "vue": "^2.6.0",
+ "vue": "2.6.12",
"vue-axios": "~1.2.2",
- "vue-chartjs": "^3.4.2",
+ "vue-chartjs": "3.5.1",
"vue-clickaway": "~2.1.0",
- "vue-color": "^2.7.1",
- "vue-easytable": "^2.1.2",
- "vue-i18n": "^8.22.1",
- "vue-loader": "^15.7.0",
+ "vue-color": "2.8.1",
+ "vue-easytable": "2.5.1",
+ "vue-i18n": "8.24.3",
+ "vue-loader": "15.9.6",
"vue-multiselect": "~2.1.6",
"vue-router": "~2.2.0",
- "vue-template-compiler": "^2.6.10",
- "vue-upload-component": "^2.8.20",
- "vuelidate": "~0.7.5",
+ "vue-template-compiler": "2.6.12",
+ "vue-upload-component": "2.8.22",
+ "vuelidate": "0.7.6",
"vuex": "~2.1.1",
"vuex-router-sync": "~4.1.2"
},
"devDependencies": {
- "@babel/core": "^7.9.0",
- "@babel/plugin-proposal-class-properties": "^7.8.3",
- "@babel/preset-env": "^7.9.5",
- "@vue/test-utils": "^1.0.0-beta.29",
+ "@babel/core": "7.13.16",
+ "@babel/plugin-proposal-class-properties": "7.13.0",
+ "@babel/preset-env": "7.13.15",
+ "@storybook/addon-actions": "6.2.9",
+ "@storybook/addon-docs": "^6.2.9",
+ "@storybook/addon-essentials": "6.2.9",
+ "@storybook/addon-links": "6.2.9",
+ "@storybook/addons": "6.2.9",
+ "@storybook/vue": "6.2.9",
+ "@vue/test-utils": "1.1.4",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.1.0",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
- "babel-jest": "^25.3.0",
- "babel-loader": "^8.1.0",
- "cypress": "^4.10.0",
+ "babel-jest": "25.5.1",
+ "babel-loader": "8.2.2",
+ "babel-preset-vue": "^2.0.2",
+ "cypress": "4.12.1",
"eslint": "^6.8.0",
- "eslint-config-airbnb-base": "^14.1.0",
+ "eslint-config-airbnb-base": "14.2.1",
"eslint-config-prettier": "^4.0.0",
"eslint-import-resolver-webpack": "^0.11.1",
- "eslint-plugin-babel": "^5.3.0",
- "eslint-plugin-html": "^6.0.0",
- "eslint-plugin-import": "^2.16.0",
- "eslint-plugin-jsx-a11y": "^6.2.1",
- "eslint-plugin-prettier": "^3.0.1",
+ "eslint-plugin-babel": "5.3.1",
+ "eslint-plugin-html": "6.1.2",
+ "eslint-plugin-import": "2.22.1",
+ "eslint-plugin-jsx-a11y": "6.4.1",
+ "eslint-plugin-prettier": "3.4.0",
"eslint-plugin-vue": "^6.2.2",
"expect-more-jest": "^2.4.2",
- "husky": ">=1",
- "jest": "^26.4.2",
+ "husky": "6.0.0",
+ "jest": "26.6.3",
"jest-serializer-vue": "^2.0.2",
"jest-transform-stub": "^2.0.0",
- "lint-staged": ">=8",
+ "lint-staged": "10.5.4",
"prettier": "^1.16.4",
"rimraf": "^3.0.0",
- "vue-jest": "^3.0.5",
- "webpack-dev-server": "^3.11.0"
+ "vue-jest": "3.0.7",
+ "webpack-dev-server": "3.11.2"
},
"engines": {
"node": ">=10.x",
diff --git a/public/dashboard/images/integrations/dialogflow.svg b/public/dashboard/images/integrations/dialogflow.svg
new file mode 100644
index 000000000..32c657f3b
--- /dev/null
+++ b/public/dashboard/images/integrations/dialogflow.svg
@@ -0,0 +1,15 @@
+
+
\ No newline at end of file
diff --git a/spec/builders/campaigns/campaign_conversation_builder_spec.rb b/spec/builders/campaigns/campaign_conversation_builder_spec.rb
new file mode 100644
index 000000000..076aeab67
--- /dev/null
+++ b/spec/builders/campaigns/campaign_conversation_builder_spec.rb
@@ -0,0 +1,31 @@
+require 'rails_helper'
+
+describe ::Campaigns::CampaignConversationBuilder do
+ let(:account) { create(:account) }
+ let(:inbox) { create(:inbox, account: account) }
+ let(:contact) { create(:contact, account: account, identifier: '123') }
+ let(:contact_inbox) { create(:contact_inbox, contact: contact, inbox: inbox) }
+ let(:campaign) { create(:campaign, inbox: inbox, account: account) }
+
+ describe '#perform' do
+ it 'creates a conversation with campaign id and message with campaign message' do
+ campaign_conversation = described_class.new(
+ contact_inbox_id: contact_inbox.id,
+ campaign_display_id: campaign.display_id
+ ).perform
+
+ expect(campaign_conversation.campaign_id).to eq(campaign.id)
+ expect(campaign_conversation.messages.first.content).to eq(campaign.message)
+ end
+
+ it 'will not create a conversation with campaign id if another conversation exists' do
+ create(:conversation, contact_inbox_id: contact_inbox.id, inbox: inbox, account: account)
+ campaign_conversation = described_class.new(
+ contact_inbox_id: contact_inbox.id,
+ campaign_display_id: campaign.display_id
+ ).perform
+
+ expect(campaign_conversation).to eq(nil)
+ end
+ end
+end
diff --git a/spec/controllers/api/v1/accounts/campaigns_controller_spec.rb b/spec/controllers/api/v1/accounts/campaigns_controller_spec.rb
new file mode 100644
index 000000000..5a90929d5
--- /dev/null
+++ b/spec/controllers/api/v1/accounts/campaigns_controller_spec.rb
@@ -0,0 +1,148 @@
+require 'rails_helper'
+
+RSpec.describe 'Campaigns API', type: :request do
+ let(:account) { create(:account) }
+
+ describe 'GET /api/v1/accounts/{account.id}/campaigns' do
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ get "/api/v1/accounts/#{account.id}/campaigns"
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ let(:agent) { create(:user, account: account, role: :agent) }
+ let(:administrator) { create(:user, account: account, role: :administrator) }
+ let!(:campaign) { create(:campaign, account: account) }
+
+ it 'returns unauthorized for agents' do
+ get "/api/v1/accounts/#{account.id}/campaigns"
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+
+ it 'returns all campaigns to administrators' do
+ get "/api/v1/accounts/#{account.id}/campaigns",
+ headers: administrator.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ body = JSON.parse(response.body, symbolize_names: true)
+ expect(body.first[:id]).to eq(campaign.display_id)
+ end
+ end
+ end
+
+ describe 'GET /api/v1/accounts/{account.id}/campaigns/:id' do
+ let(:campaign) { create(:campaign, account: account) }
+
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ get "/api/v1/accounts/#{account.id}/campaigns/#{campaign.display_id}"
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ let(:agent) { create(:user, account: account, role: :agent) }
+ let(:administrator) { create(:user, account: account, role: :administrator) }
+
+ it 'returns unauthorized for agents' do
+ get "/api/v1/accounts/#{account.id}/campaigns/#{campaign.display_id}",
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+
+ it 'shows the campaign for administrators' do
+ get "/api/v1/accounts/#{account.id}/campaigns/#{campaign.display_id}",
+ headers: administrator.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(JSON.parse(response.body, symbolize_names: true)[:id]).to eq(campaign.display_id)
+ end
+ end
+ end
+
+ describe 'POST /api/v1/accounts/{account.id}/campaigns' do
+ let(:inbox) { create(:inbox, account: account) }
+
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ post "/api/v1/accounts/#{account.id}/campaigns",
+ params: { inbox_id: inbox.id, title: 'test', message: 'test message' },
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ let(:agent) { create(:user, account: account, role: :agent) }
+ let(:administrator) { create(:user, account: account, role: :administrator) }
+
+ it 'returns unauthorized for agents' do
+ post "/api/v1/accounts/#{account.id}/campaigns",
+ params: { inbox_id: inbox.id, title: 'test', message: 'test message' },
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+
+ it 'creates a new campaign' do
+ post "/api/v1/accounts/#{account.id}/campaigns",
+ params: { inbox_id: inbox.id, title: 'test', message: 'test message' },
+ headers: administrator.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(JSON.parse(response.body, symbolize_names: true)[:title]).to eq('test')
+ end
+ end
+ end
+
+ describe 'PATCH /api/v1/accounts/{account.id}/campaigns/:id' do
+ let(:inbox) { create(:inbox, account: account) }
+ let!(:campaign) { create(:campaign, account: account) }
+
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ patch "/api/v1/accounts/#{account.id}/campaigns/#{campaign.display_id}",
+ params: { inbox_id: inbox.id, title: 'test', message: 'test message' },
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ let(:agent) { create(:user, account: account, role: :agent) }
+ let(:administrator) { create(:user, account: account, role: :administrator) }
+
+ it 'returns unauthorized for agents' do
+ patch "/api/v1/accounts/#{account.id}/campaigns/#{campaign.display_id}",
+ params: { inbox_id: inbox.id, title: 'test', message: 'test message' },
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+
+ it 'updates the campaign' do
+ patch "/api/v1/accounts/#{account.id}/campaigns/#{campaign.display_id}",
+ params: { inbox_id: inbox.id, title: 'test', message: 'test message' },
+ headers: administrator.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(JSON.parse(response.body, symbolize_names: true)[:title]).to eq('test')
+ end
+ end
+ end
+end
diff --git a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb
index 76d2d9f00..5efa8049c 100644
--- a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb
+++ b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb
@@ -74,6 +74,44 @@ RSpec.describe 'Inboxes API', type: :request do
end
end
+ describe 'GET /api/v1/accounts/{account.id}/inboxes/{inbox.id}/campaigns' do
+ let(:inbox) { create(:inbox, account: account) }
+
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ get "/api/v1/accounts/#{account.id}/inboxes/#{inbox.id}/campaigns"
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ let(:agent) { create(:user, account: account, role: :agent) }
+ let(:administrator) { create(:user, account: account, role: :administrator) }
+
+ let!(:campaign) { create(:campaign, account: account, inbox: inbox) }
+
+ it 'returns unauthorized for agents' do
+ get "/api/v1/accounts/#{account.id}/inboxes/#{inbox.id}/campaigns"
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+
+ it 'returns all campaigns belonging to the inbox to administrators' do
+ # create a random campaign
+ create(:campaign, account: account)
+ get "/api/v1/accounts/#{account.id}/inboxes/#{inbox.id}/campaigns",
+ headers: administrator.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ body = JSON.parse(response.body, symbolize_names: true)
+ expect(body.first[:id]).to eq(campaign.display_id)
+ expect(body.length).to eq(1)
+ end
+ end
+ end
+
describe 'DELETE /api/v1/accounts/{account.id}/inboxes/:id' do
let(:inbox) { create(:inbox, account: account) }
diff --git a/spec/controllers/api/v1/accounts/integrations/hooks_controller_spec.rb b/spec/controllers/api/v1/accounts/integrations/hooks_controller_spec.rb
new file mode 100644
index 000000000..3c92f9026
--- /dev/null
+++ b/spec/controllers/api/v1/accounts/integrations/hooks_controller_spec.rb
@@ -0,0 +1,111 @@
+require 'rails_helper'
+
+RSpec.describe 'Integration Hooks API', type: :request do
+ let(:account) { create(:account) }
+ let(:admin) { create(:user, account: account, role: :administrator) }
+ let(:agent) { create(:user, account: account, role: :agent) }
+ let(:inbox) { create(:inbox, account: account) }
+ let(:params) { { app_id: 'dialogflow', inbox_id: inbox.id, settings: { project_id: 'xx', credentials: { test: 'test' } } } }
+
+ describe 'POST /api/v1/accounts/{account.id}/integrations/hooks' do
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ post api_v1_account_integrations_hooks_url(account_id: account.id),
+ params: params,
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ it 'return unauthorized if agent' do
+ post api_v1_account_integrations_hooks_url(account_id: account.id),
+ params: params,
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+
+ it 'creates hooks if admin' do
+ post api_v1_account_integrations_hooks_url(account_id: account.id),
+ params: params,
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ data = JSON.parse(response.body)
+ expect(data['app']['id']).to eq params[:app_id]
+ end
+ end
+ end
+
+ describe 'PATCH /api/v1/accounts/{account.id}/integrations/hooks/{hook_id}' do
+ let(:hook) { create(:integrations_hook, account: account) }
+
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ patch api_v1_account_integrations_hook_url(account_id: account.id, id: hook.id),
+ params: params,
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ it 'return unauthorized if agent' do
+ patch api_v1_account_integrations_hook_url(account_id: account.id, id: hook.id),
+ params: params,
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+
+ it 'updates hook if admin' do
+ patch api_v1_account_integrations_hook_url(account_id: account.id, id: hook.id),
+ params: params,
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ data = JSON.parse(response.body)
+ expect(data['app']['id']).to eq 'slack'
+ end
+ end
+ end
+
+ describe 'DELETE /api/v1/accounts/{account.id}/integrations/hooks/{hook_id}' do
+ let(:hook) { create(:integrations_hook, account: account) }
+
+ context 'when it is an unauthenticated user' do
+ it 'returns unauthorized' do
+ delete api_v1_account_integrations_hook_url(account_id: account.id, id: hook.id),
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+ end
+
+ context 'when it is an authenticated user' do
+ it 'return unauthorized if agent' do
+ delete api_v1_account_integrations_hook_url(account_id: account.id, id: hook.id),
+ headers: agent.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:unauthorized)
+ end
+
+ it 'updates hook if admin' do
+ delete api_v1_account_integrations_hook_url(account_id: account.id, id: hook.id),
+ headers: admin.create_new_auth_token,
+ as: :json
+
+ expect(response).to have_http_status(:success)
+ expect(::Integrations::Hook.exists?(hook.id)).to eq false
+ end
+ end
+ end
+end
diff --git a/spec/controllers/api/v1/widget/campaigns_controller_spec.rb b/spec/controllers/api/v1/widget/campaigns_controller_spec.rb
new file mode 100644
index 000000000..8a938b667
--- /dev/null
+++ b/spec/controllers/api/v1/widget/campaigns_controller_spec.rb
@@ -0,0 +1,31 @@
+require 'rails_helper'
+
+RSpec.describe '/api/v1/widget/campaigns', type: :request do
+ let(:account) { create(:account) }
+ let(:web_widget) { create(:channel_widget, account: account) }
+ let!(:campaign_1) { create(:campaign, inbox: web_widget.inbox, enabled: true, account: account) }
+ let!(:campaign_2) { create(:campaign, inbox: web_widget.inbox, enabled: false, account: account) }
+
+ describe 'GET /api/v1/widget/campaigns' do
+ let(:params) { { website_token: web_widget.website_token } }
+
+ context 'with correct website token' do
+ it 'returns the list of enabled campaigns' do
+ get '/api/v1/widget/campaigns', params: params
+
+ expect(response).to have_http_status(:success)
+ json_response = JSON.parse(response.body)
+ expect(json_response.length).to eq 1
+ expect(json_response.pluck('id')).to include(campaign_1.display_id)
+ expect(json_response.pluck('id')).not_to include(campaign_2.display_id)
+ end
+ end
+
+ context 'with invalid website token' do
+ it 'returns the list of agents' do
+ get '/api/v1/widget/campaigns', params: { website_token: '' }
+ expect(response).to have_http_status(:not_found)
+ end
+ end
+ end
+end
diff --git a/spec/controllers/api/v1/widget/events_controller_spec.rb b/spec/controllers/api/v1/widget/events_controller_spec.rb
index e2c45ab6e..da4136680 100644
--- a/spec/controllers/api/v1/widget/events_controller_spec.rb
+++ b/spec/controllers/api/v1/widget/events_controller_spec.rb
@@ -9,7 +9,7 @@ RSpec.describe '/api/v1/widget/events', type: :request do
let(:token) { ::Widget::TokenService.new(payload: payload).generate_token }
describe 'POST /api/v1/widget/events' do
- let(:params) { { website_token: web_widget.website_token, name: 'webwidget.triggered' } }
+ let(:params) { { website_token: web_widget.website_token, name: 'webwidget.triggered', event_info: { test_id: 'test' } } }
context 'with invalid website token' do
it 'returns unauthorized' do
@@ -32,7 +32,7 @@ RSpec.describe '/api/v1/widget/events', type: :request do
expect(response).to have_http_status(:success)
expect(Rails.configuration.dispatcher).to have_received(:dispatch)
.with(params[:name], anything, contact_inbox: contact_inbox,
- event_info: { browser_language: nil, widget_language: nil, browser: anything })
+ event_info: { test_id: 'test', browser_language: nil, widget_language: nil, browser: anything })
end
end
end
diff --git a/spec/controllers/api/v1/widget/inbox_members_controller_spec.rb b/spec/controllers/api/v1/widget/inbox_members_controller_spec.rb
index 72b1315b8..dc7bd2ce9 100644
--- a/spec/controllers/api/v1/widget/inbox_members_controller_spec.rb
+++ b/spec/controllers/api/v1/widget/inbox_members_controller_spec.rb
@@ -11,7 +11,7 @@ RSpec.describe '/api/v1/widget/inbox_members', type: :request do
create(:inbox_member, user: agent_2, inbox: web_widget.inbox)
end
- describe 'POST /api/v1/widget/inbox_members' do
+ describe 'GET /api/v1/widget/inbox_members' do
let(:params) { { website_token: web_widget.website_token } }
context 'with correct website token' do
diff --git a/spec/factories/campaigns.rb b/spec/factories/campaigns.rb
new file mode 100644
index 000000000..4d4c6de18
--- /dev/null
+++ b/spec/factories/campaigns.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+FactoryBot.define do
+ factory :campaign do
+ sequence(:title) { |n| "Campaign #{n}" }
+ sequence(:message) { |n| "Campaign message #{n}" }
+ after(:build) do |campaign|
+ campaign.account ||= create(:account)
+ campaign.inbox ||= create(
+ :inbox,
+ account: campaign.account,
+ channel: create(:channel_widget, account: campaign.account)
+ )
+ end
+ end
+end
diff --git a/spec/factories/conversations.rb b/spec/factories/conversations.rb
index f09fa6e11..6c7054a51 100644
--- a/spec/factories/conversations.rb
+++ b/spec/factories/conversations.rb
@@ -4,7 +4,6 @@ FactoryBot.define do
factory :conversation do
status { 'open' }
agent_last_seen_at { Time.current }
- locked { false }
identifier { SecureRandom.hex }
after(:build) do |conversation|
diff --git a/spec/factories/integrations/hooks.rb b/spec/factories/integrations/hooks.rb
index 6af74af9c..ac7c36fbc 100644
--- a/spec/factories/integrations/hooks.rb
+++ b/spec/factories/integrations/hooks.rb
@@ -1,12 +1,16 @@
FactoryBot.define do
factory :integrations_hook, class: 'Integrations::Hook' do
- status { 1 }
- inbox_id { 1 }
- account_id { 1 }
app_id { 'slack' }
- settings { 'MyText' }
- hook_type { 1 }
+ inbox
+ account
+ settings { { 'test': 'test' } }
+ status { Integrations::Hook.statuses['enabled'] }
access_token { SecureRandom.hex }
reference_id { SecureRandom.hex }
+
+ trait :dialogflow do
+ app_id { 'dialogflow' }
+ settings { { project_id: 'test', credentials: {} } }
+ end
end
end
diff --git a/spec/fixtures/files/mail_with_no_subject.eml b/spec/fixtures/files/mail_with_no_subject.eml
new file mode 100644
index 000000000..46057b3a3
--- /dev/null
+++ b/spec/fixtures/files/mail_with_no_subject.eml
@@ -0,0 +1,631 @@
+From: Sony Mathew
+Mime-Version: 1.0 (Apple Message framework v1244.3)
+Content-Type: multipart/alternative; boundary="Apple-Mail=_33A037C7-4BB3-4772-AE52-FCF2D7535F74"
+Subject:
+Date: Tue, 20 Apr 2020 04:20:20 -0400
+In-Reply-To: <4e6e35f5a38b4_479f13bb90078178@small-app-01.mail>
+To: "Replies"
+References: <4e6e35f5a38b4_479f13bb90078178@small-app-01.mail>
+Message-Id: <0CB459E0-0336-41DA-BC88-E6E28C697DDB@chatwoot.com>
+X-Mailer: Apple Mail (2.1244.3)
+
+--Apple-Mail=_33A037C7-4BB3-4772-AE52-FCF2D7535F74
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/plain;
+ charset=utf-8
+
+Let's talk about these images:
+
+
+--Apple-Mail=_33A037C7-4BB3-4772-AE52-FCF2D7535F74
+Content-Type: multipart/related;
+ type="text/html";
+ boundary="Apple-Mail=_83444AF4-343C-4F75-AF8F-14E1E7434FC1"
+
+
+--Apple-Mail=_83444AF4-343C-4F75-AF8F-14E1E7434FC1
+Content-Transfer-Encoding: base64
+Content-Disposition: inline;
+ filename=avatar1.jpeg
+Content-Type: image/jpg;
+ name="avatar1.jpeg"
+Content-Id: <7AAEB353-2341-4D46-A054-5CA5CB2363B7>
+
+/9j/4AAQSkZJRgABAQAAAQABAAD/4gxYSUNDX1BST0ZJTEUAAQEAAAxITGlubwIQAABtbnRyUkdC
+IFhZWiAHzgACAAkABgAxAABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAA
+AADTLUhQICAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFj
+cHJ0AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAA
+ABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2dWVkAAAD
+TAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNoAAAEMAAAAAxyVFJD
+AAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAAAENvcHlyaWdodCAoYykgMTk5
+OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEA
+AAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAA
+AAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAA
+AA+EAAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo
+dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt
+IHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAt
+IHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcg
+Q29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENv
+bmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAA
+ABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAA
+AAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAK
+AA8AFAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA
+mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy
+ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHhAekB8gH6AgMC
+DAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLBAssC1QLgAusC9QMAAwsDFgMh
+Ay0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4E
+jASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3
+BkgGWQZqBnsGjAadBq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDII
+RghaCG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqY
+Cq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN
+Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQQxBh
+EH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT
+5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReu
+F9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2MbihuyG9oc
+AhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCY
+IMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZcl
+xyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2
+K2krnSvRLAUsOSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIx
+SjGCMbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec
+N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE94D4gPmA+
+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RHRIpEzkUSRVVFmkXe
+RiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN
+3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYP
+VlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1f
+D19hX7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/
+aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfBy
+S3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB
+fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuH
+n4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLj
+k02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5Anq6f
+HZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjEqTepqaocqo+rAqt1
+q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm4
+0blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZG
+xsPHQce/yD3IvMk6ybnKOMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnU
+y9VO1dHWVdbY11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj
+4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozz
+GfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t////2wBDAAICAgIC
+AQICAgICAgIDAwYEAwMDAwcFBQQGCAcICAgHCAgJCg0LCQkMCggICw8LDA0ODg4OCQsQEQ8OEQ0O
+Dg7/2wBDAQICAgMDAwYEBAYOCQgJDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4O
+Dg4ODg4ODg4ODg4ODg7/wAARCADwAPADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAEC
+AwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0Kx
+wRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1
+dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ
+2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QA
+tREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYk
+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
+mk8VWW5WRGJGAOaAP//Z
+
+--Apple-Mail=_83444AF4-343C-4F75-AF8F-14E1E7434FC1
+Content-Transfer-Encoding: base64
+Content-Disposition: inline;
+ filename=avatar2.jpg
+Content-Type: image/jpg;
+ x-unix-mode=0700;
+ name="avatar2.jpg"
+Content-Id: <4594E827-6E69-4329-8691-6BC35E3E73A0>
+
+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
+
+--Apple-Mail=_83444AF4-343C-4F75-AF8F-14E1E7434FC1--
+
+--Apple-Mail=_33A037C7-4BB3-4772-AE52-FCF2D7535F74--
diff --git a/spec/jobs/hook_job_spec.rb b/spec/jobs/hook_job_spec.rb
index b852db7ad..225a9c183 100644
--- a/spec/jobs/hook_job_spec.rb
+++ b/spec/jobs/hook_job_spec.rb
@@ -1,15 +1,38 @@
require 'rails_helper'
RSpec.describe HookJob, type: :job do
- subject(:job) { described_class.perform_later(hook, message) }
+ subject(:job) { described_class.perform_later(hook, event_name, event_data) }
let(:account) { create(:account) }
let(:hook) { create(:integrations_hook, account: account) }
- let(:message) { create(:message) }
+ let(:event_name) { 'message.created' }
+ let(:event_data) { { message: create(:message, account: account) } }
- it 'queues the job' do
+ it 'enqueues the job' do
expect { job }.to have_enqueued_job(described_class)
- .with(hook, message)
+ .with(hook, event_name, event_data)
.on_queue('integrations')
end
+
+ context 'when handleable events like message.created' do
+ let(:process_service) { double }
+
+ before do
+ allow(process_service).to receive(:perform)
+ end
+
+ it 'calls Integrations::Slack::SendOnSlackService when its a slack hook' do
+ hook = create(:integrations_hook, app_id: 'slack', account: account)
+ allow(Integrations::Slack::SendOnSlackService).to receive(:new).and_return(process_service)
+ expect(Integrations::Slack::SendOnSlackService).to receive(:new)
+ described_class.perform_now(hook, event_name, event_data)
+ end
+
+ it 'calls Integrations::Dialogflow::ProcessorService when its a dialogflow intergation' do
+ hook = create(:integrations_hook, :dialogflow, account: account)
+ allow(Integrations::Dialogflow::ProcessorService).to receive(:new).and_return(process_service)
+ expect(Integrations::Dialogflow::ProcessorService).to receive(:new)
+ described_class.perform_now(hook, event_name, event_data)
+ end
+ end
end
diff --git a/spec/lib/integrations/dialogflow/processor_service_spec.rb b/spec/lib/integrations/dialogflow/processor_service_spec.rb
new file mode 100644
index 000000000..ca852a943
--- /dev/null
+++ b/spec/lib/integrations/dialogflow/processor_service_spec.rb
@@ -0,0 +1,73 @@
+require 'rails_helper'
+
+describe Integrations::Dialogflow::ProcessorService do
+ let(:account) { create(:account) }
+ let(:hook) { create(:integrations_hook, :dialogflow, account: account) }
+ let(:conversation) { create(:conversation, account: account, status: :bot) }
+ let(:message) { create(:message, account: account, conversation: conversation) }
+ let(:event_name) { 'message.created' }
+ let(:event_data) { { message: message } }
+
+ describe '#perform' do
+ let(:dialogflow_service) { double }
+ let(:dialogflow_response) do
+ ActiveSupport::HashWithIndifferentAccess.new(
+ fulfillment_text: 'hello'
+ )
+ end
+
+ let(:processor) { described_class.new(event_name: event_name, hook: hook, event_data: event_data) }
+
+ before do
+ allow(dialogflow_service).to receive(:query_result).and_return(dialogflow_response)
+ allow(processor).to receive(:get_dialogflow_response).and_return(dialogflow_service)
+ end
+
+ context 'when valid message and dialogflow returns fullfillment text' do
+ it 'creates the response message' do
+ expect(processor.perform.content).to eql('hello')
+ end
+ end
+
+ context 'when dialogflow returns fullfillment text to be empty' do
+ let(:dialogflow_response) do
+ ActiveSupport::HashWithIndifferentAccess.new(
+ fulfillment_messages: [{ payload: { content: 'hello payload' } }]
+ )
+ end
+
+ it 'creates the response message based on fulfillment messages' do
+ expect(processor.perform.content).to eql('hello payload')
+ end
+ end
+
+ context 'when dialogflow returns action' do
+ let(:dialogflow_response) do
+ ActiveSupport::HashWithIndifferentAccess.new(
+ fulfillment_messages: [{ payload: { action: 'handoff' } }]
+ )
+ end
+
+ it 'handsoff the conversation to agent' do
+ processor.perform
+ expect(conversation.status).to eql('open')
+ end
+ end
+
+ context 'when conversation is not bot' do
+ let(:conversation) { create(:conversation, account: account, status: :open) }
+
+ it 'returns nil' do
+ expect(processor.perform).to be(nil)
+ end
+ end
+
+ context 'when message is private' do
+ let(:message) { create(:message, account: account, conversation: conversation, private: true) }
+
+ it 'returns nil' do
+ expect(processor.perform).to be(nil)
+ end
+ end
+ end
+end
diff --git a/spec/listeners/campaign_listener_spec.rb b/spec/listeners/campaign_listener_spec.rb
new file mode 100644
index 000000000..bfc5df08f
--- /dev/null
+++ b/spec/listeners/campaign_listener_spec.rb
@@ -0,0 +1,40 @@
+require 'rails_helper'
+describe CampaignListener do
+ let(:listener) { described_class.instance }
+ let(:account) { create(:account) }
+ let(:inbox) { create(:inbox, account: account) }
+ let(:contact) { create(:contact, account: account, identifier: '123') }
+ let(:contact_inbox) { create(:contact_inbox, contact: contact, inbox: inbox) }
+ let(:campaign) { create(:campaign, inbox: inbox, account: account) }
+
+ let!(:event) do
+ Events::Base.new('campaign_triggered', Time.zone.now,
+ contact_inbox: contact_inbox, event_info: { campaign_id: campaign.display_id })
+ end
+
+ describe '#campaign_triggered' do
+ let(:builder) { double }
+
+ before do
+ allow(Campaigns::CampaignConversationBuilder).to receive(:new).and_return(builder)
+ allow(builder).to receive(:perform)
+ end
+
+ context 'when params contain campaign id' do
+ it 'triggers campaign conversation builder' do
+ expect(Campaigns::CampaignConversationBuilder).to receive(:new)
+ .with({ contact_inbox_id: contact_inbox.id, campaign_display_id: campaign.display_id, conversation_additional_attributes: {} }).once
+ listener.campaign_triggered(event)
+ end
+ end
+
+ context 'when params does not contain campaign id' do
+ it 'does not trigger campaign conversation builder' do
+ event = Events::Base.new('campaign_triggered', Time.zone.now,
+ contact_inbox: contact_inbox, event_info: {})
+ expect(Campaigns::CampaignConversationBuilder).to receive(:new).exactly(0).times
+ listener.campaign_triggered(event)
+ end
+ end
+ end
+end
diff --git a/spec/listeners/hook_listener_spec.rb b/spec/listeners/hook_listener_spec.rb
index f22a074ab..4caa4dafd 100644
--- a/spec/listeners/hook_listener_spec.rb
+++ b/spec/listeners/hook_listener_spec.rb
@@ -12,7 +12,7 @@ describe HookListener do
let!(:event) { Events::Base.new(event_name, Time.zone.now, message: message) }
describe '#message_created' do
- let(:event_name) { :'conversation.created' }
+ let(:event_name) { 'message.created' }
context 'when hook is not configured' do
it 'does not trigger hook job' do
@@ -24,9 +24,28 @@ describe HookListener do
context 'when hook is configured' do
it 'triggers hook job' do
hook = create(:integrations_hook, account: account)
- expect(HookJob).to receive(:perform_later).with(hook, message).once
+ expect(HookJob).to receive(:perform_later).with(hook, 'message.created', message: message).once
listener.message_created(event)
end
end
end
+
+ describe '#message_updated' do
+ let(:event_name) { 'message.updated' }
+
+ context 'when hook is not configured' do
+ it 'does not trigger hook job' do
+ expect(HookJob).to receive(:perform_later).exactly(0).times
+ listener.message_updated(event)
+ end
+ end
+
+ context 'when hook is configured' do
+ it 'triggers hook job' do
+ hook = create(:integrations_hook, account: account)
+ expect(HookJob).to receive(:perform_later).with(hook, 'message.updated', message: message).once
+ listener.message_updated(event)
+ end
+ end
+ end
end
diff --git a/spec/listeners/webhook_listener_spec.rb b/spec/listeners/webhook_listener_spec.rb
index ed581dc6f..cb06dd6c0 100644
--- a/spec/listeners/webhook_listener_spec.rb
+++ b/spec/listeners/webhook_listener_spec.rb
@@ -13,7 +13,7 @@ describe WebhookListener do
let!(:event) { Events::Base.new(event_name, Time.zone.now, message: message) }
describe '#message_created' do
- let(:event_name) { :'conversation.created' }
+ let(:event_name) { :'message.created' }
context 'when webhook is not configured' do
it 'does not trigger webhook' do
@@ -29,5 +29,39 @@ describe WebhookListener do
listener.message_created(event)
end
end
+
+ context 'when inbox is an API Channel' do
+ it 'triggers webhook if webhook_url is present' do
+ channel_api = create(:channel_api, account: account)
+ api_inbox = channel_api.inbox
+ api_conversation = create(:conversation, account: account, inbox: api_inbox, assignee: user)
+ api_message = create(
+ :message,
+ message_type: 'outgoing',
+ account: account,
+ inbox: api_inbox,
+ conversation: api_conversation
+ )
+ api_event = Events::Base.new(event_name, Time.zone.now, message: api_message)
+ expect(WebhookJob).to receive(:perform_later).with(channel_api.webhook_url, api_message.webhook_data.merge(event: 'message_created')).once
+ listener.message_created(api_event)
+ end
+
+ it 'does not trigger webhook if webhook_url is not present' do
+ channel_api = create(:channel_api, webhook_url: nil, account: account)
+ api_inbox = channel_api.inbox
+ api_conversation = create(:conversation, account: account, inbox: api_inbox, assignee: user)
+ api_message = create(
+ :message,
+ message_type: 'outgoing',
+ account: account,
+ inbox: channel_api.inbox,
+ conversation: api_conversation
+ )
+ api_event = Events::Base.new(event_name, Time.zone.now, message: api_message)
+ expect(WebhookJob).not_to receive(:perform_later)
+ listener.message_created(api_event)
+ end
+ end
end
end
diff --git a/spec/models/campaign_spec.rb b/spec/models/campaign_spec.rb
new file mode 100644
index 000000000..30fa1a43d
--- /dev/null
+++ b/spec/models/campaign_spec.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+RSpec.describe Campaign, type: :model do
+ describe 'associations' do
+ it { is_expected.to belong_to(:account) }
+ it { is_expected.to belong_to(:inbox) }
+ end
+
+ describe '.before_create' do
+ let(:campaign) { build(:campaign, display_id: nil) }
+
+ before do
+ campaign.save
+ campaign.reload
+ end
+
+ it 'runs before_create callbacks' do
+ expect(campaign.display_id).to eq(1)
+ end
+ end
+end
diff --git a/spec/models/conversation_spec.rb b/spec/models/conversation_spec.rb
index f6c6f8f63..bcfc91a70 100644
--- a/spec/models/conversation_spec.rb
+++ b/spec/models/conversation_spec.rb
@@ -7,6 +7,7 @@ require Rails.root.join 'spec/models/concerns/round_robin_handler_spec.rb'
RSpec.describe Conversation, type: :model do
describe 'associations' do
it { is_expected.to belong_to(:account) }
+ it { is_expected.to belong_to(:inbox) }
end
describe 'concerns' do
@@ -93,7 +94,6 @@ RSpec.describe Conversation, type: :model do
conversation.update(
status: :resolved,
- locked: true,
contact_last_seen_at: Time.now,
assignee: new_assignee,
label_list: [label.title]
@@ -106,8 +106,6 @@ RSpec.describe Conversation, type: :model do
.with(described_class::CONVERSATION_RESOLVED, kind_of(Time), conversation: conversation)
expect(Rails.configuration.dispatcher).to have_received(:dispatch)
.with(described_class::CONVERSATION_READ, kind_of(Time), conversation: conversation)
- expect(Rails.configuration.dispatcher).to have_received(:dispatch)
- .with(described_class::CONVERSATION_LOCK_TOGGLE, kind_of(Time), conversation: conversation)
expect(Rails.configuration.dispatcher).to have_received(:dispatch)
.with(described_class::ASSIGNEE_CHANGED, kind_of(Time), conversation: conversation)
end
@@ -193,28 +191,6 @@ RSpec.describe Conversation, type: :model do
end
end
- describe '#lock!' do
- subject(:lock!) { conversation.lock! }
-
- let(:conversation) { create(:conversation) }
-
- it 'assigns locks the conversation' do
- expect(lock!).to eq(true)
- expect(conversation.reload.locked).to eq(true)
- end
- end
-
- describe '#unlock!' do
- subject(:unlock!) { conversation.unlock! }
-
- let(:conversation) { create(:conversation) }
-
- it 'unlocks the conversation' do
- expect(unlock!).to eq(true)
- expect(conversation.reload.locked).to eq(false)
- end
- end
-
describe '#mute!' do
subject(:mute!) { conversation.mute! }
@@ -365,18 +341,6 @@ RSpec.describe Conversation, type: :model do
end
end
- describe '#lock_event_data' do
- subject(:lock_event_data) { conversation.lock_event_data }
-
- let(:conversation) do
- build(:conversation, display_id: 505, locked: false)
- end
-
- it 'returns lock event payload' do
- expect(lock_event_data).to eq(id: 505, locked: false)
- end
- end
-
describe '#botinbox: when conversation created inside inbox with agent bot' do
let!(:bot_inbox) { create(:agent_bot_inbox) }
let(:conversation) { create(:conversation, inbox: bot_inbox.inbox) }
@@ -386,6 +350,15 @@ RSpec.describe Conversation, type: :model do
end
end
+ describe '#botintegration: when conversation created in inbox with dialogflow integration' do
+ let(:hook) { create(:integrations_hook, :dialogflow) }
+ let(:conversation) { create(:conversation, inbox: hook.inbox) }
+
+ it 'returns conversation status as bot' do
+ expect(conversation.status).to eq('bot')
+ end
+ end
+
describe '#can_reply?' do
describe 'on channels without 24 hour restriction' do
let(:conversation) { create(:conversation) }
diff --git a/spec/models/integrations/hook_spec.rb b/spec/models/integrations/hook_spec.rb
index da5f1ff20..87822a0dc 100644
--- a/spec/models/integrations/hook_spec.rb
+++ b/spec/models/integrations/hook_spec.rb
@@ -9,4 +9,22 @@ RSpec.describe Integrations::Hook, type: :model do
describe 'associations' do
it { is_expected.to belong_to(:account) }
end
+
+ describe 'when trying to create multiple hooks for an app' do
+ let(:account) { create(:account) }
+
+ context 'when app allows multiple hooks' do
+ it 'allows to create succesfully' do
+ create(:integrations_hook, account: account, app_id: 'webhook')
+ expect(build(:integrations_hook, account: account, app_id: 'webhook').valid?).to eq true
+ end
+ end
+
+ context 'when app doesnot allow multiple hooks' do
+ it 'throws invalid error' do
+ create(:integrations_hook, account: account, app_id: 'slack')
+ expect(build(:integrations_hook, account: account, app_id: 'slack').valid?).to eq false
+ end
+ end
+ end
end
diff --git a/spec/models/message_spec.rb b/spec/models/message_spec.rb
index 061c5af9a..e08a152d9 100644
--- a/spec/models/message_spec.rb
+++ b/spec/models/message_spec.rb
@@ -17,6 +17,10 @@ RSpec.describe Message, type: :model do
expect(message.created_at).to eq message.conversation.last_activity_at
end
+ it 'updates contact last_activity_at when created' do
+ expect { message.save! }.to(change { message.sender.last_activity_at })
+ end
+
it 'triggers ::MessageTemplates::HookExecutionService' do
hook_execution_service = double
allow(::MessageTemplates::HookExecutionService).to receive(:new).and_return(hook_execution_service)
diff --git a/spec/presenters/conversations/event_data_presenter_spec.rb b/spec/presenters/conversations/event_data_presenter_spec.rb
index e79ba41ab..2e04e8e75 100644
--- a/spec/presenters/conversations/event_data_presenter_spec.rb
+++ b/spec/presenters/conversations/event_data_presenter_spec.rb
@@ -6,10 +6,6 @@ RSpec.describe Conversations::EventDataPresenter do
let(:presenter) { described_class.new(conversation) }
let(:conversation) { create(:conversation) }
- describe '#lock_data' do
- it { expect(presenter.lock_data).to eq(id: conversation.display_id, locked: false) }
- end
-
describe '#push_data' do
let(:expected_data) do
{
diff --git a/spec/presenters/mail_presenter_spec.rb b/spec/presenters/mail_presenter_spec.rb
index e2b43bbb4..8d81e3a80 100644
--- a/spec/presenters/mail_presenter_spec.rb
+++ b/spec/presenters/mail_presenter_spec.rb
@@ -6,6 +6,13 @@ RSpec.describe MailPresenter do
let(:mail) { create_inbound_email_from_fixture('welcome.eml').mail }
let(:decorated_mail) { described_class.new(mail) }
+ let(:mail_with_no_subject) { create_inbound_email_from_fixture('mail_with_no_subject.eml').mail }
+ let(:decorated_mail_with_no_subject) { described_class.new(mail_with_no_subject) }
+
+ it 'give default subject line if mail subject is empty' do
+ expect(decorated_mail_with_no_subject.subject).to eq('')
+ end
+
it 'give utf8 encoded content' do
expect(decorated_mail.subject).to eq("Discussion: Let's debate these attachments")
expect(decorated_mail.text_content[:full]).to eq("Let's talk about these images:\r\n\r\n")
diff --git a/spec/requests/api/v1/accounts/integrations/slack_request_spec.rb b/spec/requests/api/v1/accounts/integrations/slack_request_spec.rb
index e68eabf73..c61c8d376 100644
--- a/spec/requests/api/v1/accounts/integrations/slack_request_spec.rb
+++ b/spec/requests/api/v1/accounts/integrations/slack_request_spec.rb
@@ -16,7 +16,7 @@ RSpec.describe 'Api::V1::Accounts::Integrations::Slacks', type: :request do
context 'when it is an authenticated user' do
it 'creates hook' do
hook_builder = Integrations::Slack::HookBuilder.new(account: account, code: SecureRandom.hex)
- expect(hook_builder).to receive(:fetch_access_token).and_return(SecureRandom.hex)
+ expect(hook_builder).to receive(:perform).and_return(hook)
expect(Integrations::Slack::HookBuilder).to receive(:new).and_return(hook_builder)
channel_builder = Integrations::Slack::ChannelBuilder.new(hook: hook, channel: 'channel')
diff --git a/spec/services/message_templates/hook_execution_service_spec.rb b/spec/services/message_templates/hook_execution_service_spec.rb
index a35ccd25d..2b8748daf 100644
--- a/spec/services/message_templates/hook_execution_service_spec.rb
+++ b/spec/services/message_templates/hook_execution_service_spec.rb
@@ -39,6 +39,18 @@ describe ::MessageTemplates::HookExecutionService do
expect(::MessageTemplates::Template::EmailCollect).not_to have_received(:new).with(conversation: message.conversation)
end
+ it 'doesnot calls ::MessageTemplates::Template::EmailCollect on campaign conversations' do
+ contact = create(:contact, email: nil)
+ conversation = create(:conversation, contact: contact, campaign: create(:campaign))
+
+ allow(::MessageTemplates::Template::EmailCollect).to receive(:new).and_return(true)
+
+ # described class gets called in message after commit
+ message = create(:message, conversation: conversation)
+
+ expect(::MessageTemplates::Template::EmailCollect).not_to have_received(:new).with(conversation: message.conversation)
+ end
+
it 'doesnot calls ::MessageTemplates::Template::Greeting if greeting_message is empty' do
contact = create(:contact, email: nil)
conversation = create(:conversation, contact: contact)
diff --git a/stories/Sections/Introduction.stories.mdx b/stories/Sections/Introduction.stories.mdx
new file mode 100644
index 000000000..b9c2104ed
--- /dev/null
+++ b/stories/Sections/Introduction.stories.mdx
@@ -0,0 +1,19 @@
+import { Meta } from '@storybook/addon-docs/blocks';
+
+
+
+# Welcome to Chatwoot styleguide
+
+Chatwoot as an opensource project is growing every day. New features are getting added in every release. The number of contributors who are actively contributing to the project is also increasing. It has become a necessity to create a standard guideline to make the contribution experience easier. This style guide resides as a central repository for the best practices we follow, a set of recommended approaches and the design guidelines/components we use.
+
+Anyone willing to contribute to Chatwoot is encouraged to read this style guide. This style guide is also open source. If you feel that there are rooms for improvement, feel free to raise an issue or a pull request to the repository.
+
+Through this style guide we intent to create a document which can be used across the repositories in the organization and build a design system for the project.
+
+The document would split into 3 major sections
+
+- **Design**: This section would contain the design choices and the documentation for the components built using these design choices.
+
+- **Frontend**: Our frontend is built on [Vue.js](https://vuejs.org/). We follow [Airbnb guidelines for Javascript](https://github.com/airbnb/javascript) and there are a couple of choices we made in structuring the code. All those would be defined in this section.
+
+- **Backend**: Our backend is written on [Ruby on Rails](https://rubyonrails.org/). This section would cover the architectural patterns we have been following so far.
diff --git a/stories/Sections/Layout.stories.mdx b/stories/Sections/Layout.stories.mdx
new file mode 100644
index 000000000..29ce5df83
--- /dev/null
+++ b/stories/Sections/Layout.stories.mdx
@@ -0,0 +1,23 @@
+import { Meta } from '@storybook/addon-docs/blocks';
+
+
+
+# Layout guidelines
+
+Chatwoot follows a fixed-width sidebar on the left menu on all pages. The remaining space of the layout is where the layout changes according to what the page needs.
+
+### Normal Grid
+
+Chatwoot is built on top of [foundation](https://get.foundation/sites/docs/) and uses the **flex-grid** from Foundation. We insist to solve every possible layout with this grid.
+The docs for the grid can be found here on [foundation grid docs](https://get.foundation/sites/docs/grid.html).
+
+### 3 column layout
+
+We Recommend the use of this solution only when the normal grid fails to solve it or needs severe overriding. Some layouts need custom functionality where Foundation grid is not enough. The main conversation page is an example of this grid as a candidate.
+
+**Usage** - We have created a mixin `three-column-grid` which can be included by importing the file
+
+`@import '~dashboard/assets/scss/mixins';`
+
+There are 2 parameters for this mixin, The first one being the minimum possible width for the first column in `rem`. This value is usually a multiple of `8` when converted to `px`. Eg: `256px` will be used as `25.6rem`.
+Similarly, the second param is the minimum possible width of the third column.
diff --git a/swagger/definitions/index.yml b/swagger/definitions/index.yml
index 9e09d3332..e72c1743d 100644
--- a/swagger/definitions/index.yml
+++ b/swagger/definitions/index.yml
@@ -21,8 +21,12 @@ agent_bot:
$ref: ./resource/agent_bot.yml
contact_inboxes:
$ref: ./resource/contact_inboxes.yml
+contactable_inboxes:
+ $ref: ./resource/contactable_inboxes.yml
account:
$ref: ./resource/account.yml
+team:
+ $ref: ./resource/team.yml
# RESPONSE
@@ -78,3 +82,8 @@ contact_update:
## conversation
conversation_message_create:
$ref: ./request/conversation/create_message.yml
+
+# Team request Payload
+
+team_create_update_payload:
+ $ref: ./request/team/create_update_payload.yml
diff --git a/swagger/definitions/request/team/create_update_payload.yml b/swagger/definitions/request/team/create_update_payload.yml
new file mode 100644
index 000000000..f4db1e5d7
--- /dev/null
+++ b/swagger/definitions/request/team/create_update_payload.yml
@@ -0,0 +1,11 @@
+type: object
+properties:
+ name:
+ type: string
+ description: The name of the team
+ description:
+ type: string
+ description: The description of the team
+ allow_auto_assign:
+ type: boolean
+ description: If this setting is turned on, the system would automatically assign the conversation to an agent in the team while assigning the conversation to a team
diff --git a/swagger/definitions/resource/contactable_inboxes.yml b/swagger/definitions/resource/contactable_inboxes.yml
new file mode 100644
index 000000000..a223490ff
--- /dev/null
+++ b/swagger/definitions/resource/contactable_inboxes.yml
@@ -0,0 +1,8 @@
+type: object
+properties:
+ source_id:
+ type: string
+ description: Contact Inbox Source Id
+ inbox:
+ type: object
+ $ref: '#/definitions/inbox'
diff --git a/swagger/definitions/resource/team.yml b/swagger/definitions/resource/team.yml
new file mode 100644
index 000000000..ad74be943
--- /dev/null
+++ b/swagger/definitions/resource/team.yml
@@ -0,0 +1,20 @@
+type: object
+properties:
+ id:
+ type: number
+ description: The id of the team
+ name:
+ type: string
+ description: The name of the team
+ description:
+ type: string
+ description: The description about the team
+ allow_auto_assign:
+ type: boolean
+ description: If this setting is turned on, the system would automatically assign the conversation to an agent in the team while assigning the conversation to a team
+ account_id:
+ type: number
+ description: The id of the account with the team is a part of
+ is_member:
+ type: boolean
+ description: This field shows whether the current user is a part of the team
diff --git a/swagger/index.html b/swagger/index.html
index 65ec1b81a..eb09d7768 100644
--- a/swagger/index.html
+++ b/swagger/index.html
@@ -5,7 +5,6 @@
-
@@ -13,6 +12,7 @@
body {
margin: 0;
padding: 0;
+ font-family: 'Helvetica Neue', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', sans-serif;
}
diff --git a/swagger/index.yml b/swagger/index.yml
index b00c78da7..dc9cbedb9 100644
--- a/swagger/index.yml
+++ b/swagger/index.yml
@@ -1,4 +1,4 @@
-swagger: 2.0
+swagger: "2.0"
info:
description: This is the API documentation for Chatwoot server.
version: 1.0.0
@@ -40,3 +40,5 @@ paths:
$ref: ./paths/index.yml
definitions:
$ref: ./definitions/index.yml
+parameters:
+ $ref: ./parameters/index.yml
diff --git a/swagger/parameters/account_id.yml b/swagger/parameters/account_id.yml
new file mode 100644
index 000000000..133155c21
--- /dev/null
+++ b/swagger/parameters/account_id.yml
@@ -0,0 +1,6 @@
+in: path
+name: account_id
+schema:
+ type: integer
+required: true
+description: The numeric ID of the account
diff --git a/swagger/parameters/contact_sort.yml b/swagger/parameters/contact_sort.yml
new file mode 100644
index 000000000..f25d07760
--- /dev/null
+++ b/swagger/parameters/contact_sort.yml
@@ -0,0 +1,15 @@
+in: query
+name: sort
+schema:
+ type: string
+ enum:
+ - name
+ - email
+ - phone_number
+ - last_activity_at
+ - -name
+ - -email
+ - -phone_number
+ - -last_activity_at
+required: false
+description: The attribute by which list should be sorted
diff --git a/swagger/parameters/conversation_id.yml b/swagger/parameters/conversation_id.yml
new file mode 100644
index 000000000..4f4cb19ab
--- /dev/null
+++ b/swagger/parameters/conversation_id.yml
@@ -0,0 +1,6 @@
+in: path
+name: conversation_id
+schema:
+ type: integer
+required: true
+description: The numeric ID of the conversation
diff --git a/swagger/parameters/index.yml b/swagger/parameters/index.yml
new file mode 100644
index 000000000..6acf0f37d
--- /dev/null
+++ b/swagger/parameters/index.yml
@@ -0,0 +1,20 @@
+account_id:
+ $ref: ./account_id.yml
+
+team_id:
+ $ref: ./team_id.yml
+
+source_id:
+ $ref: ./source_id.yml
+
+conversation_id:
+ $ref: ./conversation_id.yml
+
+message_id:
+ $ref: ./message_id.yml
+
+contact_sort_param:
+ $ref: ./contact_sort.yml
+
+page:
+ $ref: ./page.yml
diff --git a/swagger/parameters/message_id.yml b/swagger/parameters/message_id.yml
new file mode 100644
index 000000000..3064a31e2
--- /dev/null
+++ b/swagger/parameters/message_id.yml
@@ -0,0 +1,6 @@
+in: path
+name: message_id
+schema:
+ type: integer
+required: true
+description: The numeric ID of the message
diff --git a/swagger/parameters/page.yml b/swagger/parameters/page.yml
new file mode 100644
index 000000000..3ef0f55b6
--- /dev/null
+++ b/swagger/parameters/page.yml
@@ -0,0 +1,7 @@
+in: query
+name: page
+schema:
+ type: integer
+ default: 1
+required: false
+description: The page parameter
diff --git a/swagger/parameters/source_id.yml b/swagger/parameters/source_id.yml
new file mode 100644
index 000000000..47536332f
--- /dev/null
+++ b/swagger/parameters/source_id.yml
@@ -0,0 +1,2 @@
+type: string
+description: "Id of the session for which the conversation is created.\n\n\n\n Source Ids can be obtained through contactable inboxes API or via generated.
Website: Chatwoot generated string which can be obtained from webhook events. Phone Channels(Twilio): Phone number in e164 format Email Channels: Contact Email address API Channel: Any Random String"
\ No newline at end of file
diff --git a/swagger/parameters/team_id.yml b/swagger/parameters/team_id.yml
new file mode 100644
index 000000000..096656d2a
--- /dev/null
+++ b/swagger/parameters/team_id.yml
@@ -0,0 +1,6 @@
+in: path
+name: id
+schema:
+ type: integer
+required: true
+description: The id of the team to be updated
diff --git a/swagger/paths/contact/list_create.yml b/swagger/paths/contact/list_create.yml
index 28689b78d..d0fcb5fd7 100644
--- a/swagger/paths/contact/list_create.yml
+++ b/swagger/paths/contact/list_create.yml
@@ -2,12 +2,11 @@ get:
tags:
- Contact
operationId: contactList
- description: Listing all the contacts with pagination
+ description: Listing all the contacts with pagination (Page size = 15)
summary: List Contacts
parameters:
- - name: query_hash
- in: query
- type: string
+ - $ref: '#/parameters/contact_sort_param'
+ - $ref: '#/parameters/page'
responses:
200:
description: Success
diff --git a/swagger/paths/contact/search.yml b/swagger/paths/contact/search.yml
index ad17fd8e1..30ade7b5a 100644
--- a/swagger/paths/contact/search.yml
+++ b/swagger/paths/contact/search.yml
@@ -2,12 +2,14 @@ get:
tags:
- Contact
operationId: contactSearch
- description: Search the contacts using a search key, currently supports email search
+ description: Search the contacts using a search key, currently supports email search (Page size = 15)
summary: Search Contacts
parameters:
- name: q
in: query
type: string
+ - $ref: '#/parameters/contact_sort_param'
+ - $ref: '#/parameters/page'
responses:
200:
description: Success
diff --git a/swagger/paths/contact_inboxes/create.yml b/swagger/paths/contact_inboxes/create.yml
index c6943d162..a0f641867 100644
--- a/swagger/paths/contact_inboxes/create.yml
+++ b/swagger/paths/contact_inboxes/create.yml
@@ -15,6 +15,8 @@ post:
type: number
description: The id of the inbox
required: true
+ source_id:
+ $ref: '#/parameters/source_id'
responses:
200:
description: Success
diff --git a/swagger/paths/contactable_inboxes/get.yml b/swagger/paths/contactable_inboxes/get.yml
new file mode 100644
index 000000000..5e6b651cb
--- /dev/null
+++ b/swagger/paths/contactable_inboxes/get.yml
@@ -0,0 +1,17 @@
+get:
+ tags:
+ - Contact
+ operationId: contactableInboxesGet
+ description: Get List of contactable Inboxes
+ summary: Get Contactable Inboxes
+ responses:
+ 200:
+ description: Success
+ schema:
+ $ref: '#/definitions/contactable_inboxes'
+ 401:
+ description: Authentication error
+ schema:
+ $ref: '#/definitions/bad_request_error'
+ 422:
+ description: Incorrect payload
diff --git a/swagger/paths/conversation/assignments.yml b/swagger/paths/conversation/assignments.yml
index 7edfb0b48..a7b001e5c 100644
--- a/swagger/paths/conversation/assignments.yml
+++ b/swagger/paths/conversation/assignments.yml
@@ -1,29 +1,27 @@
-post:
- tags:
- - ConversationAssignment
- operationId: conversationAssignment
- summary: Assign Conversation
- description: Assign a conversation to an agent
- parameters:
- - name: id
- in: path
- type: number
- description: id of the conversation
- required: true
- - name: data
- in: body
- required: true
- schema:
- type: object
- properties:
- assignee_id:
- type: number
- responses:
- 200:
- description: Success
- schema:
- $ref: '#/definitions/user'
- 404:
- description: Conversation not found
- 403:
- description: Access denied
+tags:
+ - Conversation Assignment
+operationId: assign-a-conversation
+summary: Assign Conversation
+description: Assign a conversation to an agent or a team
+parameters:
+ - name: data
+ in: body
+ required: true
+ schema:
+ type: object
+ properties:
+ assignee_id:
+ type: number
+ description: Id of the assignee user
+ team_id:
+ type: number
+ description: Id of the team. If the assignee_id is present, this param would be ignored
+responses:
+ 200:
+ description: Success
+ schema:
+ $ref: '#/definitions/user'
+ 404:
+ description: Conversation not found
+ 401:
+ description: Unauthorized
diff --git a/swagger/paths/conversation/crud.yml b/swagger/paths/conversation/crud.yml
deleted file mode 100644
index cff9c21f8..000000000
--- a/swagger/paths/conversation/crud.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-get:
- tags:
- - Conversation
- operationId: conversationDetails
- summary: Conversation Details
- description: Get all details regarding a conversation with all messages in the conversation
- parameters:
- - name: id
- in: path
- type: number
- description: ID of Conversation
- required: true
- responses:
- 200:
- description: Success
- schema:
- $ref: '#/definitions/conversation_show'
- 404:
- description: Conversation not found
- 403:
- description: Access denied
diff --git a/swagger/paths/conversation/index_or_create.yml b/swagger/paths/conversation/index_or_create.yml
index 5bf8dd324..0fc253fff 100644
--- a/swagger/paths/conversation/index_or_create.yml
+++ b/swagger/paths/conversation/index_or_create.yml
@@ -5,6 +5,7 @@ get:
description: List all the conversations with pagination
summary: Conversations List
parameters:
+ - $ref: '#/parameters/account_id'
- name: assignee_type
in: query
type: string
@@ -68,6 +69,7 @@ get:
type: array
items:
type: string
+ - $ref: '#/parameters/account_id'
responses:
200:
@@ -86,20 +88,26 @@ post:
- Conversation
operationId: newConversation
summary: Create New Conversation
- description: Create conversation
+ description: "Creating a conversation in chatwoot requires a source id. \n\n Learn more about source_id: https://github.com/chatwoot/chatwoot/wiki/Building-on-Top-of-Chatwoot:-Importing-Existing-Contacts-and-Creating-Conversations"
security:
- userApiKey: []
- agentBotApiKey: []
parameters:
+ - $ref: '#/parameters/account_id'
- name: data
in: body
required: true
schema:
type: object
properties:
- source_id:
+ source_id:
+ $ref: '#/parameters/source_id'
+ inbox_id:
type: string
- description: Contact Source Id
+ description: "Id of inbox in which the conversation is created Allowed Inbox Types: Website, Phone, Api, Email "
+ contact_id:
+ type: string
+ description: Contact Id for which conversation is created
additional_attributes:
type: object
description: Lets you specify attributes like browser information
diff --git a/swagger/paths/conversation/labels.yml b/swagger/paths/conversation/labels.yml
deleted file mode 100644
index d67c5de1a..000000000
--- a/swagger/paths/conversation/labels.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-get:
- tags:
- - ConversationLabels
- operationId: conversationLabelsList
- summary: List Labels
- description: Lists all the labels of a conversation
- parameters:
- - name: id
- in: path
- type: number
- description: ID of the conversation
- required: true
- responses:
- 200:
- description: Success
- schema:
- $ref: '#/definitions/conversation_labels'
- 404:
- description: Conversation not found
- 403:
- description: Access denied
-
-post:
- tags:
- - ConversationLabels
- operationId: conversationAddLabels
- summary: Add Labels
- description: Creates new labels and associates it with the conversation
- parameters:
- - name: id
- in: path
- type: number
- description: ID of the conversation
- required: true
- - name: data
- in: body
- required: true
- schema:
- type: object
- properties:
- labels:
- type: array
- description: 'Array of labels'
- properties:
- type: string
- responses:
- 200:
- description: Success
- schema:
- $ref: '#/definitions/conversation_labels'
- 404:
- description: Conversation not found
- 403:
- description: Access denied
diff --git a/swagger/paths/conversation/labels/create.yml b/swagger/paths/conversation/labels/create.yml
new file mode 100644
index 000000000..6082ccae4
--- /dev/null
+++ b/swagger/paths/conversation/labels/create.yml
@@ -0,0 +1,26 @@
+tags:
+ - Conversation Labels
+operationId: conversation-add-labels
+summary: Add Labels
+description: Add labels to a conversation. Note that this API would overwrite the existing list of labels associated to the conversation.
+parameters:
+ - name: data
+ in: body
+ required: true
+ schema:
+ type: object
+ properties:
+ labels:
+ type: array
+ description: Array of labels (comma-separated strings)
+ properties:
+ type: string
+responses:
+ 200:
+ description: Success
+ schema:
+ $ref: '#/definitions/conversation_labels'
+ 404:
+ description: Conversation not found
+ 401:
+ description: Unauthorized
diff --git a/swagger/paths/conversation/labels/index.yml b/swagger/paths/conversation/labels/index.yml
new file mode 100644
index 000000000..107fc0132
--- /dev/null
+++ b/swagger/paths/conversation/labels/index.yml
@@ -0,0 +1,14 @@
+tags:
+ - Conversation Labels
+operationId: list-all-labels-of-a-conversation
+summary: List Labels
+description: Lists all the labels of a conversation
+responses:
+ 200:
+ description: Success
+ schema:
+ $ref: '#/definitions/conversation_labels'
+ 404:
+ description: Conversation not found
+ 401:
+ description: Unauthorized
diff --git a/swagger/paths/conversation/messages/create.yml b/swagger/paths/conversation/messages/create.yml
new file mode 100644
index 000000000..4ab9e27a0
--- /dev/null
+++ b/swagger/paths/conversation/messages/create.yml
@@ -0,0 +1,25 @@
+tags:
+ - Messages
+operationId: create-a-new-message-in-a-conversation
+summary: Create New Message
+description: Create a new message in the conversation
+security:
+ - userApiKey: []
+ - agentBotApiKey: []
+parameters:
+ - name: data
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/conversation_message_create'
+responses:
+ 200:
+ description: Success
+ schema:
+ allOf:
+ - $ref: '#/definitions/generic_id'
+ - $ref: '#/definitions/message'
+ 404:
+ description: Conversation not found
+ 403:
+ description: Access denied
diff --git a/swagger/paths/conversation/messages/create_attachment.yml b/swagger/paths/conversation/messages/create_attachment.yml
new file mode 100644
index 000000000..e6bbd6854
--- /dev/null
+++ b/swagger/paths/conversation/messages/create_attachment.yml
@@ -0,0 +1,47 @@
+post:
+ tags:
+ - Messages
+ operationId: conversationNewMessageAttachment
+ summary: Create New Message Attachment
+ description: Create an attachment Message
+ consumes:
+ - multipart/form-data
+ security:
+ - userApiKey: []
+ - agentBotApiKey: []
+ parameters:
+ - $ref: '#/parameters/account_id'
+ - $ref: '#/parameters/conversation_id'
+ required: true
+ - in: formData
+ name: content
+ type: string
+ description: The content of the message
+ required: true
+ - in: formData
+ name: message_type
+ type: string
+ enum: ['outgoing', 'incoming']
+ - in: formData
+ name: private
+ type: boolean
+ description: Flag to identify if it is a private note
+ - in: formData
+ name: attachments
+ type: array
+ description: The files to be uploaded.
+ items:
+ type: file
+
+
+ responses:
+ 200:
+ description: Success
+ schema:
+ allOf:
+ - $ref: '#/definitions/generic_id'
+ - $ref: '#/definitions/message'
+ 404:
+ description: Conversation not found
+ 403:
+ description: Access denied
diff --git a/swagger/paths/conversation/messages/delete.yml b/swagger/paths/conversation/messages/delete.yml
new file mode 100644
index 000000000..f038074c7
--- /dev/null
+++ b/swagger/paths/conversation/messages/delete.yml
@@ -0,0 +1,12 @@
+tags:
+ - Messages
+operationId: delete-a-message
+summary: Delete a message
+description: Delete a message and it's attachments from the conversation.
+responses:
+ 200:
+ description: Success
+ 401:
+ description: Unauthorized
+ 404:
+ description: The message or conversation does not exist in the account
diff --git a/swagger/paths/conversation/messages/index.yml b/swagger/paths/conversation/messages/index.yml
new file mode 100644
index 000000000..8fe7558ae
--- /dev/null
+++ b/swagger/paths/conversation/messages/index.yml
@@ -0,0 +1,18 @@
+tags:
+ - Messages
+operationId: list-all-messages
+summary: Get messages
+description: List all messages of a conversation
+responses:
+ 200:
+ description: Success
+ type: array
+ description: Array of messages
+ schema:
+ allOf:
+ - $ref: '#/definitions/generic_id'
+ - $ref: '#/definitions/message'
+ 404:
+ description: Conversation not found
+ 401:
+ description: Unauthorized
diff --git a/swagger/paths/conversation/messages/index_create.yml b/swagger/paths/conversation/messages/index_create.yml
deleted file mode 100644
index d7ccf44fe..000000000
--- a/swagger/paths/conversation/messages/index_create.yml
+++ /dev/null
@@ -1,57 +0,0 @@
-get:
- tags:
- - Messages
- operationId: listAllMessages
- summary: Get messages
- description: List all messages of a conversation
- parameters:
- - name: id
- in: path
- type: number
- description: ID of the conversation
- required: true
- responses:
- 200:
- description: Success
- type: array
- description: Array of messages
- schema:
- allOf:
- - $ref: '#/definitions/generic_id'
- - $ref: '#/definitions/message'
- 404:
- description: Conversation not found
- 403:
- description: Access denied
-
-post:
- tags:
- - Messages
- operationId: conversationNewMessage
- summary: Create New Message
- description: All the agent replies are created as new messages through this endpoint
- security:
- - userApiKey: []
- - agentBotApiKey: []
- parameters:
- - name: id
- in: path
- type: number
- description: ID of the conversation
- required: true
- - name: data
- in: body
- required: true
- schema:
- $ref: '#/definitions/conversation_message_create'
- responses:
- 200:
- description: Success
- schema:
- allOf:
- - $ref: '#/definitions/generic_id'
- - $ref: '#/definitions/message'
- 404:
- description: Conversation not found
- 403:
- description: Access denied
diff --git a/swagger/paths/conversation/show.yml b/swagger/paths/conversation/show.yml
new file mode 100644
index 000000000..81782702c
--- /dev/null
+++ b/swagger/paths/conversation/show.yml
@@ -0,0 +1,14 @@
+tags:
+ - Conversation
+operationId: get-details-of-a-conversation
+summary: Conversation Details
+description: Get all details regarding a conversation with all messages in the conversation
+responses:
+ 200:
+ description: Success
+ schema:
+ $ref: '#/definitions/conversation_show'
+ 404:
+ description: Conversation not found
+ 403:
+ description: Access denied
diff --git a/swagger/paths/conversation/toggle_status.yml b/swagger/paths/conversation/toggle_status.yml
index 3ec5b43ba..250e050e5 100644
--- a/swagger/paths/conversation/toggle_status.yml
+++ b/swagger/paths/conversation/toggle_status.yml
@@ -1,35 +1,29 @@
-post:
- tags:
- - Conversation
- operationId: conversationToggleStatus
- summary: Toggle Status
- description: Toggles the status of the conversation between open and resolved
- security:
- - userApiKey: []
- - agentBotApiKey: []
- parameters:
- - name: id
- in: path
- type: number
- description: ID of the conversation
- required: true
- - name: data
- in: body
- required: true
- schema:
- type: object
- properties:
- status:
- type: string
- enum: ["open", "resolved", "bot"]
- required: true
- description: The status of the conversation
- responses:
- 200:
- description: Success
- schema:
- $ref: '#/definitions/conversation_status_toggle'
- 404:
- description: Conversation not found
- 403:
- description: Access denied
+tags:
+ - Conversation
+operationId: toggle-status-of-a-conversation
+summary: Toggle Status
+description: Toggles the status of the conversation between open and resolved
+security:
+ - userApiKey: []
+ - agentBotApiKey: []
+parameters:
+ - name: data
+ in: body
+ required: true
+ schema:
+ type: object
+ properties:
+ status:
+ type: string
+ enum: ["open", "resolved", "bot"]
+ required: true
+ description: The status of the conversation
+responses:
+ 200:
+ description: Success
+ schema:
+ $ref: '#/definitions/conversation_status_toggle'
+ 404:
+ description: Conversation not found
+ 401:
+ description: Unauthorized
diff --git a/swagger/paths/index.yml b/swagger/paths/index.yml
index d31f88e4a..b47d6cb9c 100644
--- a/swagger/paths/index.yml
+++ b/swagger/paths/index.yml
@@ -4,7 +4,7 @@
# Inboxes
/accounts/{account_id}/inboxes:
$ref: ./inboxes/index.yml
-/accounts/{account_id}/inboxes:
+/accounts/{account_id}/inboxes/:
$ref: ./inboxes/create.yml
/accounts/{account_id}/inboxes/{id}:
$ref: ./inboxes/update.yml
@@ -16,21 +16,60 @@
# Conversations
/accounts/{account_id}/conversations:
+ parameters:
+ - $ref: '#/parameters/account_id'
$ref: ./conversation/index_or_create.yml
-/accounts/{account_id}/conversations/{id}:
- $ref: ./conversation/crud.yml
-/accounts/{account_id}/conversations/{id}/toggle_status:
- $ref: ./conversation/toggle_status.yml
+
+/accounts/{account_id}/conversations/{converstion_id}:
+ parameters:
+ - $ref: '#/parameters/account_id'
+ - $ref: '#/parameters/conversation_id'
+ get:
+ $ref: ./conversation/show.yml
+
+/accounts/{account_id}/conversations/{conversation_id}/toggle_status:
+ parameters:
+ - $ref: '#/parameters/account_id'
+ - $ref: '#/parameters/conversation_id'
+ post:
+ $ref: ./conversation/toggle_status.yml
# Messages
/accounts/{account_id}/conversations/{id}/messages:
- $ref: ./conversation/messages/index_create.yml
+ $ref: ./conversation/messages/create_attachment.yml
+/accounts/{account_id}/conversations/{converstion_id}/messages:
+ parameters:
+ - $ref: '#/parameters/account_id'
+ - $ref: '#/parameters/conversation_id'
+ get:
+ $ref: ./conversation/messages/index.yml
+ post:
+ $ref: ./conversation/messages/create.yml
-/accounts/{account_id}/conversations/{id}/labels:
- $ref: ./conversation/labels.yml
+/accounts/{account_id}/conversations/{conversation_id}/messages/{message_id}:
+ parameters:
+ - $ref: '#/parameters/account_id'
+ - $ref: '#/parameters/conversation_id'
+ - $ref: '#/parameters/message_id'
+ delete:
+ $ref: ./conversation/messages/delete.yml
-/accounts/{account_id}/conversations/{id}/assignments:
- $ref: ./conversation/assignments.yml
+
+/accounts/{account_id}/conversations/{conversation_id}/labels:
+ parameters:
+ - $ref: '#/parameters/account_id'
+ - $ref: '#/parameters/conversation_id'
+ get:
+ $ref: ./conversation/labels/index.yml
+ post:
+ $ref: ./conversation/labels/create.yml
+
+/accounts/{account_id}/conversations/{conversation_id}/assignments:
+ parameters:
+ - $ref: '#/parameters/account_id'
+ - $ref: '#/parameters/conversation_id'
+ post:
+ $ref: ./conversation/assignments.yml
# Contacts
/accounts/{account_id}/contacts:
@@ -47,8 +86,30 @@
/accounts/{account_id}/contacts/{id}/contact_inboxes:
$ref: ./contact_inboxes/create.yml
+/accounts/{account_id}/contacts/{id}/contactable_inboxes:
+ $ref: ./contactable_inboxes/get.yml
# Profile
/profile:
$ref: ./profile/index.yml
+
+# Teams
+/accounts/{account_id}/teams:
+ parameters:
+ - $ref: '#/parameters/account_id'
+ get:
+ $ref: ./teams/index.yml
+ post:
+ $ref: ./teams/create.yml
+
+/accounts/{account_id}/teams/{id}:
+ parameters:
+ - $ref: '#/parameters/account_id'
+ - $ref: '#/parameters/team_id'
+ get:
+ $ref: './teams/show.yml'
+ patch:
+ $ref: ./teams/update.yml
+ delete:
+ $ref: ./teams/delete.yml
diff --git a/swagger/paths/teams/create.yml b/swagger/paths/teams/create.yml
new file mode 100644
index 000000000..2ec066738
--- /dev/null
+++ b/swagger/paths/teams/create.yml
@@ -0,0 +1,19 @@
+tags:
+ - Teams
+operationId: create-a-team
+summary: Create a team
+description: Create a team in the account
+parameters:
+ - $ref: '#/parameters/account_id'
+ - name: data
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/team_create_update_payload'
+responses:
+ 200:
+ description: Success
+ schema:
+ $ref: '#/definitions/team'
+ 401:
+ description: Unauthorized
diff --git a/swagger/paths/teams/delete.yml b/swagger/paths/teams/delete.yml
new file mode 100644
index 000000000..7c5698b99
--- /dev/null
+++ b/swagger/paths/teams/delete.yml
@@ -0,0 +1,12 @@
+tags:
+ - Teams
+operationId: delete-a-team
+summary: Delete a team
+description: Delete a team from the account
+responses:
+ 200:
+ description: Success
+ 401:
+ description: Unauthorized
+ 404:
+ description: The team does not exist in the account
diff --git a/swagger/paths/teams/index.yml b/swagger/paths/teams/index.yml
new file mode 100644
index 000000000..8e1384cf9
--- /dev/null
+++ b/swagger/paths/teams/index.yml
@@ -0,0 +1,14 @@
+tags:
+ - Teams
+operationId: list-all-teams
+summary: List all teams
+description: List all teams available in the current account
+responses:
+ 200:
+ description: Success
+ schema:
+ type: array
+ description: 'Array of teams'
+ $ref: '#/definitions/team'
+ 401:
+ description: Unauthorized
diff --git a/swagger/paths/teams/show.yml b/swagger/paths/teams/show.yml
new file mode 100644
index 000000000..d7ccdbb04
--- /dev/null
+++ b/swagger/paths/teams/show.yml
@@ -0,0 +1,14 @@
+tags:
+ - Teams
+operationId: get-details-of-a-single-team
+summary: Get a team details
+description: Get the details of a team in the account
+responses:
+ 200:
+ description: Success
+ schema:
+ $ref: '#/definitions/team'
+ 401:
+ description: Unauthorized
+ 404:
+ description: The given team id does not exist in the account
diff --git a/swagger/paths/teams/update.yml b/swagger/paths/teams/update.yml
new file mode 100644
index 000000000..8afeddc02
--- /dev/null
+++ b/swagger/paths/teams/update.yml
@@ -0,0 +1,18 @@
+tags:
+ - Teams
+operationId: update-a-team
+summary: Update a team
+description: Update a team's attributes
+parameters:
+ - name: data
+ in: body
+ required: true
+ schema:
+ $ref: '#/definitions/team_create_update_payload'
+responses:
+ 200:
+ description: Success
+ schema:
+ $ref: '#/definitions/team'
+ 401:
+ description: Unauthorized
diff --git a/swagger/swagger.json b/swagger/swagger.json
index 1fe6583a8..2007a76cc 100644
--- a/swagger/swagger.json
+++ b/swagger/swagger.json
@@ -1,5 +1,5 @@
{
- "swagger": 2.0,
+ "swagger": "2.0",
"info": {
"description": "This is the API documentation for Chatwoot server.",
"version": "1.0.0",
@@ -53,6 +53,30 @@
],
"paths": {
"/accounts/{account_id}/inboxes": {
+ "get": {
+ "tags": [
+ "Inbox"
+ ],
+ "operationId": "listAllInboxes",
+ "summary": "List all inboxes",
+ "description": "List all inboxes available in the current account",
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/inbox"
+ }
+ },
+ "404": {
+ "description": "Inbox not found"
+ },
+ "403": {
+ "description": "Access denied"
+ }
+ }
+ }
+ },
+ "/accounts/{account_id}/inboxes/": {
"post": {
"tags": [
"Inbox"
@@ -329,6 +353,9 @@
"items": {
"type": "string"
}
+ },
+ {
+ "$ref": "#/parameters/account_id"
}
],
"responses": {
@@ -353,7 +380,7 @@
],
"operationId": "newConversation",
"summary": "Create New Conversation",
- "description": "Create conversation",
+ "description": "Creating a conversation in chatwoot requires a source id. \n\n Learn more about source_id: https://github.com/chatwoot/chatwoot/wiki/Building-on-Top-of-Chatwoot:-Importing-Existing-Contacts-and-Creating-Conversations",
"security": [
{
"userApiKey": [
@@ -367,6 +394,9 @@
}
],
"parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ },
{
"name": "data",
"in": "body",
@@ -375,8 +405,15 @@
"type": "object",
"properties": {
"source_id": {
+ "$ref": "#/parameters/source_id"
+ },
+ "inbox_id": {
"type": "string",
- "description": "Contact Source Id"
+ "description": "Id of inbox in which the conversation is created Allowed Inbox Types: Website, Phone, Api, Email "
+ },
+ "contact_id": {
+ "type": "string",
+ "description": "Contact Id for which conversation is created"
},
"additional_attributes": {
"type": "object",
@@ -413,23 +450,22 @@
}
}
},
- "/accounts/{account_id}/conversations/{id}": {
+ "/accounts/{account_id}/conversations/{converstion_id}": {
+ "parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ },
+ {
+ "$ref": "#/parameters/conversation_id"
+ }
+ ],
"get": {
"tags": [
"Conversation"
],
- "operationId": "conversationDetails",
+ "operationId": "get-details-of-a-conversation",
"summary": "Conversation Details",
"description": "Get all details regarding a conversation with all messages in the conversation",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "type": "number",
- "description": "ID of Conversation",
- "required": true
- }
- ],
"responses": {
"200": {
"description": "Success",
@@ -446,12 +482,20 @@
}
}
},
- "/accounts/{account_id}/conversations/{id}/toggle_status": {
+ "/accounts/{account_id}/conversations/{conversation_id}/toggle_status": {
+ "parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ },
+ {
+ "$ref": "#/parameters/conversation_id"
+ }
+ ],
"post": {
"tags": [
"Conversation"
],
- "operationId": "conversationToggleStatus",
+ "operationId": "toggle-status-of-a-conversation",
"summary": "Toggle Status",
"description": "Toggles the status of the conversation between open and resolved",
"security": [
@@ -467,13 +511,6 @@
}
],
"parameters": [
- {
- "name": "id",
- "in": "path",
- "type": "number",
- "description": "ID of the conversation",
- "required": true
- },
{
"name": "data",
"in": "body",
@@ -505,33 +542,77 @@
"404": {
"description": "Conversation not found"
},
- "403": {
- "description": "Access denied"
+ "401": {
+ "description": "Unauthorized"
}
}
}
},
"/accounts/{account_id}/conversations/{id}/messages": {
- "get": {
+ "post": {
"tags": [
"Messages"
],
- "operationId": "listAllMessages",
- "summary": "Get messages",
- "description": "List all messages of a conversation",
+ "operationId": "conversationNewMessageAttachment",
+ "summary": "Create New Message Attachment",
+ "description": "Create an attachment Message",
+ "consumes": [
+ "multipart/form-data"
+ ],
+ "security": [
+ {
+ "userApiKey": [
+
+ ]
+ },
+ {
+ "agentBotApiKey": [
+
+ ]
+ }
+ ],
"parameters": [
{
- "name": "id",
- "in": "path",
- "type": "number",
- "description": "ID of the conversation",
+ "$ref": "#/parameters/account_id"
+ },
+ {
+ "$ref": "#/parameters/conversation_id"
+ },
+ {
+ "in": "formData",
+ "name": "content",
+ "type": "string",
+ "description": "The content of the message",
"required": true
+ },
+ {
+ "in": "formData",
+ "name": "message_type",
+ "type": "string",
+ "enum": [
+ "outgoing",
+ "incoming"
+ ]
+ },
+ {
+ "in": "formData",
+ "name": "private",
+ "type": "boolean",
+ "description": "Flag to identify if it is a private note"
+ },
+ {
+ "in": "formData",
+ "name": "attachments",
+ "type": "array",
+ "description": "The files to be uploaded.",
+ "items": {
+ "type": "file"
+ }
}
],
"responses": {
"200": {
- "description": "Array of messages",
- "type": "array",
+ "description": "Success",
"schema": {
"allOf": [
{
@@ -550,14 +631,54 @@
"description": "Access denied"
}
}
+ }
+ },
+ "/accounts/{account_id}/conversations/{converstion_id}/messages": {
+ "parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ },
+ {
+ "$ref": "#/parameters/conversation_id"
+ }
+ ],
+ "get": {
+ "tags": [
+ "Messages"
+ ],
+ "operationId": "list-all-messages",
+ "summary": "Get messages",
+ "description": "List all messages of a conversation",
+ "responses": {
+ "200": {
+ "description": "Array of messages",
+ "type": "array",
+ "schema": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/generic_id"
+ },
+ {
+ "$ref": "#/definitions/message"
+ }
+ ]
+ }
+ },
+ "404": {
+ "description": "Conversation not found"
+ },
+ "401": {
+ "description": "Unauthorized"
+ }
+ }
},
"post": {
"tags": [
"Messages"
],
- "operationId": "conversationNewMessage",
+ "operationId": "create-a-new-message-in-a-conversation",
"summary": "Create New Message",
- "description": "All the agent replies are created as new messages through this endpoint",
+ "description": "Create a new message in the conversation",
"security": [
{
"userApiKey": [
@@ -571,13 +692,6 @@
}
],
"parameters": [
- {
- "name": "id",
- "in": "path",
- "type": "number",
- "description": "ID of the conversation",
- "required": true
- },
{
"name": "data",
"in": "body",
@@ -610,23 +724,54 @@
}
}
},
- "/accounts/{account_id}/conversations/{id}/labels": {
+ "/accounts/{account_id}/conversations/{conversation_id}/messages/{message_id}": {
+ "parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ },
+ {
+ "$ref": "#/parameters/conversation_id"
+ },
+ {
+ "$ref": "#/parameters/message_id"
+ }
+ ],
+ "delete": {
+ "tags": [
+ "Messages"
+ ],
+ "operationId": "delete-a-message",
+ "summary": "Delete a message",
+ "description": "Delete a message and it's attachments from the conversation.",
+ "responses": {
+ "200": {
+ "description": "Success"
+ },
+ "401": {
+ "description": "Unauthorized"
+ },
+ "404": {
+ "description": "The message or conversation does not exist in the account"
+ }
+ }
+ }
+ },
+ "/accounts/{account_id}/conversations/{conversation_id}/labels": {
+ "parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ },
+ {
+ "$ref": "#/parameters/conversation_id"
+ }
+ ],
"get": {
"tags": [
- "ConversationLabels"
+ "Conversation Labels"
],
- "operationId": "conversationLabelsList",
+ "operationId": "list-all-labels-of-a-conversation",
"summary": "List Labels",
"description": "Lists all the labels of a conversation",
- "parameters": [
- {
- "name": "id",
- "in": "path",
- "type": "number",
- "description": "ID of the conversation",
- "required": true
- }
- ],
"responses": {
"200": {
"description": "Success",
@@ -637,26 +782,19 @@
"404": {
"description": "Conversation not found"
},
- "403": {
- "description": "Access denied"
+ "401": {
+ "description": "Unauthorized"
}
}
},
"post": {
"tags": [
- "ConversationLabels"
+ "Conversation Labels"
],
- "operationId": "conversationAddLabels",
+ "operationId": "conversation-add-labels",
"summary": "Add Labels",
- "description": "Creates new labels and associates it with the conversation",
+ "description": "Add labels to a conversation. Note that this API would overwrite the existing list of labels associated to the conversation.",
"parameters": [
- {
- "name": "id",
- "in": "path",
- "type": "number",
- "description": "ID of the conversation",
- "required": true
- },
{
"name": "data",
"in": "body",
@@ -666,7 +804,7 @@
"properties": {
"labels": {
"type": "array",
- "description": "Array of labels",
+ "description": "Array of labels (comma-separated strings)",
"properties": {
"type": "string"
}
@@ -685,28 +823,29 @@
"404": {
"description": "Conversation not found"
},
- "403": {
- "description": "Access denied"
+ "401": {
+ "description": "Unauthorized"
}
}
}
},
- "/accounts/{account_id}/conversations/{id}/assignments": {
+ "/accounts/{account_id}/conversations/{conversation_id}/assignments": {
+ "parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ },
+ {
+ "$ref": "#/parameters/conversation_id"
+ }
+ ],
"post": {
"tags": [
- "ConversationAssignment"
+ "Conversation Assignment"
],
- "operationId": "conversationAssignment",
+ "operationId": "assign-a-conversation",
"summary": "Assign Conversation",
- "description": "Assign a conversation to an agent",
+ "description": "Assign a conversation to an agent or a team",
"parameters": [
- {
- "name": "id",
- "in": "path",
- "type": "number",
- "description": "id of the conversation",
- "required": true
- },
{
"name": "data",
"in": "body",
@@ -715,7 +854,12 @@
"type": "object",
"properties": {
"assignee_id": {
- "type": "number"
+ "type": "number",
+ "description": "Id of the assignee user"
+ },
+ "team_id": {
+ "type": "number",
+ "description": "Id of the team. If the assignee_id is present, this param would be ignored"
}
}
}
@@ -731,8 +875,8 @@
"404": {
"description": "Conversation not found"
},
- "403": {
- "description": "Access denied"
+ "401": {
+ "description": "Unauthorized"
}
}
}
@@ -743,13 +887,14 @@
"Contact"
],
"operationId": "contactList",
- "description": "Listing all the contacts with pagination",
+ "description": "Listing all the contacts with pagination (Page size = 15)",
"summary": "List Contacts",
"parameters": [
{
- "name": "query_hash",
- "in": "query",
- "type": "string"
+ "$ref": "#/parameters/contact_sort_param"
+ },
+ {
+ "$ref": "#/parameters/page"
}
],
"responses": {
@@ -908,13 +1053,19 @@
"Contact"
],
"operationId": "contactSearch",
- "description": "Search the contacts using a search key, currently supports email search",
+ "description": "Search the contacts using a search key, currently supports email search (Page size = 15)",
"summary": "Search Contacts",
"parameters": [
{
"name": "q",
"in": "query",
"type": "string"
+ },
+ {
+ "$ref": "#/parameters/contact_sort_param"
+ },
+ {
+ "$ref": "#/parameters/page"
}
],
"responses": {
@@ -958,6 +1109,9 @@
"type": "number",
"description": "The id of the inbox",
"required": true
+ },
+ "source_id": {
+ "$ref": "#/parameters/source_id"
}
}
}
@@ -982,6 +1136,33 @@
}
}
},
+ "/accounts/{account_id}/contacts/{id}/contactable_inboxes": {
+ "get": {
+ "tags": [
+ "Contact"
+ ],
+ "operationId": "contactableInboxesGet",
+ "description": "Get List of contactable Inboxes",
+ "summary": "Get Contactable Inboxes",
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/contactable_inboxes"
+ }
+ },
+ "401": {
+ "description": "Authentication error",
+ "schema": {
+ "$ref": "#/definitions/bad_request_error"
+ }
+ },
+ "422": {
+ "description": "Incorrect payload"
+ }
+ }
+ }
+ },
"/profile": {
"get": {
"tags": [
@@ -1002,6 +1183,144 @@
}
}
}
+ },
+ "/accounts/{account_id}/teams": {
+ "parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ }
+ ],
+ "get": {
+ "tags": [
+ "Teams"
+ ],
+ "operationId": "list-all-teams",
+ "summary": "List all teams",
+ "description": "List all teams available in the current account",
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/team"
+ }
+ },
+ "401": {
+ "description": "Unauthorized"
+ }
+ }
+ },
+ "post": {
+ "tags": [
+ "Teams"
+ ],
+ "operationId": "create-a-team",
+ "summary": "Create a team",
+ "description": "Create a team in the account",
+ "parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ },
+ {
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/team_create_update_payload"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/team"
+ }
+ },
+ "401": {
+ "description": "Unauthorized"
+ }
+ }
+ }
+ },
+ "/accounts/{account_id}/teams/{id}": {
+ "parameters": [
+ {
+ "$ref": "#/parameters/account_id"
+ },
+ {
+ "$ref": "#/parameters/team_id"
+ }
+ ],
+ "get": {
+ "tags": [
+ "Teams"
+ ],
+ "operationId": "get-details-of-a-single-team",
+ "summary": "Get a team details",
+ "description": "Get the details of a team in the account",
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/team"
+ }
+ },
+ "401": {
+ "description": "Unauthorized"
+ },
+ "404": {
+ "description": "The given team id does not exist in the account"
+ }
+ }
+ },
+ "patch": {
+ "tags": [
+ "Teams"
+ ],
+ "operationId": "update-a-team",
+ "summary": "Update a team",
+ "description": "Update a team's attributes",
+ "parameters": [
+ {
+ "name": "data",
+ "in": "body",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/team_create_update_payload"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Success",
+ "schema": {
+ "$ref": "#/definitions/team"
+ }
+ },
+ "401": {
+ "description": "Unauthorized"
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "Teams"
+ ],
+ "operationId": "delete-a-team",
+ "summary": "Delete a team",
+ "description": "Delete a team from the account",
+ "responses": {
+ "200": {
+ "description": "Success"
+ },
+ "401": {
+ "description": "Unauthorized"
+ },
+ "404": {
+ "description": "The team does not exist in the account"
+ }
+ }
+ }
}
},
"definitions": {
@@ -1305,6 +1624,18 @@
}
}
},
+ "contactable_inboxes": {
+ "type": "object",
+ "properties": {
+ "source_id": {
+ "type": "string",
+ "description": "Contact Inbox Source Id"
+ },
+ "inbox": {
+ "$ref": "#/definitions/inbox"
+ }
+ }
+ },
"account": {
"type": "object",
"properties": {
@@ -1326,6 +1657,35 @@
}
}
},
+ "team": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "number",
+ "description": "The id of the team"
+ },
+ "name": {
+ "type": "string",
+ "description": "The name of the team"
+ },
+ "description": {
+ "type": "string",
+ "description": "The description about the team"
+ },
+ "allow_auto_assign": {
+ "type": "boolean",
+ "description": "If this setting is turned on, the system would automatically assign the conversation to an agent in the team while assigning the conversation to a team"
+ },
+ "account_id": {
+ "type": "number",
+ "description": "The id of the account with the team is a part of"
+ },
+ "is_member": {
+ "type": "boolean",
+ "description": "This field shows whether the current user is a part of the team"
+ }
+ }
+ },
"extended_contact": {
"allOf": [
{
@@ -1671,6 +2031,94 @@
"description": "attributes based on your content type"
}
}
+ },
+ "team_create_update_payload": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the team"
+ },
+ "description": {
+ "type": "string",
+ "description": "The description of the team"
+ },
+ "allow_auto_assign": {
+ "type": "boolean",
+ "description": "If this setting is turned on, the system would automatically assign the conversation to an agent in the team while assigning the conversation to a team"
+ }
+ }
+ }
+ },
+ "parameters": {
+ "account_id": {
+ "in": "path",
+ "name": "account_id",
+ "schema": {
+ "type": "integer"
+ },
+ "required": true,
+ "description": "The numeric ID of the account"
+ },
+ "team_id": {
+ "in": "path",
+ "name": "id",
+ "schema": {
+ "type": "integer"
+ },
+ "required": true,
+ "description": "The id of the team to be updated"
+ },
+ "source_id": {
+ "type": "string",
+ "description": "Id of the session for which the conversation is created.\n\n\n\n Source Ids can be obtained through contactable inboxes API or via generated.