From 5487d4c615ebd5da0e38dbb72d7cd812834cffd3 Mon Sep 17 00:00:00 2001 From: Muhsin Keloth Date: Wed, 18 Jun 2025 05:14:56 +0530 Subject: [PATCH 01/27] fix: Include private channels in Slack integration pagination (#11751) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes https://linear.app/chatwoot/issue/CW-4507/slack-integration-not-showing-private-channels ## Problem When the Slack workspace has many channels (requiring multiple API requests to fetch all of them), our system was only looking for private channels in the first batch of results. All subsequent batches were missing the instruction to include private channels, so they only returned public channels. ## Root Cause - Initial API call correctly specified `types: 'public_channel,private_channel'` - Pagination loop only passed `cursor` parameter, omitting `types` and `exclude_archived` - Subsequent pages defaulted to public channels only ## Changes - Fixed parameter formatting in `types` (removed space: `'public_channel, private_channel'` → `'public_channel,private_channel'`) - Added missing `types` and `exclude_archived` parameters to paginated `conversations_list` calls --------- Co-authored-by: Sojan Jose --- lib/integrations/slack/channel_builder.rb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/integrations/slack/channel_builder.rb b/lib/integrations/slack/channel_builder.rb index 1edacf8f7..707254e1f 100644 --- a/lib/integrations/slack/channel_builder.rb +++ b/lib/integrations/slack/channel_builder.rb @@ -24,10 +24,14 @@ class Integrations::Slack::ChannelBuilder end def channels - conversations_list = slack_client.conversations_list(types: 'public_channel, private_channel', exclude_archived: true) + conversations_list = slack_client.conversations_list(types: 'public_channel,private_channel', exclude_archived: true) channel_list = conversations_list.channels while conversations_list.response_metadata.next_cursor.present? - conversations_list = slack_client.conversations_list(cursor: conversations_list.response_metadata.next_cursor) + conversations_list = slack_client.conversations_list( + cursor: conversations_list.response_metadata.next_cursor, + types: 'public_channel,private_channel', + exclude_archived: true + ) channel_list.concat(conversations_list.channels) end channel_list From dc77b5bb2b0cf8dcfb446b0d6b395804b1e4de46 Mon Sep 17 00:00:00 2001 From: Pranav Date: Tue, 17 Jun 2025 16:54:43 -0700 Subject: [PATCH 02/27] feat: Enable audio transcriptions for self hosted instances (#11755) - Enable audio transcriptions feature for self hosted instances --- .../dashboard/routes/dashboard/settings/account/Index.vue | 8 +++++++- .../app/services/messages/audio_transcription_service.rb | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/javascript/dashboard/routes/dashboard/settings/account/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/account/Index.vue index cc66d829f..69342858d 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/account/Index.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/account/Index.vue @@ -71,6 +71,12 @@ export default { FEATURE_FLAGS.AUTO_RESOLVE_CONVERSATIONS ); }, + showAudioTranscriptionConfig() { + return this.isFeatureEnabledonAccount( + this.accountId, + FEATURE_FLAGS.CAPTAIN + ); + }, languagesSortedByCode() { const enabledLanguages = [...this.enabledLanguages]; return enabledLanguages.sort((l1, l2) => @@ -237,7 +243,7 @@ export default { - +
diff --git a/enterprise/app/services/messages/audio_transcription_service.rb b/enterprise/app/services/messages/audio_transcription_service.rb index 8b598cf28..c00328c66 100644 --- a/enterprise/app/services/messages/audio_transcription_service.rb +++ b/enterprise/app/services/messages/audio_transcription_service.rb @@ -20,7 +20,10 @@ class Messages::AudioTranscriptionService < Llm::BaseOpenAiService private def can_transcribe? - account.audio_transcriptions.present? && account.usage_limits[:captain][:responses][:current_available].positive? + return false if account.feature_enabled?('captain_integration') + return false if account.audio_transcriptions.blank? + + account.usage_limits[:captain][:responses][:current_available].positive? end def fetch_audio_file From 25a0c9ed91df6b10bfc695678fa168c6a2cd79df Mon Sep 17 00:00:00 2001 From: Chatwoot Bot <92152627+chatwoot-bot@users.noreply.github.com> Date: Tue, 17 Jun 2025 17:13:31 -0700 Subject: [PATCH 03/27] chore: Update translations (#11724) --- .../dashboard/i18n/locale/pt_BR/automation.json | 2 +- config/locales/am.yml | 8 ++++++++ config/locales/ar.yml | 8 ++++++++ config/locales/az.yml | 8 ++++++++ config/locales/bg.yml | 8 ++++++++ config/locales/ca.yml | 8 ++++++++ config/locales/cs.yml | 8 ++++++++ config/locales/da.yml | 8 ++++++++ config/locales/de.yml | 8 ++++++++ config/locales/el.yml | 8 ++++++++ config/locales/es.yml | 8 ++++++++ config/locales/fa.yml | 8 ++++++++ config/locales/fi.yml | 8 ++++++++ config/locales/fr.yml | 8 ++++++++ config/locales/he.yml | 8 ++++++++ config/locales/hi.yml | 8 ++++++++ config/locales/hr.yml | 8 ++++++++ config/locales/hu.yml | 8 ++++++++ config/locales/hy.yml | 8 ++++++++ config/locales/id.yml | 8 ++++++++ config/locales/is.yml | 8 ++++++++ config/locales/it.yml | 8 ++++++++ config/locales/ja.yml | 8 ++++++++ config/locales/ka.yml | 8 ++++++++ config/locales/ko.yml | 8 ++++++++ config/locales/lt.yml | 8 ++++++++ config/locales/lv.yml | 8 ++++++++ config/locales/ml.yml | 8 ++++++++ config/locales/ms.yml | 8 ++++++++ config/locales/ne.yml | 8 ++++++++ config/locales/nl.yml | 8 ++++++++ config/locales/no.yml | 8 ++++++++ config/locales/pl.yml | 8 ++++++++ config/locales/pt.yml | 8 ++++++++ config/locales/pt_BR.yml | 12 +++++++++--- config/locales/ro.yml | 8 ++++++++ config/locales/ru.yml | 8 ++++++++ config/locales/sh.yml | 8 ++++++++ config/locales/sk.yml | 8 ++++++++ config/locales/sl.yml | 8 ++++++++ config/locales/sq.yml | 8 ++++++++ config/locales/sr.yml | 8 ++++++++ config/locales/sv.yml | 8 ++++++++ config/locales/ta.yml | 8 ++++++++ config/locales/th.yml | 8 ++++++++ config/locales/tl.yml | 8 ++++++++ config/locales/tr.yml | 8 ++++++++ config/locales/uk.yml | 8 ++++++++ config/locales/ur.yml | 8 ++++++++ config/locales/ur_IN.yml | 8 ++++++++ config/locales/vi.yml | 8 ++++++++ config/locales/zh_CN.yml | 8 ++++++++ config/locales/zh_TW.yml | 8 ++++++++ 53 files changed, 418 insertions(+), 4 deletions(-) diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/automation.json b/app/javascript/dashboard/i18n/locale/pt_BR/automation.json index 5b3af42a7..2c0d51696 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/automation.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/automation.json @@ -152,7 +152,7 @@ "ATTRIBUTES": { "MESSAGE_TYPE": "Tipo da Mensagem", "MESSAGE_CONTAINS": "A mensagem contém", - "EMAIL": "e-mail", + "EMAIL": "E-mail", "INBOX": "Caixa de Entrada", "CONVERSATION_LANGUAGE": "Idioma da conversa", "PHONE_NUMBER": "Número de Telefone", diff --git a/config/locales/am.yml b/config/locales/am.yml index c773e3081..bb6feec58 100644 --- a/config/locales/am.yml +++ b/config/locales/am.yml @@ -91,6 +91,8 @@ am: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ am: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ am: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/ar.yml b/config/locales/ar.yml index 5a6463359..d114c08cb 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -91,6 +91,8 @@ ar: conversations_count: عدد المحادثات avg_first_response_time: متوسط وقت الرد الأول avg_resolution_time: متوسط وقت الحل + avg_reply_time: Avg reply time + resolution_count: عدد مرات الإغلاق team_csv: team_name: اسم الفريق conversations_count: عدد المحادثات @@ -138,6 +140,8 @@ ar: instagram_story_content: 'أشار %{story_sender} إليك في القصة: ' instagram_deleted_story_content: هذه القصة لم تعد متاحة. deleted: تم حذف هذه الرسالة + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'رمز الخطأ: %{error_code}' activity: @@ -172,6 +176,10 @@ ar: sla: added: '%{user_name} أضاف سياسة مستوى الخدمة %{sla_name}' removed: '%{user_name} أزال سياسة مستوى الخدمة %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} كتم صوت المحادثة' diff --git a/config/locales/az.yml b/config/locales/az.yml index c9d2c1ac9..a77dd793e 100644 --- a/config/locales/az.yml +++ b/config/locales/az.yml @@ -91,6 +91,8 @@ az: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ az: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ az: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 2ab74952f..b638f02e3 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -91,6 +91,8 @@ bg: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ bg: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ bg: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 7daabbd99..0c610c4c0 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -91,6 +91,8 @@ ca: conversations_count: Nre. de converses avg_first_response_time: Temps mitjà de primera resposta avg_resolution_time: Temps mitjà de resolució + avg_reply_time: Avg reply time + resolution_count: Total de resolucions team_csv: team_name: Nom de l'equip conversations_count: Recompte de converses @@ -138,6 +140,8 @@ ca: instagram_story_content: '%{story_sender} t''ha mencionat a la història: ' instagram_deleted_story_content: Aquesta història ja no està disponible. deleted: Aquest missatge a sigut eliminat + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Codi d''error: %{error_code}' activity: @@ -172,6 +176,10 @@ ca: sla: added: '%{user_name} ha afegit la política de SLA %{sla_name}' removed: '%{user_name} ha eliminat la política de SLA %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} ha silenciat la conversa' diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 75a840336..d21ebfbef 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -91,6 +91,8 @@ cs: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Počet rozlišení team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ cs: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: Tato zpráva byla smazána + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ cs: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} ztlumil/a konverzaci' diff --git a/config/locales/da.yml b/config/locales/da.yml index 5f4a816da..37478f846 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -91,6 +91,8 @@ da: conversations_count: Antal samtaler avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Antal Afsluttede team_csv: team_name: Team navn conversations_count: Samtaler tæller @@ -138,6 +140,8 @@ da: instagram_story_content: '%{story_sender} nævnte dig i historien: ' instagram_deleted_story_content: Denne historie er ikke længere tilgængelig. deleted: Denne besked blev slettet + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ da: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} har slukket for samtalen' diff --git a/config/locales/de.yml b/config/locales/de.yml index 29ca84b45..85fad2d29 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -91,6 +91,8 @@ de: conversations_count: Anzahl der Konversationen avg_first_response_time: Durchschnittliche Zeit bis zur ersten Antwort avg_resolution_time: Durchschnittliche Auflösung + avg_reply_time: Avg reply time + resolution_count: Auflösungsanzahl team_csv: team_name: Teamname conversations_count: Anzahl Gespräche @@ -138,6 +140,8 @@ de: instagram_story_content: '%{story_sender} erwähnte sie in der Geschichte: ' instagram_deleted_story_content: Diese Geschichte ist nicht mehr verfügbar. deleted: Diese Nachricht wurde gelöscht + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Fehlercode: %{error_code}' activity: @@ -172,6 +176,10 @@ de: sla: added: '%{user_name} hat SLA-Richtlinie %{sla_name} hinzugefügt' removed: '%{user_name} hat SLA-Richtlinie %{sla_name} entfernt' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} hat das Gespräch stumm geschaltet' diff --git a/config/locales/el.yml b/config/locales/el.yml index 8e15701ae..635e0d5ff 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -91,6 +91,8 @@ el: conversations_count: Αριθμός συνομιλιών avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Αριθμός Αναλύσεων team_csv: team_name: Όνομα ομάδας conversations_count: Αριθμός συνομιλιών @@ -138,6 +140,8 @@ el: instagram_story_content: 'Ο %{story_sender} σας ανέφερε στην ιστορία: ' instagram_deleted_story_content: Η ιστορία δεν είναι πλέον διαθέσιμη. deleted: Το μήνυμα διαγράφηκε + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ el: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: 'Ο χρήστης %{user_name} σίγασε την συνομιλία' diff --git a/config/locales/es.yml b/config/locales/es.yml index 82b604ddb..308a11c4a 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -91,6 +91,8 @@ es: conversations_count: Núm. de conversaciones avg_first_response_time: Promedio de tiempo de la primera respuesta avg_resolution_time: Tiempo promedio de resolución + avg_reply_time: Avg reply time + resolution_count: Número de resoluciones team_csv: team_name: Nombre del equipo conversations_count: Cantidad de conversaciones @@ -138,6 +140,8 @@ es: instagram_story_content: '%{story_sender} te mencionó en la historia: ' instagram_deleted_story_content: Esta historia ya no está disponible. deleted: Este mensaje se ha eliminado + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Código de error: %{error_code}' activity: @@ -172,6 +176,10 @@ es: sla: added: '%{user_name} agregó la política de SLA %{sla_name}' removed: '%{user_name} eliminó la política de SLA %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} ha silenciado la conversación' diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 6cdc532a7..0a5166ab4 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -91,6 +91,8 @@ fa: conversations_count: تعداد گفتگوها avg_first_response_time: میانگین زمان تا اولین پاسخ avg_resolution_time: میانگین زمان حل مشکل + avg_reply_time: Avg reply time + resolution_count: تعداد مسائل حل شده team_csv: team_name: نام تیم conversations_count: Conversations count @@ -138,6 +140,8 @@ fa: instagram_story_content: '%{story_sender} در داستان به شما اشاره کرده: ' instagram_deleted_story_content: این داستان دیگر در دسترس نیست. deleted: این پیام حذف شد + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'کد خطا " %{error_code}' activity: @@ -172,6 +176,10 @@ fa: sla: added: '%{user_name} سیاست SLA %{sla_name} را اضافه کرد' removed: '%{user_name} سیاست SLA %{sla_name} را حذف کرد' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} مکالمه را بی صدا کرد' diff --git a/config/locales/fi.yml b/config/locales/fi.yml index 94ff6cb9c..2f5fefe20 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -91,6 +91,8 @@ fi: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Selvitysmäärä team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ fi: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ fi: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} mykisti keskustelun' diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 406d69b55..a7925e6e8 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -91,6 +91,8 @@ fr: conversations_count: Nbre de conversations avg_first_response_time: Temps moyen pour une première réponse avg_resolution_time: Temps nécessaire pour résoudre une demande (en moyenne) + avg_reply_time: Avg reply time + resolution_count: Nombre de résolutions team_csv: team_name: Nom de l'équipe conversations_count: Nombre de conversations @@ -138,6 +140,8 @@ fr: instagram_story_content: '%{story_sender} vous a mentionné dans la story: ' instagram_deleted_story_content: Cette Story n'est plus disponible. deleted: Ce message a été supprimé + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Code d''erreur : %{error_code}' activity: @@ -172,6 +176,10 @@ fr: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} a mis la conversation en sourdine' diff --git a/config/locales/he.yml b/config/locales/he.yml index 0945e2f50..3d2585675 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -91,6 +91,8 @@ he: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: ספירת רזולוציות team_csv: team_name: שם קבוצה conversations_count: Conversations count @@ -138,6 +140,8 @@ he: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ he: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/hi.yml b/config/locales/hi.yml index 76055318c..58899852e 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -91,6 +91,8 @@ hi: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ hi: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ hi: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/hr.yml b/config/locales/hr.yml index 23aa9555e..a4016bd34 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -91,6 +91,8 @@ hr: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ hr: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ hr: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/hu.yml b/config/locales/hu.yml index b9bb386a5..eb04702db 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -91,6 +91,8 @@ hu: conversations_count: Beszélgetések száma avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Megoldások száma team_csv: team_name: Csapatnév conversations_count: Beszélgetésszám @@ -138,6 +140,8 @@ hu: instagram_story_content: '%{story_sender} megemlített egy storyban: ' instagram_deleted_story_content: Ez a story már nem érhető el. deleted: Az üzenet törölve lett + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Hibakód: %{error_code}' activity: @@ -172,6 +176,10 @@ hu: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} elnémította a beszélgetést' diff --git a/config/locales/hy.yml b/config/locales/hy.yml index acf78ed4d..77a36722a 100644 --- a/config/locales/hy.yml +++ b/config/locales/hy.yml @@ -91,6 +91,8 @@ hy: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ hy: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ hy: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/id.yml b/config/locales/id.yml index 4c039011c..0cf76f44a 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -91,6 +91,8 @@ id: conversations_count: Jumlah percakapan avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Jumlah Terselesaikan team_csv: team_name: Nama Tim conversations_count: Jumlah percakapan @@ -138,6 +140,8 @@ id: instagram_story_content: '%{story_sender} menyebutmu dalam story: ' instagram_deleted_story_content: Story ini tidak lagi tersedia. deleted: Pesan ini telah terhapus + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ id: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} me-mute percakapan' diff --git a/config/locales/is.yml b/config/locales/is.yml index cf97814e2..a6efef268 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -91,6 +91,8 @@ is: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ is: instagram_story_content: '%{story_sender} minntist á þig í sögunni: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ is: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/it.yml b/config/locales/it.yml index e6ab55115..e4d48b1c2 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -91,6 +91,8 @@ it: conversations_count: Numero di conversazioni avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Conteggio risoluzioni team_csv: team_name: Nome del team conversations_count: Numero di conversazioni @@ -138,6 +140,8 @@ it: instagram_story_content: '%{story_sender} ti ha menzionato nella storia: ' instagram_deleted_story_content: Questa storia non è più disponibile. deleted: Questo messaggio è stato eliminato + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ it: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} ha silenziato la conversazione' diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 928ac3e71..660d9f549 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -91,6 +91,8 @@ ja: conversations_count: 会話数 avg_first_response_time: 初回応答の平均時間 avg_resolution_time: 解決までの平均時間 + avg_reply_time: Avg reply time + resolution_count: 処理件数 team_csv: team_name: チーム名 conversations_count: 会話回数 @@ -138,6 +140,8 @@ ja: instagram_story_content: '%{story_sender} さんがストーリーであなたについて言及しました: ' instagram_deleted_story_content: このストーリーはもう利用できません。 deleted: このメッセージは削除されました + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'エラーコード: %{error_code}' activity: @@ -172,6 +176,10 @@ ja: sla: added: '%{user_name} がSLAポリシー "%{sla_name}" を追加しました' removed: '%{user_name} がSLAポリシー "%{sla_name}" を削除しました' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} が会話をミュートしました' diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 4154ddf14..08b042c93 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -91,6 +91,8 @@ ka: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ ka: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ ka: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/ko.yml b/config/locales/ko.yml index e76883f44..723c8a8ea 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -91,6 +91,8 @@ ko: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: 해결 수 team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ ko: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ ko: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/lt.yml b/config/locales/lt.yml index dc093901f..9a7f843be 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -91,6 +91,8 @@ lt: conversations_count: Pokalbių kiekis avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Sprendimų skaičius team_csv: team_name: Komandos pavadinimas conversations_count: Pokalbių skaičius @@ -138,6 +140,8 @@ lt: instagram_story_content: '%{story_sender} paminėjo jus pasakojime: ' instagram_deleted_story_content: Šis pasakojimas nebepasiekiamas. deleted: Šis pranešimas buvo ištrintas + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Klaidos kodas: %{error_code}' activity: @@ -172,6 +176,10 @@ lt: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} nutildė pokalbį' diff --git a/config/locales/lv.yml b/config/locales/lv.yml index dab14d39f..eaa113cb7 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -91,6 +91,8 @@ lv: conversations_count: Sarunu skaits avg_first_response_time: Vidējais pirmās reakcijas laiks avg_resolution_time: Vidējais atrisināšanas laiks + avg_reply_time: Avg reply time + resolution_count: Atrisināšanas Skaits team_csv: team_name: Komandas nosaukums conversations_count: Sarunu skaits @@ -138,6 +140,8 @@ lv: instagram_story_content: '%{story_sender} pieminēja jūs stāstā: ' instagram_deleted_story_content: Šis stāsts vairs nav pieejams. deleted: Šis ziņojums ir izdzēsts + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Kļūdas kods: %{error_code}' activity: @@ -172,6 +176,10 @@ lv: sla: added: '%{user_name} pievienoja SLA politiku %{sla_name}' removed: '%{user_name} noņēma SLA politiku %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} izslēdza sarunu' diff --git a/config/locales/ml.yml b/config/locales/ml.yml index df5f3f329..fefc77b18 100644 --- a/config/locales/ml.yml +++ b/config/locales/ml.yml @@ -91,6 +91,8 @@ ml: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: മിഴിവ് എണ്ണം team_csv: team_name: ടീമിന്റെ പേര് conversations_count: സംഭാഷണങ്ങളുടെ എണ്ണം @@ -138,6 +140,8 @@ ml: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: ഈ സന്ദേശം ഇല്ലാതാക്കി + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ ml: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/ms.yml b/config/locales/ms.yml index 536fe8134..dea61ba68 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -91,6 +91,8 @@ ms: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ ms: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ ms: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/ne.yml b/config/locales/ne.yml index a1e2e478d..1b97449af 100644 --- a/config/locales/ne.yml +++ b/config/locales/ne.yml @@ -91,6 +91,8 @@ ne: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ ne: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ ne: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 85ca07291..f92ab3c01 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -91,6 +91,8 @@ nl: conversations_count: Aantal conversaties avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Aantal Resoluties team_csv: team_name: Team Naam conversations_count: Aantal gesprekken @@ -138,6 +140,8 @@ nl: instagram_story_content: '%{story_sender} heeft je genoemd in het verhaal: ' instagram_deleted_story_content: Dit verhaal is niet meer beschikbaar. deleted: Dit bericht werd verwijderd + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ nl: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/no.yml b/config/locales/no.yml index 130c554db..944b63559 100644 --- a/config/locales/no.yml +++ b/config/locales/no.yml @@ -91,6 +91,8 @@ conversations_count: Antall samtaler avg_first_response_time: Første svartid avg_resolution_time: Gjennomsnittstid for løsning + avg_reply_time: Avg reply time + resolution_count: Antall løsninger team_csv: team_name: Gruppe navn conversations_count: Antall samtaler @@ -138,6 +140,8 @@ instagram_story_content: '%{story_sender} nevnte deg i historien: ' instagram_deleted_story_content: Denne historien er ikke lenger tilgjengelig. deleted: Denne meldingen er slettet + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Feilkode: %{error_code}' activity: @@ -172,6 +176,10 @@ sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} har dempet samtalen' diff --git a/config/locales/pl.yml b/config/locales/pl.yml index d589af5c5..b6e7bb5ef 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -91,6 +91,8 @@ pl: conversations_count: Ilość rozmów avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Liczba rozwiązań team_csv: team_name: Nazwa zespołu conversations_count: Liczba rozmów @@ -138,6 +140,8 @@ pl: instagram_story_content: '%{story_sender} wspomniał o Tobie w historii: ' instagram_deleted_story_content: Ta historia już nie jest dostępna. deleted: Ta wiadomość została usunięta + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ pl: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} wyciszył/a rozmowę' diff --git a/config/locales/pt.yml b/config/locales/pt.yml index e725e619a..429b025f8 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -91,6 +91,8 @@ pt: conversations_count: Num de conversas avg_first_response_time: Média de tempo da primeira resposta avg_resolution_time: Média de tempo de resolução + avg_reply_time: Avg reply time + resolution_count: Contagem de resolução team_csv: team_name: Nome da equipa conversations_count: Número de conversas @@ -138,6 +140,8 @@ pt: instagram_story_content: '%{story_sender} mencionou você na história: ' instagram_deleted_story_content: Esta história já não está disponível. deleted: Esta mensagem foi apagada + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Código de erro: %{error_code}' activity: @@ -172,6 +176,10 @@ pt: sla: added: '%{user_name} adicionou uma política de SLA %{sla_name}' removed: '%{user_name} removeu a política de SLA de %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} bloqueou a conversa' diff --git a/config/locales/pt_BR.yml b/config/locales/pt_BR.yml index 19570ab07..e7d2bfb91 100644 --- a/config/locales/pt_BR.yml +++ b/config/locales/pt_BR.yml @@ -91,6 +91,8 @@ pt_BR: conversations_count: Nº de Conversas avg_first_response_time: Tempo médio de primeira resposta avg_resolution_time: Tempo médio de resolução + avg_reply_time: Avg reply time + resolution_count: Contagem de Resolução team_csv: team_name: Nome do Time conversations_count: Contagem de conversas @@ -139,7 +141,7 @@ pt_BR: instagram_deleted_story_content: Este Story não está mais disponível. deleted: Esta mensagem foi excluída whatsapp: - list_button_label: 'Escolha um item' + list_button_label: 'Choose an item' delivery_status: error_code: 'Código de erro: %{error_code}' activity: @@ -174,6 +176,10 @@ pt_BR: sla: added: '%{user_name} adicionou política de SLA %{sla_name}' removed: '%{user_name} removeu a política de SLA %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'Pesquisa CSAT não foi enviada devido a restrições de envio de mensagens' muted: '%{user_name} silenciou a conversa' @@ -215,7 +221,7 @@ pt_BR: slack: name: 'Slack' short_description: 'Receba notificações e responda as conversas diretamente no Slack.' - description: 'Integre Chatwoot com Slack para manter seu time em sincronia. Essa integração permite que você receba notificações de novas conversas e as responda diretamente na interface do Slack.' + description: "Integre Chatwoot com Slack para manter seu time em sincronia. Essa integração permite que você receba notificações de novas conversas e as responda diretamente na interface do Slack." webhooks: name: 'Webhooks' description: 'Eventos webhook fornecem atualizações sobre atividades em tempo real na sua conta Chatwoot. Você pode se inscrever em seus eventos preferidos, e o Chatwoot enviará as chamadas HTTP com as atualizações.' @@ -226,7 +232,7 @@ pt_BR: google_translate: name: 'Tradutor do Google' short_description: 'Traduzir automaticamente mensagens de clientes para agentes.' - description: 'Integre o Google Tradutor para ajudar os agentes a traduzir facilmente as mensagens dos clientes. Esta integração detecta automaticamente o idioma e o converte para o idioma preferido do agente ou do administrador.' + description: "Integre o Google Tradutor para ajudar os agentes a traduzir facilmente as mensagens dos clientes. Esta integração detecta automaticamente o idioma e o converte para o idioma preferido do agente ou do administrador." openai: name: 'OpenAI' short_description: 'Sugestões, resumos e aprimoramento de mensagem e resposta com IA.' diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 3b5d6858e..408f85f87 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -91,6 +91,8 @@ ro: conversations_count: Conversații avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Număr de rezoluții team_csv: team_name: Numele echipei conversations_count: Conversațiile contează @@ -138,6 +140,8 @@ ro: instagram_story_content: '%{story_sender} menționat în poveste: ' instagram_deleted_story_content: Această poveste nu mai este disponibilă. deleted: Acest mesaj a fost șters + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ ro: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} a dezactivat conversația' diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 3f6a4bbee..46b749f21 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -91,6 +91,8 @@ ru: conversations_count: Количество диалогов avg_first_response_time: Среднее время первого ответа avg_resolution_time: Среднее время завершения + avg_reply_time: Avg reply time + resolution_count: Количество завершенных team_csv: team_name: Название команды conversations_count: Количество бесед @@ -138,6 +140,8 @@ ru: instagram_story_content: '%{story_sender} упомянул Вас в истории: ' instagram_deleted_story_content: Эта история больше недоступна. deleted: Это сообщение было удалено + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Код ошибки: %{error_code}' activity: @@ -172,6 +176,10 @@ ru: sla: added: '%{user_name} добавил политику SLA %{sla_name}' removed: '%{user_name} удалил политику SLA %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} заглушил(а) этот разговор' diff --git a/config/locales/sh.yml b/config/locales/sh.yml index 204a213c0..d1e84b328 100644 --- a/config/locales/sh.yml +++ b/config/locales/sh.yml @@ -91,6 +91,8 @@ sh: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ sh: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ sh: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 29aec1757..d607ecb66 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -91,6 +91,8 @@ sk: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Počet vyriešených problémov team_csv: team_name: Názov tímu conversations_count: Conversations count @@ -138,6 +140,8 @@ sk: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ sk: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} stlmil konverzáciu' diff --git a/config/locales/sl.yml b/config/locales/sl.yml index eb3f30350..a4d981878 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -91,6 +91,8 @@ sl: conversations_count: Število pogovorov avg_first_response_time: Povprečni prvi odzivni čas avg_resolution_time: Povprečni čas razrešitve + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Ime ekipe conversations_count: Število pogovorov @@ -138,6 +140,8 @@ sl: instagram_story_content: '%{story_sender} vas je omenil v zgodbi: ' instagram_deleted_story_content: Ta zgodba ni več na voljo. deleted: To sporočilo je bilo izbrisano + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Koda napake: %{error_code}' activity: @@ -172,6 +176,10 @@ sl: sla: added: '%{user_name} je dodal politiko SLA %{sla_name}' removed: '%{user_name} je odstranil politiko SLA %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} je utišal pogovor' diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 8509dc3d0..a95d31f8b 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -91,6 +91,8 @@ sq: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ sq: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ sq: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/sr.yml b/config/locales/sr.yml index e8f1006a8..020ee79f6 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -91,6 +91,8 @@ sr-Latn: conversations_count: Broj razgovora avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Broj rešenih team_csv: team_name: Naziv tima conversations_count: Broj razgovora @@ -138,6 +140,8 @@ sr-Latn: instagram_story_content: '%{story_sender} vas je pomenuo u priči: ' instagram_deleted_story_content: Ova priča više nije dostupna. deleted: Poruka je obrisana + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ sr-Latn: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} je utišao razgovor' diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 4953c85da..e6fd303b2 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -91,6 +91,8 @@ sv: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Antal lösta team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ sv: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: Detta meddelande har tagits bort + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Felkod: %{error_code}' activity: @@ -172,6 +176,10 @@ sv: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} har tystat konversationen' diff --git a/config/locales/ta.yml b/config/locales/ta.yml index a7571007f..19160d31c 100644 --- a/config/locales/ta.yml +++ b/config/locales/ta.yml @@ -91,6 +91,8 @@ ta: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: தீர்மான எண்ணிக்கை team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ ta: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ ta: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/th.yml b/config/locales/th.yml index b1b9bd8d7..92fc4b1c6 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -91,6 +91,8 @@ th: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: จำนวนความละเอียด team_csv: team_name: ชื่อทีม conversations_count: Conversations count @@ -138,6 +140,8 @@ th: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ th: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/tl.yml b/config/locales/tl.yml index 8c3d209fa..b0ff25b71 100644 --- a/config/locales/tl.yml +++ b/config/locales/tl.yml @@ -91,6 +91,8 @@ tl: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ tl: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ tl: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 2f045ad5a..128783873 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -91,6 +91,8 @@ tr: conversations_count: Konuşma sayısı avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Çözünürlük Sayısı team_csv: team_name: Ekip adı conversations_count: Konuşma sayısı @@ -138,6 +140,8 @@ tr: instagram_story_content: '%{story_sender} hikayesinde senden bahsetti: ' instagram_deleted_story_content: Bu hikaye artık mevcut değil. deleted: Bu mesaj silinmiş + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Hata kodu: %{error_code}' activity: @@ -172,6 +176,10 @@ tr: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name}, sohbeti sessize aldı' diff --git a/config/locales/uk.yml b/config/locales/uk.yml index a51af682d..b48de05bb 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -91,6 +91,8 @@ uk: conversations_count: '№ розмов' avg_first_response_time: Середній час першої відповіді avg_resolution_time: Середній час вирішення + avg_reply_time: Avg reply time + resolution_count: Кількість вирішень team_csv: team_name: Назва команди conversations_count: Кількість бесід @@ -138,6 +140,8 @@ uk: instagram_story_content: '%{story_sender} згадав вас у сторіс: ' instagram_deleted_story_content: Ця історія більше не доступна. deleted: Це повідомлення було видалено + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Код помилки: %{error_code}' activity: @@ -172,6 +176,10 @@ uk: sla: added: '%{user_name} додав політику SLA %{sla_name}' removed: '%{user_name} видалив політику SLA %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} включив безвучний режим' diff --git a/config/locales/ur.yml b/config/locales/ur.yml index 2a84171c2..5e441edc4 100644 --- a/config/locales/ur.yml +++ b/config/locales/ur.yml @@ -91,6 +91,8 @@ ur: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ ur: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ ur: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/ur_IN.yml b/config/locales/ur_IN.yml index 4cbeef832..cb659d105 100644 --- a/config/locales/ur_IN.yml +++ b/config/locales/ur_IN.yml @@ -91,6 +91,8 @@ ur: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Resolution Count team_csv: team_name: Team name conversations_count: Conversations count @@ -138,6 +140,8 @@ ur: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: This message was deleted + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ ur: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} has muted the conversation' diff --git a/config/locales/vi.yml b/config/locales/vi.yml index c626577e6..ff1e6c398 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -91,6 +91,8 @@ vi: conversations_count: Số hội thoại avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: Số lượng giải quyết team_csv: team_name: Tên nhóm conversations_count: Số hội thoại @@ -138,6 +140,8 @@ vi: instagram_story_content: '%{story_sender} đã đề cập đến bạn trong hội thoại: ' instagram_deleted_story_content: Hội thoại này không còn nữa. deleted: Tin nhắn đã bị xoá + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ vi: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} đã tắt tiếng hội thoại' diff --git a/config/locales/zh_CN.yml b/config/locales/zh_CN.yml index d071daa47..415de5705 100644 --- a/config/locales/zh_CN.yml +++ b/config/locales/zh_CN.yml @@ -91,6 +91,8 @@ zh_CN: conversations_count: 对话数量 avg_first_response_time: 平均首次响应时间 avg_resolution_time: 平均解决时间 + avg_reply_time: Avg reply time + resolution_count: 已解决的数量 team_csv: team_name: 团队名称 conversations_count: 对话数量 @@ -138,6 +140,8 @@ zh_CN: instagram_story_content: '%{story_sender} 会话中提到了你: ' instagram_deleted_story_content: 本信息不存在 deleted: 此消息已被删除 + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: '错误代码: %{error_code}' activity: @@ -172,6 +176,10 @@ zh_CN: sla: added: '%{user_name} 添加了 SLA 策略 %{sla_name}' removed: '%{user_name} 移除了 SLA 策略 %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} 已将会话静音' diff --git a/config/locales/zh_TW.yml b/config/locales/zh_TW.yml index 26a4b7e5d..d658f5a17 100644 --- a/config/locales/zh_TW.yml +++ b/config/locales/zh_TW.yml @@ -91,6 +91,8 @@ zh_TW: conversations_count: No. of conversations avg_first_response_time: Avg first response time avg_resolution_time: Avg resolution time + avg_reply_time: Avg reply time + resolution_count: 已解決的數量 team_csv: team_name: 團隊名稱 conversations_count: 對話數量 @@ -138,6 +140,8 @@ zh_TW: instagram_story_content: '%{story_sender} mentioned you in the story: ' instagram_deleted_story_content: This story is no longer available. deleted: 訊息已被刪除 + whatsapp: + list_button_label: 'Choose an item' delivery_status: error_code: 'Error code: %{error_code}' activity: @@ -172,6 +176,10 @@ zh_TW: sla: added: '%{user_name} added SLA policy %{sla_name}' removed: '%{user_name} removed SLA policy %{sla_name}' + linear: + issue_created: 'Linear issue %{issue_id} was created by %{user_name}' + issue_linked: 'Linear issue %{issue_id} was linked by %{user_name}' + issue_unlinked: 'Linear issue %{issue_id} was unlinked by %{user_name}' csat: not_sent_due_to_messaging_window: 'CSAT survey not sent due to outgoing message restrictions' muted: '%{user_name} 已將對話靜音' From 89bcef462382b842bf81f5e511a369316842d85f Mon Sep 17 00:00:00 2001 From: Sojan Date: Tue, 17 Jun 2025 17:28:31 -0700 Subject: [PATCH 04/27] Bump version to 4.3.0 --- config/app.yml | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/config/app.yml b/config/app.yml index 36bbdbcf1..6ba134f19 100644 --- a/config/app.yml +++ b/config/app.yml @@ -1,5 +1,5 @@ shared: &shared - version: '4.2.0' + version: '4.3.0' development: <<: *shared diff --git a/package.json b/package.json index 3ec557f2e..c81f033b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@chatwoot/chatwoot", - "version": "4.2.0", + "version": "4.3.0", "license": "MIT", "scripts": { "eslint": "eslint app/**/*.{js,vue}", From f6dbbf0d90378dbf7aee97c5aa51e0b5eca7703c Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 18 Jun 2025 17:39:06 +0530 Subject: [PATCH 05/27] refactor: use state-based authentication (#11690) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Muhsin Keloth --- .../google/authorizations_controller.rb | 15 ++-------- .../instagram/authorizations_controller.rb | 9 +----- .../microsoft/authorizations_controller.rb | 15 ++-------- .../oauth_authorization_controller.rb | 23 ++++++++++++++ app/controllers/concerns/google_concern.rb | 4 +-- app/controllers/concerns/microsoft_concern.rb | 4 +-- app/controllers/oauth_callback_controller.rb | 16 +++++----- .../inbox/channels/emailChannels/Google.vue | 1 - .../channels/emailChannels/Microsoft.vue | 1 - .../channels/emailChannels/OAuthChannel.vue | 14 +-------- .../google/authorization_controller_spec.rb | 27 +++++++++-------- .../authorization_controller_spec.rb | 30 +++++++++++-------- .../google/callbacks_controller_spec.rb | 17 ++++------- .../microsoft/callbacks_controller_spec.rb | 17 ++++------- 14 files changed, 85 insertions(+), 108 deletions(-) create mode 100644 app/controllers/api/v1/accounts/oauth_authorization_controller.rb diff --git a/app/controllers/api/v1/accounts/google/authorizations_controller.rb b/app/controllers/api/v1/accounts/google/authorizations_controller.rb index 1140a214b..87a7cfa3f 100644 --- a/app/controllers/api/v1/accounts/google/authorizations_controller.rb +++ b/app/controllers/api/v1/accounts/google/authorizations_controller.rb @@ -1,32 +1,23 @@ -class Api::V1::Accounts::Google::AuthorizationsController < Api::V1::Accounts::BaseController +class Api::V1::Accounts::Google::AuthorizationsController < Api::V1::Accounts::OauthAuthorizationController include GoogleConcern - before_action :check_authorization def create - email = params[:authorization][:email] redirect_url = google_client.auth_code.authorize_url( { redirect_uri: "#{base_url}/google/callback", - scope: 'email profile https://mail.google.com/', + scope: scope, response_type: 'code', prompt: 'consent', # the oauth flow does not return a refresh token, this is supposed to fix it access_type: 'offline', # the default is 'online' + state: state, client_id: GlobalConfigService.load('GOOGLE_OAUTH_CLIENT_ID', nil) } ) if redirect_url - cache_key = "google::#{email.downcase}" - ::Redis::Alfred.setex(cache_key, Current.account.id, 5.minutes) render json: { success: true, url: redirect_url } else render json: { success: false }, status: :unprocessable_entity end end - - private - - def check_authorization - raise Pundit::NotAuthorizedError unless Current.account_user.administrator? - end end diff --git a/app/controllers/api/v1/accounts/instagram/authorizations_controller.rb b/app/controllers/api/v1/accounts/instagram/authorizations_controller.rb index eace4411a..053c29731 100644 --- a/app/controllers/api/v1/accounts/instagram/authorizations_controller.rb +++ b/app/controllers/api/v1/accounts/instagram/authorizations_controller.rb @@ -1,7 +1,6 @@ -class Api::V1::Accounts::Instagram::AuthorizationsController < Api::V1::Accounts::BaseController +class Api::V1::Accounts::Instagram::AuthorizationsController < Api::V1::Accounts::OauthAuthorizationController include InstagramConcern include Instagram::IntegrationHelper - before_action :check_authorization def create # https://developers.facebook.com/docs/instagram-platform/instagram-api-with-instagram-login/business-login#step-1--get-authorization @@ -21,10 +20,4 @@ class Api::V1::Accounts::Instagram::AuthorizationsController < Api::V1::Accounts render json: { success: false }, status: :unprocessable_entity end end - - private - - def check_authorization - raise Pundit::NotAuthorizedError unless Current.account_user.administrator? - end end diff --git a/app/controllers/api/v1/accounts/microsoft/authorizations_controller.rb b/app/controllers/api/v1/accounts/microsoft/authorizations_controller.rb index df563094a..a300b5f59 100644 --- a/app/controllers/api/v1/accounts/microsoft/authorizations_controller.rb +++ b/app/controllers/api/v1/accounts/microsoft/authorizations_controller.rb @@ -1,28 +1,19 @@ -class Api::V1::Accounts::Microsoft::AuthorizationsController < Api::V1::Accounts::BaseController +class Api::V1::Accounts::Microsoft::AuthorizationsController < Api::V1::Accounts::OauthAuthorizationController include MicrosoftConcern - before_action :check_authorization def create - email = params[:authorization][:email] redirect_url = microsoft_client.auth_code.authorize_url( { redirect_uri: "#{base_url}/microsoft/callback", - scope: 'offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send openid profile', + scope: scope, + state: state, prompt: 'consent' } ) if redirect_url - cache_key = "microsoft::#{email.downcase}" - ::Redis::Alfred.setex(cache_key, Current.account.id, 5.minutes) render json: { success: true, url: redirect_url } else render json: { success: false }, status: :unprocessable_entity end end - - private - - def check_authorization - raise Pundit::NotAuthorizedError unless Current.account_user.administrator? - end end diff --git a/app/controllers/api/v1/accounts/oauth_authorization_controller.rb b/app/controllers/api/v1/accounts/oauth_authorization_controller.rb new file mode 100644 index 000000000..feb218b59 --- /dev/null +++ b/app/controllers/api/v1/accounts/oauth_authorization_controller.rb @@ -0,0 +1,23 @@ +class Api::V1::Accounts::OauthAuthorizationController < Api::V1::Accounts::BaseController + before_action :check_authorization + + protected + + def scope + '' + end + + def state + Current.account.to_sgid(expires_in: 15.minutes).to_s + end + + def base_url + ENV.fetch('FRONTEND_URL', 'http://localhost:3000') + end + + private + + def check_authorization + raise Pundit::NotAuthorizedError unless Current.account_user.administrator? + end +end diff --git a/app/controllers/concerns/google_concern.rb b/app/controllers/concerns/google_concern.rb index 474b14aec..13de7ced3 100644 --- a/app/controllers/concerns/google_concern.rb +++ b/app/controllers/concerns/google_concern.rb @@ -14,7 +14,7 @@ module GoogleConcern private - def base_url - ENV.fetch('FRONTEND_URL', 'http://localhost:3000') + def scope + 'email profile https://mail.google.com/' end end diff --git a/app/controllers/concerns/microsoft_concern.rb b/app/controllers/concerns/microsoft_concern.rb index 507b9f8a3..c3e0994bd 100644 --- a/app/controllers/concerns/microsoft_concern.rb +++ b/app/controllers/concerns/microsoft_concern.rb @@ -15,7 +15,7 @@ module MicrosoftConcern private - def base_url - ENV.fetch('FRONTEND_URL', 'http://localhost:3000') + def scope + 'offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send openid profile email' end end diff --git a/app/controllers/oauth_callback_controller.rb b/app/controllers/oauth_callback_controller.rb index 9aa73956a..be0fa5008 100644 --- a/app/controllers/oauth_callback_controller.rb +++ b/app/controllers/oauth_callback_controller.rb @@ -6,7 +6,6 @@ class OauthCallbackController < ApplicationController ) handle_response - ::Redis::Alfred.delete(cache_key) rescue StandardError => e ChatwootExceptionTracker.new(e).capture_exception redirect_to '/' @@ -64,10 +63,6 @@ class OauthCallbackController < ApplicationController raise NotImplementedError end - def cache_key - "#{provider_name}::#{users_data['email'].downcase}" - end - def create_channel_with_inbox ActiveRecord::Base.transaction do channel_email = Channel::Email.create!(email: users_data['email'], account: account) @@ -86,12 +81,17 @@ class OauthCallbackController < ApplicationController decoded_token[0] end - def account_id - ::Redis::Alfred.get(cache_key) + def account_from_signed_id + raise ActionController::BadRequest, 'Missing state variable' if params[:state].blank? + + account = GlobalID::Locator.locate_signed(params[:state]) + raise 'Invalid or expired state' if account.nil? + + account end def account - @account ||= Account.find(account_id) + @account ||= account_from_signed_id end # Fallback name, for when name field is missing from users_data diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/Google.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/Google.vue index 1628d3e62..a5c16fa57 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/Google.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/Google.vue @@ -12,7 +12,6 @@ defineOptions({ provider="google" :title="$t('INBOX_MGMT.ADD.GOOGLE.TITLE')" :description="$t('INBOX_MGMT.ADD.GOOGLE.DESCRIPTION')" - :input-placeholder="$t('INBOX_MGMT.ADD.GOOGLE.EMAIL_PLACEHOLDER')" :submit-button-text="$t('INBOX_MGMT.ADD.GOOGLE.SIGN_IN')" :error-message="$t('INBOX_MGMT.ADD.GOOGLE.ERROR_MESSAGE')" /> diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/Microsoft.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/Microsoft.vue index 1e3706297..53cf5ccc7 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/Microsoft.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/Microsoft.vue @@ -12,7 +12,6 @@ defineOptions({ provider="microsoft" :title="$t('INBOX_MGMT.ADD.MICROSOFT.TITLE')" :description="$t('INBOX_MGMT.ADD.MICROSOFT.DESCRIPTION')" - :input-placeholder="$t('INBOX_MGMT.ADD.MICROSOFT.EMAIL_PLACEHOLDER')" :submit-button-text="$t('INBOX_MGMT.ADD.MICROSOFT.SIGN_IN')" :error-message="$t('INBOX_MGMT.ADD.MICROSOFT.ERROR_MESSAGE')" /> diff --git a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/OAuthChannel.vue b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/OAuthChannel.vue index eb109c6f2..f2bfb63f3 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/OAuthChannel.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/inbox/channels/emailChannels/OAuthChannel.vue @@ -30,14 +30,9 @@ const props = defineProps({ type: String, required: true, }, - inputPlaceholder: { - type: String, - required: true, - }, }); const isRequestingAuthorization = ref(false); -const email = ref(''); const client = computed(() => { if (props.provider === 'microsoft') { @@ -50,9 +45,7 @@ const client = computed(() => { async function requestAuthorization() { try { isRequestingAuthorization.value = true; - const response = await client.value.generateAuthorization({ - email: email.value, - }); + const response = await client.value.generateAuthorization(); const { data: { url }, } = response; @@ -75,11 +68,6 @@ async function requestAuthorization() { :header-content="description" />
- "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/google/callback" }) .to_return(status: 200, body: response_body_success.to_json, headers: { 'Content-Type' => 'application/json' }) - get google_callback_url, params: { code: code } + get google_callback_url, params: { code: code, state: state } expect(response).to redirect_to app_email_inbox_agents_url(account_id: account.id, inbox_id: account.inboxes.last.id) expect(account.inboxes.count).to be 1 @@ -36,7 +32,6 @@ RSpec.describe 'Google::CallbacksController', type: :request do expect(inbox.channel.reload.provider_config.keys).to include('access_token', 'refresh_token', 'expires_on') expect(inbox.channel.reload.provider_config['access_token']).to eq response_body_success[:access_token] expect(inbox.channel.imap_address).to eq 'imap.gmail.com' - expect(Redis::Alfred.get(cache_key)).to be_nil end it 'updates inbox channel config if inbox exists with imap_login and authentication is successful' do @@ -49,14 +44,13 @@ RSpec.describe 'Google::CallbacksController', type: :request do 'redirect_uri' => "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/google/callback" }) .to_return(status: 200, body: response_body_success.to_json, headers: { 'Content-Type' => 'application/json' }) - get google_callback_url, params: { code: code } + get google_callback_url, params: { code: code, state: state } expect(response).to redirect_to app_email_inbox_settings_url(account_id: account.id, inbox_id: inbox.id) expect(account.inboxes.count).to be 1 expect(inbox.channel.reload.provider_config.keys).to include('access_token', 'refresh_token', 'expires_on') expect(inbox.channel.reload.provider_config['access_token']).to eq response_body_success[:access_token] expect(inbox.channel.imap_address).to eq 'imap.gmail.com' - expect(Redis::Alfred.get(cache_key)).to be_nil end it 'creates inboxes with fallback_name when account name is not present in id_token' do @@ -65,7 +59,7 @@ RSpec.describe 'Google::CallbacksController', type: :request do 'redirect_uri' => "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/google/callback" }) .to_return(status: 200, body: response_body_success_without_name.to_json, headers: { 'Content-Type' => 'application/json' }) - get google_callback_url, params: { code: code } + get google_callback_url, params: { code: code, state: state } expect(response).to redirect_to app_email_inbox_agents_url(account_id: account.id, inbox_id: account.inboxes.last.id) expect(account.inboxes.count).to be 1 @@ -79,10 +73,9 @@ RSpec.describe 'Google::CallbacksController', type: :request do 'redirect_uri' => "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/google/callback" }) .to_return(status: 401) - get google_callback_url, params: { code: code } + get google_callback_url, params: { code: code, state: state } expect(response).to redirect_to '/' - expect(Redis::Alfred.get(cache_key).to_i).to eq account.id end end end diff --git a/spec/controllers/microsoft/callbacks_controller_spec.rb b/spec/controllers/microsoft/callbacks_controller_spec.rb index 41d8dbd29..6bd9a0583 100644 --- a/spec/controllers/microsoft/callbacks_controller_spec.rb +++ b/spec/controllers/microsoft/callbacks_controller_spec.rb @@ -4,11 +4,7 @@ RSpec.describe 'Microsoft::CallbacksController', type: :request do let(:account) { create(:account) } let(:code) { SecureRandom.hex(10) } let(:email) { Faker::Internet.email } - let(:cache_key) { "microsoft::#{email.downcase}" } - - before do - Redis::Alfred.set(cache_key, account.id) - end + let(:state) { account.to_sgid(expires_in: 15.minutes).to_s } describe 'GET /microsoft/callback' do let(:response_body_success) do @@ -27,7 +23,7 @@ RSpec.describe 'Microsoft::CallbacksController', type: :request do 'redirect_uri' => "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/microsoft/callback" }) .to_return(status: 200, body: response_body_success.to_json, headers: { 'Content-Type' => 'application/json' }) - get microsoft_callback_url, params: { code: code } + get microsoft_callback_url, params: { code: code, state: state } expect(response).to redirect_to app_email_inbox_agents_url(account_id: account.id, inbox_id: account.inboxes.last.id) expect(account.inboxes.count).to be 1 @@ -36,7 +32,6 @@ RSpec.describe 'Microsoft::CallbacksController', type: :request do expect(inbox.channel.reload.provider_config.keys).to include('access_token', 'refresh_token', 'expires_on') expect(inbox.channel.reload.provider_config['access_token']).to eq response_body_success[:access_token] expect(inbox.channel.imap_address).to eq 'outlook.office365.com' - expect(Redis::Alfred.get(cache_key)).to be_nil end it 'creates updates inbox channel config if inbox exists and authentication is successful' do @@ -48,14 +43,13 @@ RSpec.describe 'Microsoft::CallbacksController', type: :request do 'redirect_uri' => "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/microsoft/callback" }) .to_return(status: 200, body: response_body_success.to_json, headers: { 'Content-Type' => 'application/json' }) - get microsoft_callback_url, params: { code: code } + get microsoft_callback_url, params: { code: code, state: state } expect(response).to redirect_to app_email_inbox_settings_url(account_id: account.id, inbox_id: account.inboxes.last.id) expect(account.inboxes.count).to be 1 expect(inbox.channel.reload.provider_config.keys).to include('access_token', 'refresh_token', 'expires_on') expect(inbox.channel.reload.provider_config['access_token']).to eq response_body_success[:access_token] expect(inbox.channel.imap_address).to eq 'outlook.office365.com' - expect(Redis::Alfred.get(cache_key)).to be_nil end it 'creates inboxes with fallback_name when account name is not present in id_token' do @@ -64,7 +58,7 @@ RSpec.describe 'Microsoft::CallbacksController', type: :request do 'redirect_uri' => "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/microsoft/callback" }) .to_return(status: 200, body: response_body_success_without_name.to_json, headers: { 'Content-Type' => 'application/json' }) - get microsoft_callback_url, params: { code: code } + get microsoft_callback_url, params: { code: code, state: state } expect(response).to redirect_to app_email_inbox_agents_url(account_id: account.id, inbox_id: account.inboxes.last.id) expect(account.inboxes.count).to be 1 @@ -78,10 +72,9 @@ RSpec.describe 'Microsoft::CallbacksController', type: :request do 'redirect_uri' => "#{ENV.fetch('FRONTEND_URL', 'http://localhost:3000')}/microsoft/callback" }) .to_return(status: 401) - get microsoft_callback_url, params: { code: code } + get microsoft_callback_url, params: { code: code, state: state } expect(response).to redirect_to '/' - expect(Redis::Alfred.get(cache_key).to_i).to eq account.id end end end From d2f5311400350b9686541af3a7c4aa20de0883e0 Mon Sep 17 00:00:00 2001 From: Baptiste Fontaine Date: Wed, 18 Jun 2025 23:51:23 +0200 Subject: [PATCH 06/27] fix: Disable custom context menu on img tags (#11762) # Pull Request Template ## Description Fixes #11761. See the issue for the details. ## Type of change Please delete options that are not relevant. - [x] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected) - [ ] This change requires a documentation update ## How Has This Been Tested? I deployed a modified version of Chatwoot with this patch and tested. ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [x] I have made corresponding changes to the documentation (not applicable) - [x] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works (not sure how to do this) - [x] New and existing unit tests pass locally with my changes - [x] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> --- app/javascript/dashboard/components-next/message/Message.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/javascript/dashboard/components-next/message/Message.vue b/app/javascript/dashboard/components-next/message/Message.vue index 98323f79a..28776a8d9 100644 --- a/app/javascript/dashboard/components-next/message/Message.vue +++ b/app/javascript/dashboard/components-next/message/Message.vue @@ -379,7 +379,7 @@ const shouldRenderMessage = computed(() => { function openContextMenu(e) { const shouldSkipContextMenu = e.target?.classList.contains('skip-context-menu') || - e.target?.tagName.toLowerCase() === 'a'; + ['a', 'img'].includes(e.target?.tagName.toLowerCase()); if (shouldSkipContextMenu || getSelection().toString()) { return; } From 2cfca6008b3d83b1ef560b702af47866c1e8a389 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Thu, 19 Jun 2025 14:05:18 +0530 Subject: [PATCH 07/27] fix: Incorrect conversation count shown for filters/folders after idle period (#11770) --- app/javascript/dashboard/components/ChatList.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/app/javascript/dashboard/components/ChatList.vue b/app/javascript/dashboard/components/ChatList.vue index 928eea7df..439e7c682 100644 --- a/app/javascript/dashboard/components/ChatList.vue +++ b/app/javascript/dashboard/components/ChatList.vue @@ -756,6 +756,7 @@ function toggleSelectAll(check) { } useEmitter('fetch_conversation_stats', () => { + if (hasAppliedFiltersOrActiveFolders.value) return; store.dispatch('conversationStats/get', conversationFilters.value); }); From b683973e79c0abd8285f689537919a9cb7316660 Mon Sep 17 00:00:00 2001 From: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:28:12 +0530 Subject: [PATCH 08/27] fix: Resolve styling issues in multiselect (#11728) --- .../dashboard/assets/scss/plugins/_multiselect.scss | 6 +++--- .../dashboard/modules/contact/components/MergeContact.vue | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss b/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss index ffcfca545..1280eb069 100644 --- a/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss +++ b/app/javascript/dashboard/assets/scss/plugins/_multiselect.scss @@ -47,7 +47,7 @@ @apply max-w-full; .multiselect__option { - @apply text-sm font-normal; + @apply text-sm font-normal flex justify-between items-center; span { @apply inline-block overflow-hidden text-ellipsis whitespace-nowrap w-fit; @@ -58,7 +58,7 @@ } &::after { - @apply bottom-0 flex items-center justify-center text-center; + @apply bottom-0 flex items-center justify-center text-center relative px-1 leading-tight; } &.multiselect__option--highlight { @@ -74,7 +74,7 @@ } &.multiselect__option--highlight::after { - @apply bg-transparent; + @apply bg-transparent text-n-slate-12; } &.multiselect__option--selected { diff --git a/app/javascript/dashboard/modules/contact/components/MergeContact.vue b/app/javascript/dashboard/modules/contact/components/MergeContact.vue index ae0d47f7f..4055a22e4 100644 --- a/app/javascript/dashboard/modules/contact/components/MergeContact.vue +++ b/app/javascript/dashboard/modules/contact/components/MergeContact.vue @@ -130,15 +130,15 @@ export default {
-
+