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