Compare commits
55
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
43e525d587 | ||
|
|
cd2c58726f | ||
|
|
e1a3e8751c | ||
|
|
c582f79b2c | ||
|
|
c18f7f0131 | ||
|
|
b98bb3f143 | ||
|
|
03d0688cc2 | ||
|
|
b75ea7a762 | ||
|
|
f44e47a624 | ||
|
|
47bdb6d2bb | ||
|
|
c3680d50bc | ||
|
|
2ba4780bda | ||
|
|
d3cd647e49 | ||
|
|
eadbddaa9f | ||
|
|
9f14e6abb6 | ||
|
|
79793a5435 | ||
|
|
e68522318b | ||
|
|
44fab70048 | ||
|
|
68c070bcd9 | ||
|
|
728956a734 | ||
|
|
114c25cae8 | ||
|
|
2e96fcea5c | ||
|
|
3e2b65abe4 | ||
|
|
b934fa237b | ||
|
|
6a3f61438d | ||
|
|
0c1d16f324 | ||
|
|
c6642527e2 | ||
|
|
c0e398c642 | ||
|
|
ae5c71ffa1 | ||
|
|
086a4d6254 | ||
|
|
c49161d0a9 | ||
|
|
ce3f415002 | ||
|
|
cce7216c98 | ||
|
|
e93a61033f | ||
|
|
2bd20f229d | ||
|
|
ebd5b84233 | ||
|
|
1dca649cd6 | ||
|
|
13a59a3901 | ||
|
|
a036a1dbd8 | ||
|
|
57edf4ece5 | ||
|
|
8640f1cfd2 | ||
|
|
8a09f28de8 | ||
|
|
d8d65a0273 | ||
|
|
8a0dc90a29 | ||
|
|
0a79e37319 | ||
|
|
c82ab3e8db | ||
|
|
9aee8d1a1f | ||
|
|
2759954897 | ||
|
|
5b6f2145e8 | ||
|
|
5fca6df52d | ||
|
|
5d8a37fed5 | ||
|
|
5ad1a9c8c7 | ||
|
|
594612e278 | ||
|
|
038942b8fc | ||
|
|
f9920fff68 |
@@ -103,7 +103,7 @@ gem 'twitty', '~> 0.1.5'
|
||||
# facebook client
|
||||
gem 'koala'
|
||||
# slack client
|
||||
gem 'slack-ruby-client', '~> 2.5.2'
|
||||
gem 'slack-ruby-client', '~> 2.7.0'
|
||||
# for dialogflow integrations
|
||||
gem 'google-cloud-dialogflow-v2', '>= 0.24.0'
|
||||
gem 'grpc'
|
||||
|
||||
+4
-4
@@ -292,7 +292,7 @@ GEM
|
||||
logger
|
||||
faraday-follow_redirects (0.3.0)
|
||||
faraday (>= 1, < 3)
|
||||
faraday-mashify (0.1.1)
|
||||
faraday-mashify (1.0.0)
|
||||
faraday (~> 2.0)
|
||||
hashie
|
||||
faraday-multipart (1.0.4)
|
||||
@@ -876,8 +876,8 @@ GEM
|
||||
simplecov_json_formatter (~> 0.1)
|
||||
simplecov-html (0.13.2)
|
||||
simplecov_json_formatter (0.1.4)
|
||||
slack-ruby-client (2.5.2)
|
||||
faraday (>= 2.0)
|
||||
slack-ruby-client (2.7.0)
|
||||
faraday (>= 2.0.1)
|
||||
faraday-mashify
|
||||
faraday-multipart
|
||||
gli
|
||||
@@ -1103,7 +1103,7 @@ DEPENDENCIES
|
||||
sidekiq_alive
|
||||
simplecov (>= 0.21)
|
||||
simplecov_json_formatter
|
||||
slack-ruby-client (~> 2.5.2)
|
||||
slack-ruby-client (~> 2.7.0)
|
||||
spring
|
||||
spring-watcher-listen
|
||||
squasher
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
class Email::BaseBuilder
|
||||
pattr_initialize [:inbox!]
|
||||
|
||||
private
|
||||
|
||||
def channel
|
||||
@channel ||= inbox.channel
|
||||
end
|
||||
|
||||
def account
|
||||
@account ||= inbox.account
|
||||
end
|
||||
|
||||
def conversation
|
||||
@conversation ||= message.conversation
|
||||
end
|
||||
|
||||
def custom_sender_name
|
||||
message&.sender&.available_name || I18n.t('conversations.reply.email.header.notifications')
|
||||
end
|
||||
|
||||
def sender_name(sender_email)
|
||||
# Friendly: <agent_name> from <business_name>
|
||||
# Professional: <business_name>
|
||||
if inbox.friendly?
|
||||
I18n.t(
|
||||
'conversations.reply.email.header.friendly_name',
|
||||
sender_name: custom_sender_name,
|
||||
business_name: business_name,
|
||||
from_email: sender_email
|
||||
)
|
||||
else
|
||||
I18n.t(
|
||||
'conversations.reply.email.header.professional_name',
|
||||
business_name: business_name,
|
||||
from_email: sender_email
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
def business_name
|
||||
inbox.business_name || inbox.sanitized_name
|
||||
end
|
||||
|
||||
def account_support_email
|
||||
# Parse the email to ensure it's in the correct format, the user
|
||||
# can save it in the format "Name <email@domain.com>"
|
||||
parse_email(account.support_email)
|
||||
end
|
||||
|
||||
def parse_email(email_string)
|
||||
Mail::Address.new(email_string).address
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,51 @@
|
||||
class Email::FromBuilder < Email::BaseBuilder
|
||||
pattr_initialize [:inbox!, :message!]
|
||||
|
||||
def build
|
||||
return sender_name(account_support_email) unless inbox.email?
|
||||
|
||||
from_email = case email_channel_type
|
||||
when :standard_imap_smtp,
|
||||
:google_oauth,
|
||||
:microsoft_oauth,
|
||||
:forwarding_own_smtp
|
||||
channel.email
|
||||
when :imap_chatwoot_smtp,
|
||||
:forwarding_chatwoot_smtp
|
||||
channel.verified_for_sending ? channel.email : account_support_email
|
||||
else
|
||||
account_support_email
|
||||
end
|
||||
|
||||
sender_name(from_email)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def email_channel_type
|
||||
return :google_oauth if channel.google?
|
||||
return :microsoft_oauth if channel.microsoft?
|
||||
return :standard_imap_smtp if imap_and_smtp_enabled?
|
||||
return :imap_chatwoot_smtp if imap_enabled_without_smtp?
|
||||
return :forwarding_own_smtp if forwarding_with_own_smtp?
|
||||
return :forwarding_chatwoot_smtp if forwarding_without_smtp?
|
||||
|
||||
:unknown
|
||||
end
|
||||
|
||||
def imap_and_smtp_enabled?
|
||||
channel.imap_enabled && channel.smtp_enabled
|
||||
end
|
||||
|
||||
def imap_enabled_without_smtp?
|
||||
channel.imap_enabled && !channel.smtp_enabled
|
||||
end
|
||||
|
||||
def forwarding_with_own_smtp?
|
||||
!channel.imap_enabled && channel.smtp_enabled
|
||||
end
|
||||
|
||||
def forwarding_without_smtp?
|
||||
!channel.imap_enabled && !channel.smtp_enabled
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,21 @@
|
||||
class Email::ReplyToBuilder < Email::BaseBuilder
|
||||
pattr_initialize [:inbox!, :message!]
|
||||
|
||||
def build
|
||||
reply_to = if inbox.email?
|
||||
channel.email
|
||||
elsif inbound_email_enabled?
|
||||
"reply+#{conversation.uuid}@#{account.inbound_email_domain}"
|
||||
else
|
||||
account_support_email
|
||||
end
|
||||
|
||||
sender_name(reply_to)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def inbound_email_enabled?
|
||||
account.feature_enabled?('inbound_emails') && account.inbound_email_domain.present?
|
||||
end
|
||||
end
|
||||
@@ -13,11 +13,11 @@ class SuperAdmin::UsersController < SuperAdmin::ApplicationController
|
||||
redirect_to new_super_admin_user_path, notice: notice
|
||||
end
|
||||
end
|
||||
#
|
||||
# def update
|
||||
# super
|
||||
# send_foo_updated_email(requested_resource)
|
||||
# end
|
||||
|
||||
def update
|
||||
requested_resource.skip_reconfirmation! if resource_params[:confirmed_at].present?
|
||||
super
|
||||
end
|
||||
|
||||
# Override this method to specify custom lookup behavior.
|
||||
# This will be used to set the resource for the `show`, `edit`, and `update`
|
||||
|
||||
@@ -59,11 +59,11 @@ class UserDashboard < Administrate::BaseDashboard
|
||||
SHOW_PAGE_ATTRIBUTES = %i[
|
||||
id
|
||||
avatar_url
|
||||
unconfirmed_email
|
||||
name
|
||||
type
|
||||
display_name
|
||||
email
|
||||
unconfirmed_email
|
||||
created_at
|
||||
updated_at
|
||||
confirmed_at
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
<script setup>
|
||||
import { useFunctionGetter, useMapGetter } from 'dashboard/composables/store';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import { computed } from 'vue';
|
||||
|
||||
const { t } = useI18n();
|
||||
|
||||
const getTypingUsersText = (users = []) => {
|
||||
const count = users.length;
|
||||
const [firstUser, secondUser] = users;
|
||||
|
||||
if (count === 1) {
|
||||
return t('TYPING.ONE', { user: firstUser.name });
|
||||
}
|
||||
|
||||
if (count === 2) {
|
||||
return t('TYPING.TWO', {
|
||||
user: firstUser.name,
|
||||
secondUser: secondUser.name,
|
||||
});
|
||||
}
|
||||
|
||||
return t('TYPING.MULTIPLE', { user: firstUser.name, count: count - 1 });
|
||||
};
|
||||
|
||||
const currentChat = useMapGetter('getSelectedChat');
|
||||
const typingUsersList = useFunctionGetter(
|
||||
'conversationTypingStatus/getUserList',
|
||||
currentChat.value.id
|
||||
);
|
||||
|
||||
const isAnyoneTyping = computed(() => {
|
||||
return typingUsersList.value.length !== 0;
|
||||
});
|
||||
|
||||
const typingUserNames = computed(() => {
|
||||
if (typingUsersList.value.length) {
|
||||
return getTypingUsersText(typingUsersList.value);
|
||||
}
|
||||
return '';
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div v-show="isAnyoneTyping">
|
||||
<div
|
||||
v-if="isAnyoneTyping"
|
||||
class="flex py-1.5 ltr:pr-2 ltr:pl-3 rtl:pl-2 rtl:pr-3 rounded-full shadow-sm border border-n-weak bg-n-solid-2 text-xs font-semibold my-2.5 mx-auto"
|
||||
>
|
||||
{{ typingUserNames }}
|
||||
<img
|
||||
class="w-6 ltr:ml-2 rtl:mr-2"
|
||||
src="assets/images/typing.gif"
|
||||
alt="Someone is typing"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -0,0 +1,44 @@
|
||||
<script setup>
|
||||
import { vIntersectionObserver } from '@vueuse/components';
|
||||
import { computed } from 'vue';
|
||||
|
||||
const props = defineProps({
|
||||
label: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
variant: {
|
||||
type: String,
|
||||
default: 'primary',
|
||||
validator: value => ['primary', 'secondary'].includes(value),
|
||||
},
|
||||
});
|
||||
|
||||
const emit = defineEmits(['click', 'intersect']);
|
||||
|
||||
function onIntersectionObserver([entry]) {
|
||||
const isVisible = entry?.isIntersecting || false;
|
||||
emit('intersect', isVisible);
|
||||
}
|
||||
|
||||
const classToApply = computed(() => {
|
||||
return {
|
||||
'bg-n-solid-blue text-n-blue-text': props.variant === 'primary',
|
||||
'shadow-sm border border-n-weak bg-n-solid-2 text-n-slate-11':
|
||||
props.variant === 'secondary',
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div>
|
||||
<div
|
||||
v-intersection-observer="onIntersectionObserver"
|
||||
:class="classToApply"
|
||||
class="flex py-1.5 px-3 rounded-full text-xs font-semibold my-2.5 mx-auto"
|
||||
@click="emit('click')"
|
||||
>
|
||||
{{ label }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
import { mount } from '@vue/test-utils';
|
||||
import { createStore } from 'vuex';
|
||||
import { nextTick } from 'vue';
|
||||
import TypingIndicator from '../TypingIndicator.vue';
|
||||
|
||||
const createComponent = ({ typingUsers = [] } = {}) => {
|
||||
const store = createStore({
|
||||
modules: {
|
||||
conversations: {
|
||||
getters: {
|
||||
getSelectedChat: () => ({ id: 1 }),
|
||||
},
|
||||
},
|
||||
conversationTypingStatus: {
|
||||
namespaced: true,
|
||||
getters: {
|
||||
getUserList: () => chatId => {
|
||||
// Ensure we're returning the typing users for the correct chat
|
||||
if (chatId === 1) {
|
||||
return typingUsers;
|
||||
}
|
||||
return [];
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
return mount(TypingIndicator, {
|
||||
global: {
|
||||
plugins: [store],
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
describe('TypingIndicator', () => {
|
||||
it('should not be visible when no one is typing', () => {
|
||||
const wrapper = createComponent();
|
||||
expect(wrapper.isVisible()).toBe(false);
|
||||
});
|
||||
|
||||
it('should display the correct message when one user is typing', async () => {
|
||||
const wrapper = createComponent({
|
||||
typingUsers: [{ id: 1, name: 'John' }],
|
||||
});
|
||||
await nextTick();
|
||||
expect(wrapper.isVisible()).toBe(true);
|
||||
expect(wrapper.text()).toContain('John is typing');
|
||||
});
|
||||
|
||||
it('should display the correct message when two users are typing', async () => {
|
||||
const wrapper = createComponent({
|
||||
typingUsers: [
|
||||
{ id: 1, name: 'John' },
|
||||
{ id: 2, name: 'Jane' },
|
||||
],
|
||||
});
|
||||
await nextTick();
|
||||
expect(wrapper.isVisible()).toBe(true);
|
||||
expect(wrapper.text()).toContain('John and Jane are typing');
|
||||
});
|
||||
|
||||
it('should display the correct message when more than two users are typing', async () => {
|
||||
const wrapper = createComponent({
|
||||
typingUsers: [
|
||||
{ id: 1, name: 'John' },
|
||||
{ id: 2, name: 'Jane' },
|
||||
{ id: 3, name: 'Bob' },
|
||||
],
|
||||
});
|
||||
await nextTick();
|
||||
expect(wrapper.isVisible()).toBe(true);
|
||||
expect(wrapper.text()).toContain('John and 2 others are typing');
|
||||
});
|
||||
});
|
||||
+14
-3
@@ -148,10 +148,21 @@ const isAnyDropdownActive = computed(() => {
|
||||
|
||||
const handleContactSearch = value => {
|
||||
showContactsDropdown.value = true;
|
||||
emit('searchContacts', {
|
||||
keys: ['email', 'phone_number', 'name'],
|
||||
query: value,
|
||||
const query = typeof value === 'string' ? value.trim() : '';
|
||||
const hasAlphabet = Array.from(query).some(char => {
|
||||
const lower = char.toLowerCase();
|
||||
const upper = char.toUpperCase();
|
||||
return lower !== upper;
|
||||
});
|
||||
const isEmailLike = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(query);
|
||||
|
||||
const keys = ['email', 'phone_number', 'name'].filter(key => {
|
||||
if (key === 'phone_number' && hasAlphabet) return false;
|
||||
if (key === 'name' && isEmailLike) return false;
|
||||
return true;
|
||||
});
|
||||
|
||||
emit('searchContacts', { keys, query: value });
|
||||
};
|
||||
|
||||
const handleDropdownUpdate = (type, value) => {
|
||||
|
||||
@@ -45,7 +45,7 @@ const activeAssistantLabel = computed(() => {
|
||||
/>
|
||||
</template>
|
||||
<DropdownBody class="bottom-9 min-w-64 z-50" strong>
|
||||
<DropdownSection class="max-h-80 overflow-scroll">
|
||||
<DropdownSection class="[&>ul]:max-h-80">
|
||||
<DropdownItem
|
||||
v-for="assistant in assistants"
|
||||
:key="assistant.id"
|
||||
|
||||
@@ -91,7 +91,7 @@ const updateSelected = newValue => {
|
||||
:class="dropdownPosition"
|
||||
strong
|
||||
>
|
||||
<DropdownSection class="max-h-80 overflow-scroll">
|
||||
<DropdownSection class="[&>ul]:max-h-80">
|
||||
<DropdownItem
|
||||
v-for="option in options"
|
||||
:key="option.value"
|
||||
|
||||
@@ -123,7 +123,7 @@ const toggleOption = option => {
|
||||
</Button>
|
||||
</template>
|
||||
<DropdownBody class="top-0 min-w-48 z-50" strong>
|
||||
<DropdownSection class="max-h-80 overflow-scroll">
|
||||
<DropdownSection class="[&>ul]:max-h-80">
|
||||
<DropdownItem
|
||||
v-for="option in options"
|
||||
:key="option.id"
|
||||
|
||||
@@ -124,7 +124,7 @@ const toggleSelected = option => {
|
||||
:placeholder="searchPlaceholder || t('COMBOBOX.SEARCH_PLACEHOLDER')"
|
||||
/>
|
||||
</div>
|
||||
<DropdownSection class="max-h-80 overflow-scroll">
|
||||
<DropdownSection class="[&>ul]:max-h-80">
|
||||
<template v-if="searchResults.length">
|
||||
<DropdownItem
|
||||
v-for="option in searchResults"
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
<script setup>
|
||||
import { defineProps, computed } from 'vue';
|
||||
import { defineProps, computed, reactive } from 'vue';
|
||||
import Message from './Message.vue';
|
||||
import { MESSAGE_TYPES } from './constants.js';
|
||||
import { useCamelCase } from 'dashboard/composables/useTransformKeys';
|
||||
import { useMapGetter } from 'dashboard/composables/store.js';
|
||||
import MessageApi from 'dashboard/api/inbox/message.js';
|
||||
|
||||
/**
|
||||
* Props definition for the component
|
||||
@@ -43,6 +45,48 @@ const allMessages = computed(() => {
|
||||
return useCamelCase(props.messages, { deep: true });
|
||||
});
|
||||
|
||||
const currentChat = useMapGetter('getSelectedChat');
|
||||
|
||||
// Cache for fetched reply messages to avoid duplicate API calls
|
||||
const fetchedReplyMessages = reactive(new Map());
|
||||
|
||||
/**
|
||||
* Fetches a specific message from the API by trying to get messages around it
|
||||
* @param {number} messageId - The ID of the message to fetch
|
||||
* @param {number} conversationId - The ID of the conversation
|
||||
* @returns {Promise<Object|null>} - The fetched message or null if not found/error
|
||||
*/
|
||||
const fetchReplyMessage = async (messageId, conversationId) => {
|
||||
// Return cached result if already fetched
|
||||
if (fetchedReplyMessages.has(messageId)) {
|
||||
return fetchedReplyMessages.get(messageId);
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await MessageApi.getPreviousMessages({
|
||||
conversationId,
|
||||
before: messageId + 100,
|
||||
after: messageId - 100,
|
||||
});
|
||||
|
||||
const messages = response.data?.payload || [];
|
||||
const targetMessage = messages.find(msg => msg.id === messageId);
|
||||
|
||||
if (targetMessage) {
|
||||
const camelCaseMessage = useCamelCase(targetMessage);
|
||||
fetchedReplyMessages.set(messageId, camelCaseMessage);
|
||||
return camelCaseMessage;
|
||||
}
|
||||
|
||||
// Cache null result to avoid repeated API calls
|
||||
fetchedReplyMessages.set(messageId, null);
|
||||
return null;
|
||||
} catch (error) {
|
||||
fetchedReplyMessages.set(messageId, null);
|
||||
return null;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Determines if a message should be grouped with the next message
|
||||
* @param {Number} index - Index of the current message
|
||||
@@ -90,10 +134,26 @@ const getInReplyToMessage = parentMessage => {
|
||||
|
||||
if (!inReplyToMessageId) return null;
|
||||
|
||||
// Find in-reply-to message in the messages prop
|
||||
const replyMessage = props.messages?.find(
|
||||
message => message.id === inReplyToMessageId
|
||||
);
|
||||
// Try to find in current messages first
|
||||
let replyMessage = props.messages?.find(msg => msg.id === inReplyToMessageId);
|
||||
|
||||
// Then try store messages
|
||||
if (!replyMessage && currentChat.value?.messages) {
|
||||
replyMessage = currentChat.value.messages.find(
|
||||
msg => msg.id === inReplyToMessageId
|
||||
);
|
||||
}
|
||||
|
||||
// Then check fetch cache
|
||||
if (!replyMessage && fetchedReplyMessages.has(inReplyToMessageId)) {
|
||||
replyMessage = fetchedReplyMessages.get(inReplyToMessageId);
|
||||
}
|
||||
|
||||
// If still not found and we have conversation context, fetch it
|
||||
if (!replyMessage && currentChat.value?.id) {
|
||||
fetchReplyMessage(inReplyToMessageId, currentChat.value.id);
|
||||
return null; // Let UI handle loading state
|
||||
}
|
||||
|
||||
return replyMessage ? useCamelCase(replyMessage) : null;
|
||||
};
|
||||
|
||||
@@ -76,7 +76,7 @@ function changeAvailabilityStatus(availability) {
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<DropdownSection>
|
||||
<DropdownSection class="[&>ul]:overflow-visible">
|
||||
<div class="grid gap-0">
|
||||
<DropdownItem preserve-open>
|
||||
<div class="flex-grow flex items-center gap-1">
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<script>
|
||||
import { ref, provide } from 'vue';
|
||||
// composable
|
||||
import { useMapGetter } from 'dashboard/composables/store.js';
|
||||
import { useConfig } from 'dashboard/composables/useConfig';
|
||||
import { useKeyboardEvents } from 'dashboard/composables/useKeyboardEvents';
|
||||
import { useAI } from 'dashboard/composables/useAI';
|
||||
@@ -8,6 +9,8 @@ import { useSnakeCase } from 'dashboard/composables/useTransformKeys';
|
||||
|
||||
// components
|
||||
import ReplyBox from './ReplyBox.vue';
|
||||
import TypingIndicator from 'next/Conversation/Chips/TypingIndicator.vue';
|
||||
import UnreadIndicator from 'next/Conversation/Chips/UnreadIndicator.vue';
|
||||
import MessageList from 'next/message/MessageList.vue';
|
||||
import ConversationLabelSuggestion from './conversation/LabelSuggestion.vue';
|
||||
import Banner from 'dashboard/components/ui/Banner.vue';
|
||||
@@ -21,7 +24,6 @@ import inboxMixin, { INBOX_FEATURES } from 'shared/mixins/inboxMixin';
|
||||
|
||||
// utils
|
||||
import { emitter } from 'shared/helpers/mitt';
|
||||
import { getTypingUsersText } from '../../../helper/commons';
|
||||
import { calculateScrollTop } from './helpers/scrollTopCalculationHelper';
|
||||
import { LocalStorage } from 'shared/helpers/localStorage';
|
||||
import {
|
||||
@@ -29,6 +31,7 @@ import {
|
||||
getReadMessages,
|
||||
getUnreadMessages,
|
||||
} from 'dashboard/helper/conversationHelper';
|
||||
import { debounce } from '@chatwoot/utils';
|
||||
|
||||
// constants
|
||||
import { BUS_EVENTS } from 'shared/constants/busEvents';
|
||||
@@ -36,11 +39,14 @@ import { REPLY_POLICY } from 'shared/constants/links';
|
||||
import wootConstants from 'dashboard/constants/globals';
|
||||
import { LOCAL_STORAGE_KEYS } from 'dashboard/constants/localStorage';
|
||||
import { INBOX_TYPES } from 'dashboard/helper/inbox';
|
||||
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
MessageList,
|
||||
ReplyBox,
|
||||
TypingIndicator,
|
||||
UnreadIndicator,
|
||||
Banner,
|
||||
ConversationLabelSuggestion,
|
||||
Spinner,
|
||||
@@ -68,6 +74,16 @@ export default {
|
||||
fetchLabelSuggestions,
|
||||
} = useAI();
|
||||
|
||||
const currentAccountId = useMapGetter('getCurrentAccountId');
|
||||
const isFeatureEnabledonAccount = useMapGetter(
|
||||
'accounts/isFeatureEnabledonAccount'
|
||||
);
|
||||
|
||||
const useNewScrollBehavior = isFeatureEnabledonAccount.value(
|
||||
currentAccountId.value,
|
||||
FEATURE_FLAGS.CHAT_PRESERVE_USER_SCROLL
|
||||
);
|
||||
|
||||
provide('contextMenuElementTarget', conversationPanelRef);
|
||||
|
||||
return {
|
||||
@@ -77,12 +93,16 @@ export default {
|
||||
isLabelSuggestionFeatureEnabled,
|
||||
fetchIntegrationsIfRequired,
|
||||
fetchLabelSuggestions,
|
||||
useNewScrollBehavior,
|
||||
conversationPanelRef,
|
||||
};
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
isLoadingPrevious: true,
|
||||
// this is only used to show a chip if the user has scrolled far enough
|
||||
// we will hide this the moment the user reaches the start of the unread messages
|
||||
showFloatingUnreadIndicator: false,
|
||||
heightBeforeLoad: null,
|
||||
conversationPanel: null,
|
||||
hasUserScrolled: false,
|
||||
@@ -116,25 +136,6 @@ export default {
|
||||
inbox() {
|
||||
return this.$store.getters['inboxes/getInbox'](this.inboxId);
|
||||
},
|
||||
typingUsersList() {
|
||||
const userList = this.$store.getters[
|
||||
'conversationTypingStatus/getUserList'
|
||||
](this.currentChat.id);
|
||||
return userList;
|
||||
},
|
||||
isAnyoneTyping() {
|
||||
const userList = this.typingUsersList;
|
||||
return userList.length !== 0;
|
||||
},
|
||||
typingUserNames() {
|
||||
const userList = this.typingUsersList;
|
||||
if (this.isAnyoneTyping) {
|
||||
const [i18nKey, params] = getTypingUsersText(userList);
|
||||
return this.$t(i18nKey, params);
|
||||
}
|
||||
|
||||
return '';
|
||||
},
|
||||
getMessages() {
|
||||
const messages = this.currentChat.messages || [];
|
||||
if (this.isAWhatsAppChannel) {
|
||||
@@ -227,13 +228,19 @@ export default {
|
||||
return this.currentChat.unread_count || 0;
|
||||
},
|
||||
unreadMessageLabel() {
|
||||
const count =
|
||||
this.unreadMessageCount > 9 ? '9+' : this.unreadMessageCount;
|
||||
const label =
|
||||
this.unreadMessageCount > 1
|
||||
? 'CONVERSATION.UNREAD_MESSAGES'
|
||||
: 'CONVERSATION.UNREAD_MESSAGE';
|
||||
return `${count} ${this.$t(label)}`;
|
||||
if (this.unreadMessageCount <= 1) {
|
||||
return this.$t('CONVERSATION.SINGLE_UNREAD_MESSAGE');
|
||||
}
|
||||
|
||||
if (this.unreadMessageCount > 9) {
|
||||
return this.$t('CONVERSATION.UNREAD_COUNT_OVERFLOW');
|
||||
}
|
||||
|
||||
const formatter = new Intl.NumberFormat(navigator.language);
|
||||
|
||||
return this.$t('CONVERSATION.UNREAD_COUNT', {
|
||||
count: formatter.format(this.unreadMessageCount),
|
||||
});
|
||||
},
|
||||
inboxSupportsReplyTo() {
|
||||
const incoming = this.inboxHasFeature(INBOX_FEATURES.REPLY_TO);
|
||||
@@ -271,6 +278,7 @@ export default {
|
||||
this.addScrollListener();
|
||||
this.fetchAllAttachmentsFromCurrentChat();
|
||||
this.fetchSuggestions();
|
||||
this.debouncedMarkReadIfRequired = debounce(this.markReadIfRequired, 100);
|
||||
},
|
||||
|
||||
unmounted() {
|
||||
@@ -339,10 +347,20 @@ export default {
|
||||
messageElement.scrollIntoView({ behavior: 'smooth' });
|
||||
this.fetchPreviousMessages();
|
||||
} else {
|
||||
this.scrollToBottom();
|
||||
// if there is not message id, that means, we are meant to scroll to bottom
|
||||
// this is done when we get a new unread message
|
||||
// however if the user has scrolled away to a certain degree
|
||||
// we should preserve the scroll position
|
||||
this.scrollToBottomIfNotScrolled();
|
||||
}
|
||||
});
|
||||
this.makeMessagesRead();
|
||||
|
||||
// when new scroll behavior is activated
|
||||
// we don't mark the message as read automatically
|
||||
// since we preserve the user scroll position
|
||||
if (!this.useNewScrollBehavior) {
|
||||
this.makeMessagesRead();
|
||||
}
|
||||
},
|
||||
addScrollListener() {
|
||||
this.conversationPanel = this.$el.querySelector('.conversation-panel');
|
||||
@@ -354,7 +372,39 @@ export default {
|
||||
removeScrollListener() {
|
||||
this.conversationPanel.removeEventListener('scroll', this.handleScroll);
|
||||
},
|
||||
isNearBottom(offset = 200) {
|
||||
// In case the user has already scrolled to a point in the message, we should
|
||||
// not scroll to the bottom against the intent of the user.
|
||||
const clientHeight = this.conversationPanel.clientHeight;
|
||||
const scrollHeight = this.conversationPanel.scrollHeight;
|
||||
const scrollTop = this.conversationPanel.scrollTop;
|
||||
|
||||
// when scrolled at the bottom completely for any element
|
||||
// scrollHeight = clientHeight + scrollTop
|
||||
// so if we wanna see if the user has scrolled but not significantly
|
||||
// we need to see if scrollTop > scrollHeight - clientHeight
|
||||
|
||||
// if the user is at the bottom or close to the bottom, we can skip scrolling
|
||||
// we add a 200px margin, this has enough space to accomodate new messages
|
||||
// while also resetting position to the bottom if the user has scrolled but not significantly
|
||||
return scrollTop > scrollHeight - clientHeight - offset;
|
||||
},
|
||||
scrollToBottomIfNotScrolled() {
|
||||
// we disable this behavior with a feature flag
|
||||
// once the feature has been stable for a while, we can remove this guard
|
||||
if (this.useNewScrollBehavior) {
|
||||
const isNearBottom = this.isNearBottom();
|
||||
|
||||
if (this.hasUserScrolled && !isNearBottom) {
|
||||
this.showFloatingUnreadIndicator = true;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
this.scrollToBottom();
|
||||
},
|
||||
scrollToBottom() {
|
||||
this.showFloatingUnreadIndicator = false;
|
||||
this.isProgrammaticScroll = true;
|
||||
let relevantMessages = [];
|
||||
|
||||
@@ -381,6 +431,10 @@ export default {
|
||||
).slice(-1);
|
||||
}
|
||||
|
||||
if (this.unreadMessageCount !== 0 && this.useNewScrollBehavior) {
|
||||
this.makeMessagesRead();
|
||||
}
|
||||
|
||||
this.conversationPanel.scrollTop = calculateScrollTop(
|
||||
this.conversationPanel.scrollHeight,
|
||||
this.$el.scrollHeight,
|
||||
@@ -431,13 +485,50 @@ export default {
|
||||
} else {
|
||||
this.hasUserScrolled = true;
|
||||
}
|
||||
|
||||
// in case the user has scrolled to the bottom manually
|
||||
// we trigger the makeMessagesRead method if there are unread messages
|
||||
//
|
||||
// for now this is activated by a feature flag only
|
||||
if (this.useNewScrollBehavior) {
|
||||
this.debouncedMarkReadIfRequired();
|
||||
}
|
||||
|
||||
emitter.emit(BUS_EVENTS.ON_MESSAGE_LIST_SCROLL);
|
||||
this.fetchPreviousMessages(e.target.scrollTop);
|
||||
},
|
||||
|
||||
markReadIfRequired() {
|
||||
if (this.isNearBottom(50) && this.unreadMessageCount !== 0) {
|
||||
this.makeMessagesRead();
|
||||
}
|
||||
},
|
||||
|
||||
makeMessagesRead() {
|
||||
this.$store.dispatch('markMessagesRead', { id: this.currentChat.id });
|
||||
},
|
||||
onUnreadBadgeIntersect(visible) {
|
||||
if (!this.useNewScrollBehavior) return;
|
||||
|
||||
if (visible) {
|
||||
// when the fixed unread badge is visible
|
||||
// we trigger the makeMessagesRead method
|
||||
this.showFloatingUnreadIndicator = false;
|
||||
this.makeMessagesRead();
|
||||
}
|
||||
},
|
||||
getInReplyToMessage(parentMessage) {
|
||||
if (!parentMessage) return {};
|
||||
const inReplyToMessageId = parentMessage.content_attributes?.in_reply_to;
|
||||
if (!inReplyToMessageId) return {};
|
||||
|
||||
return this.currentChat?.messages.find(message => {
|
||||
if (message.id === inReplyToMessageId) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
},
|
||||
async handleMessageRetry(message) {
|
||||
if (!message) return;
|
||||
const payload = useSnakeCase(message);
|
||||
@@ -486,13 +577,13 @@ export default {
|
||||
<template #unreadBadge>
|
||||
<li
|
||||
v-show="unreadMessageCount != 0"
|
||||
class="list-none flex justify-center items-center"
|
||||
class="list-none flex justify-center"
|
||||
>
|
||||
<span
|
||||
class="shadow-lg rounded-full bg-n-brand text-white text-xs font-medium my-2.5 mx-auto px-2.5 py-1.5"
|
||||
>
|
||||
{{ unreadMessageLabel }}
|
||||
</span>
|
||||
<UnreadIndicator
|
||||
:label="unreadMessageLabel"
|
||||
variant="primary"
|
||||
@intersect="onUnreadBadgeIntersect"
|
||||
/>
|
||||
</li>
|
||||
</template>
|
||||
<template #after>
|
||||
@@ -512,19 +603,16 @@ export default {
|
||||
}"
|
||||
>
|
||||
<div
|
||||
v-if="isAnyoneTyping"
|
||||
class="absolute flex items-center w-full h-0 -top-7"
|
||||
class="flex items-center justify-center gap-1 absolute w-full -top-7 h-0"
|
||||
>
|
||||
<div
|
||||
class="flex py-2 pr-4 pl-5 shadow-md rounded-full bg-white dark:bg-n-solid-3 text-n-slate-11 text-xs font-semibold my-2.5 mx-auto"
|
||||
>
|
||||
{{ typingUserNames }}
|
||||
<img
|
||||
class="w-6 ltr:ml-2 rtl:mr-2"
|
||||
src="assets/images/typing.gif"
|
||||
alt="Someone is typing"
|
||||
/>
|
||||
</div>
|
||||
<TypingIndicator />
|
||||
<UnreadIndicator
|
||||
v-if="showFloatingUnreadIndicator && unreadMessageCount > 0"
|
||||
variant="secondary"
|
||||
class="cursor-pointer"
|
||||
:label="unreadMessageLabel"
|
||||
@click="scrollToBottom"
|
||||
/>
|
||||
</div>
|
||||
<ReplyBox
|
||||
:pop-out-reply-box="isPopOutReplyBox"
|
||||
|
||||
@@ -32,7 +32,10 @@ export default {
|
||||
value: {
|
||||
required,
|
||||
isEqual(value) {
|
||||
return value === this.confirmValue;
|
||||
// Trim whitespace from both input and target values
|
||||
const normalizedInput = (value || '').trim();
|
||||
const normalizedTarget = (this.confirmValue || '').trim();
|
||||
return normalizedInput === normalizedTarget;
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@@ -39,6 +39,7 @@ export const FEATURE_FLAGS = {
|
||||
CHANNEL_INSTAGRAM: 'channel_instagram',
|
||||
CONTACT_CHATWOOT_SUPPORT_TEAM: 'contact_chatwoot_support_team',
|
||||
CAPTAIN_V2: 'captain_integration_v2',
|
||||
CHAT_PRESERVE_USER_SCROLL: 'chat_preserve_user_scroll',
|
||||
SAML: 'saml',
|
||||
};
|
||||
|
||||
@@ -49,4 +50,5 @@ export const PREMIUM_FEATURES = [
|
||||
FEATURE_FLAGS.AUDIT_LOGS,
|
||||
FEATURE_FLAGS.HELP_CENTER,
|
||||
FEATURE_FLAGS.CAPTAIN_V2,
|
||||
FEATURE_FLAGS.SAML,
|
||||
];
|
||||
|
||||
@@ -145,3 +145,34 @@ export const extractFilenameFromUrl = url => {
|
||||
return match ? match[1] : url;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Normalizes a comma/newline separated list of domains
|
||||
* @param {string} domains - The comma/newline separated list of domains
|
||||
* @returns {string} - The normalized list of domains
|
||||
* - Converts newlines to commas
|
||||
* - Trims whitespace
|
||||
* - Lowercases entries
|
||||
* - Removes empty values
|
||||
* - De-duplicates while preserving original order
|
||||
*/
|
||||
export const sanitizeAllowedDomains = domains => {
|
||||
if (!domains) return '';
|
||||
|
||||
const tokens = domains
|
||||
.replace(/\r\n/g, '\n')
|
||||
.replace(/\s*\n\s*/g, ',')
|
||||
.split(',')
|
||||
.map(d => d.trim().toLowerCase())
|
||||
.filter(d => d.length > 0);
|
||||
|
||||
// De-duplicate while preserving order using Set and filter index
|
||||
const seen = new Set();
|
||||
const unique = tokens.filter(d => {
|
||||
if (seen.has(d)) return false;
|
||||
seen.add(d);
|
||||
return true;
|
||||
});
|
||||
|
||||
return unique.join(',');
|
||||
};
|
||||
|
||||
@@ -25,24 +25,6 @@ export const isJSONValid = value => {
|
||||
return true;
|
||||
};
|
||||
|
||||
export const getTypingUsersText = (users = []) => {
|
||||
const count = users.length;
|
||||
const [firstUser, secondUser] = users;
|
||||
|
||||
if (count === 1) {
|
||||
return ['TYPING.ONE', { user: firstUser.name }];
|
||||
}
|
||||
|
||||
if (count === 2) {
|
||||
return [
|
||||
'TYPING.TWO',
|
||||
{ user: firstUser.name, secondUser: secondUser.name },
|
||||
];
|
||||
}
|
||||
|
||||
return ['TYPING.MULTIPLE', { user: firstUser.name, count: count - 1 }];
|
||||
};
|
||||
|
||||
export const createPendingMessage = data => {
|
||||
const timestamp = Math.floor(new Date().getTime() / 1000);
|
||||
const tempMessageId = getUuid();
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
timeStampAppendedURL,
|
||||
getHostNameFromURL,
|
||||
extractFilenameFromUrl,
|
||||
sanitizeAllowedDomains,
|
||||
} from '../URLHelper';
|
||||
|
||||
describe('#URL Helpers', () => {
|
||||
@@ -318,4 +319,32 @@ describe('#URL Helpers', () => {
|
||||
).toBe('file.doc');
|
||||
});
|
||||
});
|
||||
|
||||
describe('sanitizeAllowedDomains', () => {
|
||||
it('returns empty string for falsy input', () => {
|
||||
expect(sanitizeAllowedDomains('')).toBe('');
|
||||
expect(sanitizeAllowedDomains(null)).toBe('');
|
||||
expect(sanitizeAllowedDomains(undefined)).toBe('');
|
||||
});
|
||||
|
||||
it('trims whitespace and converts newlines to commas', () => {
|
||||
const input = ' example.com \n foo.bar\nbar.baz ';
|
||||
expect(sanitizeAllowedDomains(input)).toBe('example.com,foo.bar,bar.baz');
|
||||
});
|
||||
|
||||
it('handles Windows newlines and mixed spacing', () => {
|
||||
const input = ' example.com\r\n\tfoo.bar , bar.baz ';
|
||||
expect(sanitizeAllowedDomains(input)).toBe('example.com,foo.bar,bar.baz');
|
||||
});
|
||||
|
||||
it('removes empty values from repeated commas', () => {
|
||||
const input = ',,example.com,,foo.bar,,';
|
||||
expect(sanitizeAllowedDomains(input)).toBe('example.com,foo.bar');
|
||||
});
|
||||
|
||||
it('lowercases entries and de-duplicates preserving order', () => {
|
||||
const input = 'Example.com,FOO.bar,example.com,Bar.Baz,foo.BAR';
|
||||
expect(sanitizeAllowedDomains(input)).toBe('example.com,foo.bar,bar.baz');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import {
|
||||
getTypingUsersText,
|
||||
createPendingMessage,
|
||||
convertToAttributeSlug,
|
||||
convertToCategorySlug,
|
||||
@@ -8,32 +7,6 @@ import {
|
||||
formatToTitleCase,
|
||||
} from '../commons';
|
||||
|
||||
describe('#getTypingUsersText', () => {
|
||||
it('returns the correct text is there is only one typing user', () => {
|
||||
expect(getTypingUsersText([{ name: 'Pranav' }])).toEqual([
|
||||
'TYPING.ONE',
|
||||
{ user: 'Pranav' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('returns the correct text is there are two typing users', () => {
|
||||
expect(
|
||||
getTypingUsersText([{ name: 'Pranav' }, { name: 'Nithin' }])
|
||||
).toEqual(['TYPING.TWO', { user: 'Pranav', secondUser: 'Nithin' }]);
|
||||
});
|
||||
|
||||
it('returns the correct text is there are more than two users are typing', () => {
|
||||
expect(
|
||||
getTypingUsersText([
|
||||
{ name: 'Pranav' },
|
||||
{ name: 'Nithin' },
|
||||
{ name: 'Subin' },
|
||||
{ name: 'Sojan' },
|
||||
])
|
||||
).toEqual(['TYPING.MULTIPLE', { user: 'Pranav', count: 3 }]);
|
||||
});
|
||||
});
|
||||
|
||||
describe('#createPendingMessage', () => {
|
||||
const message = {
|
||||
message: 'hi',
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "You",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "ሰብስብ",
|
||||
"NO_NOTES": "ማስታወሻዎች የሉም፣ ከእውቂያው ዝርዝር ገፅ ላይ ማስታወሻዎችን መጨመር ይችላሉ።",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Search",
|
||||
"EMPTY_STATE": "No results found"
|
||||
},
|
||||
"CLOSE": "Close"
|
||||
"CLOSE": "Close",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger Script",
|
||||
"MESSENGER_SUB_HEAD": "Place this button inside your body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agents",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Forgot your password?",
|
||||
"CREATE_NEW_ACCOUNT": "Create a new account",
|
||||
"SUBMIT": "Login"
|
||||
"SUBMIT": "Login",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "كتب",
|
||||
"YOU": "أنت",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "بحث",
|
||||
"EMPTY_STATE": "لم يتم العثور على النتائج"
|
||||
},
|
||||
"CLOSE": "أغلق"
|
||||
"CLOSE": "أغلق",
|
||||
"BETA": "تجريبي",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "كود \"الماسنجر\"",
|
||||
"MESSENGER_SUB_HEAD": "ضع هذا الكود داخل وسم الـ body في موقعك",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "وكيل الدعم",
|
||||
"INBOX_AGENTS_SUB_TEXT": "إضافة أو إزالة وكلاء من صندوق الوارد هذا",
|
||||
"AGENT_ASSIGNMENT": "تعيين المحادثة",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "نسيت كلمة المرور؟",
|
||||
"CREATE_NEW_ACCOUNT": "إنشاء حساب جديد",
|
||||
"SUBMIT": "تسجيل الدخول"
|
||||
"SUBMIT": "تسجيل الدخول",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "You",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Search",
|
||||
"EMPTY_STATE": "No results found"
|
||||
},
|
||||
"CLOSE": "Close"
|
||||
"CLOSE": "Close",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger Script",
|
||||
"MESSENGER_SUB_HEAD": "Place this button inside your body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agents",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Forgot your password?",
|
||||
"CREATE_NEW_ACCOUNT": "Create a new account",
|
||||
"SUBMIT": "Login"
|
||||
"SUBMIT": "Login",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "You",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Търсене",
|
||||
"EMPTY_STATE": "Няма намерени резултати"
|
||||
},
|
||||
"CLOSE": "Close"
|
||||
"CLOSE": "Close",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger Script",
|
||||
"MESSENGER_SUB_HEAD": "Place this button inside your body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Агенти",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Forgot your password?",
|
||||
"CREATE_NEW_ACCOUNT": "Create new account",
|
||||
"SUBMIT": "Login"
|
||||
"SUBMIT": "Login",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "va escriure",
|
||||
"YOU": "Tu",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expandeix",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Cercar",
|
||||
"EMPTY_STATE": "No s'ha trobat agents"
|
||||
},
|
||||
"CLOSE": "Tanca"
|
||||
"CLOSE": "Tanca",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Script del missatger",
|
||||
"MESSENGER_SUB_HEAD": "Col·loca aquest botó dins de l'etiqueta body",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agents",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Afegir o eliminar agents d'aquesta safata d'entrada",
|
||||
"AGENT_ASSIGNMENT": "Conversació Assignada",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Has oblidat la contrasenya?",
|
||||
"CREATE_NEW_ACCOUNT": "Crear un nou compte",
|
||||
"SUBMIT": "Inicia la sessió"
|
||||
"SUBMIT": "Inicia la sessió",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "Vy",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Hledat",
|
||||
"EMPTY_STATE": "Žádné výsledky"
|
||||
},
|
||||
"CLOSE": "Zavřít"
|
||||
"CLOSE": "Zavřít",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger skript",
|
||||
"MESSENGER_SUB_HEAD": "Umístěte toto tlačítko dovnitř vašeho tělesného štítku",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agenti",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Přidat nebo odebrat agenty z této složky doručené pošty",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Zapomněli jste heslo?",
|
||||
"CREATE_NEW_ACCOUNT": "Vytvořit nový účet",
|
||||
"SUBMIT": "Přihlásit se"
|
||||
"SUBMIT": "Přihlásit se",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "Dig",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Søg",
|
||||
"EMPTY_STATE": "Ingen resultater fundet"
|
||||
},
|
||||
"CLOSE": "Luk"
|
||||
"CLOSE": "Luk",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger- Script",
|
||||
"MESSENGER_SUB_HEAD": "Placer denne knap inde i din body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agenter",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Tilføj eller fjern agenter fra denne indbakke",
|
||||
"AGENT_ASSIGNMENT": "Samtale Tildeling",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Glemt din adgangskode?",
|
||||
"CREATE_NEW_ACCOUNT": "Opret ny konto",
|
||||
"SUBMIT": "Log Ind"
|
||||
"SUBMIT": "Log Ind",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "schrieb",
|
||||
"YOU": "Sie",
|
||||
"SAVE": "Notiz speichern",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Erweitern",
|
||||
"COLLAPSE": "Einklappen",
|
||||
"NO_NOTES": "Keine Notizen, Sie können Notizen auf der Kontakt-Detailseite hinzufügen.",
|
||||
"EMPTY_STATE": "Es gibt keine Notizen zu diesem Kontakt. Sie können eine Notiz hinzufügen, indem Sie diese in das obige Feld eingeben."
|
||||
"EMPTY_STATE": "Es gibt keine Notizen zu diesem Kontakt. Sie können eine Notiz hinzufügen, indem Sie diese in das obige Feld eingeben.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Suchen",
|
||||
"EMPTY_STATE": "Keine Ergebnisse gefunden"
|
||||
},
|
||||
"CLOSE": "Schließen"
|
||||
"CLOSE": "Schließen",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger-Skript",
|
||||
"MESSENGER_SUB_HEAD": "Platzieren Sie diese Schaltfläche in Ihrem Body-Tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agenten",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Hinzufügen oder Entfernen von Agenten zu diesem Posteingang",
|
||||
"AGENT_ASSIGNMENT": "Konversationssauftrag",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Haben Sie Ihr Passwort vergessen?",
|
||||
"CREATE_NEW_ACCOUNT": "Neuen Account erstellen",
|
||||
"SUBMIT": "Einloggen"
|
||||
"SUBMIT": "Einloggen",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "You",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Αναζήτηση",
|
||||
"EMPTY_STATE": "Δεν βρέθηκαν αποτελέσματα"
|
||||
},
|
||||
"CLOSE": "Κλείσιμο"
|
||||
"CLOSE": "Κλείσιμο",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Κώδικας (Script)",
|
||||
"MESSENGER_SUB_HEAD": "Τοποθετήσετε αυτόν τον κώδικα μέσα στο body tag της ιστοσελίδας σας",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Πράκτορες",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Προσθέστε ή αφαιρέστε πράκτορες σε αυτό το κιβώτιο",
|
||||
"AGENT_ASSIGNMENT": "Ανάθεση Συνομιλίας",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Ξεχάσατε τον κωδικό;",
|
||||
"CREATE_NEW_ACCOUNT": "Δημιουργία νέου Λογαριασμού",
|
||||
"SUBMIT": "Είσοδος"
|
||||
"SUBMIT": "Είσοδος",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,8 +25,9 @@
|
||||
"PLACEHOLDER": "Type any text to search messages",
|
||||
"NO_MATCHING_RESULTS": "No results found."
|
||||
},
|
||||
"UNREAD_MESSAGES": "Unread Messages",
|
||||
"UNREAD_MESSAGE": "Unread Message",
|
||||
"UNREAD_COUNT": "{count} Unread Messages",
|
||||
"UNREAD_COUNT_OVERFLOW": "9+ Unread Messages",
|
||||
"SINGLE_UNREAD_MESSAGE": "1 Unread Message",
|
||||
"CLICK_HERE": "Click here",
|
||||
"LOADING_INBOXES": "Loading inboxes",
|
||||
"LOADING_CONVERSATIONS": "Loading Conversations",
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Search",
|
||||
"EMPTY_STATE": "No results found"
|
||||
},
|
||||
"CLOSE": "Close"
|
||||
"CLOSE": "Close",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger Script",
|
||||
"MESSENGER_SUB_HEAD": "Place this button inside your body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agents",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed"
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "escribió",
|
||||
"YOU": "Tú",
|
||||
"SAVE": "Guardar nota",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expandir",
|
||||
"COLLAPSE": "Contraer",
|
||||
"NO_NOTES": "No hay notas, puede agregar notas desde la página de detalles de contacto.",
|
||||
"EMPTY_STATE": "No hay notas asociadas a este contacto. Puede añadir una nota escribiendo en el recuadro superior."
|
||||
"EMPTY_STATE": "No hay notas asociadas a este contacto. Puede añadir una nota escribiendo en el recuadro superior.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Buscar",
|
||||
"EMPTY_STATE": "No se encontraron resultados"
|
||||
},
|
||||
"CLOSE": "Cerrar"
|
||||
"CLOSE": "Cerrar",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Script de Messenger",
|
||||
"MESSENGER_SUB_HEAD": "Coloca este botón dentro de tu etiqueta cuerpo",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agentes",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Añadir o quitar agentes de esta bandeja de entrada",
|
||||
"AGENT_ASSIGNMENT": "Asignación de conversación",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "¿Olvidaste tu contraseña?",
|
||||
"CREATE_NEW_ACCOUNT": "Crear nueva cuenta",
|
||||
"SUBMIT": "Iniciar sesión"
|
||||
"SUBMIT": "Iniciar sesión",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "نوشت",
|
||||
"YOU": "شما",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "جستجو",
|
||||
"EMPTY_STATE": "نتیجهای یافت نشد"
|
||||
},
|
||||
"CLOSE": "بستن"
|
||||
"CLOSE": "بستن",
|
||||
"BETA": "آزمایشی",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "اسکریپت ویجت",
|
||||
"MESSENGER_SUB_HEAD": "این دکمه را در تگ body قرار دهید",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "ایجنت ها",
|
||||
"INBOX_AGENTS_SUB_TEXT": "اضافه کردن یا حذف کردن دسترسی ایجنت به صندوق ورودی",
|
||||
"AGENT_ASSIGNMENT": "اختصاص گفتگو",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "رمز عبورتان را فراموش کردید؟",
|
||||
"CREATE_NEW_ACCOUNT": "حساب جدید بسازید",
|
||||
"SUBMIT": "ورود"
|
||||
"SUBMIT": "ورود",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "Sinä",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Etsi",
|
||||
"EMPTY_STATE": "Tuloksia ei löytynyt"
|
||||
},
|
||||
"CLOSE": "Sulje"
|
||||
"CLOSE": "Sulje",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger-skripti",
|
||||
"MESSENGER_SUB_HEAD": "Aseta tämä painike body-tagiisi",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Edustajat",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Lisää tai poista edustajia tästä saapuneet-kansiosta",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Salasana unohtunut?",
|
||||
"CREATE_NEW_ACCOUNT": "Luo uusi tili",
|
||||
"SUBMIT": "Kirjaudu"
|
||||
"SUBMIT": "Kirjaudu",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "Vous",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Développer",
|
||||
"COLLAPSE": "Réduire",
|
||||
"NO_NOTES": "Pas de notes, vous pouvez en ajouter depuis la page des détails du contact.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Rechercher",
|
||||
"EMPTY_STATE": "Aucun résultat trouvé"
|
||||
},
|
||||
"CLOSE": "Fermer"
|
||||
"CLOSE": "Fermer",
|
||||
"BETA": "Bêta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Script du Widget Web",
|
||||
"MESSENGER_SUB_HEAD": "Placez ce code avant la fermeture de votre balise body",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agents",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Ajouter ou supprimer des agents de cette boîte de réception",
|
||||
"AGENT_ASSIGNMENT": "Konversationsauftrag",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Mot de passe oublié ?",
|
||||
"CREATE_NEW_ACCOUNT": "Créer un nouveau compte",
|
||||
"SUBMIT": "Se connecter"
|
||||
"SUBMIT": "Se connecter",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "נכתב",
|
||||
"YOU": "You",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "חפש",
|
||||
"EMPTY_STATE": "לא נמצאו תוצאות"
|
||||
},
|
||||
"CLOSE": "סגור"
|
||||
"CLOSE": "סגור",
|
||||
"BETA": "בטא",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "סקריפט מסנג'ר",
|
||||
"MESSENGER_SUB_HEAD": "מקם את הכפתור הזה בתוך תג הגוף שלך",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "סוכנים",
|
||||
"INBOX_AGENTS_SUB_TEXT": "הוסף או הסר נציגים מתיבת הדואר הנכנס הזו",
|
||||
"AGENT_ASSIGNMENT": "שיוך שיחה",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "שכחת את הסיסמה?",
|
||||
"CREATE_NEW_ACCOUNT": "צור חשבון",
|
||||
"SUBMIT": "התחבר"
|
||||
"SUBMIT": "התחבר",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "You",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Search",
|
||||
"EMPTY_STATE": "No results found"
|
||||
},
|
||||
"CLOSE": "Close"
|
||||
"CLOSE": "Close",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger Script",
|
||||
"MESSENGER_SUB_HEAD": "Place this button inside your body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agents",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Forgot your password?",
|
||||
"CREATE_NEW_ACCOUNT": "Create new account",
|
||||
"SUBMIT": "Login"
|
||||
"SUBMIT": "Login",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "napisao/la",
|
||||
"YOU": "Vi",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Search",
|
||||
"EMPTY_STATE": "Nisu pronađeni rezultati"
|
||||
},
|
||||
"CLOSE": "Close"
|
||||
"CLOSE": "Close",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger Script",
|
||||
"MESSENGER_SUB_HEAD": "Place this button inside your body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agenti",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Forgot your password?",
|
||||
"CREATE_NEW_ACCOUNT": "Create new account",
|
||||
"SUBMIT": "Login"
|
||||
"SUBMIT": "Login",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "írta",
|
||||
"YOU": "Ön",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Kiegészítés",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Keresés",
|
||||
"EMPTY_STATE": "Nincs találat"
|
||||
},
|
||||
"CLOSE": "Bezárás"
|
||||
"CLOSE": "Bezárás",
|
||||
"BETA": "Béta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger szkript",
|
||||
"MESSENGER_SUB_HEAD": "Ezt a gombot a body tag-en belül helyezd el",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Ügynökök",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Ügynökök hosszáadása vagy eltávolítása az inboxból",
|
||||
"AGENT_ASSIGNMENT": "Beszélgetés hozzárendelés",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Elfelejtetted a jelszavad?",
|
||||
"CREATE_NEW_ACCOUNT": "Új fiók létrehozása",
|
||||
"SUBMIT": "Bejelentkezés"
|
||||
"SUBMIT": "Bejelentkezés",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -554,10 +554,12 @@
|
||||
"WROTE": "wrote",
|
||||
"YOU": "You",
|
||||
"SAVE": "Save note",
|
||||
"ADD_NOTE": "Add contact note",
|
||||
"EXPAND": "Expand",
|
||||
"COLLAPSE": "Collapse",
|
||||
"NO_NOTES": "No notes, you can add notes from the contact details page.",
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above.",
|
||||
"CONVERSATION_EMPTY_STATE": "There are no notes yet. Use the Add note button to create one."
|
||||
}
|
||||
},
|
||||
"EMPTY_STATE": {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"PLACEHOLDER": "Search",
|
||||
"EMPTY_STATE": "No results found"
|
||||
},
|
||||
"CLOSE": "Close"
|
||||
"CLOSE": "Close",
|
||||
"BETA": "Beta",
|
||||
"BETA_DESCRIPTION": "This feature is in beta and may change as we improve it."
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,6 +618,11 @@
|
||||
"SETTINGS_POPUP": {
|
||||
"MESSENGER_HEADING": "Messenger Script",
|
||||
"MESSENGER_SUB_HEAD": "Place this button inside your body tag",
|
||||
"ALLOWED_DOMAINS": {
|
||||
"TITLE": "Allowed Domains",
|
||||
"SUBTITLE": "Add wildcard or regular domains separated by commas (leave blank to allow all), e.g. *.chatwoot.dev, chatwoot.com.",
|
||||
"PLACEHOLDER": "Enter domains separated by commas (eg: *.chatwoot.dev, chatwoot.com)"
|
||||
},
|
||||
"INBOX_AGENTS": "Agents",
|
||||
"INBOX_AGENTS_SUB_TEXT": "Add or remove agents from this inbox",
|
||||
"AGENT_ASSIGNMENT": "Conversation Assignment",
|
||||
|
||||
@@ -22,6 +22,20 @@
|
||||
},
|
||||
"FORGOT_PASSWORD": "Forgot your password?",
|
||||
"CREATE_NEW_ACCOUNT": "Create new account",
|
||||
"SUBMIT": "Login"
|
||||
"SUBMIT": "Login",
|
||||
"SAML": {
|
||||
"LABEL": "Log in via SSO",
|
||||
"TITLE": "Initiate Single Sign-on (SSO)",
|
||||
"SUBTITLE": "Enter your work email to access your organization",
|
||||
"BACK_TO_LOGIN": "Login via Password",
|
||||
"WORK_EMAIL": {
|
||||
"LABEL": "Work Email",
|
||||
"PLACEHOLDER": "Enter your work email"
|
||||
},
|
||||
"SUBMIT": "Continue with SSO",
|
||||
"API": {
|
||||
"ERROR_MESSAGE": "SSO authentication failed. Please check your credentials and try again."
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user