Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
320e7ea246 | ||
|
|
c1f6d9f76f | ||
|
|
ed562832a6 | ||
|
|
12d7be62d3 | ||
|
|
6040e50265 | ||
|
|
488c334b72 | ||
|
|
7c2ca1a07e | ||
|
|
bca8c99148 | ||
|
|
ecfa6bf6a2 | ||
|
|
616bbced9c | ||
|
|
24f49b9b5a | ||
|
|
ef24eef0b9 | ||
|
|
e90c231dd3 |
@@ -155,10 +155,6 @@ TWITTER_ENVIRONMENT=
|
|||||||
SLACK_CLIENT_ID=
|
SLACK_CLIENT_ID=
|
||||||
SLACK_CLIENT_SECRET=
|
SLACK_CLIENT_SECRET=
|
||||||
|
|
||||||
#Linear Integration
|
|
||||||
LINEAR_CLIENT_ID=
|
|
||||||
LINEAR_CLIENT_SECRET=
|
|
||||||
|
|
||||||
# Google OAuth
|
# Google OAuth
|
||||||
GOOGLE_OAUTH_CLIENT_ID=
|
GOOGLE_OAUTH_CLIENT_ID=
|
||||||
GOOGLE_OAUTH_CLIENT_SECRET=
|
GOOGLE_OAUTH_CLIENT_SECRET=
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ on:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
nightly:
|
nightly:
|
||||||
runs-on: ubuntu-20.04
|
runs-on: ubuntu-24.04
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- name: get installer
|
- name: get installer
|
||||||
|
|||||||
+1
-1
@@ -799,7 +799,7 @@ GEM
|
|||||||
unf_ext (0.0.8.2)
|
unf_ext (0.0.8.2)
|
||||||
unicode-display_width (2.4.2)
|
unicode-display_width (2.4.2)
|
||||||
uniform_notifier (1.16.0)
|
uniform_notifier (1.16.0)
|
||||||
uri (0.13.0)
|
uri (1.0.3)
|
||||||
uri_template (0.7.0)
|
uri_template (0.7.0)
|
||||||
valid_email2 (5.2.6)
|
valid_email2 (5.2.6)
|
||||||
activemodel (>= 3.2)
|
activemodel (>= 3.2)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
button,
|
button:not(.reset-base),
|
||||||
input[type="button"],
|
input[type='button']:not(.reset-base),
|
||||||
input[type="reset"],
|
input[type='reset']:not(.reset-base),
|
||||||
input[type="submit"],
|
input[type='submit']:not(.reset-base),
|
||||||
.button {
|
.button:not(.reset-base) {
|
||||||
appearance: none;
|
appearance: none;
|
||||||
background-color: $color-woot;
|
background-color: $color-woot;
|
||||||
border: 0;
|
border: 0;
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
.icon-container {
|
.icon-container {
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.value-container {
|
.value-container {
|
||||||
|
|||||||
@@ -16,9 +16,12 @@ class Linear::CallbacksController < ApplicationController
|
|||||||
private
|
private
|
||||||
|
|
||||||
def oauth_client
|
def oauth_client
|
||||||
|
app_id = GlobalConfigService.load('LINEAR_CLIENT_ID', nil)
|
||||||
|
app_secret = GlobalConfigService.load('LINEAR_CLIENT_SECRET', nil)
|
||||||
|
|
||||||
OAuth2::Client.new(
|
OAuth2::Client.new(
|
||||||
ENV.fetch('LINEAR_CLIENT_ID', nil),
|
app_id,
|
||||||
ENV.fetch('LINEAR_CLIENT_SECRET', nil),
|
app_secret,
|
||||||
{
|
{
|
||||||
site: 'https://api.linear.app',
|
site: 'https://api.linear.app',
|
||||||
token_url: '/oauth/token',
|
token_url: '/oauth/token',
|
||||||
|
|||||||
@@ -39,6 +39,8 @@ class SuperAdmin::AppConfigsController < SuperAdmin::ApplicationController
|
|||||||
%w[AZURE_APP_ID AZURE_APP_SECRET]
|
%w[AZURE_APP_ID AZURE_APP_SECRET]
|
||||||
when 'email'
|
when 'email'
|
||||||
['MAILER_INBOUND_EMAIL_DOMAIN']
|
['MAILER_INBOUND_EMAIL_DOMAIN']
|
||||||
|
when 'linear'
|
||||||
|
%w[LINEAR_CLIENT_ID LINEAR_CLIENT_SECRET]
|
||||||
else
|
else
|
||||||
%w[ENABLE_ACCOUNT_SIGNUP FIREBASE_PROJECT_ID FIREBASE_CREDENTIALS]
|
%w[ENABLE_ACCOUNT_SIGNUP FIREBASE_PROJECT_ID FIREBASE_CREDENTIALS]
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -78,7 +78,11 @@ class AccountDashboard < Administrate::BaseDashboard
|
|||||||
# COLLECTION_FILTERS = {
|
# COLLECTION_FILTERS = {
|
||||||
# open: ->(resources) { resources.where(open: true) }
|
# open: ->(resources) { resources.where(open: true) }
|
||||||
# }.freeze
|
# }.freeze
|
||||||
COLLECTION_FILTERS = {}.freeze
|
COLLECTION_FILTERS = {
|
||||||
|
active: ->(resources) { resources.where(status: :active) },
|
||||||
|
suspended: ->(resources) { resources.where(status: :suspended) },
|
||||||
|
recent: ->(resources) { resources.where('created_at > ?', 30.days.ago) }
|
||||||
|
}.freeze
|
||||||
|
|
||||||
# Overwrite this method to customize how accounts are displayed
|
# Overwrite this method to customize how accounts are displayed
|
||||||
# across all pages of the admin dashboard.
|
# across all pages of the admin dashboard.
|
||||||
|
|||||||
@@ -94,7 +94,12 @@ class UserDashboard < Administrate::BaseDashboard
|
|||||||
# COLLECTION_FILTERS = {
|
# COLLECTION_FILTERS = {
|
||||||
# open: ->(resources) { resources.where(open: true) }
|
# open: ->(resources) { resources.where(open: true) }
|
||||||
# }.freeze
|
# }.freeze
|
||||||
COLLECTION_FILTERS = {}.freeze
|
COLLECTION_FILTERS = {
|
||||||
|
super_admin: ->(resources) { resources.where(type: 'SuperAdmin') },
|
||||||
|
confirmed: ->(resources) { resources.where.not(confirmed_at: nil) },
|
||||||
|
unconfirmed: ->(resources) { resources.where(confirmed_at: nil) },
|
||||||
|
recent: ->(resources) { resources.where('created_at > ?', 30.days.ago) }
|
||||||
|
}.freeze
|
||||||
|
|
||||||
# Overwrite this method to customize how users are displayed
|
# Overwrite this method to customize how users are displayed
|
||||||
# across all pages of the admin dashboard.
|
# across all pages of the admin dashboard.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
module FilterHelper
|
module Filters::FilterHelper
|
||||||
def build_condition_query(model_filters, query_hash, current_index)
|
def build_condition_query(model_filters, query_hash, current_index)
|
||||||
current_filter = model_filters[query_hash['attribute_key']]
|
current_filter = model_filters[query_hash['attribute_key']]
|
||||||
|
|
||||||
@@ -89,4 +89,18 @@ module FilterHelper
|
|||||||
operator = condition['query_operator'].upcase
|
operator = condition['query_operator'].upcase
|
||||||
raise CustomExceptions::CustomFilter::InvalidQueryOperator.new({}) unless %w[AND OR].include?(operator)
|
raise CustomExceptions::CustomFilter::InvalidQueryOperator.new({}) unless %w[AND OR].include?(operator)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def conversation_status_values(values)
|
||||||
|
return Conversation.statuses.values if values.include?('all')
|
||||||
|
|
||||||
|
values.map { |x| Conversation.statuses[x.to_sym] }
|
||||||
|
end
|
||||||
|
|
||||||
|
def conversation_priority_values(values)
|
||||||
|
values.map { |x| Conversation.priorities[x.to_sym] }
|
||||||
|
end
|
||||||
|
|
||||||
|
def message_type_values(values)
|
||||||
|
values.map { |x| Message.message_types[x.to_sym] }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -32,7 +32,7 @@ module Linear::IntegrationHelper
|
|||||||
private
|
private
|
||||||
|
|
||||||
def client_secret
|
def client_secret
|
||||||
@client_secret ||= ENV.fetch('LINEAR_CLIENT_SECRET', nil)
|
@client_secret ||= GlobalConfigService.load('LINEAR_CLIENT_SECRET', nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
def decode_token(token, secret)
|
def decode_token(token, secret)
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import AddAccountModal from '../dashboard/components/layout/sidebarComponents/Ad
|
|||||||
import LoadingState from './components/widgets/LoadingState.vue';
|
import LoadingState from './components/widgets/LoadingState.vue';
|
||||||
import NetworkNotification from './components/NetworkNotification.vue';
|
import NetworkNotification from './components/NetworkNotification.vue';
|
||||||
import UpdateBanner from './components/app/UpdateBanner.vue';
|
import UpdateBanner from './components/app/UpdateBanner.vue';
|
||||||
import UpgradeBanner from './components/app/UpgradeBanner.vue';
|
|
||||||
import PaymentPendingBanner from './components/app/PaymentPendingBanner.vue';
|
import PaymentPendingBanner from './components/app/PaymentPendingBanner.vue';
|
||||||
import PendingEmailVerificationBanner from './components/app/PendingEmailVerificationBanner.vue';
|
import PendingEmailVerificationBanner from './components/app/PendingEmailVerificationBanner.vue';
|
||||||
import vueActionCable from './helper/actionCable';
|
import vueActionCable from './helper/actionCable';
|
||||||
@@ -31,7 +30,6 @@ export default {
|
|||||||
UpdateBanner,
|
UpdateBanner,
|
||||||
PaymentPendingBanner,
|
PaymentPendingBanner,
|
||||||
WootSnackbarBox,
|
WootSnackbarBox,
|
||||||
UpgradeBanner,
|
|
||||||
PendingEmailVerificationBanner,
|
PendingEmailVerificationBanner,
|
||||||
},
|
},
|
||||||
setup() {
|
setup() {
|
||||||
@@ -146,7 +144,6 @@ export default {
|
|||||||
<template v-if="currentAccountId">
|
<template v-if="currentAccountId">
|
||||||
<PendingEmailVerificationBanner v-if="hideOnOnboardingView" />
|
<PendingEmailVerificationBanner v-if="hideOnOnboardingView" />
|
||||||
<PaymentPendingBanner v-if="hideOnOnboardingView" />
|
<PaymentPendingBanner v-if="hideOnOnboardingView" />
|
||||||
<UpgradeBanner />
|
|
||||||
</template>
|
</template>
|
||||||
<router-view v-slot="{ Component }">
|
<router-view v-slot="{ Component }">
|
||||||
<transition name="fade" mode="out-in">
|
<transition name="fade" mode="out-in">
|
||||||
|
|||||||
@@ -137,6 +137,10 @@ class ConversationApi extends ApiClient {
|
|||||||
requestCopilot(conversationId, body) {
|
requestCopilot(conversationId, body) {
|
||||||
return axios.post(`${this.url}/${conversationId}/copilot`, body);
|
return axios.post(`${this.url}/${conversationId}/copilot`, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getInboxAssistant(conversationId) {
|
||||||
|
return axios.get(`${this.url}/${conversationId}/inbox_assistant`);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default new ConversationApi();
|
export default new ConversationApi();
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import CopilotInput from './CopilotInput.vue';
|
|||||||
import CopilotLoader from './CopilotLoader.vue';
|
import CopilotLoader from './CopilotLoader.vue';
|
||||||
import CopilotAgentMessage from './CopilotAgentMessage.vue';
|
import CopilotAgentMessage from './CopilotAgentMessage.vue';
|
||||||
import CopilotAssistantMessage from './CopilotAssistantMessage.vue';
|
import CopilotAssistantMessage from './CopilotAssistantMessage.vue';
|
||||||
|
import ToggleCopilotAssistant from './ToggleCopilotAssistant.vue';
|
||||||
import Icon from '../icon/Icon.vue';
|
import Icon from '../icon/Icon.vue';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -26,9 +27,17 @@ const props = defineProps({
|
|||||||
type: String,
|
type: String,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
|
assistants: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [],
|
||||||
|
},
|
||||||
|
activeAssistant: {
|
||||||
|
type: Object,
|
||||||
|
default: () => ({}),
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const emit = defineEmits(['sendMessage', 'reset']);
|
const emit = defineEmits(['sendMessage', 'reset', 'setAssistant']);
|
||||||
|
|
||||||
const COPILOT_USER_ROLES = ['assistant', 'system'];
|
const COPILOT_USER_ROLES = ['assistant', 'system'];
|
||||||
|
|
||||||
@@ -97,14 +106,18 @@ watch(
|
|||||||
|
|
||||||
<CopilotLoader v-if="isCaptainTyping" />
|
<CopilotLoader v-if="isCaptainTyping" />
|
||||||
</div>
|
</div>
|
||||||
<div>
|
|
||||||
<div v-if="!messages.length" class="flex-1 px-3 py-3 space-y-1">
|
<div
|
||||||
|
v-if="!messages.length"
|
||||||
|
class="h-full w-full flex items-center justify-center"
|
||||||
|
>
|
||||||
|
<div class="h-fit px-3 py-3 space-y-1">
|
||||||
<span class="text-xs text-n-slate-10">
|
<span class="text-xs text-n-slate-10">
|
||||||
{{ $t('COPILOT.TRY_THESE_PROMPTS') }}
|
{{ $t('COPILOT.TRY_THESE_PROMPTS') }}
|
||||||
</span>
|
</span>
|
||||||
<button
|
<button
|
||||||
v-for="prompt in promptOptions"
|
v-for="prompt in promptOptions"
|
||||||
:key="prompt"
|
:key="prompt.label"
|
||||||
class="px-2 py-1 rounded-md border border-n-weak bg-n-slate-2 text-n-slate-11 flex items-center gap-1"
|
class="px-2 py-1 rounded-md border border-n-weak bg-n-slate-2 text-n-slate-11 flex items-center gap-1"
|
||||||
@click="() => useSuggestion(prompt)"
|
@click="() => useSuggestion(prompt)"
|
||||||
>
|
>
|
||||||
@@ -112,7 +125,17 @@ watch(
|
|||||||
<Icon icon="i-lucide-chevron-right" />
|
<Icon icon="i-lucide-chevron-right" />
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="mx-3 mt-px mb-2 flex flex-col items-end flex-1">
|
</div>
|
||||||
|
|
||||||
|
<div class="mx-3 mt-px mb-2">
|
||||||
|
<div class="flex items-center gap-2 justify-between w-full mb-1">
|
||||||
|
<ToggleCopilotAssistant
|
||||||
|
v-if="assistants.length"
|
||||||
|
:assistants="assistants"
|
||||||
|
:active-assistant="activeAssistant"
|
||||||
|
@set-assistant="$event => emit('setAssistant', $event)"
|
||||||
|
/>
|
||||||
|
<div v-else />
|
||||||
<button
|
<button
|
||||||
v-if="messages.length"
|
v-if="messages.length"
|
||||||
class="text-xs flex items-center gap-1 hover:underline"
|
class="text-xs flex items-center gap-1 hover:underline"
|
||||||
@@ -121,8 +144,8 @@ watch(
|
|||||||
<i class="i-lucide-refresh-ccw" />
|
<i class="i-lucide-refresh-ccw" />
|
||||||
<span>{{ $t('CAPTAIN.COPILOT.RESET') }}</span>
|
<span>{{ $t('CAPTAIN.COPILOT.RESET') }}</span>
|
||||||
</button>
|
</button>
|
||||||
<CopilotInput class="mb-1 flex-1 w-full" @send="sendMessage" />
|
|
||||||
</div>
|
</div>
|
||||||
|
<CopilotInput class="mb-1 w-full" @send="sendMessage" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
<script setup>
|
||||||
|
import { computed } from 'vue';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
import Button from 'dashboard/components-next/button/Button.vue';
|
||||||
|
import DropdownContainer from 'next/dropdown-menu/base/DropdownContainer.vue';
|
||||||
|
import DropdownSection from 'next/dropdown-menu/base/DropdownSection.vue';
|
||||||
|
import DropdownBody from 'next/dropdown-menu/base/DropdownBody.vue';
|
||||||
|
import DropdownItem from 'next/dropdown-menu/base/DropdownItem.vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
assistants: {
|
||||||
|
type: Array,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
activeAssistant: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const emit = defineEmits(['setAssistant']);
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
const activeAssistantLabel = computed(() => {
|
||||||
|
return props.activeAssistant
|
||||||
|
? props.activeAssistant.name
|
||||||
|
: t('CAPTAIN.COPILOT.SELECT_ASSISTANT');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<DropdownContainer>
|
||||||
|
<template #trigger="{ toggle, isOpen }">
|
||||||
|
<Button
|
||||||
|
:label="activeAssistantLabel"
|
||||||
|
icon="i-woot-captain"
|
||||||
|
ghost
|
||||||
|
slate
|
||||||
|
xs
|
||||||
|
:class="{ 'bg-n-alpha-2': isOpen }"
|
||||||
|
@click="toggle"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
<DropdownBody class="bottom-9 min-w-64 z-50" strong>
|
||||||
|
<DropdownSection class="max-h-80 overflow-scroll">
|
||||||
|
<DropdownItem
|
||||||
|
v-for="assistant in assistants"
|
||||||
|
:key="assistant.id"
|
||||||
|
class="!items-start !gap-1 flex-col cursor-pointer"
|
||||||
|
@click="() => emit('setAssistant', assistant)"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="flex gap-1 justify-between w-full">
|
||||||
|
<div class="items-start flex gap-1 flex-col">
|
||||||
|
<span class="text-n-slate-12 text-sm">
|
||||||
|
{{ assistant.name }}
|
||||||
|
</span>
|
||||||
|
<span class="line-clamp-2 text-n-slate-11 text-xs">
|
||||||
|
{{ assistant.description }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
v-if="assistant.id === activeAssistant?.id"
|
||||||
|
class="flex items-center justify-center flex-shrink-0 w-4 h-4 rounded-full bg-n-slate-12 dark:bg-n-slate-11"
|
||||||
|
>
|
||||||
|
<i
|
||||||
|
class="i-lucide-check text-white dark:text-n-slate-1 size-3"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</DropdownItem>
|
||||||
|
</DropdownSection>
|
||||||
|
</DropdownBody>
|
||||||
|
</DropdownContainer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
@@ -19,7 +19,7 @@ const beforeClass = computed(() => {
|
|||||||
|
|
||||||
// Add extra blur layer only when strong prop is true, as a hack for Chrome's stacked backdrop-blur limitation
|
// Add extra blur layer only when strong prop is true, as a hack for Chrome's stacked backdrop-blur limitation
|
||||||
// https://issues.chromium.org/issues/40835530
|
// https://issues.chromium.org/issues/40835530
|
||||||
return "before:content-['\x00A0'] before:absolute before:bottom-0 before:left-0 before:w-full before:h-full before:backdrop-contrast-70 before:backdrop-blur-sm before:z-0 [&>*]:relative";
|
return "before:content-['\x00A0'] before:absolute before:bottom-0 before:left-0 before:w-full before:h-full before:rounded-xl before:backdrop-contrast-70 before:backdrop-blur-sm before:z-0 [&>*]:relative";
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,10 @@ import { computed } from 'vue';
|
|||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { useOperators } from './operators';
|
import { useOperators } from './operators';
|
||||||
import { useMapGetter } from 'dashboard/composables/store.js';
|
import { useMapGetter } from 'dashboard/composables/store.js';
|
||||||
import { buildAttributesFilterTypes } from './helper/filterHelper.js';
|
import {
|
||||||
|
buildAttributesFilterTypes,
|
||||||
|
CONTACT_ATTRIBUTES,
|
||||||
|
} from './helper/filterHelper.js';
|
||||||
import countries from 'shared/constants/countries.js';
|
import countries from 'shared/constants/countries.js';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -59,7 +62,11 @@ export function useContactFilterContext() {
|
|||||||
* @type {import('vue').ComputedRef<FilterType[]>}
|
* @type {import('vue').ComputedRef<FilterType[]>}
|
||||||
*/
|
*/
|
||||||
const customFilterTypes = computed(() =>
|
const customFilterTypes = computed(() =>
|
||||||
buildAttributesFilterTypes(contactAttributes.value, getOperatorTypes)
|
buildAttributesFilterTypes(
|
||||||
|
contactAttributes.value,
|
||||||
|
getOperatorTypes,
|
||||||
|
'contact'
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -67,8 +74,8 @@ export function useContactFilterContext() {
|
|||||||
*/
|
*/
|
||||||
const filterTypes = computed(() => [
|
const filterTypes = computed(() => [
|
||||||
{
|
{
|
||||||
attributeKey: 'name',
|
attributeKey: CONTACT_ATTRIBUTES.NAME,
|
||||||
value: 'name',
|
value: CONTACT_ATTRIBUTES.NAME,
|
||||||
attributeName: t('CONTACTS_LAYOUT.FILTER.NAME'),
|
attributeName: t('CONTACTS_LAYOUT.FILTER.NAME'),
|
||||||
label: t('CONTACTS_LAYOUT.FILTER.NAME'),
|
label: t('CONTACTS_LAYOUT.FILTER.NAME'),
|
||||||
inputType: 'plainText',
|
inputType: 'plainText',
|
||||||
@@ -77,8 +84,8 @@ export function useContactFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'email',
|
attributeKey: CONTACT_ATTRIBUTES.EMAIL,
|
||||||
value: 'email',
|
value: CONTACT_ATTRIBUTES.EMAIL,
|
||||||
attributeName: t('CONTACTS_LAYOUT.FILTER.EMAIL'),
|
attributeName: t('CONTACTS_LAYOUT.FILTER.EMAIL'),
|
||||||
label: t('CONTACTS_LAYOUT.FILTER.EMAIL'),
|
label: t('CONTACTS_LAYOUT.FILTER.EMAIL'),
|
||||||
inputType: 'plainText',
|
inputType: 'plainText',
|
||||||
@@ -87,8 +94,8 @@ export function useContactFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'phone_number',
|
attributeKey: CONTACT_ATTRIBUTES.PHONE_NUMBER,
|
||||||
value: 'phone_number',
|
value: CONTACT_ATTRIBUTES.PHONE_NUMBER,
|
||||||
attributeName: t('CONTACTS_LAYOUT.FILTER.PHONE_NUMBER'),
|
attributeName: t('CONTACTS_LAYOUT.FILTER.PHONE_NUMBER'),
|
||||||
label: t('CONTACTS_LAYOUT.FILTER.PHONE_NUMBER'),
|
label: t('CONTACTS_LAYOUT.FILTER.PHONE_NUMBER'),
|
||||||
inputType: 'plainText',
|
inputType: 'plainText',
|
||||||
@@ -97,8 +104,8 @@ export function useContactFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'identifier',
|
attributeKey: CONTACT_ATTRIBUTES.IDENTIFIER,
|
||||||
value: 'identifier',
|
value: CONTACT_ATTRIBUTES.IDENTIFIER,
|
||||||
attributeName: t('CONTACTS_LAYOUT.FILTER.IDENTIFIER'),
|
attributeName: t('CONTACTS_LAYOUT.FILTER.IDENTIFIER'),
|
||||||
label: t('CONTACTS_LAYOUT.FILTER.IDENTIFIER'),
|
label: t('CONTACTS_LAYOUT.FILTER.IDENTIFIER'),
|
||||||
inputType: 'plainText',
|
inputType: 'plainText',
|
||||||
@@ -107,8 +114,8 @@ export function useContactFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'country_code',
|
attributeKey: CONTACT_ATTRIBUTES.COUNTRY_CODE,
|
||||||
value: 'country_code',
|
value: CONTACT_ATTRIBUTES.COUNTRY_CODE,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.COUNTRY_NAME'),
|
attributeName: t('FILTER.ATTRIBUTES.COUNTRY_NAME'),
|
||||||
label: t('FILTER.ATTRIBUTES.COUNTRY_NAME'),
|
label: t('FILTER.ATTRIBUTES.COUNTRY_NAME'),
|
||||||
inputType: 'searchSelect',
|
inputType: 'searchSelect',
|
||||||
@@ -118,8 +125,8 @@ export function useContactFilterContext() {
|
|||||||
attributeModel: 'additional',
|
attributeModel: 'additional',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'city',
|
attributeKey: CONTACT_ATTRIBUTES.CITY,
|
||||||
value: 'city',
|
value: CONTACT_ATTRIBUTES.CITY,
|
||||||
attributeName: t('CONTACTS_LAYOUT.FILTER.CITY'),
|
attributeName: t('CONTACTS_LAYOUT.FILTER.CITY'),
|
||||||
label: t('CONTACTS_LAYOUT.FILTER.CITY'),
|
label: t('CONTACTS_LAYOUT.FILTER.CITY'),
|
||||||
inputType: 'plainText',
|
inputType: 'plainText',
|
||||||
@@ -128,8 +135,8 @@ export function useContactFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'created_at',
|
attributeKey: CONTACT_ATTRIBUTES.CREATED_AT,
|
||||||
value: 'created_at',
|
value: CONTACT_ATTRIBUTES.CREATED_AT,
|
||||||
attributeName: t('CONTACTS_LAYOUT.FILTER.CREATED_AT'),
|
attributeName: t('CONTACTS_LAYOUT.FILTER.CREATED_AT'),
|
||||||
label: t('CONTACTS_LAYOUT.FILTER.CREATED_AT'),
|
label: t('CONTACTS_LAYOUT.FILTER.CREATED_AT'),
|
||||||
inputType: 'date',
|
inputType: 'date',
|
||||||
@@ -138,8 +145,8 @@ export function useContactFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'last_activity_at',
|
attributeKey: CONTACT_ATTRIBUTES.LAST_ACTIVITY_AT,
|
||||||
value: 'last_activity_at',
|
value: CONTACT_ATTRIBUTES.LAST_ACTIVITY_AT,
|
||||||
attributeName: t('CONTACTS_LAYOUT.FILTER.LAST_ACTIVITY'),
|
attributeName: t('CONTACTS_LAYOUT.FILTER.LAST_ACTIVITY'),
|
||||||
label: t('CONTACTS_LAYOUT.FILTER.LAST_ACTIVITY'),
|
label: t('CONTACTS_LAYOUT.FILTER.LAST_ACTIVITY'),
|
||||||
inputType: 'date',
|
inputType: 'date',
|
||||||
@@ -148,8 +155,8 @@ export function useContactFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'referer',
|
attributeKey: CONTACT_ATTRIBUTES.REFERER,
|
||||||
value: 'referer',
|
value: CONTACT_ATTRIBUTES.REFERER,
|
||||||
attributeName: t('CONTACTS_LAYOUT.FILTER.REFERER_LINK'),
|
attributeName: t('CONTACTS_LAYOUT.FILTER.REFERER_LINK'),
|
||||||
label: t('CONTACTS_LAYOUT.FILTER.REFERER_LINK'),
|
label: t('CONTACTS_LAYOUT.FILTER.REFERER_LINK'),
|
||||||
inputType: 'plainText',
|
inputType: 'plainText',
|
||||||
@@ -158,8 +165,8 @@ export function useContactFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'blocked',
|
attributeKey: CONTACT_ATTRIBUTES.BLOCKED,
|
||||||
value: 'blocked',
|
value: CONTACT_ATTRIBUTES.BLOCKED,
|
||||||
attributeName: t('CONTACTS_LAYOUT.FILTER.BLOCKED'),
|
attributeName: t('CONTACTS_LAYOUT.FILTER.BLOCKED'),
|
||||||
label: t('CONTACTS_LAYOUT.FILTER.BLOCKED'),
|
label: t('CONTACTS_LAYOUT.FILTER.BLOCKED'),
|
||||||
inputType: 'searchSelect',
|
inputType: 'searchSelect',
|
||||||
|
|||||||
@@ -1,3 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* Standard attributes of the conversation model
|
||||||
|
*/
|
||||||
|
export const CONVERSATION_ATTRIBUTES = {
|
||||||
|
STATUS: 'status',
|
||||||
|
PRIORITY: 'priority',
|
||||||
|
ASSIGNEE_ID: 'assignee_id',
|
||||||
|
INBOX_ID: 'inbox_id',
|
||||||
|
TEAM_ID: 'team_id',
|
||||||
|
DISPLAY_ID: 'display_id',
|
||||||
|
CAMPAIGN_ID: 'campaign_id',
|
||||||
|
LABELS: 'labels',
|
||||||
|
BROWSER_LANGUAGE: 'browser_language',
|
||||||
|
COUNTRY_CODE: 'country_code',
|
||||||
|
REFERER: 'referer',
|
||||||
|
CREATED_AT: 'created_at',
|
||||||
|
LAST_ACTIVITY_AT: 'last_activity_at',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const CONTACT_ATTRIBUTES = {
|
||||||
|
NAME: 'name',
|
||||||
|
EMAIL: 'email',
|
||||||
|
PHONE_NUMBER: 'phone_number',
|
||||||
|
IDENTIFIER: 'identifier',
|
||||||
|
COUNTRY_CODE: 'country_code',
|
||||||
|
CITY: 'city',
|
||||||
|
CREATED_AT: 'created_at',
|
||||||
|
LAST_ACTIVITY_AT: 'last_activity_at',
|
||||||
|
REFERER: 'referer',
|
||||||
|
BLOCKED: 'blocked',
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the input type for a custom attribute based on its key
|
* Determines the input type for a custom attribute based on its key
|
||||||
* @param {string} key - The attribute display type key
|
* @param {string} key - The attribute display type key
|
||||||
@@ -20,24 +52,37 @@ export const getCustomAttributeInputType = key => {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds filter types for custom attributes
|
* Builds filter types for custom attributes
|
||||||
|
* This also removes any conflicting attributes
|
||||||
* @param {Array} attributes - The attributes array
|
* @param {Array} attributes - The attributes array
|
||||||
* @param {Function} getOperatorTypes - Function to get operator types
|
* @param {Function} getOperatorTypes - Function to get operator types
|
||||||
* @returns {Array} Array of filter types
|
* @returns {Array} Array of filter types
|
||||||
*/
|
*/
|
||||||
export const buildAttributesFilterTypes = (attributes, getOperatorTypes) => {
|
export const buildAttributesFilterTypes = (
|
||||||
return attributes.map(attr => ({
|
attributes,
|
||||||
attributeKey: attr.attributeKey,
|
getOperatorTypes,
|
||||||
value: attr.attributeKey,
|
filterModel = 'conversation'
|
||||||
attributeName: attr.attributeDisplayName,
|
) => {
|
||||||
label: attr.attributeDisplayName,
|
const standardAttributes = Object.values(
|
||||||
inputType: getCustomAttributeInputType(attr.attributeDisplayType),
|
filterModel === 'conversation'
|
||||||
filterOperators: getOperatorTypes(attr.attributeDisplayType),
|
? CONVERSATION_ATTRIBUTES
|
||||||
options:
|
: CONTACT_ATTRIBUTES
|
||||||
attr.attributeDisplayType === 'list'
|
);
|
||||||
? attr.attributeValues.map(item => ({ id: item, name: item }))
|
|
||||||
: [],
|
return attributes
|
||||||
attributeModel: 'customAttributes',
|
.filter(attr => !standardAttributes.includes(attr.attributeKey))
|
||||||
}));
|
.map(attr => ({
|
||||||
|
attributeKey: attr.attributeKey,
|
||||||
|
value: attr.attributeKey,
|
||||||
|
attributeName: attr.attributeDisplayName,
|
||||||
|
label: attr.attributeDisplayName,
|
||||||
|
inputType: getCustomAttributeInputType(attr.attributeDisplayType),
|
||||||
|
filterOperators: getOperatorTypes(attr.attributeDisplayType),
|
||||||
|
options:
|
||||||
|
attr.attributeDisplayType === 'list'
|
||||||
|
? attr.attributeValues.map(item => ({ id: item, name: item }))
|
||||||
|
: [],
|
||||||
|
attributeModel: 'customAttributes',
|
||||||
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,7 +3,10 @@ import { useI18n } from 'vue-i18n';
|
|||||||
import { useOperators } from './operators';
|
import { useOperators } from './operators';
|
||||||
import { useMapGetter } from 'dashboard/composables/store.js';
|
import { useMapGetter } from 'dashboard/composables/store.js';
|
||||||
import { useChannelIcon } from 'next/icon/provider';
|
import { useChannelIcon } from 'next/icon/provider';
|
||||||
import { buildAttributesFilterTypes } from './helper/filterHelper';
|
import {
|
||||||
|
buildAttributesFilterTypes,
|
||||||
|
CONVERSATION_ATTRIBUTES,
|
||||||
|
} from './helper/filterHelper';
|
||||||
import countries from 'shared/constants/countries.js';
|
import countries from 'shared/constants/countries.js';
|
||||||
import languages from 'dashboard/components/widgets/conversation/advancedFilterItems/languages.js';
|
import languages from 'dashboard/components/widgets/conversation/advancedFilterItems/languages.js';
|
||||||
|
|
||||||
@@ -70,7 +73,11 @@ export function useConversationFilterContext() {
|
|||||||
* @type {import('vue').ComputedRef<FilterType[]>}
|
* @type {import('vue').ComputedRef<FilterType[]>}
|
||||||
*/
|
*/
|
||||||
const customFilterTypes = computed(() =>
|
const customFilterTypes = computed(() =>
|
||||||
buildAttributesFilterTypes(conversationAttributes.value, getOperatorTypes)
|
buildAttributesFilterTypes(
|
||||||
|
conversationAttributes.value,
|
||||||
|
getOperatorTypes,
|
||||||
|
'conversation'
|
||||||
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -78,8 +85,8 @@ export function useConversationFilterContext() {
|
|||||||
*/
|
*/
|
||||||
const filterTypes = computed(() => [
|
const filterTypes = computed(() => [
|
||||||
{
|
{
|
||||||
attributeKey: 'status',
|
attributeKey: CONVERSATION_ATTRIBUTES.STATUS,
|
||||||
value: 'status',
|
value: CONVERSATION_ATTRIBUTES.STATUS,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.STATUS'),
|
attributeName: t('FILTER.ATTRIBUTES.STATUS'),
|
||||||
label: t('FILTER.ATTRIBUTES.STATUS'),
|
label: t('FILTER.ATTRIBUTES.STATUS'),
|
||||||
inputType: 'multiSelect',
|
inputType: 'multiSelect',
|
||||||
@@ -94,8 +101,24 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'assignee_id',
|
attributeKey: CONVERSATION_ATTRIBUTES.PRIORITY,
|
||||||
value: 'assignee_id',
|
value: CONVERSATION_ATTRIBUTES.PRIORITY,
|
||||||
|
attributeName: t('FILTER.ATTRIBUTES.PRIORITY'),
|
||||||
|
label: t('FILTER.ATTRIBUTES.PRIORITY'),
|
||||||
|
inputType: 'multiSelect',
|
||||||
|
options: ['low', 'medium', 'high', 'urgent'].map(id => {
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
name: t(`CONVERSATION.PRIORITY.OPTIONS.${id.toUpperCase()}`),
|
||||||
|
};
|
||||||
|
}),
|
||||||
|
dataType: 'text',
|
||||||
|
filterOperators: equalityOperators.value,
|
||||||
|
attributeModel: 'standard',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
attributeKey: CONVERSATION_ATTRIBUTES.ASSIGNEE_ID,
|
||||||
|
value: CONVERSATION_ATTRIBUTES.ASSIGNEE_ID,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.ASSIGNEE_NAME'),
|
attributeName: t('FILTER.ATTRIBUTES.ASSIGNEE_NAME'),
|
||||||
label: t('FILTER.ATTRIBUTES.ASSIGNEE_NAME'),
|
label: t('FILTER.ATTRIBUTES.ASSIGNEE_NAME'),
|
||||||
inputType: 'searchSelect',
|
inputType: 'searchSelect',
|
||||||
@@ -110,8 +133,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'inbox_id',
|
attributeKey: CONVERSATION_ATTRIBUTES.INBOX_ID,
|
||||||
value: 'inbox_id',
|
value: CONVERSATION_ATTRIBUTES.INBOX_ID,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.INBOX_NAME'),
|
attributeName: t('FILTER.ATTRIBUTES.INBOX_NAME'),
|
||||||
label: t('FILTER.ATTRIBUTES.INBOX_NAME'),
|
label: t('FILTER.ATTRIBUTES.INBOX_NAME'),
|
||||||
inputType: 'searchSelect',
|
inputType: 'searchSelect',
|
||||||
@@ -126,8 +149,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'team_id',
|
attributeKey: CONVERSATION_ATTRIBUTES.TEAM_ID,
|
||||||
value: 'team_id',
|
value: CONVERSATION_ATTRIBUTES.TEAM_ID,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.TEAM_NAME'),
|
attributeName: t('FILTER.ATTRIBUTES.TEAM_NAME'),
|
||||||
label: t('FILTER.ATTRIBUTES.TEAM_NAME'),
|
label: t('FILTER.ATTRIBUTES.TEAM_NAME'),
|
||||||
inputType: 'searchSelect',
|
inputType: 'searchSelect',
|
||||||
@@ -137,8 +160,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'display_id',
|
attributeKey: CONVERSATION_ATTRIBUTES.DISPLAY_ID,
|
||||||
value: 'display_id',
|
value: CONVERSATION_ATTRIBUTES.DISPLAY_ID,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.CONVERSATION_IDENTIFIER'),
|
attributeName: t('FILTER.ATTRIBUTES.CONVERSATION_IDENTIFIER'),
|
||||||
label: t('FILTER.ATTRIBUTES.CONVERSATION_IDENTIFIER'),
|
label: t('FILTER.ATTRIBUTES.CONVERSATION_IDENTIFIER'),
|
||||||
inputType: 'plainText',
|
inputType: 'plainText',
|
||||||
@@ -147,8 +170,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'campaign_id',
|
attributeKey: CONVERSATION_ATTRIBUTES.CAMPAIGN_ID,
|
||||||
value: 'campaign_id',
|
value: CONVERSATION_ATTRIBUTES.CAMPAIGN_ID,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.CAMPAIGN_NAME'),
|
attributeName: t('FILTER.ATTRIBUTES.CAMPAIGN_NAME'),
|
||||||
label: t('FILTER.ATTRIBUTES.CAMPAIGN_NAME'),
|
label: t('FILTER.ATTRIBUTES.CAMPAIGN_NAME'),
|
||||||
inputType: 'searchSelect',
|
inputType: 'searchSelect',
|
||||||
@@ -161,8 +184,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'labels',
|
attributeKey: CONVERSATION_ATTRIBUTES.LABELS,
|
||||||
value: 'labels',
|
value: CONVERSATION_ATTRIBUTES.LABELS,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.LABELS'),
|
attributeName: t('FILTER.ATTRIBUTES.LABELS'),
|
||||||
label: t('FILTER.ATTRIBUTES.LABELS'),
|
label: t('FILTER.ATTRIBUTES.LABELS'),
|
||||||
inputType: 'multiSelect',
|
inputType: 'multiSelect',
|
||||||
@@ -185,8 +208,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'browser_language',
|
attributeKey: CONVERSATION_ATTRIBUTES.BROWSER_LANGUAGE,
|
||||||
value: 'browser_language',
|
value: CONVERSATION_ATTRIBUTES.BROWSER_LANGUAGE,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.BROWSER_LANGUAGE'),
|
attributeName: t('FILTER.ATTRIBUTES.BROWSER_LANGUAGE'),
|
||||||
label: t('FILTER.ATTRIBUTES.BROWSER_LANGUAGE'),
|
label: t('FILTER.ATTRIBUTES.BROWSER_LANGUAGE'),
|
||||||
inputType: 'searchSelect',
|
inputType: 'searchSelect',
|
||||||
@@ -196,8 +219,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'additional',
|
attributeModel: 'additional',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'country_code',
|
attributeKey: CONVERSATION_ATTRIBUTES.COUNTRY_CODE,
|
||||||
value: 'country_code',
|
value: CONVERSATION_ATTRIBUTES.COUNTRY_CODE,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.COUNTRY_NAME'),
|
attributeName: t('FILTER.ATTRIBUTES.COUNTRY_NAME'),
|
||||||
label: t('FILTER.ATTRIBUTES.COUNTRY_NAME'),
|
label: t('FILTER.ATTRIBUTES.COUNTRY_NAME'),
|
||||||
inputType: 'searchSelect',
|
inputType: 'searchSelect',
|
||||||
@@ -207,8 +230,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'additional',
|
attributeModel: 'additional',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'referer',
|
attributeKey: CONVERSATION_ATTRIBUTES.REFERER,
|
||||||
value: 'referer',
|
value: CONVERSATION_ATTRIBUTES.REFERER,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.REFERER_LINK'),
|
attributeName: t('FILTER.ATTRIBUTES.REFERER_LINK'),
|
||||||
label: t('FILTER.ATTRIBUTES.REFERER_LINK'),
|
label: t('FILTER.ATTRIBUTES.REFERER_LINK'),
|
||||||
inputType: 'plainText',
|
inputType: 'plainText',
|
||||||
@@ -217,8 +240,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'additional',
|
attributeModel: 'additional',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'created_at',
|
attributeKey: CONVERSATION_ATTRIBUTES.CREATED_AT,
|
||||||
value: 'created_at',
|
value: CONVERSATION_ATTRIBUTES.CREATED_AT,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.CREATED_AT'),
|
attributeName: t('FILTER.ATTRIBUTES.CREATED_AT'),
|
||||||
label: t('FILTER.ATTRIBUTES.CREATED_AT'),
|
label: t('FILTER.ATTRIBUTES.CREATED_AT'),
|
||||||
inputType: 'date',
|
inputType: 'date',
|
||||||
@@ -227,8 +250,8 @@ export function useConversationFilterContext() {
|
|||||||
attributeModel: 'standard',
|
attributeModel: 'standard',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
attributeKey: 'last_activity_at',
|
attributeKey: CONVERSATION_ATTRIBUTES.LAST_ACTIVITY_AT,
|
||||||
value: 'last_activity_at',
|
value: CONVERSATION_ATTRIBUTES.LAST_ACTIVITY_AT,
|
||||||
attributeName: t('FILTER.ATTRIBUTES.LAST_ACTIVITY'),
|
attributeName: t('FILTER.ATTRIBUTES.LAST_ACTIVITY'),
|
||||||
label: t('FILTER.ATTRIBUTES.LAST_ACTIVITY'),
|
label: t('FILTER.ATTRIBUTES.LAST_ACTIVITY'),
|
||||||
inputType: 'date',
|
inputType: 'date',
|
||||||
|
|||||||
@@ -353,10 +353,11 @@ function setFiltersFromUISettings() {
|
|||||||
const { conversations_filter_by: filterBy = {} } = uiSettings.value;
|
const { conversations_filter_by: filterBy = {} } = uiSettings.value;
|
||||||
const { status, order_by: orderBy } = filterBy;
|
const { status, order_by: orderBy } = filterBy;
|
||||||
activeStatus.value = status || wootConstants.STATUS_TYPE.OPEN;
|
activeStatus.value = status || wootConstants.STATUS_TYPE.OPEN;
|
||||||
activeSortBy.value =
|
activeSortBy.value = Object.values(wootConstants.SORT_BY_TYPE).includes(
|
||||||
Object.keys(wootConstants.SORT_BY_TYPE).find(
|
orderBy
|
||||||
sortField => sortField === orderBy
|
)
|
||||||
) || wootConstants.SORT_BY_TYPE.LAST_ACTIVITY_AT_DESC;
|
? orderBy
|
||||||
|
: wootConstants.SORT_BY_TYPE.LAST_ACTIVITY_AT_DESC;
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitConversationLoaded() {
|
function emitConversationLoaded() {
|
||||||
|
|||||||
@@ -0,0 +1,79 @@
|
|||||||
|
<script setup>
|
||||||
|
import { computed, onMounted } from 'vue';
|
||||||
|
import { useStore } from 'vuex';
|
||||||
|
import { useAccount } from 'dashboard/composables/useAccount';
|
||||||
|
import { differenceInDays } from 'date-fns';
|
||||||
|
import { useRoute } from 'vue-router';
|
||||||
|
|
||||||
|
const ALWAYS_ON_ROUTES = [
|
||||||
|
'agent_list',
|
||||||
|
'settings_inbox_list',
|
||||||
|
'billing_settings_index',
|
||||||
|
];
|
||||||
|
|
||||||
|
const { accountId } = useAccount();
|
||||||
|
const store = useStore();
|
||||||
|
const route = useRoute();
|
||||||
|
const routeName = computed(() => {
|
||||||
|
return route.name || '';
|
||||||
|
});
|
||||||
|
const isOnChatwootCloud = computed(
|
||||||
|
() => store.getters['globalConfig/isOnChatwootCloud']
|
||||||
|
);
|
||||||
|
const account = computed(() =>
|
||||||
|
store.getters['accounts/getAccount'](accountId.value)
|
||||||
|
);
|
||||||
|
|
||||||
|
const isTrialAccount = computed(() => {
|
||||||
|
if (!account.value) return false;
|
||||||
|
|
||||||
|
const createdAt = new Date(account.value.created_at);
|
||||||
|
const diffDays = differenceInDays(new Date(), createdAt);
|
||||||
|
|
||||||
|
return diffDays <= 15;
|
||||||
|
});
|
||||||
|
|
||||||
|
const testLimit = ({ allowed, consumed }) => {
|
||||||
|
return consumed > allowed;
|
||||||
|
};
|
||||||
|
|
||||||
|
const isLimitExceeded = computed(() => {
|
||||||
|
if (ALWAYS_ON_ROUTES.includes(routeName.value)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!account.value) return false;
|
||||||
|
|
||||||
|
const { limits } = account.value;
|
||||||
|
if (!limits) return false;
|
||||||
|
|
||||||
|
const { conversation, non_web_inboxes: nonWebInboxes } = limits;
|
||||||
|
return testLimit(conversation) || testLimit(nonWebInboxes);
|
||||||
|
});
|
||||||
|
|
||||||
|
const shouldShowBanner = computed(() => {
|
||||||
|
if (!isOnChatwootCloud.value) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isTrialAccount.value) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isLimitExceeded.value;
|
||||||
|
});
|
||||||
|
|
||||||
|
const fetchLimits = () => store.dispatch('accounts/limits');
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
if (isOnChatwootCloud.value) {
|
||||||
|
fetchLimits();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div v-if="shouldShowBanner">Limits exceeded</div>
|
||||||
|
|
||||||
|
<slot v-else />
|
||||||
|
</template>
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
import { ref, computed, onMounted, watchEffect } from 'vue';
|
||||||
|
import { useStore } from 'dashboard/composables/store';
|
||||||
import Copilot from 'dashboard/components-next/copilot/Copilot.vue';
|
import Copilot from 'dashboard/components-next/copilot/Copilot.vue';
|
||||||
import ConversationAPI from 'dashboard/api/inbox/conversation';
|
import ConversationAPI from 'dashboard/api/inbox/conversation';
|
||||||
import { useMapGetter } from 'dashboard/composables/store';
|
import { useMapGetter } from 'dashboard/composables/store';
|
||||||
import { ref } from 'vue';
|
import { useUISettings } from 'dashboard/composables/useUISettings';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
conversationId: {
|
conversationId: {
|
||||||
type: [Number, String],
|
type: [Number, String],
|
||||||
@@ -13,10 +16,44 @@ const props = defineProps({
|
|||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const currentUser = useMapGetter('getCurrentUser');
|
|
||||||
const messages = ref([]);
|
|
||||||
|
|
||||||
|
const store = useStore();
|
||||||
|
const currentUser = useMapGetter('getCurrentUser');
|
||||||
|
const assistants = useMapGetter('captainAssistants/getRecords');
|
||||||
|
const inboxAssistant = useMapGetter('getCopilotAssistant');
|
||||||
|
const { uiSettings, updateUISettings } = useUISettings();
|
||||||
|
|
||||||
|
const messages = ref([]);
|
||||||
const isCaptainTyping = ref(false);
|
const isCaptainTyping = ref(false);
|
||||||
|
const selectedAssistantId = ref(null);
|
||||||
|
|
||||||
|
const activeAssistant = computed(() => {
|
||||||
|
const preferredId = uiSettings.value.preferred_captain_assistant_id;
|
||||||
|
|
||||||
|
// If the user has selected a specific assistant, it takes first preference for Copilot.
|
||||||
|
if (preferredId) {
|
||||||
|
const preferredAssistant = assistants.value.find(a => a.id === preferredId);
|
||||||
|
// Return the preferred assistant if found, otherwise continue to next cases
|
||||||
|
if (preferredAssistant) return preferredAssistant;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the above is not available, the assistant connected to the inbox takes preference.
|
||||||
|
if (inboxAssistant.value) {
|
||||||
|
const inboxMatchedAssistant = assistants.value.find(
|
||||||
|
a => a.id === inboxAssistant.value.id
|
||||||
|
);
|
||||||
|
if (inboxMatchedAssistant) return inboxMatchedAssistant;
|
||||||
|
}
|
||||||
|
// If neither of the above is available, the first assistant in the account takes preference.
|
||||||
|
return assistants.value[0];
|
||||||
|
});
|
||||||
|
|
||||||
|
const setAssistant = async assistant => {
|
||||||
|
selectedAssistantId.value = assistant.id;
|
||||||
|
await updateUISettings({
|
||||||
|
preferred_captain_assistant_id: assistant.id,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
const handleReset = () => {
|
const handleReset = () => {
|
||||||
messages.value = [];
|
messages.value = [];
|
||||||
@@ -42,7 +79,7 @@ const sendMessage = async message => {
|
|||||||
}))
|
}))
|
||||||
.slice(0, -1),
|
.slice(0, -1),
|
||||||
message,
|
message,
|
||||||
assistant_id: 16,
|
assistant_id: selectedAssistantId.value,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
messages.value.push({
|
messages.value.push({
|
||||||
@@ -57,6 +94,17 @@ const sendMessage = async message => {
|
|||||||
isCaptainTyping.value = false;
|
isCaptainTyping.value = false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
store.dispatch('captainAssistants/get');
|
||||||
|
});
|
||||||
|
|
||||||
|
watchEffect(() => {
|
||||||
|
if (props.conversationId) {
|
||||||
|
store.dispatch('getInboxCaptainAssistantById', props.conversationId);
|
||||||
|
selectedAssistantId.value = activeAssistant.value?.id;
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -65,6 +113,9 @@ const sendMessage = async message => {
|
|||||||
:support-agent="currentUser"
|
:support-agent="currentUser"
|
||||||
:is-captain-typing="isCaptainTyping"
|
:is-captain-typing="isCaptainTyping"
|
||||||
:conversation-inbox-type="conversationInboxType"
|
:conversation-inbox-type="conversationInboxType"
|
||||||
|
:assistants="assistants"
|
||||||
|
:active-assistant="activeAssistant"
|
||||||
|
@set-assistant="setAssistant"
|
||||||
@send-message="sendMessage"
|
@send-message="sendMessage"
|
||||||
@reset="handleReset"
|
@reset="handleReset"
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -2,11 +2,13 @@
|
|||||||
import { reactive, computed, onMounted, ref } from 'vue';
|
import { reactive, computed, onMounted, ref } from 'vue';
|
||||||
import { useVuelidate } from '@vuelidate/core';
|
import { useVuelidate } from '@vuelidate/core';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
import { useTrack } from 'dashboard/composables';
|
||||||
import { useAlert } from 'dashboard/composables';
|
import { useAlert } from 'dashboard/composables';
|
||||||
import LinearAPI from 'dashboard/api/integrations/linear';
|
import LinearAPI from 'dashboard/api/integrations/linear';
|
||||||
import validations from './validations';
|
import validations from './validations';
|
||||||
import { parseLinearAPIErrorResponse } from 'dashboard/store/utils/api';
|
import { parseLinearAPIErrorResponse } from 'dashboard/store/utils/api';
|
||||||
import SearchableDropdown from './SearchableDropdown.vue';
|
import SearchableDropdown from './SearchableDropdown.vue';
|
||||||
|
import { LINEAR_EVENTS } from 'dashboard/helper/AnalyticsHelper/events';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
conversationId: {
|
conversationId: {
|
||||||
@@ -188,6 +190,7 @@ const createIssue = async () => {
|
|||||||
const { id: issueId } = response.data;
|
const { id: issueId } = response.data;
|
||||||
await LinearAPI.link_issue(props.conversationId, issueId, props.title);
|
await LinearAPI.link_issue(props.conversationId, issueId, props.title);
|
||||||
useAlert(t('INTEGRATION_SETTINGS.LINEAR.ADD_OR_LINK.CREATE_SUCCESS'));
|
useAlert(t('INTEGRATION_SETTINGS.LINEAR.ADD_OR_LINK.CREATE_SUCCESS'));
|
||||||
|
useTrack(LINEAR_EVENTS.CREATE_ISSUE);
|
||||||
onClose();
|
onClose();
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errorMessage = parseLinearAPIErrorResponse(
|
const errorMessage = parseLinearAPIErrorResponse(
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref, computed } from 'vue';
|
import { ref, computed } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
import { useTrack } from 'dashboard/composables';
|
||||||
import { useAlert } from 'dashboard/composables';
|
import { useAlert } from 'dashboard/composables';
|
||||||
import LinearAPI from 'dashboard/api/integrations/linear';
|
import LinearAPI from 'dashboard/api/integrations/linear';
|
||||||
import FilterButton from 'dashboard/components/ui/Dropdown/DropdownButton.vue';
|
import FilterButton from 'dashboard/components/ui/Dropdown/DropdownButton.vue';
|
||||||
import FilterListDropdown from 'dashboard/components/ui/Dropdown/DropdownList.vue';
|
import FilterListDropdown from 'dashboard/components/ui/Dropdown/DropdownList.vue';
|
||||||
import { parseLinearAPIErrorResponse } from 'dashboard/store/utils/api';
|
import { parseLinearAPIErrorResponse } from 'dashboard/store/utils/api';
|
||||||
|
import { LINEAR_EVENTS } from 'dashboard/helper/AnalyticsHelper/events';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
conversationId: {
|
conversationId: {
|
||||||
@@ -85,6 +87,7 @@ const linkIssue = async () => {
|
|||||||
searchQuery.value = '';
|
searchQuery.value = '';
|
||||||
issues.value = [];
|
issues.value = [];
|
||||||
onClose();
|
onClose();
|
||||||
|
useTrack(LINEAR_EVENTS.LINK_ISSUE);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errorMessage = parseLinearAPIErrorResponse(
|
const errorMessage = parseLinearAPIErrorResponse(
|
||||||
error,
|
error,
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ import { useI18n } from 'vue-i18n';
|
|||||||
import LinearAPI from 'dashboard/api/integrations/linear';
|
import LinearAPI from 'dashboard/api/integrations/linear';
|
||||||
import CreateOrLinkIssue from './CreateOrLinkIssue.vue';
|
import CreateOrLinkIssue from './CreateOrLinkIssue.vue';
|
||||||
import Issue from './Issue.vue';
|
import Issue from './Issue.vue';
|
||||||
|
import { useTrack } from 'dashboard/composables';
|
||||||
|
import { LINEAR_EVENTS } from 'dashboard/helper/AnalyticsHelper/events';
|
||||||
import { parseLinearAPIErrorResponse } from 'dashboard/store/utils/api';
|
import { parseLinearAPIErrorResponse } from 'dashboard/store/utils/api';
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -56,6 +58,7 @@ const unlinkIssue = async linkId => {
|
|||||||
try {
|
try {
|
||||||
isUnlinking.value = true;
|
isUnlinking.value = true;
|
||||||
await LinearAPI.unlinkIssue(linkId);
|
await LinearAPI.unlinkIssue(linkId);
|
||||||
|
useTrack(LINEAR_EVENTS.UNLINK_ISSUE);
|
||||||
linkedIssue.value = null;
|
linkedIssue.value = null;
|
||||||
useAlert(t('INTEGRATION_SETTINGS.LINEAR.UNLINK.SUCCESS'));
|
useAlert(t('INTEGRATION_SETTINGS.LINEAR.UNLINK.SUCCESS'));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|||||||
@@ -124,3 +124,9 @@ export const SLA_EVENTS = Object.freeze({
|
|||||||
UPDATE: 'Updated an SLA',
|
UPDATE: 'Updated an SLA',
|
||||||
DELETED: 'Deleted an SLA',
|
DELETED: 'Deleted an SLA',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const LINEAR_EVENTS = Object.freeze({
|
||||||
|
CREATE_ISSUE: 'Created a linear issue',
|
||||||
|
LINK_ISSUE: 'Linked a linear issue',
|
||||||
|
UNLINK_ISSUE: 'Unlinked a linear issue',
|
||||||
|
});
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "أنت",
|
"YOU": "أنت",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Tu",
|
"YOU": "Tu",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Vy",
|
"YOU": "Vy",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Dig",
|
"YOU": "Dig",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
"ACTIONS": "Aktionen",
|
"ACTIONS": "Aktionen",
|
||||||
"VERIFIED": "Verifiziert",
|
"VERIFIED": "Verifiziert",
|
||||||
"VERIFICATION_PENDING": "Überprüfung ausstehend",
|
"VERIFICATION_PENDING": "Überprüfung ausstehend",
|
||||||
"AVAILABLE_CUSTOM_ROLE": "Available custom role permissions"
|
"AVAILABLE_CUSTOM_ROLE": "Verfügbare Berechtigungen der benutzerdefinierten Rolle"
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Fügen Sie Ihrem Team einen Agenten hinzu",
|
"TITLE": "Fügen Sie Ihrem Team einen Agenten hinzu",
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
},
|
},
|
||||||
"AGENT_AVAILABILITY": {
|
"AGENT_AVAILABILITY": {
|
||||||
"LABEL": "Verfügbarkeit",
|
"LABEL": "Verfügbarkeit",
|
||||||
"PLACEHOLDER": "Bitte wählen Sie den Online Status",
|
"PLACEHOLDER": "Bitte wählen Sie Ihre Verfügbarkeit aus",
|
||||||
"ERROR": "Verfügbarkeit ist erforderlich"
|
"ERROR": "Verfügbarkeit ist erforderlich"
|
||||||
},
|
},
|
||||||
"SUBMIT": "Agent bearbeiten"
|
"SUBMIT": "Agent bearbeiten"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"AUTOMATION": {
|
"AUTOMATION": {
|
||||||
"HEADER": "Automatisierung",
|
"HEADER": "Automatisierung",
|
||||||
"DESCRIPTION": "Automation can replace and streamline existing processes that require manual effort, such as adding labels and assigning conversations to the most suitable agent. This allows the team to focus on their strengths while reducing time spent on routine tasks.",
|
"DESCRIPTION": "Mittels Automatisierung können bestehende Prozesse ersetzt und rationalisiert werden, die manuellen Aufwand erfordern, z. B. das Hinzufügen von Etiketten und die Zuweisung von Gesprächen an den am besten geeigneten Agenten. So kann sich das Team auf seine Stärken konzentrieren und gleichzeitig den Zeitaufwand für Routineaufgaben reduzieren.",
|
||||||
"LEARN_MORE": "Learn more about automation",
|
"LEARN_MORE": "Learn more about automation",
|
||||||
"HEADER_BTN_TXT": "Automatisierungsregel hinzufügen",
|
"HEADER_BTN_TXT": "Automatisierungsregel hinzufügen",
|
||||||
"LOADING": "Automatisierungsregeln abrufen",
|
"LOADING": "Automatisierungsregeln abrufen",
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"LIST": {
|
"LIST": {
|
||||||
"404": "In dieser Gruppe existieren keine aktiven Gespräche."
|
"404": "In dieser Gruppe existieren keine aktiven Gespräche."
|
||||||
},
|
},
|
||||||
"FAILED_TO_SEND": "Failed to send",
|
"FAILED_TO_SEND": "Fehler beim Senden",
|
||||||
"TAB_HEADING": "Gespräche",
|
"TAB_HEADING": "Gespräche",
|
||||||
"MENTION_HEADING": "Erwähnungen",
|
"MENTION_HEADING": "Erwähnungen",
|
||||||
"UNATTENDED_HEADING": "Unbeaufsichtigt",
|
"UNATTENDED_HEADING": "Unbeaufsichtigt",
|
||||||
@@ -101,7 +101,7 @@
|
|||||||
"CONTENT": "hat eine URL geteilt"
|
"CONTENT": "hat eine URL geteilt"
|
||||||
},
|
},
|
||||||
"contact": {
|
"contact": {
|
||||||
"CONTENT": "Shared contact"
|
"CONTENT": "Geteilter Kontakt"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CHAT_SORT_BY_FILTER": {
|
"CHAT_SORT_BY_FILTER": {
|
||||||
@@ -134,6 +134,6 @@
|
|||||||
"HIDE_QUOTED_TEXT": "Zitierten Text ausblenden",
|
"HIDE_QUOTED_TEXT": "Zitierten Text ausblenden",
|
||||||
"SHOW_QUOTED_TEXT": "Zitierten Text anzeigen",
|
"SHOW_QUOTED_TEXT": "Zitierten Text anzeigen",
|
||||||
"MESSAGE_READ": "Lesen",
|
"MESSAGE_READ": "Lesen",
|
||||||
"SENDING": "Sending"
|
"SENDING": "Sende"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -266,7 +266,7 @@
|
|||||||
"ATTRIBUTE_WARNING": "Details von Kontakt <strong>{primaryContactName}</strong> wird zu <strong>{parentContactName}</strong> kopiert."
|
"ATTRIBUTE_WARNING": "Details von Kontakt <strong>{primaryContactName}</strong> wird zu <strong>{parentContactName}</strong> kopiert."
|
||||||
},
|
},
|
||||||
"SEARCH": {
|
"SEARCH": {
|
||||||
"ERROR_MESSAGE": "Something went wrong. Please try again later."
|
"ERROR_MESSAGE": "Etwas ist schiefgelaufen. Bitte später erneut versuchen."
|
||||||
},
|
},
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"SUBMIT": " Kontakte zusammenführen",
|
"SUBMIT": " Kontakte zusammenführen",
|
||||||
@@ -284,36 +284,36 @@
|
|||||||
"CONTACTS_LAYOUT": {
|
"CONTACTS_LAYOUT": {
|
||||||
"HEADER": {
|
"HEADER": {
|
||||||
"TITLE": "Kontakte",
|
"TITLE": "Kontakte",
|
||||||
"SEARCH_TITLE": "Search contacts",
|
"SEARCH_TITLE": "Kontakte suchen",
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "Suchen...",
|
||||||
"MESSAGE_BUTTON": "Nachricht",
|
"MESSAGE_BUTTON": "Nachricht",
|
||||||
"SEND_MESSAGE": "Nachricht senden",
|
"SEND_MESSAGE": "Nachricht senden",
|
||||||
"BLOCK_CONTACT": "Block contact",
|
"BLOCK_CONTACT": "Kontakt blockieren",
|
||||||
"UNBLOCK_CONTACT": "Unblock contact",
|
"UNBLOCK_CONTACT": "Kontakt entsperren",
|
||||||
"BREADCRUMB": {
|
"BREADCRUMB": {
|
||||||
"CONTACTS": "Kontakte"
|
"CONTACTS": "Kontakte"
|
||||||
},
|
},
|
||||||
"ACTIONS": {
|
"ACTIONS": {
|
||||||
"CONTACT_CREATION": {
|
"CONTACT_CREATION": {
|
||||||
"ADD_CONTACT": "Add contact",
|
"ADD_CONTACT": "Kontakt hinzufügen",
|
||||||
"EXPORT_CONTACT": "Export contacts",
|
"EXPORT_CONTACT": "Kontakte exportieren",
|
||||||
"IMPORT_CONTACT": "Import contacts",
|
"IMPORT_CONTACT": "Kontakte importieren",
|
||||||
"SAVE_CONTACT": "Save contact",
|
"SAVE_CONTACT": "Kontakt speichern",
|
||||||
"EMAIL_ADDRESS_DUPLICATE": "Diese E-Mail-Adresse wird bereits für einen anderen Kontakt verwendet.",
|
"EMAIL_ADDRESS_DUPLICATE": "Diese E-Mail-Adresse wird bereits für einen anderen Kontakt verwendet.",
|
||||||
"PHONE_NUMBER_DUPLICATE": "Diese Telefonnummer wird für einen anderen Kontakt verwendet.",
|
"PHONE_NUMBER_DUPLICATE": "Diese Telefonnummer wird für einen anderen Kontakt verwendet.",
|
||||||
"SUCCESS_MESSAGE": "Kontakt erfolgreich gespeichert",
|
"SUCCESS_MESSAGE": "Kontakt erfolgreich gespeichert",
|
||||||
"ERROR_MESSAGE": "Unable to save contact. Please try again later."
|
"ERROR_MESSAGE": "Kontakt konnte nicht gespeichert werden. Bitte versuchen Sie es später erneut."
|
||||||
},
|
},
|
||||||
"BLOCK_SUCCESS_MESSAGE": "This contact is blocked successfully",
|
"BLOCK_SUCCESS_MESSAGE": "Dieser Kontakt wurde erfolgreich blockiert",
|
||||||
"BLOCK_ERROR_MESSAGE": "Unable to block contact. Please try again later.",
|
"BLOCK_ERROR_MESSAGE": "Kontakt konnte nicht blockiert werden. Bitte versuchen Sie es später erneut.",
|
||||||
"UNBLOCK_SUCCESS_MESSAGE": "Dieser Kontakt wurde erfolgreich entsperrt",
|
"UNBLOCK_SUCCESS_MESSAGE": "Dieser Kontakt wurde erfolgreich entsperrt",
|
||||||
"UNBLOCK_ERROR_MESSAGE": "Unable to unblock contact. Please try again later.",
|
"UNBLOCK_ERROR_MESSAGE": "Kontakt konnte nicht entsperrt werden. Bitte versuchen Sie es später erneut.",
|
||||||
"IMPORT_CONTACT": {
|
"IMPORT_CONTACT": {
|
||||||
"TITLE": "Import contacts",
|
"TITLE": "Kontakte importieren",
|
||||||
"DESCRIPTION": "Kontakte über CSV-Datei importieren.",
|
"DESCRIPTION": "Kontakte über CSV-Datei importieren.",
|
||||||
"DOWNLOAD_LABEL": "Ein CSV-Beispiel herunterladen.",
|
"DOWNLOAD_LABEL": "Ein CSV-Beispiel herunterladen.",
|
||||||
"LABEL": "CSV-Datei:",
|
"LABEL": "CSV-Datei:",
|
||||||
"CHOOSE_FILE": "Choose file",
|
"CHOOSE_FILE": "Datei auswählen",
|
||||||
"CHANGE": "Ändern",
|
"CHANGE": "Ändern",
|
||||||
"CANCEL": "Stornieren",
|
"CANCEL": "Stornieren",
|
||||||
"IMPORT": "Importieren",
|
"IMPORT": "Importieren",
|
||||||
@@ -321,8 +321,8 @@
|
|||||||
"ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut"
|
"ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut"
|
||||||
},
|
},
|
||||||
"EXPORT_CONTACT": {
|
"EXPORT_CONTACT": {
|
||||||
"TITLE": "Export contacts",
|
"TITLE": "Kontakte exportieren",
|
||||||
"DESCRIPTION": "Quickly export a csv file with comprehensive details of your contacts",
|
"DESCRIPTION": "Exportieren Sie schnell eine CSV-Datei mit umfassenden Daten Ihrer Kontakte",
|
||||||
"CONFIRM": "Exportieren",
|
"CONFIRM": "Exportieren",
|
||||||
"SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
|
"SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
|
||||||
"ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut"
|
"ERROR_MESSAGE": "Es ist ein Fehler aufgetreten, bitte versuchen Sie es erneut"
|
||||||
@@ -341,10 +341,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ORDER": {
|
"ORDER": {
|
||||||
"LABEL": "Ordering",
|
"LABEL": "Bestellen",
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"ASCENDING": "Ascending",
|
"ASCENDING": "Aufsteigend",
|
||||||
"DESCENDING": "Descending"
|
"DESCENDING": "Absteigend"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"FILTERS": {
|
"FILTERS": {
|
||||||
@@ -352,24 +352,24 @@
|
|||||||
"TITLE": "Möchten Sie diesen Filter speichern?",
|
"TITLE": "Möchten Sie diesen Filter speichern?",
|
||||||
"CONFIRM": "Filter speichern",
|
"CONFIRM": "Filter speichern",
|
||||||
"LABEL": "Name",
|
"LABEL": "Name",
|
||||||
"PLACEHOLDER": "Enter the name of the filter",
|
"PLACEHOLDER": "Geben Sie einen Namen für diesen Filter ein",
|
||||||
"ERROR": "Enter a valid name",
|
"ERROR": "Gib einen gültigen Namen ein",
|
||||||
"SUCCESS_MESSAGE": "Filter saved successfully",
|
"SUCCESS_MESSAGE": "Filter erfolgreich gespeichert",
|
||||||
"ERROR_MESSAGE": "Unable to save filter. Please try again later."
|
"ERROR_MESSAGE": "Filter konnte nicht gespeichert werden. Bitte versuchen Sie es später erneut."
|
||||||
},
|
},
|
||||||
"DELETE_SEGMENT": {
|
"DELETE_SEGMENT": {
|
||||||
"TITLE": "Löschung bestätigen",
|
"TITLE": "Löschung bestätigen",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this filter?",
|
"DESCRIPTION": "Möchten Sie diesen Filter wirklich löschen?",
|
||||||
"CONFIRM": "Ja, löschen",
|
"CONFIRM": "Ja, löschen",
|
||||||
"CANCEL": "Nein, abbrechen",
|
"CANCEL": "Nein, abbrechen",
|
||||||
"SUCCESS_MESSAGE": "Filter deleted successfully",
|
"SUCCESS_MESSAGE": "Filter erfolgreich gelöscht",
|
||||||
"ERROR_MESSAGE": "Unable to delete filter. Please try again later."
|
"ERROR_MESSAGE": "Filter konnte nicht gelöscht werden. Bitte versuchen Sie es später erneut."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PAGINATION_FOOTER": {
|
"PAGINATION_FOOTER": {
|
||||||
"SHOWING": "Showing {startItem} - {endItem} of {totalItems} contacts"
|
"SHOWING": "Zeige {startItem} - {endItem} von {totalItems} Kontakten"
|
||||||
},
|
},
|
||||||
"FILTER": {
|
"FILTER": {
|
||||||
"NAME": "Name",
|
"NAME": "Name",
|
||||||
@@ -386,87 +386,87 @@
|
|||||||
"BLOCKED_FALSE": "Nein",
|
"BLOCKED_FALSE": "Nein",
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CLEAR_FILTERS": "Filter zurücksetzen",
|
"CLEAR_FILTERS": "Filter zurücksetzen",
|
||||||
"UPDATE_SEGMENT": "Update segment",
|
"UPDATE_SEGMENT": "Segment aktualisieren",
|
||||||
"APPLY_FILTERS": "Filter übernehmen",
|
"APPLY_FILTERS": "Filter übernehmen",
|
||||||
"ADD_FILTER": "Filter hinzufügen"
|
"ADD_FILTER": "Filter hinzufügen"
|
||||||
},
|
},
|
||||||
"TITLE": "Kontakte filtern",
|
"TITLE": "Kontakte filtern",
|
||||||
"EDIT_SEGMENT": "Segment bearbeiten",
|
"EDIT_SEGMENT": "Segment bearbeiten",
|
||||||
"SEGMENT": {
|
"SEGMENT": {
|
||||||
"LABEL": "Segment name",
|
"LABEL": "Segmentname",
|
||||||
"INPUT_PLACEHOLDER": "Enter the name of the segment"
|
"INPUT_PLACEHOLDER": "Geben Sie den Namen des Segments ein"
|
||||||
},
|
},
|
||||||
"ACTIVE_FILTERS": {
|
"ACTIVE_FILTERS": {
|
||||||
"MORE_FILTERS": "+ {count} more filters",
|
"MORE_FILTERS": "+ {count} weitere Filter",
|
||||||
"CLEAR_FILTERS": "Filter zurücksetzen"
|
"CLEAR_FILTERS": "Filter zurücksetzen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CARD": {
|
"CARD": {
|
||||||
"OF": "of",
|
"OF": "von",
|
||||||
"VIEW_DETAILS": "Details anzeigen",
|
"VIEW_DETAILS": "Details anzeigen",
|
||||||
"EDIT_DETAILS_FORM": {
|
"EDIT_DETAILS_FORM": {
|
||||||
"TITLE": "Kontaktdetails bearbeiten",
|
"TITLE": "Kontaktdetails bearbeiten",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"FIRST_NAME": {
|
"FIRST_NAME": {
|
||||||
"PLACEHOLDER": "Enter the first name"
|
"PLACEHOLDER": "Vorname eingeben"
|
||||||
},
|
},
|
||||||
"LAST_NAME": {
|
"LAST_NAME": {
|
||||||
"PLACEHOLDER": "Enter the last name"
|
"PLACEHOLDER": "Nachname eingeben"
|
||||||
},
|
},
|
||||||
"EMAIL_ADDRESS": {
|
"EMAIL_ADDRESS": {
|
||||||
"PLACEHOLDER": "Enter the email address",
|
"PLACEHOLDER": "E-Mail-Adresse eingeben",
|
||||||
"DUPLICATE": "Diese E-Mail-Adresse wird bereits für einen anderen Kontakt verwendet."
|
"DUPLICATE": "Diese E-Mail-Adresse wird bereits für einen anderen Kontakt verwendet."
|
||||||
},
|
},
|
||||||
"PHONE_NUMBER": {
|
"PHONE_NUMBER": {
|
||||||
"PLACEHOLDER": "Enter the phone number",
|
"PLACEHOLDER": "Telefonnummer eingeben",
|
||||||
"DUPLICATE": "Diese Telefonnummer wird für einen anderen Kontakt verwendet."
|
"DUPLICATE": "Diese Telefonnummer wird für einen anderen Kontakt verwendet."
|
||||||
},
|
},
|
||||||
"CITY": {
|
"CITY": {
|
||||||
"PLACEHOLDER": "Geben Sie den Ortsnamen ein"
|
"PLACEHOLDER": "Geben Sie den Ortsnamen ein"
|
||||||
},
|
},
|
||||||
"COUNTRY": {
|
"COUNTRY": {
|
||||||
"PLACEHOLDER": "Select country"
|
"PLACEHOLDER": "Land auswählen"
|
||||||
},
|
},
|
||||||
"BIO": {
|
"BIO": {
|
||||||
"PLACEHOLDER": "Enter the bio"
|
"PLACEHOLDER": "Biografie eingeben"
|
||||||
},
|
},
|
||||||
"COMPANY_NAME": {
|
"COMPANY_NAME": {
|
||||||
"PLACEHOLDER": "Firmenname eingeben"
|
"PLACEHOLDER": "Firmenname eingeben"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"UPDATE_BUTTON": "Update contact",
|
"UPDATE_BUTTON": "Kontakt aktualisieren",
|
||||||
"SUCCESS_MESSAGE": "Contact updated successfully",
|
"SUCCESS_MESSAGE": "Kontakt erfolgreich aktualisiert",
|
||||||
"ERROR_MESSAGE": "Unable to update contact. Please try again later."
|
"ERROR_MESSAGE": "Kontakt konnte nicht aktualisiert werden. Bitte versuche es später erneut."
|
||||||
},
|
},
|
||||||
"SOCIAL_MEDIA": {
|
"SOCIAL_MEDIA": {
|
||||||
"TITLE": "Edit social links",
|
"TITLE": "Social-Media Links bearbeiten",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"FACEBOOK": {
|
"FACEBOOK": {
|
||||||
"PLACEHOLDER": "Add Facebook"
|
"PLACEHOLDER": "Facebook hinzufügen"
|
||||||
},
|
},
|
||||||
"GITHUB": {
|
"GITHUB": {
|
||||||
"PLACEHOLDER": "Add Github"
|
"PLACEHOLDER": "Github hinzufügen"
|
||||||
},
|
},
|
||||||
"INSTAGRAM": {
|
"INSTAGRAM": {
|
||||||
"PLACEHOLDER": "Add Instagram"
|
"PLACEHOLDER": "Instagram hinzufügen"
|
||||||
},
|
},
|
||||||
"LINKEDIN": {
|
"LINKEDIN": {
|
||||||
"PLACEHOLDER": "Add LinkedIn"
|
"PLACEHOLDER": "LinkedIn hinzufügen"
|
||||||
},
|
},
|
||||||
"TWITTER": {
|
"TWITTER": {
|
||||||
"PLACEHOLDER": "Add Twitter"
|
"PLACEHOLDER": "Twitter hinzufügen"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DETAILS": {
|
"DETAILS": {
|
||||||
"CREATED_AT": "Created {date}",
|
"CREATED_AT": "Erstellt am {date}",
|
||||||
"LAST_ACTIVITY": "Last active {date}",
|
"LAST_ACTIVITY": "Zuletzt aktiv {date}",
|
||||||
"DELETE_CONTACT_DESCRIPTION": "Permanently delete this contact. This action is irreversible",
|
"DELETE_CONTACT_DESCRIPTION": "Diesen Kontakt dauerhaft löschen. Diese Aktion kann nicht rückgängig gemacht werden",
|
||||||
"DELETE_CONTACT": "Kontakt löschen",
|
"DELETE_CONTACT": "Kontakt löschen",
|
||||||
"DELETE_DIALOG": {
|
"DELETE_DIALOG": {
|
||||||
"TITLE": "Löschung bestätigen",
|
"TITLE": "Löschung bestätigen",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this {contactName} contact?",
|
"DESCRIPTION": "Sind Sie sicher, dass Sie den Kontakt {contactName} löschen möchten?",
|
||||||
"CONFIRM": "Ja, löschen",
|
"CONFIRM": "Ja, löschen",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Kontakt erfolgreich gelöscht",
|
"SUCCESS_MESSAGE": "Kontakt erfolgreich gelöscht",
|
||||||
@@ -475,29 +475,29 @@
|
|||||||
},
|
},
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"UPLOAD": {
|
"UPLOAD": {
|
||||||
"ERROR_MESSAGE": "Could not upload avatar. Please try again later.",
|
"ERROR_MESSAGE": "Avatar konnte nicht hochgeladen werden. Bitte versuche es später erneut.",
|
||||||
"SUCCESS_MESSAGE": "Avatar uploaded successfully"
|
"SUCCESS_MESSAGE": "Avatar erfolgreich hochgeladen"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"SUCCESS_MESSAGE": "Avatar erfolgreich gelöscht",
|
"SUCCESS_MESSAGE": "Avatar erfolgreich gelöscht",
|
||||||
"ERROR_MESSAGE": "Could not delete avatar. Please try again later."
|
"ERROR_MESSAGE": "Avatar konnte nicht gelöscht werden. Bitte versuche es später erneut."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"SIDEBAR": {
|
"SIDEBAR": {
|
||||||
"TABS": {
|
"TABS": {
|
||||||
"ATTRIBUTES": "Attribute",
|
"ATTRIBUTES": "Attribute",
|
||||||
"HISTORY": "History",
|
"HISTORY": "Verlauf",
|
||||||
"NOTES": "Notizen",
|
"NOTES": "Notizen",
|
||||||
"MERGE": "Merge"
|
"MERGE": "Zusammenführen"
|
||||||
},
|
},
|
||||||
"HISTORY": {
|
"HISTORY": {
|
||||||
"EMPTY_STATE": "Es sind keine vorherigen Gespräche mit diesem Kontakt verbunden"
|
"EMPTY_STATE": "Es sind keine vorherigen Gespräche mit diesem Kontakt verbunden"
|
||||||
},
|
},
|
||||||
"ATTRIBUTES": {
|
"ATTRIBUTES": {
|
||||||
"SEARCH_PLACEHOLDER": "Search for attributes",
|
"SEARCH_PLACEHOLDER": "Nach Attributen suchen",
|
||||||
"UNUSED_ATTRIBUTES": "{count} Used attribute | {count} Unused attributes",
|
"UNUSED_ATTRIBUTES": "{count} verwendete Attribute | {count} ungenutzte Attribute",
|
||||||
"EMPTY_STATE": "There are no contact custom attributes available in this account. You can create a custom attribute in settings.",
|
"EMPTY_STATE": "Es gibt keine benutzerdefinierten Attribute für Kontakte in diesem Konto. Sie können ein eigenes Attribut in den Einstellungen erstellen.",
|
||||||
"YES": "Ja",
|
"YES": "Ja",
|
||||||
"NO": "Nein",
|
"NO": "Nein",
|
||||||
"TRIGGER": {
|
"TRIGGER": {
|
||||||
@@ -505,11 +505,11 @@
|
|||||||
"INPUT": "Wert eintragen"
|
"INPUT": "Wert eintragen"
|
||||||
},
|
},
|
||||||
"VALIDATIONS": {
|
"VALIDATIONS": {
|
||||||
"INVALID_NUMBER": "Invalid number",
|
"INVALID_NUMBER": "Ungültige Nummer",
|
||||||
"REQUIRED": "Gültiger Wert ist erforderlich",
|
"REQUIRED": "Gültiger Wert ist erforderlich",
|
||||||
"INVALID_INPUT": "Invalid input",
|
"INVALID_INPUT": "Ungültige Eingabe",
|
||||||
"INVALID_URL": "Ungültige URL",
|
"INVALID_URL": "Ungültige URL",
|
||||||
"INVALID_DATE": "Invalid date"
|
"INVALID_DATE": "Ungültiges Datum"
|
||||||
},
|
},
|
||||||
"NO_ATTRIBUTES": "Keine Attribute gefunden",
|
"NO_ATTRIBUTES": "Keine Attribute gefunden",
|
||||||
"API": {
|
"API": {
|
||||||
@@ -521,16 +521,16 @@
|
|||||||
},
|
},
|
||||||
"MERGE": {
|
"MERGE": {
|
||||||
"TITLE": "Kontakte zusammenführen",
|
"TITLE": "Kontakte zusammenführen",
|
||||||
"DESCRIPTION": "Combine two profiles into one, including all attributes and conversations. In case of conflict, the primary contact’s attributes will take precedence.",
|
"DESCRIPTION": "Profile zusammenführen, um zwei Profile zu einem zu kombinieren, einschließlich aller Attribute und Gespräche. Im Falle eines Konflikts haben die Attribute des primären Kontakts Vorrang.",
|
||||||
"PRIMARY": "Hauptkontakt",
|
"PRIMARY": "Hauptkontakt",
|
||||||
"PRIMARY_HELP_LABEL": "To be saved",
|
"PRIMARY_HELP_LABEL": "Zu speichern",
|
||||||
"PRIMARY_REQUIRED_ERROR": "Please select a contact to merge with before proceeding",
|
"PRIMARY_REQUIRED_ERROR": "Bitte wähle einen Kontakt zum Zusammenführen aus, bevor du fortfährst",
|
||||||
"PARENT": "To be merged",
|
"PARENT": "Zusammenzuführen",
|
||||||
"PARENT_HELP_LABEL": "Zu löschen",
|
"PARENT_HELP_LABEL": "Zu löschen",
|
||||||
"EMPTY_STATE": "No contacts found",
|
"EMPTY_STATE": "Keine Kontakte gefunden",
|
||||||
"PLACEHOLDER": "Search for primary contact",
|
"PLACEHOLDER": "Nach primärem Kontakt suchen",
|
||||||
"SEARCH_PLACEHOLDER": "Nach Kontakt suchen",
|
"SEARCH_PLACEHOLDER": "Nach Kontakt suchen",
|
||||||
"SEARCH_ERROR_MESSAGE": "Could not search for contacts. Please try again later.",
|
"SEARCH_ERROR_MESSAGE": "Kontakte konnten nicht gesucht werden. Bitte versuchen Sie es später erneut.",
|
||||||
"SUCCESS_MESSAGE": "Kontakt erfolgreich zusammengeführt",
|
"SUCCESS_MESSAGE": "Kontakt erfolgreich zusammengeführt",
|
||||||
"ERROR_MESSAGE": "Kontakte konnten nicht zusammengeführt werden, bitte erneut versuchen!",
|
"ERROR_MESSAGE": "Kontakte konnten nicht zusammengeführt werden, bitte erneut versuchen!",
|
||||||
"IS_SEARCHING": "Suchen...",
|
"IS_SEARCHING": "Suchen...",
|
||||||
@@ -543,62 +543,62 @@
|
|||||||
"PLACEHOLDER": "Notiz hinzufügen",
|
"PLACEHOLDER": "Notiz hinzufügen",
|
||||||
"WROTE": "schrieb",
|
"WROTE": "schrieb",
|
||||||
"YOU": "Sie",
|
"YOU": "Sie",
|
||||||
"SAVE": "Save note",
|
"SAVE": "Notiz speichern",
|
||||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
"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": {
|
"EMPTY_STATE": {
|
||||||
"TITLE": "No contacts found in this account",
|
"TITLE": "Keine Kontakte in diesem Konto gefunden",
|
||||||
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
"SUBTITLE": "Füge neue Kontakte hinzu, indem du auf den Button unten klickst",
|
||||||
"BUTTON_LABEL": "Add contact",
|
"BUTTON_LABEL": "Kontakt hinzufügen",
|
||||||
"SEARCH_EMPTY_STATE_TITLE": "Keine Kontakte entsprechen Ihrer Suche 🔍",
|
"SEARCH_EMPTY_STATE_TITLE": "Keine Kontakte entsprechen Ihrer Suche 🔍",
|
||||||
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋"
|
"LIST_EMPTY_STATE_TITLE": "Keine Kontakte verfügbar in dieser Ansicht 📋"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"COMPOSE_NEW_CONVERSATION": {
|
"COMPOSE_NEW_CONVERSATION": {
|
||||||
"CONTACT_SEARCH": {
|
"CONTACT_SEARCH": {
|
||||||
"ERROR_MESSAGE": "We couldn’t complete the search. Please try again."
|
"ERROR_MESSAGE": "Wir konnten die Suche nicht abschließen. Bitte versuch es erneut."
|
||||||
},
|
},
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"GO_TO_CONVERSATION": "Aussicht",
|
"GO_TO_CONVERSATION": "Aussicht",
|
||||||
"SUCCESS_MESSAGE": "The message was sent successfully!",
|
"SUCCESS_MESSAGE": "Die Nachricht wurde erfolgreich versendet!",
|
||||||
"ERROR_MESSAGE": "An error occurred while creating the conversation. Please try again later.",
|
"ERROR_MESSAGE": "Beim Erstellen der Unterhaltung ist ein Fehler aufgetreten. Bitte versuchen Sie es später erneut.",
|
||||||
"NO_INBOX_ALERT": "There are no available inboxes to start a conversation with this contact.",
|
"NO_INBOX_ALERT": "Es sind keine Posteingänge vorhanden, um eine Unterhaltung mit diesem Kontakt zu starten.",
|
||||||
"CONTACT_SELECTOR": {
|
"CONTACT_SELECTOR": {
|
||||||
"LABEL": "An:",
|
"LABEL": "An:",
|
||||||
"TAG_INPUT_PLACEHOLDER": "Search for a contact with name, email or phone number",
|
"TAG_INPUT_PLACEHOLDER": "Suche nach Kontakten mit Name, E-Mail oder Telefonnummer",
|
||||||
"CONTACT_CREATING": "Creating contact..."
|
"CONTACT_CREATING": "Neuen Kontakt erstellen..."
|
||||||
},
|
},
|
||||||
"INBOX_SELECTOR": {
|
"INBOX_SELECTOR": {
|
||||||
"LABEL": "Via:",
|
"LABEL": "Via:",
|
||||||
"BUTTON": "Show inboxes"
|
"BUTTON": "Posteingänge anzeigen"
|
||||||
},
|
},
|
||||||
"EMAIL_OPTIONS": {
|
"EMAIL_OPTIONS": {
|
||||||
"SUBJECT_LABEL": "Betreff :",
|
"SUBJECT_LABEL": "Betreff :",
|
||||||
"SUBJECT_PLACEHOLDER": "Enter your email subject here",
|
"SUBJECT_PLACEHOLDER": "E-Mail Betreff hier eingeben",
|
||||||
"CC_LABEL": "Cc:",
|
"CC_LABEL": "Cc:",
|
||||||
"CC_PLACEHOLDER": "Search for a contact with their email address",
|
"CC_PLACEHOLDER": "Suche nach einem Kontakt mit seiner E-Mail-Adresse",
|
||||||
"BCC_LABEL": "Bcc:",
|
"BCC_LABEL": "Bcc:",
|
||||||
"BCC_PLACEHOLDER": "Search for a contact with their email address",
|
"BCC_PLACEHOLDER": "Suche nach einem Kontakt mit seiner E-Mail-Adresse",
|
||||||
"BCC_BUTTON": "Bcc"
|
"BCC_BUTTON": "Bcc"
|
||||||
},
|
},
|
||||||
"MESSAGE_EDITOR": {
|
"MESSAGE_EDITOR": {
|
||||||
"PLACEHOLDER": "Schreiben Sie Ihre Nachricht hier..."
|
"PLACEHOLDER": "Schreiben Sie Ihre Nachricht hier..."
|
||||||
},
|
},
|
||||||
"WHATSAPP_OPTIONS": {
|
"WHATSAPP_OPTIONS": {
|
||||||
"LABEL": "Select template",
|
"LABEL": "Vorlage auswählen",
|
||||||
"SEARCH_PLACEHOLDER": "Search templates",
|
"SEARCH_PLACEHOLDER": "Vorlagen suchen",
|
||||||
"EMPTY_STATE": "No templates found",
|
"EMPTY_STATE": "Keine Vorlagen gefunden",
|
||||||
"TEMPLATE_PARSER": {
|
"TEMPLATE_PARSER": {
|
||||||
"TEMPLATE_NAME": "WhatsApp template: {templateName}",
|
"TEMPLATE_NAME": "WhatsApp Template: {templateName}",
|
||||||
"VARIABLES": "Variablen",
|
"VARIABLES": "Variablen",
|
||||||
"BACK": "Zurück",
|
"BACK": "Zurück",
|
||||||
"SEND_MESSAGE": "Nachricht senden"
|
"SEND_MESSAGE": "Nachricht senden"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ACTION_BUTTONS": {
|
"ACTION_BUTTONS": {
|
||||||
"DISCARD": "Discard",
|
"DISCARD": "Verwerfen",
|
||||||
"SEND": "Send ({keyCode})"
|
"SEND": "Senden ({keyCode})"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,23 +38,23 @@
|
|||||||
"REMOVE_SELECTION": "Auswahl entfernen",
|
"REMOVE_SELECTION": "Auswahl entfernen",
|
||||||
"DOWNLOAD": "Herunterladen",
|
"DOWNLOAD": "Herunterladen",
|
||||||
"UNKNOWN_FILE_TYPE": "Unbekannte Datei",
|
"UNKNOWN_FILE_TYPE": "Unbekannte Datei",
|
||||||
"SAVE_CONTACT": "Save Contact",
|
"SAVE_CONTACT": "Kontakt speichern",
|
||||||
"NO_CONTENT": "No content to display",
|
"NO_CONTENT": "Kein Inhalt zum Anzeigen",
|
||||||
"SHARED_ATTACHMENT": {
|
"SHARED_ATTACHMENT": {
|
||||||
"CONTACT": "{sender} has shared a contact",
|
"CONTACT": "{sender} hat einen Kontakt geteilt",
|
||||||
"LOCATION": "{sender} has shared a location",
|
"LOCATION": "{sender} hat einen Standort geteilt",
|
||||||
"FILE": "{sender} has shared a file",
|
"FILE": "{sender} hat eine Datei geteilt",
|
||||||
"MEETING": "{sender} hat ein Meeting begonnen"
|
"MEETING": "{sender} hat ein Meeting begonnen"
|
||||||
},
|
},
|
||||||
"UPLOADING_ATTACHMENTS": "Anhänge werden hochgeladen...",
|
"UPLOADING_ATTACHMENTS": "Anhänge werden hochgeladen...",
|
||||||
"REPLIED_TO_STORY": "Auf deine Geschichte geantwortet",
|
"REPLIED_TO_STORY": "Auf deine Geschichte geantwortet",
|
||||||
"UNSUPPORTED_MESSAGE": "This message is unsupported. You can view this message on the Facebook / Instagram app.",
|
"UNSUPPORTED_MESSAGE": "Diese Nachricht wird nicht unterstützt. Sie können diese Nachricht in der Facebook/Instagram-App sehen.",
|
||||||
"UNSUPPORTED_MESSAGE_FACEBOOK": "Diese Nachricht wird nicht unterstützt. Sie können diese Nachricht in der Facebook-Messenger-App sehen.",
|
"UNSUPPORTED_MESSAGE_FACEBOOK": "Diese Nachricht wird nicht unterstützt. Sie können diese Nachricht in der Facebook-Messenger-App sehen.",
|
||||||
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Diese Nachricht wird nicht unterstützt. Sie können diese Nachricht in der Instagram-App sehen.",
|
"UNSUPPORTED_MESSAGE_INSTAGRAM": "Diese Nachricht wird nicht unterstützt. Sie können diese Nachricht in der Instagram-App sehen.",
|
||||||
"SUCCESS_DELETE_MESSAGE": "Nachricht erfolgreich gelöscht",
|
"SUCCESS_DELETE_MESSAGE": "Nachricht erfolgreich gelöscht",
|
||||||
"FAIL_DELETE_MESSSAGE": "Nachricht konnte nicht gelöscht werden! Versuchen Sie es erneut",
|
"FAIL_DELETE_MESSSAGE": "Nachricht konnte nicht gelöscht werden! Versuchen Sie es erneut",
|
||||||
"NO_RESPONSE": "Keine Antwort",
|
"NO_RESPONSE": "Keine Antwort",
|
||||||
"RESPONSE": "Response",
|
"RESPONSE": "Antwort",
|
||||||
"RATING_TITLE": "Bewertung",
|
"RATING_TITLE": "Bewertung",
|
||||||
"FEEDBACK_TITLE": "Feedback",
|
"FEEDBACK_TITLE": "Feedback",
|
||||||
"REPLY_MESSAGE_NOT_FOUND": "Nachricht nicht verfügbar",
|
"REPLY_MESSAGE_NOT_FOUND": "Nachricht nicht verfügbar",
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
"FAILED": "Agent konnte nicht zugewiesen werden. Bitte versuche es erneut."
|
"FAILED": "Agent konnte nicht zugewiesen werden. Bitte versuche es erneut."
|
||||||
},
|
},
|
||||||
"LABEL_ASSIGNMENT": {
|
"LABEL_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}",
|
"SUCCESFUL": "Label #{labelName} der Konversations-ID {conversationId} zugewiesen",
|
||||||
"FAILED": "Label konnte nicht zugewiesen werden. Bitte versuche es erneut."
|
"FAILED": "Label konnte nicht zugewiesen werden. Bitte versuche es erneut."
|
||||||
},
|
},
|
||||||
"TEAM_ASSIGNMENT": {
|
"TEAM_ASSIGNMENT": {
|
||||||
@@ -324,7 +324,7 @@
|
|||||||
"BCC": "Bcc",
|
"BCC": "Bcc",
|
||||||
"CC": "Cc",
|
"CC": "Cc",
|
||||||
"SUBJECT": "Betreff",
|
"SUBJECT": "Betreff",
|
||||||
"EXPAND": "Expand email"
|
"EXPAND": "E-Mail erweitern"
|
||||||
},
|
},
|
||||||
"CONVERSATION_PARTICIPANTS": {
|
"CONVERSATION_PARTICIPANTS": {
|
||||||
"SIDEBAR_MENU_TITLE": "Zugewiesen",
|
"SIDEBAR_MENU_TITLE": "Zugewiesen",
|
||||||
@@ -351,14 +351,14 @@
|
|||||||
"NO_TRANSLATIONS_AVAILABLE": "Für diesen Inhalt sind keine Übersetzungen verfügbar"
|
"NO_TRANSLATIONS_AVAILABLE": "Für diesen Inhalt sind keine Übersetzungen verfügbar"
|
||||||
},
|
},
|
||||||
"TYPING": {
|
"TYPING": {
|
||||||
"ONE": "{user} is typing",
|
"ONE": "{user} tippt",
|
||||||
"TWO": "{user} and {secondUser} are typing",
|
"TWO": "{user} und {secondUser} tippen",
|
||||||
"MULTIPLE": "{user} and {count} others are typing"
|
"MULTIPLE": "{user} und {count} andere tippen"
|
||||||
},
|
},
|
||||||
"COPILOT": {
|
"COPILOT": {
|
||||||
"TRY_THESE_PROMPTS": "Try these prompts"
|
"TRY_THESE_PROMPTS": "Probiere diese Prompts"
|
||||||
},
|
},
|
||||||
"GALLERY_VIEW": {
|
"GALLERY_VIEW": {
|
||||||
"ERROR_DOWNLOADING": "Unable to download attachment. Please try again"
|
"ERROR_DOWNLOADING": "Anhang konnte nicht heruntergeladen werden. Bitte versuche es erneut"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
"INBOX_MGMT": {
|
"INBOX_MGMT": {
|
||||||
"HEADER": "Posteingänge",
|
"HEADER": "Posteingänge",
|
||||||
"DESCRIPTION": "A channel is the mode of communication your customer chooses to interact with you. An inbox is where you manage interactions for a specific channel. It can include communications from various sources such as email, live chat, and social media.",
|
"DESCRIPTION": "A channel is the mode of communication your customer chooses to interact with you. An inbox is where you manage interactions for a specific channel. It can include communications from various sources such as email, live chat, and social media.",
|
||||||
"LEARN_MORE": "Learn more about inboxes",
|
"LEARN_MORE": "Mehr über Posteingänge erfahren",
|
||||||
"RECONNECTION_REQUIRED": "Ihr Posteingang ist nicht verbunden. Sie erhalten keine neuen Nachrichten, bis Sie ihn erneut autorisieren.",
|
"RECONNECTION_REQUIRED": "Ihr Posteingang ist nicht verbunden. Sie erhalten keine neuen Nachrichten, bis Sie ihn erneut autorisieren.",
|
||||||
"CLICK_TO_RECONNECT": "Klicken Sie hier, um die Verbindung wiederherzustellen.",
|
"CLICK_TO_RECONNECT": "Klicken Sie hier, um die Verbindung wiederherzustellen.",
|
||||||
"LIST": {
|
"LIST": {
|
||||||
@@ -367,9 +367,9 @@
|
|||||||
"ERROR_MESSAGE": "Beim Verbinden mit Microsoft ist ein Fehler aufgetreten, bitte versuchen Sie es erneut"
|
"ERROR_MESSAGE": "Beim Verbinden mit Microsoft ist ein Fehler aufgetreten, bitte versuchen Sie es erneut"
|
||||||
},
|
},
|
||||||
"GOOGLE": {
|
"GOOGLE": {
|
||||||
"TITLE": "Google Email",
|
"TITLE": "Google E-Mail",
|
||||||
"DESCRIPTION": "Click on the Sign in with Google button to get started. You will redirected to the email sign in page. Once you accept the requested permissions, you would be redirected back to the inbox creation step.",
|
"DESCRIPTION": "Klicken Sie auf die Schaltfläche Einloggen mit Google, um loszulegen. Sie werden zur E-Mail-Anmeldeseite weitergeleitet. Sobald Sie die angeforderten Berechtigungen angenommen haben, werden Sie zum Erstellungsschritt für den Posteingang weitergeleitet.",
|
||||||
"SIGN_IN": "Sign in with Google",
|
"SIGN_IN": "Mit Google anmelden",
|
||||||
"EMAIL_PLACEHOLDER": "E-Mail-Adresse eingeben",
|
"EMAIL_PLACEHOLDER": "E-Mail-Adresse eingeben",
|
||||||
"ERROR_MESSAGE": "There was an error connecting to Google, please try again"
|
"ERROR_MESSAGE": "There was an error connecting to Google, please try again"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Sie",
|
"YOU": "Sie",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -313,7 +313,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Tú",
|
"YOU": "Tú",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "شما",
|
"YOU": "شما",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Sinä",
|
"YOU": "Sinä",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Vous",
|
"YOU": "Vous",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Vi",
|
"YOU": "Vi",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Ön",
|
"YOU": "Ön",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Anda",
|
"YOU": "Anda",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captainが考え中",
|
"LOADER": "Captainが考え中",
|
||||||
"YOU": "あなた",
|
"YOU": "あなた",
|
||||||
"USE": "これを使用",
|
"USE": "これを使用",
|
||||||
"RESET": "リセット"
|
"RESET": "リセット",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "アップグレードしてCaptain AIを利用する",
|
"TITLE": "アップグレードしてCaptain AIを利用する",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "나",
|
"YOU": "나",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Jūs",
|
"YOU": "Jūs",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -302,8 +302,8 @@
|
|||||||
"ERROR": "Atsaistot jautājumu radās kļūda. Lūdzu, mēģiniet vēlreiz"
|
"ERROR": "Atsaistot jautājumu radās kļūda. Lūdzu, mēģiniet vēlreiz"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Are you sure you want to delete the integration?",
|
"TITLE": "Vai tiešām vēlaties dzēst integrāciju?",
|
||||||
"MESSAGE": "Are you sure you want to delete the integration?",
|
"MESSAGE": "Vai tiešām vēlaties dzēst integrāciju?",
|
||||||
"CONFIRM": "Jā, dzēst",
|
"CONFIRM": "Jā, dzēst",
|
||||||
"CANCEL": "Atcelt"
|
"CANCEL": "Atcelt"
|
||||||
}
|
}
|
||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Kapteinis domā",
|
"LOADER": "Kapteinis domā",
|
||||||
"YOU": "Jūs",
|
"YOU": "Jūs",
|
||||||
"USE": "Izmantot šo",
|
"USE": "Izmantot šo",
|
||||||
"RESET": "Atiestatīt"
|
"RESET": "Atiestatīt",
|
||||||
|
"SELECT_ASSISTANT": "Izvēlēties Asistentu"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Modernizējiet abonementu, lai izmantotu Captain AI",
|
"TITLE": "Modernizējiet abonementu, lai izmantotu Captain AI",
|
||||||
@@ -439,19 +440,19 @@
|
|||||||
"DOCUMENTABLE": {
|
"DOCUMENTABLE": {
|
||||||
"CONVERSATION": "Saruna #{id}"
|
"CONVERSATION": "Saruna #{id}"
|
||||||
},
|
},
|
||||||
"SELECTED": "{count} selected",
|
"SELECTED": "Atlasīti {count}",
|
||||||
"BULK_APPROVE_BUTTON": "Approve",
|
"BULK_APPROVE_BUTTON": "Apstiprināt",
|
||||||
"BULK_DELETE_BUTTON": "Dzēst",
|
"BULK_DELETE_BUTTON": "Dzēst",
|
||||||
"BULK_APPROVE": {
|
"BULK_APPROVE": {
|
||||||
"SUCCESS_MESSAGE": "FAQs approved successfully",
|
"SUCCESS_MESSAGE": "Bieži uzdotie jautājumi ir veiksmīgi apstiprināti",
|
||||||
"ERROR_MESSAGE": "There was an error approving the FAQs, please try again."
|
"ERROR_MESSAGE": "Apstiprinot bieži uzdotos jautājumus radās kļūda. Lūdzu, mēģiniet vēlreiz."
|
||||||
},
|
},
|
||||||
"BULK_DELETE": {
|
"BULK_DELETE": {
|
||||||
"TITLE": "Delete FAQs?",
|
"TITLE": "Vai dzēst bieži uzdotos jautājumus?",
|
||||||
"DESCRIPTION": "Are you sure you want to delete the selected FAQs? This action cannot be undone.",
|
"DESCRIPTION": "Vai tiešām vēlaties dzēst atlasītos bieži uzdotos jautājumus? Šo darbību nevar atsaukt.",
|
||||||
"CONFIRM": "Yes, delete all",
|
"CONFIRM": "Jā, dzēst visu",
|
||||||
"SUCCESS_MESSAGE": "FAQs deleted successfully",
|
"SUCCESS_MESSAGE": "Bieži uzdotie jautājumi ir veiksmīgi izdzēsti",
|
||||||
"ERROR_MESSAGE": "There was an error deleting the FAQs, please try again."
|
"ERROR_MESSAGE": "Dzēšot bieži uzdotos jautājumus radās kļūda. Lūdzu, mēģiniet vēlreiz."
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"TITLE": "Vai tiešām vēlaties izdzēst šos bieži uzdotos jautājumus?",
|
"TITLE": "Vai tiešām vēlaties izdzēst šos bieži uzdotos jautājumus?",
|
||||||
|
|||||||
@@ -36,20 +36,20 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"INTERFACE_SECTION": {
|
"INTERFACE_SECTION": {
|
||||||
"TITLE": "Interface",
|
"TITLE": "Interfeiss",
|
||||||
"NOTE": "Customize the look and feel of your Chatwoot dashboard.",
|
"NOTE": "Pielāgot sava Chatwoot informācijas paneļa izskatu un darbību.",
|
||||||
"FONT_SIZE": {
|
"FONT_SIZE": {
|
||||||
"TITLE": "Font size",
|
"TITLE": "Fonta lielums",
|
||||||
"NOTE": "Adjust the text size across the dashboard based on your preference.",
|
"NOTE": "Pielāgot teksta lielumu informācijas panelī, atbilstoši savām vēlmēm.",
|
||||||
"UPDATE_SUCCESS": "Your font settings have been updated successfully",
|
"UPDATE_SUCCESS": "Fonta iestatījumi ir veiksmīgi atjaunināti",
|
||||||
"UPDATE_ERROR": "There is an error while updating the font settings, please try again",
|
"UPDATE_ERROR": "Atjauninot fonta iestatījumus radās kļūda. Lūdzu, mēģiniet vēlreiz",
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"SMALLER": "Smaller",
|
"SMALLER": "Mazāks",
|
||||||
"SMALL": "Small",
|
"SMALL": "Mazs",
|
||||||
"DEFAULT": "Noklusējums",
|
"DEFAULT": "Noklusējums",
|
||||||
"LARGE": "Large",
|
"LARGE": "Liels",
|
||||||
"LARGER": "Larger",
|
"LARGER": "Lielāks",
|
||||||
"EXTRA_LARGE": "Extra Large"
|
"EXTRA_LARGE": "Īpaši Liels"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Jij",
|
"YOU": "Jij",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Du",
|
"YOU": "Du",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Você",
|
"YOU": "Você",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"CANNED_MGMT": {
|
"CANNED_MGMT": {
|
||||||
"HEADER": "Atalhos",
|
"HEADER": "Respostas Prontas",
|
||||||
"LEARN_MORE": "Saiba mais sobre respostas prontas",
|
"LEARN_MORE": "Saiba mais sobre respostas prontas",
|
||||||
"DESCRIPTION": "Respostas prontas são modelos de resposta pré-escritas que te ajudam a responder rapidamente a uma conversa. Os agentes podem digitar o caractere ' /' seguido pelo atalho para inserir uma resposta pronta durante uma conversa. ",
|
"DESCRIPTION": "Respostas prontas são modelos de resposta pré-escritas que te ajudam a responder rapidamente a uma conversa. Os agentes podem digitar o caractere ' /' seguido pelo atalho para inserir uma resposta pronta durante uma conversa. ",
|
||||||
"HEADER_BTN_TXT": "Adicionar resposta pronta",
|
"HEADER_BTN_TXT": "Adicionar resposta pronta",
|
||||||
"LOADING": "Buscando respostas prontas...",
|
"LOADING": "Buscando respostas prontas...",
|
||||||
"SEARCH_404": "Não há itens correspondentes a esta consulta.",
|
"SEARCH_404": "Não há itens correspondentes a esta consulta.",
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"404": "Não há atalhos disponíveis nesta conta.",
|
"404": "Não há respostas prontas disponíveis nesta conta.",
|
||||||
"TITLE": "Gerenciar Atalhos",
|
"TITLE": "Gerenciar Respostas Prontas",
|
||||||
"DESC": "Respostas Prontas são modelos de resposta predefinidas que podem ser usados para enviar respostas rapidamente durante conversas.",
|
"DESC": "Respostas Prontas são modelos de resposta predefinidas que podem ser usados para enviar respostas rapidamente durante conversas.",
|
||||||
"TABLE_HEADER": {
|
"TABLE_HEADER": {
|
||||||
"SHORT_CODE": "Atalho",
|
"SHORT_CODE": "Atalho",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Capitão está pensando",
|
"LOADER": "Capitão está pensando",
|
||||||
"YOU": "Você",
|
"YOU": "Você",
|
||||||
"USE": "Use isto",
|
"USE": "Use isto",
|
||||||
"RESET": "Reiniciar"
|
"RESET": "Reiniciar",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Atualize para usar o Capitão IA",
|
"TITLE": "Atualize para usar o Capitão IA",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Капитан думает",
|
"LOADER": "Капитан думает",
|
||||||
"YOU": "Вы",
|
"YOU": "Вы",
|
||||||
"USE": "Использовать это",
|
"USE": "Использовать это",
|
||||||
"RESET": "Сброс"
|
"RESET": "Сброс",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Обновите тарифный план, чтобы использовать Captain AI",
|
"TITLE": "Обновите тарифный план, чтобы использовать Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Vy",
|
"YOU": "Vy",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Vi",
|
"YOU": "Vi",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Ju",
|
"YOU": "Ju",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Du",
|
"YOU": "Du",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Sen",
|
"YOU": "Sen",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "Ви",
|
"YOU": "Ви",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -316,7 +316,8 @@
|
|||||||
"LOADER": "Captain is thinking",
|
"LOADER": "Captain is thinking",
|
||||||
"YOU": "You",
|
"YOU": "You",
|
||||||
"USE": "Use this",
|
"USE": "Use this",
|
||||||
"RESET": "Reset"
|
"RESET": "Reset",
|
||||||
|
"SELECT_ASSISTANT": "Select Assistant"
|
||||||
},
|
},
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to use Captain AI",
|
"TITLE": "Upgrade to use Captain AI",
|
||||||
|
|||||||
@@ -66,8 +66,8 @@
|
|||||||
},
|
},
|
||||||
"ERRORS": {
|
"ERRORS": {
|
||||||
"VALUE_REQUIRED": "必须填写值",
|
"VALUE_REQUIRED": "必须填写值",
|
||||||
"ATTRIBUTE_KEY_REQUIRED": "Attribute key is required",
|
"ATTRIBUTE_KEY_REQUIRED": "属性键是必需的",
|
||||||
"FILTER_OPERATOR_REQUIRED": "Filter operator is required",
|
"FILTER_OPERATOR_REQUIRED": "需要过滤器操作符",
|
||||||
"VALUE_MUST_BE_BETWEEN_1_AND_998": "值必须介于 1 到 998 之间。"
|
"VALUE_MUST_BE_BETWEEN_1_AND_998": "值必须介于 1 到 998 之间。"
|
||||||
},
|
},
|
||||||
"GROUPS": {
|
"GROUPS": {
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
"SUBMIT": "验证并保存"
|
"SUBMIT": "验证并保存"
|
||||||
},
|
},
|
||||||
"BOT_CONFIGURATION": {
|
"BOT_CONFIGURATION": {
|
||||||
"TITLE": "选择一个代理机器人",
|
"TITLE": "选择一个客服机器人",
|
||||||
"DESC": "将代理机器人分配到您的收件箱。他们可以处理初始对话,并在必要时将其转移给真人客服。",
|
"DESC": "将代理机器人分配到您的收件箱。他们可以处理初始对话,并在必要时将其转移给真人客服。",
|
||||||
"SUBMIT": "更新",
|
"SUBMIT": "更新",
|
||||||
"DISCONNECT": "断开机器人",
|
"DISCONNECT": "断开机器人",
|
||||||
|
|||||||
@@ -113,7 +113,7 @@
|
|||||||
"PLACEHOLDER": {
|
"PLACEHOLDER": {
|
||||||
"AGENT": "搜索客服代表",
|
"AGENT": "搜索客服代表",
|
||||||
"TEAM": "查找团队",
|
"TEAM": "查找团队",
|
||||||
"INPUT": "查找代理"
|
"INPUT": "查找客服代表"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,8 +118,8 @@
|
|||||||
"LABEL_UPLOAD_FAILED": "上传失败"
|
"LABEL_UPLOAD_FAILED": "上传失败"
|
||||||
},
|
},
|
||||||
"ERRORS": {
|
"ERRORS": {
|
||||||
"ATTRIBUTE_KEY_REQUIRED": "Attribute key is required",
|
"ATTRIBUTE_KEY_REQUIRED": "属性键是必需的",
|
||||||
"FILTER_OPERATOR_REQUIRED": "Filter operator is required",
|
"FILTER_OPERATOR_REQUIRED": "需要过滤器操作符",
|
||||||
"VALUE_REQUIRED": "必须填写值",
|
"VALUE_REQUIRED": "必须填写值",
|
||||||
"VALUE_MUST_BE_BETWEEN_1_AND_998": "值必须介于 1 到 998 之间。",
|
"VALUE_MUST_BE_BETWEEN_1_AND_998": "值必须介于 1 到 998 之间。",
|
||||||
"ACTION_PARAMETERS_REQUIRED": "需要操作参数",
|
"ACTION_PARAMETERS_REQUIRED": "需要操作参数",
|
||||||
|
|||||||
@@ -1,149 +1,149 @@
|
|||||||
{
|
{
|
||||||
"CAMPAIGN": {
|
"CAMPAIGN": {
|
||||||
"LIVE_CHAT": {
|
"LIVE_CHAT": {
|
||||||
"HEADER_TITLE": "Live chat campaigns",
|
"HEADER_TITLE": "实时聊天活动",
|
||||||
"NEW_CAMPAIGN": "Create campaign",
|
"NEW_CAMPAIGN": "创建活动",
|
||||||
"CARD": {
|
"CARD": {
|
||||||
"STATUS": {
|
"STATUS": {
|
||||||
"ENABLED": "已启用",
|
"ENABLED": "已启用",
|
||||||
"DISABLED": "已禁用"
|
"DISABLED": "已禁用"
|
||||||
},
|
},
|
||||||
"CAMPAIGN_DETAILS": {
|
"CAMPAIGN_DETAILS": {
|
||||||
"SENT_BY": "Sent by",
|
"SENT_BY": "发送者",
|
||||||
"BOT": "机器人",
|
"BOT": "机器人",
|
||||||
"FROM": "发自",
|
"FROM": "发自",
|
||||||
"URL": "URL:"
|
"URL": "网址:"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EMPTY_STATE": {
|
"EMPTY_STATE": {
|
||||||
"TITLE": "No live chat campaigns are available",
|
"TITLE": "暂无实时聊天活动",
|
||||||
"SUBTITLE": "Connect with your customers using proactive messages. Click 'Create campaign' to get started."
|
"SUBTITLE": "通过主动消息与您的客户连接。点击 '创建活动' 开始。"
|
||||||
},
|
},
|
||||||
"CREATE": {
|
"CREATE": {
|
||||||
"TITLE": "Create a live chat campaign",
|
"TITLE": "创建实时聊天活动",
|
||||||
"CANCEL_BUTTON_TEXT": "取消",
|
"CANCEL_BUTTON_TEXT": "取消",
|
||||||
"CREATE_BUTTON_TEXT": "创建",
|
"CREATE_BUTTON_TEXT": "创建",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"TITLE": {
|
"TITLE": {
|
||||||
"LABEL": "标题",
|
"LABEL": "标题",
|
||||||
"PLACEHOLDER": "Please enter the title of campaign",
|
"PLACEHOLDER": "请输入活动标题",
|
||||||
"ERROR": "Title is required"
|
"ERROR": "标题是必填项"
|
||||||
},
|
},
|
||||||
"MESSAGE": {
|
"MESSAGE": {
|
||||||
"LABEL": "消息",
|
"LABEL": "消息",
|
||||||
"PLACEHOLDER": "Please enter the message of campaign",
|
"PLACEHOLDER": "请输入活动消息",
|
||||||
"ERROR": "Message is required"
|
"ERROR": "消息是必填项"
|
||||||
},
|
},
|
||||||
"INBOX": {
|
"INBOX": {
|
||||||
"LABEL": "Select Inbox",
|
"LABEL": "选择收件箱",
|
||||||
"PLACEHOLDER": "Select Inbox",
|
"PLACEHOLDER": "选择收件箱",
|
||||||
"ERROR": "Inbox is required"
|
"ERROR": "收件箱是必填项"
|
||||||
},
|
},
|
||||||
"SENT_BY": {
|
"SENT_BY": {
|
||||||
"LABEL": "Sent by",
|
"LABEL": "发送者",
|
||||||
"PLACEHOLDER": "Please select sender",
|
"PLACEHOLDER": "请选择发送者",
|
||||||
"ERROR": "Sender is required"
|
"ERROR": "发送者是必填项"
|
||||||
},
|
},
|
||||||
"END_POINT": {
|
"END_POINT": {
|
||||||
"LABEL": "URL",
|
"LABEL": "网址",
|
||||||
"PLACEHOLDER": "Please enter the URL",
|
"PLACEHOLDER": "请输入网址",
|
||||||
"ERROR": "请输入一个有效的 URL"
|
"ERROR": "请输入有效的网址"
|
||||||
},
|
},
|
||||||
"TIME_ON_PAGE": {
|
"TIME_ON_PAGE": {
|
||||||
"LABEL": "Time on page(Seconds)",
|
"LABEL": "页面停留时间(秒)",
|
||||||
"PLACEHOLDER": "Please enter the time",
|
"PLACEHOLDER": "请输入时间",
|
||||||
"ERROR": "Time on page is required"
|
"ERROR": "页面停留时间是必填项"
|
||||||
},
|
},
|
||||||
"OTHER_PREFERENCES": {
|
"OTHER_PREFERENCES": {
|
||||||
"TITLE": "Other preferences",
|
"TITLE": "其他设置",
|
||||||
"ENABLED": "Enable campaign",
|
"ENABLED": "启用活动",
|
||||||
"TRIGGER_ONLY_BUSINESS_HOURS": "Trigger only during business hours"
|
"TRIGGER_ONLY_BUSINESS_HOURS": "仅在工作时间触发"
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CREATE": "创建",
|
"CREATE": "创建",
|
||||||
"CANCEL": "取消"
|
"CANCEL": "取消"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Live chat campaign created successfully",
|
"SUCCESS_MESSAGE": "实时聊天活动创建成功",
|
||||||
"ERROR_MESSAGE": "There was an error. Please try again."
|
"ERROR_MESSAGE": "发生错误,请重试。"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT": {
|
"EDIT": {
|
||||||
"TITLE": "Edit live chat campaign",
|
"TITLE": "编辑实时聊天活动",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Live chat campaign updated successfully",
|
"SUCCESS_MESSAGE": "实时聊天活动更新成功",
|
||||||
"ERROR_MESSAGE": "There was an error. Please try again."
|
"ERROR_MESSAGE": "发生错误,请重试。"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"SMS": {
|
"SMS": {
|
||||||
"HEADER_TITLE": "SMS campaigns",
|
"HEADER_TITLE": "短信活动",
|
||||||
"NEW_CAMPAIGN": "Create campaign",
|
"NEW_CAMPAIGN": "创建活动",
|
||||||
"EMPTY_STATE": {
|
"EMPTY_STATE": {
|
||||||
"TITLE": "No SMS campaigns are available",
|
"TITLE": "暂无短信活动",
|
||||||
"SUBTITLE": "Launch an SMS campaign to reach your customers directly. Send offers or make announcements with ease. Click 'Create campaign' to get started."
|
"SUBTITLE": "启动短信活动直接与客户沟通。轻松发送优惠或公告。点击 '创建活动' 开始。"
|
||||||
},
|
},
|
||||||
"CARD": {
|
"CARD": {
|
||||||
"STATUS": {
|
"STATUS": {
|
||||||
"COMPLETED": "Completed",
|
"COMPLETED": "已完成",
|
||||||
"SCHEDULED": "Scheduled"
|
"SCHEDULED": "已计划"
|
||||||
},
|
},
|
||||||
"CAMPAIGN_DETAILS": {
|
"CAMPAIGN_DETAILS": {
|
||||||
"SENT_FROM": "Sent from",
|
"SENT_FROM": "发自",
|
||||||
"ON": "on"
|
"ON": "于"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CREATE": {
|
"CREATE": {
|
||||||
"TITLE": "Create SMS campaign",
|
"TITLE": "创建短信活动",
|
||||||
"CANCEL_BUTTON_TEXT": "取消",
|
"CANCEL_BUTTON_TEXT": "取消",
|
||||||
"CREATE_BUTTON_TEXT": "创建",
|
"CREATE_BUTTON_TEXT": "创建",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"TITLE": {
|
"TITLE": {
|
||||||
"LABEL": "标题",
|
"LABEL": "标题",
|
||||||
"PLACEHOLDER": "Please enter the title of campaign",
|
"PLACEHOLDER": "请输入活动标题",
|
||||||
"ERROR": "Title is required"
|
"ERROR": "标题是必填项"
|
||||||
},
|
},
|
||||||
"MESSAGE": {
|
"MESSAGE": {
|
||||||
"LABEL": "消息",
|
"LABEL": "消息",
|
||||||
"PLACEHOLDER": "Please enter the message of campaign",
|
"PLACEHOLDER": "请输入活动消息",
|
||||||
"ERROR": "Message is required"
|
"ERROR": "消息是必填项"
|
||||||
},
|
},
|
||||||
"INBOX": {
|
"INBOX": {
|
||||||
"LABEL": "Select Inbox",
|
"LABEL": "选择收件箱",
|
||||||
"PLACEHOLDER": "Select Inbox",
|
"PLACEHOLDER": "选择收件箱",
|
||||||
"ERROR": "Inbox is required"
|
"ERROR": "收件箱是必填项"
|
||||||
},
|
},
|
||||||
"AUDIENCE": {
|
"AUDIENCE": {
|
||||||
"LABEL": "Audience",
|
"LABEL": "受众",
|
||||||
"PLACEHOLDER": "Select the customer labels",
|
"PLACEHOLDER": "选择客户标签",
|
||||||
"ERROR": "Audience is required"
|
"ERROR": "受众是必填项"
|
||||||
},
|
},
|
||||||
"SCHEDULED_AT": {
|
"SCHEDULED_AT": {
|
||||||
"LABEL": "Scheduled time",
|
"LABEL": "计划时间",
|
||||||
"PLACEHOLDER": "Please select the time",
|
"PLACEHOLDER": "请选择时间",
|
||||||
"ERROR": "Scheduled time is required"
|
"ERROR": "计划时间是必填项"
|
||||||
},
|
},
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CREATE": "创建",
|
"CREATE": "创建",
|
||||||
"CANCEL": "取消"
|
"CANCEL": "取消"
|
||||||
},
|
},
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "SMS campaign created successfully",
|
"SUCCESS_MESSAGE": "短信活动创建成功",
|
||||||
"ERROR_MESSAGE": "There was an error. Please try again."
|
"ERROR_MESSAGE": "发生错误,请重试。"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CONFIRM_DELETE": {
|
"CONFIRM_DELETE": {
|
||||||
"TITLE": "Are you sure to delete?",
|
"TITLE": "确定删除吗?",
|
||||||
"DESCRIPTION": "The delete action is permanent and cannot be reversed.",
|
"DESCRIPTION": "删除操作是永久性的,无法恢复。",
|
||||||
"CONFIRM": "删除",
|
"CONFIRM": "删除",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Campaign deleted successfully",
|
"SUCCESS_MESSAGE": "活动删除成功",
|
||||||
"ERROR_MESSAGE": "There was an error. Please try again."
|
"ERROR_MESSAGE": "发生错误,请重试。"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"CANNED_MGMT": {
|
"CANNED_MGMT": {
|
||||||
"HEADER": "预设回复",
|
"HEADER": "预设回复",
|
||||||
"LEARN_MORE": "Learn more about canned responses",
|
"LEARN_MORE": "了解更多关于预设回复的内容",
|
||||||
"DESCRIPTION": "Canned Responses are pre-written reply templates that help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a canned response during a conversation. ",
|
"DESCRIPTION": "预置回复是预先写好的回复模板,可以帮助您在对话中快速响应。客服人员可以在对话中输入“/”字符,然后输入简码来插入预置回复。 ",
|
||||||
"HEADER_BTN_TXT": "新增预定义回复",
|
"HEADER_BTN_TXT": "新增预定义回复",
|
||||||
"LOADING": "正在检索预定义回复...",
|
"LOADING": "正在检索预定义回复...",
|
||||||
"SEARCH_404": "没有任何项目符合此查询.",
|
"SEARCH_404": "没有任何项目符合此查询.",
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
"CONFIRM": {
|
"CONFIRM": {
|
||||||
"TITLE": "确认删除",
|
"TITLE": "确认删除",
|
||||||
"MESSAGE": "您确定要删除吗? ",
|
"MESSAGE": "您确定要删除吗? ",
|
||||||
"YES": "是的,删除",
|
"YES": "是的,删除 ",
|
||||||
"NO": "不,保留 "
|
"NO": "不,保留 "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
"LIST": {
|
"LIST": {
|
||||||
"404": "没有有效的对话在这个群组里面"
|
"404": "没有有效的对话在这个群组里面"
|
||||||
},
|
},
|
||||||
"FAILED_TO_SEND": "Failed to send",
|
"FAILED_TO_SEND": "发送失败",
|
||||||
"TAB_HEADING": "会话",
|
"TAB_HEADING": "会话",
|
||||||
"MENTION_HEADING": "提及",
|
"MENTION_HEADING": "提及",
|
||||||
"UNATTENDED_HEADING": "未处理",
|
"UNATTENDED_HEADING": "未处理",
|
||||||
@@ -95,13 +95,13 @@
|
|||||||
"CONTENT": "位置"
|
"CONTENT": "位置"
|
||||||
},
|
},
|
||||||
"ig_reel": {
|
"ig_reel": {
|
||||||
"CONTENT": "Instagram Reel"
|
"CONTENT": "Instagram 短视频"
|
||||||
},
|
},
|
||||||
"fallback": {
|
"fallback": {
|
||||||
"CONTENT": "分享了一个网址"
|
"CONTENT": "分享了一个网址"
|
||||||
},
|
},
|
||||||
"contact": {
|
"contact": {
|
||||||
"CONTENT": "Shared contact"
|
"CONTENT": "共享联系人"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CHAT_SORT_BY_FILTER": {
|
"CHAT_SORT_BY_FILTER": {
|
||||||
@@ -134,6 +134,6 @@
|
|||||||
"HIDE_QUOTED_TEXT": "隐藏引用文字",
|
"HIDE_QUOTED_TEXT": "隐藏引用文字",
|
||||||
"SHOW_QUOTED_TEXT": "显示引用文字",
|
"SHOW_QUOTED_TEXT": "显示引用文字",
|
||||||
"MESSAGE_READ": "已读",
|
"MESSAGE_READ": "已读",
|
||||||
"SENDING": "Sending"
|
"SENDING": "发送中"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,43 +1,43 @@
|
|||||||
{
|
{
|
||||||
"PAGINATION_FOOTER": {
|
"PAGINATION_FOOTER": {
|
||||||
"SHOWING": "Showing {startItem} - {endItem} of {totalItems} items",
|
"SHOWING": "显示第 {startItem} - {endItem} 项,共 {totalItems} 项",
|
||||||
"CURRENT_PAGE_INFO": "{currentPage} of {totalPages} pages"
|
"CURRENT_PAGE_INFO": "第 {currentPage} 页,共 {totalPages} 页"
|
||||||
},
|
},
|
||||||
"COMBOBOX": {
|
"COMBOBOX": {
|
||||||
"PLACEHOLDER": "Select an option...",
|
"PLACEHOLDER": "请选择一个选项……",
|
||||||
"EMPTY_SEARCH_RESULTS": "No items found for the search term `{searchTerm}`",
|
"EMPTY_SEARCH_RESULTS": "未找到与搜索词 `{searchTerm}` 匹配的项",
|
||||||
"EMPTY_STATE": "未找到结果。",
|
"EMPTY_STATE": "未找到结果。",
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "搜索……",
|
||||||
"MORE": "+{count} more"
|
"MORE": "+{count} 更多"
|
||||||
},
|
},
|
||||||
"DROPDOWN_MENU": {
|
"DROPDOWN_MENU": {
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "搜索……",
|
||||||
"EMPTY_STATE": "未找到结果。",
|
"EMPTY_STATE": "未找到结果。",
|
||||||
"SEARCHING": "搜索中..."
|
"SEARCHING": "搜索中……"
|
||||||
},
|
},
|
||||||
"DIALOG": {
|
"DIALOG": {
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CANCEL": "取消",
|
"CANCEL": "取消",
|
||||||
"CONFIRM": "Confirm"
|
"CONFIRM": "确认"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PHONE_INPUT": {
|
"PHONE_INPUT": {
|
||||||
"SEARCH_PLACEHOLDER": "搜索国家/地区",
|
"SEARCH_PLACEHOLDER": "搜索国家/地区",
|
||||||
"ERROR": "Phone number should be empty or in E.164 format",
|
"ERROR": "电话号码应为空或E.164格式",
|
||||||
"DIAL_CODE_ERROR": "请从列表中选择拨号代码"
|
"DIAL_CODE_ERROR": "请从列表中选择拨号代码"
|
||||||
},
|
},
|
||||||
"THUMBNAIL": {
|
"THUMBNAIL": {
|
||||||
"AUTHOR": {
|
"AUTHOR": {
|
||||||
"NOT_AVAILABLE": "Author is not available"
|
"NOT_AVAILABLE": "作者不可用"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"BREADCRUMB": {
|
"BREADCRUMB": {
|
||||||
"ARIA_LABEL": "Breadcrumb"
|
"ARIA_LABEL": "面包屑导航"
|
||||||
},
|
},
|
||||||
"SWITCH": {
|
"SWITCH": {
|
||||||
"TOGGLE": "Toggle switch"
|
"TOGGLE": "切换开关"
|
||||||
},
|
},
|
||||||
"LABEL": {
|
"LABEL": {
|
||||||
"TAG_BUTTON": "tag"
|
"TAG_BUTTON": "标签"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -266,7 +266,7 @@
|
|||||||
"ATTRIBUTE_WARNING": "<strong>{primaryContactName}</strong> 的联系信息将拷贝到 <strong>{parentContactName}</strong>。"
|
"ATTRIBUTE_WARNING": "<strong>{primaryContactName}</strong> 的联系信息将拷贝到 <strong>{parentContactName}</strong>。"
|
||||||
},
|
},
|
||||||
"SEARCH": {
|
"SEARCH": {
|
||||||
"ERROR_MESSAGE": "Something went wrong. Please try again later."
|
"ERROR_MESSAGE": "出了点问题。请稍后再试。"
|
||||||
},
|
},
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"SUBMIT": " 合并联系人",
|
"SUBMIT": " 合并联系人",
|
||||||
@@ -284,45 +284,45 @@
|
|||||||
"CONTACTS_LAYOUT": {
|
"CONTACTS_LAYOUT": {
|
||||||
"HEADER": {
|
"HEADER": {
|
||||||
"TITLE": "联系人",
|
"TITLE": "联系人",
|
||||||
"SEARCH_TITLE": "Search contacts",
|
"SEARCH_TITLE": "搜索联系人",
|
||||||
"SEARCH_PLACEHOLDER": "Search...",
|
"SEARCH_PLACEHOLDER": "搜索……",
|
||||||
"MESSAGE_BUTTON": "消息",
|
"MESSAGE_BUTTON": "消息",
|
||||||
"SEND_MESSAGE": "发送消息",
|
"SEND_MESSAGE": "发送消息",
|
||||||
"BLOCK_CONTACT": "Block contact",
|
"BLOCK_CONTACT": "屏蔽联系人",
|
||||||
"UNBLOCK_CONTACT": "Unblock contact",
|
"UNBLOCK_CONTACT": "解除屏蔽联系人",
|
||||||
"BREADCRUMB": {
|
"BREADCRUMB": {
|
||||||
"CONTACTS": "联系人"
|
"CONTACTS": "联系人"
|
||||||
},
|
},
|
||||||
"ACTIONS": {
|
"ACTIONS": {
|
||||||
"CONTACT_CREATION": {
|
"CONTACT_CREATION": {
|
||||||
"ADD_CONTACT": "Add contact",
|
"ADD_CONTACT": "添加联系人",
|
||||||
"EXPORT_CONTACT": "Export contacts",
|
"EXPORT_CONTACT": "导出联系人",
|
||||||
"IMPORT_CONTACT": "Import contacts",
|
"IMPORT_CONTACT": "导入联系人",
|
||||||
"SAVE_CONTACT": "Save contact",
|
"SAVE_CONTACT": "保存联系人",
|
||||||
"EMAIL_ADDRESS_DUPLICATE": "此电子邮件地址正在用于另一个联系人。",
|
"EMAIL_ADDRESS_DUPLICATE": "此电子邮件地址正在用于另一个联系人。",
|
||||||
"PHONE_NUMBER_DUPLICATE": "此电话号码正在用于另一个联系人。",
|
"PHONE_NUMBER_DUPLICATE": "此电话号码正在用于另一个联系人。",
|
||||||
"SUCCESS_MESSAGE": "联系人保存成功",
|
"SUCCESS_MESSAGE": "联系人保存成功",
|
||||||
"ERROR_MESSAGE": "Unable to save contact. Please try again later."
|
"ERROR_MESSAGE": "无法保存联系人,请稍后再试。"
|
||||||
},
|
},
|
||||||
"BLOCK_SUCCESS_MESSAGE": "This contact is blocked successfully",
|
"BLOCK_SUCCESS_MESSAGE": "此联系人已成功屏蔽",
|
||||||
"BLOCK_ERROR_MESSAGE": "Unable to block contact. Please try again later.",
|
"BLOCK_ERROR_MESSAGE": "无法屏蔽联系人,请稍后再试。",
|
||||||
"UNBLOCK_SUCCESS_MESSAGE": "This contact is unblocked successfully",
|
"UNBLOCK_SUCCESS_MESSAGE": "此联系人已成功解除屏蔽",
|
||||||
"UNBLOCK_ERROR_MESSAGE": "Unable to unblock contact. Please try again later.",
|
"UNBLOCK_ERROR_MESSAGE": "无法解除屏蔽联系人,请稍后再试。",
|
||||||
"IMPORT_CONTACT": {
|
"IMPORT_CONTACT": {
|
||||||
"TITLE": "Import contacts",
|
"TITLE": "导入联系人",
|
||||||
"DESCRIPTION": "通过 CSV 文件导入联系人",
|
"DESCRIPTION": "通过 CSV 文件导入联系人",
|
||||||
"DOWNLOAD_LABEL": "下载示例 CSV.",
|
"DOWNLOAD_LABEL": "下载示例 CSV.",
|
||||||
"LABEL": "CSV 文件:",
|
"LABEL": "CSV 文件:",
|
||||||
"CHOOSE_FILE": "Choose file",
|
"CHOOSE_FILE": "选择文件",
|
||||||
"CHANGE": "改變",
|
"CHANGE": "更改",
|
||||||
"CANCEL": "取消",
|
"CANCEL": "取消",
|
||||||
"IMPORT": "导入",
|
"IMPORT": "导入",
|
||||||
"SUCCESS_MESSAGE": "导入完成时将通过电子邮件通知您。",
|
"SUCCESS_MESSAGE": "导入完成时将通过电子邮件通知您。",
|
||||||
"ERROR_MESSAGE": "出现错误,请重试"
|
"ERROR_MESSAGE": "出现错误,请重试"
|
||||||
},
|
},
|
||||||
"EXPORT_CONTACT": {
|
"EXPORT_CONTACT": {
|
||||||
"TITLE": "Export contacts",
|
"TITLE": "导出联系人",
|
||||||
"DESCRIPTION": "Quickly export a csv file with comprehensive details of your contacts",
|
"DESCRIPTION": "快速导出包含联系人详细信息的 CSV 文件",
|
||||||
"CONFIRM": "导出",
|
"CONFIRM": "导出",
|
||||||
"SUCCESS_MESSAGE": "导出正在进行。当导出文件准备好下载时,您将收到电子邮件通知。",
|
"SUCCESS_MESSAGE": "导出正在进行。当导出文件准备好下载时,您将收到电子邮件通知。",
|
||||||
"ERROR_MESSAGE": "出现错误,请重试"
|
"ERROR_MESSAGE": "出现错误,请重试"
|
||||||
@@ -331,7 +331,7 @@
|
|||||||
"LABEL": "排序方式",
|
"LABEL": "排序方式",
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"NAME": "姓名:",
|
"NAME": "姓名:",
|
||||||
"EMAIL": "Email",
|
"EMAIL": "电子邮件",
|
||||||
"PHONE_NUMBER": "电话号码",
|
"PHONE_NUMBER": "电话号码",
|
||||||
"COMPANY": "公司",
|
"COMPANY": "公司",
|
||||||
"COUNTRY": "国家",
|
"COUNTRY": "国家",
|
||||||
@@ -341,10 +341,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ORDER": {
|
"ORDER": {
|
||||||
"LABEL": "Ordering",
|
"LABEL": "排序顺序",
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"ASCENDING": "Ascending",
|
"ASCENDING": "升序",
|
||||||
"DESCENDING": "Descending"
|
"DESCENDING": "降序"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"FILTERS": {
|
"FILTERS": {
|
||||||
@@ -352,28 +352,28 @@
|
|||||||
"TITLE": "您想要保存此过滤器吗?",
|
"TITLE": "您想要保存此过滤器吗?",
|
||||||
"CONFIRM": "保存过滤器",
|
"CONFIRM": "保存过滤器",
|
||||||
"LABEL": "姓名:",
|
"LABEL": "姓名:",
|
||||||
"PLACEHOLDER": "Enter the name of the filter",
|
"PLACEHOLDER": "输入过滤器的名称",
|
||||||
"ERROR": "Enter a valid name",
|
"ERROR": "请输入有效的名称",
|
||||||
"SUCCESS_MESSAGE": "Filter saved successfully",
|
"SUCCESS_MESSAGE": "过滤器保存成功",
|
||||||
"ERROR_MESSAGE": "Unable to save filter. Please try again later."
|
"ERROR_MESSAGE": "无法保存过滤器,请稍后再试。"
|
||||||
},
|
},
|
||||||
"DELETE_SEGMENT": {
|
"DELETE_SEGMENT": {
|
||||||
"TITLE": "确认删除",
|
"TITLE": "确认删除",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this filter?",
|
"DESCRIPTION": "您确定要删除此过滤器吗?",
|
||||||
"CONFIRM": "是,删除",
|
"CONFIRM": "是,删除",
|
||||||
"CANCEL": "否,取消",
|
"CANCEL": "否,取消",
|
||||||
"SUCCESS_MESSAGE": "Filter deleted successfully",
|
"SUCCESS_MESSAGE": "过滤器删除成功",
|
||||||
"ERROR_MESSAGE": "Unable to delete filter. Please try again later."
|
"ERROR_MESSAGE": "无法删除过滤器,请稍后再试。"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PAGINATION_FOOTER": {
|
"PAGINATION_FOOTER": {
|
||||||
"SHOWING": "Showing {startItem} - {endItem} of {totalItems} contacts"
|
"SHOWING": "显示 {startItem} - {endItem} 个联系人,共 {totalItems} 个"
|
||||||
},
|
},
|
||||||
"FILTER": {
|
"FILTER": {
|
||||||
"NAME": "姓名:",
|
"NAME": "姓名:",
|
||||||
"EMAIL": "Email",
|
"EMAIL": "电子邮件",
|
||||||
"PHONE_NUMBER": "电话号码",
|
"PHONE_NUMBER": "电话号码",
|
||||||
"IDENTIFIER": "标识符",
|
"IDENTIFIER": "标识符",
|
||||||
"COUNTRY": "国家",
|
"COUNTRY": "国家",
|
||||||
@@ -381,92 +381,92 @@
|
|||||||
"CREATED_AT": "创建于",
|
"CREATED_AT": "创建于",
|
||||||
"LAST_ACTIVITY": "上次操作",
|
"LAST_ACTIVITY": "上次操作",
|
||||||
"REFERER_LINK": "引用链接",
|
"REFERER_LINK": "引用链接",
|
||||||
"BLOCKED": "Blocked",
|
"BLOCKED": "已屏蔽",
|
||||||
"BLOCKED_TRUE": "真的",
|
"BLOCKED_TRUE": "是",
|
||||||
"BLOCKED_FALSE": "错误",
|
"BLOCKED_FALSE": "否",
|
||||||
"BUTTONS": {
|
"BUTTONS": {
|
||||||
"CLEAR_FILTERS": "清除过滤器",
|
"CLEAR_FILTERS": "清除过滤器",
|
||||||
"UPDATE_SEGMENT": "Update segment",
|
"UPDATE_SEGMENT": "更新分段",
|
||||||
"APPLY_FILTERS": "应用过滤器",
|
"APPLY_FILTERS": "应用过滤器",
|
||||||
"ADD_FILTER": "添加过滤器"
|
"ADD_FILTER": "添加过滤器"
|
||||||
},
|
},
|
||||||
"TITLE": "Filter contacts",
|
"TITLE": "过滤联系人",
|
||||||
"EDIT_SEGMENT": "编辑分段",
|
"EDIT_SEGMENT": "编辑分段",
|
||||||
"SEGMENT": {
|
"SEGMENT": {
|
||||||
"LABEL": "Segment name",
|
"LABEL": "分段名称",
|
||||||
"INPUT_PLACEHOLDER": "Enter the name of the segment"
|
"INPUT_PLACEHOLDER": "输入分段的名称"
|
||||||
},
|
},
|
||||||
"ACTIVE_FILTERS": {
|
"ACTIVE_FILTERS": {
|
||||||
"MORE_FILTERS": "+ {count} more filters",
|
"MORE_FILTERS": "+ {count} 更多过滤器",
|
||||||
"CLEAR_FILTERS": "清除过滤器"
|
"CLEAR_FILTERS": "清除过滤器"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CARD": {
|
"CARD": {
|
||||||
"OF": "of",
|
"OF": "的",
|
||||||
"VIEW_DETAILS": "查看详细信息",
|
"VIEW_DETAILS": "查看详细信息",
|
||||||
"EDIT_DETAILS_FORM": {
|
"EDIT_DETAILS_FORM": {
|
||||||
"TITLE": "编辑联系人详情",
|
"TITLE": "编辑联系人详情",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"FIRST_NAME": {
|
"FIRST_NAME": {
|
||||||
"PLACEHOLDER": "Enter the first name"
|
"PLACEHOLDER": "输入名字"
|
||||||
},
|
},
|
||||||
"LAST_NAME": {
|
"LAST_NAME": {
|
||||||
"PLACEHOLDER": "Enter the last name"
|
"PLACEHOLDER": "输入姓氏"
|
||||||
},
|
},
|
||||||
"EMAIL_ADDRESS": {
|
"EMAIL_ADDRESS": {
|
||||||
"PLACEHOLDER": "Enter the email address",
|
"PLACEHOLDER": "输入电子邮件地址",
|
||||||
"DUPLICATE": "此电子邮件地址正在用于另一个联系人。"
|
"DUPLICATE": "此电子邮件地址正在用于另一个联系人。"
|
||||||
},
|
},
|
||||||
"PHONE_NUMBER": {
|
"PHONE_NUMBER": {
|
||||||
"PLACEHOLDER": "Enter the phone number",
|
"PLACEHOLDER": "输入电话号码",
|
||||||
"DUPLICATE": "此电话号码正在用于另一个联系人。"
|
"DUPLICATE": "此电话号码正在用于另一个联系人。"
|
||||||
},
|
},
|
||||||
"CITY": {
|
"CITY": {
|
||||||
"PLACEHOLDER": "输入城市名称"
|
"PLACEHOLDER": "输入城市名称"
|
||||||
},
|
},
|
||||||
"COUNTRY": {
|
"COUNTRY": {
|
||||||
"PLACEHOLDER": "Select country"
|
"PLACEHOLDER": "选择国家"
|
||||||
},
|
},
|
||||||
"BIO": {
|
"BIO": {
|
||||||
"PLACEHOLDER": "Enter the bio"
|
"PLACEHOLDER": "输入简历"
|
||||||
},
|
},
|
||||||
"COMPANY_NAME": {
|
"COMPANY_NAME": {
|
||||||
"PLACEHOLDER": "输入公司名称"
|
"PLACEHOLDER": "输入公司名称"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"UPDATE_BUTTON": "Update contact",
|
"UPDATE_BUTTON": "更新联系人",
|
||||||
"SUCCESS_MESSAGE": "Contact updated successfully",
|
"SUCCESS_MESSAGE": "联系人更新成功",
|
||||||
"ERROR_MESSAGE": "Unable to update contact. Please try again later."
|
"ERROR_MESSAGE": "无法更新联系人,请稍后再试。"
|
||||||
},
|
},
|
||||||
"SOCIAL_MEDIA": {
|
"SOCIAL_MEDIA": {
|
||||||
"TITLE": "Edit social links",
|
"TITLE": "编辑社交链接",
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"FACEBOOK": {
|
"FACEBOOK": {
|
||||||
"PLACEHOLDER": "Add Facebook"
|
"PLACEHOLDER": "添加 Facebook"
|
||||||
},
|
},
|
||||||
"GITHUB": {
|
"GITHUB": {
|
||||||
"PLACEHOLDER": "Add Github"
|
"PLACEHOLDER": "添加 Github"
|
||||||
},
|
},
|
||||||
"INSTAGRAM": {
|
"INSTAGRAM": {
|
||||||
"PLACEHOLDER": "Add Instagram"
|
"PLACEHOLDER": "添加 Instagram"
|
||||||
},
|
},
|
||||||
"LINKEDIN": {
|
"LINKEDIN": {
|
||||||
"PLACEHOLDER": "Add LinkedIn"
|
"PLACEHOLDER": "添加 LinkedIn"
|
||||||
},
|
},
|
||||||
"TWITTER": {
|
"TWITTER": {
|
||||||
"PLACEHOLDER": "Add Twitter"
|
"PLACEHOLDER": "添加 Twitter"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DETAILS": {
|
"DETAILS": {
|
||||||
"CREATED_AT": "Created {date}",
|
"CREATED_AT": "创建于 {date}",
|
||||||
"LAST_ACTIVITY": "Last active {date}",
|
"LAST_ACTIVITY": "上次活动于 {date}",
|
||||||
"DELETE_CONTACT_DESCRIPTION": "Permanently delete this contact. This action is irreversible",
|
"DELETE_CONTACT_DESCRIPTION": "永久删除此联系人。此操作不可逆",
|
||||||
"DELETE_CONTACT": "删除联系人",
|
"DELETE_CONTACT": "删除联系人",
|
||||||
"DELETE_DIALOG": {
|
"DELETE_DIALOG": {
|
||||||
"TITLE": "确认删除",
|
"TITLE": "确认删除",
|
||||||
"DESCRIPTION": "Are you sure you want to delete this {contactName} contact?",
|
"DESCRIPTION": "您确定要删除此 {contactName} 联系人吗?",
|
||||||
"CONFIRM": "是,删除",
|
"CONFIRM": "是,删除",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "联系人删除成功",
|
"SUCCESS_MESSAGE": "联系人删除成功",
|
||||||
@@ -475,29 +475,29 @@
|
|||||||
},
|
},
|
||||||
"AVATAR": {
|
"AVATAR": {
|
||||||
"UPLOAD": {
|
"UPLOAD": {
|
||||||
"ERROR_MESSAGE": "Could not upload avatar. Please try again later.",
|
"ERROR_MESSAGE": "无法上传头像,请稍后再试。",
|
||||||
"SUCCESS_MESSAGE": "Avatar uploaded successfully"
|
"SUCCESS_MESSAGE": "头像上传成功"
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"SUCCESS_MESSAGE": "Avatar deleted successfully",
|
"SUCCESS_MESSAGE": "头像删除成功",
|
||||||
"ERROR_MESSAGE": "Could not delete avatar. Please try again later."
|
"ERROR_MESSAGE": "无法删除头像,请稍后再试。"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"SIDEBAR": {
|
"SIDEBAR": {
|
||||||
"TABS": {
|
"TABS": {
|
||||||
"ATTRIBUTES": "Attributes",
|
"ATTRIBUTES": "属性",
|
||||||
"HISTORY": "History",
|
"HISTORY": "历史记录",
|
||||||
"NOTES": "备注",
|
"NOTES": "备注",
|
||||||
"MERGE": "Merge"
|
"MERGE": "合并"
|
||||||
},
|
},
|
||||||
"HISTORY": {
|
"HISTORY": {
|
||||||
"EMPTY_STATE": "There are no previous conversations associated to this contact"
|
"EMPTY_STATE": "此联系人没有关联到以前的对话"
|
||||||
},
|
},
|
||||||
"ATTRIBUTES": {
|
"ATTRIBUTES": {
|
||||||
"SEARCH_PLACEHOLDER": "Search for attributes",
|
"SEARCH_PLACEHOLDER": "搜索属性",
|
||||||
"UNUSED_ATTRIBUTES": "{count} Used attribute | {count} Unused attributes",
|
"UNUSED_ATTRIBUTES": "{count} 个已用属性 | {count} 个未用属性",
|
||||||
"EMPTY_STATE": "There are no contact custom attributes available in this account. You can create a custom attribute in settings.",
|
"EMPTY_STATE": "此账户中没有可用的联系人自定义属性。您可以在设置中创建自定义属性。",
|
||||||
"YES": "是",
|
"YES": "是",
|
||||||
"NO": "否",
|
"NO": "否",
|
||||||
"TRIGGER": {
|
"TRIGGER": {
|
||||||
@@ -505,11 +505,11 @@
|
|||||||
"INPUT": "填写内容"
|
"INPUT": "填写内容"
|
||||||
},
|
},
|
||||||
"VALIDATIONS": {
|
"VALIDATIONS": {
|
||||||
"INVALID_NUMBER": "Invalid number",
|
"INVALID_NUMBER": "无效的数字",
|
||||||
"REQUIRED": "需要有效的值",
|
"REQUIRED": "需要有效的值",
|
||||||
"INVALID_INPUT": "Invalid input",
|
"INVALID_INPUT": "无效输入",
|
||||||
"INVALID_URL": "无效的 URL",
|
"INVALID_URL": "无效的 URL",
|
||||||
"INVALID_DATE": "Invalid date"
|
"INVALID_DATE": "无效日期"
|
||||||
},
|
},
|
||||||
"NO_ATTRIBUTES": "未找到属性",
|
"NO_ATTRIBUTES": "未找到属性",
|
||||||
"API": {
|
"API": {
|
||||||
@@ -521,16 +521,16 @@
|
|||||||
},
|
},
|
||||||
"MERGE": {
|
"MERGE": {
|
||||||
"TITLE": "合并联系人",
|
"TITLE": "合并联系人",
|
||||||
"DESCRIPTION": "Combine two profiles into one, including all attributes and conversations. In case of conflict, the primary contact’s attributes will take precedence.",
|
"DESCRIPTION": "将两个个人资料合并为一个,包括所有属性和对话。如果发生冲突,将以主联系人的属性为优先。",
|
||||||
"PRIMARY": "主联系人",
|
"PRIMARY": "主联系人",
|
||||||
"PRIMARY_HELP_LABEL": "To be saved",
|
"PRIMARY_HELP_LABEL": "将被保留",
|
||||||
"PRIMARY_REQUIRED_ERROR": "Please select a contact to merge with before proceeding",
|
"PRIMARY_REQUIRED_ERROR": "请选择一个联系人进行合并",
|
||||||
"PARENT": "To be merged",
|
"PARENT": "需要合并的联系人",
|
||||||
"PARENT_HELP_LABEL": "将被删除",
|
"PARENT_HELP_LABEL": "将被删除",
|
||||||
"EMPTY_STATE": "No contacts found",
|
"EMPTY_STATE": "未找到联系人",
|
||||||
"PLACEHOLDER": "Search for primary contact",
|
"PLACEHOLDER": "搜索主联系人",
|
||||||
"SEARCH_PLACEHOLDER": "搜索联系人",
|
"SEARCH_PLACEHOLDER": "搜索联系人",
|
||||||
"SEARCH_ERROR_MESSAGE": "Could not search for contacts. Please try again later.",
|
"SEARCH_ERROR_MESSAGE": "无法搜索联系人,请稍后再试。",
|
||||||
"SUCCESS_MESSAGE": "已成功合并联系人",
|
"SUCCESS_MESSAGE": "已成功合并联系人",
|
||||||
"ERROR_MESSAGE": "无法合并联系人,请重试!",
|
"ERROR_MESSAGE": "无法合并联系人,请重试!",
|
||||||
"IS_SEARCHING": "搜索中...",
|
"IS_SEARCHING": "搜索中...",
|
||||||
@@ -541,64 +541,64 @@
|
|||||||
},
|
},
|
||||||
"NOTES": {
|
"NOTES": {
|
||||||
"PLACEHOLDER": "添加备注",
|
"PLACEHOLDER": "添加备注",
|
||||||
"WROTE": "wrote",
|
"WROTE": "写道",
|
||||||
"YOU": "您",
|
"YOU": "您",
|
||||||
"SAVE": "Save note",
|
"SAVE": "保存备注",
|
||||||
"EMPTY_STATE": "There are no notes associated to this contact. You can add a note by typing in the box above."
|
"EMPTY_STATE": "此联系人没有关联的备注。您可以在上方输入框中添加备注。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EMPTY_STATE": {
|
"EMPTY_STATE": {
|
||||||
"TITLE": "No contacts found in this account",
|
"TITLE": "此账户中没有找到联系人",
|
||||||
"SUBTITLE": "Start adding new contacts by clicking on the button below",
|
"SUBTITLE": "点击下方按钮开始添加新联系人",
|
||||||
"BUTTON_LABEL": "Add contact",
|
"BUTTON_LABEL": "添加联系人",
|
||||||
"SEARCH_EMPTY_STATE_TITLE": "没有搜索到联系人🔍",
|
"SEARCH_EMPTY_STATE_TITLE": "没有搜索到联系人🔍",
|
||||||
"LIST_EMPTY_STATE_TITLE": "No contacts available in this view 📋"
|
"LIST_EMPTY_STATE_TITLE": "此视图中没有可用的联系人📋"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"COMPOSE_NEW_CONVERSATION": {
|
"COMPOSE_NEW_CONVERSATION": {
|
||||||
"CONTACT_SEARCH": {
|
"CONTACT_SEARCH": {
|
||||||
"ERROR_MESSAGE": "We couldn’t complete the search. Please try again."
|
"ERROR_MESSAGE": "我们无法完成搜索。请稍后再试。"
|
||||||
},
|
},
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"GO_TO_CONVERSATION": "查看",
|
"GO_TO_CONVERSATION": "查看",
|
||||||
"SUCCESS_MESSAGE": "The message was sent successfully!",
|
"SUCCESS_MESSAGE": "消息发送成功!",
|
||||||
"ERROR_MESSAGE": "An error occurred while creating the conversation. Please try again later.",
|
"ERROR_MESSAGE": "创建对话时发生错误。请稍后再试。",
|
||||||
"NO_INBOX_ALERT": "There are no available inboxes to start a conversation with this contact.",
|
"NO_INBOX_ALERT": "没有可用的收件箱来开始与此联系人的对话。",
|
||||||
"CONTACT_SELECTOR": {
|
"CONTACT_SELECTOR": {
|
||||||
"LABEL": "发送至:",
|
"LABEL": "发送至:",
|
||||||
"TAG_INPUT_PLACEHOLDER": "Search for a contact with name, email or phone number",
|
"TAG_INPUT_PLACEHOLDER": "通过姓名、电子邮件或电话号码搜索联系人",
|
||||||
"CONTACT_CREATING": "Creating contact..."
|
"CONTACT_CREATING": "正在创建联系人..."
|
||||||
},
|
},
|
||||||
"INBOX_SELECTOR": {
|
"INBOX_SELECTOR": {
|
||||||
"LABEL": "Via:",
|
"LABEL": "通过:",
|
||||||
"BUTTON": "Show inboxes"
|
"BUTTON": "显示收件箱"
|
||||||
},
|
},
|
||||||
"EMAIL_OPTIONS": {
|
"EMAIL_OPTIONS": {
|
||||||
"SUBJECT_LABEL": "主题 :",
|
"SUBJECT_LABEL": "主题 :",
|
||||||
"SUBJECT_PLACEHOLDER": "Enter your email subject here",
|
"SUBJECT_PLACEHOLDER": "在此处输入电子邮件主题",
|
||||||
"CC_LABEL": "抄送:",
|
"CC_LABEL": "抄送:",
|
||||||
"CC_PLACEHOLDER": "Search for a contact with their email address",
|
"CC_PLACEHOLDER": "通过电子邮件地址搜索联系人",
|
||||||
"BCC_LABEL": "密送:",
|
"BCC_LABEL": "密送:",
|
||||||
"BCC_PLACEHOLDER": "Search for a contact with their email address",
|
"BCC_PLACEHOLDER": "通过电子邮件地址搜索联系人",
|
||||||
"BCC_BUTTON": "密送"
|
"BCC_BUTTON": "密送"
|
||||||
},
|
},
|
||||||
"MESSAGE_EDITOR": {
|
"MESSAGE_EDITOR": {
|
||||||
"PLACEHOLDER": "在此处输入您的消息..."
|
"PLACEHOLDER": "在此处输入您的消息..."
|
||||||
},
|
},
|
||||||
"WHATSAPP_OPTIONS": {
|
"WHATSAPP_OPTIONS": {
|
||||||
"LABEL": "Select template",
|
"LABEL": "选择模板",
|
||||||
"SEARCH_PLACEHOLDER": "Search templates",
|
"SEARCH_PLACEHOLDER": "搜索模板",
|
||||||
"EMPTY_STATE": "No templates found",
|
"EMPTY_STATE": "未找到模板",
|
||||||
"TEMPLATE_PARSER": {
|
"TEMPLATE_PARSER": {
|
||||||
"TEMPLATE_NAME": "WhatsApp template: {templateName}",
|
"TEMPLATE_NAME": "WhatsApp 模板: {templateName}",
|
||||||
"VARIABLES": "参数",
|
"VARIABLES": "参数",
|
||||||
"BACK": "返回",
|
"BACK": "返回",
|
||||||
"SEND_MESSAGE": "发送消息"
|
"SEND_MESSAGE": "发送消息"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ACTION_BUTTONS": {
|
"ACTION_BUTTONS": {
|
||||||
"DISCARD": "Discard",
|
"DISCARD": "丢弃",
|
||||||
"SEND": "Send ({keyCode})"
|
"SEND": "发送 ({keyCode})"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
{
|
{
|
||||||
"CONTACTS_FILTER": {
|
"CONTACTS_FILTER": {
|
||||||
"TITLE": "Filter Contacts",
|
"TITLE": "过滤联系人",
|
||||||
"SUBTITLE": "Add filters below and hit 'Submit' to filter contacts.",
|
"SUBTITLE": "添加过滤器并点击“提交”以过滤联系人。",
|
||||||
"EDIT_CUSTOM_SEGMENT": "Edit Segment",
|
"EDIT_CUSTOM_SEGMENT": "编辑分段",
|
||||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your segment.",
|
"CUSTOM_VIEWS_SUBTITLE": "添加或删除过滤器并更新您的分段。",
|
||||||
"ADD_NEW_FILTER": "添加过滤器",
|
"ADD_NEW_FILTER": "添加过滤器",
|
||||||
"CLEAR_ALL_FILTERS": "Clear All Filters",
|
"CLEAR_ALL_FILTERS": "清除所有过滤器",
|
||||||
"FILTER_DELETE_ERROR": "您至少需要一个过滤器来保存",
|
"FILTER_DELETE_ERROR": "您至少需要一个过滤器来保存",
|
||||||
"SUBMIT_BUTTON_LABEL": "提交",
|
"SUBMIT_BUTTON_LABEL": "提交",
|
||||||
"UPDATE_BUTTON_LABEL": "Update Segment",
|
"UPDATE_BUTTON_LABEL": "更新分段",
|
||||||
"CANCEL_BUTTON_LABEL": "取消",
|
"CANCEL_BUTTON_LABEL": "取消",
|
||||||
"CLEAR_BUTTON_LABEL": "清除过滤器",
|
"CLEAR_BUTTON_LABEL": "清除过滤器",
|
||||||
"EMPTY_VALUE_ERROR": "必须填写值",
|
"EMPTY_VALUE_ERROR": "必须填写值",
|
||||||
"SEGMENT_LABEL": "Segment Name",
|
"SEGMENT_LABEL": "分段名称",
|
||||||
"SEGMENT_QUERY_LABEL": "Segment Query",
|
"SEGMENT_QUERY_LABEL": "分段查询",
|
||||||
"TOOLTIP_LABEL": "Filter contacts",
|
"TOOLTIP_LABEL": "过滤联系人",
|
||||||
"QUERY_DROPDOWN_LABELS": {
|
"QUERY_DROPDOWN_LABELS": {
|
||||||
"AND": "和",
|
"AND": "和",
|
||||||
"OR": "或"
|
"OR": "或"
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
"is_present": "存在",
|
"is_present": "存在",
|
||||||
"is_not_present": "不存在",
|
"is_not_present": "不存在",
|
||||||
"is_greater_than": "大于",
|
"is_greater_than": "大于",
|
||||||
"is_lesser_than": "Is lesser than",
|
"is_lesser_than": "小于",
|
||||||
"days_before": "是 x 天前"
|
"days_before": "是 x 天前"
|
||||||
},
|
},
|
||||||
"ERRORS": {
|
"ERRORS": {
|
||||||
@@ -35,9 +35,9 @@
|
|||||||
},
|
},
|
||||||
"ATTRIBUTES": {
|
"ATTRIBUTES": {
|
||||||
"NAME": "姓名:",
|
"NAME": "姓名:",
|
||||||
"EMAIL": "Email",
|
"EMAIL": "电子邮件",
|
||||||
"PHONE_NUMBER": "电话号码",
|
"PHONE_NUMBER": "电话号码",
|
||||||
"IDENTIFIER": "Identifier",
|
"IDENTIFIER": "标识符",
|
||||||
"CITY": "城市",
|
"CITY": "城市",
|
||||||
"COUNTRY": "国家",
|
"COUNTRY": "国家",
|
||||||
"CUSTOM_ATTRIBUTE_LIST": "列表",
|
"CUSTOM_ATTRIBUTE_LIST": "列表",
|
||||||
@@ -47,8 +47,8 @@
|
|||||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "复选框",
|
"CUSTOM_ATTRIBUTE_CHECKBOX": "复选框",
|
||||||
"CREATED_AT": "创建于",
|
"CREATED_AT": "创建于",
|
||||||
"LAST_ACTIVITY": "最后一次活动",
|
"LAST_ACTIVITY": "最后一次活动",
|
||||||
"REFERER_LINK": "Referrer link",
|
"REFERER_LINK": "引用链接",
|
||||||
"BLOCKED": "Blocked"
|
"BLOCKED": "已阻止"
|
||||||
},
|
},
|
||||||
"GROUPS": {
|
"GROUPS": {
|
||||||
"STANDARD_FILTERS": "标准过滤器",
|
"STANDARD_FILTERS": "标准过滤器",
|
||||||
|
|||||||
@@ -38,23 +38,23 @@
|
|||||||
"REMOVE_SELECTION": "移除选择",
|
"REMOVE_SELECTION": "移除选择",
|
||||||
"DOWNLOAD": "下载",
|
"DOWNLOAD": "下载",
|
||||||
"UNKNOWN_FILE_TYPE": "未知文件",
|
"UNKNOWN_FILE_TYPE": "未知文件",
|
||||||
"SAVE_CONTACT": "Save Contact",
|
"SAVE_CONTACT": "保存联系人",
|
||||||
"NO_CONTENT": "No content to display",
|
"NO_CONTENT": "没有要显示的内容",
|
||||||
"SHARED_ATTACHMENT": {
|
"SHARED_ATTACHMENT": {
|
||||||
"CONTACT": "{sender} has shared a contact",
|
"CONTACT": "{sender} 分享了一个联系人",
|
||||||
"LOCATION": "{sender} has shared a location",
|
"LOCATION": "{sender} 分享了一个地址",
|
||||||
"FILE": "{sender} has shared a file",
|
"FILE": "{sender} 分享了一个文件",
|
||||||
"MEETING": "{sender} 已开始会议"
|
"MEETING": "{sender} 已开始会议"
|
||||||
},
|
},
|
||||||
"UPLOADING_ATTACHMENTS": "正在上传附件...",
|
"UPLOADING_ATTACHMENTS": "正在上传附件...",
|
||||||
"REPLIED_TO_STORY": "回复您的故事",
|
"REPLIED_TO_STORY": "回复您的故事",
|
||||||
"UNSUPPORTED_MESSAGE": "This message is unsupported. You can view this message on the Facebook / Instagram app.",
|
"UNSUPPORTED_MESSAGE": "不支持此消息。您可以在 Facebook Messenger 应用上查看此消息。",
|
||||||
"UNSUPPORTED_MESSAGE_FACEBOOK": "不支持此消息。您可以在 Facebook Messenger 应用上查看此消息。",
|
"UNSUPPORTED_MESSAGE_FACEBOOK": "不支持此消息。您可以在 Facebook Messenger 应用上查看此消息。",
|
||||||
"UNSUPPORTED_MESSAGE_INSTAGRAM": "不支持此消息。您可以在 Instagram 应用上查看此消息。",
|
"UNSUPPORTED_MESSAGE_INSTAGRAM": "不支持此消息。您可以在 Instagram 应用上查看此消息。",
|
||||||
"SUCCESS_DELETE_MESSAGE": "已成功删除消息",
|
"SUCCESS_DELETE_MESSAGE": "已成功删除消息",
|
||||||
"FAIL_DELETE_MESSSAGE": "无法删除消息,请重试!",
|
"FAIL_DELETE_MESSSAGE": "无法删除消息,请重试!",
|
||||||
"NO_RESPONSE": "无响应",
|
"NO_RESPONSE": "无响应",
|
||||||
"RESPONSE": "Response",
|
"RESPONSE": "回复",
|
||||||
"RATING_TITLE": "评分",
|
"RATING_TITLE": "评分",
|
||||||
"FEEDBACK_TITLE": "Feedback",
|
"FEEDBACK_TITLE": "Feedback",
|
||||||
"REPLY_MESSAGE_NOT_FOUND": "消息不可用",
|
"REPLY_MESSAGE_NOT_FOUND": "消息不可用",
|
||||||
@@ -77,8 +77,8 @@
|
|||||||
"FRT": "第一响应时间 {status}",
|
"FRT": "第一响应时间 {status}",
|
||||||
"NRT": "净响应时间 {status}",
|
"NRT": "净响应时间 {status}",
|
||||||
"RT": "响应时间 {status}",
|
"RT": "响应时间 {status}",
|
||||||
"MISSED": "missed",
|
"MISSED": "遗漏",
|
||||||
"DUE": "due"
|
"DUE": "过期"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"RESOLVE_DROPDOWN": {
|
"RESOLVE_DROPDOWN": {
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
"TITLE": "优先级",
|
"TITLE": "优先级",
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"NONE": "啥都没有",
|
"NONE": "啥都没有",
|
||||||
"URGENT": "Urgent",
|
"URGENT": "紧急的",
|
||||||
"HIGH": "高",
|
"HIGH": "高",
|
||||||
"MEDIUM": "中",
|
"MEDIUM": "中",
|
||||||
"LOW": "低"
|
"LOW": "低"
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
"SELECT_PLACEHOLDER": "啥都没有",
|
"SELECT_PLACEHOLDER": "啥都没有",
|
||||||
"INPUT_PLACEHOLDER": "选择优先级",
|
"INPUT_PLACEHOLDER": "选择优先级",
|
||||||
"NO_RESULTS": "没有检索到相关信息",
|
"NO_RESULTS": "没有检索到相关信息",
|
||||||
"SUCCESSFUL": "Changed priority of conversation id {conversationId} to {priority}",
|
"SUCCESSFUL": "已将对话 Id {conversationId} 的优先级更改为 {priority}",
|
||||||
"FAILED": "无法更改优先级。请重试。"
|
"FAILED": "无法更改优先级。请重试。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -117,7 +117,7 @@
|
|||||||
"PENDING": "标记为待处理",
|
"PENDING": "标记为待处理",
|
||||||
"RESOLVED": "标记为已解决",
|
"RESOLVED": "标记为已解决",
|
||||||
"MARK_AS_UNREAD": "标记为未读",
|
"MARK_AS_UNREAD": "标记为未读",
|
||||||
"MARK_AS_READ": "Mark as read",
|
"MARK_AS_READ": "标记为已读",
|
||||||
"REOPEN": "重新打开会话",
|
"REOPEN": "重新打开会话",
|
||||||
"SNOOZE": {
|
"SNOOZE": {
|
||||||
"TITLE": "推迟",
|
"TITLE": "推迟",
|
||||||
@@ -135,7 +135,7 @@
|
|||||||
"FAILED": "无法分配客服,请再试。"
|
"FAILED": "无法分配客服,请再试。"
|
||||||
},
|
},
|
||||||
"LABEL_ASSIGNMENT": {
|
"LABEL_ASSIGNMENT": {
|
||||||
"SUCCESFUL": "Assigned label #{labelName} to conversation id {conversationId}",
|
"SUCCESFUL": "已为对话 Id {conversationId} 分配标签 #{labelName}",
|
||||||
"FAILED": "无法分配标签。请再试。"
|
"FAILED": "无法分配标签。请再试。"
|
||||||
},
|
},
|
||||||
"TEAM_ASSIGNMENT": {
|
"TEAM_ASSIGNMENT": {
|
||||||
@@ -254,9 +254,9 @@
|
|||||||
"ONBOARDING": {
|
"ONBOARDING": {
|
||||||
"TITLE": "您好 👋, 欢迎来到 {installationName}!",
|
"TITLE": "您好 👋, 欢迎来到 {installationName}!",
|
||||||
"DESCRIPTION": "感谢您注册。我们希望您能够充分使用 {installationName}。 这里有几件您可以在 {installationName} 做的事情,让体验变得愉快。",
|
"DESCRIPTION": "感谢您注册。我们希望您能够充分使用 {installationName}。 这里有几件您可以在 {installationName} 做的事情,让体验变得愉快。",
|
||||||
"GREETING_MORNING": "👋 Good morning, {name}. Welcome to {installationName}.",
|
"GREETING_MORNING": "👋 早上好,{name}。欢迎来到 {installationName}。",
|
||||||
"GREETING_AFTERNOON": "👋 Good afternoon, {name}. Welcome to {installationName}.",
|
"GREETING_AFTERNOON": "👋 下午好,{name}。欢迎来到 {installationName}。",
|
||||||
"GREETING_EVENING": "👋 Good evening, {name}. Welcome to {installationName}.",
|
"GREETING_EVENING": "👋 晚上好,{name}。欢迎来到 {installationName}。",
|
||||||
"READ_LATEST_UPDATES": "阅读我们的最新升级日志",
|
"READ_LATEST_UPDATES": "阅读我们的最新升级日志",
|
||||||
"ALL_CONVERSATION": {
|
"ALL_CONVERSATION": {
|
||||||
"TITLE": "您的所有对话都在一个地方",
|
"TITLE": "您的所有对话都在一个地方",
|
||||||
@@ -274,9 +274,9 @@
|
|||||||
"NEW_LINK": "点击此处创建标签"
|
"NEW_LINK": "点击此处创建标签"
|
||||||
},
|
},
|
||||||
"CANNED_RESPONSES": {
|
"CANNED_RESPONSES": {
|
||||||
"TITLE": "Create canned responses",
|
"TITLE": "创建预设回复",
|
||||||
"DESCRIPTION": "Pre-written quick reply templates help you quickly respond to a conversation. Agents can type the '/' character followed by the shortcode to insert a response.",
|
"DESCRIPTION": "预定义的快捷回复模板可以帮助您快速响应对话。客服人员只需输入“/”符号,后跟快捷代码,即可插入回复。",
|
||||||
"NEW_LINK": "Click here to create a canned response"
|
"NEW_LINK": "点击这里创建预设回复"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CONVERSATION_SIDEBAR": {
|
"CONVERSATION_SIDEBAR": {
|
||||||
@@ -324,7 +324,7 @@
|
|||||||
"BCC": "密送",
|
"BCC": "密送",
|
||||||
"CC": "抄送",
|
"CC": "抄送",
|
||||||
"SUBJECT": "主题",
|
"SUBJECT": "主题",
|
||||||
"EXPAND": "Expand email"
|
"EXPAND": "展开邮箱"
|
||||||
},
|
},
|
||||||
"CONVERSATION_PARTICIPANTS": {
|
"CONVERSATION_PARTICIPANTS": {
|
||||||
"SIDEBAR_MENU_TITLE": "参与者",
|
"SIDEBAR_MENU_TITLE": "参与者",
|
||||||
@@ -351,14 +351,14 @@
|
|||||||
"NO_TRANSLATIONS_AVAILABLE": "此内容暂无翻译"
|
"NO_TRANSLATIONS_AVAILABLE": "此内容暂无翻译"
|
||||||
},
|
},
|
||||||
"TYPING": {
|
"TYPING": {
|
||||||
"ONE": "{user} is typing",
|
"ONE": "{user} 正在输入",
|
||||||
"TWO": "{user} and {secondUser} are typing",
|
"TWO": "{user} 和 {secondUser} 正在输入",
|
||||||
"MULTIPLE": "{user} and {count} others are typing"
|
"MULTIPLE": "{user} 等 {count} 人正在输入"
|
||||||
},
|
},
|
||||||
"COPILOT": {
|
"COPILOT": {
|
||||||
"TRY_THESE_PROMPTS": "Try these prompts"
|
"TRY_THESE_PROMPTS": "尝试这些提示信息"
|
||||||
},
|
},
|
||||||
"GALLERY_VIEW": {
|
"GALLERY_VIEW": {
|
||||||
"ERROR_DOWNLOADING": "Unable to download attachment. Please try again"
|
"ERROR_DOWNLOADING": "无法上传附件。请重试"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,11 @@
|
|||||||
"TITLE": "评价您的对话",
|
"TITLE": "评价您的对话",
|
||||||
"PLACEHOLDER": "请告诉我们更多...",
|
"PLACEHOLDER": "请告诉我们更多...",
|
||||||
"RATINGS": {
|
"RATINGS": {
|
||||||
"POOR": "😞 Poor",
|
"POOR": "😞 差",
|
||||||
"FAIR": "😑 Fair",
|
"FAIR": "😑 一般",
|
||||||
"AVERAGE": "😐 Average",
|
"AVERAGE": "😐 中等",
|
||||||
"GOOD": "😀 Good",
|
"GOOD": "😀 好",
|
||||||
"EXCELLENT": "😍 Excellent"
|
"EXCELLENT": "😍 非常好"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,56 +1,56 @@
|
|||||||
{
|
{
|
||||||
"CUSTOM_ROLE": {
|
"CUSTOM_ROLE": {
|
||||||
"HEADER": "Custom Roles",
|
"HEADER": "自定义角色",
|
||||||
"LEARN_MORE": "Learn more about custom roles",
|
"LEARN_MORE": "了解更多关于自定义角色的信息",
|
||||||
"DESCRIPTION": "Custom roles are roles that are created by the account owner or admin. These roles can be assigned to agents to define their access and permissions within the account. Custom roles can be created with specific permissions and access levels to suit the requirements of the organization.",
|
"DESCRIPTION": "自定义角色是由账户所有者或管理员创建的角色。这些角色可以分配给客服人员,以定义他们在账户中的访问权限和权限。自定义角色可以根据组织的需求创建特定的权限和访问级别。",
|
||||||
"HEADER_BTN_TXT": "Add custom role",
|
"HEADER_BTN_TXT": "添加自定义角色",
|
||||||
"LOADING": "Fetching custom roles...",
|
"LOADING": "正在获取自定义角色……",
|
||||||
"SEARCH_404": "没有任何项目符合此查询.",
|
"SEARCH_404": "没有任何项目符合此查询。",
|
||||||
"PAYWALL": {
|
"PAYWALL": {
|
||||||
"TITLE": "Upgrade to create custom roles",
|
"TITLE": "升级以创建自定义角色",
|
||||||
"AVAILABLE_ON": "The custom role feature is only available in the Business and Enterprise plans.",
|
"AVAILABLE_ON": "自定义角色功能仅在商务版和企业版计划中可用。",
|
||||||
"UPGRADE_PROMPT": "Upgrade your plan to get access to advanced features like team management, automations, custom attributes, and more.",
|
"UPGRADE_PROMPT": "升级您的计划以获取团队管理、自动化、自定义属性等高级功能。",
|
||||||
"UPGRADE_NOW": "Upgrade now",
|
"UPGRADE_NOW": "立即升级",
|
||||||
"CANCEL_ANYTIME": "You can change or cancel your plan anytime"
|
"CANCEL_ANYTIME": "您可以随时更改或取消您的计划"
|
||||||
},
|
},
|
||||||
"ENTERPRISE_PAYWALL": {
|
"ENTERPRISE_PAYWALL": {
|
||||||
"AVAILABLE_ON": "The custom role feature is only available in the paid plans.",
|
"AVAILABLE_ON": "自定义角色功能仅在付费计划中可用。",
|
||||||
"UPGRADE_PROMPT": "Upgrade to a paid plan to access advanced features like audit logs, agent capacity, and more.",
|
"UPGRADE_PROMPT": "升级到付费计划以访问审计日志、客服容量等高级功能。",
|
||||||
"ASK_ADMIN": "Please reach out to your administrator for the upgrade."
|
"ASK_ADMIN": "请联系您的管理员进行升级。"
|
||||||
},
|
},
|
||||||
"LIST": {
|
"LIST": {
|
||||||
"404": "There are no custom roles available in this account.",
|
"404": "此账户中没有可用的自定义角色。",
|
||||||
"TITLE": "Manage custom roles",
|
"TITLE": "管理自定义角色",
|
||||||
"DESC": "Custom roles are roles that are created by the account owner or admin. These roles can be assigned to agents to define their access and permissions within the account. Custom roles can be created with specific permissions and access levels to suit the requirements of the organization.",
|
"DESC": "自定义角色是由账户所有者或管理员创建的角色。这些角色可以分配给客服人员,以定义他们在账户中的访问权限和权限。自定义角色可以根据组织的需求创建特定的权限和访问级别。",
|
||||||
"TABLE_HEADER": {
|
"TABLE_HEADER": {
|
||||||
"NAME": "姓名:",
|
"NAME": "姓名",
|
||||||
"DESCRIPTION": "描述信息",
|
"DESCRIPTION": "描述",
|
||||||
"PERMISSIONS": "Permissions",
|
"PERMISSIONS": "权限",
|
||||||
"ACTIONS": "操作"
|
"ACTIONS": "操作"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"PERMISSIONS": {
|
"PERMISSIONS": {
|
||||||
"CONVERSATION_MANAGE": "Manage all conversations",
|
"CONVERSATION_MANAGE": "管理所有对话",
|
||||||
"CONVERSATION_UNASSIGNED_MANAGE": "Manage unassigned conversations and those assigned to them",
|
"CONVERSATION_UNASSIGNED_MANAGE": "管理未分配的对话及分配给他们的对话",
|
||||||
"CONVERSATION_PARTICIPATING_MANAGE": "Manage participating conversations and those assigned to them",
|
"CONVERSATION_PARTICIPATING_MANAGE": "管理参与的对话及分配给他们的对话",
|
||||||
"CONTACT_MANAGE": "Manage contacts",
|
"CONTACT_MANAGE": "管理联系人",
|
||||||
"REPORT_MANAGE": "Manage reports",
|
"REPORT_MANAGE": "管理报告",
|
||||||
"KNOWLEDGE_BASE_MANAGE": "Manage knowledge base"
|
"KNOWLEDGE_BASE_MANAGE": "管理知识库"
|
||||||
},
|
},
|
||||||
"FORM": {
|
"FORM": {
|
||||||
"NAME": {
|
"NAME": {
|
||||||
"LABEL": "姓名:",
|
"LABEL": "姓名",
|
||||||
"PLACEHOLDER": "Please enter a name.",
|
"PLACEHOLDER": "请输入名称。",
|
||||||
"ERROR": "名称是必填项."
|
"ERROR": "名称是必填项。"
|
||||||
},
|
},
|
||||||
"DESCRIPTION": {
|
"DESCRIPTION": {
|
||||||
"LABEL": "描述信息",
|
"LABEL": "描述",
|
||||||
"PLACEHOLDER": "Please enter a description.",
|
"PLACEHOLDER": "请输入描述。",
|
||||||
"ERROR": "描述是必需的."
|
"ERROR": "描述是必需的。"
|
||||||
},
|
},
|
||||||
"PERMISSIONS": {
|
"PERMISSIONS": {
|
||||||
"LABEL": "Permissions",
|
"LABEL": "权限",
|
||||||
"ERROR": "Permissions are required."
|
"ERROR": "权限是必需的。"
|
||||||
},
|
},
|
||||||
"CANCEL_BUTTON_TEXT": "取消",
|
"CANCEL_BUTTON_TEXT": "取消",
|
||||||
"API": {
|
"API": {
|
||||||
@@ -58,33 +58,33 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ADD": {
|
"ADD": {
|
||||||
"TITLE": "Add custom role",
|
"TITLE": "添加自定义角色",
|
||||||
"DESC": " Custom roles allows you to create roles with specific permissions and access levels to suit the requirements of the organization.",
|
"DESC": "自定义角色允许您创建具有特定权限和访问级别的角色,以满足组织的需求。",
|
||||||
"SUBMIT": "提交",
|
"SUBMIT": "提交",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Custom role added successfully."
|
"SUCCESS_MESSAGE": "自定义角色添加成功。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"EDIT": {
|
"EDIT": {
|
||||||
"BUTTON_TEXT": "编辑",
|
"BUTTON_TEXT": "编辑",
|
||||||
"TITLE": "Edit custom role",
|
"TITLE": "编辑自定义角色",
|
||||||
"DESC": " Custom roles allows you to create roles with specific permissions and access levels to suit the requirements of the organization.",
|
"DESC": "自定义角色允许您创建具有特定权限和访问级别的角色,以满足组织的需求。",
|
||||||
"SUBMIT": "更新",
|
"SUBMIT": "更新",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Custom role updated successfully."
|
"SUCCESS_MESSAGE": "自定义角色更新成功。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"DELETE": {
|
"DELETE": {
|
||||||
"BUTTON_TEXT": "删除",
|
"BUTTON_TEXT": "删除",
|
||||||
"API": {
|
"API": {
|
||||||
"SUCCESS_MESSAGE": "Custom role deleted successfully.",
|
"SUCCESS_MESSAGE": "自定义角色删除成功。",
|
||||||
"ERROR_MESSAGE": "无法与 Woot 服务器建立连接。请重试。"
|
"ERROR_MESSAGE": "无法与 Woot 服务器建立连接。请重试。"
|
||||||
},
|
},
|
||||||
"CONFIRM": {
|
"CONFIRM": {
|
||||||
"TITLE": "确认删除",
|
"TITLE": "确认删除",
|
||||||
"MESSAGE": "您确定要删除吗? ",
|
"MESSAGE": "您确定要删除吗?",
|
||||||
"YES": "是的,删除",
|
"YES": "是的,删除",
|
||||||
"NO": "不,保留 "
|
"NO": "不,保留"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
{
|
{
|
||||||
"DATE_PICKER": {
|
"DATE_PICKER": {
|
||||||
"APPLY_BUTTON": "Apply",
|
"APPLY_BUTTON": "应用",
|
||||||
"CLEAR_BUTTON": "Clear",
|
"CLEAR_BUTTON": "清除",
|
||||||
"DATE_RANGE_INPUT": {
|
"DATE_RANGE_INPUT": {
|
||||||
"START": "Start Date",
|
"START": "开始日期",
|
||||||
"END": "End Date"
|
"END": "结束时间"
|
||||||
},
|
},
|
||||||
"DATE_RANGE_OPTIONS": {
|
"DATE_RANGE_OPTIONS": {
|
||||||
"TITLE": "DATE RANGE",
|
"TITLE": "日期范围",
|
||||||
"LAST_7_DAYS": "最近7天",
|
"LAST_7_DAYS": "最近7天",
|
||||||
"LAST_30_DAYS": "最近30天",
|
"LAST_30_DAYS": "最近30天",
|
||||||
"LAST_3_MONTHS": "Last 3 months",
|
"LAST_3_MONTHS": "最近3个月",
|
||||||
"LAST_6_MONTHS": "Last 6 months",
|
"LAST_6_MONTHS": "最近6个月",
|
||||||
"LAST_YEAR": "Last year",
|
"LAST_YEAR": "最近一年",
|
||||||
"CUSTOM_RANGE": "Custom date range"
|
"CUSTOM_RANGE": "自定义日期范围"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"GENERAL": {
|
"GENERAL": {
|
||||||
"SHOWING_RESULTS": "Showing {firstIndex}-{lastIndex} of {totalCount} items",
|
"SHOWING_RESULTS": "显示第 {firstIndex} - {lastIndex} 项,共 {totalCount} 项",
|
||||||
"PHONE_INPUT": {
|
"PHONE_INPUT": {
|
||||||
"PLACEHOLDER": "搜索",
|
"PLACEHOLDER": "搜索",
|
||||||
"EMPTY_STATE": "没有检索到相关信息"
|
"EMPTY_STATE": "没有检索到相关信息"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user