Merge branch 'release/2.10.0'

This commit is contained in:
Sojan 2022-10-17 19:38:31 -07:00
commit ce9c8645df
663 changed files with 20536 additions and 6557 deletions

View file

@ -19,6 +19,7 @@ defaults: &defaults
- COVERAGE: true
- LOG_LEVEL: warn
parallelism: 4
resource_class: large
jobs:
build:
@ -122,9 +123,11 @@ jobs:
mkdir -p coverage
~/tmp/cc-test-reporter before-build
TESTFILES=$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)
bundle exec rspec --profile 10 \
--out test-results/rspec/rspec.xml \
bundle exec rspec --format progress \
--format RspecJunitFormatter \
--out ~/tmp/test-results/rspec.xml \
-- ${TESTFILES}
no_output_timeout: 30m
- run:
name: Code Climate Test Coverage
command: |
@ -137,7 +140,7 @@ jobs:
~/tmp/cc-test-reporter before-build
TESTFILES=$(circleci tests glob **/specs/*.spec.js | circleci tests split --split-by=timings)
yarn test:coverage --profile 10 \
--out test-results/frontend_specs/rspec.xml \
--out ~/tmp/test-results/yarn.xml \
-- ${TESTFILES}
- run:
name: Code Climate Test Coverage

View file

@ -7,8 +7,8 @@ end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = spaces
indent_style = space
tab_width = 2
[{*.{rb,erb,js,coffee,json,yml,css,scss,sh,markdown,md,html}]
[*.{rb,erb,js,coffee,json,yml,css,scss,sh,markdown,md,html}]
indent_size = 2

View file

@ -58,5 +58,6 @@ jobs:
with:
context: .
file: docker/Dockerfile
platforms: linux/amd64
push: true
tags: ${{ env.DOCKER_TAG }}

5
.gitignore vendored
View file

@ -39,9 +39,6 @@ public/packs*
*.un~
.jest-cache
#VS Code files
.vscode
# ignore jetbrains IDE files
.idea
@ -62,4 +59,4 @@ package-lock.json
test/cypress/videos/*
/config/master.key
/config/*.enc
/config/*.enc

View file

@ -16,6 +16,7 @@ Metrics/ClassLength:
- 'app/models/message.rb'
- 'app/builders/messages/facebook/message_builder.rb'
- 'app/controllers/api/v1/accounts/contacts_controller.rb'
- 'app/controllers/api/v1/accounts/conversations_controller.rb'
- 'app/listeners/action_cable_listener.rb'
- 'app/models/conversation.rb'
RSpec/ExampleLength:

32
.vscode/extensions.json vendored Normal file
View file

@ -0,0 +1,32 @@
{
"recommendations": [
// Spell check
"streetsidesoftware.code-spell-checker",
// Better Comments
"aaron-bond.better-comments",
// Rails Test Runner
"davidpallinder.rails-test-runner",
// Eslint
"dbaeumer.vscode-eslint",
// Auto Close Tag
"formulahendry.auto-close-tag",
// Auto Rename Tag
"formulahendry.auto-rename-tag",
// Hight light colors
"naumovs.color-highlight",
// GitLens
"eamodio.gitlens",
// Ruby
"rebornix.ruby",
// Vue
"octref.vetur",
// Prettier
"esbenp.prettier-vscode",
// Dot Env
"mikestead.dotenv",
// HTML CSS Support
"ecmel.vscode-html-css",
// Tailwind CSS Intellisense
"bradlc.vscode-tailwindcss",
]
}

View file

@ -174,6 +174,7 @@ group :development, :test do
gem 'listen'
gem 'mock_redis'
gem 'pry-rails'
gem 'rspec_junit_formatter'
gem 'rspec-rails', '~> 5.0.0'
gem 'rubocop', require: false
gem 'rubocop-performance', require: false

View file

@ -286,9 +286,9 @@ GEM
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
google-protobuf (3.21.2)
google-protobuf (3.21.2-x86_64-darwin)
google-protobuf (3.21.2-x86_64-linux)
google-protobuf (3.21.7)
google-protobuf (3.21.7-x86_64-darwin)
google-protobuf (3.21.7-x86_64-linux)
googleapis-common-protos (1.3.12)
google-protobuf (~> 3.14)
googleapis-common-protos-types (~> 1.2)
@ -536,6 +536,8 @@ GEM
rspec-mocks (~> 3.10)
rspec-support (~> 3.10)
rspec-support (3.11.0)
rspec_junit_formatter (0.6.0)
rspec-core (>= 2, < 4, != 2.12.0)
rubocop (1.31.2)
json (~> 2.3)
parallel (~> 1.10)
@ -769,6 +771,7 @@ DEPENDENCIES
responders
rest-client
rspec-rails (~> 5.0.0)
rspec_junit_formatter
rubocop
rubocop-performance
rubocop-rails
@ -805,4 +808,4 @@ RUBY VERSION
ruby 3.0.4p208
BUNDLED WITH
2.3.17
2.3.18

View file

@ -1,13 +1,12 @@
# This Builder will create a contact inbox with specified attributes. If the contact inbox already exists, it will be returned.
# For Specific Channels like whatsapp, email etc . it smartly generated appropriate the source id when none is provided.
class ContactInboxBuilder
pattr_initialize [:contact_id!, :inbox_id!, :source_id]
pattr_initialize [:contact, :inbox, :source_id, { hmac_verified: false }]
def perform
@contact = Contact.find(contact_id)
@inbox = @contact.account.inboxes.find(inbox_id)
return unless ['Channel::TwilioSms', 'Channel::Sms', 'Channel::Email', 'Channel::Api', 'Channel::Whatsapp'].include? @inbox.channel_type
source_id = @source_id || generate_source_id
create_contact_inbox(source_id) if source_id.present?
@source_id ||= generate_source_id
create_contact_inbox if source_id.present?
end
private
@ -19,23 +18,37 @@ class ContactInboxBuilder
when 'Channel::Whatsapp'
wa_source_id
when 'Channel::Email'
@contact.email
email_source_id
when 'Channel::Sms'
@contact.phone_number
when 'Channel::Api'
phone_source_id
when 'Channel::Api', 'Channel::WebWidget'
SecureRandom.uuid
else
raise "Unsupported operation for this channel: #{@inbox.channel_type}"
end
end
def email_source_id
raise ActionController::ParameterMissing, 'contact email' unless @contact.email
@contact.email
end
def phone_source_id
raise ActionController::ParameterMissing, 'contact phone number' unless @contact.phone_number
@contact.phone_number
end
def wa_source_id
return unless @contact.phone_number
raise ActionController::ParameterMissing, 'contact phone number' unless @contact.phone_number
# whatsapp doesn't want the + in e164 format
"#{@contact.phone_number}.delete('+')"
@contact.phone_number.delete('+').to_s
end
def twilio_source_id
return unless @contact.phone_number
raise ActionController::ParameterMissing, 'contact phone number' unless @contact.phone_number
case @inbox.channel.medium
when 'sms'
@ -45,11 +58,11 @@ class ContactInboxBuilder
end
end
def create_contact_inbox(source_id)
::ContactInbox.find_or_create_by!(
def create_contact_inbox
::ContactInbox.create_with(hmac_verified: hmac_verified || false).find_or_create_by!(
contact_id: @contact.id,
inbox_id: @inbox.id,
source_id: source_id
source_id: @source_id
)
end
end

View file

@ -1,25 +1,47 @@
class ContactBuilder
pattr_initialize [:source_id!, :inbox!, :contact_attributes!, :hmac_verified]
# This Builder will create a contact and contact inbox with specified attributes.
# If an existing identified contact exisits, it will be returned.
# for contact inbox logic it uses the contact inbox builder
class ContactInboxWithContactBuilder
pattr_initialize [:inbox!, :contact_attributes!, :source_id, :hmac_verified]
def perform
contact_inbox = inbox.contact_inboxes.find_by(source_id: source_id)
return contact_inbox if contact_inbox
find_or_create_contact_and_contact_inbox
# in case of race conditions where contact is created by another thread
# we will try to find the contact and create a contact inbox
rescue ActiveRecord::RecordNotUnique
find_or_create_contact_and_contact_inbox
end
build_contact_inbox
def find_or_create_contact_and_contact_inbox
@contact_inbox = inbox.contact_inboxes.find_by(source_id: source_id) if source_id.present?
return @contact_inbox if @contact_inbox
ActiveRecord::Base.transaction(requires_new: true) do
build_contact_with_contact_inbox
update_contact_avatar(@contact) unless @contact.avatar.attached?
@contact_inbox
end
end
private
def build_contact_with_contact_inbox
@contact = find_contact || create_contact
@contact_inbox = create_contact_inbox
end
def account
@account ||= inbox.account
end
def create_contact_inbox(contact)
::ContactInbox.create_with(hmac_verified: hmac_verified || false).find_or_create_by!(
contact_id: contact.id,
inbox_id: inbox.id,
source_id: source_id
)
def create_contact_inbox
ContactInboxBuilder.new(
contact: @contact,
inbox: @inbox,
source_id: @source_id,
hmac_verified: hmac_verified
).perform
end
def update_contact_avatar(contact)
@ -61,16 +83,4 @@ class ContactBuilder
account.contacts.find_by(phone_number: phone_number)
end
def build_contact_inbox
ActiveRecord::Base.transaction do
contact = find_contact || create_contact
contact_inbox = create_contact_inbox(contact)
update_contact_avatar(contact)
contact_inbox
rescue StandardError => e
Rails.logger.error e
raise e
end
end
end

View file

@ -22,10 +22,9 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
return if @inbox.channel.reauthorization_required?
ActiveRecord::Base.transaction do
build_contact
build_contact_inbox
build_message
end
ensure_contact_avatar
rescue Koala::Facebook::AuthenticationError
@inbox.channel.authorization_error!
rescue StandardError => e
@ -35,15 +34,12 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
private
def contact
@contact ||= @inbox.contact_inboxes.find_by(source_id: @sender_id)&.contact
end
def build_contact
return if contact.present?
@contact = Contact.create!(contact_params.except(:remote_avatar_url))
@contact_inbox = ContactInbox.find_or_create_by!(contact: contact, inbox: @inbox, source_id: @sender_id)
def build_contact_inbox
@contact_inbox = ::ContactInboxWithContactBuilder.new(
source_id: @sender_id,
inbox: @inbox,
contact_attributes: contact_params
).perform
end
def build_message
@ -54,19 +50,11 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
end
end
def ensure_contact_avatar
return if contact_params[:remote_avatar_url].blank?
return if @contact.avatar.attached?
Avatar::AvatarFromUrlJob.perform_later(@contact, contact_params[:remote_avatar_url])
end
def conversation
@conversation ||= Conversation.find_by(conversation_params) || build_conversation
end
def build_conversation
@contact_inbox ||= contact.contact_inboxes.find_by!(source_id: @sender_id)
Conversation.create!(conversation_params.merge(
contact_inbox_id: @contact_inbox.id
))
@ -94,7 +82,7 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
{
account_id: @inbox.account_id,
inbox_id: @inbox.id,
contact_id: contact.id
contact_id: @contact_inbox.contact_id
}
end
@ -105,7 +93,7 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
message_type: @message_type,
content: response.content,
source_id: response.identifier,
sender: @outgoing_echo ? nil : contact
sender: @outgoing_echo ? nil : @contact_inbox.contact
}
end
@ -113,7 +101,7 @@ class Messages::Facebook::MessageBuilder < Messages::Messenger::MessageBuilder
{
name: "#{result['first_name'] || 'John'} #{result['last_name'] || 'Doe'}",
account_id: @inbox.account_id,
remote_avatar_url: result['profile_pic'] || ''
avatar_url: result['profile_pic']
}
end

View file

@ -42,8 +42,8 @@ class Api::V1::Accounts::ArticlesController < Api::V1::Accounts::BaseController
def article_params
params.require(:article).permit(
:title, :content, :description, :position, :category_id, :author_id, :associated_article_id, :status, meta: [:title, :description,
{ tags: [] }]
:title, :slug, :content, :description, :position, :category_id, :author_id, :associated_article_id, :status, meta: [:title, :description,
{ tags: [] }]
)
end

View file

@ -2,8 +2,11 @@ class Api::V1::Accounts::Contacts::ContactInboxesController < Api::V1::Accounts:
before_action :ensure_inbox, only: [:create]
def create
source_id = params[:source_id] || SecureRandom.uuid
@contact_inbox = ContactInbox.create!(contact: @contact, inbox: @inbox, source_id: source_id)
@contact_inbox = ContactInboxBuilder.new(
contact: @contact,
inbox: @inbox,
source_id: params[:source_id]
).perform
end
private

View file

@ -134,8 +134,11 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
return if params[:inbox_id].blank?
inbox = Current.account.inboxes.find(params[:inbox_id])
source_id = params[:source_id] || SecureRandom.uuid
ContactInbox.create!(contact: @contact, inbox: inbox, source_id: source_id)
ContactInboxBuilder.new(
contact: @contact,
inbox: inbox,
source_id: params[:source_id]
).perform
end
def permitted_params

View file

@ -3,7 +3,7 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
include DateRangeHelper
before_action :conversation, except: [:index, :meta, :search, :create, :filter]
before_action :contact_inbox, only: [:create]
before_action :inbox, :contact, :contact_inbox, only: [:create]
def index
result = conversation_finder.perform
@ -109,22 +109,35 @@ class Api::V1::Accounts::ConversationsController < Api::V1::Accounts::BaseContro
authorize @conversation.inbox, :show?
end
def inbox
return if params[:inbox_id].blank?
@inbox = Current.account.inboxes.find(params[:inbox_id])
authorize @inbox, :show?
end
def contact
return if params[:contact_id].blank?
@contact = Current.account.contacts.find(params[:contact_id])
end
def contact_inbox
@contact_inbox = build_contact_inbox
# fallback for the old case where we do look up only using source id
# In future we need to change this and make sure we do look up on combination of inbox_id and source_id
# and deprecate the support of passing only source_id as the param
@contact_inbox ||= ::ContactInbox.find_by!(source_id: params[:source_id])
authorize @contact_inbox.inbox, :show?
end
def build_contact_inbox
return if params[:contact_id].blank? || params[:inbox_id].blank?
inbox = Current.account.inboxes.find(params[:inbox_id])
authorize inbox, :show?
return if @inbox.blank? || @contact.blank?
ContactInboxBuilder.new(
contact_id: params[:contact_id],
inbox_id: inbox.id,
contact: @contact,
inbox: @inbox,
source_id: params[:source_id]
).perform
end

View file

@ -22,7 +22,7 @@ class Api::V1::Accounts::CsatSurveyResponsesController < Api::V1::Accounts::Base
def download
response.headers['Content-Type'] = 'text/csv'
response.headers['Content-Disposition'] = 'attachment; filename=csat_report.csv'
render layout: false, template: 'api/v1/accounts/csat_survey_responses/download.csv.erb', format: 'csv'
render layout: false, template: 'api/v1/accounts/csat_survey_responses/download', formats: [:csv]
end
private

View file

@ -24,7 +24,7 @@ class Api::V1::AccountsController < Api::BaseController
).perform
if @user
send_auth_headers(@user)
render 'api/v1/accounts/create.json', locals: { resource: @user }
render 'api/v1/accounts/create', format: :json, locals: { resource: @user }
else
render_error_response(CustomExceptions::Account::SignupFailed.new({}))
end
@ -32,7 +32,7 @@ class Api::V1::AccountsController < Api::BaseController
def show
@latest_chatwoot_version = ::Redis::Alfred.get(::Redis::Alfred::LATEST_CHATWOOT_VERSION)
render 'api/v1/accounts/show.json'
render 'api/v1/accounts/show', format: :json
end
def update

View file

@ -9,7 +9,7 @@ class Api::V1::NotificationSubscriptionsController < Api::BaseController
def destroy
notification_subscription = NotificationSubscription.where(["subscription_attributes->>'push_token' = ?", params[:push_token]]).first
notification_subscription.destroy!
notification_subscription.destroy! if notification_subscription.present?
head :ok
end

View file

@ -22,6 +22,11 @@ class Api::V1::ProfilesController < Api::BaseController
@user.account_users.find_by!(account_id: availability_params[:account_id]).update!(availability: availability_params[:availability])
end
def set_active_account
@user.account_users.find_by(account_id: profile_params[:account_id]).update(active_at: Time.now.utc)
head :ok
end
private
def set_user
@ -39,6 +44,7 @@ class Api::V1::ProfilesController < Api::BaseController
:display_name,
:avatar,
:message_signature,
:account_id,
ui_settings: {}
)
end

View file

@ -14,22 +14,22 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController
def agents
@report_data = generate_agents_report
generate_csv('agents_report', 'api/v2/accounts/reports/agents.csv.erb')
generate_csv('agents_report', 'api/v2/accounts/reports/agents')
end
def inboxes
@report_data = generate_inboxes_report
generate_csv('inboxes_report', 'api/v2/accounts/reports/inboxes.csv.erb')
generate_csv('inboxes_report', 'api/v2/accounts/reports/inboxes')
end
def labels
@report_data = generate_labels_report
generate_csv('labels_report', 'api/v2/accounts/reports/labels.csv.erb')
generate_csv('labels_report', 'api/v2/accounts/reports/labels')
end
def teams
@report_data = generate_teams_report
generate_csv('teams_report', 'api/v2/accounts/reports/teams.csv.erb')
generate_csv('teams_report', 'api/v2/accounts/reports/teams')
end
def conversations
@ -43,7 +43,7 @@ class Api::V2::Accounts::ReportsController < Api::V1::Accounts::BaseController
def generate_csv(filename, template)
response.headers['Content-Type'] = 'text/csv'
response.headers['Content-Disposition'] = "attachment; filename=#{filename}.csv"
render layout: false, template: template, format: 'csv'
render layout: false, template: template, formats: [:csv]
end
def check_authorization

View file

@ -13,6 +13,8 @@ module RequestExceptionHandler
render_not_found_error('Resource could not be found')
rescue Pundit::NotAuthorizedError
render_unauthorized('You are not authorized to do this action')
rescue ActionController::ParameterMissing => e
render_could_not_create_error(e.message)
ensure
# to address the thread variable leak issues in Puma/Thin webserver
Current.reset

View file

@ -45,6 +45,7 @@ class DashboardController < ActionController::Base
@portal = Portal.find_by(custom_domain: domain)
return unless @portal
@locale = @portal.default_locale
render 'public/api/v1/portals/show', layout: 'portal', portal: @portal and return
end

View file

@ -14,7 +14,7 @@ class DeviseOverrides::ConfirmationsController < Devise::ConfirmationsController
def render_confirmation_success
send_auth_headers(@confirmable)
render partial: 'devise/auth.json', locals: { resource: @confirmable }
render partial: 'devise/auth', formats: [:json], locals: { resource: @confirmable }
end
def render_confirmation_error

View file

@ -11,7 +11,7 @@ class DeviseOverrides::PasswordsController < Devise::PasswordsController
@recoverable = User.find_by(reset_password_token: reset_password_token)
if @recoverable && reset_password_and_confirmation(@recoverable)
send_auth_headers(@recoverable)
render partial: 'devise/auth.json', locals: { resource: @recoverable }
render partial: 'devise/auth', formats: [:json], locals: { resource: @recoverable }
else
render json: { message: 'Invalid token', redirect_url: '/' }, status: :unprocessable_entity
end

View file

@ -16,7 +16,7 @@ class DeviseOverrides::SessionsController < ::DeviseTokenAuth::SessionsControlle
end
def render_create_success
render partial: 'devise/auth.json', locals: { resource: @resource }
render partial: 'devise/auth', formats: [:json], locals: { resource: @resource }
end
private

View file

@ -2,7 +2,7 @@ class DeviseOverrides::TokenValidationsController < ::DeviseTokenAuth::TokenVali
def validate_token
# @resource will have been set by set_user_by_token concern
if @resource
render 'devise/token.json'
render 'devise/token', formats: [:json]
else
render_validate_token_error
end

View file

@ -51,6 +51,6 @@ class Platform::Api::V1::UsersController < PlatformController
end
def user_params
params.permit(:name, :email, :password, custom_attributes: {})
params.permit(:name, :display_name, :email, :password, custom_attributes: {})
end
end

View file

@ -4,7 +4,7 @@ class Public::Api::V1::Inboxes::ContactsController < Public::Api::V1::InboxesCon
def create
source_id = params[:source_id] || SecureRandom.uuid
@contact_inbox = ::ContactBuilder.new(
@contact_inbox = ::ContactInboxWithContactBuilder.new(
source_id: source_id,
inbox: @inbox_channel.inbox,
contact_attributes: permitted_params.except(:identifier, :identifier_hash)

View file

@ -87,6 +87,9 @@ export default {
},
async initializeAccount() {
await this.$store.dispatch('accounts/get');
this.$store.dispatch('setActiveAccount', {
accountId: this.currentAccountId,
});
const {
locale,
latest_chatwoot_version: latestChatwootVersion,

View file

@ -0,0 +1,9 @@
import ApiClient from './ApiClient';
class AgentBotsAPI extends ApiClient {
constructor() {
super('agent_bots', { accountScoped: true });
}
}
export default new AgentBotsAPI();

View file

@ -147,4 +147,13 @@ export default {
deleteAvatar() {
return axios.delete(endPoints('deleteAvatar').url);
},
setActiveAccount({ accountId }) {
const urlData = endPoints('setActiveAccount');
return axios.put(urlData.url, {
profile: {
account_id: accountId,
},
});
},
};

View file

@ -40,6 +40,10 @@ const endPoints = {
deleteAvatar: {
url: '/api/v1/profile/avatar',
},
setActiveAccount: {
url: '/api/v1/profile/set_active_account',
},
};
export default page => {

View file

@ -0,0 +1,16 @@
/* global axios */
import ApiClient from './ApiClient';
class MacrosAPI extends ApiClient {
constructor() {
super('macros', { accountScoped: true });
}
executeMacro({ macroId, conversationIds }) {
return axios.post(`${this.url}/${macroId}/execute`, {
conversation_ids: conversationIds,
});
}
}
export default new MacrosAPI();

View file

@ -0,0 +1,13 @@
import AgentBotsAPI from '../agentBots';
import ApiClient from '../ApiClient';
describe('#AgentBotsAPI', () => {
it('creates correct instance', () => {
expect(AgentBotsAPI).toBeInstanceOf(ApiClient);
expect(AgentBotsAPI).toHaveProperty('get');
expect(AgentBotsAPI).toHaveProperty('show');
expect(AgentBotsAPI).toHaveProperty('create');
expect(AgentBotsAPI).toHaveProperty('update');
expect(AgentBotsAPI).toHaveProperty('delete');
});
});

View file

@ -0,0 +1,14 @@
import macros from '../macros';
import ApiClient from '../ApiClient';
describe('#macrosAPI', () => {
it('creates correct instance', () => {
expect(macros).toBeInstanceOf(ApiClient);
expect(macros).toHaveProperty('get');
expect(macros).toHaveProperty('create');
expect(macros).toHaveProperty('update');
expect(macros).toHaveProperty('delete');
expect(macros).toHaveProperty('show');
expect(macros.url).toBe('/api/v1/macros');
});
});

View file

@ -113,9 +113,22 @@ $default-button-height: 4.0rem;
}
&.clear {
color: var(--w-700);
&.secondary {
color: var(--s-700)
}
&.success {
color: var(--g-700)
}
&.alert {
color: var(--r-700)
}
&.warning {
color: var(--y-600);
color: var(--y-700)
}
&:hover {
@ -146,6 +159,8 @@ $default-button-height: 4.0rem;
&.small {
height: var(--space-large);
padding-bottom: var(--space-smaller);
padding-top: var(--space-smaller);
}
&.large {

View file

@ -14,15 +14,9 @@
}
.modal--close {
border-radius: 50%;
color: $color-heading;
cursor: pointer;
font-size: $font-size-big;
line-height: $space-normal;
padding: $space-normal;
position: absolute;
right: $space-micro;
top: $space-micro;
right: $space-small;
top: $space-small;
&:hover {
background: $color-background;

View file

@ -7,9 +7,13 @@
@click="onBackDropClick"
>
<div :class="modalContainerClassName" @click.stop>
<button class="modal--close" @click="close">
<fluent-icon icon="dismiss" />
</button>
<woot-button
color-scheme="secondary"
icon="dismiss"
variant="clear"
class="modal--close"
@click="close"
/>
<slot />
</div>
</div>

View file

@ -73,14 +73,14 @@ export default {
computed: {
...mapGetters({
currentUser: 'getCurrentUser',
globalConfig: 'globalConfig/get',
isACustomBrandedInstance: 'globalConfig/isACustomBrandedInstance',
isOnChatwootCloud: 'globalConfig/isOnChatwootCloud',
inboxes: 'inboxes/getInboxes',
accountId: 'getCurrentAccountId',
currentRole: 'getCurrentRole',
currentUser: 'getCurrentUser',
globalConfig: 'globalConfig/get',
inboxes: 'inboxes/getInboxes',
isACustomBrandedInstance: 'globalConfig/isACustomBrandedInstance',
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
isOnChatwootCloud: 'globalConfig/isOnChatwootCloud',
labels: 'labels/getLabelsOnSidebar',
teams: 'teams/getMyTeams',
}),

View file

@ -39,7 +39,7 @@ const primaryMenuItems = accountId => [
label: 'HELP_CENTER.TITLE',
featureFlag: 'help_center',
toState: frontendURL(`accounts/${accountId}/portals`),
toStateName: 'list_all_portals',
toStateName: 'default_portal_articles',
roles: ['administrator'],
},
{

View file

@ -1,45 +1,58 @@
import { FEATURE_FLAGS } from '../../../../featureFlags';
import { frontendURL } from '../../../../helper/URLHelper';
const settings = accountId => ({
parentNav: 'settings',
routes: [
'agent_bots',
'agent_list',
'canned_list',
'labels_list',
'settings_inbox',
'attributes_list',
'settings_inbox_new',
'settings_inbox_list',
'settings_inbox_show',
'settings_inboxes_page_channel',
'settings_inboxes_add_agents',
'settings_inbox_finish',
'settings_integrations',
'settings_integrations_webhook',
'settings_integrations_integration',
'settings_applications',
'settings_integrations_dashboard_apps',
'settings_applications_webhook',
'settings_applications_integration',
'general_settings',
'automation_list',
'billing_settings_index',
'canned_list',
'general_settings_index',
'general_settings',
'labels_list',
'macros_edit',
'macros_new',
'macros_wrapper',
'settings_applications_integration',
'settings_applications_webhook',
'settings_applications',
'settings_inbox_finish',
'settings_inbox_list',
'settings_inbox_new',
'settings_inbox_show',
'settings_inbox',
'settings_inboxes_add_agents',
'settings_inboxes_page_channel',
'settings_integrations_dashboard_apps',
'settings_integrations_integration',
'settings_integrations_webhook',
'settings_integrations',
'settings_teams_add_agents',
'settings_teams_edit_finish',
'settings_teams_edit_members',
'settings_teams_edit',
'settings_teams_finish',
'settings_teams_list',
'settings_teams_new',
'settings_teams_add_agents',
'settings_teams_finish',
'settings_teams_edit',
'settings_teams_edit_members',
'settings_teams_edit_finish',
'billing_settings_index',
'automation_list',
],
menuItems: [
{
icon: 'briefcase',
label: 'ACCOUNT_SETTINGS',
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/general`),
toStateName: 'general_settings_index',
},
{
icon: 'people',
label: 'AGENTS',
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/agents/list`),
toStateName: 'agent_list',
featureFlag: FEATURE_FLAGS.AGENT_MANAGEMENT,
},
{
icon: 'people-team',
@ -47,6 +60,7 @@ const settings = accountId => ({
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/teams/list`),
toStateName: 'settings_teams_list',
featureFlag: FEATURE_FLAGS.TEAM_MANAGEMENT,
},
{
icon: 'mail-inbox-all',
@ -54,6 +68,7 @@ const settings = accountId => ({
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/inboxes/list`),
toStateName: 'settings_inbox_list',
featureFlag: FEATURE_FLAGS.INBOX_MANAGEMENT,
},
{
icon: 'tag',
@ -61,6 +76,7 @@ const settings = accountId => ({
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/labels/list`),
toStateName: 'labels_list',
featureFlag: FEATURE_FLAGS.LABELS,
},
{
icon: 'code',
@ -70,13 +86,34 @@ const settings = accountId => ({
`accounts/${accountId}/settings/custom-attributes/list`
),
toStateName: 'attributes_list',
featureFlag: FEATURE_FLAGS.CUSTOM_ATTRIBUTES,
},
{
icon: 'automation',
label: 'AUTOMATION',
beta: true,
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/automation/list`),
toStateName: 'automation_list',
featureFlag: FEATURE_FLAGS.AUTOMATIONS,
},
{
icon: 'bot',
label: 'AGENT_BOTS',
beta: true,
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/agent-bots`),
toStateName: 'agent_bots',
featureFlag: FEATURE_FLAGS.AGENT_BOTS,
},
{
icon: 'flash-settings',
label: 'MACROS',
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/macros`),
toStateName: 'macros_wrapper',
beta: true,
featureFlag: FEATURE_FLAGS.MACROS,
},
{
icon: 'chat-multiple',
@ -86,6 +123,7 @@ const settings = accountId => ({
`accounts/${accountId}/settings/canned-response/list`
),
toStateName: 'canned_list',
featureFlag: FEATURE_FLAGS.CANNED_RESPONSES,
},
{
icon: 'flash-on',
@ -93,6 +131,7 @@ const settings = accountId => ({
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/integrations`),
toStateName: 'settings_integrations',
featureFlag: FEATURE_FLAGS.INTEGRATIONS,
},
{
icon: 'star-emphasis',
@ -100,6 +139,7 @@ const settings = accountId => ({
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/applications`),
toStateName: 'settings_applications',
featureFlag: FEATURE_FLAGS.INTEGRATIONS,
},
{
icon: 'credit-card-person',
@ -109,13 +149,6 @@ const settings = accountId => ({
toStateName: 'billing_settings_index',
showOnlyOnCloud: true,
},
{
icon: 'settings',
label: 'ACCOUNT_SETTINGS',
hasSubMenu: false,
toState: frontendURL(`accounts/${accountId}/settings/general`),
toStateName: 'general_settings_index',
},
],
});

View file

@ -8,25 +8,33 @@
:header-title="$t('SIDEBAR_ITEMS.CHANGE_ACCOUNTS')"
:header-content="$t('SIDEBAR_ITEMS.SELECTOR_SUBTITLE')"
/>
<div
v-for="account in currentUser.accounts"
:key="account.id"
class="account-selector"
>
<a :href="`/app/accounts/${account.id}/dashboard`">
<fluent-icon
v-if="account.id === accountId"
class="selected--account"
icon="checkmark-circle"
type="solid"
size="24"
/>
<label :for="account.name" class="account--details">
<div class="account--name">{{ account.name }}</div>
<div class="account--role">{{ account.role }}</div>
</label>
</a>
<div class="account-selector--wrap">
<div
v-for="account in currentUser.accounts"
:key="account.id"
class="account-selector"
>
<button
class="button expanded clear link"
@click="onChangeAccount(account.id)"
>
<span class="button__content">
<label :for="account.name" class="account-details--wrap">
<div class="account--name">{{ account.name }}</div>
<div class="account--role">{{ account.role }}</div>
</label>
</span>
<fluent-icon
v-show="account.id === accountId"
class="selected--account"
icon="checkmark-circle"
type="solid"
size="24"
/>
</button>
</div>
</div>
<div
v-if="globalConfig.createNewAccountFromDashboard"
class="modal-footer delete-item"
@ -58,5 +66,40 @@ export default {
globalConfig: 'globalConfig/get',
}),
},
methods: {
onChangeAccount(accountId) {
const accountUrl = `/app/accounts/${accountId}/dashboard`;
window.location.href = accountUrl;
},
},
};
</script>
<style lang="scss" scoped>
.account-selector--wrap {
margin-top: var(--space-normal);
}
.account-selector {
padding-top: 0;
padding-bottom: 0;
.button {
display: flex;
justify-content: space-between;
padding: var(--space-one) var(--space-normal);
.account-details--wrap {
text-align: left;
.account--name {
cursor: pointer;
font-size: var(--font-size-medium);
font-weight: var(--font-weight-medium);
line-height: 1;
}
.account--role {
cursor: pointer;
font-size: var(--font-size-mini);
text-transform: capitalize;
}
}
}
}
</style>

View file

@ -20,6 +20,8 @@
import { frontendURL } from '../../../helper/URLHelper';
import SecondaryNavItem from './SecondaryNavItem.vue';
import AccountContext from './AccountContext.vue';
import { mapGetters } from 'vuex';
import { FEATURE_FLAGS } from '../../../featureFlags';
export default {
components: {
@ -61,6 +63,9 @@ export default {
},
},
computed: {
...mapGetters({
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
}),
hasSecondaryMenu() {
return this.menuConfig.menuItems && this.menuConfig.menuItems.length;
},
@ -89,7 +94,7 @@ export default {
icon: 'folder',
label: 'INBOXES',
hasSubMenu: true,
newLink: true,
newLink: this.showNewLink(FEATURE_FLAGS.INBOX_MANAGEMENT),
newLinkTag: 'NEW_INBOX',
key: 'inbox',
toState: frontendURL(`accounts/${this.accountId}/settings/inboxes/new`),
@ -117,7 +122,7 @@ export default {
icon: 'number-symbol',
label: 'LABELS',
hasSubMenu: true,
newLink: true,
newLink: this.showNewLink(FEATURE_FLAGS.TEAM_MANAGEMENT),
newLinkTag: 'NEW_LABEL',
key: 'label',
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
@ -141,7 +146,7 @@ export default {
label: 'TAGGED_WITH',
hasSubMenu: true,
key: 'label',
newLink: true,
newLink: this.showNewLink(FEATURE_FLAGS.TEAM_MANAGEMENT),
newLinkTag: 'NEW_LABEL',
toState: frontendURL(`accounts/${this.accountId}/settings/labels`),
toStateName: 'labels_list',
@ -163,7 +168,7 @@ export default {
icon: 'people-team',
label: 'TEAMS',
hasSubMenu: true,
newLink: true,
newLink: this.showNewLink(FEATURE_FLAGS.TEAM_MANAGEMENT),
newLinkTag: 'NEW_TEAM',
key: 'team',
toState: frontendURL(`accounts/${this.accountId}/settings/teams/new`),
@ -238,6 +243,9 @@ export default {
toggleAccountModal() {
this.$emit('toggle-accounts');
},
showNewLink(featureFlag) {
return this.isFeatureEnabledonAccount(this.accountId, featureFlag);
},
},
};
</script>

View file

@ -1,5 +1,5 @@
<template>
<li class="sidebar-item">
<li v-show="isMenuItemVisible" class="sidebar-item">
<div v-if="hasSubMenu" class="secondary-menu--wrap">
<span class="secondary-menu--header fs-small">
{{ $t(`SIDEBAR.${menuItem.label}`) }}
@ -36,7 +36,7 @@
{{ `${menuItem.count}` }}
</span>
<span
v-if="menuItem.label === 'AUTOMATION'"
v-if="menuItem.beta"
data-view-component="true"
label="Beta"
class="beta"
@ -114,10 +114,23 @@ export default {
},
},
computed: {
...mapGetters({ activeInbox: 'getSelectedInbox' }),
...mapGetters({
activeInbox: 'getSelectedInbox',
accountId: 'getCurrentAccountId',
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
}),
hasSubMenu() {
return !!this.menuItem.children;
},
isMenuItemVisible() {
if (!this.menuItem.featureFlag) {
return true;
}
return this.isFeatureEnabledonAccount(
this.accountId,
this.menuItem.featureFlag
);
},
isInboxConversation() {
return (
this.$store.state.route.name === 'inbox_conversation' &&
@ -204,7 +217,7 @@ export default {
}
},
showItem(item) {
return this.isAdmin && item.newLink !== undefined;
return this.isAdmin && !!item.newLink;
},
onClickOpen() {
this.$emit('open');
@ -308,7 +321,7 @@ export default {
.beta {
padding-right: var(--space-smaller) !important;
padding-left: var(--space-smaller) !important;
margin-left: var(--space-half) !important;
margin-left: var(--space-smaller) !important;
display: inline-block;
font-size: var(--font-size-micro);
font-weight: var(--font-weight-medium);

View file

@ -0,0 +1,113 @@
<template>
<div class="preview-card--wrap" :class="{ activecard: active }">
<div class="header--wrap" :class="{ active: active }">
<div class="heading-wrap text-block-title">{{ heading }}</div>
<fluent-icon
v-if="active"
icon="checkmark-circle"
type="solid"
size="24"
class="checkmark"
/>
</div>
<div class="content-wrap">
{{ content }}
</div>
<div class="image-wrap">
<img :src="src" class="image" :class="{ activeimage: active }" />
</div>
</div>
</template>
<script>
export default {
props: {
heading: {
type: String,
default: '',
},
content: {
type: String,
default: '',
},
active: {
type: Boolean,
default: false,
},
buttonText: {
type: String,
default: 'Active',
},
src: {
type: String,
default: '',
},
},
};
</script>
<style lang="scss" scoped>
.preview-card--wrap {
border-radius: var(--border-radius-normal);
border: 1px solid var(--color-border);
display: flex;
flex-direction: column;
max-height: 34rem;
max-width: 38rem;
min-width: 24rem;
.header--wrap {
background: var(--s-50);
border-bottom: 1px solid var(--color-border);
border-top-left-radius: var(--border-radius-normal);
border-top-right-radius: var(--border-radius-normal);
display: flex;
height: 4rem;
justify-content: space-between;
padding: var(--space-small);
width: 100%;
}
.active {
background: var(--w-50);
border-bottom: 1px solid var(--w-75);
}
.heading-wrap {
align-items: center;
display: flex;
font-weight: var(--font-weight-medium);
padding: var(--space-smaller);
}
.checkmark {
color: var(--w-500);
}
.content-wrap {
color: var(--s-700);
font-size: var(--font-size-mini);
line-height: 1.4;
padding: var(--space-slab) var(--space-slab) 0 var(--space-slab);
text-align: start;
}
.image-wrap {
padding: var(--space-slab);
}
.image {
border: 1px solid var(--color-border);
border-radius: var(--border-radius-normal);
}
.activeimage {
border: 1px solid var(--w-75);
}
}
.activecard {
background: var(--w-25);
border: 1px solid var(--w-300);
}
</style>

View file

@ -78,7 +78,7 @@ export default {
if (initials.length > 2 && initials.search(/[A-Z]/) !== -1) {
initials = initials.replace(/[a-z]+/g, '');
}
initials = initials.substr(0, 2).toUpperCase();
initials = initials.substring(0, 2).toUpperCase();
return initials;
},
},

View file

@ -6,7 +6,7 @@
@click="insertMentionNode"
/>
<canned-response
v-if="showCannedMenu"
v-if="showCannedMenu && !isPrivate"
:search-key="cannedSearchTerm"
@click="insertCannedResponse"
/>
@ -28,7 +28,7 @@ import {
suggestionsPlugin,
triggerCharacters,
} from '@chatwoot/prosemirror-schema/src/mentions/plugin';
import { EditorState } from 'prosemirror-state';
import { EditorState, Selection } from 'prosemirror-state';
import { defaultMarkdownParser } from 'prosemirror-markdown';
import { wootWriterSetup } from '@chatwoot/prosemirror-schema';
@ -61,23 +61,28 @@ export default {
mixins: [eventListenerMixins],
props: {
value: { type: String, default: '' },
editorId: { type: String, default: '' },
placeholder: { type: String, default: '' },
isPrivate: { type: Boolean, default: false },
isFormatMode: { type: Boolean, default: false },
enableSuggestions: { type: Boolean, default: true },
},
data() {
return {
lastValue: null,
showUserMentions: false,
showCannedMenu: false,
mentionSearchKey: '',
cannedSearchTerm: '',
editorView: null,
range: null,
state: undefined,
};
},
computed: {
contentFromEditor() {
return addMentionsToMarkdownSerializer(
defaultMarkdownSerializer
).serialize(this.editorView.state.doc);
},
plugins() {
if (!this.enableSuggestions) {
return [];
@ -102,7 +107,6 @@ export default {
onExit: () => {
this.mentionSearchKey = '';
this.showUserMentions = false;
this.editorView = null;
return false;
},
onKeyDown: ({ event }) => {
@ -131,7 +135,6 @@ export default {
onExit: () => {
this.cannedSearchTerm = '';
this.showCannedMenu = false;
this.editorView = null;
return false;
},
onKeyDown: ({ event }) => {
@ -149,54 +152,57 @@ export default {
this.$emit('toggle-canned-menu', !this.isPrivate && updatedValue);
},
value(newValue = '') {
if (newValue !== this.lastValue) {
const { tr } = this.state;
if (this.isFormatMode) {
this.state = createState(
newValue,
this.placeholder,
this.plugins,
this.isFormatMode
);
} else {
tr.insertText(newValue, 0, tr.doc.content.size);
this.state = this.view.state.apply(tr);
}
this.view.updateState(this.state);
if (newValue !== this.contentFromEditor) {
this.reloadState();
}
},
editorId() {
this.reloadState();
},
isPrivate() {
this.reloadState();
},
},
created() {
this.state = createState(this.value, this.placeholder, this.plugins);
},
mounted() {
this.view = new EditorView(this.$refs.editor, {
state: this.state,
dispatchTransaction: tx => {
this.state = this.state.apply(tx);
this.emitOnChange();
},
handleDOMEvents: {
keyup: () => {
this.onKeyup();
},
focus: () => {
this.onFocus();
},
blur: () => {
this.onBlur();
},
paste: (view, event) => {
const data = event.clipboardData.files;
if (data.length > 0) {
event.preventDefault();
}
},
},
});
this.createEditorView();
this.editorView.updateState(this.state);
this.focusEditorInputField();
},
methods: {
reloadState() {
this.state = createState(this.value, this.placeholder, this.plugins);
this.editorView.updateState(this.state);
this.focusEditorInputField();
},
createEditorView() {
this.editorView = new EditorView(this.$refs.editor, {
state: this.state,
dispatchTransaction: tx => {
this.state = this.state.apply(tx);
this.emitOnChange();
},
handleDOMEvents: {
keyup: () => {
this.onKeyup();
},
focus: () => {
this.onFocus();
},
blur: () => {
this.onBlur();
},
paste: (view, event) => {
const data = event.clipboardData.files;
if (data.length > 0) {
event.preventDefault();
}
},
},
});
},
handleKeyEvents(e) {
if (hasPressedAltAndPKey(e)) {
this.focusEditorInputField();
@ -206,47 +212,60 @@ export default {
}
},
focusEditorInputField() {
this.$refs.editor.querySelector('div.ProseMirror-woot-style').focus();
const { tr } = this.editorView.state;
const selection = Selection.atEnd(tr.doc);
this.editorView.dispatch(tr.setSelection(selection));
this.editorView.focus();
},
insertMentionNode(mentionItem) {
if (!this.view) {
if (!this.editorView) {
return null;
}
const node = this.view.state.schema.nodes.mention.create({
userId: mentionItem.key,
userFullName: mentionItem.label,
const node = this.editorView.state.schema.nodes.mention.create({
userId: mentionItem.id,
userFullName: mentionItem.name,
});
const tr = this.view.state.tr.replaceWith(
const tr = this.editorView.state.tr.replaceWith(
this.range.from,
this.range.to,
node
);
this.state = this.view.state.apply(tr);
this.state = this.editorView.state.apply(tr);
return this.emitOnChange();
},
insertCannedResponse(cannedItem) {
if (!this.view) {
if (!this.editorView) {
return null;
}
const tr = this.view.state.tr.insertText(
const tr = this.editorView.state.tr.insertText(
cannedItem,
this.range.from,
this.range.to
);
this.state = this.view.state.apply(tr);
return this.emitOnChange();
this.state = this.editorView.state.apply(tr);
this.emitOnChange();
// Hacky fix for #5501
this.state = createState(
this.contentFromEditor,
this.placeholder,
this.plugins
);
this.editorView.updateState(this.state);
this.focusEditorInputField();
return false;
},
emitOnChange() {
this.view.updateState(this.state);
this.lastValue = addMentionsToMarkdownSerializer(
defaultMarkdownSerializer
).serialize(this.state.doc);
this.$emit('input', this.lastValue);
this.editorView.updateState(this.state);
this.$emit('input', this.contentFromEditor);
},
hideMentions() {
this.showUserMentions = false;
},

View file

@ -11,7 +11,6 @@
size="small"
@click="toggleEmojiPicker"
/>
<!-- ensure the same validations for attachment types are implemented in backend models as well -->
<file-upload
ref="upload"
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_ATTACH_ICON')"
@ -47,6 +46,16 @@
:title="$t('CONVERSATION.REPLYBOX.TIP_AUDIORECORDER_ICON')"
@click="toggleAudioRecorder"
/>
<woot-button
v-if="showEditorToggle"
v-tooltip.top-end="$t('CONVERSATION.REPLYBOX.TIP_FORMAT_ICON')"
icon="quote"
emoji="🖊️"
color-scheme="secondary"
variant="smooth"
size="small"
@click="$emit('toggle-editor')"
/>
<woot-button
v-if="showAudioPlayStopButton"
:icon="audioRecorderPlayStopIcon"
@ -91,17 +100,6 @@
</transition>
</div>
<div class="right-wrap">
<div v-if="isFormatMode" class="enter-to-send--checkbox">
<input
:checked="enterToSendEnabled"
type="checkbox"
value="enterToSend"
@input="toggleEnterToSend"
/>
<label for="enterToSend">
{{ $t('CONVERSATION.REPLYBOX.ENTER_TO_SEND') }}
</label>
</div>
<woot-button
size="small"
:class-names="buttonClass"
@ -121,13 +119,15 @@ import { hasPressedAltAndAKey } from 'shared/helpers/KeyboardHelpers';
import eventListenerMixins from 'shared/mixins/eventListenerMixins';
import uiSettingsMixin from 'dashboard/mixins/uiSettings';
import inboxMixin from 'shared/mixins/inboxMixin';
import { FEATURE_FLAGS } from 'dashboard/featureFlags';
import {
ALLOWED_FILE_TYPES,
ALLOWED_FILE_TYPES_FOR_TWILIO_WHATSAPP,
} from 'shared/constants/messages';
import { REPLY_EDITOR_MODES } from './constants';
import { mapGetters } from 'vuex';
export default {
name: 'ReplyBottomPanel',
components: { FileUpload },
@ -193,7 +193,7 @@ export default {
type: Boolean,
default: false,
},
isFormatMode: {
showEditorToggle: {
type: Boolean,
default: false,
},
@ -201,10 +201,6 @@ export default {
type: Boolean,
default: false,
},
enterToSendEnabled: {
type: Boolean,
default: true,
},
enableMultipleFileUpload: {
type: Boolean,
default: true,
@ -215,6 +211,10 @@ export default {
},
},
computed: {
...mapGetters({
accountId: 'getCurrentAccountId',
isFeatureEnabledonAccount: 'accounts/isFeatureEnabledonAccount',
}),
isNote() {
return this.mode === REPLY_EDITOR_MODES.NOTE;
},
@ -232,7 +232,12 @@ export default {
return this.showFileUpload || this.isNote;
},
showAudioRecorderButton() {
return this.showAudioRecorder;
return (
this.isFeatureEnabledonAccount(
this.accountId,
FEATURE_FLAGS.VOICE_RECORDER
) && this.showAudioRecorder
);
},
showAudioPlayStopButton() {
return this.showAudioRecorder && this.isRecordingAudio;
@ -278,9 +283,6 @@ export default {
this.$refs.upload.$children[1].$el.click();
}
},
toggleEnterToSend() {
this.$emit('toggleEnterToSend', !this.enterToSendEnabled);
},
toggleMessageSignature() {
this.updateUISettings({
send_with_signature: !this.sendWithSignature,
@ -312,20 +314,6 @@ export default {
.right-wrap {
display: flex;
.enter-to-send--checkbox {
align-items: center;
display: flex;
input {
margin: 0;
}
label {
color: var(--s-500);
font-size: var(--font-size-mini);
}
}
}
::v-deep .file-uploads {

View file

@ -100,10 +100,11 @@
v-if="isBubble && !isMessageDeleted"
:is-open="showContextMenu"
:show-copy="hasText"
:show-canned-response-option="isOutgoing"
:menu-position="contextMenuPosition"
:message-content="data.content"
@toggle="handleContextMenuClick"
@delete="handleDelete"
@copy="handleCopy"
/>
</div>
</li>
@ -126,7 +127,6 @@ import alertMixin from 'shared/mixins/alertMixin';
import contentTypeMixin from 'shared/mixins/contentTypeMixin';
import { MESSAGE_TYPE, MESSAGE_STATUS } from 'shared/constants/messages';
import { generateBotMessageContent } from './helpers/botMessageContentHelper';
import { copyTextToClipboard } from 'shared/helpers/clipboard';
export default {
components: {
@ -408,11 +408,6 @@ export default {
this.showAlert(this.$t('CONVERSATION.FAIL_DELETE_MESSSAGE'));
}
},
async handleCopy() {
await copyTextToClipboard(this.data.content);
this.showAlert(this.$t('CONTACT_PANEL.COPY_SUCCESSFUL'));
this.showContextMenu = false;
},
async retrySendMessage() {
await this.$store.dispatch('sendMessageWithData', this.data);
},
@ -425,6 +420,8 @@ export default {
<style lang="scss">
.wrap {
> .bubble {
min-width: 128px;
&.is-image,
&.is-video {
padding: 0;

View file

@ -434,7 +434,7 @@ export default {
&::before {
transform: rotate(0deg);
left: var(--space-half);
left: var(--space-smaller);
bottom: var(--space-minus-slab);
}
}

View file

@ -56,6 +56,7 @@
<woot-message-editor
v-else
v-model="message"
:editor-id="editorStateId"
class="input"
:is-private="isOnPrivateNote"
:placeholder="messagePlaceHolder"
@ -108,12 +109,11 @@
:recording-audio-state="recordingAudioState"
:is-recording-audio="isRecordingAudio"
:is-on-private-note="isOnPrivateNote"
:is-format-mode="showRichContentEditor"
:enter-to-send-enabled="enterToSendEnabled"
:show-editor-toggle="isAPIInbox && !isOnPrivateNote"
:enable-multiple-file-upload="enableMultipleFileUpload"
:has-whatsapp-templates="hasWhatsappTemplates"
@toggleEnterToSend="toggleEnterToSend"
@selectWhatsappTemplate="openWhatsappTemplateModal"
@toggle-editor="toggleRichContentEditor"
/>
<whatsapp-templates
:inbox-id="inbox.id"
@ -148,19 +148,18 @@ import {
MAXIMUM_FILE_UPLOAD_SIZE_TWILIO_SMS_CHANNEL,
} from 'shared/constants/messages';
import { BUS_EVENTS } from 'shared/constants/busEvents';
import WhatsappTemplates from './WhatsappTemplates/Modal.vue';
import {
isEscape,
isEnter,
hasPressedShift,
hasPressedCommandPlusKKey,
} from 'shared/helpers/KeyboardHelpers';
import { buildHotKeys } from 'shared/helpers/KeyboardHelpers';
import { MESSAGE_MAX_LENGTH } from 'shared/helpers/MessageTypeHelper';
import inboxMixin from 'shared/mixins/inboxMixin';
import uiSettingsMixin from 'dashboard/mixins/uiSettings';
import { DirectUpload } from 'activestorage';
import { frontendURL } from '../../../helper/URLHelper';
import { LocalStorage, LOCAL_STORAGE_KEYS } from '../../../helper/localStorage';
import { trimContent, debounce } from '@chatwoot/utils';
import wootConstants from 'dashboard/constants';
import { isEditorHotKeyEnabled } from 'dashboard/mixins/uiSettings';
export default {
components: {
@ -214,6 +213,7 @@ export default {
hasSlashCommand: false,
bccEmails: '',
ccEmails: '',
doAutoSaveDraft: () => {},
showWhatsAppTemplatesModal: false,
};
},
@ -231,6 +231,13 @@ export default {
return true;
}
if (this.isAPIInbox) {
const {
display_rich_content_editor: displayRichContentEditor = false,
} = this.uiSettings;
return displayRichContentEditor;
}
return false;
},
assignedAgent: {
@ -266,9 +273,6 @@ export default {
return !!this.$store.getters['inboxes/getWhatsAppTemplates'](this.inboxId)
.length;
},
enterToSendEnabled() {
return !!this.uiSettings.enter_to_send_enabled;
},
isPrivate() {
if (this.currentChat.can_reply || this.isAWhatsAppChannel) {
return this.isOnPrivateNote;
@ -342,13 +346,16 @@ export default {
);
},
replyButtonLabel() {
let sendMessageText = this.$t('CONVERSATION.REPLYBOX.SEND');
if (this.isPrivate) {
return this.$t('CONVERSATION.REPLYBOX.CREATE');
sendMessageText = this.$t('CONVERSATION.REPLYBOX.CREATE');
} else if (this.conversationType === 'tweet') {
sendMessageText = this.$t('CONVERSATION.REPLYBOX.TWEET');
}
if (this.conversationType === 'tweet') {
return this.$t('CONVERSATION.REPLYBOX.TWEET');
}
return this.$t('CONVERSATION.REPLYBOX.SEND');
const keyLabel = isEditorHotKeyEnabled(this.uiSettings, 'cmd_enter')
? '(⌘ + ↵)'
: '(↵)';
return `${sendMessageText} ${keyLabel}`;
},
replyBoxClass() {
return {
@ -366,7 +373,7 @@ export default {
);
},
isRichEditorEnabled() {
return this.isAWebWidgetInbox || this.isAnEmailChannel || this.isAPIInbox;
return this.isAWebWidgetInbox || this.isAnEmailChannel;
},
showAudioRecorder() {
return !this.isOnPrivateNote && this.showFileUpload;
@ -429,10 +436,31 @@ export default {
profilePath() {
return frontendURL(`accounts/${this.accountId}/profile/settings`);
},
editorMessageKey() {
const { editor_message_key: isEnabled } = this.uiSettings;
return isEnabled;
},
commandPlusEnterToSendEnabled() {
return this.editorMessageKey === 'cmd_enter';
},
enterToSendEnabled() {
return this.editorMessageKey === 'enter';
},
conversationId() {
return this.currentChat.id;
},
conversationIdByRoute() {
const { conversation_id: conversationId } = this.$route.params;
return conversationId;
},
editorStateId() {
return `draft-${this.conversationIdByRoute}-${this.replyType}`;
},
},
watch: {
currentChat(conversation) {
const { can_reply: canReply } = conversation;
if (this.isOnPrivateNote) {
return;
}
@ -445,34 +473,135 @@ export default {
this.setCCEmailFromLastChat();
},
conversationIdByRoute(conversationId, oldConversationId) {
if (conversationId !== oldConversationId) {
this.setToDraft(oldConversationId, this.replyType);
this.getFromDraft();
}
},
message(updatedMessage) {
this.hasSlashCommand =
updatedMessage[0] === '/' && !this.showRichContentEditor;
const hasNextWord = updatedMessage.includes(' ');
const isShortCodeActive = this.hasSlashCommand && !hasNextWord;
if (isShortCodeActive) {
this.mentionSearchKey = updatedMessage.substr(1, updatedMessage.length);
this.mentionSearchKey = updatedMessage.substring(1);
this.showMentions = true;
} else {
this.mentionSearchKey = '';
this.showMentions = false;
}
this.doAutoSaveDraft();
},
replyType(updatedReplyType, oldReplyType) {
this.setToDraft(this.conversationIdByRoute, oldReplyType);
this.getFromDraft();
},
},
mounted() {
this.getFromDraft();
// Donot use the keyboard listener mixin here as the events here are supposed to be
// working even if input/textarea is focussed.
document.addEventListener('keydown', this.handleKeyEvents);
document.addEventListener('paste', this.onPaste);
document.addEventListener('keydown', this.handleKeyEvents);
this.setCCEmailFromLastChat();
this.doAutoSaveDraft = debounce(
() => {
this.saveDraft(this.conversationIdByRoute, this.replyType);
},
500,
true
);
},
destroyed() {
document.removeEventListener('keydown', this.handleKeyEvents);
document.removeEventListener('paste', this.onPaste);
document.removeEventListener('keydown', this.handleKeyEvents);
},
methods: {
toggleRichContentEditor() {
this.updateUISettings({
display_rich_content_editor: !this.showRichContentEditor,
});
},
getSavedDraftMessages() {
return LocalStorage.get(LOCAL_STORAGE_KEYS.DRAFT_MESSAGES) || {};
},
saveDraft(conversationId, replyType) {
if (this.message || this.message === '') {
const savedDraftMessages = this.getSavedDraftMessages();
const key = `draft-${conversationId}-${replyType}`;
const draftToSave = trimContent(this.message || '');
const {
[key]: currentDraft,
...restOfDraftMessages
} = savedDraftMessages;
const updatedDraftMessages = draftToSave
? {
...restOfDraftMessages,
[key]: draftToSave,
}
: restOfDraftMessages;
LocalStorage.set(
LOCAL_STORAGE_KEYS.DRAFT_MESSAGES,
updatedDraftMessages
);
}
},
setToDraft(conversationId, replyType) {
this.saveDraft(conversationId, replyType);
this.message = '';
},
getFromDraft() {
if (this.conversationIdByRoute) {
try {
const key = `draft-${this.conversationIdByRoute}-${this.replyType}`;
const savedDraftMessages = this.getSavedDraftMessages();
this.message = `${savedDraftMessages[key] || ''}`;
} catch (error) {
this.message = '';
}
}
},
removeFromDraft() {
if (this.conversationIdByRoute) {
const key = `draft-${this.conversationIdByRoute}-${this.replyType}`;
const draftMessages = this.getSavedDraftMessages();
const { [key]: toBeRemoved, ...updatedDraftMessages } = draftMessages;
LocalStorage.set(
LOCAL_STORAGE_KEYS.DRAFT_MESSAGES,
updatedDraftMessages
);
}
},
handleKeyEvents(e) {
const keyCode = buildHotKeys(e);
if (keyCode === 'escape') {
this.hideEmojiPicker();
this.hideMentions();
} else if (keyCode === 'meta+k') {
const ninja = document.querySelector('ninja-keys');
ninja.open();
e.preventDefault();
} else if (keyCode === 'enter' && this.isAValidEvent('enter')) {
this.onSendReply();
} else if (
['meta+enter', 'ctrl+enter'].includes(keyCode) &&
this.isAValidEvent('cmd_enter')
) {
this.onSendReply();
}
},
isAValidEvent(selectedKey) {
return (
!this.hasUserMention &&
!this.showCannedMenu &&
this.isFocused &&
isEditorHotKeyEnabled(this.uiSettings, selectedKey)
);
},
onPaste(e) {
const data = e.clipboardData.files;
if (!this.showRichContentEditor && data.length !== 0) {
@ -492,34 +621,6 @@ export default {
toggleCannedMenu(value) {
this.showCannedMenu = value;
},
handleKeyEvents(e) {
if (isEscape(e)) {
this.hideEmojiPicker();
this.hideMentions();
} else if (isEnter(e)) {
const hasSendOnEnterEnabled =
(this.showRichContentEditor &&
this.enterToSendEnabled &&
!this.hasUserMention &&
!this.showCannedMenu) ||
!this.showRichContentEditor;
const shouldSendMessage =
hasSendOnEnterEnabled && !hasPressedShift(e) && this.isFocused;
if (shouldSendMessage) {
e.preventDefault();
this.onSendReply();
}
} else if (hasPressedCommandPlusKKey(e)) {
this.openCommandBar();
}
},
openCommandBar() {
const ninja = document.querySelector('ninja-keys');
ninja.open();
},
toggleEnterToSend(enterToSendEnabled) {
this.updateUISettings({ enter_to_send_enabled: enterToSendEnabled });
},
openWhatsappTemplateModal() {
this.showWhatsAppTemplatesModal = true;
},
@ -559,11 +660,13 @@ export default {
newMessage += '\n\n' + this.messageSignature;
}
const messagePayload = this.getMessagePayload(newMessage);
this.clearMessage();
if (!this.isPrivate) {
this.clearEmailField();
}
this.sendMessage(messagePayload);
this.clearMessage();
this.hideEmojiPicker();
this.$emit('update:popoutReplyBox', false);
}
@ -575,6 +678,7 @@ export default {
messagePayload
);
bus.$emit(BUS_EVENTS.SCROLL_TO_MESSAGE);
this.removeFromDraft();
} catch (error) {
const errorMessage =
error?.response?.data?.error || this.$t('CONVERSATION.MESSAGE_ERROR');
@ -595,7 +699,6 @@ export default {
},
setReplyMode(mode = REPLY_EDITOR_MODES.REPLY) {
const { can_reply: canReply } = this.currentChat;
if (canReply || this.isAWhatsAppChannel) this.replyType = mode;
if (this.showRichContentEditor) {
if (this.isRecordingAudio) {
@ -654,6 +757,7 @@ export default {
},
onBlur() {
this.isFocused = false;
this.saveDraft(this.conversationIdByRoute, this.replyType);
},
onFocus() {
this.isFocused = true;
@ -879,7 +983,7 @@ export default {
&::before {
transform: rotate(0deg);
left: var(--space-half);
left: var(--space-smaller);
bottom: var(--space-minus-slab);
}
}

View file

@ -1,49 +1,160 @@
<template>
<mention-box :items="items" @mention-select="handleMentionClick" />
<ul
v-if="items.length"
class="vertical dropdown menu mention--box"
:style="{ top: getTopSpacing() + 'rem' }"
:class="{ 'with-bottom-border': items.length <= 4 }"
>
<li
v-for="(agent, index) in items"
:id="`mention-item-${index}`"
:key="agent.id"
:class="{ active: index === selectedIndex }"
@click="onAgentSelect(index)"
@mouseover="onHover(index)"
>
<div class="mention--thumbnail">
<woot-thumbnail
:src="agent.thumbnail"
:username="agent.name"
size="32px"
/>
</div>
<div class="mention--metadata text-truncate">
<h5 class="text-block-title mention--user-name text-truncate">
{{ agent.name }}
</h5>
<div class="text-truncate mention--email text-truncate">
{{ agent.email }}
</div>
</div>
</li>
</ul>
</template>
<script>
import { mapGetters } from 'vuex';
import MentionBox from '../mentions/MentionBox.vue';
import mentionSelectionKeyboardMixin from '../mentions/mentionSelectionKeyboardMixin';
export default {
components: { MentionBox },
mixins: [mentionSelectionKeyboardMixin],
props: {
searchKey: {
type: String,
default: '',
},
},
data() {
return { selectedIndex: 0 };
},
computed: {
...mapGetters({
agents: 'agents/getVerifiedAgents',
}),
...mapGetters({ agents: 'agents/getVerifiedAgents' }),
items() {
if (!this.searchKey) {
return this.agents.map(agent => ({
label: agent.name,
key: agent.id,
description: agent.email,
}));
return this.agents;
}
return this.agents
.filter(agent =>
agent.name
.toLocaleLowerCase()
.includes(this.searchKey.toLocaleLowerCase())
)
.map(agent => ({
label: agent.name,
key: agent.id,
description: agent.email,
}));
return this.agents.filter(agent =>
agent.name
.toLocaleLowerCase()
.includes(this.searchKey.toLocaleLowerCase())
);
},
},
watch: {
items(newListOfAgents) {
if (newListOfAgents.length < this.selectedIndex + 1) {
this.selectedIndex = 0;
}
},
},
methods: {
handleMentionClick(item = {}) {
this.$emit('click', item);
getTopSpacing() {
if (this.items.length <= 4) {
return -(this.items.length * 5 + 1.7);
}
return -20;
},
handleKeyboardEvent(e) {
this.processKeyDownEvent(e);
this.$el.scrollTop = 50 * this.selectedIndex;
},
onHover(index) {
this.selectedIndex = index;
},
onAgentSelect(index) {
this.selectedIndex = index;
this.onSelect();
},
onSelect() {
this.$emit('click', this.items[this.selectedIndex]);
},
},
};
</script>
<style scoped lang="scss">
.mention--box {
background: var(--white);
border-top: 1px solid var(--color-border);
font-size: var(--font-size-small);
left: 0;
line-height: 1.2;
max-height: 20rem;
overflow: auto;
padding: var(--space-small) var(--space-small) 0 var(--space-small);
position: absolute;
width: 100%;
z-index: 100;
&.with-bottom-border {
border-bottom: var(--space-small) solid var(--white);
li {
&:last-child {
margin-bottom: 0;
}
}
}
li {
align-items: center;
border-radius: var(--border-radius-normal);
display: flex;
padding: var(--space-small);
&.active {
background: var(--s-50);
.mention--user-name {
color: var(--s-900);
}
.mention--email {
color: var(--s-800);
}
}
&:last-child {
margin-bottom: var(--space-small);
}
}
}
.mention--thumbnail {
margin-right: var(--space-small);
}
.mention--user-name {
margin-bottom: 0;
}
.mention--email {
color: var(--s-700);
font-size: var(--font-size-mini);
}
.mention--metadata {
flex: 1;
max-width: 100%;
}
</style>

View file

@ -141,9 +141,19 @@ export default {
assignableAgentsUiFlags: 'inboxAssignableAgents/getUIFlags',
}),
assignableAgents() {
return this.$store.getters['inboxAssignableAgents/getAssignableAgents'](
this.inboxId
);
return [
{
confirmed: true,
name: 'None',
id: null,
role: 'agent',
account_id: 0,
email: 'None',
},
...this.$store.getters['inboxAssignableAgents/getAssignableAgents'](
this.inboxId
),
];
},
},
mounted() {

View file

@ -57,7 +57,7 @@
</li>
</ul>
<div v-else class="agent-confirmation-container">
<p>
<p v-if="selectedAgent.id">
{{
$t('BULK_ACTION.ASSIGN_CONFIRMATION_LABEL', {
conversationCount,
@ -67,6 +67,15 @@
<strong>
{{ selectedAgent.name }}
</strong>
<span>?</span>
</p>
<p v-else>
{{
$t('BULK_ACTION.UNASSIGN_CONFIRMATION_LABEL', {
conversationCount,
conversationLabel,
})
}}
</p>
<div class="agent-confirmation-actions">
<woot-button
@ -82,7 +91,7 @@
:is-loading="uiFlags.isUpdating"
@click="submit"
>
{{ $t('BULK_ACTION.ASSIGN_LABEL') }}
{{ $t('BULK_ACTION.YES') }}
</woot-button>
</div>
</div>
@ -131,7 +140,17 @@ export default {
agent.name.toLowerCase().includes(this.query.toLowerCase())
);
}
return this.assignableAgents;
return [
{
confirmed: true,
name: 'None',
id: null,
role: 'agent',
account_id: 0,
email: 'None',
},
...this.assignableAgents,
];
},
assignableAgents() {
return this.$store.getters['inboxAssignableAgents/getAssignableAgents'](

View file

@ -181,7 +181,7 @@ export default {
color: var(--y-700);
font-size: var(--font-size-mini);
margin-top: var(--space-small);
padding: var(--space-half) var(--space-one);
padding: var(--space-smaller) var(--space-small);
}
.popover-animation-enter-active,

View file

@ -20,7 +20,9 @@
</template>
<script>
import mentionSelectionKeyboardMixin from './mentionSelectionKeyboardMixin';
export default {
mixins: [mentionSelectionKeyboardMixin],
props: {
items: {
type: Array,
@ -39,56 +41,25 @@ export default {
}
},
},
mounted() {
document.addEventListener('keydown', this.keyListener);
},
beforeDestroy() {
document.removeEventListener('keydown', this.keyListener);
},
methods: {
getTopPadding() {
if (this.items.length <= 4) {
return -(this.items.length * 2.8 + 1.7);
return -(this.items.length * 2.9 + 1.7);
}
return -14;
},
isUp(e) {
return e.keyCode === 38 || (e.ctrlKey && e.keyCode === 80); // UP, Ctrl-P
},
isDown(e) {
return e.keyCode === 40 || (e.ctrlKey && e.keyCode === 78); // DOWN, Ctrl-N
},
isEnter(e) {
return e.keyCode === 13;
},
keyListener(e) {
if (this.isUp(e)) {
if (!this.selectedIndex) {
this.selectedIndex = this.items.length - 1;
} else {
this.selectedIndex -= 1;
}
}
if (this.isDown(e)) {
if (this.selectedIndex === this.items.length - 1) {
this.selectedIndex = 0;
} else {
this.selectedIndex += 1;
}
}
if (this.isEnter(e)) {
this.onMentionSelect();
}
this.$el.scrollTop = 28 * this.selectedIndex;
handleKeyboardEvent(e) {
this.processKeyDownEvent(e);
this.$el.scrollTop = 29 * this.selectedIndex;
},
onHover(index) {
this.selectedIndex = index;
},
onListItemSelection(index) {
this.selectedIndex = index;
this.onMentionSelect();
this.onSelect();
},
onMentionSelect() {
onSelect() {
this.$emit('mention-select', this.items[this.selectedIndex]);
},
},

View file

@ -0,0 +1,39 @@
import { buildHotKeys } from 'shared/helpers/KeyboardHelpers';
export default {
mounted() {
document.addEventListener('keydown', this.handleKeyboardEvent);
},
beforeDestroy() {
document.removeEventListener('keydown', this.handleKeyboardEvent);
},
methods: {
moveSelectionUp() {
if (!this.selectedIndex) {
this.selectedIndex = this.items.length - 1;
} else {
this.selectedIndex -= 1;
}
},
moveSelectionDown() {
if (this.selectedIndex === this.items.length - 1) {
this.selectedIndex = 0;
} else {
this.selectedIndex += 1;
}
},
processKeyDownEvent(e) {
const keyPattern = buildHotKeys(e);
if (['arrowup', 'ctrl+p'].includes(keyPattern)) {
this.moveSelectionUp();
e.preventDefault();
} else if (['arrowdown', 'ctrl+n'].includes(keyPattern)) {
this.moveSelectionDown();
e.preventDefault();
} else if (keyPattern === 'enter') {
this.onSelect();
e.preventDefault();
}
},
},
};

View file

@ -0,0 +1,64 @@
import mentionSelectionKeyboardMixin from '../mentionSelectionKeyboardMixin';
import { shallowMount } from '@vue/test-utils';
const buildComponent = ({ data = {}, methods = {} }) => ({
render() {},
data() {
return data;
},
methods,
mixins: [mentionSelectionKeyboardMixin],
});
describe('mentionSelectionKeyboardMixin', () => {
test('register listeners', () => {
jest.spyOn(document, 'addEventListener');
const Component = buildComponent({});
shallowMount(Component);
// undefined expected as the method is not defined in the component
expect(document.addEventListener).toHaveBeenCalledWith(
'keydown',
undefined
);
});
test('processKeyDownEvent updates index on arrow up', () => {
const Component = buildComponent({
data: { selectedIndex: 0, items: [1, 2, 3] },
});
const wrapper = shallowMount(Component);
wrapper.vm.processKeyDownEvent({
ctrlKey: true,
key: 'p',
preventDefault: jest.fn(),
});
expect(wrapper.vm.selectedIndex).toBe(2);
});
test('processKeyDownEvent updates index on arrow down', () => {
const Component = buildComponent({
data: { selectedIndex: 0, items: [1, 2, 3] },
});
const wrapper = shallowMount(Component);
wrapper.vm.processKeyDownEvent({
key: 'ArrowDown',
preventDefault: jest.fn(),
});
expect(wrapper.vm.selectedIndex).toBe(1);
});
test('processKeyDownEvent calls select methods on Enter Key', () => {
const onSelectMockFn = jest.fn();
const Component = buildComponent({
data: { selectedIndex: 0, items: [1, 2, 3] },
methods: { onSelect: () => onSelectMockFn('enterKey pressed') },
});
const wrapper = shallowMount(Component);
wrapper.vm.processKeyDownEvent({
key: 'Enter',
preventDefault: jest.fn(),
});
expect(onSelectMockFn).toHaveBeenCalledWith('enterKey pressed');
wrapper.vm.onSelect();
});
});

View file

@ -0,0 +1,13 @@
export const FEATURE_FLAGS = {
AGENT_BOTS: 'agent_bots',
AGENT_MANAGEMENT: 'agent_management',
AUTOMATIONS: 'automations',
CANNED_RESPONSES: 'canned_responses',
CUSTOM_ATTRIBUTES: 'custom_attributes',
INBOX_MANAGEMENT: 'inbox_management',
INTEGRATIONS: 'integrations',
LABELS: 'labels',
MACROS: 'macros',
TEAM_MANAGEMENT: 'team_management',
VOICE_RECORDER: 'voice_recorder',
};

View file

@ -6,7 +6,7 @@ export const frontendURL = (path, params) => {
};
const getSSOAccountPath = ({ ssoAccountId, user }) => {
const { accounts = [] } = user || {};
const { accounts = [], account_id = null } = user || {};
const ssoAccount = accounts.find(
account => account.id === Number(ssoAccountId)
);
@ -14,7 +14,9 @@ const getSSOAccountPath = ({ ssoAccountId, user }) => {
if (ssoAccount) {
accountPath = `accounts/${ssoAccountId}`;
} else if (accounts.length) {
accountPath = `accounts/${accounts[0].id}`;
// If the account id is not found, redirect to the first account
const accountId = account_id || accounts[0].id;
accountPath = `accounts/${accountId}`;
}
return accountPath;
};

View file

@ -1,6 +1,7 @@
export const LOCAL_STORAGE_KEYS = {
DISMISSED_UPDATES: 'dismissedUpdates',
WIDGET_BUILDER: 'widgetBubble_',
DRAFT_MESSAGES: 'draftMessages',
};
export const LocalStorage = {

View file

@ -3,6 +3,7 @@
"NOT_AVAILABLE": "غير متاح",
"EMAIL_ADDRESS": "عنوان البريد الإلكتروني",
"PHONE_NUMBER": "رقم الهاتف",
"IDENTIFIER": "المعرف",
"COPY_SUCCESSFUL": "تم النسخ إلى الحافظة بنجاح",
"COMPANY": "الشركة",
"LOCATION": "الموقع الجغرافي",

View file

@ -1,8 +1,9 @@
{
"CONVERSATION": {
"SELECT_A_CONVERSATION": "الرجاء اختيار محادثة من قائمة المحادثات",
"404": "Sorry, we cannot find the conversation. Please try again",
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"CSAT_REPLY_MESSAGE": "الرجاء تقييم المحادثة",
"404": "عذراً، لا يمكننا العثور على المحادثة. الرجاء المحاولة مرة أخرى",
"SWITCH_VIEW_LAYOUT": "تبديل التصميم",
"DASHBOARD_APP_TAB_MESSAGES": "الرسائل",
"UNVERIFIED_SESSION": "لم يتم التحقق من هوية هذا المستخدم",
"NO_MESSAGE_1": "لا توجد رسائل بعد من العملاء في صندوق الوارد الخاص بك.",
@ -62,30 +63,30 @@
},
"CARD_CONTEXT_MENU": {
"PENDING": "تحديد كمعلق",
"RESOLVED": "Mark as resolved",
"RESOLVED": "تحديد كمحلولة",
"REOPEN": "إعادة فتح المحادثة",
"SNOOZE": {
"TITLE": "Snooze",
"TITLE": "غفوة",
"NEXT_REPLY": "حتى الرد القادم",
"TOMORROW": "حتى الغد",
"NEXT_WEEK": "حتى الأسبوع القادم"
},
"ASSIGN_AGENT": "Assign agent",
"ASSIGN_LABEL": "Assign label",
"AGENTS_LOADING": "Loading agents...",
"ASSIGN_TEAM": "Assign team",
"ASSIGN_AGENT": "تعيين وكيل",
"ASSIGN_LABEL": "إضافة وسم",
"AGENTS_LOADING": "جاري تحميل الوكلاء...",
"ASSIGN_TEAM": "تعيين فريق",
"API": {
"AGENT_ASSIGNMENT": {
"SUCCESFUL": "Conversation id %{conversationId} assigned to \"%{agentName}\"",
"FAILED": "Couldn't assign agent. Please try again."
"SUCCESFUL": "معرف المحادثة %{conversationId} تم تعيينه ل \"%{agentName}\"",
"FAILED": "تعذر تعيين الوكيل. الرجاء المحاولة مرة أخرى."
},
"LABEL_ASSIGNMENT": {
"SUCCESFUL": "Assigned label #%{labelName} to conversation id %{conversationId}",
"FAILED": "Couldn't assign label. Please try again."
"SUCCESFUL": "تعيين تسمية #%{labelName} لمعرف المحادثة %{conversationId}",
"FAILED": "تعذر تعيين التسمية. الرجاء المحاولة مرة أخرى."
},
"TEAM_ASSIGNMENT": {
"SUCCESFUL": "Assigned team \"%{team}\" to conversation id %{conversationId}",
"FAILED": "Couldn't assign team. Please try again."
"SUCCESFUL": "الفريق المعين \"%{team}\" لمعرف المحادثة %{conversationId}",
"FAILED": "تعذر تعيين الفريق. الرجاء المحاولة مرة أخرى."
}
}
},
@ -110,7 +111,6 @@
"TIP_AUDIORECORDER_ICON": "تسجيل الصوت",
"TIP_AUDIORECORDER_PERMISSION": "السماح بالوصول إلى الصوت",
"TIP_AUDIORECORDER_ERROR": "تعذر فتح الصوت",
"ENTER_TO_SEND": "زر الإدخل للإرسال",
"DRAG_DROP": "اسحب و أسقط هنا للإرفاق",
"START_AUDIO_RECORDING": "بدء التسجيل الصوتي",
"STOP_AUDIO_RECORDING": "إيقاف التسجيل الصوتي",
@ -131,13 +131,13 @@
},
"VISIBLE_TO_AGENTS": "ملاحظة خاصة: مرئية فقط لأعضاء فريق العمل والموظفين",
"CHANGE_STATUS": "تم تغيير حالة المحادثة",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
"CHANGE_STATUS_FAILED": "فشل تغيير حالة المحادثة",
"CHANGE_AGENT": "تم تغيير الموظف الذي تم إحالة المحادثة إليه",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
"CHANGE_AGENT_FAILED": "فشل تغيير المحال إليه",
"ASSIGN_LABEL_SUCCESFUL": "تم تعيين الوسم بنجاح",
"ASSIGN_LABEL_FAILED": "فشل تعيين الوسم",
"CHANGE_TEAM": "تم تغيير فريق المحادثة",
"FILE_SIZE_LIMIT": "حجم الملف يتجاوز حد الاقصى وهو {MAXIMUM_FILE_UPLOAD_SIZE}",
"FILE_SIZE_LIMIT": "الملف يتجاوز حد المرفق {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} ميغابايت",
"MESSAGE_ERROR": "غير قادر على إرسال هذه الرسالة، الرجاء المحاولة مرة أخرى لاحقاً",
"SENT_BY": "أرسلت بواسطة:",
"BOT": "رد آلي",
@ -150,7 +150,8 @@
},
"CONTEXT_MENU": {
"COPY": "نسخ",
"DELETE": "حذف"
"DELETE": "حذف",
"CREATE_A_CANNED_RESPONSE": "إضافة إلى الردود السريعة"
}
},
"EMAIL_TRANSCRIPT": {

View file

@ -6,95 +6,98 @@
"SETTINGS_BUTTON": "الإعدادات",
"NEW_BUTTON": "مقالة جديدة",
"DROPDOWN_OPTIONS": {
"PUBLISHED": "Published",
"DRAFT": "Draft",
"ARCHIVED": "Archived"
"PUBLISHED": "نُشرت",
"DRAFT": "مسودة",
"ARCHIVED": "أرشفة"
},
"TITLES": {
"ALL_ARTICLES": "All Articles",
"MINE": "My Articles",
"DRAFT": "Draft Articles",
"ARCHIVED": "Archived Articles"
"ALL_ARTICLES": "جميع المقالات",
"MINE": "مقالاتي",
"DRAFT": "مقالات مسودة",
"ARCHIVED": "المقالات المؤرشفة"
}
},
"EDIT_HEADER": {
"ALL_ARTICLES": "All Articles",
"ALL_ARTICLES": "جميع المقالات",
"PUBLISH_BUTTON": "نشر",
"MOVE_TO_ARCHIVE_BUTTON": "نقل إلى الأرشيف",
"PREVIEW": "معاينة",
"ADD_TRANSLATION": "إضافة ترجمة",
"OPEN_SIDEBAR": "فتح الشريط الجانبي",
"CLOSE_SIDEBAR": "إغلاق الشريط الجانبي",
"SAVING": "Saving...",
"SAVED": "Saved"
"SAVING": "جاري الحفظ...",
"SAVED": "تم الحفظ"
},
"ARTICLE_SETTINGS": {
"TITLE": "Article Settings",
"TITLE": "إعدادات المقالة",
"FORM": {
"CATEGORY": {
"LABEL": "الفئة",
"TITLE": "Select category",
"PLACEHOLDER": "Select category",
"NO_RESULT": "No category found",
"SEARCH_PLACEHOLDER": "Search category"
"TITLE": "اختر الفئة",
"PLACEHOLDER": "اختر الفئة",
"NO_RESULT": "لم يتم العثور على فئة",
"SEARCH_PLACEHOLDER": "البحث عن فئة"
},
"AUTHOR": {
"LABEL": "Author",
"TITLE": "Select author",
"PLACEHOLDER": "Select author",
"NO_RESULT": "No authors found",
"SEARCH_PLACEHOLDER": "Search author"
"LABEL": "المؤلف",
"TITLE": "اختر المؤلف",
"PLACEHOLDER": "اختر المؤلف",
"NO_RESULT": "لم يتم العثور على مؤلفين",
"SEARCH_PLACEHOLDER": "البحث عن المؤلف"
},
"META_TITLE": {
"LABEL": "Meta title",
"PLACEHOLDER": "Add a meta title"
"LABEL": "العنوان الوصفي",
"PLACEHOLDER": "اضافة عنوان وصفي"
},
"META_DESCRIPTION": {
"LABEL": "Meta description",
"PLACEHOLDER": "Add your meta description for better SEO results..."
"LABEL": "وصف التعريف",
"PLACEHOLDER": "أضف وصفك للحصول على أفضل نتائج SEO..."
},
"META_TAGS": {
"LABEL": "Meta tags",
"PLACEHOLDER": "Add meta tags separated by comma..."
"LABEL": "علامات الوصف",
"PLACEHOLDER": "إضافة وسوم ميتا مفصولة بفاصلة..."
}
},
"BUTTONS": {
"ARCHIVE": "Archive article",
"DELETE": "Delete article"
"ARCHIVE": "المقالات المؤرشفة",
"DELETE": "حذف المقال"
}
},
"PORTAL": {
"HEADER": "Portals",
"NEW_BUTTON": "New Portal",
"HEADER": "الصفحات",
"DEFAULT": "افتراضي",
"NEW_BUTTON": "بوابة جديدة",
"ACTIVE_BADGE": "مفعل",
"CHOOSE_LOCALE_LABEL": "Choose a locale",
"LOADING_MESSAGE": "Loading portals...",
"ARTICLES_LABEL": "articles",
"NO_PORTALS_MESSAGE": "There are no available portals",
"ADD_NEW_LOCALE": "Add a new locale",
"CHOOSE_LOCALE_LABEL": "اختر لغة محلية",
"LOADING_MESSAGE": "جاري تحميل البوابات ...",
"ARTICLES_LABEL": "المقالات",
"NO_PORTALS_MESSAGE": "لا توجد بوابات متاحة",
"ADD_NEW_LOCALE": "إضافة لغة جديدة",
"POPOVER": {
"TITLE": "Portals",
"PORTAL_SETTINGS": "Portal settings",
"SUBTITLE": "You have multiple portals and can have different locales for each portal.",
"TITLE": "الصفحات",
"PORTAL_SETTINGS": "إعدادات البوابة",
"SUBTITLE": "لديك بوابات متعددة ويمكن أن تحتوي على مواقع مختلفة لكل بوابة.",
"CANCEL_BUTTON_LABEL": "إلغاء",
"CHOOSE_LOCALE_BUTTON": "Choose Locale"
"CHOOSE_LOCALE_BUTTON": "اختر لغة محلية"
},
"PORTAL_SETTINGS": {
"LIST_ITEM": {
"HEADER": {
"COUNT_LABEL": "articles",
"ADD": "Add locale",
"VISIT": "Visit site",
"SETTINGS": "الإعدادات"
"COUNT_LABEL": "المقالات",
"ADD": "إضافة لغة",
"VISIT": "زيارة الموقع",
"SETTINGS": "الإعدادات",
"DELETE": "حذف"
},
"PORTAL_CONFIG": {
"TITLE": "Portal Configurations",
"TITLE": "اعدادات البوابة",
"ITEMS": {
"NAME": "الاسم",
"DOMAIN": "Custom domain",
"SLUG": "Slug",
"TITLE": "Portal title",
"THEME": "Theme color",
"SUB_TEXT": "Portal sub text"
"DOMAIN": "نطاق مخصص",
"SLUG": "وصف مختصر",
"TITLE": "عنوان البوابة",
"THEME": "لون القالب",
"SUB_TEXT": "النص الفرعي للبوابة"
}
},
"AVAILABLE_LOCALES": {
@ -106,9 +109,54 @@
"CATEGORIES": "No. of categories",
"SWAP": "Swap",
"DELETE": "حذف",
"DEFAULT_LOCALE": "Default"
"DEFAULT_LOCALE": "افتراضي"
}
}
},
"DELETE_PORTAL": {
"TITLE": "Delete portal",
"MESSAGE": "Are you sure you want to delete this portal",
"YES": "Yes, delete portal",
"NO": "No, keep portal",
"API": {
"DELETE_SUCCESS": "Portal deleted successfully",
"DELETE_ERROR": "Error while deleting portal"
}
}
},
"EDIT": {
"HEADER_TEXT": "Edit portal",
"TABS": {
"BASIC_SETTINGS": {
"TITLE": "Basic information"
},
"CUSTOMIZATION_SETTINGS": {
"TITLE": "Portal customization"
},
"CATEGORY_SETTINGS": {
"TITLE": "Categories"
},
"LOCALE_SETTINGS": {
"TITLE": "Locales"
}
},
"CATEGORIES": {
"TITLE": "Categories in",
"NEW_CATEGORY": "New category",
"TABLE": {
"NAME": "الاسم",
"DESCRIPTION": "الوصف",
"LOCALE": "Locale",
"ARTICLE_COUNT": "No. of articles",
"ACTION_BUTTON": {
"EDIT": "Edit category",
"DELETE": "Delete category"
},
"EMPTY_TEXT": "لم يتم العثور على فئات"
}
},
"EDIT_BASIC_INFO": {
"BUTTON_TEXT": "Update basic settings"
}
},
"ADD": {
@ -158,74 +206,131 @@
"NAME": {
"LABEL": "الاسم",
"PLACEHOLDER": "Portal name",
"HELP_TEXT": "The name will be used in the public facing portal internally.",
"HELP_TEXT": "الاسم سيتم مشاهدتة من جميع من جميع زوار الصفحة.",
"ERROR": "الاسم مطلوب"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Portal slug for urls",
"ERROR": "Slug is required"
"LABEL": "وصف مختصر",
"PLACEHOLDER": "وصف مختصر لرابط البوابة",
"ERROR": "الوصف مطلوب"
},
"DOMAIN": {
"LABEL": "Custom Domain",
"PLACEHOLDER": "Portal custom domain",
"HELP_TEXT": "Add only If you want to use a custom domain for your portals.",
"ERROR": "Custom Domain is required"
"LABEL": "نطاق مخصص",
"PLACEHOLDER": "نطاق البوابة المخصص",
"HELP_TEXT": "أضف فقط إذا كنت ترغب في استخدام نطاق مخصص للبوابات الخاصة بك.",
"ERROR": "النطاق المخصص مطلوب"
},
"HOME_PAGE_LINK": {
"LABEL": "Home Page Link",
"PLACEHOLDER": "Portal home page link",
"HELP_TEXT": "The link used to return from the portal to the home page.",
"ERROR": "Home Page Link is required"
"LABEL": "رابط الصفحة الرئيسية",
"PLACEHOLDER": "رابط الصفحة الرئيسية للبوابة",
"HELP_TEXT": "الرابط المستخدم للعودة من البوابة إلى الصفحة الرئيسية.",
"ERROR": "رابط الصفحة الرئيسية مطلوب"
},
"THEME_COLOR": {
"LABEL": "Portal theme color",
"HELP_TEXT": "This color will show as the theme color for the portal."
"LABEL": "لون قالب البوابة",
"HELP_TEXT": "هذا اللون سيظهر كلون للبوابة."
},
"PAGE_TITLE": {
"LABEL": "Page Title",
"PLACEHOLDER": "Portal page title",
"HELP_TEXT": "The page title will be used in the public facing portal.",
"ERROR": "Page title is required"
"LABEL": "عنوان الصفحة",
"PLACEHOLDER": "عنوان البوابة",
"HELP_TEXT": "سيتم استخدام عنوان الصفحة في البوابة التي تواجه الجمهور.",
"ERROR": "العنوان مطلوب"
},
"HEADER_TEXT": {
"LABEL": "Header Text",
"PLACEHOLDER": "Portal header text",
"HELP_TEXT": "The Portal header text will be used in the public facing portal.",
"ERROR": "Portal header text is required"
"LABEL": "نص رأس الصفحة",
"PLACEHOLDER": "نص رأس البوابة",
"HELP_TEXT": "سيتم استخدام عنوان الصفحة في البوابة التي تواجه الجمهور.",
"ERROR": "نص رأس البوابة مطلوب"
},
"API": {
"ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
"ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
"SUCCESS_MESSAGE_FOR_BASIC": "تم إنشاء البوابة بنجاح.",
"ERROR_MESSAGE_FOR_BASIC": "تعذر إنشاء البوابة. حاول مرة أخرى.",
"SUCCESS_MESSAGE_FOR_UPDATE": "تم تحديث البوابة بنجاح.",
"ERROR_MESSAGE_FOR_UPDATE": "تعذر تحديث البوابة. حاول مرة أخرى."
}
},
"ADD_LOCALE": {
"TITLE": "إضافة لغة جديدة",
"SUB_TITLE": "هذا يضيف لغة جديدة إلى قائمة الترجمة المتاحة لديك.",
"PORTAL": "البوابة",
"LOCALE": {
"LABEL": "اللغة",
"PLACEHOLDER": "اختر لغة محلية",
"ERROR": "اللغة مطلوبة"
},
"BUTTONS": {
"CREATE": "إنشاء لغة",
"CANCEL": "إلغاء"
},
"API": {
"SUCCESS_MESSAGE": "تمت إضافة اللغة بنجاح",
"ERROR_MESSAGE": "غير قادر على إضافة اللغة . حاول مرة أخرى."
}
},
"CHANGE_DEFAULT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "تم تحديث اللغة الغة الإفتراضية بنجاح",
"ERROR_MESSAGE": "غير قادر على تحديث اللغة الافتراضية. حاول مرة أخرى."
}
},
"DELETE_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "تم إزالة اللغة من البوابة بنجاح",
"ERROR_MESSAGE": "غير قادر على إزالة اللغة من البوابة. حاول مرة أخرى."
}
}
},
"TABLE": {
"LOADING_MESSAGE": "Loading articles...",
"404": "No articles matches your search 🔍",
"NO_ARTICLES": "There are no available articles",
"LOADING_MESSAGE": "جاري تحميل المقالات...",
"404": "لا توجد مقالات تطابق بحثك 🔍",
"NO_ARTICLES": "لا توجد مقالات متوفرة",
"HEADERS": {
"TITLE": "العنوان",
"CATEGORY": "الفئة",
"READ_COUNT": "Read count",
"READ_COUNT": "عدد القراءات",
"STATUS": "الحالة",
"LAST_EDITED": "Last edited"
"LAST_EDITED": "آخر تعديل"
},
"COLUMNS": {
"BY": "بواسطة"
}
},
"EDIT_ARTICLE": {
"LOADING": "Loading article...",
"TITLE_PLACEHOLDER": "Article title goes here",
"CONTENT_PLACEHOLDER": "Write your article here",
"LOADING": "جاري تحميل المقالات...",
"TITLE_PLACEHOLDER": "عنوان المقالة يذهب هنا",
"CONTENT_PLACEHOLDER": "اكتب مقالك هنا",
"API": {
"ERROR": "Error while saving article"
"ERROR": "حدث خطأ أثناء حفظ المقالة"
}
},
"PUBLISH_ARTICLE": {
"API": {
"ERROR": "حدث خطأ أثناء نشر المقالة",
"SUCCESS": "تم نشر المقالة بنجاح"
}
},
"ARCHIVE_ARTICLE": {
"API": {
"ERROR": "حدث خطأ أثناء نشر المقالة",
"SUCCESS": "تم أرشفة المقالة بنجاح"
}
},
"DELETE_ARTICLE": {
"MODAL": {
"CONFIRM": {
"TITLE": "تأكيد الحذف",
"MESSAGE": "Are you sure to delete the article?",
"YES": "نعم، احذف",
"NO": "لا، احتفظ به"
}
},
"API": {
"SUCCESS_MESSAGE": "Article deleted successfully",
"ERROR_MESSAGE": "Error while deleting article"
}
},
"CREATE_ARTICLE": {
"ERROR_MESSAGE": "Something went wrong. Please try again."
"ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
},
"SIDEBAR": {
"SEARCH": {
@ -263,6 +368,43 @@
"SUCCESS_MESSAGE": "Category created successfully",
"ERROR_MESSAGE": "Unable to create category"
}
},
"EDIT": {
"TITLE": "Edit a category",
"SUB_TITLE": "Editing a category will update the category in the public facing portal.",
"PORTAL": "Portal",
"LOCALE": "Locale",
"NAME": {
"LABEL": "الاسم",
"PLACEHOLDER": "Category name",
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
"ERROR": "الاسم مطلوب"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Category slug for urls",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
"ERROR": "Slug is required"
},
"DESCRIPTION": {
"LABEL": "الوصف",
"PLACEHOLDER": "Give a short description about the category.",
"ERROR": "الوصف مطلوب"
},
"BUTTONS": {
"CREATE": "Update category",
"CANCEL": "إلغاء"
},
"API": {
"SUCCESS_MESSAGE": "Category updated successfully",
"ERROR_MESSAGE": "Unable to update category"
}
},
"DELETE": {
"API": {
"SUCCESS_MESSAGE": "Category deleted successfully",
"ERROR_MESSAGE": "Unable to delete category"
}
}
}
}

View file

@ -414,7 +414,7 @@
"CAMPAIGN": "الحملات",
"PRE_CHAT_FORM": "نموذج ما قبل الدردشة",
"BUSINESS_HOURS": "ساعات العمل",
"WIDGET_BUILDER": "Widget Builder"
"WIDGET_BUILDER": "منشئ اللايف شات"
},
"SETTINGS": "الإعدادات",
"FEATURES": {
@ -579,10 +579,10 @@
"WIDGET_BUILDER": {
"WIDGET_OPTIONS": {
"AVATAR": {
"LABEL": "Website Avatar",
"LABEL": "صورة الموقع",
"DELETE": {
"API": {
"SUCCESS_MESSAGE": "Avatar deleted successfully",
"SUCCESS_MESSAGE": "الصورة الرمزية حذفت بنجاح",
"ERROR_MESSAGE": "حدث خطأ، الرجاء المحاولة مرة أخرى"
}
}
@ -590,53 +590,53 @@
"WEBSITE_NAME": {
"LABEL": "اسم الموقع",
"PLACE_HOLDER": "أدخل اسم موقع الويب الخاص بك (مثال: Acme Inc)",
"ERROR": "Please enter a valid website name"
"ERROR": "الرجاء إدخال اسم موقع صالح"
},
"WELCOME_HEADING": {
"LABEL": "العنوان الترحيبي",
"PLACE_HOLDER": "Hi there!"
"PLACE_HOLDER": "مرحبا بك!"
},
"WELCOME_TAGLINE": {
"LABEL": "افتتاحية الترحيب",
"PLACE_HOLDER": "نحن نجعل من السهل عليك التواصل معنا. اسألنا أي شيء، أو قم بمشاركتنا ملاحظاتك."
},
"REPLY_TIME": {
"LABEL": "Reply Time",
"LABEL": "وقت الرد",
"IN_A_FEW_MINUTES": "في غضون دقائق قليلة",
"IN_A_FEW_HOURS": "في غضون ساعات قليلة",
"IN_A_DAY": "خلال يوم"
},
"WIDGET_COLOR_LABEL": "لون صندوق الدردشة",
"WIDGET_BUBBLE_POSITION_LABEL": "Widget Bubble Position",
"WIDGET_BUBBLE_TYPE_LABEL": "Widget Bubble Type",
"WIDGET_BUBBLE_POSITION_LABEL": "موقع شعار اللايف شات",
"WIDGET_BUBBLE_TYPE_LABEL": "شكل عرض اللايف شات",
"WIDGET_BUBBLE_LAUNCHER_TITLE": {
"DEFAULT": "تحدث الينا",
"LABEL": "Widget Bubble Launcher Title",
"LABEL": "عنوان ايقونة اللايف شات",
"PLACE_HOLDER": "تحدث الينا"
},
"UPDATE": {
"BUTTON_TEXT": "Update Widget Settings",
"BUTTON_TEXT": "تحديث إعدادات اللايف شات",
"API": {
"SUCCESS_MESSAGE": "Widget settings updated successfully",
"ERROR_MESSAGE": "Unable to update widget settings"
"SUCCESS_MESSAGE": "تم تحديث إعدادت اللايف شات بنجاح",
"ERROR_MESSAGE": "غير قادر على تحديث إعدادات اللايف شات"
}
},
"WIDGET_VIEW_OPTION": {
"PREVIEW": "معاينة",
"SCRIPT": "Script"
"SCRIPT": "النص"
},
"WIDGET_BUBBLE_POSITION": {
"LEFT": "Left",
"RIGHT": "Right"
"LEFT": "يسار",
"RIGHT": "يمين"
},
"WIDGET_BUBBLE_TYPE": {
"STANDARD": "Standard",
"EXPANDED_BUBBLE": "Expanded Bubble"
"STANDARD": "عادي",
"EXPANDED_BUBBLE": "ايقونت اللايف شات العرضية"
}
},
"WIDGET_SCREEN": {
"DEFAULT": "Default",
"CHAT": "Chat"
"DEFAULT": "افتراضي",
"CHAT": "محادثة"
},
"REPLY_TIME": {
"IN_A_FEW_MINUTES": "عادة نقوم بالرد خلال بضع دقائق",
@ -649,11 +649,11 @@
},
"BODY": {
"TEAM_AVAILABILITY": {
"ONLINE": "We are Online",
"ONLINE": "متواجدون لخدمتك",
"OFFLINE": "نحن بعيدون في الوقت الحالي"
},
"USER_MESSAGE": "Hi",
"AGENT_MESSAGE": "Hello"
"USER_MESSAGE": "مرحبا",
"AGENT_MESSAGE": "مرحبا"
},
"BRANDING_TEXT": "مدعوم بواسطة Chatwoot",
"SCRIPT_SETTINGS": "\n window.chatwootSettings = {options};"

View file

@ -19,6 +19,21 @@
"TITLE": "الملف الشخصي",
"NOTE": "عنوان بريدك الإلكتروني هو المعرف الخاص بك الذي ستستخدمه لتسجيل الدخول."
},
"SEND_MESSAGE": {
"TITLE": "المفتاح الرئيسي لإرسال الرسائل",
"NOTE": "يمكنك تحديد مفتاح سريع (إما Enter أو Cmd/Ctrl+Enter) استنادًا إلى تفضيلك للكتابة.",
"UPDATE_SUCCESS": "تم تحديث الإعدادات الخاصة بك بنجاح",
"CARD": {
"ENTER_KEY": {
"HEADING": "Enter (↵)",
"CONTENT": "إرسال الرسائل بالضغط على مفتاح الإدخال بدلاً من النقر على زر الإرسال."
},
"CMD_ENTER_KEY": {
"HEADING": "Cmd/Ctrl + Enter (<unk> + <unk> )",
"CONTENT": "إرسال الرسائل بالضغط على Cmd/Ctrl + إدخال المفتاح بدلاً من النقر على زر الإرسال."
}
}
},
"MESSAGE_SIGNATURE_SECTION": {
"TITLE": "توقيع الرسالة الشخصية",
"NOTE": "إنشاء توقيع رسالة شخصية يتم إضافتها إلى جميع الرسائل التي ترسلها من المنصة. استخدم محرر المحتوى الغني لإنشاء توقيع شديد التخصيص.",
@ -126,8 +141,8 @@
"TRAIL_BUTTON": "اشترك الآن",
"DELETED_USER": "حذف المستخدم",
"ACCOUNT_SUSPENDED": {
"TITLE": "Account Suspended",
"MESSAGE": "Your account is suspended. Please reach out to the support team for more information."
"TITLE": "تم تعليق الحساب",
"MESSAGE": "تم تعليق حسابك. يرجى الاتصال بفريق الدعم للمزيد من المعلومات."
}
},
"COMPONENTS": {
@ -175,7 +190,7 @@
"CUSTOM_ATTRIBUTES": "سمات مخصصة",
"AUTOMATION": "الأتمتة",
"TEAMS": "الفرق",
"BILLING": "Billing",
"BILLING": "الفواتير",
"CUSTOM_VIEWS_FOLDER": "المجلدات",
"CUSTOM_VIEWS_SEGMENTS": "الأجزاء",
"ALL_CONTACTS": "جميع جهات الاتصال",
@ -197,32 +212,33 @@
"REPORTS_OVERVIEW": "نظرة عامة",
"FACEBOOK_REAUTHORIZE": "انتهت صلاحية اتصال الفيسبوك الخاص بك، يرجى إعادة الاتصال بصفحة الفيسبوك الخاصة بك لمواصلة الخدمات",
"HELP_CENTER": {
"ALL_ARTICLES": "All Articles",
"MY_ARTICLES": "My Articles",
"DRAFT": "Draft",
"ARCHIVED": "Archived",
"TITLE": "مركز المساعدة (نسخة تجريبية)",
"ALL_ARTICLES": "جميع المقالات",
"MY_ARTICLES": "مقالاتي",
"DRAFT": "مسودة",
"ARCHIVED": "مؤرشفة",
"CATEGORY": "الفئة",
"CATEGORY_EMPTY_MESSAGE": "No categories found"
"CATEGORY_EMPTY_MESSAGE": "لم يتم العثور على فئات"
},
"DOCS": "Read docs"
"DOCS": "قراءة المستندات"
},
"BILLING_SETTINGS": {
"TITLE": "Billing",
"TITLE": "الفواتير",
"CURRENT_PLAN": {
"TITLE": "Current Plan",
"PLAN_NOTE": "You are currently subscribed to the **%{plan}** plan with **%{quantity}** licenses"
"TITLE": "الباقة الحالية",
"PLAN_NOTE": "أنت مشترك حاليا في باقة**%{plan}** مع تراخيص **%{quantity}**"
},
"MANAGE_SUBSCRIPTION": {
"TITLE": "Manage your subscription",
"DESCRIPTION": "View your previous invoices, edit your billing details, or cancel your subscription.",
"BUTTON_TXT": "Go to the billing portal"
"TITLE": "إدارة الاشتراك الخاص بك",
"DESCRIPTION": "عرض فواتيرك السابقة، تحرير تفاصيل الفوترة الخاصة بك، أو إلغاء اشتراكك.",
"BUTTON_TXT": "الذهاب إلى بوابة الفوترة"
},
"CHAT_WITH_US": {
"TITLE": "Need help?",
"DESCRIPTION": "Do you face any issues in billing? We are here to help.",
"TITLE": "تحتاج مساعدة؟",
"DESCRIPTION": "هل تواجه أي مشاكل في الفواتير؟ نحن هنا للمساعدة.",
"BUTTON_TXT": "تحدث الينا"
},
"NO_BILLING_USER": "Your billing account is being configured. Please refresh the page and try again."
"NO_BILLING_USER": "حساب الفوترة الخاص بك قيد الإعداد. الرجاء تحديث الصفحة وحاول مرة أخرى."
},
"CREATE_ACCOUNT": {
"NO_ACCOUNT_WARNING": "أوه! لم نتمكن من العثور على الحساب. الرجاء إنشاء حساب جديد للمتابعة.",
@ -256,7 +272,6 @@
"GO_TO_SETTINGS": "انتقل إلى الإعدادات",
"SWITCH_CONVERSATION_STATUS": "التبديل إلى حالة المحادثة التالية",
"SWITCH_TO_PRIVATE_NOTE": "التبديل إلى الملاحظة الخاصة",
"TOGGLE_RICH_CONTENT_EDITOR": "تبديل محرر المحتوى المتقدم",
"SWITCH_TO_REPLY": "التبديل إلى الرد",
"TOGGLE_SNOOZE_DROPDOWN": "تبديل القائمة المنسدلة"
},

View file

@ -3,6 +3,7 @@
"NOT_AVAILABLE": "Не е наличен",
"EMAIL_ADDRESS": "Имейл адрес",
"PHONE_NUMBER": "Телефон",
"IDENTIFIER": "Идентификатор",
"COPY_SUCCESSFUL": "Успешно копиране в клипборда",
"COMPANY": "Фирма",
"LOCATION": "Локация",

View file

@ -1,6 +1,7 @@
{
"CONVERSATION": {
"SELECT_A_CONVERSATION": "Please select a conversation from left pane",
"CSAT_REPLY_MESSAGE": "Please rate the conversation",
"404": "Sorry, we cannot find the conversation. Please try again",
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
@ -110,7 +111,6 @@
"TIP_AUDIORECORDER_ICON": "Record audio",
"TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
"TIP_AUDIORECORDER_ERROR": "Could not open the audio",
"ENTER_TO_SEND": "Enter to send",
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@ -137,7 +137,7 @@
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
"CHANGE_TEAM": "Conversation team changed",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
"MESSAGE_ERROR": "Unable to send this message, please try again later",
"SENT_BY": "Sent by:",
"BOT": "Бот",
@ -150,7 +150,8 @@
},
"CONTEXT_MENU": {
"COPY": "Copy",
"DELETE": "Изтрий"
"DELETE": "Изтрий",
"CREATE_A_CANNED_RESPONSE": "Add to canned responses"
}
},
"EMAIL_TRANSCRIPT": {

View file

@ -20,6 +20,7 @@
"EDIT_HEADER": {
"ALL_ARTICLES": "All Articles",
"PUBLISH_BUTTON": "Publish",
"MOVE_TO_ARCHIVE_BUTTON": "Move to archived",
"PREVIEW": "Preview",
"ADD_TRANSLATION": "Add translation",
"OPEN_SIDEBAR": "Open sidebar",
@ -64,6 +65,7 @@
},
"PORTAL": {
"HEADER": "Portals",
"DEFAULT": "Default",
"NEW_BUTTON": "New Portal",
"ACTIVE_BADGE": "активен",
"CHOOSE_LOCALE_LABEL": "Choose a locale",
@ -84,7 +86,8 @@
"COUNT_LABEL": "articles",
"ADD": "Add locale",
"VISIT": "Visit site",
"SETTINGS": "Settings"
"SETTINGS": "Settings",
"DELETE": "Изтрий"
},
"PORTAL_CONFIG": {
"TITLE": "Portal Configurations",
@ -109,6 +112,51 @@
"DEFAULT_LOCALE": "Default"
}
}
},
"DELETE_PORTAL": {
"TITLE": "Delete portal",
"MESSAGE": "Are you sure you want to delete this portal",
"YES": "Yes, delete portal",
"NO": "No, keep portal",
"API": {
"DELETE_SUCCESS": "Portal deleted successfully",
"DELETE_ERROR": "Error while deleting portal"
}
}
},
"EDIT": {
"HEADER_TEXT": "Edit portal",
"TABS": {
"BASIC_SETTINGS": {
"TITLE": "Basic information"
},
"CUSTOMIZATION_SETTINGS": {
"TITLE": "Portal customization"
},
"CATEGORY_SETTINGS": {
"TITLE": "Categories"
},
"LOCALE_SETTINGS": {
"TITLE": "Locales"
}
},
"CATEGORIES": {
"TITLE": "Categories in",
"NEW_CATEGORY": "New category",
"TABLE": {
"NAME": "Име",
"DESCRIPTION": "Описание",
"LOCALE": "Locale",
"ARTICLE_COUNT": "No. of articles",
"ACTION_BUTTON": {
"EDIT": "Edit category",
"DELETE": "Delete category"
},
"EMPTY_TEXT": "No categories found"
}
},
"EDIT_BASIC_INFO": {
"BUTTON_TEXT": "Update basic settings"
}
},
"ADD": {
@ -164,7 +212,6 @@
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Portal slug for urls",
"ERROR": "Slug is required"
},
"DOMAIN": {
@ -196,9 +243,41 @@
"ERROR": "Portal header text is required"
},
"API": {
"SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.",
"ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.",
"ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
}
},
"ADD_LOCALE": {
"TITLE": "Add a new locale",
"SUB_TITLE": "This adds a new locale to your available translation list.",
"PORTAL": "Portal",
"LOCALE": {
"LABEL": "Locale",
"PLACEHOLDER": "Choose a locale",
"ERROR": "Locale is required"
},
"BUTTONS": {
"CREATE": "Create locale",
"CANCEL": "Отмени"
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
}
},
"CHANGE_DEFAULT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Default locale updated successfully",
"ERROR_MESSAGE": "Unable to update default locale. Try again."
}
},
"DELETE_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
}
},
"TABLE": {
@ -224,8 +303,34 @@
"ERROR": "Error while saving article"
}
},
"PUBLISH_ARTICLE": {
"API": {
"ERROR": "Error while publishing article",
"SUCCESS": "Article publishied successfully"
}
},
"ARCHIVE_ARTICLE": {
"API": {
"ERROR": "Error while archiving article",
"SUCCESS": "Article archived successfully"
}
},
"DELETE_ARTICLE": {
"MODAL": {
"CONFIRM": {
"TITLE": "Потвърди изтриването",
"MESSAGE": "Are you sure to delete the article?",
"YES": "Да, изтрий",
"NO": "No, Keep it"
}
},
"API": {
"SUCCESS_MESSAGE": "Article deleted successfully",
"ERROR_MESSAGE": "Error while deleting article"
}
},
"CREATE_ARTICLE": {
"ERROR_MESSAGE": "Something went wrong. Please try again."
"ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
},
"SIDEBAR": {
"SEARCH": {
@ -263,6 +368,43 @@
"SUCCESS_MESSAGE": "Category created successfully",
"ERROR_MESSAGE": "Unable to create category"
}
},
"EDIT": {
"TITLE": "Edit a category",
"SUB_TITLE": "Editing a category will update the category in the public facing portal.",
"PORTAL": "Portal",
"LOCALE": "Locale",
"NAME": {
"LABEL": "Име",
"PLACEHOLDER": "Category name",
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
"ERROR": "Name is required"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Category slug for urls",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
"ERROR": "Slug is required"
},
"DESCRIPTION": {
"LABEL": "Описание",
"PLACEHOLDER": "Give a short description about the category.",
"ERROR": "Description is required"
},
"BUTTONS": {
"CREATE": "Update category",
"CANCEL": "Отмени"
},
"API": {
"SUCCESS_MESSAGE": "Category updated successfully",
"ERROR_MESSAGE": "Unable to update category"
}
},
"DELETE": {
"API": {
"SUCCESS_MESSAGE": "Category deleted successfully",
"ERROR_MESSAGE": "Unable to delete category"
}
}
}
}

View file

@ -19,6 +19,21 @@
"TITLE": "Profile",
"NOTE": "Your email address is your identity and is used to log in."
},
"SEND_MESSAGE": {
"TITLE": "Hotkey to send messages",
"NOTE": "You can select a hotkey (either Enter or Cmd/Ctrl+Enter) based on your preference of writing.",
"UPDATE_SUCCESS": "Your settings have been updated successfully",
"CARD": {
"ENTER_KEY": {
"HEADING": "Enter (↵)",
"CONTENT": "Send messages by pressing Enter key instead of clicking the send button."
},
"CMD_ENTER_KEY": {
"HEADING": "Cmd/Ctrl + Enter (⌘ + ↵)",
"CONTENT": "Send messages by pressing Cmd/Ctrl + enter key instead of clicking the send button."
}
}
},
"MESSAGE_SIGNATURE_SECTION": {
"TITLE": "Personal message signature",
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
@ -197,6 +212,7 @@
"REPORTS_OVERVIEW": "Overview",
"FACEBOOK_REAUTHORIZE": "Your Facebook connection has expired, please reconnect your Facebook page to continue services",
"HELP_CENTER": {
"TITLE": "Help Center (Beta)",
"ALL_ARTICLES": "All Articles",
"MY_ARTICLES": "My Articles",
"DRAFT": "Draft",
@ -256,7 +272,6 @@
"GO_TO_SETTINGS": "Go to Settings",
"SWITCH_CONVERSATION_STATUS": "Switch to the next conversation status",
"SWITCH_TO_PRIVATE_NOTE": "Switch to Private Note",
"TOGGLE_RICH_CONTENT_EDITOR": "Toggle Rich Content editor",
"SWITCH_TO_REPLY": "Switch to Reply",
"TOGGLE_SNOOZE_DROPDOWN": "Toggle snooze dropdown"
},

View file

@ -3,6 +3,7 @@
"NOT_AVAILABLE": "No disponible",
"EMAIL_ADDRESS": "Adreça de correu electrònic",
"PHONE_NUMBER": "Número de telèfon",
"IDENTIFIER": "Identifier",
"COPY_SUCCESSFUL": "S'ha copiat al porta-retalls amb èxit",
"COMPANY": "Companyia",
"LOCATION": "Ubicació",

View file

@ -1,6 +1,7 @@
{
"CONVERSATION": {
"SELECT_A_CONVERSATION": "Si us plau, selecciona una conversa al panell de lesquerra",
"CSAT_REPLY_MESSAGE": "Please rate the conversation",
"404": "Sorry, we cannot find the conversation. Please try again",
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
@ -110,7 +111,6 @@
"TIP_AUDIORECORDER_ICON": "Record audio",
"TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
"TIP_AUDIORECORDER_ERROR": "Could not open the audio",
"ENTER_TO_SEND": "Intro per enviar",
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
@ -137,7 +137,7 @@
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
"CHANGE_TEAM": "Conversation team changed",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
"MESSAGE_ERROR": "Unable to send this message, please try again later",
"SENT_BY": "Enviat per:",
"BOT": "Bot",
@ -150,7 +150,8 @@
},
"CONTEXT_MENU": {
"COPY": "Copia",
"DELETE": "Esborrar"
"DELETE": "Esborrar",
"CREATE_A_CANNED_RESPONSE": "Add to canned responses"
}
},
"EMAIL_TRANSCRIPT": {

View file

@ -20,6 +20,7 @@
"EDIT_HEADER": {
"ALL_ARTICLES": "All Articles",
"PUBLISH_BUTTON": "Publish",
"MOVE_TO_ARCHIVE_BUTTON": "Move to archived",
"PREVIEW": "Preview",
"ADD_TRANSLATION": "Add translation",
"OPEN_SIDEBAR": "Open sidebar",
@ -64,6 +65,7 @@
},
"PORTAL": {
"HEADER": "Portals",
"DEFAULT": "Default",
"NEW_BUTTON": "New Portal",
"ACTIVE_BADGE": "active",
"CHOOSE_LOCALE_LABEL": "Choose a locale",
@ -84,7 +86,8 @@
"COUNT_LABEL": "articles",
"ADD": "Add locale",
"VISIT": "Visit site",
"SETTINGS": "Configuracions"
"SETTINGS": "Configuracions",
"DELETE": "Esborrar"
},
"PORTAL_CONFIG": {
"TITLE": "Portal Configurations",
@ -109,6 +112,51 @@
"DEFAULT_LOCALE": "Default"
}
}
},
"DELETE_PORTAL": {
"TITLE": "Delete portal",
"MESSAGE": "Are you sure you want to delete this portal",
"YES": "Yes, delete portal",
"NO": "No, keep portal",
"API": {
"DELETE_SUCCESS": "Portal deleted successfully",
"DELETE_ERROR": "Error while deleting portal"
}
}
},
"EDIT": {
"HEADER_TEXT": "Edit portal",
"TABS": {
"BASIC_SETTINGS": {
"TITLE": "Basic information"
},
"CUSTOMIZATION_SETTINGS": {
"TITLE": "Portal customization"
},
"CATEGORY_SETTINGS": {
"TITLE": "Categories"
},
"LOCALE_SETTINGS": {
"TITLE": "Locales"
}
},
"CATEGORIES": {
"TITLE": "Categories in",
"NEW_CATEGORY": "New category",
"TABLE": {
"NAME": "Nom",
"DESCRIPTION": "Descripció",
"LOCALE": "Locale",
"ARTICLE_COUNT": "No. of articles",
"ACTION_BUTTON": {
"EDIT": "Edit category",
"DELETE": "Delete category"
},
"EMPTY_TEXT": "No categories found"
}
},
"EDIT_BASIC_INFO": {
"BUTTON_TEXT": "Update basic settings"
}
},
"ADD": {
@ -164,7 +212,6 @@
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Portal slug for urls",
"ERROR": "Slug is required"
},
"DOMAIN": {
@ -196,9 +243,41 @@
"ERROR": "Portal header text is required"
},
"API": {
"SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.",
"ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.",
"ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
}
},
"ADD_LOCALE": {
"TITLE": "Add a new locale",
"SUB_TITLE": "This adds a new locale to your available translation list.",
"PORTAL": "Portal",
"LOCALE": {
"LABEL": "Locale",
"PLACEHOLDER": "Choose a locale",
"ERROR": "Locale is required"
},
"BUTTONS": {
"CREATE": "Create locale",
"CANCEL": "Cancel·la"
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
}
},
"CHANGE_DEFAULT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Default locale updated successfully",
"ERROR_MESSAGE": "Unable to update default locale. Try again."
}
},
"DELETE_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
}
},
"TABLE": {
@ -224,8 +303,34 @@
"ERROR": "Error while saving article"
}
},
"PUBLISH_ARTICLE": {
"API": {
"ERROR": "Error while publishing article",
"SUCCESS": "Article publishied successfully"
}
},
"ARCHIVE_ARTICLE": {
"API": {
"ERROR": "Error while archiving article",
"SUCCESS": "Article archived successfully"
}
},
"DELETE_ARTICLE": {
"MODAL": {
"CONFIRM": {
"TITLE": "Confirma l'esborrat",
"MESSAGE": "Are you sure to delete the article?",
"YES": "Si, esborra",
"NO": "No, manten-la"
}
},
"API": {
"SUCCESS_MESSAGE": "Article deleted successfully",
"ERROR_MESSAGE": "Error while deleting article"
}
},
"CREATE_ARTICLE": {
"ERROR_MESSAGE": "Something went wrong. Please try again."
"ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
},
"SIDEBAR": {
"SEARCH": {
@ -263,6 +368,43 @@
"SUCCESS_MESSAGE": "Category created successfully",
"ERROR_MESSAGE": "Unable to create category"
}
},
"EDIT": {
"TITLE": "Edit a category",
"SUB_TITLE": "Editing a category will update the category in the public facing portal.",
"PORTAL": "Portal",
"LOCALE": "Locale",
"NAME": {
"LABEL": "Nom",
"PLACEHOLDER": "Category name",
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
"ERROR": "Name is required"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Category slug for urls",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
"ERROR": "Slug is required"
},
"DESCRIPTION": {
"LABEL": "Descripció",
"PLACEHOLDER": "Give a short description about the category.",
"ERROR": "Description is required"
},
"BUTTONS": {
"CREATE": "Update category",
"CANCEL": "Cancel·la"
},
"API": {
"SUCCESS_MESSAGE": "Category updated successfully",
"ERROR_MESSAGE": "Unable to update category"
}
},
"DELETE": {
"API": {
"SUCCESS_MESSAGE": "Category deleted successfully",
"ERROR_MESSAGE": "Unable to delete category"
}
}
}
}

View file

@ -19,6 +19,21 @@
"TITLE": "Perfil",
"NOTE": "La vostra adreça de correu electrònic és la vostra identitat i s'utilitza per iniciar la sessió."
},
"SEND_MESSAGE": {
"TITLE": "Hotkey to send messages",
"NOTE": "You can select a hotkey (either Enter or Cmd/Ctrl+Enter) based on your preference of writing.",
"UPDATE_SUCCESS": "Your settings have been updated successfully",
"CARD": {
"ENTER_KEY": {
"HEADING": "Enter (↵)",
"CONTENT": "Send messages by pressing Enter key instead of clicking the send button."
},
"CMD_ENTER_KEY": {
"HEADING": "Cmd/Ctrl + Enter (⌘ + ↵)",
"CONTENT": "Send messages by pressing Cmd/Ctrl + enter key instead of clicking the send button."
}
}
},
"MESSAGE_SIGNATURE_SECTION": {
"TITLE": "Personal message signature",
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
@ -197,6 +212,7 @@
"REPORTS_OVERVIEW": "Overview",
"FACEBOOK_REAUTHORIZE": "La teva connexió a Facebook ha caducat, torna a connectar la vostra pàgina de Facebook per continuar els serveis",
"HELP_CENTER": {
"TITLE": "Help Center (Beta)",
"ALL_ARTICLES": "All Articles",
"MY_ARTICLES": "My Articles",
"DRAFT": "Draft",
@ -256,7 +272,6 @@
"GO_TO_SETTINGS": "Go to Settings",
"SWITCH_CONVERSATION_STATUS": "Switch to the next conversation status",
"SWITCH_TO_PRIVATE_NOTE": "Switch to Private Note",
"TOGGLE_RICH_CONTENT_EDITOR": "Toggle Rich Content editor",
"SWITCH_TO_REPLY": "Switch to Reply",
"TOGGLE_SNOOZE_DROPDOWN": "Toggle snooze dropdown"
},

View file

@ -21,7 +21,7 @@
"is_present": "Is present",
"is_not_present": "Is not present",
"is_greater_than": "Is greater than",
"is_less_than": "Is lesser than",
"is_less_than": "Je menší než",
"days_before": "Is x days before"
},
"ATTRIBUTE_LABELS": {

View file

@ -7,22 +7,22 @@
"404": "V této skupině nejsou žádné aktivní konverzace."
},
"TAB_HEADING": "Konverzace",
"MENTION_HEADING": "Zmínka",
"MENTION_HEADING": "Zmínky",
"SEARCH": {
"INPUT": "Hledat lidi, chaty, Uložené odpovědi .."
},
"FILTER_ALL": "Vše",
"ASSIGNEE_TYPE_TABS": {
"me": "Mine",
"me": "Moje",
"unassigned": "Nepřiřazeno",
"all": "Vše"
},
"CHAT_STATUS_FILTER_ITEMS": {
"open": {
"TEXT": "Otevřít"
"TEXT": "Otevřené"
},
"resolved": {
"TEXT": "Vyřešeno"
"TEXT": "Vyřešené"
},
"pending": {
"TEXT": "Čekající"
@ -55,11 +55,11 @@
"VIEW_TWEET_IN_TWITTER": "Zobrazit tweet na Twitteru",
"REPLY_TO_TWEET": "Odpovědět na tento tweet",
"LINK_TO_STORY": "Přejít na instagram příběh",
"SENT": "Sent successfully",
"SENT": "Úspěšně odesláno",
"NO_MESSAGES": "Žádné zprávy",
"NO_CONTENT": "Žádný obsah k dispozici",
"HIDE_QUOTED_TEXT": "Hide Quoted Text",
"SHOW_QUOTED_TEXT": "Show Quoted Text",
"MESSAGE_READ": "Přečteno"
"HIDE_QUOTED_TEXT": "Skrýt citovaný text",
"SHOW_QUOTED_TEXT": "Zobrazit citovaný text",
"MESSAGE_READ": "Přečtené"
}
}

View file

@ -3,6 +3,7 @@
"NOT_AVAILABLE": "Nedostupné",
"EMAIL_ADDRESS": "E-mailová adresa",
"PHONE_NUMBER": "Telefonní číslo",
"IDENTIFIER": "Identifikátor",
"COPY_SUCCESSFUL": "Úspěšně zkopírováno do schránky",
"COMPANY": "Společnost",
"LOCATION": "Poloha",

View file

@ -1,49 +1,49 @@
{
"CONTACTS_FILTER": {
"TITLE": "Filter Contacts",
"SUBTITLE": "Add filters below and hit 'Submit' to filter contacts.",
"ADD_NEW_FILTER": "Add Filter",
"CLEAR_ALL_FILTERS": "Clear All Filters",
"FILTER_DELETE_ERROR": "You should have atleast one filter to save",
"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": "Clear Filters",
"EMPTY_VALUE_ERROR": "Value is required",
"TOOLTIP_LABEL": "Filter contacts",
"CLEAR_BUTTON_LABEL": "Vymazat filtry",
"EMPTY_VALUE_ERROR": "Hodnota je povinná",
"TOOLTIP_LABEL": "Filtrovat kontakty",
"QUERY_DROPDOWN_LABELS": {
"AND": "AND",
"OR": "OR"
"AND": "A",
"OR": "NEBO"
},
"OPERATOR_LABELS": {
"equal_to": "Equal to",
"not_equal_to": "Not equal to",
"contains": "Contains",
"does_not_contain": "Does not contain",
"is_present": "Is present",
"is_not_present": "Is not present",
"is_greater_than": "Is greater than",
"is_lesser_than": "Is lesser than",
"days_before": "Is x days before"
"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": "Identifier",
"IDENTIFIER": "Identifikátor",
"CITY": "Město",
"COUNTRY": "Země",
"CUSTOM_ATTRIBUTE_LIST": "List",
"CUSTOM_ATTRIBUTE_LIST": "Seznam",
"CUSTOM_ATTRIBUTE_TEXT": "Text",
"CUSTOM_ATTRIBUTE_NUMBER": "Number",
"CUSTOM_ATTRIBUTE_LINK": "Link",
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
"CREATED_AT": "Created At",
"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": "Referrer link"
"REFERER_LINK": "Odkazující odkaz"
},
"GROUPS": {
"STANDARD_FILTERS": "Standard Filters",
"ADDITIONAL_FILTERS": "Additional Filters",
"STANDARD_FILTERS": "Standardní filtry",
"ADDITIONAL_FILTERS": "Další filtry",
"CUSTOM_ATTRIBUTES": "Vlastní atributy"
}
}

View file

@ -1,9 +1,10 @@
{
"CONVERSATION": {
"SELECT_A_CONVERSATION": "Please select a conversation from left pane",
"404": "Sorry, we cannot find the conversation. Please try again",
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
"SELECT_A_CONVERSATION": "Vyberte prosím konverzaci z levého panelu",
"CSAT_REPLY_MESSAGE": "Ohodnoťte prosím konverzaci",
"404": "Omlouváme se, konverzaci nelze najít. Zkuste to prosím znovu",
"SWITCH_VIEW_LAYOUT": "Přepnout rozložení",
"DASHBOARD_APP_TAB_MESSAGES": "Zprávy",
"UNVERIFIED_SESSION": "Identita tohoto uživatele není ověřena",
"NO_MESSAGE_1": "Ale ne! Vypadá to, že ve vaší schránce nejsou žádné zprávy od zákazníků.",
"NO_MESSAGE_2": " pro odeslání zprávy na vaši stránku!",
@ -33,7 +34,7 @@
"REPLYING_TO": "Odpovídáte uživateli:",
"REMOVE_SELECTION": "Odstranit výběr",
"DOWNLOAD": "Stáhnout",
"UNKNOWN_FILE_TYPE": "Unknown File",
"UNKNOWN_FILE_TYPE": "Neznámý soubor",
"UPLOADING_ATTACHMENTS": "Nahrávání příloh...",
"SUCCESS_DELETE_MESSAGE": "Zpráva byla úspěšně smazána",
"FAIL_DELETE_MESSSAGE": "Zpráva se nepodařilo odstranit! Zkuste to znovu",
@ -62,30 +63,30 @@
},
"CARD_CONTEXT_MENU": {
"PENDING": "Označit jako nevyřízené",
"RESOLVED": "Mark as resolved",
"REOPEN": "Reopen conversation",
"RESOLVED": "Označit jako vyřešené",
"REOPEN": "Znovu otevřít konverzaci",
"SNOOZE": {
"TITLE": "Snooze",
"NEXT_REPLY": "Until next reply",
"TOMORROW": "Until tomorrow",
"NEXT_WEEK": "Until next week"
"TITLE": "Odložit",
"NEXT_REPLY": "Do další odpovědi",
"TOMORROW": "Do zítřka",
"NEXT_WEEK": "Do příštího týdne"
},
"ASSIGN_AGENT": "Assign agent",
"ASSIGN_LABEL": "Assign label",
"AGENTS_LOADING": "Loading agents...",
"ASSIGN_TEAM": "Assign team",
"ASSIGN_AGENT": "Přiřadit agenta",
"ASSIGN_LABEL": "Přiřadit štítek",
"AGENTS_LOADING": "Načítání agentů...",
"ASSIGN_TEAM": "Přiřadit tým",
"API": {
"AGENT_ASSIGNMENT": {
"SUCCESFUL": "Conversation id %{conversationId} assigned to \"%{agentName}\"",
"FAILED": "Couldn't assign agent. Please try again."
"SUCCESFUL": "Konverzace id %{conversationId} přiřazena \"%{agentName}\"",
"FAILED": "Nelze přiřadit agenta. Zkuste to prosím znovu."
},
"LABEL_ASSIGNMENT": {
"SUCCESFUL": "Assigned label #%{labelName} to conversation id %{conversationId}",
"FAILED": "Couldn't assign label. Please try again."
"SUCCESFUL": "Přiřazený štítek #%{labelName} ke konverzaci id %{conversationId}",
"FAILED": "Nelze přiřadit štítek. Zkuste to prosím znovu."
},
"TEAM_ASSIGNMENT": {
"SUCCESFUL": "Assigned team \"%{team}\" to conversation id %{conversationId}",
"FAILED": "Couldn't assign team. Please try again."
"SUCCESFUL": "Přiřazený tým #%{team} ke konverzaci id %{conversationId}",
"FAILED": "Nelze přiřadit tým. Zkuste to prosím znovu."
}
}
},
@ -95,7 +96,7 @@
"DISABLE_SIGN_TOOLTIP": "Zakázat podpis",
"MSG_INPUT": "Shift + zadejte pro nový řádek. Začněte '/' pro výběr zrušené odpovědi.",
"PRIVATE_MSG_INPUT": "Shift + zadejte pro nový řádek. Toto bude viditelné pouze pro agenty",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Podpis zprávy není nakonfigurován, prosím nakonfigurujte jej v nastavení profilu.",
"CLICK_HERE": "Klikněte zde pro aktualizaci"
},
"REPLYBOX": {
@ -110,7 +111,6 @@
"TIP_AUDIORECORDER_ICON": "Nahrát zvuk",
"TIP_AUDIORECORDER_PERMISSION": "Povolit přístup ke zvuku",
"TIP_AUDIORECORDER_ERROR": "Zvuk se nepodařilo otevřít",
"ENTER_TO_SEND": "Enterem odeslat",
"DRAG_DROP": "Přetažením sem připojíte",
"START_AUDIO_RECORDING": "Spustit nahrávání zvuku",
"STOP_AUDIO_RECORDING": "Zastavit nahrávání zvuku",
@ -131,13 +131,13 @@
},
"VISIBLE_TO_AGENTS": "Soukromá poznámka: Viditelné pouze pro vás a váš tým",
"CHANGE_STATUS": "Stav konverzace byl změněn",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
"CHANGE_STATUS_FAILED": "Změna stavu konverzace se nezdařila",
"CHANGE_AGENT": "Konverzace pověřená osoba změněna",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
"CHANGE_AGENT_FAILED": "Změna přiřazeného agenta se nezdařila",
"ASSIGN_LABEL_SUCCESFUL": "Štítek byl úspěšně přiřazen",
"ASSIGN_LABEL_FAILED": "Přiřazení štítku se nezdařilo",
"CHANGE_TEAM": "Tým konverzace se změnil",
"FILE_SIZE_LIMIT": "Soubor překračuje limit {MAXIMUM_FILE_UPLOAD_SIZE} přílohy",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} MB attachment limit",
"MESSAGE_ERROR": "Nepodařilo se odeslat tuto zprávu, zkuste to prosím později",
"SENT_BY": "Odeslal:",
"BOT": "Bot",
@ -150,7 +150,8 @@
},
"CONTEXT_MENU": {
"COPY": "Kopírovat",
"DELETE": "Vymazat"
"DELETE": "Vymazat",
"CREATE_A_CANNED_RESPONSE": "Add to canned responses"
}
},
"EMAIL_TRANSCRIPT": {
@ -180,7 +181,7 @@
},
"TEAM_MEMBERS": {
"TITLE": "Pozvěte své členy týmu",
"DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email addresses to the agent list.",
"DESCRIPTION": "Vzhledem k tomu, že se připravujete na rozhovor se zákazníkem, přiveďte své týmové spolupracovníky, kteří Vám pomohou. Můžete pozvat své spolupracovníky přidáním jejich e-mailové adresy do seznamu agentů.",
"NEW_LINK": "Klikněte zde pro pozvání člena týmu"
},
"INBOXES": {

View file

@ -1,74 +1,76 @@
{
"HELP_CENTER": {
"HEADER": {
"FILTER": "Filter by",
"SORT": "Sort by",
"FILTER": "Filtrovat podle",
"SORT": "Seřadit podle",
"SETTINGS_BUTTON": "Nastavení",
"NEW_BUTTON": "New Article",
"NEW_BUTTON": "Nový článek",
"DROPDOWN_OPTIONS": {
"PUBLISHED": "Published",
"DRAFT": "Draft",
"ARCHIVED": "Archived"
"PUBLISHED": "Publikované",
"DRAFT": "Koncept",
"ARCHIVED": "Archivované"
},
"TITLES": {
"ALL_ARTICLES": "All Articles",
"MINE": "My Articles",
"DRAFT": "Draft Articles",
"ARCHIVED": "Archived Articles"
"ALL_ARTICLES": "Všechny články",
"MINE": "Moje články",
"DRAFT": "Koncepty článků",
"ARCHIVED": "Archivované články"
}
},
"EDIT_HEADER": {
"ALL_ARTICLES": "All Articles",
"PUBLISH_BUTTON": "Publish",
"PREVIEW": "Preview",
"ADD_TRANSLATION": "Add translation",
"OPEN_SIDEBAR": "Open sidebar",
"CLOSE_SIDEBAR": "Close sidebar",
"SAVING": "Saving...",
"SAVED": "Saved"
"ALL_ARTICLES": "Všechny články",
"PUBLISH_BUTTON": "Publikovat",
"MOVE_TO_ARCHIVE_BUTTON": "Move to archived",
"PREVIEW": "Náhled",
"ADD_TRANSLATION": "Přidat překlad",
"OPEN_SIDEBAR": "Otevřít postranní panel",
"CLOSE_SIDEBAR": "Zavřít postranní panel",
"SAVING": "Ukládání...",
"SAVED": "Uloženo"
},
"ARTICLE_SETTINGS": {
"TITLE": "Article Settings",
"TITLE": "Nastavení článků",
"FORM": {
"CATEGORY": {
"LABEL": "Category",
"TITLE": "Select category",
"PLACEHOLDER": "Select category",
"NO_RESULT": "No category found",
"SEARCH_PLACEHOLDER": "Search category"
"LABEL": "Kategorie",
"TITLE": "Vyberte kategorii",
"PLACEHOLDER": "Vyberte kategorii",
"NO_RESULT": "Nebyla nalezena žádná kategorie",
"SEARCH_PLACEHOLDER": "Hledat kategorii"
},
"AUTHOR": {
"LABEL": "Author",
"TITLE": "Select author",
"PLACEHOLDER": "Select author",
"NO_RESULT": "No authors found",
"SEARCH_PLACEHOLDER": "Search author"
"LABEL": "Autor",
"TITLE": "Vyberte autora",
"PLACEHOLDER": "Vyberte autora",
"NO_RESULT": "Nebyli nalezeni žádní autoři",
"SEARCH_PLACEHOLDER": "Hledat autora"
},
"META_TITLE": {
"LABEL": "Meta title",
"PLACEHOLDER": "Add a meta title"
"LABEL": "Meta titulek",
"PLACEHOLDER": "Přidat meta titulek"
},
"META_DESCRIPTION": {
"LABEL": "Meta description",
"PLACEHOLDER": "Add your meta description for better SEO results..."
"LABEL": "Meta popis",
"PLACEHOLDER": "Přidejte svůj meta popis pro lepší výsledky SEO..."
},
"META_TAGS": {
"LABEL": "Meta tags",
"PLACEHOLDER": "Add meta tags separated by comma..."
"LABEL": "Meta tagy",
"PLACEHOLDER": "Přidat meta tagy oddělené čárkou..."
}
},
"BUTTONS": {
"ARCHIVE": "Archive article",
"DELETE": "Delete article"
"ARCHIVE": "Archivovat článek",
"DELETE": "Odstranit článek"
}
},
"PORTAL": {
"HEADER": "Portals",
"NEW_BUTTON": "New Portal",
"ACTIVE_BADGE": "active",
"HEADER": "Portály",
"DEFAULT": "Default",
"NEW_BUTTON": "Nový portál",
"ACTIVE_BADGE": "aktivní",
"CHOOSE_LOCALE_LABEL": "Choose a locale",
"LOADING_MESSAGE": "Loading portals...",
"ARTICLES_LABEL": "articles",
"LOADING_MESSAGE": "Načítání portálů...",
"ARTICLES_LABEL": "články",
"NO_PORTALS_MESSAGE": "There are no available portals",
"ADD_NEW_LOCALE": "Add a new locale",
"POPOVER": {
@ -81,10 +83,11 @@
"PORTAL_SETTINGS": {
"LIST_ITEM": {
"HEADER": {
"COUNT_LABEL": "articles",
"COUNT_LABEL": "články",
"ADD": "Add locale",
"VISIT": "Visit site",
"SETTINGS": "Nastavení"
"SETTINGS": "Nastavení",
"DELETE": "Vymazat"
},
"PORTAL_CONFIG": {
"TITLE": "Portal Configurations",
@ -109,6 +112,51 @@
"DEFAULT_LOCALE": "Default"
}
}
},
"DELETE_PORTAL": {
"TITLE": "Delete portal",
"MESSAGE": "Are you sure you want to delete this portal",
"YES": "Yes, delete portal",
"NO": "No, keep portal",
"API": {
"DELETE_SUCCESS": "Portal deleted successfully",
"DELETE_ERROR": "Error while deleting portal"
}
}
},
"EDIT": {
"HEADER_TEXT": "Edit portal",
"TABS": {
"BASIC_SETTINGS": {
"TITLE": "Basic information"
},
"CUSTOMIZATION_SETTINGS": {
"TITLE": "Portal customization"
},
"CATEGORY_SETTINGS": {
"TITLE": "Categories"
},
"LOCALE_SETTINGS": {
"TITLE": "Locales"
}
},
"CATEGORIES": {
"TITLE": "Categories in",
"NEW_CATEGORY": "New category",
"TABLE": {
"NAME": "Název",
"DESCRIPTION": "Description",
"LOCALE": "Locale",
"ARTICLE_COUNT": "No. of articles",
"ACTION_BUTTON": {
"EDIT": "Edit category",
"DELETE": "Delete category"
},
"EMPTY_TEXT": "No categories found"
}
},
"EDIT_BASIC_INFO": {
"BUTTON_TEXT": "Update basic settings"
}
},
"ADD": {
@ -164,7 +212,6 @@
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Portal slug for urls",
"ERROR": "Slug is required"
},
"DOMAIN": {
@ -196,9 +243,41 @@
"ERROR": "Portal header text is required"
},
"API": {
"SUCCESS_MESSAGE_FOR_BASIC": "Portal created successfully.",
"ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal updated successfully.",
"ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
}
},
"ADD_LOCALE": {
"TITLE": "Add a new locale",
"SUB_TITLE": "This adds a new locale to your available translation list.",
"PORTAL": "Portal",
"LOCALE": {
"LABEL": "Locale",
"PLACEHOLDER": "Choose a locale",
"ERROR": "Locale is required"
},
"BUTTONS": {
"CREATE": "Create locale",
"CANCEL": "Zrušit"
},
"API": {
"SUCCESS_MESSAGE": "Locale added successfully",
"ERROR_MESSAGE": "Unable to add locale. Try again."
}
},
"CHANGE_DEFAULT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Default locale updated successfully",
"ERROR_MESSAGE": "Unable to update default locale. Try again."
}
},
"DELETE_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Locale removed from portal successfully",
"ERROR_MESSAGE": "Unable to remove locale from portal. Try again."
}
}
},
"TABLE": {
@ -224,8 +303,34 @@
"ERROR": "Error while saving article"
}
},
"PUBLISH_ARTICLE": {
"API": {
"ERROR": "Error while publishing article",
"SUCCESS": "Article publishied successfully"
}
},
"ARCHIVE_ARTICLE": {
"API": {
"ERROR": "Error while archiving article",
"SUCCESS": "Article archived successfully"
}
},
"DELETE_ARTICLE": {
"MODAL": {
"CONFIRM": {
"TITLE": "Potvrdit odstranění",
"MESSAGE": "Are you sure to delete the article?",
"YES": "Ano, odstranit",
"NO": "No, Keep it"
}
},
"API": {
"SUCCESS_MESSAGE": "Article deleted successfully",
"ERROR_MESSAGE": "Error while deleting article"
}
},
"CREATE_ARTICLE": {
"ERROR_MESSAGE": "Something went wrong. Please try again."
"ERROR_MESSAGE": "Please add the article heading and content then only you can update the settings"
},
"SIDEBAR": {
"SEARCH": {
@ -263,6 +368,43 @@
"SUCCESS_MESSAGE": "Category created successfully",
"ERROR_MESSAGE": "Unable to create category"
}
},
"EDIT": {
"TITLE": "Edit a category",
"SUB_TITLE": "Editing a category will update the category in the public facing portal.",
"PORTAL": "Portal",
"LOCALE": "Locale",
"NAME": {
"LABEL": "Název",
"PLACEHOLDER": "Category name",
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
"ERROR": "Name is required"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Category slug for urls",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
"ERROR": "Slug is required"
},
"DESCRIPTION": {
"LABEL": "Description",
"PLACEHOLDER": "Give a short description about the category.",
"ERROR": "Description is required"
},
"BUTTONS": {
"CREATE": "Update category",
"CANCEL": "Zrušit"
},
"API": {
"SUCCESS_MESSAGE": "Category updated successfully",
"ERROR_MESSAGE": "Unable to update category"
}
},
"DELETE": {
"API": {
"SUCCESS_MESSAGE": "Category deleted successfully",
"ERROR_MESSAGE": "Unable to delete category"
}
}
}
}

View file

@ -622,7 +622,7 @@
}
},
"WIDGET_VIEW_OPTION": {
"PREVIEW": "Preview",
"PREVIEW": "Náhled",
"SCRIPT": "Script"
},
"WIDGET_BUBBLE_POSITION": {

View file

@ -45,11 +45,11 @@
},
{
"id": 2,
"name": "Last 3 months"
"name": "Poslední 3 měsíce"
},
{
"id": 3,
"name": "Last 6 months"
"name": "Posledních 6 měsíců"
},
{
"id": 4,
@ -57,15 +57,15 @@
},
{
"id": 5,
"name": "Custom date range"
"name": "Vlastní časové rozmezí"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Použít",
"PLACEHOLDER": "Select date range"
"PLACEHOLDER": "Zvolte časové rozmezí"
},
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Group By",
"DURATION_FILTER_LABEL": "Duration",
"GROUP_BY_FILTER_DROPDOWN_LABEL": "Seskupit podle",
"DURATION_FILTER_LABEL": "Doba trvání",
"GROUP_BY_DAY_OPTIONS": [
{
"id": 1,
@ -163,11 +163,11 @@
},
{
"id": 2,
"name": "Last 3 months"
"name": "Poslední 3 měsíce"
},
{
"id": 3,
"name": "Last 6 months"
"name": "Posledních 6 měsíců"
},
{
"id": 4,
@ -175,12 +175,12 @@
},
{
"id": 5,
"name": "Custom date range"
"name": "Vlastní časové rozmezí"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Použít",
"PLACEHOLDER": "Select date range"
"PLACEHOLDER": "Zvolte časové rozmezí"
}
},
"LABEL_REPORTS": {
@ -230,11 +230,11 @@
},
{
"id": 2,
"name": "Last 3 months"
"name": "Poslední 3 měsíce"
},
{
"id": 3,
"name": "Last 6 months"
"name": "Posledních 6 měsíců"
},
{
"id": 4,
@ -242,12 +242,12 @@
},
{
"id": 5,
"name": "Custom date range"
"name": "Vlastní časové rozmezí"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Použít",
"PLACEHOLDER": "Select date range"
"PLACEHOLDER": "Zvolte časové rozmezí"
}
},
"INBOX_REPORTS": {
@ -297,11 +297,11 @@
},
{
"id": 2,
"name": "Last 3 months"
"name": "Poslední 3 měsíce"
},
{
"id": 3,
"name": "Last 6 months"
"name": "Posledních 6 měsíců"
},
{
"id": 4,
@ -309,12 +309,12 @@
},
{
"id": 5,
"name": "Custom date range"
"name": "Vlastní časové rozmezí"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Použít",
"PLACEHOLDER": "Select date range"
"PLACEHOLDER": "Zvolte časové rozmezí"
}
},
"TEAM_REPORTS": {
@ -364,11 +364,11 @@
},
{
"id": 2,
"name": "Last 3 months"
"name": "Poslední 3 měsíce"
},
{
"id": 3,
"name": "Last 6 months"
"name": "Posledních 6 měsíců"
},
{
"id": 4,
@ -376,12 +376,12 @@
},
{
"id": 5,
"name": "Custom date range"
"name": "Vlastní časové rozmezí"
}
],
"CUSTOM_DATE_RANGE": {
"CONFIRM": "Použít",
"PLACEHOLDER": "Select date range"
"PLACEHOLDER": "Zvolte časové rozmezí"
}
},
"CSAT_REPORTS": {

View file

@ -19,6 +19,21 @@
"TITLE": "Profil",
"NOTE": "Vaše e-mailová adresa je Vaše identita a používá se k přihlášení."
},
"SEND_MESSAGE": {
"TITLE": "Hotkey to send messages",
"NOTE": "You can select a hotkey (either Enter or Cmd/Ctrl+Enter) based on your preference of writing.",
"UPDATE_SUCCESS": "Your settings have been updated successfully",
"CARD": {
"ENTER_KEY": {
"HEADING": "Enter (↵)",
"CONTENT": "Send messages by pressing Enter key instead of clicking the send button."
},
"CMD_ENTER_KEY": {
"HEADING": "Cmd/Ctrl + Enter (⌘ + ↵)",
"CONTENT": "Send messages by pressing Cmd/Ctrl + enter key instead of clicking the send button."
}
}
},
"MESSAGE_SIGNATURE_SECTION": {
"TITLE": "Personal message signature",
"NOTE": "Create a personal message signature that would be added to all the messages you send from your email inbox. Use the rich content editor to create a highly personalised signature.",
@ -158,7 +173,7 @@
"SWITCH": "Switch",
"CONVERSATIONS": "Konverzace",
"ALL_CONVERSATIONS": "All Conversations",
"MENTIONED_CONVERSATIONS": "Zmínka",
"MENTIONED_CONVERSATIONS": "Zmínky",
"REPORTS": "Zprávy",
"SETTINGS": "Nastavení",
"CONTACTS": "Kontakty",
@ -197,6 +212,7 @@
"REPORTS_OVERVIEW": "Overview",
"FACEBOOK_REAUTHORIZE": "Your Facebook connection has expired, please reconnect your Facebook page to continue services",
"HELP_CENTER": {
"TITLE": "Help Center (Beta)",
"ALL_ARTICLES": "All Articles",
"MY_ARTICLES": "My Articles",
"DRAFT": "Draft",
@ -256,7 +272,6 @@
"GO_TO_SETTINGS": "Go to Settings",
"SWITCH_CONVERSATION_STATUS": "Switch to the next conversation status",
"SWITCH_TO_PRIVATE_NOTE": "Switch to Private Note",
"TOGGLE_RICH_CONTENT_EDITOR": "Toggle Rich Content editor",
"SWITCH_TO_REPLY": "Switch to Reply",
"TOGGLE_SNOOZE_DROPDOWN": "Toggle snooze dropdown"
},

View file

@ -22,7 +22,7 @@
"LABEL": "Heslo",
"PLACEHOLDER": "Heslo",
"ERROR": "Heslo je příliš krátké",
"IS_INVALID_PASSWORD": "Password should contain atleast 1 uppercase letter, 1 lowercase letter, 1 number and 1 special character"
"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": "Potvrzení hesla",

View file

@ -1,91 +1,91 @@
{
"FILTER": {
"TITLE": "Filter Conversations",
"SUBTITLE": "Add filters below and hit 'Apply filters' to filter conversations.",
"ADD_NEW_FILTER": "Add Filter",
"FILTER_DELETE_ERROR": "You should have atleast one filter to save",
"SUBMIT_BUTTON_LABEL": "Apply filters",
"TITLE": "Filtrer Samtaler",
"SUBTITLE": "Tilføj filtre nedenfor og tryk på 'Anvend filtre' for at filtrere samtaler.",
"ADD_NEW_FILTER": "Tilføj Filter",
"FILTER_DELETE_ERROR": "Du skal have mindst et filter at gemme",
"SUBMIT_BUTTON_LABEL": "Anvend filtre",
"CANCEL_BUTTON_LABEL": "Annuller",
"CLEAR_BUTTON_LABEL": "Clear Filters",
"EMPTY_VALUE_ERROR": "Value is required",
"TOOLTIP_LABEL": "Filter conversations",
"CLEAR_BUTTON_LABEL": "Ryd Filtre",
"EMPTY_VALUE_ERROR": "Værdi er påkrævet",
"TOOLTIP_LABEL": "Filtrer samtaler",
"QUERY_DROPDOWN_LABELS": {
"AND": "AND",
"OR": "OR"
"AND": "OG",
"OR": "ELLER"
},
"OPERATOR_LABELS": {
"equal_to": "Equal to",
"not_equal_to": "Not equal to",
"contains": "Contains",
"does_not_contain": "Does not contain",
"is_present": "Is present",
"is_not_present": "Is not present",
"is_greater_than": "Is greater than",
"is_less_than": "Is lesser than",
"days_before": "Is x days before"
"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_less_than": "Er mindre end",
"days_before": "Er x dage før"
},
"ATTRIBUTE_LABELS": {
"TRUE": "True",
"FALSE": "False"
"TRUE": "Sandt",
"FALSE": "Falsk"
},
"ATTRIBUTES": {
"STATUS": "Status",
"ASSIGNEE_NAME": "Assignee Name",
"ASSIGNEE_NAME": "Ansvarlig Navn",
"INBOX_NAME": "Indbakke Navn",
"TEAM_NAME": "Team Name",
"TEAM_NAME": "Hold Navn",
"CONVERSATION_IDENTIFIER": "Conversation Identifier",
"CAMPAIGN_NAME": "Campaign Name",
"CAMPAIGN_NAME": "Kampagne Navn",
"LABELS": "Etiketter",
"BROWSER_LANGUAGE": "Browser Language",
"COUNTRY_NAME": "Country Name",
"REFERER_LINK": "Referer link",
"CUSTOM_ATTRIBUTE_LIST": "List",
"CUSTOM_ATTRIBUTE_TEXT": "Text",
"CUSTOM_ATTRIBUTE_NUMBER": "Number",
"BROWSER_LANGUAGE": "Browser Sprog",
"COUNTRY_NAME": "Land Navn",
"REFERER_LINK": "Refererer link",
"CUSTOM_ATTRIBUTE_LIST": "Liste",
"CUSTOM_ATTRIBUTE_TEXT": "Tekst",
"CUSTOM_ATTRIBUTE_NUMBER": "Nummer",
"CUSTOM_ATTRIBUTE_LINK": "Link",
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
"CREATED_AT": "Created At",
"LAST_ACTIVITY": "Last Activity"
"CUSTOM_ATTRIBUTE_CHECKBOX": "Afkrydsningsfelt",
"CREATED_AT": "Oprettet Den",
"LAST_ACTIVITY": "Sidste Aktivitet"
},
"GROUPS": {
"STANDARD_FILTERS": "Standard Filters",
"ADDITIONAL_FILTERS": "Additional Filters",
"STANDARD_FILTERS": "Standard Filtre",
"ADDITIONAL_FILTERS": "Yderligere Filtre",
"CUSTOM_ATTRIBUTES": "Brugerdefinerede Egenskaber"
},
"CUSTOM_VIEWS": {
"ADD": {
"TITLE": "Do you want to save this filter?",
"LABEL": "Name this filter",
"PLACEHOLDER": "Enter a name for this filter",
"ERROR_MESSAGE": "Name is required",
"SAVE_BUTTON": "Save filter",
"TITLE": "Vil du gemme dette filter?",
"LABEL": "Navngiv dette filter",
"PLACEHOLDER": "Angiv et navn for dette filter",
"ERROR_MESSAGE": "Navn er påkrævet",
"SAVE_BUTTON": "Gem filter",
"CANCEL_BUTTON": "Annuller",
"API_FOLDERS": {
"SUCCESS_MESSAGE": "Folder created successfully",
"ERROR_MESSAGE": "Error while creating folder"
"SUCCESS_MESSAGE": "Mappe oprettet",
"ERROR_MESSAGE": "Fejl under oprettelse af mappe"
},
"API_SEGMENTS": {
"SUCCESS_MESSAGE": "Segment created successfully",
"ERROR_MESSAGE": "Error while creating segment"
"SUCCESS_MESSAGE": "Segmentet er oprettet",
"ERROR_MESSAGE": "Fejl under oprettelse af segment"
}
},
"DELETE": {
"DELETE_BUTTON": "Delete filter",
"DELETE_BUTTON": "Slet filter",
"MODAL": {
"CONFIRM": {
"TITLE": "Bekræft Sletning",
"MESSAGE": "Are you sure to delete the filter ",
"MESSAGE": "Er du sikker på du vil slette filteret ",
"YES": "Ja, Slet",
"NO": "Nej, behold det"
}
},
"API_FOLDERS": {
"SUCCESS_MESSAGE": "Folder deleted successfully",
"ERROR_MESSAGE": "Error while deleting folder"
"SUCCESS_MESSAGE": "Mappen blev slettet",
"ERROR_MESSAGE": "Fejl under sletning af mappe"
},
"API_SEGMENTS": {
"SUCCESS_MESSAGE": "Segment deleted successfully",
"ERROR_MESSAGE": "Error while deleting segment"
"SUCCESS_MESSAGE": "Segmentet blev slettet",
"ERROR_MESSAGE": "Fejl under sletning af segment"
}
}
}

View file

@ -93,19 +93,19 @@
"NO_RESULTS": "Ingen resultater fundet."
},
"MULTI_SELECTOR": {
"PLACEHOLDER": "None",
"PLACEHOLDER": "Ingen",
"TITLE": {
"AGENT": "Select agent",
"TEAM": "Select team"
"AGENT": "Vælg agent",
"TEAM": "Vælg hold"
},
"SEARCH": {
"NO_RESULTS": {
"AGENT": "Ingen agenter fundet",
"TEAM": "No teams found"
"TEAM": "Ingen hold fundet"
},
"PLACEHOLDER": {
"AGENT": "Search agents",
"TEAM": "Search teams"
"AGENT": "Søg agenter",
"TEAM": "Søg i teams"
}
}
}

View file

@ -1,98 +1,98 @@
{
"ATTRIBUTES_MGMT": {
"HEADER": "Brugerdefinerede Egenskaber",
"HEADER_BTN_TXT": "Add Custom Attribute",
"LOADING": "Fetching custom attributes",
"SIDEBAR_TXT": "<p><b>Custom Attributes</b> <p>A custom attribute tracks facts about your contacts/conversation — like the subscription plan, or when they ordered the first item etc. <br /><br />For creating a Custom Attribute, just click on the <b>Add Custom Attribute.</b> You can also edit or delete an existing Custom Attribute by clicking on the Edit or Delete button.</p>",
"HEADER_BTN_TXT": "Tilføj Tilpasset Attribut",
"LOADING": "Henter brugerdefinerede attributter",
"SIDEBAR_TXT": "<p><b>Brugerdefinerede attributter</b> <p>En brugerdefineret attribut sporer fakta om dine kontakter/samtale — såsom abonnementet, eller når de bestilte det første element osv. <br /><br />For at oprette en brugerdefineret attribut, klik blot på<b>Tilføj brugerdefineret attribut.</b> Du kan også redigere eller slette en eksisterende brugerdefineret attribut ved at klikke på Rediger eller Slet knappen.</p>",
"ADD": {
"TITLE": "Add Custom Attribute",
"TITLE": "Tilføj Tilpasset Attribut",
"SUBMIT": "Opret",
"CANCEL_BUTTON_TEXT": "Annuller",
"FORM": {
"NAME": {
"LABEL": "Display Name",
"PLACEHOLDER": "Enter custom attribute display name",
"ERROR": "Name is required"
"LABEL": "Vis Navn",
"PLACEHOLDER": "Angiv brugerdefineret attribut visningsnavn",
"ERROR": "Navn er påkrævet"
},
"DESC": {
"LABEL": "Beskrivelse",
"PLACEHOLDER": "Enter custom attribute description",
"ERROR": "Description is required"
"PLACEHOLDER": "Angiv brugerdefineret attribut beskrivelse",
"ERROR": "Beskrivelse er påkrævet"
},
"MODEL": {
"LABEL": "Applies to",
"PLACEHOLDER": "Please select one",
"ERROR": "Model is required"
"LABEL": "Gælder for",
"PLACEHOLDER": "Vælg venligst en",
"ERROR": "Model er påkrævet"
},
"TYPE": {
"LABEL": "Type",
"PLACEHOLDER": "Please select a type",
"ERROR": "Type is required",
"PLACEHOLDER": "Vælg venligst en type",
"ERROR": "Type er påkrævet",
"LIST": {
"LABEL": "List Values",
"PLACEHOLDER": "Please enter value and press enter key",
"ERROR": "Must have at least one value"
"LABEL": "Liste Værdier",
"PLACEHOLDER": "Indtast venligst værdi og tryk på enter tasten",
"ERROR": "Skal have mindst én værdi"
}
},
"KEY": {
"LABEL": "Key",
"PLACEHOLDER": "Enter custom attribute key",
"ERROR": "Key is required",
"IN_VALID": "Invalid key"
"LABEL": "Nøgle",
"PLACEHOLDER": "Angiv brugerdefineret attributnøgle",
"ERROR": "Nøgle er påkrævet",
"IN_VALID": "Ugyldig nøgle"
}
},
"API": {
"SUCCESS_MESSAGE": "Custom Attribute added successfully",
"ERROR_MESSAGE": "Could not able to create a custom attribute, Please try again later"
"SUCCESS_MESSAGE": "Brugerdefineret attribut blev tilføjet",
"ERROR_MESSAGE": "Kunne ikke oprette en brugerdefineret attribut. Prøv igen senere"
}
},
"DELETE": {
"BUTTON_TEXT": "Slet",
"API": {
"SUCCESS_MESSAGE": "Custom Attribute deleted successfully.",
"ERROR_MESSAGE": "Couldn't delete the custom attribute. Try again."
"SUCCESS_MESSAGE": "Brugerdefineret attribut slettet.",
"ERROR_MESSAGE": "Kunne ikke slette den brugerdefinerede attribut. Prøv igen."
},
"CONFIRM": {
"TITLE": "Are you sure want to delete - %{attributeName}",
"PLACE_HOLDER": "Please type {attributeName} to confirm",
"MESSAGE": "Deleting will remove the custom attribute",
"TITLE": "Er du sikker på du vil slette - %{attributeName}",
"PLACE_HOLDER": "Skriv venligst {attributeName} for at bekræfte",
"MESSAGE": "Sletning vil fjerne den brugerdefinerede attribut",
"YES": "Slet ",
"NO": "Annuller"
}
},
"EDIT": {
"TITLE": "Edit Custom Attribute",
"TITLE": "Rediger Brugerdefineret Attribut",
"UPDATE_BUTTON_TEXT": "Opdater",
"TYPE": {
"LIST": {
"LABEL": "List Values",
"PLACEHOLDER": "Please enter values and press enter key"
"LABEL": "Liste Værdier",
"PLACEHOLDER": "Indtast værdier og tryk på enter tasten"
}
},
"API": {
"SUCCESS_MESSAGE": "Custom Attribute updated successfully",
"ERROR_MESSAGE": "There was an error updating custom attribute, please try again"
"SUCCESS_MESSAGE": "Brugerdefineret attribut opdateret",
"ERROR_MESSAGE": "Der opstod en fejl under opdatering af brugerdefineret attribut. Prøv igen"
}
},
"TABS": {
"HEADER": "Brugerdefinerede Egenskaber",
"CONVERSATION": "Conversation",
"CONTACT": "Contact"
"CONVERSATION": "Samtale",
"CONTACT": "Kontakt"
},
"LIST": {
"TABLE_HEADER": [
"Navn",
"Beskrivelse",
"Type",
"Key"
"Nøgle"
],
"BUTTONS": {
"EDIT": "Rediger",
"DELETE": "Slet"
},
"EMPTY_RESULT": {
"404": "There are no custom attributes created",
"NOT_FOUND": "There are no custom attributes configured"
"404": "Der er ingen brugerdefinerede attributter oprettet",
"NOT_FOUND": "Der er ingen brugerdefinerede attributter konfigureret"
}
}
}

View file

@ -1,54 +1,54 @@
{
"AUTOMATION": {
"HEADER": "Automations",
"HEADER_BTN_TXT": "Add Automation Rule",
"LOADING": "Fetching automation rules",
"SIDEBAR_TXT": "<p><b>Automation Rules</b> <p>Automation can replace and automate existing processes that require manual effort. You can do many things with automation, including adding labels and assigning conversation to the best agent. So the team focuses on what they do best and spends more little time on manual tasks.</p>",
"HEADER": "Automatiseringer",
"HEADER_BTN_TXT": "Tilføj Automatiseringsregel",
"LOADING": "Henter automatiseringsregler",
"SIDEBAR_TXT": "<p><b>Automatiseringsregler</b> <p>Automatisering kan erstatte og automatisere eksisterende processer, der kræver manuel indsats. Du kan gøre mange ting med automatisering, herunder tilføje etiketter og tildele samtale til den bedste agent. Så holdet fokuserer på, hvad de gør bedst, og bruger mere lidt tid på manuelle opgaver.</p>",
"ADD": {
"TITLE": "Add Automation Rule",
"TITLE": "Tilføj Automatiseringsregel",
"SUBMIT": "Opret",
"CANCEL_BUTTON_TEXT": "Annuller",
"FORM": {
"NAME": {
"LABEL": "Rule Name",
"PLACEHOLDER": "Enter rule name",
"ERROR": "Name is required"
"LABEL": "Regel Navn",
"PLACEHOLDER": "Indtast regelnavn",
"ERROR": "Navn er påkrævet"
},
"DESC": {
"LABEL": "Beskrivelse",
"PLACEHOLDER": "Enter rule description",
"ERROR": "Description is required"
"PLACEHOLDER": "Indtast regel beskrivelse",
"ERROR": "Beskrivelse er påkrævet"
},
"EVENT": {
"LABEL": "Event",
"PLACEHOLDER": "Please select one",
"ERROR": "Event is required"
"LABEL": "Begivenhed",
"PLACEHOLDER": "Vælg venligst en",
"ERROR": "Begivenhed er påkrævet"
},
"CONDITIONS": {
"LABEL": "Conditions"
"LABEL": "Betingelser"
},
"ACTIONS": {
"LABEL": "Handlinger"
}
},
"CONDITION_BUTTON_LABEL": "Add Condition",
"ACTION_BUTTON_LABEL": "Add Action",
"CONDITION_BUTTON_LABEL": "Tilføj Betingelse",
"ACTION_BUTTON_LABEL": "Tilføj Handling",
"API": {
"SUCCESS_MESSAGE": "Automation rule added successfully",
"ERROR_MESSAGE": "Could not able to create a automation rule, Please try again later"
"SUCCESS_MESSAGE": "Automatiseringsregel tilføjet med succes",
"ERROR_MESSAGE": "Kunne ikke oprette en automatiseringsregel. Prøv igen senere"
}
},
"LIST": {
"TABLE_HEADER": [
"Navn",
"Beskrivelse",
"Active",
"Created on"
"Aktiv",
"Oprettet den"
],
"404": "No automation rules found"
"404": "Ingen automatiseringsregler fundet"
},
"DELETE": {
"TITLE": "Delete Automation Rule",
"TITLE": "Slet Automatiseringsregel",
"SUBMIT": "Slet",
"CANCEL_BUTTON_TEXT": "Annuller",
"CONFIRM": {
@ -58,24 +58,24 @@
"NO": "Nej, Behold "
},
"API": {
"SUCCESS_MESSAGE": "Automation rule deleted successfully",
"ERROR_MESSAGE": "Could not able to delete a automation rule, Please try again later"
"SUCCESS_MESSAGE": "Automatiseringsregel slettet",
"ERROR_MESSAGE": "Kunne ikke slette en automatiseringsregel, prøv igen senere"
}
},
"EDIT": {
"TITLE": "Edit Automation Rule",
"TITLE": "Rediger Automatiseringsregel",
"SUBMIT": "Opdater",
"CANCEL_BUTTON_TEXT": "Annuller",
"API": {
"SUCCESS_MESSAGE": "Automation rule updated successfully",
"ERROR_MESSAGE": "Could not update automation rule, Please try again later"
"SUCCESS_MESSAGE": "Automatiseringsregel opdateret",
"ERROR_MESSAGE": "Kunne ikke opdatere automatiseringsreglen. Prøv igen senere"
}
},
"CLONE": {
"TOOLTIP": "Clone",
"TOOLTIP": "Klon",
"API": {
"SUCCESS_MESSAGE": "Automation cloned successfully",
"ERROR_MESSAGE": "Could not clone automation rule, Please try again later"
"SUCCESS_MESSAGE": "Automatisering klonet med succes",
"ERROR_MESSAGE": "Kunne ikke klone automatiseringsreglen. Prøv igen senere"
}
},
"FORM": {
@ -83,34 +83,34 @@
"CREATE": "Opret",
"DELETE": "Slet",
"CANCEL": "Annuller",
"RESET_MESSAGE": "Changing event type will reset the conditions and events you have added below"
"RESET_MESSAGE": "Ændring af begivenhedstype vil nulstille de betingelser og begivenheder, du har tilføjet nedenfor"
},
"CONDITION": {
"DELETE_MESSAGE": "You need to have atleast one condition to save"
"DELETE_MESSAGE": "Du skal have mindst én betingelse for at gemme"
},
"ACTION": {
"DELETE_MESSAGE": "You need to have atleast one action to save",
"TEAM_MESSAGE_INPUT_PLACEHOLDER": "Enter your message here",
"TEAM_DROPDOWN_PLACEHOLDER": "Select teams"
"DELETE_MESSAGE": "Du skal have mindst én handling for at gemme",
"TEAM_MESSAGE_INPUT_PLACEHOLDER": "Indtast din besked her",
"TEAM_DROPDOWN_PLACEHOLDER": "Vælg teams"
},
"TOGGLE": {
"ACTIVATION_TITLE": "Activate Automation Rule",
"DEACTIVATION_TITLE": "Deactivate Automation Rule",
"ACTIVATION_DESCRIPTION": "This action will activate the automation rule '{automationName}'. Are you sure you want to proceed?",
"DEACTIVATION_DESCRIPTION": "This action will deactivate the automation rule '{automationName}'. Are you sure you want to proceed?",
"ACTIVATION_SUCCESFUL": "Automation Rule Activated Successfully",
"DEACTIVATION_SUCCESFUL": "Automation Rule Deactivated Successfully",
"ACTIVATION_ERROR": "Could not Activate Automation, Please try again later",
"DEACTIVATION_ERROR": "Could not Deactivate Automation, Please try again later",
"CONFIRMATION_LABEL": "Yes",
"CANCEL_LABEL": "No"
"ACTIVATION_TITLE": "Aktivér Automatiseringsregel",
"DEACTIVATION_TITLE": "Deaktiver Automatiseringsregel",
"ACTIVATION_DESCRIPTION": "Denne handling vil aktivere automatiseringsreglen '{automationName}'. Er du sikker på du vil fortsætte?",
"DEACTIVATION_DESCRIPTION": "Denne handling vil deaktivere automatiseringsreglen '{automationName}'. Er du sikker på du vil fortsætte?",
"ACTIVATION_SUCCESFUL": "Automatiseringsregel Aktiveret",
"DEACTIVATION_SUCCESFUL": "Automatiseringsregel Deaktiveret",
"ACTIVATION_ERROR": "Kunne ikke aktivere automatisering, prøv igen senere",
"DEACTIVATION_ERROR": "Kunne ikke deaktivere automatisering, prøv igen senere",
"CONFIRMATION_LABEL": "Ja",
"CANCEL_LABEL": "Nej"
},
"ATTACHMENT": {
"UPLOAD_ERROR": "Could not upload attachment, Please try again",
"LABEL_IDLE": "Upload Attachment",
"UPLOAD_ERROR": "Kunne ikke uploade vedhæftning, Prøv venligst igen",
"LABEL_IDLE": "Upload Vedhæftning",
"LABEL_UPLOADING": "Uploader...",
"LABEL_UPLOADED": "Succesfully Uploaded",
"LABEL_UPLOAD_FAILED": "Upload Failed"
"LABEL_UPLOADED": "Succesfuldt Uploadet",
"LABEL_UPLOAD_FAILED": "Upload Mislykkedes"
}
}
}

View file

@ -1,29 +1,29 @@
{
"BULK_ACTION": {
"CONVERSATIONS_SELECTED": "%{conversationCount} conversations selected",
"AGENT_SELECT_LABEL": "Select Agent",
"ASSIGN_CONFIRMATION_LABEL": "Are you sure you want to assign %{conversationCount} %{conversationLabel} to",
"GO_BACK_LABEL": "Go back",
"ASSIGN_LABEL": "Assign",
"ASSIGN_AGENT_TOOLTIP": "Assign Agent",
"ASSIGN_SUCCESFUL": "Conversations assigned successfully",
"ASSIGN_FAILED": "Failed to assign conversations, please try again",
"RESOLVE_SUCCESFUL": "Conversations resolved successfully",
"RESOLVE_FAILED": "Failed to resolve conversations, please try again",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Conversations visible on this page are only selected.",
"AGENT_LIST_LOADING": "Loading Agents",
"CONVERSATIONS_SELECTED": "%{conversationCount} samtaler valgt",
"AGENT_SELECT_LABEL": "Vælg Agent",
"ASSIGN_CONFIRMATION_LABEL": "Er du sikker på, at du vil tildele %{conversationCount} %{conversationLabel} til",
"GO_BACK_LABEL": "Gå tilbage",
"ASSIGN_LABEL": "Tildel",
"ASSIGN_AGENT_TOOLTIP": "Tildel Agent",
"ASSIGN_SUCCESFUL": "Samtaler tildelt",
"ASSIGN_FAILED": "Mislykkedes at tildele samtaler, prøv igen",
"RESOLVE_SUCCESFUL": "Samtaler løst med succes",
"RESOLVE_FAILED": "Mislykkedes at løse samtaler, prøv igen",
"ALL_CONVERSATIONS_SELECTED_ALERT": "Samtaler synlig på denne side er kun valgt.",
"AGENT_LIST_LOADING": "Indlæser Agenter",
"UPDATE": {
"CHANGE_STATUS": "Change status",
"SNOOZE_UNTIL_NEXT_REPLY": "Snooze until next reply",
"UPDATE_SUCCESFUL": "Conversation status updated successfully.",
"UPDATE_FAILED": "Failed to update conversations, please try again"
"CHANGE_STATUS": "Skift status",
"SNOOZE_UNTIL_NEXT_REPLY": "Udsæt til næste svar",
"UPDATE_SUCCESFUL": "Samtalens status blev opdateret.",
"UPDATE_FAILED": "Mislykkedes at opdatere samtaler, prøv igen"
},
"LABELS": {
"ASSIGN_LABELS": "Assign Labels",
"NO_LABELS_FOUND": "No labels found for",
"ASSIGN_SELECTED_LABELS": "Assign selected labels",
"ASSIGN_SUCCESFUL": "Labels assigned successfully",
"ASSIGN_FAILED": "Failed to assign labels, please try again"
"ASSIGN_LABELS": "Tildel Etiketter",
"NO_LABELS_FOUND": "Ingen etiketter fundet for",
"ASSIGN_SELECTED_LABELS": "Tildel valgte etiketter",
"ASSIGN_SUCCESFUL": "Etiketter tildelt med succes",
"ASSIGN_FAILED": "Kunne ikke tildele etiketter. Prøv igen"
}
}
}

View file

@ -1,65 +1,65 @@
{
"CAMPAIGN": {
"HEADER": "Campaigns",
"SIDEBAR_TXT": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations. Click on <b>Add Campaign</b> to create a new campaign. You can also edit or delete an existing campaign by clicking on the Edit or Delete button.",
"HEADER": "Kampagner",
"SIDEBAR_TXT": "Proaktive beskeder giver kunden mulighed for at sende udgående beskeder til deres kontakter, hvilket ville udløse flere samtaler. Klik på <b>Tilføj kampagne</b> for at oprette en ny kampagne. Du kan også redigere eller slette en eksisterende kampagne ved at klikke på Rediger eller Slet knappen.",
"HEADER_BTN_TXT": {
"ONE_OFF": "Create a one off campaign",
"ONGOING": "Create a ongoing campaign"
"ONE_OFF": "Opret en kampagne fra",
"ONGOING": "Opret en igangværende kampagne"
},
"ADD": {
"TITLE": "Create a campaign",
"DESC": "Proactive messages allow the customer to send outbound messages to their contacts which would trigger more conversations.",
"TITLE": "Opret en kampagne",
"DESC": "Proaktive beskeder giver kunden mulighed for at sende udgående beskeder til deres kontakter, hvilket ville udløse flere samtaler.",
"CANCEL_BUTTON_TEXT": "Annuller",
"CREATE_BUTTON_TEXT": "Opret",
"FORM": {
"TITLE": {
"LABEL": "Title",
"PLACEHOLDER": "Please enter the title of campaign",
"ERROR": "Title is required"
"LABEL": "Titel",
"PLACEHOLDER": "Indtast titlen på kampagnen",
"ERROR": "Titel er påkrævet"
},
"SCHEDULED_AT": {
"LABEL": "Scheduled time",
"PLACEHOLDER": "Please select the time",
"CONFIRM": "Confirm",
"ERROR": "Scheduled time is required"
"LABEL": "Planlagt tid",
"PLACEHOLDER": "Vælg venligst tid",
"CONFIRM": "Bekræft",
"ERROR": "Planlagt tid er påkrævet"
},
"AUDIENCE": {
"LABEL": "Audience",
"PLACEHOLDER": "Select the customer labels",
"ERROR": "Audience is required"
"LABEL": "Målgruppe",
"PLACEHOLDER": "Vælg kunde etiketter",
"ERROR": "Målgruppe er påkrævet"
},
"INBOX": {
"LABEL": "Select Inbox",
"PLACEHOLDER": "Select Inbox",
"ERROR": "Inbox is required"
"LABEL": "Vælg Indbakke",
"PLACEHOLDER": "Vælg Indbakke",
"ERROR": "Indbakke er påkrævet"
},
"MESSAGE": {
"LABEL": "Besked",
"PLACEHOLDER": "Please enter the message of campaign",
"ERROR": "Message is required"
"PLACEHOLDER": "Indtast venligst meddelelsen af kampagnen",
"ERROR": "Beskeden er påkrævet"
},
"SENT_BY": {
"LABEL": "Sent by",
"PLACEHOLDER": "Please select the the content of campaign",
"ERROR": "Sender is required"
"LABEL": "Sendt af",
"PLACEHOLDER": "Vælg venligst indholdet af kampagnen",
"ERROR": "Afsenderen er påkrævet"
},
"END_POINT": {
"LABEL": "URL",
"PLACEHOLDER": "Please enter the URL",
"PLACEHOLDER": "Indtast venligst URL",
"ERROR": "Angiv en gyldig URL"
},
"TIME_ON_PAGE": {
"LABEL": "Time on page(Seconds)",
"PLACEHOLDER": "Please enter the time",
"ERROR": "Time on page is required"
"LABEL": "Tid på side (sekunder)",
"PLACEHOLDER": "Indtast venligst tid",
"ERROR": "Tid på siden er påkrævet"
},
"ENABLED": "Enable campaign",
"TRIGGER_ONLY_BUSINESS_HOURS": "Trigger only during business hours",
"SUBMIT": "Add Campaign"
"ENABLED": "Aktiver kampagne",
"TRIGGER_ONLY_BUSINESS_HOURS": "Udløs kun i åbningstiden",
"SUBMIT": "Tilføj Kampagne"
},
"API": {
"SUCCESS_MESSAGE": "Campaign created successfully",
"ERROR_MESSAGE": "There was an error. Please try again."
"SUCCESS_MESSAGE": "Kampagne oprettet",
"ERROR_MESSAGE": "Der opstod en fejl. Prøv venligst igen."
}
},
"DELETE": {
@ -71,56 +71,56 @@
"NO": "Nej, Behold "
},
"API": {
"SUCCESS_MESSAGE": "Campaign deleted successfully",
"ERROR_MESSAGE": "Could not delete the campaign. Please try again later."
"SUCCESS_MESSAGE": "Kampagne slettet",
"ERROR_MESSAGE": "Kunne ikke slette kampagnen. Prøv igen senere."
}
},
"EDIT": {
"TITLE": "Edit campaign",
"TITLE": "Rediger kampagne",
"UPDATE_BUTTON_TEXT": "Opdater",
"API": {
"SUCCESS_MESSAGE": "Campaign updated successfully",
"SUCCESS_MESSAGE": "Kampagne opdateret",
"ERROR_MESSAGE": "Der opstod en fejl. Prøv venligst igen"
}
},
"LIST": {
"LOADING_MESSAGE": "Loading campaigns...",
"404": "There are no campaigns created for this inbox.",
"LOADING_MESSAGE": "Indlæser kampagner...",
"404": "Der er ingen kampagner oprettet for denne indbakke.",
"TABLE_HEADER": {
"TITLE": "Title",
"TITLE": "Titel",
"MESSAGE": "Besked",
"INBOX": "Inbox",
"INBOX": "Indbakke",
"STATUS": "Status",
"SENDER": "Sender",
"SENDER": "Afsender",
"URL": "URL",
"SCHEDULED_AT": "Scheduled time",
"TIME_ON_PAGE": "Time(Seconds)",
"CREATED_AT": "Created at"
"SCHEDULED_AT": "Planlagt tid",
"TIME_ON_PAGE": "Tid(sekunder)",
"CREATED_AT": "Oprettet den"
},
"BUTTONS": {
"ADD": "Add",
"ADD": "Tilføj",
"EDIT": "Rediger",
"DELETE": "Slet"
},
"STATUS": {
"ENABLED": "Aktiveret",
"DISABLED": "Deaktiveret",
"COMPLETED": "Completed",
"ACTIVE": "Active"
"COMPLETED": "Afsluttet",
"ACTIVE": "Aktiv"
},
"SENDER": {
"BOT": "Bot"
}
},
"ONE_OFF": {
"HEADER": "One off campaigns",
"404": "There are no one off campaigns created",
"INBOXES_NOT_FOUND": "Please create an sms inbox and start adding campaigns"
"HEADER": "Kampagner",
"404": "Der er ingen slukkede kampagner oprettet",
"INBOXES_NOT_FOUND": "Opret venligst en sms-indbakke og begynd at tilføje kampagner"
},
"ONGOING": {
"HEADER": "Ongoing campaigns",
"404": "There are no ongoing campaigns created",
"INBOXES_NOT_FOUND": "Please create an website inbox and start adding campaigns"
"HEADER": "Igangværende kampagner",
"404": "Der er ingen igangværende kampagner oprettet",
"INBOXES_NOT_FOUND": "Opret venligst en hjemmeside indbakke og begynd at tilføje kampagner"
}
}
}

View file

@ -4,7 +4,7 @@
"HEADER_BTN_TXT": "Tilføj Standardsvar",
"LOADING": "Henter Standardsvar",
"SEARCH_404": "Der er ingen elementer, der matcher denne forespørgsel",
"SIDEBAR_TXT": "<p><b>Canned Responses</b> </p><p> Canned Responses are saved reply templates which can be used to quickly send out a reply to a conversation. </p><p> For creating a Canned Response, just click on the <b>Add Canned Response</b>. You can also edit or delete an existing Canned Response by clicking on the Edit or Delete button </p><p> Canned responses are used with the help of <b>Short Codes</b>. Agents can access canned responses while on a chat by typing <b>'/'</b> followed by the short code. </p>",
"SIDEBAR_TXT": "<p><b>Standardsvar</b> </p><p> Standardsvar er gemte svarskabeloner, som kan bruges til hurtigt at sende et svar på en samtale. </p><p> For at oprette et standardsvar, klik blot på <b>Tilføj standardsvar</b>. Du kan også redigere eller slette et eksisterende standardsvar ved at klikke på Rediger eller Slet knappen </p><p> Standardsvar bruges ved hjælp af <b>Short Codes</b>. Agenter kan tilgå standardsvar på en chat ved at skrive <b>'/'</b> efterfulgt af din short code </p>",
"LIST": {
"404": "Der er ingen tilgængelige standardsvar på denne konto.",
"TITLE": "Administrer standardsvar",
@ -17,12 +17,12 @@
},
"ADD": {
"TITLE": "Tilføj Standardsvar",
"DESC": "Canned Responses are saved reply templates which can be used to quickly send out reply to conversation.",
"DESC": "Standardsvar er gemte svarskabeloner, som kan bruges til hurtigt at sende svar til samtalen.",
"CANCEL_BUTTON_TEXT": "Annuller",
"FORM": {
"SHORT_CODE": {
"LABEL": "Short Code",
"PLACEHOLDER": "Please enter a short code",
"PLACEHOLDER": "Indtast venligst en shortcode",
"ERROR": "Short Code er påkrævet"
},
"CONTENT": {

View file

@ -7,7 +7,7 @@
"404": "Der er ingen aktive samtaler i denne gruppe."
},
"TAB_HEADING": "Samtaler",
"MENTION_HEADING": "Mentions",
"MENTION_HEADING": "Omtaler",
"SEARCH": {
"INPUT": "Søg efter Mennesker, Chats, Gemte svar .."
},
@ -25,10 +25,10 @@
"TEXT": "Løst"
},
"pending": {
"TEXT": "Pending"
"TEXT": "Afventer"
},
"snoozed": {
"TEXT": "Snoozed"
"TEXT": "Udsat"
}
},
"ATTACHMENTS": {
@ -54,12 +54,12 @@
"RECEIVED_VIA_EMAIL": "Modtaget via e-mail",
"VIEW_TWEET_IN_TWITTER": "Se tweet på Twitter",
"REPLY_TO_TWEET": "Svar på dette tweet",
"LINK_TO_STORY": "Go to instagram story",
"SENT": "Sent successfully",
"NO_MESSAGES": "No Messages",
"NO_CONTENT": "No content available",
"HIDE_QUOTED_TEXT": "Hide Quoted Text",
"SHOW_QUOTED_TEXT": "Show Quoted Text",
"MESSAGE_READ": "Read"
"LINK_TO_STORY": "Gå til instagram historie",
"SENT": "Sendt med succes",
"NO_MESSAGES": "Ingen Beskeder",
"NO_CONTENT": "Intet tilgængeligt indhold",
"HIDE_QUOTED_TEXT": "Skjul Citeret Tekst",
"SHOW_QUOTED_TEXT": "Vis Citeret Tekst",
"MESSAGE_READ": "Læst"
}
}

View file

@ -3,39 +3,40 @@
"NOT_AVAILABLE": "Ikke Tilgængelig",
"EMAIL_ADDRESS": "E-Mail Adresse",
"PHONE_NUMBER": "Telefonnummer",
"IDENTIFIER": "Identifier",
"COPY_SUCCESSFUL": "Kopiering til udklipsholder lykkedes",
"COMPANY": "Virksomhed",
"LOCATION": "Lokation",
"BROWSER_LANGUAGE": "Browser Language",
"BROWSER_LANGUAGE": "Browser Sprog",
"CONVERSATION_TITLE": "Samtaledetaljer",
"VIEW_PROFILE": "View Profile",
"VIEW_PROFILE": "Vis Profil",
"BROWSER": "Browser",
"OS": "Operativsystem",
"INITIATED_FROM": "Startet fra",
"INITIATED_AT": "Startet fra",
"IP_ADDRESS": "IP Address",
"NEW_MESSAGE": "New message",
"IP_ADDRESS": "Ip Adresse",
"NEW_MESSAGE": "Ny besked",
"CONVERSATIONS": {
"NO_RECORDS_FOUND": "Der er ingen tidligere samtaler tilknyttet denne kontakt.",
"TITLE": "Tidligere Samtaler"
},
"LABELS": {
"CONTACT": {
"TITLE": "Contact Labels",
"ERROR": "Couldn't update labels"
"TITLE": "Kontakt Labels",
"ERROR": "Kunne ikke opdatere etiketter"
},
"CONVERSATION": {
"TITLE": "Samtale Etiketter",
"ADD_BUTTON": "Add Labels"
"ADD_BUTTON": "Tilføj Labels"
},
"LABEL_SELECT": {
"TITLE": "Add Labels",
"PLACEHOLDER": "Search labels",
"NO_RESULT": "No labels found"
"TITLE": "Tilføj Labels",
"PLACEHOLDER": "Søg efter labels",
"NO_RESULT": "Ingen labels fundet"
}
},
"MERGE_CONTACT": "Merge contact",
"CONTACT_ACTIONS": "Contact actions",
"MERGE_CONTACT": "Sammenflet kontakt",
"CONTACT_ACTIONS": "Kontakt handlinger",
"MUTE_CONTACT": "Gør Samtale Lydløs",
"UNMUTE_CONTACT": "Fjern Lydløs",
"MUTED_SUCCESS": "Denne samtale er gjort tavs i 6 timer",
@ -44,7 +45,7 @@
"EDIT_LABEL": "Rediger",
"SIDEBAR_SECTIONS": {
"CUSTOM_ATTRIBUTES": "Brugerdefinerede Egenskaber",
"CONTACT_LABELS": "Contact Labels",
"CONTACT_LABELS": "Kontakt Labels",
"PREVIOUS_CONVERSATIONS": "Tidligere Samtaler"
}
},
@ -54,35 +55,35 @@
"DESC": "Rediger kontaktoplysninger"
},
"CREATE_CONTACT": {
"BUTTON_LABEL": "New Contact",
"TITLE": "Create new contact",
"DESC": "Add basic information details about the contact."
"BUTTON_LABEL": "Ny Kontakt",
"TITLE": "Opret ny kontakt",
"DESC": "Tilføj grundlæggende oplysninger om kontakten."
},
"IMPORT_CONTACTS": {
"BUTTON_LABEL": "Import",
"TITLE": "Import Contacts",
"DESC": "Import contacts through a CSV file.",
"DOWNLOAD_LABEL": "Download a sample csv.",
"BUTTON_LABEL": "Importér",
"TITLE": "Importér Kontakter",
"DESC": "Importér kontakter via en CSV-fil.",
"DOWNLOAD_LABEL": "Download en prøve csv.",
"FORM": {
"LABEL": "CSV File",
"SUBMIT": "Import",
"LABEL": "CSV Fil",
"SUBMIT": "Importer",
"CANCEL": "Annuller"
},
"SUCCESS_MESSAGE": "Contacts saved successfully",
"SUCCESS_MESSAGE": "Kontakter gemt",
"ERROR_MESSAGE": "Der opstod en fejl. Prøv venligst igen"
},
"DELETE_NOTE": {
"CONFIRM": {
"TITLE": "Bekræft Sletning",
"MESSAGE": "Are you want sure to delete this note?",
"YES": "Yes, Delete it",
"MESSAGE": "Er du sikker på at slette denne note?",
"YES": "Ja, Slet",
"NO": "Nej, behold det"
}
},
"DELETE_CONTACT": {
"BUTTON_LABEL": "Delete Contact",
"TITLE": "Delete contact",
"DESC": "Delete contact details",
"BUTTON_LABEL": "Slet Kontakt",
"TITLE": "Slet kontakt",
"DESC": "Slet kontaktoplysninger",
"CONFIRM": {
"TITLE": "Bekræft Sletning",
"MESSAGE": "Er du sikker på du vil slette ",
@ -90,8 +91,8 @@
"NO": "Nej, Behold"
},
"API": {
"SUCCESS_MESSAGE": "Contact deleted successfully",
"ERROR_MESSAGE": "Could not delete contact. Please try again later."
"SUCCESS_MESSAGE": "Kontakten blev slettet",
"ERROR_MESSAGE": "Kunne ikke slette kontakten. Prøv igen senere."
}
},
"CONTACT_FORM": {
@ -118,9 +119,9 @@
"PHONE_NUMBER": {
"PLACEHOLDER": "Indtast telefonnummeret på kontaktpersonen",
"LABEL": "Telefonnummer",
"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",
"DUPLICATE": "This phone number is in use for another contact."
"HELP": "Telefonnummer skal være af E.164 format fx: +1415555555 [+] [landekode] [områdekode] [lokalt telefonnummer]",
"ERROR": "Telefonnummer skal være enten tomt eller i E.164-format",
"DUPLICATE": "Dette telefonnummer er i brug for en anden kontakt."
},
"LOCATION": {
"PLACEHOLDER": "Angiv placeringen af kontaktpersonen",
@ -151,30 +152,30 @@
},
"DELETE_AVATAR": {
"API": {
"SUCCESS_MESSAGE": "Contact avatar deleted successfully",
"ERROR_MESSAGE": "Could not delete the contact avatar. Please try again later."
"SUCCESS_MESSAGE": "Kontakt avatar slettet",
"ERROR_MESSAGE": "Kunne ikke slette kontakten avatar. Prøv igen senere."
}
},
"SUCCESS_MESSAGE": "Contact saved successfully",
"SUCCESS_MESSAGE": "Kontakt gemt med succes",
"ERROR_MESSAGE": "Der opstod en fejl. Prøv venligst igen"
},
"NEW_CONVERSATION": {
"BUTTON_LABEL": "Start conversation",
"TITLE": "New conversation",
"BUTTON_LABEL": "Start samtale",
"TITLE": "Ny samtale",
"DESC": "Start en samtale ved at sende en besked.",
"NO_INBOX": "Couldn't find an inbox to initiate a new conversation with this contact.",
"NO_INBOX": "Kunne ikke finde en indbakke til at starte en ny samtale med denne kontakt.",
"FORM": {
"TO": {
"LABEL": "To"
"LABEL": "Til"
},
"INBOX": {
"LABEL": "Inbox",
"ERROR": "Select an inbox"
"LABEL": "Indbakke",
"ERROR": "Vælg en indbakke"
},
"SUBJECT": {
"LABEL": "Subject",
"PLACEHOLDER": "Subject",
"ERROR": "Subject can't be empty"
"LABEL": "Emne",
"PLACEHOLDER": "Emne",
"ERROR": "Emne må ikke være tomt"
},
"MESSAGE": {
"LABEL": "Besked",
@ -190,157 +191,157 @@
},
"CONTACTS_PAGE": {
"HEADER": "Kontakter",
"FIELDS": "Contact fields",
"FIELDS": "Kontakt felter",
"SEARCH_BUTTON": "Søg",
"SEARCH_INPUT_PLACEHOLDER": "Søg efter kontakter",
"FILTER_CONTACTS": "Filter",
"FILTER_CONTACTS_SAVE": "Save filter",
"FILTER_CONTACTS_DELETE": "Delete filter",
"FILTER_CONTACTS": "Filtrer",
"FILTER_CONTACTS_SAVE": "Gem filter",
"FILTER_CONTACTS_DELETE": "Slet filter",
"LIST": {
"LOADING_MESSAGE": "Indlæser kontakter...",
"404": "Ingen kontakter matcher din søgning 🔍",
"NO_CONTACTS": "There are no available contacts",
"NO_CONTACTS": "Der er ingen tilgængelige kontakter",
"TABLE_HEADER": {
"NAME": "Navn",
"PHONE_NUMBER": "Telefonnummer",
"CONVERSATIONS": "Samtaler",
"LAST_ACTIVITY": "Last Activity",
"COUNTRY": "Country",
"CITY": "City",
"LAST_ACTIVITY": "Sidste Aktivitet",
"COUNTRY": "Land",
"CITY": "By",
"SOCIAL_PROFILES": "Social Profiles",
"COMPANY": "Virksomhed",
"EMAIL_ADDRESS": "E-Mail Adresse"
},
"VIEW_DETAILS": "View details"
"VIEW_DETAILS": "Se detaljer"
}
},
"CONTACT_PROFILE": {
"BACK_BUTTON": "Kontakter",
"LOADING": "Loading contact profile..."
"LOADING": "Indlæser kontaktprofil..."
},
"REMINDER": {
"ADD_BUTTON": {
"BUTTON": "Add",
"TITLE": "Shift + Enter to create a task"
"BUTTON": "Tilføj",
"TITLE": "Shift + Enter for at oprette en opgave"
},
"FOOTER": {
"DUE_DATE": "Due date",
"LABEL_TITLE": "Set type"
"DUE_DATE": "Forfaldsdato",
"LABEL_TITLE": "Angiv type"
}
},
"NOTES": {
"FETCHING_NOTES": "Fetching notes...",
"NOT_AVAILABLE": "There are no notes created for this contact",
"FETCHING_NOTES": "Henter noter...",
"NOT_AVAILABLE": "Der er ingen noter oprettet til denne kontakt",
"HEADER": {
"TITLE": "Notes"
"TITLE": "Noter"
},
"LIST": {
"LABEL": "added a note"
"LABEL": "tilføjede en note"
},
"ADD": {
"BUTTON": "Add",
"PLACEHOLDER": "Add a note",
"TITLE": "Shift + Enter to create a note"
"BUTTON": "Tilføj",
"PLACEHOLDER": "Tilføj en note",
"TITLE": "Skift + Enter for at oprette en note"
},
"CONTENT_HEADER": {
"DELETE": "Delete note"
"DELETE": "Slet note"
}
},
"EVENTS": {
"HEADER": {
"TITLE": "Activities"
"TITLE": "Aktiviteter"
},
"BUTTON": {
"PILL_BUTTON_NOTES": "notes",
"PILL_BUTTON_EVENTS": "events",
"PILL_BUTTON_NOTES": "noter",
"PILL_BUTTON_EVENTS": "begivenheder",
"PILL_BUTTON_CONVO": "samtaler"
}
},
"CUSTOM_ATTRIBUTES": {
"ADD_BUTTON_TEXT": "Add attributes",
"BUTTON": "Add custom attribute",
"NOT_AVAILABLE": "There are no custom attributes available for this contact.",
"ADD_BUTTON_TEXT": "Tilføj attributter",
"BUTTON": "Tilføj brugerdefineret attribut",
"NOT_AVAILABLE": "Der er ingen brugerdefinerede attributter tilgængelige for denne kontakt.",
"COPY_SUCCESSFUL": "Kopiering til udklipsholder lykkedes",
"ACTIONS": {
"COPY": "Copy attribute",
"DELETE": "Delete attribute",
"EDIT": "Edit attribute"
"COPY": "Kopier attribut",
"DELETE": "Slet egenskab",
"EDIT": "Rediger attribut"
},
"ADD": {
"TITLE": "Create custom attribute",
"DESC": "Add custom information to this contact."
"TITLE": "Opret brugerdefineret attribut",
"DESC": "Tilføj brugerdefineret information til denne kontakt."
},
"FORM": {
"CREATE": "Add attribute",
"CREATE": "Tilføj attribut",
"CANCEL": "Annuller",
"NAME": {
"LABEL": "Custom attribute name",
"PLACEHOLDER": "Eg: shopify id",
"ERROR": "Invalid custom attribute name"
"LABEL": "Brugerdefineret attributnavn",
"PLACEHOLDER": "F. eks.: shopify id",
"ERROR": "Ugyldigt brugerdefineret attributnavn"
},
"VALUE": {
"LABEL": "Attribute value",
"LABEL": "Egenskab værdi",
"PLACEHOLDER": "Eg: 11901 "
},
"ADD": {
"TITLE": "Create new attribute ",
"SUCCESS": "Attribute added successfully",
"ERROR": "Unable to add attribute. Please try again later"
"TITLE": "Opret ny egenskab ",
"SUCCESS": "Egenskab tilføjet",
"ERROR": "Kan ikke tilføje attribut. Prøv igen senere"
},
"UPDATE": {
"SUCCESS": "Attribute updated successfully",
"ERROR": "Unable to update attribute. Please try again later"
"SUCCESS": "Attributten er opdateret",
"ERROR": "Kan ikke opdatere attributten. Prøv igen senere"
},
"DELETE": {
"SUCCESS": "Attribute deleted successfully",
"ERROR": "Unable to delete attribute. Please try again later"
"SUCCESS": "Attributten blev slettet",
"ERROR": "Kan ikke slette attributten. Prøv igen senere"
},
"ATTRIBUTE_SELECT": {
"TITLE": "Add attributes",
"PLACEHOLDER": "Search attributes",
"NO_RESULT": "No attributes found"
"TITLE": "Tilføj attributter",
"PLACEHOLDER": "Søg attributter",
"NO_RESULT": "Ingen attributter fundet"
},
"ATTRIBUTE_TYPE": {
"LIST": {
"PLACEHOLDER": "Select value",
"SEARCH_INPUT_PLACEHOLDER": "Search value",
"NO_RESULT": "No result found"
"PLACEHOLDER": "Vælg værdi",
"SEARCH_INPUT_PLACEHOLDER": "Søg værdi",
"NO_RESULT": "Ingen resultater fundet"
}
}
},
"VALIDATIONS": {
"REQUIRED": "Valid value is required",
"INVALID_URL": "Invalid URL"
"REQUIRED": "Gyldig værdi er påkrævet",
"INVALID_URL": "Ugyldig URL"
}
},
"MERGE_CONTACTS": {
"TITLE": "Merge contacts",
"DESCRIPTION": "Merge contacts to combine two profiles into one, including all attributes and conversations. In case of conflict, the Primary contact s attributes will take precedence.",
"TITLE": "Sammenflet kontakter",
"DESCRIPTION": "Sammenflet kontakter for at kombinere to profiler til én, herunder alle attributter og samtaler. I tilfælde af konflikter vil den primære kontakts attributter have forrang.",
"PRIMARY": {
"TITLE": "Primary contact",
"HELP_LABEL": "To be kept"
"TITLE": "Primær kontakt",
"HELP_LABEL": "Skal opbevares"
},
"CHILD": {
"TITLE": "Contact to merge",
"PLACEHOLDER": "Search for a contact",
"HELP_LABEL": "To be deleted"
"TITLE": "Kontakt for sammenfletning",
"PLACEHOLDER": "Søg efter en kontakt",
"HELP_LABEL": "Skal slettes"
},
"SUMMARY": {
"TITLE": "Summary",
"DELETE_WARNING": "Contact of <strong>%{childContactName}</strong> will be deleted.",
"ATTRIBUTE_WARNING": "Contact details of <strong>%{childContactName}</strong> will be copied to <strong>%{primaryContactName}</strong>."
"TITLE": "Oversigt",
"DELETE_WARNING": "Kontakt af <strong>%{childContactName}</strong> vil blive slettet.",
"ATTRIBUTE_WARNING": "Kontaktoplysninger på <strong>%{childContactName}</strong> vil blive kopieret til <strong>%{primaryContactName}</strong>."
},
"SEARCH": {
"ERROR": "ERROR_MESSAGE"
"ERROR": "FEJL_MEDDELELSE"
},
"FORM": {
"SUBMIT": " Merge contacts",
"SUBMIT": " Sammenflet kontakter",
"CANCEL": "Annuller",
"CHILD_CONTACT": {
"ERROR": "Select a child contact to merge"
"ERROR": "Vælg en underordnet kontakt at flette"
},
"SUCCESS_MESSAGE": "Contact merged successfully",
"ERROR_MESSAGE": "Could not merge contacts, try again!"
"SUCCESS_MESSAGE": "Kontakt flettet med succes",
"ERROR_MESSAGE": "Kunne ikke sammenflette kontakter, prøv igen!"
}
}
}

View file

@ -1,49 +1,49 @@
{
"CONTACTS_FILTER": {
"TITLE": "Filter Contacts",
"SUBTITLE": "Add filters below and hit 'Submit' to filter contacts.",
"ADD_NEW_FILTER": "Add Filter",
"CLEAR_ALL_FILTERS": "Clear All Filters",
"FILTER_DELETE_ERROR": "You should have atleast one filter to save",
"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": "Clear Filters",
"EMPTY_VALUE_ERROR": "Value is required",
"TOOLTIP_LABEL": "Filter contacts",
"CLEAR_BUTTON_LABEL": "Ryd Filtre",
"EMPTY_VALUE_ERROR": "Værdi er påkrævet",
"TOOLTIP_LABEL": "Filtrer kontaktpersoner",
"QUERY_DROPDOWN_LABELS": {
"AND": "AND",
"OR": "OR"
"AND": "OG",
"OR": "ELLER"
},
"OPERATOR_LABELS": {
"equal_to": "Equal to",
"not_equal_to": "Not equal to",
"contains": "Contains",
"does_not_contain": "Does not contain",
"is_present": "Is present",
"is_not_present": "Is not present",
"is_greater_than": "Is greater than",
"is_lesser_than": "Is lesser than",
"days_before": "Is x days before"
"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": "City",
"COUNTRY": "Country",
"CUSTOM_ATTRIBUTE_LIST": "List",
"CUSTOM_ATTRIBUTE_TEXT": "Text",
"CUSTOM_ATTRIBUTE_NUMBER": "Number",
"CITY": "By",
"COUNTRY": "Land",
"CUSTOM_ATTRIBUTE_LIST": "Liste",
"CUSTOM_ATTRIBUTE_TEXT": "Tekst",
"CUSTOM_ATTRIBUTE_NUMBER": "Nummer",
"CUSTOM_ATTRIBUTE_LINK": "Link",
"CUSTOM_ATTRIBUTE_CHECKBOX": "Checkbox",
"CREATED_AT": "Created At",
"LAST_ACTIVITY": "Last Activity",
"REFERER_LINK": "Referrer link"
"CUSTOM_ATTRIBUTE_CHECKBOX": "Afkrydsningsfelt",
"CREATED_AT": "Oprettet Den",
"LAST_ACTIVITY": "Sidste Aktivitet",
"REFERER_LINK": "Link til reference"
},
"GROUPS": {
"STANDARD_FILTERS": "Standard Filters",
"ADDITIONAL_FILTERS": "Additional Filters",
"STANDARD_FILTERS": "Standard Filtre",
"ADDITIONAL_FILTERS": "Yderligere Filtre",
"CUSTOM_ATTRIBUTES": "Brugerdefinerede Egenskaber"
}
}

View file

@ -1,10 +1,11 @@
{
"CONVERSATION": {
"SELECT_A_CONVERSATION": "Vælg venligst en samtale fra venstre rude",
"404": "Sorry, we cannot find the conversation. Please try again",
"SWITCH_VIEW_LAYOUT": "Switch the layout",
"DASHBOARD_APP_TAB_MESSAGES": "Messages",
"UNVERIFIED_SESSION": "The identity of this user is not verified",
"CSAT_REPLY_MESSAGE": "Bedøm venligst samtalen",
"404": "Beklager, vi kan ikke finde samtalen. Prøv igen",
"SWITCH_VIEW_LAYOUT": "Skift layout",
"DASHBOARD_APP_TAB_MESSAGES": "Beskeder",
"UNVERIFIED_SESSION": "Identiteten af denne bruger er ikke bekræftet",
"NO_MESSAGE_1": "Åh oh! Det ser ud til, at der ikke er nogen beskeder fra kunder i din indbakke.",
"NO_MESSAGE_2": " for at sende en besked til din side!",
"NO_INBOX_1": "Hola! Det ser ud til, at du endnu ikke har tilføjet indbakker.",
@ -13,33 +14,33 @@
"SEARCH_MESSAGES": "Søg efter beskeder i samtaler",
"SEARCH": {
"TITLE": "Søg efter beskeder",
"RESULT_TITLE": "Search Results",
"RESULT_TITLE": "Søgeresultater",
"LOADING_MESSAGE": "Behandler data...",
"PLACEHOLDER": "Skriv tekst for at søge i beskeder",
"NO_MATCHING_RESULTS": "No results found."
"NO_MATCHING_RESULTS": "Ingen resultater fundet."
},
"UNREAD_MESSAGES": "Unread Messages",
"UNREAD_MESSAGE": "Unread Message",
"UNREAD_MESSAGES": "Ulæste Beskeder",
"UNREAD_MESSAGE": "Ulæst Besked",
"CLICK_HERE": "Klik her",
"LOADING_INBOXES": "Indlæser indbakker",
"LOADING_CONVERSATIONS": "Indlæser Samtaler",
"CANNOT_REPLY": "Du kan ikke svare på grund af",
"24_HOURS_WINDOW": "24 timers beskedvindue begrænsning",
"NOT_ASSIGNED_TO_YOU": "This conversation is not assigned to you. Would you like to assign this conversation to yourself?",
"ASSIGN_TO_ME": "Assign to me",
"TWILIO_WHATSAPP_CAN_REPLY": "You can only reply to this conversation using a template message due to",
"NOT_ASSIGNED_TO_YOU": "Denne samtale er ikke tildelt dig. Vil du tildele denne samtale til dig selv?",
"ASSIGN_TO_ME": "Tildel til mig",
"TWILIO_WHATSAPP_CAN_REPLY": "Du kan kun svare på denne samtale ved hjælp af en skabelon besked på grund af",
"TWILIO_WHATSAPP_24_HOURS_WINDOW": "24 timers beskedvindue begrænsning",
"SELECT_A_TWEET_TO_REPLY": "Please select a tweet to reply to.",
"SELECT_A_TWEET_TO_REPLY": "Vælg venligst et tweet at svare på.",
"REPLYING_TO": "Du svarer til:",
"REMOVE_SELECTION": "Fjern Markering",
"DOWNLOAD": "Download",
"UNKNOWN_FILE_TYPE": "Unknown File",
"UPLOADING_ATTACHMENTS": "Uploading attachments...",
"SUCCESS_DELETE_MESSAGE": "Message deleted successfully",
"FAIL_DELETE_MESSSAGE": "Couldn't delete message! Try again",
"NO_RESPONSE": "No response",
"RATING_TITLE": "Rating",
"FEEDBACK_TITLE": "Feedback",
"UNKNOWN_FILE_TYPE": "Ukendt Fil",
"UPLOADING_ATTACHMENTS": "Uploader vedhæftede filer...",
"SUCCESS_DELETE_MESSAGE": "Besked slettet",
"FAIL_DELETE_MESSSAGE": "Kunne ikke slette beskeden! Prøv igen",
"NO_RESPONSE": "Intet svar",
"RATING_TITLE": "Bedømmelse",
"FEEDBACK_TITLE": "Tilbagemelding",
"HEADER": {
"RESOLVE_ACTION": "Løs",
"REOPEN_ACTION": "Genåben",
@ -47,56 +48,56 @@
"OPEN": "Mere",
"CLOSE": "Luk",
"DETAILS": "detaljer",
"SNOOZED_UNTIL_TOMORROW": "Snoozed until tomorrow",
"SNOOZED_UNTIL_NEXT_WEEK": "Snoozed until next week",
"SNOOZED_UNTIL_NEXT_REPLY": "Snoozed until next reply"
"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 as pending",
"MARK_PENDING": "Markér som afventende",
"SNOOZE": {
"TITLE": "Snooze until",
"NEXT_REPLY": "Next reply",
"TOMORROW": "Tomorrow",
"NEXT_WEEK": "Next week"
"TITLE": "Udsæt til",
"NEXT_REPLY": "Næste svar",
"TOMORROW": "I Morgen",
"NEXT_WEEK": "Næste uge"
}
},
"CARD_CONTEXT_MENU": {
"PENDING": "Mark as pending",
"RESOLVED": "Mark as resolved",
"REOPEN": "Reopen conversation",
"PENDING": "Markér som afventende",
"RESOLVED": "Marker som løst",
"REOPEN": "Genåbn samtale",
"SNOOZE": {
"TITLE": "Snooze",
"NEXT_REPLY": "Until next reply",
"TOMORROW": "Until tomorrow",
"NEXT_WEEK": "Until next week"
"TITLE": "Udsæt",
"NEXT_REPLY": "Indtil næste svar",
"TOMORROW": "Indtil i morgen",
"NEXT_WEEK": "Indtil næste uge"
},
"ASSIGN_AGENT": "Assign agent",
"ASSIGN_LABEL": "Assign label",
"AGENTS_LOADING": "Loading agents...",
"ASSIGN_TEAM": "Assign team",
"ASSIGN_AGENT": "Tildel agent",
"ASSIGN_LABEL": "Tildel etiket",
"AGENTS_LOADING": "Indlæser agenter...",
"ASSIGN_TEAM": "Tildel team",
"API": {
"AGENT_ASSIGNMENT": {
"SUCCESFUL": "Conversation id %{conversationId} assigned to \"%{agentName}\"",
"FAILED": "Couldn't assign agent. Please try again."
"SUCCESFUL": "Samtale id %{conversationId} tildelt \"%{agentName}\"",
"FAILED": "Kunne ikke tildele agent. Prøv venligst igen."
},
"LABEL_ASSIGNMENT": {
"SUCCESFUL": "Assigned label #%{labelName} to conversation id %{conversationId}",
"FAILED": "Couldn't assign label. Please try again."
"SUCCESFUL": "Tildelt etiket #%{labelName} til samtale-id %{conversationId}",
"FAILED": "Kunne ikke tildele etiket. Prøv venligst igen."
},
"TEAM_ASSIGNMENT": {
"SUCCESFUL": "Assigned team \"%{team}\" to conversation id %{conversationId}",
"FAILED": "Couldn't assign team. Please try again."
"SUCCESFUL": "Tildelt team \"%{team}\" til samtale-id %{conversationId}",
"FAILED": "Kunne ikke tildele team. Prøv venligst igen."
}
}
},
"FOOTER": {
"MESSAGE_SIGN_TOOLTIP": "Message signature",
"ENABLE_SIGN_TOOLTIP": "Enable signature",
"DISABLE_SIGN_TOOLTIP": "Disable signature",
"MESSAGE_SIGN_TOOLTIP": "Besked signatur",
"ENABLE_SIGN_TOOLTIP": "Aktiver signatur",
"DISABLE_SIGN_TOOLTIP": "Deaktivér signatur",
"MSG_INPUT": "Shift + enter for ny linje. Start med '/' for at vælge et standardsvar.",
"PRIVATE_MSG_INPUT": "Shift + enter for ny linje. Dette vil kun være synligt for Agenter",
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Message signature is not configured, please configure it in profile settings.",
"CLICK_HERE": "Click here to update"
"MESSAGE_SIGNATURE_NOT_CONFIGURED": "Beskedsignatur er ikke konfigureret, konfigurer den i profilindstillinger.",
"CLICK_HERE": "Klik her for at opdatere"
},
"REPLYBOX": {
"REPLY": "Svar",
@ -104,53 +105,53 @@
"SEND": "Send",
"CREATE": "Tilføj Note",
"TWEET": "Tweet",
"TIP_FORMAT_ICON": "Show rich text editor",
"TIP_EMOJI_ICON": "Show emoji selector",
"TIP_ATTACH_ICON": "Attach files",
"TIP_AUDIORECORDER_ICON": "Record audio",
"TIP_AUDIORECORDER_PERMISSION": "Allow access to audio",
"TIP_AUDIORECORDER_ERROR": "Could not open the audio",
"ENTER_TO_SEND": "Enter to send",
"DRAG_DROP": "Drag and drop here to attach",
"START_AUDIO_RECORDING": "Start audio recording",
"STOP_AUDIO_RECORDING": "Stop audio recording",
"TIP_FORMAT_ICON": "Vis rig teksteditor",
"TIP_EMOJI_ICON": "Vis emoji-vælger",
"TIP_ATTACH_ICON": "Vedhæft filer",
"TIP_AUDIORECORDER_ICON": "Optag lyd",
"TIP_AUDIORECORDER_PERMISSION": "Tillad adgang til lyd",
"TIP_AUDIORECORDER_ERROR": "Kunne ikke åbne lyden",
"DRAG_DROP": "Træk og slip her for at vedhæfte",
"START_AUDIO_RECORDING": "Start lydoptagelse",
"STOP_AUDIO_RECORDING": "Stop lydoptagelse",
"": "",
"EMAIL_HEAD": {
"ADD_BCC": "Add bcc",
"ADD_BCC": "Tilføj bcc",
"CC": {
"LABEL": "CC",
"PLACEHOLDER": "Emails separated by commas",
"ERROR": "Please enter valid email addresses"
"PLACEHOLDER": "E-mails adskilt af kommaer",
"ERROR": "Indtast venligst gyldige e-mailadresser"
},
"BCC": {
"LABEL": "BCC",
"PLACEHOLDER": "Emails separated by commas",
"ERROR": "Please enter valid email addresses"
"PLACEHOLDER": "E-mails adskilt af kommaer",
"ERROR": "Indtast venligst gyldige e-mailadresser"
}
}
},
"VISIBLE_TO_AGENTS": "Privat Note: Kun synlig for dig og dit team",
"CHANGE_STATUS": "Samtalestatus ændret",
"CHANGE_STATUS_FAILED": "Conversation status change failed",
"CHANGE_STATUS_FAILED": "Ændring af samtale status mislykkedes",
"CHANGE_AGENT": "Samtaleansvarlig ændret",
"CHANGE_AGENT_FAILED": "Assignee change failed",
"ASSIGN_LABEL_SUCCESFUL": "Label assigned successfully",
"ASSIGN_LABEL_FAILED": "Label assignment failed",
"CHANGE_TEAM": "Conversation team changed",
"FILE_SIZE_LIMIT": "File exceeds the {MAXIMUM_FILE_UPLOAD_SIZE} attachment limit",
"MESSAGE_ERROR": "Unable to send this message, please try again later",
"SENT_BY": "Sent by:",
"CHANGE_AGENT_FAILED": "Ændring af ansvarlig mislykkedes",
"ASSIGN_LABEL_SUCCESFUL": "Label tildelt",
"ASSIGN_LABEL_FAILED": "Tildeling af etiket mislykkedes",
"CHANGE_TEAM": "Samtaleholdet er ændret",
"FILE_SIZE_LIMIT": "Filen overskrider grænsen på {MAXIMUM_SUPPORTED_FILE_UPLOAD_SIZE} for vedhæftede filer",
"MESSAGE_ERROR": "Kunne ikke sende denne besked, prøv igen senere",
"SENT_BY": "Sendt af:",
"BOT": "Bot",
"SEND_FAILED": "Couldn't send message! Try again",
"TRY_AGAIN": "retry",
"SEND_FAILED": "Kunne ikke sende besked! Prøv igen",
"TRY_AGAIN": "prøv igen",
"ASSIGNMENT": {
"SELECT_AGENT": "Select Agent",
"SELECT_AGENT": "Vælg Agent",
"REMOVE": "Fjern",
"ASSIGN": "Assign"
"ASSIGN": "Tildel"
},
"CONTEXT_MENU": {
"COPY": "Kopiér",
"DELETE": "Slet"
"DELETE": "Slet",
"CREATE_A_CANNED_RESPONSE": "Add to canned responses"
}
},
"EMAIL_TRANSCRIPT": {
@ -171,71 +172,71 @@
}
},
"ONBOARDING": {
"TITLE": "Hey 👋, Welcome to %{installationName}!",
"DESCRIPTION": "Thanks for signing up. We want you to get the most out of %{installationName}. Here are a few things you can do in %{installationName} to make the experience delightful.",
"READ_LATEST_UPDATES": "Read our latest updates",
"TITLE": "Hej 👋, Velkommen til %{installationName}!",
"DESCRIPTION": "Tak for din tilmelding. Vi vil have dig til at få mest muligt ud af %{installationName}. Her er et par ting, du kan gøre i %{installationName} for at gøre oplevelsen dejlig.",
"READ_LATEST_UPDATES": "Læs vores seneste opdateringer",
"ALL_CONVERSATION": {
"TITLE": "All your conversations in one place",
"DESCRIPTION": "View all the conversations from your customers in one single dashboard. You can filter the conversations by the incoming channel, label and status."
"TITLE": "Alle dine samtaler på ét sted",
"DESCRIPTION": "Se alle samtaler fra dine kunder på et enkelt betjeningspanel. Du kan filtrere samtaler efter indgående kanal, etiket og status."
},
"TEAM_MEMBERS": {
"TITLE": "Invite your team members",
"DESCRIPTION": "Since you are getting ready to talk to your customer, bring in your teammates to assist you. You can invite your teammates by adding their email addresses to the agent list.",
"NEW_LINK": "Click here to invite a team member"
"TITLE": "Inviter dine teammedlemmer",
"DESCRIPTION": "Da du er ved at blive klar til at tale med din kunde, skal du medbringe dine holdkammerater for at hjælpe dig. Du kan invitere dine holdkammerater ved at tilføje deres e-mailadresser til agentlisten.",
"NEW_LINK": "Klik her for at invitere et teammedlem"
},
"INBOXES": {
"TITLE": "Connect Inboxes",
"DESCRIPTION": "Connect various channels through which your customers would be talking to you. It can be a website live-chat, your Facebook or Twitter page or even your WhatsApp number.",
"NEW_LINK": "Click here to create an inbox"
"TITLE": "Forbind Indbakker",
"DESCRIPTION": "Tilslut forskellige kanaler, hvorigennem dine kunder ville tale med dig. Det kan være en hjemmeside live-chat, din Facebook eller Twitter side eller endda dit WhatsApp nummer.",
"NEW_LINK": "Klik her for at oprette en indbakke"
},
"LABELS": {
"TITLE": "Organize conversations with labels",
"DESCRIPTION": "Labels provide an easier way to categorize your conversation. Create some labels like #support-enquiry, #billing-question etc., so that you can use them in a conversation later.",
"NEW_LINK": "Click here to create tags"
"TITLE": "Organiser samtaler med etiketter",
"DESCRIPTION": "Etiketter giver en lettere måde at kategorisere din samtale. Opret nogle etiketter som #support-forespørgsel, #billing-spørgsmål osv., så du kan bruge dem i en samtale senere.",
"NEW_LINK": "Klik her for at oprette tags"
}
},
"CONVERSATION_SIDEBAR": {
"ASSIGNEE_LABEL": "Assigned Agent",
"SELF_ASSIGN": "Assign to me",
"TEAM_LABEL": "Assigned Team",
"ASSIGNEE_LABEL": "Tildelt Agent",
"SELF_ASSIGN": "Tildel til mig",
"TEAM_LABEL": "Tildelt Team",
"SELECT": {
"PLACEHOLDER": "None"
"PLACEHOLDER": "Ingen"
},
"ACCORDION": {
"CONTACT_DETAILS": "Contact Details",
"CONVERSATION_ACTIONS": "Conversation Actions",
"CONTACT_DETAILS": "Kontaktoplysninger",
"CONVERSATION_ACTIONS": "Samtale Handlinger",
"CONVERSATION_LABELS": "Samtale Etiketter",
"CONVERSATION_INFO": "Conversation Information",
"CONTACT_ATTRIBUTES": "Contact Attributes",
"CONVERSATION_INFO": "Samtale Information",
"CONTACT_ATTRIBUTES": "Kontakt Attributter",
"PREVIOUS_CONVERSATION": "Tidligere Samtaler"
}
},
"CONVERSATION_CUSTOM_ATTRIBUTES": {
"ADD_BUTTON_TEXT": "Create attribute",
"ADD_BUTTON_TEXT": "Opret ny egenskab",
"UPDATE": {
"SUCCESS": "Attribute updated successfully",
"ERROR": "Unable to update attribute. Please try again later"
"SUCCESS": "Attributten er opdateret",
"ERROR": "Kan ikke opdatere attributten. Prøv igen senere"
},
"ADD": {
"TITLE": "Add",
"SUCCESS": "Attribute added successfully",
"ERROR": "Unable to add attribute. Please try again later"
"TITLE": "Tilføj",
"SUCCESS": "Egenskab tilføjet",
"ERROR": "Kan ikke tilføje attribut. Prøv igen senere"
},
"DELETE": {
"SUCCESS": "Attribute deleted successfully",
"ERROR": "Unable to delete attribute. Please try again later"
"SUCCESS": "Attributten blev slettet",
"ERROR": "Kan ikke slette attributten. Prøv igen senere"
},
"ATTRIBUTE_SELECT": {
"TITLE": "Add attributes",
"PLACEHOLDER": "Search attributes",
"NO_RESULT": "No attributes found"
"TITLE": "Tilføj attributter",
"PLACEHOLDER": "Søg attributter",
"NO_RESULT": "Ingen attributter fundet"
}
},
"EMAIL_HEADER": {
"FROM": "From",
"TO": "To",
"FROM": "Fra",
"TO": "Til",
"BCC": "Bcc",
"CC": "Cc",
"SUBJECT": "Subject"
"SUBJECT": "Emne"
}
}

View file

@ -1,6 +1,6 @@
{
"CSAT": {
"TITLE": "Rate your conversation",
"PLACEHOLDER": "Tell us more..."
"TITLE": "Bedøm din samtale",
"PLACEHOLDER": "Fortæl os mere..."
}
}

View file

@ -14,8 +14,8 @@
"NOTE": ""
},
"ACCOUNT_ID": {
"TITLE": "Account ID",
"NOTE": "This ID is required if you are building an API based integration"
"TITLE": "Konto SID",
"NOTE": "Dette ID er påkrævet, hvis du bygger en API-baseret integration"
},
"NAME": {
"LABEL": "Kontonavn",
@ -40,36 +40,36 @@
"AUTO_RESOLVE_DURATION": {
"LABEL": "Antal dage efter en ticket skal løses automatisk, hvis der ikke er nogen aktivitet",
"PLACEHOLDER": "30",
"ERROR": "Please enter a valid auto resolve duration (minimum 1 day and maximum 999 days)"
"ERROR": "Please enter a valid auto resolve duration (minimum 1 dag og maksimum 999 dage)"
},
"FEATURES": {
"INBOUND_EMAIL_ENABLED": "Samtale kontinuitet med e-mails er aktiveret for din konto.",
"CUSTOM_EMAIL_DOMAIN_ENABLED": "Du kan modtage e-mails på dit brugerdefinerede domæne nu."
}
},
"UPDATE_CHATWOOT": "An update %{latestChatwootVersion} for Chatwoot is available. Please update your instance.",
"LEARN_MORE": "Learn more"
"UPDATE_CHATWOOT": "En opdatering %{latestChatwootVersion} til Chatwoot er tilgængelig. Opdater venligst din instans.",
"LEARN_MORE": "Lær mere"
},
"FORMS": {
"MULTISELECT": {
"ENTER_TO_SELECT": "Press enter to select",
"ENTER_TO_REMOVE": "Press enter to remove",
"SELECT_ONE": "Select one"
"ENTER_TO_SELECT": "Tryk enter for at vælge",
"ENTER_TO_REMOVE": "Tryk enter for at fjerne",
"SELECT_ONE": "Vælg en"
}
},
"NOTIFICATIONS_PAGE": {
"HEADER": "Notifications",
"MARK_ALL_DONE": "Mark All Done",
"DELETE_TITLE": "deleted",
"HEADER": "Notifikationer",
"MARK_ALL_DONE": "Markér Alle Udførte",
"DELETE_TITLE": "slettet",
"UNREAD_NOTIFICATION": {
"TITLE": "Unread Notifications",
"ALL_NOTIFICATIONS": "View all notifications",
"LOADING_UNREAD_MESSAGE": "Loading unread notifications...",
"EMPTY_MESSAGE": "You have no unread notifications"
"TITLE": "Ulæste Notifikationer",
"ALL_NOTIFICATIONS": "Se alle notifikationer",
"LOADING_UNREAD_MESSAGE": "Indlæser ulæste notifikationer...",
"EMPTY_MESSAGE": "Du har ingen ulæste notifikationer"
},
"LIST": {
"LOADING_MESSAGE": "Loading notifications...",
"404": "No Notifications",
"LOADING_MESSAGE": "Indlæser notifikationer...",
"404": "Ingen Notifikationer",
"TABLE_HEADER": [
"Navn",
"Telefonnummer",
@ -78,63 +78,63 @@
]
},
"TYPE_LABEL": {
"conversation_creation": "New conversation",
"conversation_assignment": "Conversation Assigned",
"assigned_conversation_new_message": "New Message",
"conversation_mention": "Mention"
"conversation_creation": "Ny samtale",
"conversation_assignment": "Samtale Tildelt",
"assigned_conversation_new_message": "Ny Besked",
"conversation_mention": "Omtale"
}
},
"NETWORK": {
"NOTIFICATION": {
"TEXT": "Disconnected from Chatwoot"
"TEXT": "Afbrudt fra Chatwoot"
},
"BUTTON": {
"REFRESH": "Refresh"
"REFRESH": "Opdater"
}
},
"COMMAND_BAR": {
"SEARCH_PLACEHOLDER": "Search or jump to",
"SEARCH_PLACEHOLDER": "Søg eller hop til",
"SECTIONS": {
"GENERAL": "General",
"GENERAL": "Generelt",
"REPORTS": "Rapporter",
"CONVERSATION": "Conversation",
"CHANGE_ASSIGNEE": "Change Assignee",
"CHANGE_TEAM": "Change Team",
"ADD_LABEL": "Add label to the conversation",
"REMOVE_LABEL": "Remove label from the conversation",
"CONVERSATION": "Samtale",
"CHANGE_ASSIGNEE": "Skift Modtager",
"CHANGE_TEAM": "Skift Team",
"ADD_LABEL": "Tilføj etiket til samtalen",
"REMOVE_LABEL": "Fjern etiket fra samtalen",
"SETTINGS": "Indstillinger"
},
"COMMANDS": {
"GO_TO_CONVERSATION_DASHBOARD": "Go to Conversation Dashboard",
"GO_TO_CONTACTS_DASHBOARD": "Go to Contacts Dashboard",
"GO_TO_REPORTS_OVERVIEW": "Go to Reports Overview",
"GO_TO_CONVERSATION_REPORTS": "Go to Conversation Reports",
"GO_TO_AGENT_REPORTS": "Go to Agent Reports",
"GO_TO_LABEL_REPORTS": "Go to Label Reports",
"GO_TO_INBOX_REPORTS": "Go to Inbox Reports",
"GO_TO_TEAM_REPORTS": "Go to Team Reports",
"GO_TO_SETTINGS_AGENTS": "Go to Agent Settings",
"GO_TO_SETTINGS_TEAMS": "Go to Team Settings",
"GO_TO_SETTINGS_INBOXES": "Go to Inbox Settings",
"GO_TO_SETTINGS_LABELS": "Go to Label Settings",
"GO_TO_SETTINGS_CANNED_RESPONSES": "Go to Canned Response Settings",
"GO_TO_SETTINGS_APPLICATIONS": "Go to Application Settings",
"GO_TO_SETTINGS_ACCOUNT": "Go to Account Settings",
"GO_TO_SETTINGS_PROFILE": "Go to Profile Settings",
"GO_TO_NOTIFICATIONS": "Go to Notifications",
"ADD_LABELS_TO_CONVERSATION": "Add label to the conversation",
"ASSIGN_AN_AGENT": "Assign an agent",
"ASSIGN_A_TEAM": "Assign a team",
"MUTE_CONVERSATION": "Mute conversation",
"UNMUTE_CONVERSATION": "Unmute conversation",
"REMOVE_LABEL_FROM_CONVERSATION": "Remove label from the conversation",
"REOPEN_CONVERSATION": "Reopen conversation",
"RESOLVE_CONVERSATION": "Resolve conversation",
"SEND_TRANSCRIPT": "Send an email transcript",
"SNOOZE_CONVERSATION": "Snooze Conversation",
"UNTIL_NEXT_REPLY": "Until next reply",
"UNTIL_NEXT_WEEK": "Until next week",
"UNTIL_TOMORROW": "Until tomorrow"
"GO_TO_CONVERSATION_DASHBOARD": "Gå til Konversationspanel",
"GO_TO_CONTACTS_DASHBOARD": "Gå til Contacts Dashboard",
"GO_TO_REPORTS_OVERVIEW": "Gå til Oversigt over rapporter",
"GO_TO_CONVERSATION_REPORTS": "Gå til Konversationsrapporter",
"GO_TO_AGENT_REPORTS": "Gå til Agent rapporter",
"GO_TO_LABEL_REPORTS": "Gå til Label rapporter",
"GO_TO_INBOX_REPORTS": "Gå til Indbakke Rapporter",
"GO_TO_TEAM_REPORTS": "Gå til holdrapporter",
"GO_TO_SETTINGS_AGENTS": "Gå til Agent indstillinger",
"GO_TO_SETTINGS_TEAMS": "Gå til teamindstillinger",
"GO_TO_SETTINGS_INBOXES": "Gå til Indbakkeindstillinger",
"GO_TO_SETTINGS_LABELS": "Gå til Label indstillinger",
"GO_TO_SETTINGS_CANNED_RESPONSES": "Gå til Indstillinger for scannede svar",
"GO_TO_SETTINGS_APPLICATIONS": "Gå til programindstillinger",
"GO_TO_SETTINGS_ACCOUNT": "Gå til kontoindstillinger",
"GO_TO_SETTINGS_PROFILE": "Gå til profilindstillinger",
"GO_TO_NOTIFICATIONS": "Gå til Notifikationer",
"ADD_LABELS_TO_CONVERSATION": "Tilføj etiket til samtalen",
"ASSIGN_AN_AGENT": "Tildel en agent",
"ASSIGN_A_TEAM": "Tildel et team",
"MUTE_CONVERSATION": "Gør samtale lydløs",
"UNMUTE_CONVERSATION": "Fjern samtale",
"REMOVE_LABEL_FROM_CONVERSATION": "Fjern etiket fra samtalen",
"REOPEN_CONVERSATION": "Genåbn samtale",
"RESOLVE_CONVERSATION": "Løs samtale",
"SEND_TRANSCRIPT": "Send en e-mail udskrift",
"SNOOZE_CONVERSATION": "Udsæt Samtale",
"UNTIL_NEXT_REPLY": "Indtil næste svar",
"UNTIL_NEXT_WEEK": "Indtil næste uge",
"UNTIL_TOMORROW": "Indtil i morgen"
}
}
}

View file

@ -1,267 +1,409 @@
{
"HELP_CENTER": {
"HEADER": {
"FILTER": "Filter by",
"SORT": "Sort by",
"FILTER": "Filtrer efter",
"SORT": "Sorter efter",
"SETTINGS_BUTTON": "Indstillinger",
"NEW_BUTTON": "New Article",
"NEW_BUTTON": "Ny Artikel",
"DROPDOWN_OPTIONS": {
"PUBLISHED": "Published",
"DRAFT": "Draft",
"ARCHIVED": "Archived"
"PUBLISHED": "Publiceret",
"DRAFT": "Kladde",
"ARCHIVED": "Arkiveret"
},
"TITLES": {
"ALL_ARTICLES": "All Articles",
"MINE": "My Articles",
"DRAFT": "Draft Articles",
"ARCHIVED": "Archived Articles"
"ALL_ARTICLES": "Alle Artikler",
"MINE": "Alle Artikler",
"DRAFT": "Kladde Artikler",
"ARCHIVED": "Arkiverede Artikler"
}
},
"EDIT_HEADER": {
"ALL_ARTICLES": "All Articles",
"PUBLISH_BUTTON": "Publish",
"PREVIEW": "Preview",
"ADD_TRANSLATION": "Add translation",
"OPEN_SIDEBAR": "Open sidebar",
"CLOSE_SIDEBAR": "Close sidebar",
"SAVING": "Saving...",
"SAVED": "Saved"
"ALL_ARTICLES": "Alle Artikler",
"PUBLISH_BUTTON": "Udgiv",
"MOVE_TO_ARCHIVE_BUTTON": "Flyt til arkiveret",
"PREVIEW": "Eksempelvisning",
"ADD_TRANSLATION": "Tilføj oversættelse",
"OPEN_SIDEBAR": "Åbn sidepanel",
"CLOSE_SIDEBAR": "Luk sidepanel",
"SAVING": "Gemmer...",
"SAVED": "Gemt"
},
"ARTICLE_SETTINGS": {
"TITLE": "Article Settings",
"TITLE": "Artikel Indstillinger",
"FORM": {
"CATEGORY": {
"LABEL": "Category",
"TITLE": "Select category",
"PLACEHOLDER": "Select category",
"NO_RESULT": "No category found",
"SEARCH_PLACEHOLDER": "Search category"
"LABEL": "Kategori",
"TITLE": "Vælg kategori",
"PLACEHOLDER": "Vælg kategori",
"NO_RESULT": "Ingen kategori fundet",
"SEARCH_PLACEHOLDER": "Søg kategori"
},
"AUTHOR": {
"LABEL": "Author",
"TITLE": "Select author",
"PLACEHOLDER": "Select author",
"NO_RESULT": "No authors found",
"SEARCH_PLACEHOLDER": "Search author"
"LABEL": "Forfatter",
"TITLE": "Vælg forfatter",
"PLACEHOLDER": "Vælg forfatter",
"NO_RESULT": "Ingen forfattere fundet",
"SEARCH_PLACEHOLDER": "Søg efter forfatter"
},
"META_TITLE": {
"LABEL": "Meta title",
"LABEL": "Meta titel",
"PLACEHOLDER": "Add a meta title"
},
"META_DESCRIPTION": {
"LABEL": "Meta description",
"PLACEHOLDER": "Add your meta description for better SEO results..."
"LABEL": "Meta beskrivelse",
"PLACEHOLDER": "Tilføj din meta beskrivelse for bedre SEO resultater..."
},
"META_TAGS": {
"LABEL": "Meta tags",
"PLACEHOLDER": "Add meta tags separated by comma..."
"PLACEHOLDER": "Tilføj meta-tags adskilt af komma..."
}
},
"BUTTONS": {
"ARCHIVE": "Archive article",
"DELETE": "Delete article"
"ARCHIVE": "Arkiv artikel",
"DELETE": "Slet artikel"
}
},
"PORTAL": {
"HEADER": "Portals",
"NEW_BUTTON": "New Portal",
"ACTIVE_BADGE": "active",
"CHOOSE_LOCALE_LABEL": "Choose a locale",
"LOADING_MESSAGE": "Loading portals...",
"ARTICLES_LABEL": "articles",
"NO_PORTALS_MESSAGE": "There are no available portals",
"ADD_NEW_LOCALE": "Add a new locale",
"DEFAULT": "Standard",
"NEW_BUTTON": "Ny Portal",
"ACTIVE_BADGE": "aktiv",
"CHOOSE_LOCALE_LABEL": "Vælg en landestandard",
"LOADING_MESSAGE": "Indlæser portaler...",
"ARTICLES_LABEL": "artikler",
"NO_PORTALS_MESSAGE": "Der er ingen tilgængelige portaler",
"ADD_NEW_LOCALE": "Tilføj en ny landestandard",
"POPOVER": {
"TITLE": "Portals",
"PORTAL_SETTINGS": "Portal settings",
"SUBTITLE": "You have multiple portals and can have different locales for each portal.",
"PORTAL_SETTINGS": "Portal indstillinger",
"SUBTITLE": "Du har flere portaler og kan have forskellige landestandarder for hver portal.",
"CANCEL_BUTTON_LABEL": "Annuller",
"CHOOSE_LOCALE_BUTTON": "Choose Locale"
"CHOOSE_LOCALE_BUTTON": "Vælg Landestandard"
},
"PORTAL_SETTINGS": {
"LIST_ITEM": {
"HEADER": {
"COUNT_LABEL": "articles",
"ADD": "Add locale",
"VISIT": "Visit site",
"SETTINGS": "Indstillinger"
"COUNT_LABEL": "artikler",
"ADD": "Tilføj landestandard",
"VISIT": "Besøg websted",
"SETTINGS": "Indstillinger",
"DELETE": "Slet"
},
"PORTAL_CONFIG": {
"TITLE": "Portal Configurations",
"TITLE": "Portal Konfigurationer",
"ITEMS": {
"NAME": "Navn",
"DOMAIN": "Custom domain",
"SLUG": "Slug",
"TITLE": "Portal title",
"THEME": "Theme color",
"SUB_TEXT": "Portal sub text"
"DOMAIN": "Tilpasset domæne",
"SLUG": "Snegl",
"TITLE": "Portal titel",
"THEME": "Tema farve",
"SUB_TEXT": "Portal undertekst"
}
},
"AVAILABLE_LOCALES": {
"TITLE": "Available locales",
"TITLE": "Tilgængelige landestandarder",
"TABLE": {
"NAME": "Locale name",
"CODE": "Locale code",
"ARTICLE_COUNT": "No. of articles",
"CATEGORIES": "No. of categories",
"SWAP": "Swap",
"NAME": "Landestandard navn",
"CODE": "Landestandard kode",
"ARTICLE_COUNT": "Antal varer",
"CATEGORIES": "Antal kategorier",
"SWAP": "Byt",
"DELETE": "Slet",
"DEFAULT_LOCALE": "Default"
"DEFAULT_LOCALE": "Standard"
}
}
},
"DELETE_PORTAL": {
"TITLE": "Slet portal",
"MESSAGE": "Er du sikker på du vil slette denne portal",
"YES": "Ja, slet portal",
"NO": "Nej, behold portal",
"API": {
"DELETE_SUCCESS": "Portal slettet",
"DELETE_ERROR": "Fejl under sletning af portal"
}
}
},
"EDIT": {
"HEADER_TEXT": "Rediger portal",
"TABS": {
"BASIC_SETTINGS": {
"TITLE": "Grundlæggende oplysninger"
},
"CUSTOMIZATION_SETTINGS": {
"TITLE": "Tilpasning af portal"
},
"CATEGORY_SETTINGS": {
"TITLE": "Kategorier"
},
"LOCALE_SETTINGS": {
"TITLE": "Locales"
}
},
"CATEGORIES": {
"TITLE": "Kategorier i",
"NEW_CATEGORY": "Ny kategori",
"TABLE": {
"NAME": "Navn",
"DESCRIPTION": "Beskrivelse",
"LOCALE": "Landestandard",
"ARTICLE_COUNT": "Antal varer",
"ACTION_BUTTON": {
"EDIT": "Rediger kategori",
"DELETE": "Slet kategori"
},
"EMPTY_TEXT": "Ingen kategorier fundet"
}
},
"EDIT_BASIC_INFO": {
"BUTTON_TEXT": "Opdater grundlæggende indstillinger"
}
},
"ADD": {
"CREATE_FLOW": [
{
"title": "Help center information",
"title": "Information om hjælpecenter",
"route": "new_portal_information",
"body": "Basic information about portal",
"CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
"body": "Grundlæggende oplysninger om portal",
"CREATE_BASIC_SETTING_BUTTON": "Opret grundlæggende portal indstillinger"
},
{
"title": "Help center customization",
"route": "portal_customization",
"body": "Customize portal",
"UPDATE_PORTAL_BUTTON": "Update portal settings"
"title": "Tilpasning af hjælpecenter",
"route": "portal_tilpasning",
"body": "Tilpas portal",
"UPDATE_PORTAL_BUTTON": "Opdater portalindstillinger"
},
{
"title": "Voila! 🎉",
"route": "portal_finish",
"body": "You're all set!",
"FINISH": "Finish"
"body": "Du er klar!",
"FINISH": "Afslut"
}
],
"CREATE_FLOW_PAGE": {
"BACK_BUTTON": "Tilbage",
"BASIC_SETTINGS_PAGE": {
"HEADER": "Create Portal",
"TITLE": "Help center information",
"CREATE_BASIC_SETTING_BUTTON": "Create portal basic settings"
"HEADER": "Opret Portal",
"TITLE": "Information om hjælpecenter",
"CREATE_BASIC_SETTING_BUTTON": "Opret grundlæggende portal indstillinger"
},
"CUSTOMIZATION_PAGE": {
"HEADER": "Portal customisation",
"TITLE": "Help center customization",
"UPDATE_PORTAL_BUTTON": "Update portal settings"
"HEADER": "Tilpasning af portal",
"TITLE": "Tilpasning af hjælpecenter",
"UPDATE_PORTAL_BUTTON": "Opdater portalindstillinger"
},
"FINISH_PAGE": {
"TITLE": "Voila!🎉 You're all set up!",
"MESSAGE": "You can now see this created portal on your all portals page.",
"FINISH": "Go to all portals page"
"TITLE": "Voila!🎉 Alt er sat op!",
"MESSAGE": "Du kan nu se denne oprettede portal på alle portaler siden.",
"FINISH": "Gå til alle portaler side"
}
},
"LOGO": {
"LABEL": "Logo",
"UPLOAD_BUTTON": "Upload logo",
"HELP_TEXT": "This logo will be displayed on the portal header."
"HELP_TEXT": "Dette logo vil blive vist i portalens header."
},
"NAME": {
"LABEL": "Navn",
"PLACEHOLDER": "Portal name",
"HELP_TEXT": "The name will be used in the public facing portal internally.",
"ERROR": "Name is required"
"PLACEHOLDER": "Portal navn",
"HELP_TEXT": "Navnet vil blive brugt i den offentlige vendende portal internt.",
"ERROR": "Navn er påkrævet"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Portal slug for urls",
"ERROR": "Slug is required"
"LABEL": "Snegl",
"PLACEHOLDER": "Portal slug for webadresser",
"ERROR": "Slug er påkrævet"
},
"DOMAIN": {
"LABEL": "Custom Domain",
"PLACEHOLDER": "Portal custom domain",
"HELP_TEXT": "Add only If you want to use a custom domain for your portals.",
"ERROR": "Custom Domain is required"
"LABEL": "Tilpasset Domæne",
"PLACEHOLDER": "Portal brugerdefineret domæne",
"HELP_TEXT": "Tilføj kun Hvis du vil bruge et brugerdefineret domæne til dine portaler.",
"ERROR": "Brugerdefineret domæne er påkrævet"
},
"HOME_PAGE_LINK": {
"LABEL": "Home Page Link",
"PLACEHOLDER": "Portal home page link",
"HELP_TEXT": "The link used to return from the portal to the home page.",
"ERROR": "Home Page Link is required"
"LABEL": "Link Til Hjemmeside",
"PLACEHOLDER": "Link til portalens hjemmeside",
"HELP_TEXT": "Linket, der bruges til at vende tilbage fra portalen til hjemmesiden.",
"ERROR": "Hjemmeside Link er påkrævet"
},
"THEME_COLOR": {
"LABEL": "Portal theme color",
"HELP_TEXT": "This color will show as the theme color for the portal."
"LABEL": "Portal tema farve",
"HELP_TEXT": "Denne farve vil blive vist som temafarven for portalen."
},
"PAGE_TITLE": {
"LABEL": "Page Title",
"PLACEHOLDER": "Portal page title",
"LABEL": "Side Titel",
"PLACEHOLDER": "Portal side titel",
"HELP_TEXT": "The page title will be used in the public facing portal.",
"ERROR": "Page title is required"
"ERROR": "Sidetitel er påkrævet"
},
"HEADER_TEXT": {
"LABEL": "Header Text",
"PLACEHOLDER": "Portal header text",
"HELP_TEXT": "The Portal header text will be used in the public facing portal.",
"ERROR": "Portal header text is required"
"LABEL": "Header Tekst",
"PLACEHOLDER": "Portal header tekst",
"HELP_TEXT": "Portal header tekst vil blive brugt i den offentlige vender portal.",
"ERROR": "Portal header tekst er påkrævet"
},
"API": {
"ERROR_MESSAGE_FOR_BASIC": "Couldn't create the portal. Try again.",
"ERROR_MESSAGE_FOR_UPDATE": "Couldn't update the portal. Try again."
"SUCCESS_MESSAGE_FOR_BASIC": "Portal oprettet.",
"ERROR_MESSAGE_FOR_BASIC": "Portalen kunne ikke oprettes. Prøv igen.",
"SUCCESS_MESSAGE_FOR_UPDATE": "Portal opdateret.",
"ERROR_MESSAGE_FOR_UPDATE": "Portalen kunne ikke opdateres. Prøv igen."
}
},
"ADD_LOCALE": {
"TITLE": "Tilføj en ny landestandard",
"SUB_TITLE": "Dette tilføjer en ny landestandard til din tilgængelige oversættelsesliste.",
"PORTAL": "Portal",
"LOCALE": {
"LABEL": "Landestandard",
"PLACEHOLDER": "Vælg en landestandard",
"ERROR": "Landestandard er påkrævet"
},
"BUTTONS": {
"CREATE": "Opret landestandard",
"CANCEL": "Annuller"
},
"API": {
"SUCCESS_MESSAGE": "Landestandard tilføjet",
"ERROR_MESSAGE": "Kan ikke tilføje locale. Prøv igen."
}
},
"CHANGE_DEFAULT_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Standard landestandard opdateret",
"ERROR_MESSAGE": "Kan ikke opdatere standard locale. Prøv igen."
}
},
"DELETE_LOCALE": {
"API": {
"SUCCESS_MESSAGE": "Landestandard fjernet fra portal",
"ERROR_MESSAGE": "Kan ikke fjerne landestandard fra portalen. Prøv igen."
}
}
},
"TABLE": {
"LOADING_MESSAGE": "Loading articles...",
"404": "No articles matches your search 🔍",
"NO_ARTICLES": "There are no available articles",
"LOADING_MESSAGE": "Indlæser artikler...",
"404": "Ingen artikler matcher din søgning 🔍",
"NO_ARTICLES": "Der er ingen tilgængelige artikler",
"HEADERS": {
"TITLE": "Title",
"CATEGORY": "Category",
"READ_COUNT": "Read count",
"TITLE": "Titel",
"CATEGORY": "Kategori",
"READ_COUNT": "Læse antal",
"STATUS": "Status",
"LAST_EDITED": "Last edited"
"LAST_EDITED": "Sidst redigeret"
},
"COLUMNS": {
"BY": "by"
"BY": "af"
}
},
"EDIT_ARTICLE": {
"LOADING": "Loading article...",
"TITLE_PLACEHOLDER": "Article title goes here",
"CONTENT_PLACEHOLDER": "Write your article here",
"LOADING": "Indlæser artikel...",
"TITLE_PLACEHOLDER": "Artikel titel vises her",
"CONTENT_PLACEHOLDER": "Skriv din artikel her",
"API": {
"ERROR": "Error while saving article"
"ERROR": "Fejl under lagring af artikel"
}
},
"PUBLISH_ARTICLE": {
"API": {
"ERROR": "Fejl under publicering af artikel",
"SUCCESS": "Artikel publiceret med succes"
}
},
"ARCHIVE_ARTICLE": {
"API": {
"ERROR": "Fejl under arkivering af artikel",
"SUCCESS": "Artikel arkiveret"
}
},
"DELETE_ARTICLE": {
"MODAL": {
"CONFIRM": {
"TITLE": "Bekræft Sletning",
"MESSAGE": "Er du sikker på at du vil slette artiklen?",
"YES": "Ja, Slet",
"NO": "Nej, behold det"
}
},
"API": {
"SUCCESS_MESSAGE": "Artikel slettet",
"ERROR_MESSAGE": "Fejl under sletning af artikel"
}
},
"CREATE_ARTICLE": {
"ERROR_MESSAGE": "Something went wrong. Please try again."
"ERROR_MESSAGE": "Tilføj venligst artiklens overskrift og indhold, så kun du kan opdatere indstillingerne"
},
"SIDEBAR": {
"SEARCH": {
"PLACEHOLDER": "Search for articles"
"PLACEHOLDER": "Søg efter artikler"
}
},
"CATEGORY": {
"ADD": {
"TITLE": "Create a category",
"SUB_TITLE": "The category will be used in the public facing portal to categorize articles.",
"TITLE": "Opret en kategori",
"SUB_TITLE": "Kategorien vil blive brugt i den offentlige vender portal til at kategorisere artikler.",
"PORTAL": "Portal",
"LOCALE": "Locale",
"LOCALE": "Landestandard",
"NAME": {
"LABEL": "Navn",
"PLACEHOLDER": "Category name",
"HELP_TEXT": "The category name will be used in the public facing portal to categorize articles.",
"ERROR": "Name is required"
"PLACEHOLDER": "Kategori navn",
"HELP_TEXT": "Kategorinavnet vil blive brugt i den offentlige vendende portal til at kategorisere artikler.",
"ERROR": "Navn er påkrævet"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Category slug for urls",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/en-US/categories/my-slug",
"ERROR": "Slug is required"
"LABEL": "Snegl",
"PLACEHOLDER": "Kategori slug for webls",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/da-DK/categories/my-slug",
"ERROR": "Slug er påkrævet"
},
"DESCRIPTION": {
"LABEL": "Beskrivelse",
"PLACEHOLDER": "Give a short description about the category.",
"ERROR": "Description is required"
"PLACEHOLDER": "Giv en kort beskrivelse af kategorien.",
"ERROR": "Beskrivelse er påkrævet"
},
"BUTTONS": {
"CREATE": "Create category",
"CREATE": "Opret kategori",
"CANCEL": "Annuller"
},
"API": {
"SUCCESS_MESSAGE": "Category created successfully",
"ERROR_MESSAGE": "Unable to create category"
"SUCCESS_MESSAGE": "Kategori oprettet",
"ERROR_MESSAGE": "Kan ikke oprette kategori"
}
},
"EDIT": {
"TITLE": "Rediger en kategori",
"SUB_TITLE": "Redigering af en kategori vil opdatere kategorien i den offentlige vender portal.",
"PORTAL": "Portal",
"LOCALE": "Landestandard",
"NAME": {
"LABEL": "Navn",
"PLACEHOLDER": "Kategori navn",
"HELP_TEXT": "Kategorinavnet vil blive brugt i den offentlige vendende portal til at kategorisere artikler.",
"ERROR": "Navn er påkrævet"
},
"SLUG": {
"LABEL": "Slug",
"PLACEHOLDER": "Kategori slug for urls",
"HELP_TEXT": "app.chatwoot.com/hc/my-portal/da-DK/categories/my-slug",
"ERROR": "Slug er påkrævet"
},
"DESCRIPTION": {
"LABEL": "Beskrivelse",
"PLACEHOLDER": "Giv en kort beskrivelse af kategorien.",
"ERROR": "Beskrivelse er påkrævet"
},
"BUTTONS": {
"CREATE": "Opdater kategori",
"CANCEL": "Annuller"
},
"API": {
"SUCCESS_MESSAGE": "Kategori opdateret",
"ERROR_MESSAGE": "Kan ikke opdatere kategori"
}
},
"DELETE": {
"API": {
"SUCCESS_MESSAGE": "Kategori slettet",
"ERROR_MESSAGE": "Kan ikke slette kategori"
}
}
}

View file

@ -30,8 +30,8 @@
"ADD": {
"CHANNEL_NAME": {
"LABEL": "Indbakke Navn",
"PLACEHOLDER": "Enter your inbox name (eg: Acme Inc)",
"ERROR": "Please enter a valid inbox name"
"PLACEHOLDER": "Indtast dit indbakke navn (f. eks. Acme Inc)",
"ERROR": "Angiv et gyldigt indbakke navn"
},
"WEBSITE_NAME": {
"LABEL": "Websted Navn",
@ -48,9 +48,9 @@
},
"TWITTER": {
"HELP": "For at tilføje din Twitter-profil som en kanal, skal du godkende din Twitter-profil ved at klikke på 'Log ind med Twitter' ",
"ERROR_MESSAGE": "There was an error connecting to Twitter, please try again",
"ERROR_MESSAGE": "Der opstod en fejl under forbindelsen til Twitter. Prøv igen",
"TWEETS": {
"ENABLE": "Create conversations from mentioned Tweets"
"ENABLE": "Opret samtaler fra nævnte Tweets"
}
},
"WEBSITE_CHANNEL": {
@ -62,7 +62,7 @@
},
"CHANNEL_WEBHOOK_URL": {
"LABEL": "Webhook URL",
"PLACEHOLDER": "Enter your Webhook URL",
"PLACEHOLDER": "Indtast din Webhook URL",
"ERROR": "Angiv en gyldig URL"
},
"CHANNEL_DOMAIN": {
@ -83,7 +83,7 @@
},
"CHANNEL_GREETING_TOGGLE": {
"LABEL": "Aktivér kanal start hilsen",
"HELP_TEXT": "Automatically send a greeting message when a new conversation is created.",
"HELP_TEXT": "Send automatisk en hilsen når en ny samtale er oprettet.",
"ENABLED": "Aktiveret",
"DISABLED": "Deaktiveret"
},
@ -100,22 +100,22 @@
},
"SUBMIT_BUTTON": "Opret indbakke",
"API": {
"ERROR_MESSAGE": "We were not able to create a website channel, please try again"
"ERROR_MESSAGE": "Vi var ikke i stand til at oprette en hjemmeside kanal, prøv igen"
}
},
"TWILIO": {
"TITLE": "Twilio SMS/WhatsApp Channel",
"DESC": "Integrate Twilio and start supporting your customers via SMS or WhatsApp.",
"TITLE": "Twilio SMS/Whatsapp Kanal",
"DESC": "Integrer Twilio og start med at supportere dine kunder via SMS eller Whatsapp.",
"ACCOUNT_SID": {
"LABEL": "Konto SID",
"PLACEHOLDER": "Indtast venligst din Twilio konto SID",
"ERROR": "Dette felt er påkrævet"
},
"MESSAGING_SERVICE_SID": {
"LABEL": "Messaging Service SID",
"PLACEHOLDER": "Please enter your Twilio Messaging Service SID",
"LABEL": "SID For Beskedtjeneste",
"PLACEHOLDER": "Indtast venligst din Twilio Messaging Service SID",
"ERROR": "Dette felt er påkrævet",
"USE_MESSAGING_SERVICE": "Use a Twilio Messaging Service"
"USE_MESSAGING_SERVICE": "Brug en Twilio-meddelelsestjeneste"
},
"CHANNEL_TYPE": {
"LABEL": "Kanaltype",
@ -128,7 +128,7 @@
},
"CHANNEL_NAME": {
"LABEL": "Indbakke Navn",
"PLACEHOLDER": "Please enter a inbox name",
"PLACEHOLDER": "Indtast venligst et indbakke navn",
"ERROR": "Dette felt er påkrævet"
},
"PHONE_NUMBER": {
@ -146,40 +146,40 @@
}
},
"SMS": {
"TITLE": "SMS Channel",
"DESC": "Start supporting your customers via SMS.",
"TITLE": "SMS Kanal",
"DESC": "Begynd at støtte dine kunder via SMS.",
"PROVIDERS": {
"LABEL": "API Provider",
"TWILIO": "Twilio",
"BANDWIDTH": "Bandwidth"
"BANDWIDTH": "Båndbredde"
},
"API": {
"ERROR_MESSAGE": "We were not able to save the SMS channel"
"ERROR_MESSAGE": "Vi kunne ikke gemme SMS-kanalen"
},
"BANDWIDTH": {
"ACCOUNT_ID": {
"LABEL": "Account ID",
"PLACEHOLDER": "Please enter your Bandwidth Account ID",
"LABEL": "Konto SID",
"PLACEHOLDER": "Indtast venligst dit Båndbredde Konto ID",
"ERROR": "Dette felt er påkrævet"
},
"API_KEY": {
"LABEL": "API Key",
"PLACEHOLDER": "Please enter your Bandwith API Key",
"LABEL": "API Nøgle",
"PLACEHOLDER": "Indtast venligst dit Båndbredde Konto ID",
"ERROR": "Dette felt er påkrævet"
},
"API_SECRET": {
"LABEL": "API Secret",
"PLACEHOLDER": "Please enter your Bandwith API Secret",
"LABEL": "API Hemmelighed",
"PLACEHOLDER": "Indtast venligst dit Bandwith API Secret",
"ERROR": "Dette felt er påkrævet"
},
"APPLICATION_ID": {
"LABEL": "Application ID",
"PLACEHOLDER": "Please enter your Bandwidth Application ID",
"LABEL": "Applikations ID",
"PLACEHOLDER": "Indtast venligst dit Båndbredde-program-id",
"ERROR": "Dette felt er påkrævet"
},
"INBOX_NAME": {
"LABEL": "Indbakke Navn",
"PLACEHOLDER": "Please enter a inbox name",
"PLACEHOLDER": "Indtast venligst et indbakke navn",
"ERROR": "Dette felt er påkrævet"
},
"PHONE_NUMBER": {
@ -187,28 +187,28 @@
"PLACEHOLDER": "Indtast venligst det telefonnummer, hvorfra beskeden vil blive sendt.",
"ERROR": "Angiv en gyldig værdi. Telefonnummer skal starte med `+` tegn."
},
"SUBMIT_BUTTON": "Create Bandwidth Channel",
"SUBMIT_BUTTON": "Opret Båndbredde Kanal",
"API": {
"ERROR_MESSAGE": "We were not able to authenticate Bandwidth credentials, please try again"
"ERROR_MESSAGE": "Vi var ikke i stand til at godkende Twilio legitimationsoplysninger, prøv igen"
},
"API_CALLBACK": {
"TITLE": "Callback URL",
"SUBTITLE": "You have to configure the message callback URL in Bandwidth with the URL mentioned here."
"SUBTITLE": "Du skal konfigurere beskedtilbagekalds-URL'en i Båndbredde med den URL, der er nævnt her."
}
}
},
"WHATSAPP": {
"TITLE": "WhatsApp Channel",
"DESC": "Start supporting your customers via WhatsApp.",
"TITLE": "WhatsApp Kanal",
"DESC": "Begynd at støtte dine kunder via WhatsApp.",
"PROVIDERS": {
"LABEL": "API Provider",
"TWILIO": "Twilio",
"WHATSAPP_CLOUD": "WhatsApp Cloud",
"WHATSAPP_CLOUD": "WhatsApp Sky",
"360_DIALOG": "360Dialog"
},
"INBOX_NAME": {
"LABEL": "Indbakke Navn",
"PLACEHOLDER": "Please enter an inbox name",
"PLACEHOLDER": "Indtast venligst et indbakkens navn",
"ERROR": "Dette felt er påkrævet"
},
"PHONE_NUMBER": {
@ -217,33 +217,33 @@
"ERROR": "Angiv en gyldig værdi. Telefonnummer skal starte med `+` tegn."
},
"PHONE_NUMBER_ID": {
"LABEL": "Phone number ID",
"PLACEHOLDER": "Please enter the Phone number ID obtained from Facebook developer dashboard.",
"ERROR": "Please enter a valid value."
"LABEL": "Telefonnummer ID",
"PLACEHOLDER": "Indtast venligst telefonnummer ID indhentet fra Facebook udviklerdashboard.",
"ERROR": "Angiv en gyldig værdi."
},
"BUSINESS_ACCOUNT_ID": {
"LABEL": "Business Account ID",
"PLACEHOLDER": "Please enter the Business Account ID obtained from Facebook developer dashboard.",
"ERROR": "Please enter a valid value."
"LABEL": "Business Konto ID",
"PLACEHOLDER": "Indtast venligst Business Account ID opnået fra Facebook udvikler dashboard.",
"ERROR": "Angiv en gyldig værdi."
},
"WEBHOOK_VERIFY_TOKEN": {
"LABEL": "Webhook Verify Token",
"PLACEHOLDER": "Enter a verify token which you want to configure for facebook webhooks.",
"ERROR": "Please enter a valid value."
"LABEL": "Webhook Verificér Token",
"PLACEHOLDER": "Indtast en verificeringstoken, som du vil konfigurere for facebook webhooks.",
"ERROR": "Angiv en gyldig værdi."
},
"API_KEY": {
"LABEL": "API key",
"SUBTITLE": "Configure the WhatsApp API key.",
"PLACEHOLDER": "API key",
"ERROR": "Please enter a valid value."
"LABEL": "API Nøgle",
"SUBTITLE": "Konfigurer WhatsApp API-nøglen.",
"PLACEHOLDER": "API Nøgle",
"ERROR": "Angiv en gyldig værdi."
},
"API_CALLBACK": {
"TITLE": "Callback URL",
"SUBTITLE": "You have to configure the webhook URL in facebook developer portal with the URL mentioned here."
"SUBTITLE": "Du skal konfigurere webhook URL i facebook udvikler portal med den URL, der er nævnt her."
},
"SUBMIT_BUTTON": "Create WhatsApp Channel",
"SUBMIT_BUTTON": "Opret WhatsApp Kanal",
"API": {
"ERROR_MESSAGE": "We were not able to save the WhatsApp channel"
"ERROR_MESSAGE": "Vi kunne ikke gemme WhatsApp-kanalen"
}
},
"API_CHANNEL": {
@ -284,56 +284,56 @@
"FINISH_MESSAGE": "Begynd at videresende dine e-mails til følgende e-mailadresse."
},
"LINE_CHANNEL": {
"TITLE": "LINE Channel",
"DESC": "Integrate with LINE channel and start supporting your customers.",
"TITLE": "LINE Kanal",
"DESC": "Integrér med LINE-kanalen og begynd at støtte dine kunder.",
"CHANNEL_NAME": {
"LABEL": "Kanalnavn",
"PLACEHOLDER": "Indtast et kanalnavn",
"ERROR": "Dette felt er påkrævet"
},
"LINE_CHANNEL_ID": {
"LABEL": "LINE Channel ID",
"PLACEHOLDER": "LINE Channel ID"
"LABEL": "LINE Kanal ID",
"PLACEHOLDER": "LINE Kanal ID"
},
"LINE_CHANNEL_SECRET": {
"LABEL": "LINE Channel Secret",
"PLACEHOLDER": "LINE Channel Secret"
"LABEL": "LINE Kanal Hemmelighed",
"PLACEHOLDER": "LINE Kanal Hemmelighed"
},
"LINE_CHANNEL_TOKEN": {
"LABEL": "LINE Channel Token",
"PLACEHOLDER": "LINE Channel Token"
"LABEL": "LINE Kanal Token",
"PLACEHOLDER": "LINE Kanal Token"
},
"SUBMIT_BUTTON": "Create LINE Channel",
"SUBMIT_BUTTON": "Opret LINE Kanal",
"API": {
"ERROR_MESSAGE": "We were not able to save the LINE channel"
"ERROR_MESSAGE": "Vi var ikke i stand til at gemme LINE kanalen"
},
"API_CALLBACK": {
"TITLE": "Callback URL",
"SUBTITLE": "You have to configure the webhook URL in LINE application with the URL mentioned here."
"SUBTITLE": "Du skal indstille webhook URL i LINE programmet med URL-adressen nævnt her."
}
},
"TELEGRAM_CHANNEL": {
"TITLE": "Telegram Channel",
"DESC": "Integrate with Telegram channel and start supporting your customers.",
"TITLE": "Telegram Kanal",
"DESC": "Integrér med Telegram-kanalen og begynd at støtte dine kunder.",
"BOT_TOKEN": {
"LABEL": "Bot Token",
"SUBTITLE": "Configure the bot token you have obtained from Telegram BotFather.",
"SUBTITLE": "Konfigurer den bot token du har fået fra Telegram BotFather.",
"PLACEHOLDER": "Bot Token"
},
"SUBMIT_BUTTON": "Create Telegram Channel",
"SUBMIT_BUTTON": "Opret Telegram Kanal",
"API": {
"ERROR_MESSAGE": "We were not able to save the telegram channel"
"ERROR_MESSAGE": "Vi var ikke i stand til at gemme telegram kanal"
}
},
"AUTH": {
"TITLE": "Choose a channel",
"DESC": "Chatwoot supports live-chat widgets, Facebook Messenger, Twitter profiles, WhatsApp, Emails, etc., as channels. If you want to build a custom channel, you can create it using the API channel. To get started, choose one of the channels below."
"TITLE": "Vælg en kanal",
"DESC": "Chatwoot understøtter live-chat-widgets, Facebook Messenger, Twitter-profiler, WhatsApp, E-mails, osv., som kanaler. Hvis du ønsker at bygge en brugerdefineret kanal, kan du oprette den ved hjælp af API-kanalen. For at komme i gang, vælg en af kanalerne nedenfor."
},
"AGENTS": {
"TITLE": "Agenter",
"DESC": "Her kan du tilføje agenter til at håndtere din nyoprettede indbakke. Kun disse valgte agenter vil have adgang til din indbakke. Agenter som ikke er en del af denne indbakke, vil ikke kunne se eller reagere på beskeder i denne indbakke, når de logger ind. <br> <b>PS:</b> Som administrator, hvis du har brug for adgang til alle indbakker, bør du tilføje dig selv som agent til alle indbakker, du opretter.",
"VALIDATION_ERROR": "Add atleast one agent to your new Inbox",
"PICK_AGENTS": "Pick agents for the inbox"
"VALIDATION_ERROR": "Tilføj mindst én agent til din nye indbakke",
"PICK_AGENTS": "Vælg agenter for indbakken"
},
"DETAILS": {
"TITLE": "Indbakke Detaljer",
@ -359,7 +359,7 @@
"TITLE": "Din indbakke er klar!",
"MESSAGE": "Du kan nu engagere dig med dine kunder gennem din nye kanal. Glædelig supportering ",
"BUTTON_TEXT": "Tag mig med dertil",
"MORE_SETTINGS": "More settings",
"MORE_SETTINGS": "Flere indstillinger",
"WEBSITE_SUCCESS": "Du er færdig med at oprette en hjemmeside kanal. Kopier koden vist nedenfor og indsæt den på din hjemmeside. Næste gang en kunde bruger live chat, vil samtalen automatisk vises i din indbakke."
},
"REAUTH": "Genautorisér",
@ -368,7 +368,7 @@
"API": {
"SUCCESS_MESSAGE": "Indbakkeindstillinger opdateret",
"AUTO_ASSIGNMENT_SUCCESS_MESSAGE": "Automatisk tildeling opdateret",
"ERROR_MESSAGE": "We couldn't update inbox settings. Please try again later."
"ERROR_MESSAGE": "Indbakkeindstillingerne kunne ikke opdateres. Prøv igen senere."
},
"EMAIL_COLLECT_BOX": {
"ENABLED": "Aktiveret",
@ -387,33 +387,33 @@
"DISABLED": "Deaktiveret"
},
"ENABLE_HMAC": {
"LABEL": "Enable"
"LABEL": "Aktiver"
}
},
"DELETE": {
"BUTTON_TEXT": "Slet",
"AVATAR_DELETE_BUTTON_TEXT": "Delete Avatar",
"AVATAR_DELETE_BUTTON_TEXT": "Slet Avatar",
"CONFIRM": {
"TITLE": "Bekræft Sletning",
"MESSAGE": "Er du sikker på du vil slette ",
"PLACE_HOLDER": "Please type {inboxName} to confirm",
"PLACE_HOLDER": "Skriv venligst {inboxName} for at bekræfte",
"YES": "Ja, Slet ",
"NO": "Nej, Behold "
},
"API": {
"SUCCESS_MESSAGE": "Indbakken blev slettet",
"ERROR_MESSAGE": "Kunne ikke slette indbakken. Prøv igen senere.",
"AVATAR_SUCCESS_MESSAGE": "Inbox avatar deleted successfully",
"AVATAR_ERROR_MESSAGE": "Could not delete the inbox avatar. Please try again later."
"AVATAR_SUCCESS_MESSAGE": "Indbakke avatar slettet",
"AVATAR_ERROR_MESSAGE": "Kunne ikke slette indbakken avatar. Prøv igen senere."
}
},
"TABS": {
"SETTINGS": "Indstillinger",
"COLLABORATORS": "Samarbejdspartnere",
"CONFIGURATION": "Konfiguration",
"CAMPAIGN": "Campaigns",
"CAMPAIGN": "Kampagner",
"PRE_CHAT_FORM": "Pre Chat Form",
"BUSINESS_HOURS": "Business Hours",
"BUSINESS_HOURS": "Forretningstider",
"WIDGET_BUILDER": "Widget Builder"
},
"SETTINGS": "Indstillinger",
@ -421,43 +421,43 @@
"LABEL": "Funktioner",
"DISPLAY_FILE_PICKER": "Vis filvælger på widget'en",
"DISPLAY_EMOJI_PICKER": "Vis emoji-vælger på widget'en",
"ALLOW_END_CONVERSATION": "Allow users to end conversation from the widget"
"ALLOW_END_CONVERSATION": "Tillad brugere at afslutte samtale fra widget"
},
"SETTINGS_POPUP": {
"MESSENGER_HEADING": "Messenger- Script",
"MESSENGER_SUB_HEAD": "Placer denne knap inde i din body tag",
"INBOX_AGENTS": "Agenter",
"INBOX_AGENTS_SUB_TEXT": "Tilføj eller fjern agenter fra denne indbakke",
"AGENT_ASSIGNMENT": "Conversation Assignment",
"AGENT_ASSIGNMENT_SUB_TEXT": "Update conversation assignment settings",
"AGENT_ASSIGNMENT": "Samtale Tildeling",
"AGENT_ASSIGNMENT_SUB_TEXT": "Opdater indstillinger for samtale",
"UPDATE": "Opdater",
"ENABLE_EMAIL_COLLECT_BOX": "Enable email collect box",
"ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Enable or disable email collect box on new conversation",
"ENABLE_EMAIL_COLLECT_BOX": "Aktiver boks til indsamling af e-mail",
"ENABLE_EMAIL_COLLECT_BOX_SUB_TEXT": "Aktiver eller deaktivér opsamlingsboks for e-mail ved ny samtale",
"AUTO_ASSIGNMENT": "Aktiver automatisk tildeling",
"ENABLE_CSAT": "Enable CSAT",
"ENABLE_CSAT_SUB_TEXT": "Enable/Disable CSAT(Customer satisfaction) survey after resolving a conversation",
"ENABLE_CONTINUITY_VIA_EMAIL": "Enable conversation continuity via email",
"ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "Conversations will continue over email if the contact email address is available.",
"ENABLE_CSAT": "Aktiver CSAT",
"ENABLE_CSAT_SUB_TEXT": "Aktiver/deaktivér CSAT(Customer satisfaction) undersøgelse efter at have løst en samtale",
"ENABLE_CONTINUITY_VIA_EMAIL": "Aktivér konversationskontinuitet via e-mail",
"ENABLE_CONTINUITY_VIA_EMAIL_SUB_TEXT": "Samtaler vil fortsætte via e-mail, hvis kontaktpersonens e-mailadresse er tilgængelig.",
"INBOX_UPDATE_TITLE": "Indbakke Indstillinger",
"INBOX_UPDATE_SUB_TEXT": "Opdater dine indbakkeindstillinger",
"AUTO_ASSIGNMENT_SUB_TEXT": "Aktiver eller deaktiver automatisk tildeling af nye samtaler til agenter tilføjet til denne indbakke.",
"HMAC_VERIFICATION": "User Identity Validation",
"HMAC_DESCRIPTION": "In order to validate the user's identity, you can pass an `identifier_hash` for each user. You can generate a HMAC sha256 hash using the `identifier` with the key shown here.",
"HMAC_MANDATORY_VERIFICATION": "Enforce User Identity Validation",
"HMAC_MANDATORY_DESCRIPTION": "If enabled, requests missing the `identifier_hash` will be rejected.",
"INBOX_IDENTIFIER": "Inbox Identifier",
"INBOX_IDENTIFIER_SUB_TEXT": "Use the `inbox_identifier` token shown here to authentication your API clients.",
"FORWARD_EMAIL_TITLE": "Forward to Email",
"HMAC_VERIFICATION": "Bruger Identitetsvalidering",
"HMAC_DESCRIPTION": "For at validere brugerens identitet, kan du passere en `identifier_hash` for hver bruger. Du kan generere en HMAC sha256 hash ved hjælp af 'identifier' med nøglen vist her.",
"HMAC_MANDATORY_VERIFICATION": "Gennemtving Validering Af Bruger Identitet",
"HMAC_MANDATORY_DESCRIPTION": "Hvis aktiveret, vil forespørgsler der mangler 'identifier_hash' blive afvist.",
"INBOX_IDENTIFIER": "Identifikator For Indbakke",
"INBOX_IDENTIFIER_SUB_TEXT": "Brug den `inbox_identifier` token vist her til godkendelse dine API-klienter.",
"FORWARD_EMAIL_TITLE": "Videresend til e-mail",
"FORWARD_EMAIL_SUB_TEXT": "Begynd at videresende dine e-mails til følgende e-mailadresse.",
"ALLOW_MESSAGES_AFTER_RESOLVED": "Allow messages after conversation resolved",
"ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Allow the end-users to send messages even after the conversation is resolved.",
"WHATSAPP_SECTION_SUBHEADER": "This API Key is used for the integration with the WhatsApp APIs.",
"WHATSAPP_SECTION_TITLE": "API Key"
"ALLOW_MESSAGES_AFTER_RESOLVED": "Tillad beskeder efter samtalen løst",
"ALLOW_MESSAGES_AFTER_RESOLVED_SUB_TEXT": "Tillad slutbrugere at sende beskeder, selv efter samtalen er løst.",
"WHATSAPP_SECTION_SUBHEADER": "Denne API-nøgle bruges til integration med WhatsApp API'erne.",
"WHATSAPP_SECTION_TITLE": "API Nøgle"
},
"AUTO_ASSIGNMENT": {
"MAX_ASSIGNMENT_LIMIT": "Auto assignment limit",
"MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Please enter a value greater than 0",
"MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Limit the maximum number of conversations from this inbox that can be auto assigned to an agent"
"MAX_ASSIGNMENT_LIMIT": "Grænse for automatisk tildeling",
"MAX_ASSIGNMENT_LIMIT_RANGE_ERROR": "Indtast en værdi større end 0",
"MAX_ASSIGNMENT_LIMIT_SUB_TEXT": "Begræns det maksimale antal samtaler fra denne indbakke, der kan være auto tildelt en agent"
},
"FACEBOOK_REAUTHORIZE": {
"TITLE": "Genautorisér",
@ -466,64 +466,64 @@
"MESSAGE_ERROR": "Der opstod en fejl, prøv igen"
},
"PRE_CHAT_FORM": {
"DESCRIPTION": "Pre chat forms enable you to capture user information before they start conversation with you.",
"SET_FIELDS": "Pre chat form fields",
"DESCRIPTION": "Forud chat formularer gør det muligt for dig at fange brugeroplysninger, før de starter samtale med dig.",
"SET_FIELDS": "Tidligere chatformularfelter",
"SET_FIELDS_HEADER": {
"FIELDS": "Fields",
"LABEL": "Label",
"PLACE_HOLDER": "Placeholder",
"KEY": "Key",
"FIELDS": "Felter",
"LABEL": "Etiketter",
"PLACE_HOLDER": "Pladsholder",
"KEY": "Nøgle",
"TYPE": "Type",
"REQUIRED": "Required"
"REQUIRED": "Påkrævet"
},
"ENABLE": {
"LABEL": "Enable pre chat form",
"LABEL": "Aktiver præ-chat formular",
"OPTIONS": {
"ENABLED": "Yes",
"DISABLED": "No"
"ENABLED": "Ja",
"DISABLED": "Nej"
}
},
"PRE_CHAT_MESSAGE": {
"LABEL": "Pre chat message",
"PLACEHOLDER": "This message would be visible to the users along with the form"
"LABEL": "Tidligere chatbesked",
"PLACEHOLDER": "Denne meddelelse vil være synlig for brugerne sammen med formularen"
},
"REQUIRE_EMAIL": {
"LABEL": "Visitors should provide their name and email address before starting the chat"
"LABEL": "Besøgende skal angive deres navn og e-mailadresse, før du starter chatten"
}
},
"BUSINESS_HOURS": {
"TITLE": "Set your availability",
"SUBTITLE": "Set your availability on your livechat widget",
"WEEKLY_TITLE": "Set your weekly hours",
"TIMEZONE_LABEL": "Select timezone",
"UPDATE": "Update business hours settings",
"TOGGLE_AVAILABILITY": "Enable business availability for this inbox",
"UNAVAILABLE_MESSAGE_LABEL": "Unavailable message for visitors",
"TITLE": "Indstil din tilgængelighed",
"SUBTITLE": "Indstil din tilgængelighed på din livechat widget",
"WEEKLY_TITLE": "Indstil dine ugentlige timer",
"TIMEZONE_LABEL": "Vælg tidszone",
"UPDATE": "Opdater indstillinger for åbningstider",
"TOGGLE_AVAILABILITY": "Aktiver forretningstilgængelighed for denne indbakke",
"UNAVAILABLE_MESSAGE_LABEL": "Utilgængelig besked til besøgende",
"UNAVAILABLE_MESSAGE_DEFAULT": "Vi er ikke tilgængelige i øjeblikket. Skriv en besked og vi svarer, når vi er tilbage.",
"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.",
"TOGGLE_HELP": "Aktivering af forretningstilgængelighed vil vise de tilgængelige timer på live chat widget, selvom alle agenter er offline. Udenfor tilgængelige timer kan livreddere advares med en besked og en pre-chat formular.",
"DAY": {
"ENABLE": "Enable availability for this day",
"ENABLE": "Aktiver tilgængelighed for denne dag",
"UNAVAILABLE": "Unavailable",
"HOURS": "hours",
"VALIDATION_ERROR": "Starting time should be before closing time.",
"CHOOSE": "Choose"
"HOURS": "timer",
"VALIDATION_ERROR": "Starttidspunkt bør være før lukketid.",
"CHOOSE": "Vælg"
},
"ALL_DAY": "All-Day"
},
"IMAP": {
"TITLE": "IMAP",
"SUBTITLE": "Set your IMAP details",
"NOTE_TEXT": "To enable SMTP, please configure IMAP.",
"UPDATE": "Update IMAP settings",
"TOGGLE_AVAILABILITY": "Enable IMAP configuration for this inbox",
"TOGGLE_HELP": "Enabling IMAP will help the user to recieve email",
"SUBTITLE": "Indstil dine IMAP-oplysninger",
"NOTE_TEXT": "For at aktivere SMTP skal du konfigurere IMAP.",
"UPDATE": "Opdater indstillinger",
"TOGGLE_AVAILABILITY": "Aktiver IMAP- konfiguration for denne indbakke",
"TOGGLE_HELP": "Aktivering af IMAP, vil hjælpe brugeren med at modtage e-mail",
"EDIT": {
"SUCCESS_MESSAGE": "IMAP settings updated successfully",
"ERROR_MESSAGE": "Unable to update IMAP settings"
"SUCCESS_MESSAGE": "Indbakkeindstillinger opdateret",
"ERROR_MESSAGE": "Kunne ikke opdatere IMAP-indstillinger"
},
"ADDRESS": {
"LABEL": "Address",
"PLACE_HOLDER": "Address (Eg: imap.gmail.com)"
"LABEL": "Ip Adresse",
"PLACE_HOLDER": "Adresse (f.eks.: imap.gmail.com)"
},
"PORT": {
"LABEL": "Port",
@ -537,21 +537,21 @@
"LABEL": "Adgangskode",
"PLACE_HOLDER": "Adgangskode"
},
"ENABLE_SSL": "Enable SSL"
"ENABLE_SSL": "Aktiver SSL"
},
"SMTP": {
"TITLE": "SMTP",
"SUBTITLE": "Set your SMTP details",
"UPDATE": "Update SMTP settings",
"TOGGLE_AVAILABILITY": "Enable SMTP configuration for this inbox",
"TOGGLE_HELP": "Enabling SMTP will help the user to send email",
"TITLE": "Smtp",
"SUBTITLE": "Indstil dine IMAP-oplysninger",
"UPDATE": "Opdater SMTP indstillinger",
"TOGGLE_AVAILABILITY": "Aktiver SMTP konfiguration for denne indbakke",
"TOGGLE_HELP": "Aktivering af SMTP vil hjælpe brugeren med at sende e-mail",
"EDIT": {
"SUCCESS_MESSAGE": "SMTP settings updated successfully",
"ERROR_MESSAGE": "Unable to update SMTP settings"
"SUCCESS_MESSAGE": "SMTP indstillinger opdateret",
"ERROR_MESSAGE": "Kan ikke opdatere SMTP indstillinger"
},
"ADDRESS": {
"LABEL": "Address",
"PLACE_HOLDER": "Address (Eg: smtp.gmail.com)"
"LABEL": "Ip Adresse",
"PLACE_HOLDER": "Adresse (f.eks.: smtp.gmail.com)"
},
"PORT": {
"LABEL": "Port",
@ -566,23 +566,23 @@
"PLACE_HOLDER": "Adgangskode"
},
"DOMAIN": {
"LABEL": "Domain",
"PLACE_HOLDER": "Domain"
"LABEL": "Domæne",
"PLACE_HOLDER": "Domæne"
},
"ENCRYPTION": "Encryption",
"ENCRYPTION": "Kryptering",
"SSL_TLS": "SSL/TLS",
"START_TLS": "STARTTLS",
"OPEN_SSL_VERIFY_MODE": "Open SSL Verify Mode",
"AUTH_MECHANISM": "Authentication"
"OPEN_SSL_VERIFY_MODE": "Åbn SSL-bekræftelsestilstand",
"AUTH_MECHANISM": "Godkendelse"
},
"NOTE": "Note: ",
"NOTE": "Bemærk: ",
"WIDGET_BUILDER": {
"WIDGET_OPTIONS": {
"AVATAR": {
"LABEL": "Website Avatar",
"LABEL": "Websted Avatar",
"DELETE": {
"API": {
"SUCCESS_MESSAGE": "Avatar deleted successfully",
"SUCCESS_MESSAGE": "Avatar slettet",
"ERROR_MESSAGE": "Der opstod en fejl. Prøv venligst igen"
}
}
@ -594,14 +594,14 @@
},
"WELCOME_HEADING": {
"LABEL": "Velkomstoverskrift",
"PLACE_HOLDER": "Hi there!"
"PLACE_HOLDER": "Hej der!"
},
"WELCOME_TAGLINE": {
"LABEL": "Velkomst Tagline",
"PLACE_HOLDER": "Vi gør det nemt at komme i kontakt med os. Spørg os om noget, eller del din feedback."
},
"REPLY_TIME": {
"LABEL": "Reply Time",
"LABEL": "Svar Tid",
"IN_A_FEW_MINUTES": "På nogle få minutter",
"IN_A_FEW_HOURS": "Om et par timer",
"IN_A_DAY": "På en dag"
@ -611,31 +611,31 @@
"WIDGET_BUBBLE_TYPE_LABEL": "Widget Bubble Type",
"WIDGET_BUBBLE_LAUNCHER_TITLE": {
"DEFAULT": "Chat med os",
"LABEL": "Widget Bubble Launcher Title",
"LABEL": "Widget Bubble Launcher Titel",
"PLACE_HOLDER": "Chat med os"
},
"UPDATE": {
"BUTTON_TEXT": "Update Widget Settings",
"BUTTON_TEXT": "Opdater Widget Indstillinger",
"API": {
"SUCCESS_MESSAGE": "Widget settings updated successfully",
"ERROR_MESSAGE": "Unable to update widget settings"
"SUCCESS_MESSAGE": "Widget-indstillinger opdateret",
"ERROR_MESSAGE": "Kan ikke opdatere widget-indstillinger"
}
},
"WIDGET_VIEW_OPTION": {
"PREVIEW": "Preview",
"PREVIEW": "Eksempelvisning",
"SCRIPT": "Script"
},
"WIDGET_BUBBLE_POSITION": {
"LEFT": "Left",
"RIGHT": "Right"
"LEFT": "Venstre",
"RIGHT": "Højre"
},
"WIDGET_BUBBLE_TYPE": {
"STANDARD": "Standard",
"EXPANDED_BUBBLE": "Expanded Bubble"
"EXPANDED_BUBBLE": "Udvidet Boble"
}
},
"WIDGET_SCREEN": {
"DEFAULT": "Default",
"DEFAULT": "Standard",
"CHAT": "Chat"
},
"REPLY_TIME": {
@ -649,11 +649,11 @@
},
"BODY": {
"TEAM_AVAILABILITY": {
"ONLINE": "We are Online",
"ONLINE": "Vi er online",
"OFFLINE": "Vi er ikke tilgængelige i øjeblikket"
},
"USER_MESSAGE": "Hi",
"AGENT_MESSAGE": "Hello"
"AGENT_MESSAGE": "Hej"
},
"BRANDING_TEXT": "Drevet af Chatwoot",
"SCRIPT_SETTINGS": "\n window.chatwootSettings = {options};"

View file

@ -1,36 +1,36 @@
{
"INTEGRATION_APPS": {
"FETCHING": "Fetching Integrations",
"NO_HOOK_CONFIGURED": "There are no %{integrationId} integrations configured in this account.",
"HEADER": "Applications",
"FETCHING": "Henter Integrationer",
"NO_HOOK_CONFIGURED": "Der er ingen %{integrationId} integrationer konfigureret på denne konto.",
"HEADER": "Applikationer",
"STATUS": {
"ENABLED": "Aktiveret",
"DISABLED": "Deaktiveret"
},
"CONFIGURE": "Konfigurer",
"ADD_BUTTON": "Add a new hook",
"ADD_BUTTON": "Tilføj en ny krog",
"DELETE": {
"TITLE": {
"INBOX": "Confirm deletion",
"ACCOUNT": "Disconnect"
"INBOX": "Bekræft sletning",
"ACCOUNT": "Afbryd"
},
"MESSAGE": {
"INBOX": "Er du sikker på du vil slette?",
"ACCOUNT": "Are you sure to disconnect?"
"ACCOUNT": "Er du sikker på at du afbryder?"
},
"CONFIRM_BUTTON_TEXT": {
"INBOX": "Ja, Slet",
"ACCOUNT": "Yes, Disconnect"
"ACCOUNT": "Ja, Afbryd"
},
"CANCEL_BUTTON_TEXT": "Annuller",
"API": {
"SUCCESS_MESSAGE": "Hook deleted successfully",
"SUCCESS_MESSAGE": "Hook slettet",
"ERROR_MESSAGE": "Kunne ikke oprette forbindelse til Woot Server, Prøv igen senere"
}
},
"LIST": {
"FETCHING": "Fetching integration hooks",
"INBOX": "Inbox",
"FETCHING": "Henter integrationshoks",
"INBOX": "Indbakke",
"DELETE": {
"BUTTON_TEXT": "Slet"
}
@ -38,14 +38,14 @@
"ADD": {
"FORM": {
"INBOX": {
"LABEL": "Select Inbox",
"PLACEHOLDER": "Select Inbox"
"LABEL": "Vælg Indbakke",
"PLACEHOLDER": "Vælg Indbakke"
},
"SUBMIT": "Opret",
"CANCEL": "Annuller"
},
"API": {
"SUCCESS_MESSAGE": "Integration hook added successfully",
"SUCCESS_MESSAGE": "Integration hook tilføjet",
"ERROR_MESSAGE": "Kunne ikke oprette forbindelse til Woot Server, Prøv igen senere"
}
},
@ -53,10 +53,10 @@
"BUTTON_TEXT": "Tilslut"
},
"DISCONNECT": {
"BUTTON_TEXT": "Disconnect"
"BUTTON_TEXT": "Afbryd"
},
"SIDEBAR_DESCRIPTION": {
"DIALOGFLOW": "Dialogflow is a natural language understanding platform that makes it easy to design and integrate a conversational user interface into your mobile app, web application, device, bot, interactive voice response system, and so on. <br /> <br /> Dialogflow integration with %{installationName} allows you to configure a Dialogflow bot with your inboxes which lets the bot handle the queries initially and hand them over to an agent when needed. Dialogflow can be used to qualifying the leads, reduce the workload of agents by providing frequently asked questions etc. <br /> <br /> To add Dialogflow, you need to create a Service Account in your Google project console and share the credentials. Please refer to the Dialogflow docs for more information."
"DIALOGFLOW": "Dialogflow er en naturlig sprogforståelsesplatform, der gør det nemt at designe og integrere en samtalebrugergrænseflade i din mobile app, webapplikation, enhed, bot, interaktivt talespons system, og så videre. <br /> <br /> Dialogflow integration med %{installationName} giver dig mulighed for at konfigurere en Dialogflow bot med dine indbakker, som lader botten håndtere spørgsmålene i første omgang og overdrage dem til en agent, når det er nødvendigt. Dialogflow kan bruges til at kvalificere kundeemner, reducere arbejdsbyrden af agenter ved at stille ofte stillede spørgsmål osv. <br /> <br /> For at tilføje Dialogflow skal du oprette en servicekonto i din Google-projektkonsol og dele legitimationsoplysningerne. Se Dialogflow dokumenterne for mere information."
}
}
}

Some files were not shown because too many files have changed in this diff Show more