Compare commits
25
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9ce1175d9d | ||
|
|
595e6e79f0 | ||
|
|
93d8157a55 | ||
|
|
6bea2cbc4a | ||
|
|
afb7e67795 | ||
|
|
bc813b71dd | ||
|
|
9ac4a1eb30 | ||
|
|
9bb455ec2d | ||
|
|
c410fe333a | ||
|
|
5e807c5875 | ||
|
|
9bed57c7d1 | ||
|
|
5c5381c0a9 | ||
|
|
138630b4ae | ||
|
|
9d0de04f7c | ||
|
|
2c3337b117 | ||
|
|
237358af24 | ||
|
|
35dfff0a5b | ||
|
|
86b2896333 | ||
|
|
e8a27bea4b | ||
|
|
0d465362ac | ||
|
|
e383e9259b | ||
|
|
2c34dca347 | ||
|
|
69b9123963 | ||
|
|
cac9fe1880 | ||
|
|
06ac7c829b |
@@ -0,0 +1,23 @@
|
||||
# ref: https://github.com/amannn/action-semantic-pull-request
|
||||
# ensure PR title is in semantic format
|
||||
|
||||
name: "Lint PR"
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
types:
|
||||
- opened
|
||||
- edited
|
||||
- synchronize
|
||||
|
||||
permissions:
|
||||
pull-requests: read
|
||||
|
||||
jobs:
|
||||
main:
|
||||
name: Validate PR title
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: amannn/action-semantic-pull-request@v5
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -1,5 +1,4 @@
|
||||
class Api::V1::Accounts::Conversations::BaseController < Api::V1::Accounts::BaseController
|
||||
include EnsureCurrentAccountHelper
|
||||
before_action :conversation
|
||||
|
||||
private
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
class Api::V1::Accounts::CustomFiltersController < Api::V1::Accounts::BaseController
|
||||
before_action :check_authorization
|
||||
before_action :fetch_custom_filters, except: [:create]
|
||||
before_action :fetch_custom_filter, only: [:show, :update, :destroy]
|
||||
DEFAULT_FILTER_TYPE = 'conversation'.freeze
|
||||
|
||||
@@ -155,9 +155,9 @@ class ConversationFinder
|
||||
end
|
||||
|
||||
def conversations
|
||||
@conversations = @conversations.includes(:taggings, :inbox,
|
||||
{ assignee: [{ account_users: [:account] }, { avatar_attachment: [:blob] }] },
|
||||
{ contact: { avatar_attachment: [:blob] } }, :team, :contact_inbox, :messages)
|
||||
@conversations = @conversations.includes(
|
||||
:taggings, :inbox, { assignee: { avatar_attachment: [:blob] } }, { contact: { avatar_attachment: [:blob] } }, :team, :contact_inbox
|
||||
)
|
||||
sort_by = SORT_OPTIONS[params[:sort_by]] || SORT_OPTIONS['latest']
|
||||
@conversations.send(sort_by).page(current_page)
|
||||
end
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
module BillingHelper
|
||||
private
|
||||
|
||||
def default_plan?(account)
|
||||
installation_config = InstallationConfig.find_by(name: 'CHATWOOT_CLOUD_PLANS')
|
||||
default_plan = installation_config&.value&.first
|
||||
|
||||
# Return false if not plans are configured, so that no checks are enforced
|
||||
return false if default_plan.blank?
|
||||
|
||||
account.custom_attributes['plan_name'].nil? || account.custom_attributes['plan_name'] == default_plan['name']
|
||||
end
|
||||
|
||||
def conversations_this_month(account)
|
||||
account.conversations.where('created_at > ?', 30.days.ago).count
|
||||
end
|
||||
|
||||
def non_web_inboxes(account)
|
||||
account.inboxes.where.not(channel_type: Channel::WebWidget.to_s).count
|
||||
end
|
||||
end
|
||||
@@ -6,6 +6,10 @@
|
||||
:class="{ 'app-rtl--wrapper': isRTLView }"
|
||||
>
|
||||
<update-banner :latest-chatwoot-version="latestChatwootVersion" />
|
||||
<template v-if="!accountUIFlags.isFetchingItem && currentAccountId">
|
||||
<payment-pending-banner />
|
||||
<upgrade-banner />
|
||||
</template>
|
||||
<transition name="fade" mode="out-in">
|
||||
<router-view />
|
||||
</transition>
|
||||
@@ -25,6 +29,8 @@ import AddAccountModal from '../dashboard/components/layout/sidebarComponents/Ad
|
||||
import LoadingState from './components/widgets/LoadingState.vue';
|
||||
import NetworkNotification from './components/NetworkNotification';
|
||||
import UpdateBanner from './components/app/UpdateBanner.vue';
|
||||
import UpgradeBanner from './components/app/UpgradeBanner.vue';
|
||||
import PaymentPendingBanner from './components/app/PaymentPendingBanner.vue';
|
||||
import vueActionCable from './helper/actionCable';
|
||||
import WootSnackbarBox from './components/SnackbarContainer';
|
||||
import rtlMixin from 'shared/mixins/rtlMixin';
|
||||
@@ -41,7 +47,9 @@ export default {
|
||||
LoadingState,
|
||||
NetworkNotification,
|
||||
UpdateBanner,
|
||||
PaymentPendingBanner,
|
||||
WootSnackbarBox,
|
||||
UpgradeBanner,
|
||||
},
|
||||
|
||||
mixins: [rtlMixin],
|
||||
@@ -59,6 +67,7 @@ export default {
|
||||
currentUser: 'getCurrentUser',
|
||||
globalConfig: 'globalConfig/get',
|
||||
authUIFlags: 'getAuthUIFlags',
|
||||
accountUIFlags: 'accounts/getUIFlags',
|
||||
currentAccountId: 'getCurrentAccountId',
|
||||
}),
|
||||
hasAccounts() {
|
||||
|
||||
@@ -13,6 +13,10 @@ class EnterpriseAccountAPI extends ApiClient {
|
||||
subscription() {
|
||||
return axios.post(`${this.url}subscription`);
|
||||
}
|
||||
|
||||
getLimits() {
|
||||
return axios.get(`${this.url}limits`);
|
||||
}
|
||||
}
|
||||
|
||||
export default new EnterpriseAccountAPI();
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
border-radius: var(--border-radius-normal);
|
||||
box-shadow: none;
|
||||
display: flex;
|
||||
height: 4.0rem;
|
||||
height: 4rem;
|
||||
}
|
||||
|
||||
.mx-input:disabled,
|
||||
@@ -35,3 +35,32 @@
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.mx-datepicker-inline {
|
||||
width: 100%;
|
||||
|
||||
.mx-calendar {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.cell.disabled {
|
||||
background-color: var(--s-25);
|
||||
color: var(--s-200);
|
||||
}
|
||||
|
||||
.mx-time-item.disabled {
|
||||
background-color: var(--s-25);
|
||||
}
|
||||
|
||||
.today {
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
|
||||
.mx-datepicker-main {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.mx-time-header {
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,13 +29,13 @@
|
||||
}
|
||||
|
||||
.modal-image {
|
||||
max-height: 80vh;
|
||||
max-width: 80vw;
|
||||
max-height: 76vh;
|
||||
max-width: 76vw;
|
||||
}
|
||||
|
||||
.modal-video {
|
||||
max-height: 80vh;
|
||||
max-width: 80vw;
|
||||
max-height: 76vh;
|
||||
max-width: 76vw;
|
||||
}
|
||||
|
||||
&::before {
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
<template>
|
||||
<div class="column">
|
||||
<woot-modal-header :header-title="$t('CONVERSATION.CUSTOM_SNOOZE.TITLE')" />
|
||||
<form class="row modal-content" @submit.prevent="chooseTime">
|
||||
<date-picker
|
||||
v-model="snoozeTime"
|
||||
type="datetime"
|
||||
inline
|
||||
:lang="lang"
|
||||
:disabled-date="disabledDate"
|
||||
:disabled-time="disabledTime"
|
||||
:popup-style="{ width: '100%' }"
|
||||
/>
|
||||
<div class="modal-footer justify-content-end w-full">
|
||||
<woot-button variant="clear" @click.prevent="onClose">
|
||||
{{ this.$t('CONVERSATION.CUSTOM_SNOOZE.CANCEL') }}
|
||||
</woot-button>
|
||||
<woot-button>
|
||||
{{ this.$t('CONVERSATION.CUSTOM_SNOOZE.APPLY') }}
|
||||
</woot-button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import DatePicker from 'vue2-datepicker';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
DatePicker,
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
snoozeTime: null,
|
||||
lang: {
|
||||
days: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
||||
yearFormat: 'YYYY',
|
||||
monthFormat: 'MMMM',
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
onClose() {
|
||||
this.$emit('close');
|
||||
},
|
||||
chooseTime() {
|
||||
this.$emit('choose-time', this.snoozeTime);
|
||||
},
|
||||
disabledDate(date) {
|
||||
// Disable all the previous dates
|
||||
const yesterday = new Date();
|
||||
yesterday.setDate(yesterday.getDate() - 1);
|
||||
return date < yesterday;
|
||||
},
|
||||
disabledTime(date) {
|
||||
// Allow only time after 1 hour
|
||||
const now = new Date();
|
||||
now.setHours(now.getHours() + 1);
|
||||
return date < now;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.modal-footer {
|
||||
padding: var(--space-two);
|
||||
}
|
||||
.modal-content {
|
||||
padding: var(--space-small) var(--space-two) var(--space-zero);
|
||||
}
|
||||
</style>
|
||||
@@ -8,6 +8,7 @@
|
||||
>
|
||||
<div :class="modalContainerClassName" @click.stop>
|
||||
<woot-button
|
||||
v-if="showCloseButton"
|
||||
color-scheme="secondary"
|
||||
icon="dismiss"
|
||||
variant="clear"
|
||||
@@ -28,6 +29,10 @@ export default {
|
||||
default: true,
|
||||
},
|
||||
show: Boolean,
|
||||
showCloseButton: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
onClose: {
|
||||
type: Function,
|
||||
required: true,
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
<template>
|
||||
<banner
|
||||
v-if="shouldShowBanner"
|
||||
color-scheme="alert"
|
||||
:banner-message="bannerMessage"
|
||||
:action-button-label="actionButtonMessage"
|
||||
has-action-button
|
||||
@click="routeToBilling"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Banner from 'dashboard/components/ui/Banner.vue';
|
||||
import { mapGetters } from 'vuex';
|
||||
import adminMixin from 'dashboard/mixins/isAdmin';
|
||||
import accountMixin from 'dashboard/mixins/account';
|
||||
|
||||
const EMPTY_SUBSCRIPTION_INFO = {
|
||||
status: null,
|
||||
endsOn: null,
|
||||
};
|
||||
|
||||
export default {
|
||||
components: { Banner },
|
||||
mixins: [adminMixin, accountMixin],
|
||||
computed: {
|
||||
...mapGetters({
|
||||
isOnChatwootCloud: 'globalConfig/isOnChatwootCloud',
|
||||
getAccount: 'accounts/getAccount',
|
||||
}),
|
||||
bannerMessage() {
|
||||
return this.$t('GENERAL_SETTINGS.PAYMENT_PENDING');
|
||||
},
|
||||
actionButtonMessage() {
|
||||
return this.$t('GENERAL_SETTINGS.OPEN_BILLING');
|
||||
},
|
||||
shouldShowBanner() {
|
||||
if (!this.isOnChatwootCloud) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this.isAdmin) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return this.isPaymentPending();
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
routeToBilling() {
|
||||
this.$router.push({
|
||||
name: 'billing_settings_index',
|
||||
params: { accountId: this.accountId },
|
||||
});
|
||||
},
|
||||
isPaymentPending() {
|
||||
const { status, endsOn } = this.getSubscriptionInfo();
|
||||
|
||||
if (status && endsOn) {
|
||||
const now = new Date();
|
||||
if (status === 'past_due' && endsOn < now) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
getSubscriptionInfo() {
|
||||
const account = this.getAccount(this.accountId);
|
||||
if (!account) return EMPTY_SUBSCRIPTION_INFO;
|
||||
|
||||
const { custom_attributes: subscription } = account;
|
||||
if (!subscription) return EMPTY_SUBSCRIPTION_INFO;
|
||||
|
||||
const {
|
||||
subscription_status: status,
|
||||
subscription_ends_on: endsOn,
|
||||
} = subscription;
|
||||
|
||||
return { status, endsOn: new Date(endsOn) };
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -0,0 +1,89 @@
|
||||
<template>
|
||||
<banner
|
||||
v-if="shouldShowBanner"
|
||||
color-scheme="alert"
|
||||
:banner-message="bannerMessage"
|
||||
:action-button-label="actionButtonMessage"
|
||||
has-action-button
|
||||
@click="routeToBilling"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Banner from 'dashboard/components/ui/Banner.vue';
|
||||
import { mapGetters } from 'vuex';
|
||||
import adminMixin from 'dashboard/mixins/isAdmin';
|
||||
import accountMixin from 'dashboard/mixins/account';
|
||||
import { differenceInDays } from 'date-fns';
|
||||
|
||||
export default {
|
||||
components: { Banner },
|
||||
mixins: [adminMixin, accountMixin],
|
||||
data() {
|
||||
return { conversationMeta: {} };
|
||||
},
|
||||
computed: {
|
||||
...mapGetters({
|
||||
isOnChatwootCloud: 'globalConfig/isOnChatwootCloud',
|
||||
getAccount: 'accounts/getAccount',
|
||||
}),
|
||||
bannerMessage() {
|
||||
return this.$t('GENERAL_SETTINGS.LIMITS_UPGRADE');
|
||||
},
|
||||
actionButtonMessage() {
|
||||
return this.$t('GENERAL_SETTINGS.OPEN_BILLING');
|
||||
},
|
||||
shouldShowBanner() {
|
||||
if (!this.isOnChatwootCloud) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.isTrialAccount()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return this.isLimitExceeded();
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
if (this.isOnChatwootCloud) {
|
||||
this.fetchLimits();
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
fetchLimits() {
|
||||
this.$store.dispatch('accounts/limits');
|
||||
},
|
||||
routeToBilling() {
|
||||
this.$router.push({
|
||||
name: 'billing_settings_index',
|
||||
params: { accountId: this.accountId },
|
||||
});
|
||||
},
|
||||
isTrialAccount() {
|
||||
// check if account is less than 15 days old
|
||||
const account = this.getAccount(this.accountId);
|
||||
if (!account) return false;
|
||||
|
||||
const createdAt = new Date(account.created_at);
|
||||
|
||||
const diffDays = differenceInDays(new Date(), createdAt);
|
||||
|
||||
return diffDays <= 15;
|
||||
},
|
||||
isLimitExceeded() {
|
||||
const account = this.getAccount(this.accountId);
|
||||
if (!account) return false;
|
||||
|
||||
const { limits } = account;
|
||||
if (!limits) return false;
|
||||
|
||||
const { conversation, non_web_inboxes: nonWebInboxes } = limits;
|
||||
return this.testLimit(conversation) || this.testLimit(nonWebInboxes);
|
||||
},
|
||||
testLimit({ allowed, consumed }) {
|
||||
return consumed > allowed;
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -59,72 +59,45 @@
|
||||
>
|
||||
{{ this.$t('CONVERSATION.RESOLVE_DROPDOWN.MARK_PENDING') }}
|
||||
</woot-button>
|
||||
<woot-button
|
||||
variant="clear"
|
||||
color-scheme="secondary"
|
||||
size="small"
|
||||
icon="snooze"
|
||||
@click="() => openSnoozeModal()"
|
||||
>
|
||||
{{ this.$t('CONVERSATION.RESOLVE_DROPDOWN.SNOOZE_UNTIL') }}
|
||||
</woot-button>
|
||||
</woot-dropdown-item>
|
||||
|
||||
<woot-dropdown-divider v-if="isOpen" />
|
||||
<woot-dropdown-sub-menu
|
||||
v-if="isOpen"
|
||||
:title="this.$t('CONVERSATION.RESOLVE_DROPDOWN.SNOOZE.TITLE')"
|
||||
>
|
||||
<woot-dropdown-item>
|
||||
<woot-button
|
||||
variant="clear"
|
||||
color-scheme="secondary"
|
||||
size="small"
|
||||
icon="send-clock"
|
||||
@click="() => toggleStatus(STATUS_TYPE.SNOOZED, null)"
|
||||
>
|
||||
{{ this.$t('CONVERSATION.RESOLVE_DROPDOWN.SNOOZE.NEXT_REPLY') }}
|
||||
</woot-button>
|
||||
</woot-dropdown-item>
|
||||
<woot-dropdown-item>
|
||||
<woot-button
|
||||
variant="clear"
|
||||
color-scheme="secondary"
|
||||
size="small"
|
||||
icon="dual-screen-clock"
|
||||
@click="
|
||||
() => toggleStatus(STATUS_TYPE.SNOOZED, snoozeTimes.tomorrow)
|
||||
"
|
||||
>
|
||||
{{ this.$t('CONVERSATION.RESOLVE_DROPDOWN.SNOOZE.TOMORROW') }}
|
||||
</woot-button>
|
||||
</woot-dropdown-item>
|
||||
<woot-dropdown-item>
|
||||
<woot-button
|
||||
variant="clear"
|
||||
color-scheme="secondary"
|
||||
size="small"
|
||||
icon="calendar-clock"
|
||||
@click="
|
||||
() => toggleStatus(STATUS_TYPE.SNOOZED, snoozeTimes.nextWeek)
|
||||
"
|
||||
>
|
||||
{{ this.$t('CONVERSATION.RESOLVE_DROPDOWN.SNOOZE.NEXT_WEEK') }}
|
||||
</woot-button>
|
||||
</woot-dropdown-item>
|
||||
</woot-dropdown-sub-menu>
|
||||
</woot-dropdown-menu>
|
||||
</div>
|
||||
<woot-modal
|
||||
:show.sync="showCustomSnoozeModal"
|
||||
:on-close="hideCustomSnoozeModal"
|
||||
>
|
||||
<custom-snooze-modal
|
||||
@close="hideCustomSnoozeModal"
|
||||
@choose-time="chooseSnoozeTime"
|
||||
/>
|
||||
</woot-modal>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getUnixTime } from 'date-fns';
|
||||
import { mapGetters } from 'vuex';
|
||||
import { mixin as clickaway } from 'vue-clickaway';
|
||||
import alertMixin from 'shared/mixins/alertMixin';
|
||||
import snoozeTimesMixin from 'dashboard/mixins/conversation/snoozeTimesMixin.js';
|
||||
import CustomSnoozeModal from 'dashboard/components/CustomSnoozeModal';
|
||||
import eventListenerMixins from 'shared/mixins/eventListenerMixins';
|
||||
import {
|
||||
hasPressedAltAndEKey,
|
||||
hasPressedCommandPlusAltAndEKey,
|
||||
hasPressedAltAndMKey,
|
||||
} from 'shared/helpers/KeyboardHelpers';
|
||||
|
||||
import { findSnoozeTime } from 'dashboard/helper/snoozeHelpers';
|
||||
import WootDropdownItem from 'shared/components/ui/dropdown/DropdownItem.vue';
|
||||
import WootDropdownSubMenu from 'shared/components/ui/dropdown/DropdownSubMenu.vue';
|
||||
import WootDropdownMenu from 'shared/components/ui/dropdown/DropdownMenu.vue';
|
||||
import WootDropdownDivider from 'shared/components/ui/dropdown/DropdownDivider';
|
||||
|
||||
import wootConstants from 'dashboard/constants/globals';
|
||||
import {
|
||||
@@ -137,16 +110,16 @@ export default {
|
||||
components: {
|
||||
WootDropdownItem,
|
||||
WootDropdownMenu,
|
||||
WootDropdownSubMenu,
|
||||
WootDropdownDivider,
|
||||
CustomSnoozeModal,
|
||||
},
|
||||
mixins: [clickaway, alertMixin, eventListenerMixins, snoozeTimesMixin],
|
||||
mixins: [clickaway, alertMixin, eventListenerMixins],
|
||||
props: { conversationId: { type: [String, Number], required: true } },
|
||||
data() {
|
||||
return {
|
||||
isLoading: false,
|
||||
showActionsDropdown: false,
|
||||
STATUS_TYPE: wootConstants.STATUS_TYPE,
|
||||
showCustomSnoozeModal: false,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -218,10 +191,26 @@ export default {
|
||||
}
|
||||
},
|
||||
onCmdSnoozeConversation(snoozeType) {
|
||||
this.toggleStatus(
|
||||
this.STATUS_TYPE.SNOOZED,
|
||||
this.snoozeTimes[snoozeType] || null
|
||||
);
|
||||
if (snoozeType === wootConstants.SNOOZE_OPTIONS.UNTIL_CUSTOM_TIME) {
|
||||
this.showCustomSnoozeModal = true;
|
||||
} else {
|
||||
this.toggleStatus(
|
||||
this.STATUS_TYPE.SNOOZED,
|
||||
findSnoozeTime(snoozeType) || null
|
||||
);
|
||||
}
|
||||
},
|
||||
chooseSnoozeTime(customSnoozeTime) {
|
||||
this.showCustomSnoozeModal = false;
|
||||
if (customSnoozeTime) {
|
||||
this.toggleStatus(
|
||||
this.STATUS_TYPE.SNOOZED,
|
||||
getUnixTime(customSnoozeTime)
|
||||
);
|
||||
}
|
||||
},
|
||||
hideCustomSnoozeModal() {
|
||||
this.showCustomSnoozeModal = false;
|
||||
},
|
||||
onCmdOpenConversation() {
|
||||
this.toggleStatus(this.STATUS_TYPE.OPEN);
|
||||
@@ -252,6 +241,10 @@ export default {
|
||||
this.isLoading = false;
|
||||
});
|
||||
},
|
||||
openSnoozeModal() {
|
||||
const ninja = document.querySelector('ninja-keys');
|
||||
ninja.open({ parent: 'snooze_conversation' });
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
@@ -270,5 +263,9 @@ export default {
|
||||
right: 0;
|
||||
max-width: 20rem;
|
||||
min-width: 15.6rem;
|
||||
|
||||
.dropdown-menu__item {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -75,7 +75,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
bannerClasses() {
|
||||
const classList = [this.colorScheme, `banner-align-${this.align}`];
|
||||
const classList = [this.colorScheme];
|
||||
|
||||
if (this.hasActionButton || this.hasCloseButton) {
|
||||
classList.push('has-button');
|
||||
|
||||
@@ -53,17 +53,29 @@
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
<div v-if="uiFlags.isContentGenerated">
|
||||
<label>
|
||||
{{ $t('INTEGRATION_SETTINGS.OPEN_AI.GENERATE_TITLE') }}
|
||||
</label>
|
||||
<p>
|
||||
{{ generatedMessage }}
|
||||
</p>
|
||||
</div>
|
||||
<div class="modal-footer flex-container align-right">
|
||||
<woot-button variant="clear" size="small" @click="closeDropdown">
|
||||
{{ $t('INTEGRATION_SETTINGS.OPEN_AI.BUTTONS.CANCEL') }}
|
||||
</woot-button>
|
||||
<woot-button
|
||||
v-if="!uiFlags.isContentGenerated"
|
||||
:is-loading="uiFlags.rephrase"
|
||||
size="small"
|
||||
@click="processEvent('rephrase')"
|
||||
>
|
||||
{{ buttonText }}
|
||||
</woot-button>
|
||||
<woot-button v-else size="small" @click="replaceText('rephrase')">
|
||||
{{ $t('INTEGRATION_SETTINGS.OPEN_AI.BUTTONS.REPLACE') }}
|
||||
</woot-button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -98,7 +110,9 @@ export default {
|
||||
rephrase: false,
|
||||
reply_suggestion: false,
|
||||
summarize: false,
|
||||
isisContentGenerated: false,
|
||||
},
|
||||
generatedMessage: '',
|
||||
showDropdown: false,
|
||||
activeTone: 'professional',
|
||||
tones: [
|
||||
@@ -140,6 +154,8 @@ export default {
|
||||
},
|
||||
methods: {
|
||||
toggleDropdown() {
|
||||
this.uiFlags.isContentGenerated = false;
|
||||
this.generatedMessage = '';
|
||||
this.showDropdown = !this.showDropdown;
|
||||
},
|
||||
closeDropdown() {
|
||||
@@ -154,6 +170,11 @@ export default {
|
||||
});
|
||||
}
|
||||
},
|
||||
replaceText(type) {
|
||||
this.$emit('replace-text', this.generatedMessage || this.message);
|
||||
this.recordAnalytics({ type, tone: this.activeTone });
|
||||
this.closeDropdown();
|
||||
},
|
||||
async processEvent(type = 'rephrase') {
|
||||
this.uiFlags[type] = true;
|
||||
try {
|
||||
@@ -167,9 +188,12 @@ export default {
|
||||
const {
|
||||
data: { message: generatedMessage },
|
||||
} = result;
|
||||
this.$emit('replace-text', generatedMessage || this.message);
|
||||
this.closeDropdown();
|
||||
this.recordAnalytics({ type, tone: this.activeTone });
|
||||
this.uiFlags.isContentGenerated = true;
|
||||
this.generatedMessage = generatedMessage;
|
||||
// It the type is not rephrase, replace the text
|
||||
if (type !== 'rephrase') {
|
||||
this.replaceText(type);
|
||||
}
|
||||
} catch (error) {
|
||||
this.showAlert(this.$t('INTEGRATION_SETTINGS.OPEN_AI.GENERATE_ERROR'));
|
||||
} finally {
|
||||
|
||||
@@ -57,7 +57,6 @@ import { hasPressedAltAndOKey } from 'shared/helpers/KeyboardHelpers';
|
||||
import { mapGetters } from 'vuex';
|
||||
import agentMixin from '../../../mixins/agentMixin.js';
|
||||
import BackButton from '../BackButton';
|
||||
import differenceInHours from 'date-fns/differenceInHours';
|
||||
import eventListenerMixins from 'shared/mixins/eventListenerMixins';
|
||||
import inboxMixin from 'shared/mixins/inboxMixin';
|
||||
import InboxName from '../InboxName';
|
||||
@@ -65,6 +64,8 @@ import MoreActions from './MoreActions';
|
||||
import Thumbnail from '../Thumbnail';
|
||||
import wootConstants from 'dashboard/constants/globals';
|
||||
import { conversationListPageURL } from 'dashboard/helper/URLHelper';
|
||||
import { conversationReopenTime } from 'dashboard/helper/snoozeHelpers';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
BackButton,
|
||||
@@ -125,17 +126,9 @@ export default {
|
||||
snoozedDisplayText() {
|
||||
const { snoozed_until: snoozedUntil } = this.currentChat;
|
||||
if (snoozedUntil) {
|
||||
// When the snooze is applied, it schedules the unsnooze event to next day/week 9AM.
|
||||
// By that logic if the time difference is less than or equal to 24 + 9 hours we can consider it tomorrow.
|
||||
const MAX_TIME_DIFFERENCE = 33;
|
||||
const isSnoozedUntilTomorrow =
|
||||
differenceInHours(new Date(snoozedUntil), new Date()) <=
|
||||
MAX_TIME_DIFFERENCE;
|
||||
return this.$t(
|
||||
isSnoozedUntilTomorrow
|
||||
? 'CONVERSATION.HEADER.SNOOZED_UNTIL_TOMORROW'
|
||||
: 'CONVERSATION.HEADER.SNOOZED_UNTIL_NEXT_WEEK'
|
||||
);
|
||||
return `${this.$t(
|
||||
'CONVERSATION.HEADER.SNOOZED_UNTIL'
|
||||
)} ${conversationReopenTime(snoozedUntil)}`;
|
||||
}
|
||||
return this.$t('CONVERSATION.HEADER.SNOOZED_UNTIL_NEXT_REPLY');
|
||||
},
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
{{ $t('CONVERSATION.UPLOADING_ATTACHMENTS') }}
|
||||
</span>
|
||||
<div v-if="!isPending && hasAttachments">
|
||||
<div v-for="attachment in data.attachments" :key="attachment.id">
|
||||
<div v-for="attachment in attachments" :key="attachment.id">
|
||||
<bubble-image-audio-video
|
||||
v-if="isAttachmentImageVideoAudio(attachment.file_type)"
|
||||
:attachment="attachment"
|
||||
@@ -199,6 +199,14 @@ export default {
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
attachments() {
|
||||
// Here it is used to get sender and created_at for each attachment
|
||||
return this.data?.attachments.map(attachment => ({
|
||||
...attachment,
|
||||
sender: this.data.sender || {},
|
||||
created_at: this.data.created_at || '',
|
||||
}));
|
||||
},
|
||||
shouldRenderMessage() {
|
||||
return (
|
||||
this.hasAttachments ||
|
||||
|
||||
+245
-72
@@ -1,79 +1,131 @@
|
||||
<template>
|
||||
<woot-modal full-width :show.sync="show" :on-close="onClose">
|
||||
<woot-modal
|
||||
full-width
|
||||
:show.sync="show"
|
||||
:show-close-button="false"
|
||||
:on-close="onClose"
|
||||
>
|
||||
<div v-on-clickaway="onClose" class="gallery-modal--wrap" @click="onClose">
|
||||
<div class="attachment-toggle--button">
|
||||
<woot-button
|
||||
v-if="hasMoreThanOneAttachment"
|
||||
size="large"
|
||||
variant="smooth"
|
||||
color-scheme="secondary"
|
||||
icon="chevron-left"
|
||||
:disabled="activeImageIndex === 0"
|
||||
@click.stop="
|
||||
onClickChangeAttachment(
|
||||
allAttachments[activeImageIndex - 1],
|
||||
activeImageIndex - 1
|
||||
)
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div class="attachments-viewer">
|
||||
<div class="attachment-view">
|
||||
<img
|
||||
v-if="isImage"
|
||||
:key="attachmentSrc"
|
||||
:src="attachmentSrc"
|
||||
class="modal-image skip-context-menu"
|
||||
@click.stop
|
||||
<div class="gallery-modal--header">
|
||||
<div class="header-info--wrap" @click.stop>
|
||||
<thumbnail
|
||||
:username="senderDetails.name"
|
||||
:src="senderDetails.avatar"
|
||||
/>
|
||||
<video
|
||||
v-if="isVideo"
|
||||
:key="attachmentSrc"
|
||||
:src="attachmentSrc"
|
||||
controls
|
||||
playsInline
|
||||
class="modal-video skip-context-menu"
|
||||
@click.stop
|
||||
<div class="header-info">
|
||||
<h3 class="sub-block-title sender-name">
|
||||
<span class="text-truncate">{{ senderDetails.name }}</span>
|
||||
</h3>
|
||||
<span class="time-stamp text-truncate">{{ readableTime }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="file-name--header text-block-title">
|
||||
<span class="text-truncate">
|
||||
{{ fileNameFromDataUrl }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="header-actions" @click.stop>
|
||||
<woot-button
|
||||
size="large"
|
||||
color-scheme="secondary"
|
||||
variant="clear"
|
||||
icon="arrow-download"
|
||||
@click="onClickDownload"
|
||||
/>
|
||||
<woot-button
|
||||
size="large"
|
||||
color-scheme="secondary"
|
||||
variant="clear"
|
||||
icon="dismiss"
|
||||
@click="onClose"
|
||||
/>
|
||||
<audio
|
||||
v-if="isAudio"
|
||||
:key="attachmentSrc"
|
||||
controls
|
||||
class="skip-context-menu"
|
||||
@click.stop
|
||||
>
|
||||
<source :src="`${attachmentSrc}?t=${Date.now()}`" />
|
||||
</audio>
|
||||
</div>
|
||||
</div>
|
||||
<div class="attachment-toggle--button">
|
||||
<woot-button
|
||||
v-if="hasMoreThanOneAttachment"
|
||||
size="large"
|
||||
variant="smooth"
|
||||
color-scheme="secondary"
|
||||
:disabled="activeImageIndex === allAttachments.length - 1"
|
||||
icon="chevron-right"
|
||||
@click.stop="
|
||||
onClickChangeAttachment(
|
||||
allAttachments[activeImageIndex + 1],
|
||||
activeImageIndex + 1
|
||||
)
|
||||
"
|
||||
/>
|
||||
<div class="gallery-modal--body">
|
||||
<div class="attachment-toggle--button">
|
||||
<woot-button
|
||||
v-if="hasMoreThanOneAttachment"
|
||||
size="large"
|
||||
variant="smooth"
|
||||
color-scheme="primary"
|
||||
icon="chevron-left"
|
||||
:disabled="activeImageIndex === 0"
|
||||
@click.stop="
|
||||
onClickChangeAttachment(
|
||||
allAttachments[activeImageIndex - 1],
|
||||
activeImageIndex - 1
|
||||
)
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
<div class="attachments-viewer">
|
||||
<div class="attachment-view">
|
||||
<img
|
||||
v-if="isImage"
|
||||
:key="activeAttachment.message_id"
|
||||
:src="activeAttachment.data_url"
|
||||
class="modal-image skip-context-menu"
|
||||
@click.stop
|
||||
/>
|
||||
<video
|
||||
v-if="isVideo"
|
||||
:key="activeAttachment.message_id"
|
||||
:src="activeAttachment.data_url"
|
||||
controls
|
||||
playsInline
|
||||
class="modal-video skip-context-menu"
|
||||
@click.stop
|
||||
/>
|
||||
<audio
|
||||
v-if="isAudio"
|
||||
:key="activeAttachment.message_id"
|
||||
controls
|
||||
class="skip-context-menu"
|
||||
@click.stop
|
||||
>
|
||||
<source :src="`${activeAttachment.data_url}?t=${Date.now()}`" />
|
||||
</audio>
|
||||
</div>
|
||||
</div>
|
||||
<div class="attachment-toggle--button">
|
||||
<woot-button
|
||||
v-if="hasMoreThanOneAttachment"
|
||||
size="large"
|
||||
variant="smooth"
|
||||
color-scheme="primary"
|
||||
:disabled="activeImageIndex === allAttachments.length - 1"
|
||||
icon="chevron-right"
|
||||
@click.stop="
|
||||
onClickChangeAttachment(
|
||||
allAttachments[activeImageIndex + 1],
|
||||
activeImageIndex + 1
|
||||
)
|
||||
"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="gallery-modal--footer">
|
||||
<div class="header-count text-block-title">
|
||||
<span class="count">
|
||||
{{ `${activeImageIndex + 1} / ${allAttachments.length}` }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</woot-modal>
|
||||
</template>
|
||||
<script>
|
||||
import { mixin as clickaway } from 'vue-clickaway';
|
||||
|
||||
import { mapGetters } from 'vuex';
|
||||
import {
|
||||
isEscape,
|
||||
hasPressedArrowLeftKey,
|
||||
hasPressedArrowRightKey,
|
||||
} from 'shared/helpers/KeyboardHelpers';
|
||||
import eventListenerMixins from 'shared/mixins/eventListenerMixins';
|
||||
import timeMixin from 'dashboard/mixins/time';
|
||||
|
||||
import Thumbnail from 'dashboard/components/widgets/Thumbnail';
|
||||
|
||||
const ALLOWED_FILE_TYPES = {
|
||||
IMAGE: 'image',
|
||||
@@ -82,7 +134,10 @@ const ALLOWED_FILE_TYPES = {
|
||||
};
|
||||
|
||||
export default {
|
||||
mixins: [eventListenerMixins, clickaway],
|
||||
components: {
|
||||
Thumbnail,
|
||||
},
|
||||
mixins: [eventListenerMixins, clickaway, timeMixin],
|
||||
props: {
|
||||
show: {
|
||||
type: Boolean,
|
||||
@@ -99,18 +154,29 @@ export default {
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
attachmentSrc: '',
|
||||
activeAttachment: {},
|
||||
activeFileType: '',
|
||||
activeImageIndex:
|
||||
this.allAttachments.findIndex(
|
||||
attachment => attachment.id === this.attachment.id
|
||||
attachment => attachment.message_id === this.attachment.message_id
|
||||
) || 0,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
...mapGetters({
|
||||
currentUser: 'getCurrentUser',
|
||||
}),
|
||||
hasMoreThanOneAttachment() {
|
||||
return this.allAttachments.length > 1;
|
||||
},
|
||||
readableTime() {
|
||||
if (!this.activeAttachment.created_at) return '';
|
||||
const time = this.messageTimestamp(
|
||||
this.activeAttachment.created_at,
|
||||
'LLL d yyyy, h:mm a'
|
||||
);
|
||||
return time || '';
|
||||
},
|
||||
isImage() {
|
||||
return this.activeFileType === ALLOWED_FILE_TYPES.IMAGE;
|
||||
},
|
||||
@@ -120,6 +186,21 @@ export default {
|
||||
isAudio() {
|
||||
return this.activeFileType === ALLOWED_FILE_TYPES.AUDIO;
|
||||
},
|
||||
senderDetails() {
|
||||
const { name, available_name: availableName, avatar_url, thumbnail, id } =
|
||||
this.activeAttachment?.sender || this.attachment?.sender;
|
||||
const currentUserID = this.currentUser?.id;
|
||||
return {
|
||||
name: currentUserID === id ? 'You' : name || availableName || '',
|
||||
avatar: thumbnail || avatar_url || '',
|
||||
};
|
||||
},
|
||||
fileNameFromDataUrl() {
|
||||
const { data_url: dataUrl } = this.activeAttachment;
|
||||
if (!dataUrl) return '';
|
||||
const fileName = dataUrl?.split('/').pop();
|
||||
return fileName || '';
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.setImageAndVideoSrc(this.attachment);
|
||||
@@ -140,7 +221,7 @@ export default {
|
||||
if (!Object.values(ALLOWED_FILE_TYPES).includes(type)) {
|
||||
return;
|
||||
}
|
||||
this.attachmentSrc = attachment.data_url;
|
||||
this.activeAttachment = attachment;
|
||||
this.activeFileType = type;
|
||||
},
|
||||
onKeyDownHandler(e) {
|
||||
@@ -158,29 +239,121 @@ export default {
|
||||
);
|
||||
}
|
||||
},
|
||||
onClickDownload() {
|
||||
const { file_type: type, data_url: url } = this.activeAttachment;
|
||||
if (!Object.values(ALLOWED_FILE_TYPES).includes(type)) {
|
||||
return;
|
||||
}
|
||||
const link = document.createElement('a');
|
||||
link.href = url;
|
||||
link.download = `attachment.${type}`;
|
||||
link.click();
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.gallery-modal--wrap {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
width: inherit;
|
||||
flex-direction: column;
|
||||
height: inherit;
|
||||
width: inherit;
|
||||
|
||||
.gallery-modal--header {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
height: var(--space-jumbo);
|
||||
justify-content: space-between;
|
||||
padding: var(--space-small) var(--space-medium);
|
||||
width: 100%;
|
||||
|
||||
.header-info--wrap {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
justify-content: flex-start;
|
||||
min-width: var(--space-giga);
|
||||
|
||||
.header-info {
|
||||
align-items: flex-start;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
margin-left: var(--space-small);
|
||||
|
||||
.sender-name {
|
||||
display: inline-block;
|
||||
line-height: 1.4;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
text-transform: capitalize;
|
||||
}
|
||||
|
||||
.time-stamp {
|
||||
color: var(--s-400);
|
||||
font-size: var(--font-size-mini);
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.file-name--header {
|
||||
align-items: center;
|
||||
color: var(--s-700);
|
||||
display: flex;
|
||||
font-weight: var(--font-weight-bold);
|
||||
justify-content: flex-start;
|
||||
min-width: 0;
|
||||
padding: var(--space-smaller);
|
||||
width: auto;
|
||||
}
|
||||
|
||||
.header-actions {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
gap: var(--space-small);
|
||||
justify-content: flex-end;
|
||||
min-width: var(--space-giga);
|
||||
}
|
||||
}
|
||||
|
||||
.gallery-modal--body {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
height: 100%;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.gallery-modal--footer {
|
||||
align-items: center;
|
||||
display: flex;
|
||||
height: var(--space-jumbo);
|
||||
justify-content: center;
|
||||
padding: var(--space-small) var(--space-medium);
|
||||
width: 100%;
|
||||
|
||||
.header-count {
|
||||
align-items: center;
|
||||
border-radius: var(--border-radius-small);
|
||||
background-color: var(--s-25);
|
||||
color: var(--s-600);
|
||||
display: flex;
|
||||
font-weight: var(--font-weight-bold);
|
||||
justify-content: center;
|
||||
min-width: 8rem;
|
||||
padding: var(--space-smaller);
|
||||
}
|
||||
}
|
||||
|
||||
.attachments-viewer {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
.attachment-view {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
img {
|
||||
margin: 0 auto;
|
||||
}
|
||||
@@ -192,10 +365,10 @@ export default {
|
||||
}
|
||||
|
||||
.attachment-toggle--button {
|
||||
width: var(--space-mega);
|
||||
min-width: var(--space-mega);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
min-width: var(--space-mega);
|
||||
width: var(--space-mega);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -15,14 +15,13 @@
|
||||
@click="toggleStatus(option.key, null)"
|
||||
/>
|
||||
</template>
|
||||
<menu-item-with-submenu :option="snoozeMenuConfig">
|
||||
<menu-item
|
||||
v-for="(option, i) in snoozeMenuConfig.options"
|
||||
:key="i"
|
||||
:option="option"
|
||||
@click="snoozeConversation(option.snoozedUntil)"
|
||||
/>
|
||||
</menu-item-with-submenu>
|
||||
<menu-item
|
||||
v-if="show(snoozeOption.key)"
|
||||
:option="snoozeOption"
|
||||
variant="icon"
|
||||
@click="snoozeConversation()"
|
||||
/>
|
||||
|
||||
<menu-item-with-submenu :option="priorityConfig">
|
||||
<menu-item
|
||||
v-for="(option, i) in priorityConfig.options"
|
||||
@@ -78,7 +77,6 @@
|
||||
import MenuItem from './menuItem.vue';
|
||||
import MenuItemWithSubmenu from './menuItemWithSubmenu.vue';
|
||||
import wootConstants from 'dashboard/constants/globals';
|
||||
import snoozeTimesMixin from 'dashboard/mixins/conversation/snoozeTimesMixin';
|
||||
import agentMixin from 'dashboard/mixins/agentMixin';
|
||||
import { mapGetters } from 'vuex';
|
||||
import AgentLoadingPlaceholder from './agentLoadingPlaceholder.vue';
|
||||
@@ -88,7 +86,7 @@ export default {
|
||||
MenuItemWithSubmenu,
|
||||
AgentLoadingPlaceholder,
|
||||
},
|
||||
mixins: [snoozeTimesMixin, agentMixin],
|
||||
mixins: [agentMixin],
|
||||
props: {
|
||||
status: {
|
||||
type: String,
|
||||
@@ -131,27 +129,10 @@ export default {
|
||||
icon: 'arrow-redo',
|
||||
},
|
||||
],
|
||||
snoozeMenuConfig: {
|
||||
key: 'snooze',
|
||||
snoozeOption: {
|
||||
key: wootConstants.STATUS_TYPE.SNOOZED,
|
||||
label: this.$t('CONVERSATION.CARD_CONTEXT_MENU.SNOOZE.TITLE'),
|
||||
icon: 'snooze',
|
||||
options: [
|
||||
{
|
||||
label: this.$t('CONVERSATION.CARD_CONTEXT_MENU.SNOOZE.NEXT_REPLY'),
|
||||
key: 'next-reply',
|
||||
snoozedUntil: null,
|
||||
},
|
||||
{
|
||||
label: this.$t('CONVERSATION.CARD_CONTEXT_MENU.SNOOZE.TOMORROW'),
|
||||
key: 'tomorrow',
|
||||
snoozedUntil: 'tomorrow',
|
||||
},
|
||||
{
|
||||
label: this.$t('CONVERSATION.CARD_CONTEXT_MENU.SNOOZE.NEXT_WEEK'),
|
||||
key: 'next-week',
|
||||
snoozedUntil: 'nextWeek',
|
||||
},
|
||||
],
|
||||
},
|
||||
priorityConfig: {
|
||||
key: 'priority',
|
||||
@@ -234,12 +215,9 @@ export default {
|
||||
toggleStatus(status, snoozedUntil) {
|
||||
this.$emit('update-conversation', status, snoozedUntil);
|
||||
},
|
||||
snoozeConversation(snoozedUntil) {
|
||||
this.$emit(
|
||||
'update-conversation',
|
||||
this.STATUS_TYPE.SNOOZED,
|
||||
this.snoozeTimes[snoozedUntil] || null
|
||||
);
|
||||
snoozeConversation() {
|
||||
const ninja = document.querySelector('ninja-keys');
|
||||
ninja.open({ parent: 'snooze_conversation' });
|
||||
},
|
||||
assignPriority(priority) {
|
||||
this.$emit('assign-priority', priority);
|
||||
|
||||
@@ -30,5 +30,13 @@ export default {
|
||||
TESTIMONIAL_URL: 'https://testimonials.cdn.chatwoot.com/content.json',
|
||||
SMALL_SCREEN_BREAKPOINT: 1024,
|
||||
AVAILABILITY_STATUS_KEYS: ['online', 'busy', 'offline'],
|
||||
SNOOZE_OPTIONS: {
|
||||
UNTIL_NEXT_REPLY: 'until_next_reply',
|
||||
AN_HOUR_FROM_NOW: 'an_hour_from_now',
|
||||
UNTIL_TOMORROW: 'until_tomorrow',
|
||||
UNTIL_NEXT_WEEK: 'until_next_week',
|
||||
UNTIL_NEXT_MONTH: 'until_next_month',
|
||||
UNTIL_CUSTOM_TIME: 'until_custom_time',
|
||||
},
|
||||
};
|
||||
export const DEFAULT_REDIRECT_URL = '/app/';
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
import {
|
||||
getUnixTime,
|
||||
format,
|
||||
add,
|
||||
startOfWeek,
|
||||
addWeeks,
|
||||
startOfMonth,
|
||||
isMonday,
|
||||
isToday,
|
||||
setHours,
|
||||
} from 'date-fns';
|
||||
import wootConstants from 'dashboard/constants/globals';
|
||||
|
||||
const SNOOZE_OPTIONS = wootConstants.SNOOZE_OPTIONS;
|
||||
|
||||
export const findStartOfNextWeek = currentDate => {
|
||||
const startOfNextWeek = startOfWeek(addWeeks(currentDate, 1));
|
||||
return isMonday(startOfNextWeek)
|
||||
? startOfNextWeek
|
||||
: add(startOfNextWeek, {
|
||||
days: (8 - startOfNextWeek.getDay()) % 7,
|
||||
});
|
||||
};
|
||||
|
||||
export const findStartOfNextMonth = currentDate => {
|
||||
const startOfNextMonth = startOfMonth(add(currentDate, { months: 1 }));
|
||||
return isMonday(startOfNextMonth)
|
||||
? startOfNextMonth
|
||||
: add(startOfNextMonth, {
|
||||
days: (8 - startOfNextMonth.getDay()) % 7,
|
||||
});
|
||||
};
|
||||
|
||||
export const findNextDay = currentDate => {
|
||||
return add(currentDate, { days: 1 });
|
||||
};
|
||||
|
||||
export const setHoursToNine = date => {
|
||||
return setHours(date, 9, 0, 0);
|
||||
};
|
||||
|
||||
export const findSnoozeTime = (snoozeType, currentDate = new Date()) => {
|
||||
let parsedDate = null;
|
||||
if (snoozeType === SNOOZE_OPTIONS.AN_HOUR_FROM_NOW) {
|
||||
parsedDate = add(currentDate, { hours: 1 });
|
||||
} else if (snoozeType === SNOOZE_OPTIONS.UNTIL_TOMORROW) {
|
||||
parsedDate = setHoursToNine(findNextDay(currentDate));
|
||||
} else if (snoozeType === SNOOZE_OPTIONS.UNTIL_NEXT_WEEK) {
|
||||
parsedDate = setHoursToNine(findStartOfNextWeek(currentDate));
|
||||
} else if (snoozeType === SNOOZE_OPTIONS.UNTIL_NEXT_MONTH) {
|
||||
parsedDate = setHoursToNine(findStartOfNextMonth(currentDate));
|
||||
}
|
||||
|
||||
return parsedDate ? getUnixTime(parsedDate) : null;
|
||||
};
|
||||
export const conversationReopenTime = snoozedUntil => {
|
||||
if (!snoozedUntil) {
|
||||
return null;
|
||||
}
|
||||
const date = new Date(snoozedUntil);
|
||||
|
||||
if (isToday(date)) {
|
||||
return format(date, 'h.mmaaa');
|
||||
}
|
||||
return snoozedUntil ? format(date, 'd MMM, h.mmaaa') : null;
|
||||
};
|
||||
@@ -0,0 +1,105 @@
|
||||
import {
|
||||
findSnoozeTime,
|
||||
conversationReopenTime,
|
||||
findStartOfNextWeek,
|
||||
findStartOfNextMonth,
|
||||
findNextDay,
|
||||
setHoursToNine,
|
||||
} from '../snoozeHelpers';
|
||||
|
||||
describe('#Snooze Helpers', () => {
|
||||
describe('findStartOfNextWeek', () => {
|
||||
it('should return first working day of next week if a date is passed', () => {
|
||||
const today = new Date('06/16/2023');
|
||||
const startOfNextWeek = new Date('06/19/2023');
|
||||
expect(findStartOfNextWeek(today)).toEqual(startOfNextWeek);
|
||||
});
|
||||
it('should return first working day of next week if a date is passed', () => {
|
||||
const today = new Date('06/03/2023');
|
||||
const startOfNextWeek = new Date('06/05/2023');
|
||||
expect(findStartOfNextWeek(today)).toEqual(startOfNextWeek);
|
||||
});
|
||||
});
|
||||
|
||||
describe('findStartOfNextMonth', () => {
|
||||
it('should return first working day of next month if a valid date is passed', () => {
|
||||
const today = new Date('06/21/2023');
|
||||
const startOfNextMonth = new Date('07/03/2023');
|
||||
expect(findStartOfNextMonth(today)).toEqual(startOfNextMonth);
|
||||
});
|
||||
it('should return first working day of next month if a valid date is passed', () => {
|
||||
const today = new Date('02/28/2023');
|
||||
const startOfNextMonth = new Date('03/06/2023');
|
||||
expect(findStartOfNextMonth(today)).toEqual(startOfNextMonth);
|
||||
});
|
||||
});
|
||||
|
||||
describe('setHoursToNine', () => {
|
||||
it('should return date with 9.00AM time', () => {
|
||||
const nextDay = new Date('06/17/2023');
|
||||
nextDay.setHours(9, 0, 0, 0);
|
||||
expect(setHoursToNine(nextDay)).toEqual(nextDay);
|
||||
});
|
||||
});
|
||||
|
||||
describe('findSnoozeTime', () => {
|
||||
it('should return nil if until_next_reply is passed', () => {
|
||||
expect(findSnoozeTime('until_next_reply')).toEqual(null);
|
||||
});
|
||||
|
||||
it('should return next hour time stamp if an_hour_from_now is passed', () => {
|
||||
const nextHour = new Date();
|
||||
nextHour.setHours(nextHour.getHours() + 1);
|
||||
expect(findSnoozeTime('an_hour_from_now')).toBeCloseTo(
|
||||
Math.floor(nextHour.getTime() / 1000)
|
||||
);
|
||||
});
|
||||
|
||||
it('should return next day 9.00AM time stamp until_tomorrow is passed', () => {
|
||||
const today = new Date('06/16/2023');
|
||||
const nextDay = new Date('06/17/2023');
|
||||
nextDay.setHours(9, 0, 0, 0);
|
||||
expect(findSnoozeTime('until_tomorrow', today)).toBeCloseTo(
|
||||
nextDay.getTime() / 1000
|
||||
);
|
||||
});
|
||||
|
||||
it('should return next week monday 9.00AM time stamp if until_next_week is passed', () => {
|
||||
const today = new Date('06/16/2023');
|
||||
const startOfNextWeek = new Date('06/19/2023');
|
||||
startOfNextWeek.setHours(9, 0, 0, 0);
|
||||
expect(findSnoozeTime('until_next_week', today)).toBeCloseTo(
|
||||
startOfNextWeek.getTime() / 1000
|
||||
);
|
||||
});
|
||||
|
||||
it('should return next month 9.00AM time stamp if until_next_month is passed', () => {
|
||||
const today = new Date('06/21/2023');
|
||||
const startOfNextMonth = new Date('07/03/2023');
|
||||
startOfNextMonth.setHours(9, 0, 0, 0);
|
||||
expect(findSnoozeTime('until_next_month', today)).toBeCloseTo(
|
||||
startOfNextMonth.getTime() / 1000
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('conversationReopenTime', () => {
|
||||
it('should return nil if snoozedUntil is nil', () => {
|
||||
expect(conversationReopenTime(null)).toEqual(null);
|
||||
});
|
||||
|
||||
it('should return formatted date if snoozedUntil is not nil', () => {
|
||||
expect(conversationReopenTime('2023-06-07T09:00:00.000Z')).toEqual(
|
||||
'7 Jun, 9.00am'
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
describe('findNextDay', () => {
|
||||
it('should return next day', () => {
|
||||
const today = new Date('06/16/2023');
|
||||
const nextDay = new Date('06/17/2023');
|
||||
expect(findNextDay(today)).toEqual(nextDay);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -35,6 +35,7 @@ import vi from './locale/vi';
|
||||
import zh_CN from './locale/zh_CN';
|
||||
import zh_TW from './locale/zh_TW';
|
||||
import is from './locale/is';
|
||||
import lt from './locale/lt';
|
||||
|
||||
export default {
|
||||
ar,
|
||||
@@ -74,4 +75,5 @@ export default {
|
||||
zh_CN,
|
||||
zh_TW,
|
||||
is,
|
||||
lt,
|
||||
};
|
||||
|
||||
@@ -2,13 +2,18 @@
|
||||
"FILTER": {
|
||||
"TITLE": "تصفية المحادثات",
|
||||
"SUBTITLE": "إضافة فلاتر أدناه واضغط على 'إرسال' لتصفية المحادثات.",
|
||||
"ADD_NEW_FILTER": "إضافة فلتر",
|
||||
"FILTER_DELETE_ERROR": "يجب ان يكون لديك فلتر واحد على الاقل",
|
||||
"SUBMIT_BUTTON_LABEL": "تطبيق الفلاتر",
|
||||
"EDIT_CUSTOM_FILTER": "Edit Folder",
|
||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your folder.",
|
||||
"ADD_NEW_FILTER": "إضافة عامل تصفية",
|
||||
"FILTER_DELETE_ERROR": "يجب أن يكون لديك عامل تصفية واحد على الأقل للحفظ",
|
||||
"SUBMIT_BUTTON_LABEL": "تطبيق عامل التصفية",
|
||||
"UPDATE_BUTTON_LABEL": "Update folder",
|
||||
"CANCEL_BUTTON_LABEL": "إلغاء",
|
||||
"CLEAR_BUTTON_LABEL": "مسح الفلاتر",
|
||||
"CLEAR_BUTTON_LABEL": "مسح عامل التصفية",
|
||||
"EMPTY_VALUE_ERROR": "القيمة مطلوبة",
|
||||
"TOOLTIP_LABEL": "تصفية المحادثة",
|
||||
"FOLDER_LABEL": "Folder Name",
|
||||
"FOLDER_QUERY_LABEL": "Folder Query",
|
||||
"TOOLTIP_LABEL": "تصفية المحادثات",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "و",
|
||||
"OR": "أو"
|
||||
@@ -23,7 +28,7 @@
|
||||
"is_greater_than": "هو أكبر من",
|
||||
"is_less_than": "هو أقل من",
|
||||
"days_before": "قبل x أيام",
|
||||
"starts_with": "Starts with"
|
||||
"starts_with": "يبدأ بـ"
|
||||
},
|
||||
"ATTRIBUTE_LABELS": {
|
||||
"TRUE": "صحيح",
|
||||
@@ -38,7 +43,7 @@
|
||||
"CAMPAIGN_NAME": "اسم الحملة",
|
||||
"LABELS": "الوسوم",
|
||||
"BROWSER_LANGUAGE": "لغة المتصفح",
|
||||
"PRIORITY": "Priority",
|
||||
"PRIORITY": "الأولوية",
|
||||
"COUNTRY_NAME": "اسم الدولة",
|
||||
"REFERER_LINK": "رابط المرجع",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "القائمة",
|
||||
@@ -71,6 +76,9 @@
|
||||
"ERROR_MESSAGE": "خطأ أثناء إنشاء طريقة عرض مخصصة"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"EDIT_BUTTON": "Edit folder"
|
||||
},
|
||||
"DELETE": {
|
||||
"DELETE_BUTTON": "حذف الفلتر",
|
||||
"MODAL": {
|
||||
|
||||
@@ -76,8 +76,8 @@
|
||||
},
|
||||
"AGENT_AVAILABILITY": {
|
||||
"LABEL": "التوفر",
|
||||
"PLACEHOLDER": "Please select an availability status",
|
||||
"ERROR": "Availability is required"
|
||||
"PLACEHOLDER": "الرجاء تحديد حالة التوفر",
|
||||
"ERROR": "حالة التوفر مطلوبة"
|
||||
},
|
||||
"SUBMIT": "تعديل حساب الموظف"
|
||||
},
|
||||
@@ -111,7 +111,7 @@
|
||||
"PLACEHOLDER": {
|
||||
"AGENT": "البحث عن وكلاء",
|
||||
"TEAM": "البحث عن فريق",
|
||||
"INPUT": "Search for agents"
|
||||
"INPUT": "البحث عن ممثلى الخدمة"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,13 +12,37 @@
|
||||
"TABLE_HEADER": [
|
||||
"User",
|
||||
"Action",
|
||||
"عنوان IP",
|
||||
"Time"
|
||||
"عنوان IP"
|
||||
]
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "AuditLogs retrieved successfully",
|
||||
"ERROR_MESSAGE": "تعذر الاتصال بالخادم، الرجاء المحاولة مرة أخرى لاحقاً"
|
||||
},
|
||||
"DEFAULT_USER": "System",
|
||||
"AUTOMATION_RULE": {
|
||||
"ADD": "%{agentName} created a new automation rule (#%{id})",
|
||||
"EDIT": "%{agentName} updated an automation rule (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an automation rule (#%{id})"
|
||||
},
|
||||
"INBOX": {
|
||||
"ADD": "%{agentName} created a new inbox (#%{id})",
|
||||
"EDIT": "%{agentName} updated an inbox (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an inbox (#%{id})"
|
||||
},
|
||||
"WEBHOOK": {
|
||||
"ADD": "%{agentName} created a new webhook (#%{id})",
|
||||
"EDIT": "%{agentName} updated a webhook (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a webhook (#%{id})"
|
||||
},
|
||||
"USER_ACTION": {
|
||||
"SIGN_IN": "%{agentName} signed in",
|
||||
"SIGN_OUT": "%{agentName} signed out"
|
||||
},
|
||||
"TEAM": {
|
||||
"ADD": "%{agentName} created a new team (#%{id})",
|
||||
"EDIT": "%{agentName} updated a team (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a team (#%{id})"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -36,17 +36,20 @@
|
||||
}
|
||||
},
|
||||
"VIEW_FILTER": "عرض",
|
||||
"SORT_TOOLTIP_LABEL": "Sort conversations",
|
||||
"SORT_TOOLTIP_LABEL": "ترتيب المحادثات",
|
||||
"CHAT_SORT": {
|
||||
"STATUS": "الحالة",
|
||||
"ORDER_BY": "Order by"
|
||||
"ORDER_BY": "الترتيب بواسطة"
|
||||
},
|
||||
"CHAT_SORT_FILTER_ITEMS": {
|
||||
"latest": {
|
||||
"TEXT": "Last activity"
|
||||
"TEXT": "النشاط الأخير"
|
||||
},
|
||||
"sort_on_created_at": {
|
||||
"TEXT": "تم إنشاؤها في"
|
||||
},
|
||||
"sort_on_priority": {
|
||||
"TEXT": "الأولوية"
|
||||
}
|
||||
},
|
||||
"ATTACHMENTS": {
|
||||
@@ -70,12 +73,12 @@
|
||||
}
|
||||
},
|
||||
"CHAT_SORT_BY_FILTER": {
|
||||
"TITLE": "Sort conversation",
|
||||
"TITLE": "ترتيب المحادثات",
|
||||
"DROPDOWN_TITLE": "ترتيب حسب",
|
||||
"ITEMS": {
|
||||
"LATEST": {
|
||||
"NAME": "Last activity at",
|
||||
"LABEL": "Last activity"
|
||||
"NAME": "النشاط الأخير في",
|
||||
"LABEL": "النشاط الأخير"
|
||||
},
|
||||
"CREATED_AT": {
|
||||
"NAME": "تم إنشاؤها في",
|
||||
|
||||
@@ -73,6 +73,13 @@
|
||||
"SUCCESS_MESSAGE": "تم حفظ جهة الاتصال بنجاح",
|
||||
"ERROR_MESSAGE": "حدث خطأ، الرجاء المحاولة مرة أخرى"
|
||||
},
|
||||
"EXPORT_CONTACTS": {
|
||||
"BUTTON_LABEL": "Export",
|
||||
"TITLE": "Export Contacts",
|
||||
"DESC": "Export contacts to a CSV file.",
|
||||
"SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
|
||||
"ERROR_MESSAGE": "حدث خطأ، الرجاء المحاولة مرة أخرى"
|
||||
},
|
||||
"DELETE_NOTE": {
|
||||
"CONFIRM": {
|
||||
"TITLE": "تأكيد الحذف",
|
||||
@@ -120,7 +127,7 @@
|
||||
"PHONE_NUMBER": {
|
||||
"PLACEHOLDER": "أدخل رقم الهاتف الخاص بجهة الاتصال",
|
||||
"LABEL": "رقم الهاتف",
|
||||
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]. You can select the dial code from the dropdown.",
|
||||
"HELP": "يجب ان يحتوى رقم الهاتف على كود دولتك تسبقها علامة +\nمثال: +20101243567",
|
||||
"ERROR": "يجب ان تكون خانة رقم الهاتف إما فارغة او مكتملة مع رمز الدولة",
|
||||
"DIAL_CODE_ERROR": "Please select a dial code from the list",
|
||||
"DUPLICATE": "رقم الهاتف هذا مستخدم لجهة اتصال أخرى."
|
||||
@@ -182,7 +189,7 @@
|
||||
"LABEL": "إلى"
|
||||
},
|
||||
"INBOX": {
|
||||
"LABEL": "Via Inbox",
|
||||
"LABEL": "صندوق الوارد",
|
||||
"PLACEHOLDER": "Choose source inbox",
|
||||
"ERROR": "حدد صندوق الوارد"
|
||||
},
|
||||
@@ -211,6 +218,7 @@
|
||||
"FILTER_CONTACTS": "فلترة",
|
||||
"FILTER_CONTACTS_SAVE": "حفظ الفلتر",
|
||||
"FILTER_CONTACTS_DELETE": "حذف الفلتر",
|
||||
"FILTER_CONTACTS_EDIT": "Edit segment",
|
||||
"LIST": {
|
||||
"LOADING_MESSAGE": "جاري تحميل جهات الاتصال...",
|
||||
"404": "لا توجد جهات اتصال تطابق بحثك 🔍",
|
||||
|
||||
@@ -1,50 +1,55 @@
|
||||
{
|
||||
"CONTACTS_FILTER": {
|
||||
"TITLE": "تصفية جهات الاتصال",
|
||||
"SUBTITLE": "إضافة فلاتر أدناه واضغط على 'إرسال' لتصفية جهات الاتصال.",
|
||||
"ADD_NEW_FILTER": "إضافة فلتر",
|
||||
"CLEAR_ALL_FILTERS": "مسح جميع الفلاتر",
|
||||
"FILTER_DELETE_ERROR": "يجب ان يكون لديك فلتر واحد على الاقل",
|
||||
"SUBMIT_BUTTON_LABEL": "إرسال",
|
||||
"CANCEL_BUTTON_LABEL": "إلغاء",
|
||||
"CLEAR_BUTTON_LABEL": "مسح الفلاتر",
|
||||
"EMPTY_VALUE_ERROR": "القيمة مطلوبة",
|
||||
"TOOLTIP_LABEL": "تصفية جهات الاتصال",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "و",
|
||||
"OR": "أو"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "يساوي",
|
||||
"not_equal_to": "لا يساوي",
|
||||
"contains": "يحتوي",
|
||||
"does_not_contain": "لا يحتوي",
|
||||
"is_present": "موجود",
|
||||
"is_not_present": "غير موجود",
|
||||
"is_greater_than": "هو أكبر من",
|
||||
"is_lesser_than": "هو أقل من",
|
||||
"days_before": "قبل x أيام"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "الاسم",
|
||||
"EMAIL": "البريد الإلكتروني",
|
||||
"PHONE_NUMBER": "رقم الهاتف",
|
||||
"IDENTIFIER": "المعرف",
|
||||
"CITY": "المدينة",
|
||||
"COUNTRY": "الدولة",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "القائمة",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "النص",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "العدد",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "الرابط",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "مربع",
|
||||
"CREATED_AT": "تم إنشاؤها في",
|
||||
"LAST_ACTIVITY": "آخر نشاط",
|
||||
"REFERER_LINK": "رابط المرجع"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "الفلاتر القياسية",
|
||||
"ADDITIONAL_FILTERS": "فلاتر إضافية",
|
||||
"CUSTOM_ATTRIBUTES": "سمات مخصصة"
|
||||
}
|
||||
"CONTACTS_FILTER": {
|
||||
"TITLE": "تصفية جهات الاتصال",
|
||||
"SUBTITLE": "إضافة فلاتر أدناه واضغط على 'إرسال' لتصفية جهات الاتصال.",
|
||||
"EDIT_CUSTOM_SEGMENT": "Edit Segment",
|
||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your segment.",
|
||||
"ADD_NEW_FILTER": "إضافة فلتر",
|
||||
"CLEAR_ALL_FILTERS": "مسح جميع الفلاتر",
|
||||
"FILTER_DELETE_ERROR": "يجب ان يكون لديك فلتر واحد على الاقل",
|
||||
"SUBMIT_BUTTON_LABEL": "إرسال",
|
||||
"UPDATE_BUTTON_LABEL": "Update Segment",
|
||||
"CANCEL_BUTTON_LABEL": "إلغاء",
|
||||
"CLEAR_BUTTON_LABEL": "مسح الفلاتر",
|
||||
"EMPTY_VALUE_ERROR": "القيمة مطلوبة",
|
||||
"SEGMENT_LABEL": "Segment Name",
|
||||
"SEGMENT_QUERY_LABEL": "Segment Query",
|
||||
"TOOLTIP_LABEL": "تصفية جهات الاتصال",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "و",
|
||||
"OR": "أو"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "يساوي",
|
||||
"not_equal_to": "لا يساوي",
|
||||
"contains": "يحتوي",
|
||||
"does_not_contain": "لا يحتوي",
|
||||
"is_present": "موجود",
|
||||
"is_not_present": "غير موجود",
|
||||
"is_greater_than": "هو أكبر من",
|
||||
"is_lesser_than": "هو أقل من",
|
||||
"days_before": "قبل x أيام"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "الاسم",
|
||||
"EMAIL": "البريد الإلكتروني",
|
||||
"PHONE_NUMBER": "رقم الهاتف",
|
||||
"IDENTIFIER": "المعرف",
|
||||
"CITY": "المدينة",
|
||||
"COUNTRY": "الدولة",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "القائمة",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "النص",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "العدد",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "الرابط",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "مربع",
|
||||
"CREATED_AT": "تم إنشاؤها في",
|
||||
"LAST_ACTIVITY": "آخر نشاط",
|
||||
"REFERER_LINK": "رابط المرجع"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "الفلاتر القياسية",
|
||||
"ADDITIONAL_FILTERS": "فلاتر إضافية",
|
||||
"CUSTOM_ATTRIBUTES": "سمات مخصصة"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,12 +54,14 @@
|
||||
"OPEN": "المزيد",
|
||||
"CLOSE": "أغلق",
|
||||
"DETAILS": "التفاصيل",
|
||||
"SNOOZED_UNTIL": "Snoozed until",
|
||||
"SNOOZED_UNTIL_TOMORROW": "غفوة حتى الغد",
|
||||
"SNOOZED_UNTIL_NEXT_WEEK": "غفوة حتى الأسبوع القادم",
|
||||
"SNOOZED_UNTIL_NEXT_REPLY": "غفوة حتى الرد التالي"
|
||||
},
|
||||
"RESOLVE_DROPDOWN": {
|
||||
"MARK_PENDING": "تحديد كمعلق",
|
||||
"SNOOZE_UNTIL": "غفوة",
|
||||
"SNOOZE": {
|
||||
"TITLE": "تأجيل حتى",
|
||||
"NEXT_REPLY": "الرد القادم",
|
||||
@@ -67,8 +69,13 @@
|
||||
"NEXT_WEEK": "الأسبوع المقبل"
|
||||
}
|
||||
},
|
||||
"CUSTOM_SNOOZE": {
|
||||
"TITLE": "تأجيل حتى",
|
||||
"APPLY": "غفوة",
|
||||
"CANCEL": "إلغاء"
|
||||
},
|
||||
"PRIORITY": {
|
||||
"TITLE": "Priority",
|
||||
"TITLE": "الأولوية",
|
||||
"OPTIONS": {
|
||||
"NONE": "لا شيء",
|
||||
"URGENT": "Urgent",
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
{
|
||||
"CSAT": {
|
||||
"TITLE": "قيم محادثتك",
|
||||
"PLACEHOLDER": "أخبرنا المزيد..."
|
||||
"PLACEHOLDER": "أخبرنا المزيد...",
|
||||
"RATINGS": {
|
||||
"POOR": "😞 Poor",
|
||||
"FAIR": "😑 Fair",
|
||||
"AVERAGE": "😐 Average",
|
||||
"GOOD": "😀 Good",
|
||||
"EXCELLENT": "😍 Excellent"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,10 @@
|
||||
}
|
||||
},
|
||||
"UPDATE_CHATWOOT": "يتوفر تحديث %{latestChatwootVersion} لـ Chatwoot. الرجاء التحديث.",
|
||||
"LEARN_MORE": "اعرف المزيد"
|
||||
"LEARN_MORE": "اعرف المزيد",
|
||||
"PAYMENT_PENDING": "Your payment is pending. Please update your payment information to continue using Chatwoot",
|
||||
"LIMITS_UPGRADE": "Your account has exceeded the usage limits, please upgrade your plan to continue using Chatwoot",
|
||||
"OPEN_BILLING": "Open billing"
|
||||
},
|
||||
"FORMS": {
|
||||
"MULTISELECT": {
|
||||
|
||||
@@ -74,6 +74,14 @@
|
||||
"DELETE": "حذف المقال"
|
||||
}
|
||||
},
|
||||
"ARTICLE_SEARCH_RESULT": {
|
||||
"UNCATEGORIZED": "Uncategorized",
|
||||
"INSERT_ARTICLE": "Insert",
|
||||
"NO_RESULT": "No articles found",
|
||||
"COPY_LINK": "Copy article link to clipboard",
|
||||
"OPEN_LINK": "Open article in new tab",
|
||||
"PREVIEW_LINK": "Preview article"
|
||||
},
|
||||
"PORTAL": {
|
||||
"HEADER": "الصفحات",
|
||||
"DEFAULT": "افتراضي",
|
||||
|
||||
@@ -535,7 +535,6 @@
|
||||
"UPDATE": "تحديث إعدادات ساعات العمل",
|
||||
"TOGGLE_AVAILABILITY": "تمكين توافر العمل لهذا البريد الوارد",
|
||||
"UNAVAILABLE_MESSAGE_LABEL": "رسالة غير متاح للزائرين",
|
||||
"UNAVAILABLE_MESSAGE_DEFAULT": "نحن غير متوفرين في هذه اللحظة. اترك رسالة سنرد عليها بمجرد عودتنا.",
|
||||
"TOGGLE_HELP": "تمكين توفر العمل سيظهر الساعات المتاحة على أداة الدردشة المباشرة حتى لو كان جميع الوكلاء غير متصلين بالإنترنت. خارج الساعات المتاحة يمكن تحذير الزوار برسالة ونموذج ما قبل الدردشة.",
|
||||
"DAY": {
|
||||
"ENABLE": "تمكين التوفر لهذا اليوم",
|
||||
|
||||
@@ -87,6 +87,8 @@
|
||||
},
|
||||
"OPEN_AI": {
|
||||
"TITLE": "Improve With AI",
|
||||
"SUMMARY_TITLE": "Summary with AI",
|
||||
"REPLY_TITLE": "Reply suggestion with AI",
|
||||
"SUBTITLE": "An improved reply will be generated using AI, based on your current draft.",
|
||||
"TONE": {
|
||||
"TITLE": "Tone",
|
||||
|
||||
@@ -3,16 +3,16 @@
|
||||
"TITLE": "تسجيل الدخول إلى Chatwoot",
|
||||
"EMAIL": {
|
||||
"LABEL": "البريد الإلكتروني",
|
||||
"PLACEHOLDER": "example@companyname.com"
|
||||
"PLACEHOLDER": "مثال: someone@example.com"
|
||||
},
|
||||
"PASSWORD": {
|
||||
"LABEL": "كلمة المرور",
|
||||
"PLACEHOLDER": "كلمة المرور"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Login successful",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again.",
|
||||
"UNAUTH": "Username or password is incorrect. Please try again."
|
||||
"SUCCESS_MESSAGE": "تم تسجيل الدخول بنجاح",
|
||||
"ERROR_MESSAGE": "تعذر الاتصال بالخادم، الرجاء المحاولة مرة أخرى لاحقاً",
|
||||
"UNAUTH": "اسم المستخدم / كلمة المرور غير صحيحة. الرجاء المحاولة مرة أخرى"
|
||||
},
|
||||
"OAUTH": {
|
||||
"GOOGLE_LOGIN": "Login with Google",
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
"LOADING_CHART": "تحميل بيانات الرسم البياني...",
|
||||
"NO_ENOUGH_DATA": "لم يتم جمع بيانات بقدر كافي لإنشاء التقرير، الرجاء المحاولة مرة أخرى لاحقاً.",
|
||||
"DOWNLOAD_AGENT_REPORTS": "تنزيل تقارير الوكيل",
|
||||
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
|
||||
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
|
||||
"METRICS": {
|
||||
"CONVERSATIONS": {
|
||||
"NAME": "المحادثات",
|
||||
@@ -34,6 +36,14 @@
|
||||
"DESC": "(الإجمالي)"
|
||||
}
|
||||
},
|
||||
"DATE_RANGE_OPTIONS": {
|
||||
"LAST_7_DAYS": "آخر 7 أيام",
|
||||
"LAST_30_DAYS": "آخر 30 يوماً",
|
||||
"LAST_3_MONTHS": "آخر 3 أشهر",
|
||||
"LAST_6_MONTHS": "آخر 6 أشهر",
|
||||
"LAST_YEAR": "العام الماضي",
|
||||
"CUSTOM_DATE_RANGE": "تحديد نطاق المدة"
|
||||
},
|
||||
"DATE_RANGE": [
|
||||
{
|
||||
"id": 0,
|
||||
@@ -66,6 +76,12 @@
|
||||
},
|
||||
"GROUP_BY_FILTER_DROPDOWN_LABEL": "تجميع بواسطة",
|
||||
"DURATION_FILTER_LABEL": "المدة",
|
||||
"GROUPING_OPTIONS": {
|
||||
"DAY": "اليوم",
|
||||
"WEEK": "الأسبوع",
|
||||
"MONTH": "الشهر",
|
||||
"YEAR": "السنة"
|
||||
},
|
||||
"GROUP_BY_DAY_OPTIONS": [
|
||||
{
|
||||
"id": 1,
|
||||
@@ -388,6 +404,7 @@
|
||||
"HEADER": "تقارير CSAT",
|
||||
"NO_RECORDS": "لا توجد ردود متوفرة على الدراسة الاستقصائية CSAT.",
|
||||
"DOWNLOAD": "تحميل تقرير رضاء خدمة العملاء",
|
||||
"DOWNLOAD_FAILED": "Failed to download CSAT Reports",
|
||||
"FILTERS": {
|
||||
"AGENTS": {
|
||||
"PLACEHOLDER": "اختر الوكلاء"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "تم إرسال رابط إعادة تعيين كلمة المرور إلى بريدك الإلكتروني.",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "تعذر الاتصال بالخادم، الرجاء المحاولة مرة أخرى لاحقاً"
|
||||
},
|
||||
"SUBMIT": "إرسال"
|
||||
}
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
"EMPTY_STATE": "No %{item} found for query '%{query}'",
|
||||
"EMPTY_STATE_FULL": "No results found for query '%{query}'",
|
||||
"PLACEHOLDER_KEYBINDING": "/ to focus",
|
||||
"INPUT_PLACEHOLDER": "Type 3 or more characters to search",
|
||||
"EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results. ",
|
||||
"INPUT_PLACEHOLDER": "Search messages, contacts or conversations",
|
||||
"EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results.",
|
||||
"BOT_LABEL": "رد آلي",
|
||||
"READ_MORE": "Read more",
|
||||
"WROTE": "wrote:"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "تم تغيير كلمة المرور بنجاح.",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "تعذر الاتصال بالخادم، الرجاء المحاولة مرة أخرى لاحقاً"
|
||||
},
|
||||
"CAPTCHA": {
|
||||
"ERROR": "انتهت صلاحية التحقق. الرجاء حل كلمة التحقق مرة أخرى."
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
"LINK": "إعدادات الملف الشخصي",
|
||||
"TITLE": "إعدادات الملف الشخصي",
|
||||
"BTN_TEXT": "تعديل الملف الشخصي",
|
||||
"DELETE_AVATAR": "حذف الصورة الرمزية",
|
||||
"AVATAR_DELETE_SUCCESS": "تم حذف الصورة الرمزية بنجاح",
|
||||
"AVATAR_DELETE_FAILED": "حدث خطأ أثناء حذف الصورة الرمزية، الرجاء المحاولة مرة أخرى",
|
||||
"DELETE_AVATAR": "حذف الصورة الشخصية",
|
||||
"AVATAR_DELETE_SUCCESS": "تم حذف الصورة الشخصية بنجاح",
|
||||
"AVATAR_DELETE_FAILED": "حدث خطأ أثناء حذف الصورة الشخصية، الرجاء المحاولة مرة أخرى",
|
||||
"UPDATE_SUCCESS": "تم تحديث حسابك بنجاح",
|
||||
"PASSWORD_UPDATE_SUCCESS": "تم تغيير كلمة المرور بنجاح",
|
||||
"AFTER_EMAIL_CHANGED": "تم تحديث ملفك الشخصي بنجاح، الرجاء تسجيل الدخول مرة أخرى حيث أنه قد تم تغيير بيانات تسجيل الدخول الخاصة بك",
|
||||
@@ -20,13 +20,13 @@
|
||||
"NOTE": "عنوان بريدك الإلكتروني هو المعرف الخاص بك الذي ستستخدمه لتسجيل الدخول."
|
||||
},
|
||||
"SEND_MESSAGE": {
|
||||
"TITLE": "المفتاح الرئيسي لإرسال الرسائل",
|
||||
"NOTE": "يمكنك تحديد مفتاح سريع (إما Enter أو Cmd/Ctrl+Enter) استنادًا إلى تفضيلك للكتابة.",
|
||||
"TITLE": "أختصار إرسال الرسائل",
|
||||
"NOTE": "يمكنك تحديد أختصار (إما Enter أو Cmd/Ctrl+Enter) استنادًا إلى تفضيلك في الكتابة.",
|
||||
"UPDATE_SUCCESS": "تم تحديث الإعدادات الخاصة بك بنجاح",
|
||||
"CARD": {
|
||||
"ENTER_KEY": {
|
||||
"HEADING": "Enter (↵)",
|
||||
"CONTENT": "إرسال الرسائل بالضغط على مفتاح الإدخال بدلاً من النقر على زر الإرسال."
|
||||
"CONTENT": "إرسال الرسائل بالضغط على مفتاح (Enter) بدلاً من النقر على زر الإرسال."
|
||||
},
|
||||
"CMD_ENTER_KEY": {
|
||||
"HEADING": "Cmd/Ctrl + Enter (<unk> + <unk> )",
|
||||
@@ -164,7 +164,7 @@
|
||||
"COMPONENTS": {
|
||||
"CODE": {
|
||||
"BUTTON_TEXT": "نسخ",
|
||||
"CODEPEN": "Open in CodePen",
|
||||
"CODEPEN": "فتح في CodePen",
|
||||
"COPY_SUCCESSFUL": "تم نسخ الكود إلى الحافظة بنجاح"
|
||||
},
|
||||
"SHOW_MORE_BLOCK": {
|
||||
@@ -203,7 +203,7 @@
|
||||
"HOME": "الرئيسية",
|
||||
"AGENTS": "موظف الدعم",
|
||||
"AGENT_BOTS": "البوتات",
|
||||
"AUDIT_LOGS": "Audit Logs",
|
||||
"AUDIT_LOGS": "سجلات التدقيق",
|
||||
"INBOXES": "قنوات التواصل",
|
||||
"NOTIFICATIONS": "الإشعارات",
|
||||
"CANNED_RESPONSES": "الردود السريعة",
|
||||
|
||||
@@ -10,33 +10,33 @@
|
||||
},
|
||||
"COMPANY_NAME": {
|
||||
"LABEL": "Company name",
|
||||
"PLACEHOLDER": "Enter your company name. E.g., Wayne Enterprises",
|
||||
"ERROR": "Company name is too short."
|
||||
"PLACEHOLDER": "Enter your company name. eg: Wayne Enterprises",
|
||||
"ERROR": "Company name is too short"
|
||||
},
|
||||
"FULL_NAME": {
|
||||
"LABEL": "الاسم الكامل",
|
||||
"PLACEHOLDER": "Enter your full name. E.g., Bruce Wayne",
|
||||
"ERROR": "Full name is too short."
|
||||
"PLACEHOLDER": "أدخل اسمك الكامل. مثال: بروس وين",
|
||||
"ERROR": "الاسم الكامل قصير جداً"
|
||||
},
|
||||
"EMAIL": {
|
||||
"LABEL": "البريد الإلكتروني للعمل",
|
||||
"PLACEHOLDER": "Enter your work email address. E.g., bruce@wayne.enterprises",
|
||||
"ERROR": "Please enter a valid work email address."
|
||||
"PLACEHOLDER": "أدخل عنوان بريدك الإلكتروني للعمل. مثال: bruce@wayne.enterprises",
|
||||
"ERROR": "Please enter a valid work email address"
|
||||
},
|
||||
"PASSWORD": {
|
||||
"LABEL": "كلمة المرور",
|
||||
"PLACEHOLDER": "كلمة المرور",
|
||||
"ERROR": "Password is too short.",
|
||||
"IS_INVALID_PASSWORD": "يجب أن تحتوي كلمة المرور على الأقل على حرف كبير واحد وحرف صغير واحد ورقم واحد وحرف خاص واحد."
|
||||
"ERROR": "كلمة المرور قصيرة جداً",
|
||||
"IS_INVALID_PASSWORD": "يجب أن تحتوي كلمة المرور على الأقل على حرف كبير واحد وحرف صغير واحد ورقم واحد وحرف خاص واحد"
|
||||
},
|
||||
"CONFIRM_PASSWORD": {
|
||||
"LABEL": "Confirm password",
|
||||
"PLACEHOLDER": "Confirm password",
|
||||
"ERROR": "كلمة المرور غير متطابقة."
|
||||
"LABEL": "تأكيد كلمة المرور",
|
||||
"PLACEHOLDER": "تأكيد كلمة المرور",
|
||||
"ERROR": "كلمة المرور غير متطابقة"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "تم التسجيل بنجاح",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "تعذر الاتصال بالخادم، الرجاء المحاولة مرة أخرى لاحقاً"
|
||||
},
|
||||
"SUBMIT": "إرسال",
|
||||
"HAVE_AN_ACCOUNT": "هل لديك حساب مسبق؟"
|
||||
|
||||
@@ -2,12 +2,17 @@
|
||||
"FILTER": {
|
||||
"TITLE": "Филтрирай разговорите",
|
||||
"SUBTITLE": "Добавете филтри по-долу и натиснете „Прилагане на филтри“, за да филтрирате разговорите.",
|
||||
"EDIT_CUSTOM_FILTER": "Edit Folder",
|
||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your folder.",
|
||||
"ADD_NEW_FILTER": "Добавяне на филтър",
|
||||
"FILTER_DELETE_ERROR": "За да запазите, трябва да имате поне един филтър",
|
||||
"SUBMIT_BUTTON_LABEL": "Прилагане на филтри",
|
||||
"UPDATE_BUTTON_LABEL": "Update folder",
|
||||
"CANCEL_BUTTON_LABEL": "Отмени",
|
||||
"CLEAR_BUTTON_LABEL": "Изчисти филтрите",
|
||||
"EMPTY_VALUE_ERROR": "Изисква се стойност",
|
||||
"FOLDER_LABEL": "Folder Name",
|
||||
"FOLDER_QUERY_LABEL": "Folder Query",
|
||||
"TOOLTIP_LABEL": "Филтрирай разговорите",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "И",
|
||||
@@ -71,6 +76,9 @@
|
||||
"ERROR_MESSAGE": "Error while creating segment"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"EDIT_BUTTON": "Edit folder"
|
||||
},
|
||||
"DELETE": {
|
||||
"DELETE_BUTTON": "Delete filter",
|
||||
"MODAL": {
|
||||
|
||||
@@ -12,13 +12,37 @@
|
||||
"TABLE_HEADER": [
|
||||
"User",
|
||||
"Action",
|
||||
"IP адрес",
|
||||
"Time"
|
||||
"IP адрес"
|
||||
]
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "AuditLogs retrieved successfully",
|
||||
"ERROR_MESSAGE": "Не можа да се свърже с Woot сървър. Моля, опитайте отново по-късно"
|
||||
},
|
||||
"DEFAULT_USER": "System",
|
||||
"AUTOMATION_RULE": {
|
||||
"ADD": "%{agentName} created a new automation rule (#%{id})",
|
||||
"EDIT": "%{agentName} updated an automation rule (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an automation rule (#%{id})"
|
||||
},
|
||||
"INBOX": {
|
||||
"ADD": "%{agentName} created a new inbox (#%{id})",
|
||||
"EDIT": "%{agentName} updated an inbox (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an inbox (#%{id})"
|
||||
},
|
||||
"WEBHOOK": {
|
||||
"ADD": "%{agentName} created a new webhook (#%{id})",
|
||||
"EDIT": "%{agentName} updated a webhook (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a webhook (#%{id})"
|
||||
},
|
||||
"USER_ACTION": {
|
||||
"SIGN_IN": "%{agentName} signed in",
|
||||
"SIGN_OUT": "%{agentName} signed out"
|
||||
},
|
||||
"TEAM": {
|
||||
"ADD": "%{agentName} created a new team (#%{id})",
|
||||
"EDIT": "%{agentName} updated a team (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a team (#%{id})"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
},
|
||||
"sort_on_created_at": {
|
||||
"TEXT": "Създаден в"
|
||||
},
|
||||
"sort_on_priority": {
|
||||
"TEXT": "Priority"
|
||||
}
|
||||
},
|
||||
"ATTACHMENTS": {
|
||||
|
||||
@@ -73,6 +73,13 @@
|
||||
"SUCCESS_MESSAGE": "Успешно запазване на контактите",
|
||||
"ERROR_MESSAGE": "Възникна грешка, моля опитайте отново"
|
||||
},
|
||||
"EXPORT_CONTACTS": {
|
||||
"BUTTON_LABEL": "Export",
|
||||
"TITLE": "Export Contacts",
|
||||
"DESC": "Export contacts to a CSV file.",
|
||||
"SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
|
||||
"ERROR_MESSAGE": "Възникна грешка, моля опитайте отново"
|
||||
},
|
||||
"DELETE_NOTE": {
|
||||
"CONFIRM": {
|
||||
"TITLE": "Потвърди изтриването",
|
||||
@@ -120,7 +127,7 @@
|
||||
"PHONE_NUMBER": {
|
||||
"PLACEHOLDER": "Добавете телефона на контакта",
|
||||
"LABEL": "Телефон",
|
||||
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]. You can select the dial code from the dropdown.",
|
||||
"HELP": "Телефона трябва да е във E.164 формат, например: +35955555555 [+][код на държавата][телефонен номер]",
|
||||
"ERROR": "Телефона трябва да е празен или във E.164 формат",
|
||||
"DIAL_CODE_ERROR": "Please select a dial code from the list",
|
||||
"DUPLICATE": "Телефона се използва от друг контакт."
|
||||
@@ -182,7 +189,7 @@
|
||||
"LABEL": "До"
|
||||
},
|
||||
"INBOX": {
|
||||
"LABEL": "Via Inbox",
|
||||
"LABEL": "Входяща кутия",
|
||||
"PLACEHOLDER": "Choose source inbox",
|
||||
"ERROR": "Изберете входяща кутия"
|
||||
},
|
||||
@@ -211,6 +218,7 @@
|
||||
"FILTER_CONTACTS": "Филтър",
|
||||
"FILTER_CONTACTS_SAVE": "Save filter",
|
||||
"FILTER_CONTACTS_DELETE": "Delete filter",
|
||||
"FILTER_CONTACTS_EDIT": "Edit segment",
|
||||
"LIST": {
|
||||
"LOADING_MESSAGE": "Зареждане на контактите...",
|
||||
"404": "Няма контакти отговарящи на търсенети ви 🔍",
|
||||
|
||||
@@ -1,50 +1,55 @@
|
||||
{
|
||||
"CONTACTS_FILTER": {
|
||||
"TITLE": "Филтриране на контакти",
|
||||
"SUBTITLE": "Добавете филтри по-долу и натиснете „Изпращане“, за да филтрирате контактите.",
|
||||
"ADD_NEW_FILTER": "Добавяне на филтър",
|
||||
"CLEAR_ALL_FILTERS": "Изчисти всички филтри",
|
||||
"FILTER_DELETE_ERROR": "За да запазите, трябва да имате поне един филтър",
|
||||
"SUBMIT_BUTTON_LABEL": "Изпращане",
|
||||
"CANCEL_BUTTON_LABEL": "Отмени",
|
||||
"CLEAR_BUTTON_LABEL": "Изчисти филтрите",
|
||||
"EMPTY_VALUE_ERROR": "Изисква се стойност",
|
||||
"TOOLTIP_LABEL": "Филтриране на контакти",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "И",
|
||||
"OR": "ИЛИ"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "Равно на",
|
||||
"not_equal_to": "Различно от",
|
||||
"contains": "Съдържа",
|
||||
"does_not_contain": "Не съдържа",
|
||||
"is_present": "Присъства",
|
||||
"is_not_present": "Не присъства",
|
||||
"is_greater_than": "Is greater than",
|
||||
"is_lesser_than": "Is lesser than",
|
||||
"days_before": "Is x days before"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "Име",
|
||||
"EMAIL": "Имейл",
|
||||
"PHONE_NUMBER": "Телефон",
|
||||
"IDENTIFIER": "Идентификатор",
|
||||
"CITY": "Град",
|
||||
"COUNTRY": "Държава",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "List",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "Text",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "Number",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "Link",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
|
||||
"CREATED_AT": "Created At",
|
||||
"LAST_ACTIVITY": "Последна активност",
|
||||
"REFERER_LINK": "Referrer link"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "Standard Filters",
|
||||
"ADDITIONAL_FILTERS": "Additional Filters",
|
||||
"CUSTOM_ATTRIBUTES": "Персонализирани атрибути"
|
||||
}
|
||||
"CONTACTS_FILTER": {
|
||||
"TITLE": "Филтриране на контакти",
|
||||
"SUBTITLE": "Добавете филтри по-долу и натиснете „Изпращане“, за да филтрирате контактите.",
|
||||
"EDIT_CUSTOM_SEGMENT": "Edit Segment",
|
||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your segment.",
|
||||
"ADD_NEW_FILTER": "Добавяне на филтър",
|
||||
"CLEAR_ALL_FILTERS": "Изчисти всички филтри",
|
||||
"FILTER_DELETE_ERROR": "За да запазите, трябва да имате поне един филтър",
|
||||
"SUBMIT_BUTTON_LABEL": "Изпращане",
|
||||
"UPDATE_BUTTON_LABEL": "Update Segment",
|
||||
"CANCEL_BUTTON_LABEL": "Отмени",
|
||||
"CLEAR_BUTTON_LABEL": "Изчисти филтрите",
|
||||
"EMPTY_VALUE_ERROR": "Изисква се стойност",
|
||||
"SEGMENT_LABEL": "Segment Name",
|
||||
"SEGMENT_QUERY_LABEL": "Segment Query",
|
||||
"TOOLTIP_LABEL": "Филтриране на контакти",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "И",
|
||||
"OR": "ИЛИ"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "Равно на",
|
||||
"not_equal_to": "Различно от",
|
||||
"contains": "Съдържа",
|
||||
"does_not_contain": "Не съдържа",
|
||||
"is_present": "Присъства",
|
||||
"is_not_present": "Не присъства",
|
||||
"is_greater_than": "Is greater than",
|
||||
"is_lesser_than": "Is lesser than",
|
||||
"days_before": "Is x days before"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "Име",
|
||||
"EMAIL": "Имейл",
|
||||
"PHONE_NUMBER": "Телефон",
|
||||
"IDENTIFIER": "Идентификатор",
|
||||
"CITY": "Град",
|
||||
"COUNTRY": "Държава",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "List",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "Text",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "Number",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "Link",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
|
||||
"CREATED_AT": "Created At",
|
||||
"LAST_ACTIVITY": "Последна активност",
|
||||
"REFERER_LINK": "Referrer link"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "Standard Filters",
|
||||
"ADDITIONAL_FILTERS": "Additional Filters",
|
||||
"CUSTOM_ATTRIBUTES": "Персонализирани атрибути"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,12 +54,14 @@
|
||||
"OPEN": "More",
|
||||
"CLOSE": "Close",
|
||||
"DETAILS": "details",
|
||||
"SNOOZED_UNTIL": "Snoozed until",
|
||||
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
|
||||
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
|
||||
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply"
|
||||
},
|
||||
"RESOLVE_DROPDOWN": {
|
||||
"MARK_PENDING": "Mark as pending",
|
||||
"SNOOZE_UNTIL": "Snooze",
|
||||
"SNOOZE": {
|
||||
"TITLE": "Snooze until",
|
||||
"NEXT_REPLY": "Next reply",
|
||||
@@ -67,6 +69,11 @@
|
||||
"NEXT_WEEK": "Next week"
|
||||
}
|
||||
},
|
||||
"CUSTOM_SNOOZE": {
|
||||
"TITLE": "Snooze until",
|
||||
"APPLY": "Snooze",
|
||||
"CANCEL": "Отмени"
|
||||
},
|
||||
"PRIORITY": {
|
||||
"TITLE": "Priority",
|
||||
"OPTIONS": {
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
{
|
||||
"CSAT": {
|
||||
"TITLE": "Rate your conversation",
|
||||
"PLACEHOLDER": "Tell us more..."
|
||||
"PLACEHOLDER": "Tell us more...",
|
||||
"RATINGS": {
|
||||
"POOR": "😞 Poor",
|
||||
"FAIR": "😑 Fair",
|
||||
"AVERAGE": "😐 Average",
|
||||
"GOOD": "😀 Good",
|
||||
"EXCELLENT": "😍 Excellent"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,10 @@
|
||||
}
|
||||
},
|
||||
"UPDATE_CHATWOOT": "An update %{latestChatwootVersion} for Chatwoot is available. Please update your instance.",
|
||||
"LEARN_MORE": "Learn more"
|
||||
"LEARN_MORE": "Learn more",
|
||||
"PAYMENT_PENDING": "Your payment is pending. Please update your payment information to continue using Chatwoot",
|
||||
"LIMITS_UPGRADE": "Your account has exceeded the usage limits, please upgrade your plan to continue using Chatwoot",
|
||||
"OPEN_BILLING": "Open billing"
|
||||
},
|
||||
"FORMS": {
|
||||
"MULTISELECT": {
|
||||
|
||||
@@ -74,6 +74,14 @@
|
||||
"DELETE": "Delete article"
|
||||
}
|
||||
},
|
||||
"ARTICLE_SEARCH_RESULT": {
|
||||
"UNCATEGORIZED": "Uncategorized",
|
||||
"INSERT_ARTICLE": "Insert",
|
||||
"NO_RESULT": "No articles found",
|
||||
"COPY_LINK": "Copy article link to clipboard",
|
||||
"OPEN_LINK": "Open article in new tab",
|
||||
"PREVIEW_LINK": "Preview article"
|
||||
},
|
||||
"PORTAL": {
|
||||
"HEADER": "Portals",
|
||||
"DEFAULT": "Default",
|
||||
|
||||
@@ -535,7 +535,6 @@
|
||||
"UPDATE": "Update business hours settings",
|
||||
"TOGGLE_AVAILABILITY": "Enable business availability for this inbox",
|
||||
"UNAVAILABLE_MESSAGE_LABEL": "Unavailable message for visitors",
|
||||
"UNAVAILABLE_MESSAGE_DEFAULT": "We are unavailable at the moment. Leave a message we will respond once we are back.",
|
||||
"TOGGLE_HELP": "Enabling business availability will show the available hours on live chat widget even if all the agents are offline. Outside available hours vistors can be warned with a message and a pre-chat form.",
|
||||
"DAY": {
|
||||
"ENABLE": "Enable availability for this day",
|
||||
|
||||
@@ -87,6 +87,8 @@
|
||||
},
|
||||
"OPEN_AI": {
|
||||
"TITLE": "Improve With AI",
|
||||
"SUMMARY_TITLE": "Summary with AI",
|
||||
"REPLY_TITLE": "Reply suggestion with AI",
|
||||
"SUBTITLE": "An improved reply will be generated using AI, based on your current draft.",
|
||||
"TONE": {
|
||||
"TITLE": "Tone",
|
||||
|
||||
@@ -3,16 +3,16 @@
|
||||
"TITLE": "Login to Chatwoot",
|
||||
"EMAIL": {
|
||||
"LABEL": "Email",
|
||||
"PLACEHOLDER": "example@companyname.com"
|
||||
"PLACEHOLDER": "Email eg: someone@example.com"
|
||||
},
|
||||
"PASSWORD": {
|
||||
"LABEL": "Password",
|
||||
"PLACEHOLDER": "Password"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Login successful",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again.",
|
||||
"UNAUTH": "Username or password is incorrect. Please try again."
|
||||
"SUCCESS_MESSAGE": "Login Successful",
|
||||
"ERROR_MESSAGE": "Не можа да се свърже с Woot сървър. Моля, опитайте отново по-късно",
|
||||
"UNAUTH": "Username / Password Incorrect. Please try again"
|
||||
},
|
||||
"OAUTH": {
|
||||
"GOOGLE_LOGIN": "Login with Google",
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
"LOADING_CHART": "Loading chart data...",
|
||||
"NO_ENOUGH_DATA": "We've not received enough data points to generate report, Please try again later.",
|
||||
"DOWNLOAD_AGENT_REPORTS": "Download agent reports",
|
||||
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
|
||||
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
|
||||
"METRICS": {
|
||||
"CONVERSATIONS": {
|
||||
"NAME": "Разговори",
|
||||
@@ -34,6 +36,14 @@
|
||||
"DESC": "( Total )"
|
||||
}
|
||||
},
|
||||
"DATE_RANGE_OPTIONS": {
|
||||
"LAST_7_DAYS": "Last 7 days",
|
||||
"LAST_30_DAYS": "Last 30 days",
|
||||
"LAST_3_MONTHS": "Last 3 months",
|
||||
"LAST_6_MONTHS": "Last 6 months",
|
||||
"LAST_YEAR": "Last year",
|
||||
"CUSTOM_DATE_RANGE": "Custom date range"
|
||||
},
|
||||
"DATE_RANGE": [
|
||||
{
|
||||
"id": 0,
|
||||
@@ -66,6 +76,12 @@
|
||||
},
|
||||
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
|
||||
"DURATION_FILTER_LABEL": "Duration",
|
||||
"GROUPING_OPTIONS": {
|
||||
"DAY": "Day",
|
||||
"WEEK": "Week",
|
||||
"MONTH": "Month",
|
||||
"YEAR": "Year"
|
||||
},
|
||||
"GROUP_BY_DAY_OPTIONS": [
|
||||
{
|
||||
"id": 1,
|
||||
@@ -388,6 +404,7 @@
|
||||
"HEADER": "CSAT Reports",
|
||||
"NO_RECORDS": "There are no CSAT survey responses available.",
|
||||
"DOWNLOAD": "Download CSAT Reports",
|
||||
"DOWNLOAD_FAILED": "Failed to download CSAT Reports",
|
||||
"FILTERS": {
|
||||
"AGENTS": {
|
||||
"PLACEHOLDER": "Choose Agents"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Password reset link has been sent to your email.",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "Не можа да се свърже с Woot сървър. Моля, опитайте отново по-късно"
|
||||
},
|
||||
"SUBMIT": "Изпращане"
|
||||
}
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
"EMPTY_STATE": "No %{item} found for query '%{query}'",
|
||||
"EMPTY_STATE_FULL": "No results found for query '%{query}'",
|
||||
"PLACEHOLDER_KEYBINDING": "/ to focus",
|
||||
"INPUT_PLACEHOLDER": "Type 3 or more characters to search",
|
||||
"EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results. ",
|
||||
"INPUT_PLACEHOLDER": "Search messages, contacts or conversations",
|
||||
"EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results.",
|
||||
"BOT_LABEL": "Бот",
|
||||
"READ_MORE": "Read more",
|
||||
"WROTE": "wrote:"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Successfully changed the password.",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "Не можа да се свърже с Woot сървър. Моля, опитайте отново по-късно"
|
||||
},
|
||||
"CAPTCHA": {
|
||||
"ERROR": "Verification expired. Please solve captcha again."
|
||||
|
||||
@@ -10,33 +10,33 @@
|
||||
},
|
||||
"COMPANY_NAME": {
|
||||
"LABEL": "Company name",
|
||||
"PLACEHOLDER": "Enter your company name. E.g., Wayne Enterprises",
|
||||
"ERROR": "Company name is too short."
|
||||
"PLACEHOLDER": "Enter your company name. eg: Wayne Enterprises",
|
||||
"ERROR": "Company name is too short"
|
||||
},
|
||||
"FULL_NAME": {
|
||||
"LABEL": "Full name",
|
||||
"PLACEHOLDER": "Enter your full name. E.g., Bruce Wayne",
|
||||
"ERROR": "Full name is too short."
|
||||
"PLACEHOLDER": "Enter your full name. eg: Bruce Wayne",
|
||||
"ERROR": "Full name is too short"
|
||||
},
|
||||
"EMAIL": {
|
||||
"LABEL": "Work email",
|
||||
"PLACEHOLDER": "Enter your work email address. E.g., bruce@wayne.enterprises",
|
||||
"ERROR": "Please enter a valid work email address."
|
||||
"PLACEHOLDER": "Enter your work email address. eg: bruce@wayne.enterprises",
|
||||
"ERROR": "Please enter a valid work email address"
|
||||
},
|
||||
"PASSWORD": {
|
||||
"LABEL": "Password",
|
||||
"PLACEHOLDER": "Password",
|
||||
"ERROR": "Password is too short.",
|
||||
"IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
|
||||
"ERROR": "Password is too short",
|
||||
"IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
|
||||
},
|
||||
"CONFIRM_PASSWORD": {
|
||||
"LABEL": "Confirm password",
|
||||
"PLACEHOLDER": "Confirm password",
|
||||
"ERROR": "Password doesnot match."
|
||||
"LABEL": "Confirm Password",
|
||||
"PLACEHOLDER": "Confirm Password",
|
||||
"ERROR": "Password doesnot match"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Registration Successfull",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "Не можа да се свърже с Woot сървър. Моля, опитайте отново по-късно"
|
||||
},
|
||||
"SUBMIT": "Create account",
|
||||
"HAVE_AN_ACCOUNT": "Already have an account?"
|
||||
|
||||
@@ -2,12 +2,17 @@
|
||||
"FILTER": {
|
||||
"TITLE": "Filtre de converses",
|
||||
"SUBTITLE": "Add filters below and hit 'Apply filters' to filter conversations.",
|
||||
"EDIT_CUSTOM_FILTER": "Edit Folder",
|
||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your folder.",
|
||||
"ADD_NEW_FILTER": "Afegeix filtre",
|
||||
"FILTER_DELETE_ERROR": "You should have atleast one filter to save",
|
||||
"SUBMIT_BUTTON_LABEL": "Aplicar filtres",
|
||||
"UPDATE_BUTTON_LABEL": "Update folder",
|
||||
"CANCEL_BUTTON_LABEL": "Cancel·la",
|
||||
"CLEAR_BUTTON_LABEL": "Clear Filters",
|
||||
"EMPTY_VALUE_ERROR": "El valor és necessari",
|
||||
"FOLDER_LABEL": "Folder Name",
|
||||
"FOLDER_QUERY_LABEL": "Folder Query",
|
||||
"TOOLTIP_LABEL": "Filtre de converses",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "I",
|
||||
@@ -71,6 +76,9 @@
|
||||
"ERROR_MESSAGE": "Error while creating segment"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"EDIT_BUTTON": "Edit folder"
|
||||
},
|
||||
"DELETE": {
|
||||
"DELETE_BUTTON": "Delete filter",
|
||||
"MODAL": {
|
||||
|
||||
@@ -12,13 +12,37 @@
|
||||
"TABLE_HEADER": [
|
||||
"User",
|
||||
"Action",
|
||||
"Adreça IP",
|
||||
"Time"
|
||||
"Adreça IP"
|
||||
]
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "AuditLogs retrieved successfully",
|
||||
"ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant"
|
||||
},
|
||||
"DEFAULT_USER": "System",
|
||||
"AUTOMATION_RULE": {
|
||||
"ADD": "%{agentName} created a new automation rule (#%{id})",
|
||||
"EDIT": "%{agentName} updated an automation rule (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an automation rule (#%{id})"
|
||||
},
|
||||
"INBOX": {
|
||||
"ADD": "%{agentName} created a new inbox (#%{id})",
|
||||
"EDIT": "%{agentName} updated an inbox (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an inbox (#%{id})"
|
||||
},
|
||||
"WEBHOOK": {
|
||||
"ADD": "%{agentName} created a new webhook (#%{id})",
|
||||
"EDIT": "%{agentName} updated a webhook (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a webhook (#%{id})"
|
||||
},
|
||||
"USER_ACTION": {
|
||||
"SIGN_IN": "%{agentName} signed in",
|
||||
"SIGN_OUT": "%{agentName} signed out"
|
||||
},
|
||||
"TEAM": {
|
||||
"ADD": "%{agentName} created a new team (#%{id})",
|
||||
"EDIT": "%{agentName} updated a team (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a team (#%{id})"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
},
|
||||
"sort_on_created_at": {
|
||||
"TEXT": "Created at"
|
||||
},
|
||||
"sort_on_priority": {
|
||||
"TEXT": "Priority"
|
||||
}
|
||||
},
|
||||
"ATTACHMENTS": {
|
||||
|
||||
@@ -73,6 +73,13 @@
|
||||
"SUCCESS_MESSAGE": "Contactes desat correctament",
|
||||
"ERROR_MESSAGE": "S'ha produït un error; tornau-ho a provar"
|
||||
},
|
||||
"EXPORT_CONTACTS": {
|
||||
"BUTTON_LABEL": "Export",
|
||||
"TITLE": "Export Contacts",
|
||||
"DESC": "Export contacts to a CSV file.",
|
||||
"SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
|
||||
"ERROR_MESSAGE": "S'ha produït un error; tornau-ho a provar"
|
||||
},
|
||||
"DELETE_NOTE": {
|
||||
"CONFIRM": {
|
||||
"TITLE": "Confirma l'esborrat",
|
||||
@@ -120,7 +127,7 @@
|
||||
"PHONE_NUMBER": {
|
||||
"PLACEHOLDER": "Introdueix el número de telèfon del contacte",
|
||||
"LABEL": "Número de telèfon",
|
||||
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]. You can select the dial code from the dropdown.",
|
||||
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]",
|
||||
"ERROR": "Phone number should be either empty or of E.164 format",
|
||||
"DIAL_CODE_ERROR": "Please select a dial code from the list",
|
||||
"DUPLICATE": "This phone number is in use for another contact."
|
||||
@@ -182,7 +189,7 @@
|
||||
"LABEL": "To"
|
||||
},
|
||||
"INBOX": {
|
||||
"LABEL": "Via Inbox",
|
||||
"LABEL": "Inbox",
|
||||
"PLACEHOLDER": "Choose source inbox",
|
||||
"ERROR": "Select an inbox"
|
||||
},
|
||||
@@ -211,6 +218,7 @@
|
||||
"FILTER_CONTACTS": "Filter",
|
||||
"FILTER_CONTACTS_SAVE": "Save filter",
|
||||
"FILTER_CONTACTS_DELETE": "Delete filter",
|
||||
"FILTER_CONTACTS_EDIT": "Edit segment",
|
||||
"LIST": {
|
||||
"LOADING_MESSAGE": "Carregant contactes...",
|
||||
"404": "No hi ha cap contacte que coincideixi amb la vostra cerca 🔍",
|
||||
|
||||
@@ -1,50 +1,55 @@
|
||||
{
|
||||
"CONTACTS_FILTER": {
|
||||
"TITLE": "Filter Contacts",
|
||||
"SUBTITLE": "Add filters below and hit 'Submit' to filter contacts.",
|
||||
"ADD_NEW_FILTER": "Afegeix filtre",
|
||||
"CLEAR_ALL_FILTERS": "Clear All Filters",
|
||||
"FILTER_DELETE_ERROR": "You should have atleast one filter to save",
|
||||
"SUBMIT_BUTTON_LABEL": "Envia",
|
||||
"CANCEL_BUTTON_LABEL": "Cancel·la",
|
||||
"CLEAR_BUTTON_LABEL": "Clear Filters",
|
||||
"EMPTY_VALUE_ERROR": "El valor és necessari",
|
||||
"TOOLTIP_LABEL": "Filter contacts",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "I",
|
||||
"OR": "O"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "Igual a",
|
||||
"not_equal_to": "No és igual a",
|
||||
"contains": "Conté",
|
||||
"does_not_contain": "No conté",
|
||||
"is_present": "És present",
|
||||
"is_not_present": "No és present",
|
||||
"is_greater_than": "És més gran que",
|
||||
"is_lesser_than": "Is lesser than",
|
||||
"days_before": "Is x days before"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "Nom",
|
||||
"EMAIL": "Correu electrònic",
|
||||
"PHONE_NUMBER": "Número de telèfon",
|
||||
"IDENTIFIER": "Identifier",
|
||||
"CITY": "City",
|
||||
"COUNTRY": "Country",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "List",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "Llista",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "Número",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "Enllaç",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
|
||||
"CREATED_AT": "Created At",
|
||||
"LAST_ACTIVITY": "Last Activity",
|
||||
"REFERER_LINK": "Referrer link"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "Standard Filters",
|
||||
"ADDITIONAL_FILTERS": "Additional Filters",
|
||||
"CUSTOM_ATTRIBUTES": "Atributs personalitzats"
|
||||
}
|
||||
"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.",
|
||||
"ADD_NEW_FILTER": "Afegeix filtre",
|
||||
"CLEAR_ALL_FILTERS": "Clear All Filters",
|
||||
"FILTER_DELETE_ERROR": "You should have atleast one filter to save",
|
||||
"SUBMIT_BUTTON_LABEL": "Envia",
|
||||
"UPDATE_BUTTON_LABEL": "Update Segment",
|
||||
"CANCEL_BUTTON_LABEL": "Cancel·la",
|
||||
"CLEAR_BUTTON_LABEL": "Clear Filters",
|
||||
"EMPTY_VALUE_ERROR": "El valor és necessari",
|
||||
"SEGMENT_LABEL": "Segment Name",
|
||||
"SEGMENT_QUERY_LABEL": "Segment Query",
|
||||
"TOOLTIP_LABEL": "Filter contacts",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "I",
|
||||
"OR": "O"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "Igual a",
|
||||
"not_equal_to": "No és igual a",
|
||||
"contains": "Conté",
|
||||
"does_not_contain": "No conté",
|
||||
"is_present": "És present",
|
||||
"is_not_present": "No és present",
|
||||
"is_greater_than": "És més gran que",
|
||||
"is_lesser_than": "Is lesser than",
|
||||
"days_before": "Is x days before"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "Nom",
|
||||
"EMAIL": "Correu electrònic",
|
||||
"PHONE_NUMBER": "Número de telèfon",
|
||||
"IDENTIFIER": "Identifier",
|
||||
"CITY": "City",
|
||||
"COUNTRY": "Country",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "List",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "Llista",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "Número",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "Enllaç",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
|
||||
"CREATED_AT": "Created At",
|
||||
"LAST_ACTIVITY": "Last Activity",
|
||||
"REFERER_LINK": "Referrer link"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "Standard Filters",
|
||||
"ADDITIONAL_FILTERS": "Additional Filters",
|
||||
"CUSTOM_ATTRIBUTES": "Atributs personalitzats"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,12 +54,14 @@
|
||||
"OPEN": "Més",
|
||||
"CLOSE": "Tanca",
|
||||
"DETAILS": "detalls",
|
||||
"SNOOZED_UNTIL": "Snoozed until",
|
||||
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
|
||||
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
|
||||
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply"
|
||||
},
|
||||
"RESOLVE_DROPDOWN": {
|
||||
"MARK_PENDING": "Mark as pending",
|
||||
"SNOOZE_UNTIL": "Snooze",
|
||||
"SNOOZE": {
|
||||
"TITLE": "Snooze until",
|
||||
"NEXT_REPLY": "Next reply",
|
||||
@@ -67,6 +69,11 @@
|
||||
"NEXT_WEEK": "Next week"
|
||||
}
|
||||
},
|
||||
"CUSTOM_SNOOZE": {
|
||||
"TITLE": "Snooze until",
|
||||
"APPLY": "Snooze",
|
||||
"CANCEL": "Cancel·la"
|
||||
},
|
||||
"PRIORITY": {
|
||||
"TITLE": "Priority",
|
||||
"OPTIONS": {
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
{
|
||||
"CSAT": {
|
||||
"TITLE": "Rate your conversation",
|
||||
"PLACEHOLDER": "Tell us more..."
|
||||
"PLACEHOLDER": "Tell us more...",
|
||||
"RATINGS": {
|
||||
"POOR": "😞 Poor",
|
||||
"FAIR": "😑 Fair",
|
||||
"AVERAGE": "😐 Average",
|
||||
"GOOD": "😀 Good",
|
||||
"EXCELLENT": "😍 Excellent"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,10 @@
|
||||
}
|
||||
},
|
||||
"UPDATE_CHATWOOT": "L'actualització %{latestChatwootVersion} per Chatwoot està disponible. Si us plau, actualitza l'instancia.",
|
||||
"LEARN_MORE": "Learn more"
|
||||
"LEARN_MORE": "Learn more",
|
||||
"PAYMENT_PENDING": "Your payment is pending. Please update your payment information to continue using Chatwoot",
|
||||
"LIMITS_UPGRADE": "Your account has exceeded the usage limits, please upgrade your plan to continue using Chatwoot",
|
||||
"OPEN_BILLING": "Open billing"
|
||||
},
|
||||
"FORMS": {
|
||||
"MULTISELECT": {
|
||||
|
||||
@@ -74,6 +74,14 @@
|
||||
"DELETE": "Delete article"
|
||||
}
|
||||
},
|
||||
"ARTICLE_SEARCH_RESULT": {
|
||||
"UNCATEGORIZED": "Uncategorized",
|
||||
"INSERT_ARTICLE": "Insert",
|
||||
"NO_RESULT": "No articles found",
|
||||
"COPY_LINK": "Copy article link to clipboard",
|
||||
"OPEN_LINK": "Open article in new tab",
|
||||
"PREVIEW_LINK": "Preview article"
|
||||
},
|
||||
"PORTAL": {
|
||||
"HEADER": "Portals",
|
||||
"DEFAULT": "Default",
|
||||
|
||||
@@ -535,7 +535,6 @@
|
||||
"UPDATE": "Update business hours settings",
|
||||
"TOGGLE_AVAILABILITY": "Enable business availability for this inbox",
|
||||
"UNAVAILABLE_MESSAGE_LABEL": "Unavailable message for visitors",
|
||||
"UNAVAILABLE_MESSAGE_DEFAULT": "We are unavailable at the moment. Leave a message we will respond once we are back.",
|
||||
"TOGGLE_HELP": "Enabling business availability will show the available hours on live chat widget even if all the agents are offline. Outside available hours vistors can be warned with a message and a pre-chat form.",
|
||||
"DAY": {
|
||||
"ENABLE": "Enable availability for this day",
|
||||
|
||||
@@ -87,6 +87,8 @@
|
||||
},
|
||||
"OPEN_AI": {
|
||||
"TITLE": "Improve With AI",
|
||||
"SUMMARY_TITLE": "Summary with AI",
|
||||
"REPLY_TITLE": "Reply suggestion with AI",
|
||||
"SUBTITLE": "An improved reply will be generated using AI, based on your current draft.",
|
||||
"TONE": {
|
||||
"TITLE": "Tone",
|
||||
|
||||
@@ -3,16 +3,16 @@
|
||||
"TITLE": "Entra a Chatwoot",
|
||||
"EMAIL": {
|
||||
"LABEL": "Correu electrònic",
|
||||
"PLACEHOLDER": "example@companyname.com"
|
||||
"PLACEHOLDER": "Correu electrònic p.e.: someone@exemple.com"
|
||||
},
|
||||
"PASSWORD": {
|
||||
"LABEL": "Contrasenya",
|
||||
"PLACEHOLDER": "Contrasenya"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Login successful",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again.",
|
||||
"UNAUTH": "Username or password is incorrect. Please try again."
|
||||
"SUCCESS_MESSAGE": "Iniciada la sessió amb èxit",
|
||||
"ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant",
|
||||
"UNAUTH": "Nom d'usuari / contrasenya incorrecte. Torna-ho a provar-ho"
|
||||
},
|
||||
"OAUTH": {
|
||||
"GOOGLE_LOGIN": "Login with Google",
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
"LOADING_CHART": "S'estan carregant dades del gràfic...",
|
||||
"NO_ENOUGH_DATA": "No hem rebut suficients punts de dades per generar l'informe. Torneu-ho a provar més endavant.",
|
||||
"DOWNLOAD_AGENT_REPORTS": "Descarregar Informes d'Agent",
|
||||
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
|
||||
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
|
||||
"METRICS": {
|
||||
"CONVERSATIONS": {
|
||||
"NAME": "Converses",
|
||||
@@ -34,6 +36,14 @@
|
||||
"DESC": "( Total )"
|
||||
}
|
||||
},
|
||||
"DATE_RANGE_OPTIONS": {
|
||||
"LAST_7_DAYS": "Últims 7 dies",
|
||||
"LAST_30_DAYS": "Últims 30 dies",
|
||||
"LAST_3_MONTHS": "Last 3 months",
|
||||
"LAST_6_MONTHS": "Last 6 months",
|
||||
"LAST_YEAR": "Last year",
|
||||
"CUSTOM_DATE_RANGE": "Custom date range"
|
||||
},
|
||||
"DATE_RANGE": [
|
||||
{
|
||||
"id": 0,
|
||||
@@ -66,6 +76,12 @@
|
||||
},
|
||||
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
|
||||
"DURATION_FILTER_LABEL": "Duration",
|
||||
"GROUPING_OPTIONS": {
|
||||
"DAY": "Day",
|
||||
"WEEK": "Week",
|
||||
"MONTH": "Month",
|
||||
"YEAR": "Year"
|
||||
},
|
||||
"GROUP_BY_DAY_OPTIONS": [
|
||||
{
|
||||
"id": 1,
|
||||
@@ -388,6 +404,7 @@
|
||||
"HEADER": "CSAT Reports",
|
||||
"NO_RECORDS": "There are no CSAT survey responses available.",
|
||||
"DOWNLOAD": "Download CSAT Reports",
|
||||
"DOWNLOAD_FAILED": "Failed to download CSAT Reports",
|
||||
"FILTERS": {
|
||||
"AGENTS": {
|
||||
"PLACEHOLDER": "Choose Agents"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "L’enllaç de reinicialització de la contrasenya s’ha enviat al vostre correu electrònic.",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant"
|
||||
},
|
||||
"SUBMIT": "Envia"
|
||||
}
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
"EMPTY_STATE": "No %{item} found for query '%{query}'",
|
||||
"EMPTY_STATE_FULL": "No results found for query '%{query}'",
|
||||
"PLACEHOLDER_KEYBINDING": "/ to focus",
|
||||
"INPUT_PLACEHOLDER": "Type 3 or more characters to search",
|
||||
"EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results. ",
|
||||
"INPUT_PLACEHOLDER": "Search messages, contacts or conversations",
|
||||
"EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results.",
|
||||
"BOT_LABEL": "Bot",
|
||||
"READ_MORE": "Read more",
|
||||
"WROTE": "wrote:"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "S'ha canviat la contrasenya correctament.",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant"
|
||||
},
|
||||
"CAPTCHA": {
|
||||
"ERROR": "Verification expired. Please solve captcha again."
|
||||
|
||||
@@ -10,33 +10,33 @@
|
||||
},
|
||||
"COMPANY_NAME": {
|
||||
"LABEL": "Company name",
|
||||
"PLACEHOLDER": "Enter your company name. E.g., Wayne Enterprises",
|
||||
"ERROR": "Company name is too short."
|
||||
"PLACEHOLDER": "Enter your company name. eg: Wayne Enterprises",
|
||||
"ERROR": "Company name is too short"
|
||||
},
|
||||
"FULL_NAME": {
|
||||
"LABEL": "Nom complet",
|
||||
"PLACEHOLDER": "Enter your full name. E.g., Bruce Wayne",
|
||||
"ERROR": "El nom del compte és massa curt."
|
||||
"PLACEHOLDER": "Introdueix el teu nom complet. ex: Bruce Wayne",
|
||||
"ERROR": "El nom del compte és massa curt"
|
||||
},
|
||||
"EMAIL": {
|
||||
"LABEL": "Email de treball",
|
||||
"PLACEHOLDER": "Enter your work email address. E.g., bruce@wayne.enterprises",
|
||||
"ERROR": "Please enter a valid work email address."
|
||||
"PLACEHOLDER": "Introdueix la teva adreça email de treball. ex: bruce@wayne.enterprises",
|
||||
"ERROR": "Please enter a valid work email address"
|
||||
},
|
||||
"PASSWORD": {
|
||||
"LABEL": "Contrasenya",
|
||||
"PLACEHOLDER": "Contrasenya",
|
||||
"ERROR": "La contrasenya és massa curta.",
|
||||
"IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character."
|
||||
"ERROR": "La contrasenya és massa curta",
|
||||
"IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
|
||||
},
|
||||
"CONFIRM_PASSWORD": {
|
||||
"LABEL": "Confirm password",
|
||||
"PLACEHOLDER": "Confirm password",
|
||||
"ERROR": "Les contrasenyes no coincideixen."
|
||||
"LABEL": "Confirma la contrasenya",
|
||||
"PLACEHOLDER": "Confirma la contrasenya",
|
||||
"ERROR": "Les contrasenyes no coincideixen"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Registrat correctament",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "No s'ha pogut connectar amb el servidor Woot. Torna-ho a provar més endavant"
|
||||
},
|
||||
"SUBMIT": "Create account",
|
||||
"HAVE_AN_ACCOUNT": "Ja tens un compte?"
|
||||
|
||||
@@ -2,12 +2,17 @@
|
||||
"FILTER": {
|
||||
"TITLE": "Filter Conversations",
|
||||
"SUBTITLE": "Add filters below and hit 'Apply filters' to filter conversations.",
|
||||
"EDIT_CUSTOM_FILTER": "Edit Folder",
|
||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your folder.",
|
||||
"ADD_NEW_FILTER": "Add Filter",
|
||||
"FILTER_DELETE_ERROR": "You should have atleast one filter to save",
|
||||
"SUBMIT_BUTTON_LABEL": "Apply filters",
|
||||
"UPDATE_BUTTON_LABEL": "Update folder",
|
||||
"CANCEL_BUTTON_LABEL": "Zrušit",
|
||||
"CLEAR_BUTTON_LABEL": "Clear Filters",
|
||||
"EMPTY_VALUE_ERROR": "Value is required",
|
||||
"FOLDER_LABEL": "Folder Name",
|
||||
"FOLDER_QUERY_LABEL": "Folder Query",
|
||||
"TOOLTIP_LABEL": "Filter conversations",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "AND",
|
||||
@@ -71,6 +76,9 @@
|
||||
"ERROR_MESSAGE": "Error while creating segment"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"EDIT_BUTTON": "Edit folder"
|
||||
},
|
||||
"DELETE": {
|
||||
"DELETE_BUTTON": "Delete filter",
|
||||
"MODAL": {
|
||||
|
||||
@@ -12,13 +12,37 @@
|
||||
"TABLE_HEADER": [
|
||||
"User",
|
||||
"Action",
|
||||
"IP adresa",
|
||||
"Time"
|
||||
"IP adresa"
|
||||
]
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "AuditLogs retrieved successfully",
|
||||
"ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později"
|
||||
},
|
||||
"DEFAULT_USER": "System",
|
||||
"AUTOMATION_RULE": {
|
||||
"ADD": "%{agentName} created a new automation rule (#%{id})",
|
||||
"EDIT": "%{agentName} updated an automation rule (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an automation rule (#%{id})"
|
||||
},
|
||||
"INBOX": {
|
||||
"ADD": "%{agentName} created a new inbox (#%{id})",
|
||||
"EDIT": "%{agentName} updated an inbox (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an inbox (#%{id})"
|
||||
},
|
||||
"WEBHOOK": {
|
||||
"ADD": "%{agentName} created a new webhook (#%{id})",
|
||||
"EDIT": "%{agentName} updated a webhook (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a webhook (#%{id})"
|
||||
},
|
||||
"USER_ACTION": {
|
||||
"SIGN_IN": "%{agentName} signed in",
|
||||
"SIGN_OUT": "%{agentName} signed out"
|
||||
},
|
||||
"TEAM": {
|
||||
"ADD": "%{agentName} created a new team (#%{id})",
|
||||
"EDIT": "%{agentName} updated a team (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a team (#%{id})"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
},
|
||||
"sort_on_created_at": {
|
||||
"TEXT": "Created at"
|
||||
},
|
||||
"sort_on_priority": {
|
||||
"TEXT": "Priority"
|
||||
}
|
||||
},
|
||||
"ATTACHMENTS": {
|
||||
|
||||
@@ -73,6 +73,13 @@
|
||||
"SUCCESS_MESSAGE": "Contacts saved successfully",
|
||||
"ERROR_MESSAGE": "Došlo k chybě, zkuste to prosím znovu"
|
||||
},
|
||||
"EXPORT_CONTACTS": {
|
||||
"BUTTON_LABEL": "Export",
|
||||
"TITLE": "Export Contacts",
|
||||
"DESC": "Export contacts to a CSV file.",
|
||||
"SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
|
||||
"ERROR_MESSAGE": "Došlo k chybě, zkuste to prosím znovu"
|
||||
},
|
||||
"DELETE_NOTE": {
|
||||
"CONFIRM": {
|
||||
"TITLE": "Potvrdit odstranění",
|
||||
@@ -120,7 +127,7 @@
|
||||
"PHONE_NUMBER": {
|
||||
"PLACEHOLDER": "Zadejte telefonní číslo kontaktu",
|
||||
"LABEL": "Telefonní číslo",
|
||||
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]. You can select the dial code from the dropdown.",
|
||||
"HELP": "Phone number should be of E.164 format eg: +1415555555 [+][country code][area code][local phone number]",
|
||||
"ERROR": "Phone number should be either empty or of E.164 format",
|
||||
"DIAL_CODE_ERROR": "Please select a dial code from the list",
|
||||
"DUPLICATE": "This phone number is in use for another contact."
|
||||
@@ -182,7 +189,7 @@
|
||||
"LABEL": "To"
|
||||
},
|
||||
"INBOX": {
|
||||
"LABEL": "Via Inbox",
|
||||
"LABEL": "Inbox",
|
||||
"PLACEHOLDER": "Choose source inbox",
|
||||
"ERROR": "Select an inbox"
|
||||
},
|
||||
@@ -211,6 +218,7 @@
|
||||
"FILTER_CONTACTS": "Filter",
|
||||
"FILTER_CONTACTS_SAVE": "Save filter",
|
||||
"FILTER_CONTACTS_DELETE": "Delete filter",
|
||||
"FILTER_CONTACTS_EDIT": "Edit segment",
|
||||
"LIST": {
|
||||
"LOADING_MESSAGE": "Načítání kontaktů...",
|
||||
"404": "Vašemu hledání neodpovídají žádné kontakty 🔍",
|
||||
|
||||
@@ -1,50 +1,55 @@
|
||||
{
|
||||
"CONTACTS_FILTER": {
|
||||
"TITLE": "Filtrovat kontakty",
|
||||
"SUBTITLE": "Přidejte filtry níže a stiskněte 'Odeslat' pro filtrování kontaktů.",
|
||||
"ADD_NEW_FILTER": "Přidat filtr",
|
||||
"CLEAR_ALL_FILTERS": "Vymazat všechny filtry",
|
||||
"FILTER_DELETE_ERROR": "Pro uložení byste měli mít alespoň jeden filtr",
|
||||
"SUBMIT_BUTTON_LABEL": "Odeslat",
|
||||
"CANCEL_BUTTON_LABEL": "Zrušit",
|
||||
"CLEAR_BUTTON_LABEL": "Vymazat filtry",
|
||||
"EMPTY_VALUE_ERROR": "Hodnota je povinná",
|
||||
"TOOLTIP_LABEL": "Filtrovat kontakty",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "A",
|
||||
"OR": "NEBO"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "Rovno",
|
||||
"not_equal_to": "Nerovno",
|
||||
"contains": "Obsahuje",
|
||||
"does_not_contain": "Neobsahuje",
|
||||
"is_present": "Je přítomno",
|
||||
"is_not_present": "Není přítomno",
|
||||
"is_greater_than": "Je větší než",
|
||||
"is_lesser_than": "Je menší než",
|
||||
"days_before": "Je o x dnů dříve"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "Název",
|
||||
"EMAIL": "E-mailová adresa",
|
||||
"PHONE_NUMBER": "Telefonní číslo",
|
||||
"IDENTIFIER": "Identifikátor",
|
||||
"CITY": "Město",
|
||||
"COUNTRY": "Země",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "Seznam",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "Text",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "Číslo",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "Odkaz",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Zaškrtávací pole",
|
||||
"CREATED_AT": "Vytvořeno",
|
||||
"LAST_ACTIVITY": "Poslední aktivita",
|
||||
"REFERER_LINK": "Odkazující odkaz"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "Standardní filtry",
|
||||
"ADDITIONAL_FILTERS": "Další filtry",
|
||||
"CUSTOM_ATTRIBUTES": "Vlastní atributy"
|
||||
}
|
||||
"CONTACTS_FILTER": {
|
||||
"TITLE": "Filtrovat kontakty",
|
||||
"SUBTITLE": "Přidejte filtry níže a stiskněte 'Odeslat' pro filtrování kontaktů.",
|
||||
"EDIT_CUSTOM_SEGMENT": "Edit Segment",
|
||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your segment.",
|
||||
"ADD_NEW_FILTER": "Přidat filtr",
|
||||
"CLEAR_ALL_FILTERS": "Vymazat všechny filtry",
|
||||
"FILTER_DELETE_ERROR": "Pro uložení byste měli mít alespoň jeden filtr",
|
||||
"SUBMIT_BUTTON_LABEL": "Odeslat",
|
||||
"UPDATE_BUTTON_LABEL": "Update Segment",
|
||||
"CANCEL_BUTTON_LABEL": "Zrušit",
|
||||
"CLEAR_BUTTON_LABEL": "Vymazat filtry",
|
||||
"EMPTY_VALUE_ERROR": "Hodnota je povinná",
|
||||
"SEGMENT_LABEL": "Segment Name",
|
||||
"SEGMENT_QUERY_LABEL": "Segment Query",
|
||||
"TOOLTIP_LABEL": "Filtrovat kontakty",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "A",
|
||||
"OR": "NEBO"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "Rovno",
|
||||
"not_equal_to": "Nerovno",
|
||||
"contains": "Obsahuje",
|
||||
"does_not_contain": "Neobsahuje",
|
||||
"is_present": "Je přítomno",
|
||||
"is_not_present": "Není přítomno",
|
||||
"is_greater_than": "Je větší než",
|
||||
"is_lesser_than": "Je menší než",
|
||||
"days_before": "Je o x dnů dříve"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "Název",
|
||||
"EMAIL": "E-mailová adresa",
|
||||
"PHONE_NUMBER": "Telefonní číslo",
|
||||
"IDENTIFIER": "Identifikátor",
|
||||
"CITY": "Město",
|
||||
"COUNTRY": "Země",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "Seznam",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "Text",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "Číslo",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "Odkaz",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Zaškrtávací pole",
|
||||
"CREATED_AT": "Vytvořeno",
|
||||
"LAST_ACTIVITY": "Poslední aktivita",
|
||||
"REFERER_LINK": "Odkazující odkaz"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "Standardní filtry",
|
||||
"ADDITIONAL_FILTERS": "Další filtry",
|
||||
"CUSTOM_ATTRIBUTES": "Vlastní atributy"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,12 +54,14 @@
|
||||
"OPEN": "Více",
|
||||
"CLOSE": "Zavřít",
|
||||
"DETAILS": "Podrobnosti",
|
||||
"SNOOZED_UNTIL": "Snoozed until",
|
||||
"SNOOZED_UNTIL_TOMORROW": "Odloženo do zítřka",
|
||||
"SNOOZED_UNTIL_NEXT_WEEK": "Odloženo do příštího týdne",
|
||||
"SNOOZED_UNTIL_NEXT_REPLY": "Odloženo do další odpovědi"
|
||||
},
|
||||
"RESOLVE_DROPDOWN": {
|
||||
"MARK_PENDING": "Označit jako nevyřízené",
|
||||
"SNOOZE_UNTIL": "Odložit",
|
||||
"SNOOZE": {
|
||||
"TITLE": "Odložit do",
|
||||
"NEXT_REPLY": "Další odpověď",
|
||||
@@ -67,6 +69,11 @@
|
||||
"NEXT_WEEK": "Příští týden"
|
||||
}
|
||||
},
|
||||
"CUSTOM_SNOOZE": {
|
||||
"TITLE": "Odložit do",
|
||||
"APPLY": "Odložit",
|
||||
"CANCEL": "Zrušit"
|
||||
},
|
||||
"PRIORITY": {
|
||||
"TITLE": "Priority",
|
||||
"OPTIONS": {
|
||||
|
||||
@@ -1,6 +1,13 @@
|
||||
{
|
||||
"CSAT": {
|
||||
"TITLE": "Ohodnoťte svou konverzaci",
|
||||
"PLACEHOLDER": "Řekněte nám více..."
|
||||
"PLACEHOLDER": "Řekněte nám více...",
|
||||
"RATINGS": {
|
||||
"POOR": "😞 Poor",
|
||||
"FAIR": "😑 Fair",
|
||||
"AVERAGE": "😐 Average",
|
||||
"GOOD": "😀 Good",
|
||||
"EXCELLENT": "😍 Excellent"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,10 @@
|
||||
}
|
||||
},
|
||||
"UPDATE_CHATWOOT": "Je dostupná aktualizace %{latestChatwootVersion} pro Chatwoot. Aktualizujte prosím svou instanci.",
|
||||
"LEARN_MORE": "Learn more"
|
||||
"LEARN_MORE": "Learn more",
|
||||
"PAYMENT_PENDING": "Your payment is pending. Please update your payment information to continue using Chatwoot",
|
||||
"LIMITS_UPGRADE": "Your account has exceeded the usage limits, please upgrade your plan to continue using Chatwoot",
|
||||
"OPEN_BILLING": "Open billing"
|
||||
},
|
||||
"FORMS": {
|
||||
"MULTISELECT": {
|
||||
|
||||
@@ -74,6 +74,14 @@
|
||||
"DELETE": "Odstranit článek"
|
||||
}
|
||||
},
|
||||
"ARTICLE_SEARCH_RESULT": {
|
||||
"UNCATEGORIZED": "Uncategorized",
|
||||
"INSERT_ARTICLE": "Insert",
|
||||
"NO_RESULT": "No articles found",
|
||||
"COPY_LINK": "Copy article link to clipboard",
|
||||
"OPEN_LINK": "Open article in new tab",
|
||||
"PREVIEW_LINK": "Preview article"
|
||||
},
|
||||
"PORTAL": {
|
||||
"HEADER": "Portály",
|
||||
"DEFAULT": "Default",
|
||||
|
||||
@@ -535,7 +535,6 @@
|
||||
"UPDATE": "Update business hours settings",
|
||||
"TOGGLE_AVAILABILITY": "Enable business availability for this inbox",
|
||||
"UNAVAILABLE_MESSAGE_LABEL": "Unavailable message for visitors",
|
||||
"UNAVAILABLE_MESSAGE_DEFAULT": "We are unavailable at the moment. Leave a message we will respond once we are back.",
|
||||
"TOGGLE_HELP": "Enabling business availability will show the available hours on live chat widget even if all the agents are offline. Outside available hours vistors can be warned with a message and a pre-chat form.",
|
||||
"DAY": {
|
||||
"ENABLE": "Enable availability for this day",
|
||||
|
||||
@@ -87,6 +87,8 @@
|
||||
},
|
||||
"OPEN_AI": {
|
||||
"TITLE": "Improve With AI",
|
||||
"SUMMARY_TITLE": "Summary with AI",
|
||||
"REPLY_TITLE": "Reply suggestion with AI",
|
||||
"SUBTITLE": "An improved reply will be generated using AI, based on your current draft.",
|
||||
"TONE": {
|
||||
"TITLE": "Tone",
|
||||
|
||||
@@ -3,16 +3,16 @@
|
||||
"TITLE": "Přihlásit se do Chatwoot",
|
||||
"EMAIL": {
|
||||
"LABEL": "E-mailová adresa",
|
||||
"PLACEHOLDER": "example@companyname.com"
|
||||
"PLACEHOLDER": "E-mail např: někdo@example.com"
|
||||
},
|
||||
"PASSWORD": {
|
||||
"LABEL": "Heslo",
|
||||
"PLACEHOLDER": "Heslo"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Login successful",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again.",
|
||||
"UNAUTH": "Username or password is incorrect. Please try again."
|
||||
"SUCCESS_MESSAGE": "Přihlášení úspěšné",
|
||||
"ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později",
|
||||
"UNAUTH": "Nesprávné uživatelské jméno / heslo. Zkuste to prosím znovu"
|
||||
},
|
||||
"OAUTH": {
|
||||
"GOOGLE_LOGIN": "Login with Google",
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
"LOADING_CHART": "Načítání dat mapy...",
|
||||
"NO_ENOUGH_DATA": "Pro vytvoření hlášení jsme neobdrželi dostatek dat, zkuste to prosím později.",
|
||||
"DOWNLOAD_AGENT_REPORTS": "Stáhnout reporty agentů",
|
||||
"DATA_FETCHING_FAILED": "Failed to fetch data, please try again later.",
|
||||
"SUMMARY_FETCHING_FAILED": "Failed to fetch summary, please try again later.",
|
||||
"METRICS": {
|
||||
"CONVERSATIONS": {
|
||||
"NAME": "Konverzace",
|
||||
@@ -34,6 +36,14 @@
|
||||
"DESC": "( celkem)"
|
||||
}
|
||||
},
|
||||
"DATE_RANGE_OPTIONS": {
|
||||
"LAST_7_DAYS": "Posledních 7 dní",
|
||||
"LAST_30_DAYS": "Posledních 30 dní",
|
||||
"LAST_3_MONTHS": "Poslední 3 měsíce",
|
||||
"LAST_6_MONTHS": "Posledních 6 měsíců",
|
||||
"LAST_YEAR": "Poslední rok",
|
||||
"CUSTOM_DATE_RANGE": "Vlastní časové rozmezí"
|
||||
},
|
||||
"DATE_RANGE": [
|
||||
{
|
||||
"id": 0,
|
||||
@@ -66,6 +76,12 @@
|
||||
},
|
||||
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Seskupit podle",
|
||||
"DURATION_FILTER_LABEL": "Doba trvání",
|
||||
"GROUPING_OPTIONS": {
|
||||
"DAY": "Den",
|
||||
"WEEK": "Týden",
|
||||
"MONTH": "Měsíc",
|
||||
"YEAR": "Rok"
|
||||
},
|
||||
"GROUP_BY_DAY_OPTIONS": [
|
||||
{
|
||||
"id": 1,
|
||||
@@ -388,6 +404,7 @@
|
||||
"HEADER": "CSAT Reports",
|
||||
"NO_RECORDS": "There are no CSAT survey responses available.",
|
||||
"DOWNLOAD": "Download CSAT Reports",
|
||||
"DOWNLOAD_FAILED": "Failed to download CSAT Reports",
|
||||
"FILTERS": {
|
||||
"AGENTS": {
|
||||
"PLACEHOLDER": "Choose Agents"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Odkaz pro obnovení hesla byl odeslán na váš e-mail.",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později"
|
||||
},
|
||||
"SUBMIT": "Odeslat"
|
||||
}
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
"EMPTY_STATE": "No %{item} found for query '%{query}'",
|
||||
"EMPTY_STATE_FULL": "No results found for query '%{query}'",
|
||||
"PLACEHOLDER_KEYBINDING": "/ to focus",
|
||||
"INPUT_PLACEHOLDER": "Type 3 or more characters to search",
|
||||
"EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results. ",
|
||||
"INPUT_PLACEHOLDER": "Search messages, contacts or conversations",
|
||||
"EMPTY_STATE_DEFAULT": "Search by conversation id, email, phone number, messages for better search results.",
|
||||
"BOT_LABEL": "Bot",
|
||||
"READ_MORE": "Read more",
|
||||
"WROTE": "wrote:"
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Heslo bylo úspěšně změněno.",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později"
|
||||
},
|
||||
"CAPTCHA": {
|
||||
"ERROR": "Ověření vypršelo. Vyřešte captchu znovu."
|
||||
|
||||
@@ -10,33 +10,33 @@
|
||||
},
|
||||
"COMPANY_NAME": {
|
||||
"LABEL": "Company name",
|
||||
"PLACEHOLDER": "Enter your company name. E.g., Wayne Enterprises",
|
||||
"ERROR": "Company name is too short."
|
||||
"PLACEHOLDER": "Enter your company name. eg: Wayne Enterprises",
|
||||
"ERROR": "Company name is too short"
|
||||
},
|
||||
"FULL_NAME": {
|
||||
"LABEL": "Celé jméno",
|
||||
"PLACEHOLDER": "Enter your full name. E.g., Bruce Wayne",
|
||||
"ERROR": "Celé jméno je příliš krátké."
|
||||
"PLACEHOLDER": "Zadejte celé jméno. např.: Jan Novák",
|
||||
"ERROR": "Celé jméno je příliš krátké"
|
||||
},
|
||||
"EMAIL": {
|
||||
"LABEL": "Pracovní e-mail",
|
||||
"PLACEHOLDER": "Enter your work email address. E.g., bruce@wayne.enterprises",
|
||||
"ERROR": "Please enter a valid work email address."
|
||||
"PLACEHOLDER": "Zadejte svou pracovní e-mailovou adresu. např.: jan@novak.spolecnost",
|
||||
"ERROR": "Please enter a valid work email address"
|
||||
},
|
||||
"PASSWORD": {
|
||||
"LABEL": "Heslo",
|
||||
"PLACEHOLDER": "Heslo",
|
||||
"ERROR": "Heslo je příliš krátké.",
|
||||
"IS_INVALID_PASSWORD": "Heslo by mělo obsahovat alespoň jedno velké písmeno, jedno malé písmeno, jedno číslo a jeden speciální znak."
|
||||
"ERROR": "Heslo je příliš krátké",
|
||||
"IS_INVALID_PASSWORD": "Heslo by mělo obsahovat alespoň jedno velké písmeno, jedno malé písmeno, jedno číslo a jeden speciální znak"
|
||||
},
|
||||
"CONFIRM_PASSWORD": {
|
||||
"LABEL": "Confirm password",
|
||||
"PLACEHOLDER": "Confirm password",
|
||||
"ERROR": "Heslo se neshoduje."
|
||||
"LABEL": "Potvrzení hesla",
|
||||
"PLACEHOLDER": "Potvrzení hesla",
|
||||
"ERROR": "Heslo se neshoduje"
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "Registrace byla úspěšná",
|
||||
"ERROR_MESSAGE": "Could not connect to Woot server. Please try again."
|
||||
"ERROR_MESSAGE": "Nelze se připojit k Woot serveru, opakujte akci později"
|
||||
},
|
||||
"SUBMIT": "Create account",
|
||||
"HAVE_AN_ACCOUNT": "Máte již účet?"
|
||||
|
||||
@@ -2,12 +2,17 @@
|
||||
"FILTER": {
|
||||
"TITLE": "Filtrer Samtaler",
|
||||
"SUBTITLE": "Tilføj filtre nedenfor og tryk på 'Anvend filtre' for at filtrere samtaler.",
|
||||
"EDIT_CUSTOM_FILTER": "Edit Folder",
|
||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your folder.",
|
||||
"ADD_NEW_FILTER": "Tilføj Filter",
|
||||
"FILTER_DELETE_ERROR": "Du skal have mindst et filter at gemme",
|
||||
"SUBMIT_BUTTON_LABEL": "Anvend filtre",
|
||||
"UPDATE_BUTTON_LABEL": "Update folder",
|
||||
"CANCEL_BUTTON_LABEL": "Annuller",
|
||||
"CLEAR_BUTTON_LABEL": "Ryd Filtre",
|
||||
"EMPTY_VALUE_ERROR": "Værdi er påkrævet",
|
||||
"FOLDER_LABEL": "Folder Name",
|
||||
"FOLDER_QUERY_LABEL": "Folder Query",
|
||||
"TOOLTIP_LABEL": "Filtrer samtaler",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "OG",
|
||||
@@ -71,6 +76,9 @@
|
||||
"ERROR_MESSAGE": "Fejl under oprettelse af segment"
|
||||
}
|
||||
},
|
||||
"EDIT": {
|
||||
"EDIT_BUTTON": "Edit folder"
|
||||
},
|
||||
"DELETE": {
|
||||
"DELETE_BUTTON": "Slet filter",
|
||||
"MODAL": {
|
||||
|
||||
@@ -12,13 +12,37 @@
|
||||
"TABLE_HEADER": [
|
||||
"User",
|
||||
"Action",
|
||||
"Ip Adresse",
|
||||
"Time"
|
||||
"Ip Adresse"
|
||||
]
|
||||
},
|
||||
"API": {
|
||||
"SUCCESS_MESSAGE": "AuditLogs retrieved successfully",
|
||||
"ERROR_MESSAGE": "Kunne ikke oprette forbindelse til Woot Server, Prøv igen senere"
|
||||
},
|
||||
"DEFAULT_USER": "System",
|
||||
"AUTOMATION_RULE": {
|
||||
"ADD": "%{agentName} created a new automation rule (#%{id})",
|
||||
"EDIT": "%{agentName} updated an automation rule (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an automation rule (#%{id})"
|
||||
},
|
||||
"INBOX": {
|
||||
"ADD": "%{agentName} created a new inbox (#%{id})",
|
||||
"EDIT": "%{agentName} updated an inbox (#%{id})",
|
||||
"DELETE": "%{agentName} deleted an inbox (#%{id})"
|
||||
},
|
||||
"WEBHOOK": {
|
||||
"ADD": "%{agentName} created a new webhook (#%{id})",
|
||||
"EDIT": "%{agentName} updated a webhook (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a webhook (#%{id})"
|
||||
},
|
||||
"USER_ACTION": {
|
||||
"SIGN_IN": "%{agentName} signed in",
|
||||
"SIGN_OUT": "%{agentName} signed out"
|
||||
},
|
||||
"TEAM": {
|
||||
"ADD": "%{agentName} created a new team (#%{id})",
|
||||
"EDIT": "%{agentName} updated a team (#%{id})",
|
||||
"DELETE": "%{agentName} deleted a team (#%{id})"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,9 @@
|
||||
},
|
||||
"sort_on_created_at": {
|
||||
"TEXT": "Oprettet den"
|
||||
},
|
||||
"sort_on_priority": {
|
||||
"TEXT": "Priority"
|
||||
}
|
||||
},
|
||||
"ATTACHMENTS": {
|
||||
|
||||
@@ -73,6 +73,13 @@
|
||||
"SUCCESS_MESSAGE": "Kontakter gemt",
|
||||
"ERROR_MESSAGE": "Der opstod en fejl. Prøv venligst igen"
|
||||
},
|
||||
"EXPORT_CONTACTS": {
|
||||
"BUTTON_LABEL": "Export",
|
||||
"TITLE": "Export Contacts",
|
||||
"DESC": "Export contacts to a CSV file.",
|
||||
"SUCCESS_MESSAGE": "Export is in progress, You will be notified via email when export file is ready to dowanlod.",
|
||||
"ERROR_MESSAGE": "Der opstod en fejl. Prøv venligst igen"
|
||||
},
|
||||
"DELETE_NOTE": {
|
||||
"CONFIRM": {
|
||||
"TITLE": "Bekræft Sletning",
|
||||
@@ -211,6 +218,7 @@
|
||||
"FILTER_CONTACTS": "Filtrer",
|
||||
"FILTER_CONTACTS_SAVE": "Gem filter",
|
||||
"FILTER_CONTACTS_DELETE": "Slet filter",
|
||||
"FILTER_CONTACTS_EDIT": "Edit segment",
|
||||
"LIST": {
|
||||
"LOADING_MESSAGE": "Indlæser kontakter...",
|
||||
"404": "Ingen kontakter matcher din søgning 🔍",
|
||||
|
||||
@@ -1,50 +1,55 @@
|
||||
{
|
||||
"CONTACTS_FILTER": {
|
||||
"TITLE": "Filtrer Kontakter",
|
||||
"SUBTITLE": "Tilføj filtre nedenfor og tryk på 'Send' for at filtrere kontakter.",
|
||||
"ADD_NEW_FILTER": "Tilføj Filter",
|
||||
"CLEAR_ALL_FILTERS": "Ryd Alle Filtre",
|
||||
"FILTER_DELETE_ERROR": "Du skal have mindst et filter at gemme",
|
||||
"SUBMIT_BUTTON_LABEL": "Send",
|
||||
"CANCEL_BUTTON_LABEL": "Annuller",
|
||||
"CLEAR_BUTTON_LABEL": "Ryd Filtre",
|
||||
"EMPTY_VALUE_ERROR": "Værdi er påkrævet",
|
||||
"TOOLTIP_LABEL": "Filtrer kontaktpersoner",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "OG",
|
||||
"OR": "ELLER"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "Lig med",
|
||||
"not_equal_to": "Ikke lig med",
|
||||
"contains": "Indeholder",
|
||||
"does_not_contain": "Indeholder ikke",
|
||||
"is_present": "Er til stede",
|
||||
"is_not_present": "Er ikke til stede",
|
||||
"is_greater_than": "Er større end",
|
||||
"is_lesser_than": "Er mindre end",
|
||||
"days_before": "Er x dage før"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "Navn",
|
||||
"EMAIL": "E-mail",
|
||||
"PHONE_NUMBER": "Telefonnummer",
|
||||
"IDENTIFIER": "Identifier",
|
||||
"CITY": "By",
|
||||
"COUNTRY": "Land",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "Liste",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "Tekst",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "Nummer",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "Link",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Afkrydsningsfelt",
|
||||
"CREATED_AT": "Oprettet Den",
|
||||
"LAST_ACTIVITY": "Sidste Aktivitet",
|
||||
"REFERER_LINK": "Link til reference"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "Standard Filtre",
|
||||
"ADDITIONAL_FILTERS": "Yderligere Filtre",
|
||||
"CUSTOM_ATTRIBUTES": "Brugerdefinerede Egenskaber"
|
||||
}
|
||||
"CONTACTS_FILTER": {
|
||||
"TITLE": "Filtrer Kontakter",
|
||||
"SUBTITLE": "Tilføj filtre nedenfor og tryk på 'Send' for at filtrere kontakter.",
|
||||
"EDIT_CUSTOM_SEGMENT": "Edit Segment",
|
||||
"CUSTOM_VIEWS_SUBTITLE": "Add or remove filters and update your segment.",
|
||||
"ADD_NEW_FILTER": "Tilføj Filter",
|
||||
"CLEAR_ALL_FILTERS": "Ryd Alle Filtre",
|
||||
"FILTER_DELETE_ERROR": "Du skal have mindst et filter at gemme",
|
||||
"SUBMIT_BUTTON_LABEL": "Send",
|
||||
"UPDATE_BUTTON_LABEL": "Update Segment",
|
||||
"CANCEL_BUTTON_LABEL": "Annuller",
|
||||
"CLEAR_BUTTON_LABEL": "Ryd Filtre",
|
||||
"EMPTY_VALUE_ERROR": "Værdi er påkrævet",
|
||||
"SEGMENT_LABEL": "Segment Name",
|
||||
"SEGMENT_QUERY_LABEL": "Segment Query",
|
||||
"TOOLTIP_LABEL": "Filtrer kontaktpersoner",
|
||||
"QUERY_DROPDOWN_LABELS": {
|
||||
"AND": "OG",
|
||||
"OR": "ELLER"
|
||||
},
|
||||
"OPERATOR_LABELS": {
|
||||
"equal_to": "Lig med",
|
||||
"not_equal_to": "Ikke lig med",
|
||||
"contains": "Indeholder",
|
||||
"does_not_contain": "Indeholder ikke",
|
||||
"is_present": "Er til stede",
|
||||
"is_not_present": "Er ikke til stede",
|
||||
"is_greater_than": "Er større end",
|
||||
"is_lesser_than": "Er mindre end",
|
||||
"days_before": "Er x dage før"
|
||||
},
|
||||
"ATTRIBUTES": {
|
||||
"NAME": "Navn",
|
||||
"EMAIL": "E-mail",
|
||||
"PHONE_NUMBER": "Telefonnummer",
|
||||
"IDENTIFIER": "Identifier",
|
||||
"CITY": "By",
|
||||
"COUNTRY": "Land",
|
||||
"CUSTOM_ATTRIBUTE_LIST": "Liste",
|
||||
"CUSTOM_ATTRIBUTE_TEXT": "Tekst",
|
||||
"CUSTOM_ATTRIBUTE_NUMBER": "Nummer",
|
||||
"CUSTOM_ATTRIBUTE_LINK": "Link",
|
||||
"CUSTOM_ATTRIBUTE_CHECKBOX": "Afkrydsningsfelt",
|
||||
"CREATED_AT": "Oprettet Den",
|
||||
"LAST_ACTIVITY": "Sidste Aktivitet",
|
||||
"REFERER_LINK": "Link til reference"
|
||||
},
|
||||
"GROUPS": {
|
||||
"STANDARD_FILTERS": "Standard Filtre",
|
||||
"ADDITIONAL_FILTERS": "Yderligere Filtre",
|
||||
"CUSTOM_ATTRIBUTES": "Brugerdefinerede Egenskaber"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,12 +54,14 @@
|
||||
"OPEN": "Mere",
|
||||
"CLOSE": "Luk",
|
||||
"DETAILS": "detaljer",
|
||||
"SNOOZED_UNTIL": "Snoozed until",
|
||||
"SNOOZED_UNTIL_TOMORROW": "Udsat til i morgen",
|
||||
"SNOOZED_UNTIL_NEXT_WEEK": "Udsat indtil næste uge",
|
||||
"SNOOZED_UNTIL_NEXT_REPLY": "Udsat indtil næste svar"
|
||||
},
|
||||
"RESOLVE_DROPDOWN": {
|
||||
"MARK_PENDING": "Markér som afventende",
|
||||
"SNOOZE_UNTIL": "Udsæt",
|
||||
"SNOOZE": {
|
||||
"TITLE": "Udsæt til",
|
||||
"NEXT_REPLY": "Næste svar",
|
||||
@@ -67,6 +69,11 @@
|
||||
"NEXT_WEEK": "Næste uge"
|
||||
}
|
||||
},
|
||||
"CUSTOM_SNOOZE": {
|
||||
"TITLE": "Udsæt til",
|
||||
"APPLY": "Udsæt",
|
||||
"CANCEL": "Annuller"
|
||||
},
|
||||
"PRIORITY": {
|
||||
"TITLE": "Priority",
|
||||
"OPTIONS": {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user